diff --git a/src/common/app.release.ts b/src/common/app.release.ts index e92272fe2..5d565cc66 100644 --- a/src/common/app.release.ts +++ b/src/common/app.release.ts @@ -28,7 +28,7 @@ export const Release = { // this is here to trigger revalidation of data, e.g. models refresh Monotonics: { - Aix: 26, + Aix: 27, NewsVersion: 192, }, diff --git a/src/common/stores/llms/llms.parameters.ts b/src/common/stores/llms/llms.parameters.ts index e8813026f..111ca2b5c 100644 --- a/src/common/stores/llms/llms.parameters.ts +++ b/src/common/stores/llms/llms.parameters.ts @@ -131,6 +131,14 @@ export const DModelParameterRegistry = { initialValue: true, } as const, + llmVndOaiVerbosity: { + label: 'Verbosity', + type: 'enum' as const, + description: 'Controls response length and detail level', + values: ['low', 'medium', 'high'] as const, + requiredFallback: 'medium', + } as const, + llmVndOaiWebSearchContext: { label: 'Search Context Size', type: 'enum' as const, diff --git a/src/modules/aix/client/aix.client.ts b/src/modules/aix/client/aix.client.ts index a83364219..d48490e8b 100644 --- a/src/modules/aix/client/aix.client.ts +++ b/src/modules/aix/client/aix.client.ts @@ -49,7 +49,7 @@ export function aixCreateModelFromLLMOptions( llmRef, llmTemperature, llmResponseTokens, llmTopP, llmForceNoStream, llmVndAntThinkingBudget, llmVndGeminiShowThoughts, llmVndGeminiThinkingBudget, - llmVndOaiReasoningEffort, llmVndOaiReasoningEffort4, llmVndOaiRestoreMarkdown, llmVndOaiWebSearchContext, llmVndOaiWebSearchGeolocation, + llmVndOaiReasoningEffort, llmVndOaiReasoningEffort4, llmVndOaiRestoreMarkdown, llmVndOaiVerbosity, llmVndOaiWebSearchContext, llmVndOaiWebSearchGeolocation, llmVndPerplexityDateFilter, llmVndPerplexitySearchMode, llmVndXaiSearchMode, llmVndXaiSearchSources, llmVndXaiSearchDateFilter, } = { @@ -105,6 +105,7 @@ export function aixCreateModelFromLLMOptions( ...(llmVndOaiResponsesAPI ? { vndOaiResponsesAPI: true } : {}), ...((llmVndOaiReasoningEffort4 || llmVndOaiReasoningEffort) ? { vndOaiReasoningEffort: llmVndOaiReasoningEffort4 || llmVndOaiReasoningEffort } : {}), ...(llmVndOaiRestoreMarkdown ? { vndOaiRestoreMarkdown: llmVndOaiRestoreMarkdown } : {}), + ...(llmVndOaiVerbosity ? { vndOaiVerbosity: llmVndOaiVerbosity } : {}), ...(llmVndOaiWebSearchContext ? { vndOaiWebSearchContext: llmVndOaiWebSearchContext } : {}), ...(llmVndPerplexityDateFilter ? { vndPerplexityDateFilter: llmVndPerplexityDateFilter } : {}), ...(llmVndPerplexitySearchMode ? { vndPerplexitySearchMode: llmVndPerplexitySearchMode } : {}), diff --git a/src/modules/aix/server/api/aix.wiretypes.ts b/src/modules/aix/server/api/aix.wiretypes.ts index de7c39327..d9c3ff4ae 100644 --- a/src/modules/aix/server/api/aix.wiretypes.ts +++ b/src/modules/aix/server/api/aix.wiretypes.ts @@ -410,6 +410,7 @@ export namespace AixWire_API { vndOaiResponsesAPI: z.boolean().optional(), vndOaiReasoningEffort: z.enum(['minimal', 'low', 'medium', 'high']).optional(), vndOaiRestoreMarkdown: z.boolean().optional(), + vndOaiVerbosity: z.enum(['low', 'medium', 'high']).optional(), vndOaiWebSearchContext: z.enum(['low', 'medium', 'high']).optional(), vndPerplexityDateFilter: z.enum(['unfiltered', '1m', '3m', '6m', '1y']).optional(), vndPerplexitySearchMode: z.enum(['default', 'academic']).optional(), diff --git a/src/modules/aix/server/dispatch/chatGenerate/adapters/openai.responsesCreate.ts b/src/modules/aix/server/dispatch/chatGenerate/adapters/openai.responsesCreate.ts index 5d639d5ce..8dee853ee 100644 --- a/src/modules/aix/server/dispatch/chatGenerate/adapters/openai.responsesCreate.ts +++ b/src/modules/aix/server/dispatch/chatGenerate/adapters/openai.responsesCreate.ts @@ -93,6 +93,14 @@ export function aixToOpenAIResponses(model: AixAPI_Model, chatGenerate: AixAPICh // }; } + // GPT-5 Verbosity: Add to existing text config or create new one + if (model.vndOaiVerbosity) { + payload.text = { + ...payload.text, + verbosity: model.vndOaiVerbosity, + }; + } + // Tool: Search: for search models, and deep research models // NOTE: OpenAI doesn't support web search with minimal reasoning effort const skipWebSearchDueToMinimalReasoning = model.vndOaiReasoningEffort === 'minimal'; diff --git a/src/modules/aix/server/dispatch/wiretypes/openai.wiretypes.ts b/src/modules/aix/server/dispatch/wiretypes/openai.wiretypes.ts index 643235db4..ca894c080 100644 --- a/src/modules/aix/server/dispatch/wiretypes/openai.wiretypes.ts +++ b/src/modules/aix/server/dispatch/wiretypes/openai.wiretypes.ts @@ -1202,6 +1202,7 @@ export namespace OpenAIWire_API_Responses { }), // z.object({ type: z.literal('json_object') }), // deprecated ]).optional(), + verbosity: z.enum(['low', 'medium', 'high']).optional(), // GPT-5 verbosity control }).optional(), // State management (we won't use this for stateless) diff --git a/src/modules/llms/server/llm.server.types.ts b/src/modules/llms/server/llm.server.types.ts index 7eeedba7a..1e620c1b9 100644 --- a/src/modules/llms/server/llm.server.types.ts +++ b/src/modules/llms/server/llm.server.types.ts @@ -81,6 +81,7 @@ const ModelParameterSpec_schema = z.object({ 'llmVndOaiReasoningEffort', 'llmVndOaiReasoningEffort4', 'llmVndOaiRestoreMarkdown', + 'llmVndOaiVerbosity', 'llmVndOaiWebSearchContext', 'llmVndOaiWebSearchGeolocation', 'llmVndPerplexityDateFilter',