From 50ba0dc6630df3bebc75c5ed9bc3400d702c3577 Mon Sep 17 00:00:00 2001 From: kevingatera <22301610+kevingatera@users.noreply.github.com> Date: Mon, 6 Jul 2026 22:28:00 -0400 Subject: [PATCH 01/12] feat(kosong): add effortParam opt-in for anthropic output_config.effort kosong's anthropic adapter only emits output_config.effort for model names it recognizes (opus-4-5 / adaptive). Third-party Anthropic-compatible endpoints (e.g. z.ai GLM over /api/anthropic) honor effort on the enabled thinking path but are not name-recognized, so /thinking levels silently no-op there. Add a per-alias effortParam flag plumbed through the model alias schema, provider-manager, and the oauth managed/merge types; when set, the enabled-thinking path emits output_config.effort alongside budget_tokens. --- packages/agent-core/src/config/env-model.ts | 5 ++ packages/agent-core/src/config/schema.ts | 8 +++ .../src/session/provider-manager.ts | 3 + packages/kosong/src/providers/anthropic.ts | 14 ++++- packages/kosong/test/anthropic.test.ts | 60 +++++++++++++++++++ packages/oauth/src/managed-kimi-code.ts | 2 + packages/oauth/src/model-alias-merge.ts | 1 + 7 files changed, 92 insertions(+), 1 deletion(-) diff --git a/packages/agent-core/src/config/env-model.ts b/packages/agent-core/src/config/env-model.ts index 2933da52c6..0346a87305 100644 --- a/packages/agent-core/src/config/env-model.ts +++ b/packages/agent-core/src/config/env-model.ts @@ -126,6 +126,10 @@ export function applyEnvModelConfig(config: KimiConfig, env: Env = process.env): env['KIMI_MODEL_ADAPTIVE_THINKING'], 'KIMI_MODEL_ADAPTIVE_THINKING', ); + const effortParam = parseBooleanVar( + env['KIMI_MODEL_EFFORT_PARAM'], + 'KIMI_MODEL_EFFORT_PARAM', + ); const alias: ModelAlias = { provider: ENV_MODEL_PROVIDER_KEY, @@ -136,6 +140,7 @@ export function applyEnvModelConfig(config: KimiConfig, env: Env = process.env): ...(maxOutputSize !== undefined ? { maxOutputSize } : {}), ...(reasoningKey !== undefined ? { reasoningKey } : {}), ...(adaptiveThinking !== undefined ? { adaptiveThinking } : {}), + ...(effortParam !== undefined ? { effortParam } : {}), }; const thinkingEffort = trimmed(env['KIMI_MODEL_THINKING_EFFORT']); diff --git a/packages/agent-core/src/config/schema.ts b/packages/agent-core/src/config/schema.ts index 0e4b7bcaa7..5b3b8d1846 100644 --- a/packages/agent-core/src/config/schema.ts +++ b/packages/agent-core/src/config/schema.ts @@ -54,6 +54,14 @@ const ModelAliasBaseSchema = z.object({ // model-name version inference. Needed for custom-named Anthropic endpoints // whose model name does not encode a parseable Claude version. adaptiveThinking: z.boolean().optional(), + // Opt-in: declare that this model's endpoint honors Anthropic + // `output_config.effort` on the *enabled* thinking path + // (`thinking: { type: 'enabled' }`). kosong only emits `output_config.effort` + // for model names it recognizes (opus-4-5 / adaptive); third-party + // Anthropic-compatible endpoints (e.g. z.ai GLM over /api/anthropic) honor + // effort but are not name-recognized, so set this to make `/thinking` + // effort levels actually take effect on them. + effortParam: z.boolean().optional(), // Efforts (e.g. ["low", "high", "max"]) the model supports for // extended thinking, plus the catalog default. Generic to any provider: // managed models fill these from the catalog, others can be set by hand in diff --git a/packages/agent-core/src/session/provider-manager.ts b/packages/agent-core/src/session/provider-manager.ts index 7fb313b461..2e79b999eb 100644 --- a/packages/agent-core/src/session/provider-manager.ts +++ b/packages/agent-core/src/session/provider-manager.ts @@ -141,6 +141,7 @@ export class ProviderManager implements ModelProvider { effectiveAlias.offEffort, effectiveAlias.adaptiveThinking, alias.betaApi, + effectiveAlias.effortParam, ); return { @@ -270,6 +271,7 @@ function toKosongProviderConfig( offEffort: string | undefined, adaptiveThinking: boolean | undefined, betaApi: boolean | undefined, + effortParam: boolean | undefined, ): KosongProviderConfig { const effectiveType = modelProtocol === 'anthropic' ? 'anthropic' : provider.type; const envCustomHeaders = parseKimiCodeCustomHeaders(); @@ -296,6 +298,7 @@ function toKosongProviderConfig( ...(provider.type === 'kimi' ? { kimiThinking: true, convertError: classifyKimiQuotaError } : {}), + ...(effortParam !== undefined ? { effortParam } : {}), ...(betaApi !== undefined ? { betaApi } : {}), // Session affinity: Anthropic's analog of OpenAI `prompt_cache_key` is // `metadata.user_id` on the Messages API (cache-affinity / end-user id). diff --git a/packages/kosong/src/providers/anthropic.ts b/packages/kosong/src/providers/anthropic.ts index 5af85106e2..79b5d92785 100644 --- a/packages/kosong/src/providers/anthropic.ts +++ b/packages/kosong/src/providers/anthropic.ts @@ -112,6 +112,16 @@ export interface AnthropicOptions { */ supportEfforts?: readonly string[] | undefined; kimiThinking?: boolean | undefined; + /** + * Opt-in: declare that this model's endpoint honors Anthropic + * `output_config.effort` on the *enabled* thinking path. kosong only emits + * `output_config.effort` for model names it recognizes (opus-4-5 / adaptive); + * third-party Anthropic-compatible endpoints that honor effort without a + * recognizable name (e.g. z.ai GLM over `/api/anthropic`) set this so + * `/thinking` effort levels take effect. budget_tokens is still sent + * (required by Anthropic's enabled-thinking contract; ignored by z.ai). + */ + effortParam?: boolean | undefined; /** * Use the Anthropic **beta** Messages API (`client.beta.messages.create`, * `POST /v1/messages?beta=true`) instead of the standard Messages API. @@ -932,6 +942,7 @@ export class AnthropicChatProvider implements ChatProvider { private readonly _supportEfforts: readonly string[] | undefined; private readonly _kimiThinking: boolean; private readonly _convertErrorHook: ((error: unknown) => ChatProviderError | undefined) | undefined; + private _effortParam: boolean | undefined; private _betaApi: boolean; private _explicitMaxTokens: boolean; @@ -943,6 +954,7 @@ export class AnthropicChatProvider implements ChatProvider { this._supportEfforts = options.supportEfforts; this._kimiThinking = options.kimiThinking ?? false; this._convertErrorHook = options.convertError; + this._effortParam = options.effortParam; this._betaApi = options.betaApi ?? false; this._apiKey = options.apiKey === undefined || options.apiKey.length === 0 ? undefined : options.apiKey; @@ -1247,7 +1259,7 @@ export class AnthropicChatProvider implements ChatProvider { ? ({ type: 'enabled' } as MessageCreateParams['thinking']) : { type: 'enabled', budget_tokens: budgetTokens }; outputConfig = - (profile.supportsEffortParam || budgetTokens === undefined) && effort !== 'on' + (profile.supportsEffortParam || this._effortParam === true || budgetTokens === undefined) && effort !== 'on' ? ({ effort } as MessageCreateParams['output_config']) : undefined; } diff --git a/packages/kosong/test/anthropic.test.ts b/packages/kosong/test/anthropic.test.ts index 6b079a75a6..63f48a2ea1 100644 --- a/packages/kosong/test/anthropic.test.ts +++ b/packages/kosong/test/anthropic.test.ts @@ -2413,6 +2413,66 @@ describe('AnthropicChatProvider', () => { } }); + // effortParam opt-in: third-party Anthropic-compatible endpoints (e.g. + // z.ai GLM over /api/anthropic) honor output_config.effort on the enabled + // thinking path even though their model name is not name-recognized. + // adaptiveThinking:false forces budget mode (supportsEffortParam:false), + // so effortParam is the ONLY way effort reaches the wire for these models. + describe('effortParam opt-in emits output_config.effort', () => { + function createWithEffortParam(model: string): AnthropicChatProvider { + return new AnthropicChatProvider({ + model, + apiKey: 'test-key', + defaultMaxTokens: 1024, + stream: false, + adaptiveThinking: false, + effortParam: true, + }); + } + + it.each(['glm-5.2', 'glm-4.6', 'some-custom-model'])( + 'emits output_config.effort for non-recognized model %s when effortParam=true', + async (model) => { + const provider = createWithEffortParam(model).withThinking('high'); + const body = await captureRequestBody(provider, '', [], thinkHistory); + + // Budget path (enabled + budget_tokens), with effort emitted via the opt-in. + expect(body['thinking']).toEqual({ type: 'enabled', budget_tokens: 32000 }); + expect(body['output_config']).toEqual({ effort: 'high' }); + }, + ); + + it('does not emit output_config.effort for the same model without effortParam', async () => { + // Same budget-mode config, no opt-in -> budget_tokens only. + const provider = new AnthropicChatProvider({ + model: 'glm-5.2', + apiKey: 'test-key', + defaultMaxTokens: 1024, + stream: false, + adaptiveThinking: false, + }).withThinking('high'); + const body = await captureRequestBody(provider, '', [], thinkHistory); + + expect(body['thinking']).toEqual({ type: 'enabled', budget_tokens: 32000 }); + expect(body['output_config']).toBeUndefined(); + }); + + it.each([ + ['low', 1024], + ['medium', 4096], + ['high', 32000], + ] as const)( + 'effortParam carries each effort level to output_config (effort=%s)', + async (effort, budget) => { + const provider = createWithEffortParam('glm-5.2').withThinking(effort); + const body = await captureRequestBody(provider, '', [], thinkHistory); + + expect(body['thinking']).toEqual({ type: 'enabled', budget_tokens: budget }); + expect(body['output_config']).toEqual({ effort }); + }, + ); + }); + // Full adaptive-thinking coverage matrix. Adaptive models must // emit { type: 'adaptive' } and output_config; non-adaptive models // must fall back to legacy budget thinking. diff --git a/packages/oauth/src/managed-kimi-code.ts b/packages/oauth/src/managed-kimi-code.ts index 6b0ce7561c..e375153ff5 100644 --- a/packages/oauth/src/managed-kimi-code.ts +++ b/packages/oauth/src/managed-kimi-code.ts @@ -142,6 +142,7 @@ export interface ManagedKimiModelAliasOverrides { displayName?: string | undefined; reasoningKey?: string | undefined; adaptiveThinking?: boolean | undefined; + effortParam?: boolean | undefined; supportEfforts?: readonly string[] | undefined; defaultEffort?: string | undefined; readonly [key: string]: unknown; @@ -158,6 +159,7 @@ export interface ManagedKimiModelAlias { protocol?: ManagedKimiCodeProtocol; betaApi?: boolean; adaptiveThinking?: boolean | undefined; + effortParam?: boolean | undefined; overrides?: ManagedKimiModelAliasOverrides | undefined; readonly [key: string]: unknown; } diff --git a/packages/oauth/src/model-alias-merge.ts b/packages/oauth/src/model-alias-merge.ts index 45c71265ff..99e9fdd5cd 100644 --- a/packages/oauth/src/model-alias-merge.ts +++ b/packages/oauth/src/model-alias-merge.ts @@ -10,6 +10,7 @@ export const MANAGED_KIMI_MODEL_FIELDS: ReadonlySet = new Set([ 'protocol', 'betaApi', 'adaptiveThinking', + 'effortParam', 'supportEfforts', 'defaultEffort', ]); From 8b1af50eef718e580dab270a698ab390b1529aca Mon Sep 17 00:00:00 2001 From: kevingatera <22301610+kevingatera@users.noreply.github.com> Date: Fri, 31 Jul 2026 09:59:35 -0400 Subject: [PATCH 02/12] chore: add changeset for effortParam opt-in --- .changeset/anthropic-effort-param.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/anthropic-effort-param.md diff --git a/.changeset/anthropic-effort-param.md b/.changeset/anthropic-effort-param.md new file mode 100644 index 0000000000..dd97cb8bc7 --- /dev/null +++ b/.changeset/anthropic-effort-param.md @@ -0,0 +1,5 @@ +--- +"@moonshot-ai/kimi-code": patch +--- + +Add an opt-in to send the Anthropic output_config effort field for providers that require it. Set effortParam on the model config or KIMI_MODEL_EFFORT_PARAM to enable. From e823d60ac8aa07f4312d454d93ac42ffd6d1678b Mon Sep 17 00:00:00 2001 From: kevingatera <22301610+kevingatera@users.noreply.github.com> Date: Fri, 31 Jul 2026 10:29:14 -0400 Subject: [PATCH 03/12] feat(agent-core-v2): mirror effortParam opt-in for anthropic output_config.effort The v2 engine silently accepted but dropped effortParam. Plumb it through the same path as adaptiveThinking: the models config section schema, KIMI_MODEL_EFFORT_PARAM in the env overlay, the catalog provider-options allowlist, ProtocolProviderOptions, and the Anthropic base, where the opt-in escapes the budget-path gate so output_config.effort reaches the wire for non-name-recognized Anthropic-compatible endpoints. --- .../src/app/kosongConfig/configSection.ts | 1 + .../src/app/kosongConfig/envOverlay.ts | 5 +++ .../src/kosong/model/catalogService.ts | 1 + .../src/kosong/model/inspection.ts | 1 + .../agent-core-v2/src/kosong/model/model.ts | 2 ++ .../src/kosong/protocol/protocol.ts | 1 + .../bases/anthropic/anthropic.contrib.ts | 1 + .../provider/bases/anthropic/anthropic.ts | 17 +++++++++- .../test/app/kosongConfig/envOverlay.test.ts | 2 ++ .../test/app/model/model.test.ts | 3 ++ .../test/kosong/model/catalog.test.ts | 22 +++++++++++++ .../test/kosong/model/modelService.test.ts | 3 ++ .../test/kosong/provider/composition.test.ts | 31 +++++++++++++++++++ 13 files changed, 89 insertions(+), 1 deletion(-) diff --git a/packages/agent-core-v2/src/app/kosongConfig/configSection.ts b/packages/agent-core-v2/src/app/kosongConfig/configSection.ts index 7af26196b3..7acdce7c2e 100644 --- a/packages/agent-core-v2/src/app/kosongConfig/configSection.ts +++ b/packages/agent-core-v2/src/app/kosongConfig/configSection.ts @@ -187,6 +187,7 @@ const ModelBaseSchema = z.object({ displayName: z.string().optional(), reasoningKey: z.string().optional(), adaptiveThinking: z.boolean().optional(), + effortParam: z.boolean().optional(), betaApi: z.boolean().optional(), supportEfforts: z.array(z.string()).optional(), defaultEffort: z.string().optional(), diff --git a/packages/agent-core-v2/src/app/kosongConfig/envOverlay.ts b/packages/agent-core-v2/src/app/kosongConfig/envOverlay.ts index fca2edf77a..2565acbbe6 100644 --- a/packages/agent-core-v2/src/app/kosongConfig/envOverlay.ts +++ b/packages/agent-core-v2/src/app/kosongConfig/envOverlay.ts @@ -150,6 +150,10 @@ export const kimiModelEnvOverlay: ConfigEffectiveOverlay = { getEnv('KIMI_MODEL_ADAPTIVE_THINKING'), 'KIMI_MODEL_ADAPTIVE_THINKING', ); + const effortParam = parseBooleanVar( + getEnv('KIMI_MODEL_EFFORT_PARAM'), + 'KIMI_MODEL_EFFORT_PARAM', + ); const alias: Record = { provider: ENV_MODEL_PROVIDER_KEY, @@ -161,6 +165,7 @@ export const kimiModelEnvOverlay: ConfigEffectiveOverlay = { if (maxOutputSize !== undefined) alias['maxOutputSize'] = maxOutputSize; if (reasoningKey !== undefined) alias['reasoningKey'] = reasoningKey; if (adaptiveThinking !== undefined) alias['adaptiveThinking'] = adaptiveThinking; + if (effortParam !== undefined) alias['effortParam'] = effortParam; const models = asRecord(effective['models']); const nextModels = { ...models, [ENV_MODEL_ALIAS_KEY]: alias }; diff --git a/packages/agent-core-v2/src/kosong/model/catalogService.ts b/packages/agent-core-v2/src/kosong/model/catalogService.ts index c0b1c1ae9c..e8ee2bad0d 100644 --- a/packages/agent-core-v2/src/kosong/model/catalogService.ts +++ b/packages/agent-core-v2/src/kosong/model/catalogService.ts @@ -610,6 +610,7 @@ function buildProtocolProviderOptions( if (model.maxOutputSize !== undefined) options.defaultMaxTokens = model.maxOutputSize; if (model.supportEfforts !== undefined) options.supportEfforts = model.supportEfforts; if (model.adaptiveThinking !== undefined) options.adaptiveThinking = model.adaptiveThinking; + if (model.effortParam !== undefined) options.effortParam = model.effortParam; if (model.betaApi !== undefined) options.betaApi = model.betaApi; break; case 'openai': { diff --git a/packages/agent-core-v2/src/kosong/model/inspection.ts b/packages/agent-core-v2/src/kosong/model/inspection.ts index fd3b0da964..da463f05fd 100644 --- a/packages/agent-core-v2/src/kosong/model/inspection.ts +++ b/packages/agent-core-v2/src/kosong/model/inspection.ts @@ -198,6 +198,7 @@ const PROVIDER_OPTION_FIELD: Readonly> = { defaultMaxTokens: 'maxOutputSize', supportEfforts: 'supportEfforts', adaptiveThinking: 'adaptiveThinking', + effortParam: 'effortParam', betaApi: 'betaApi', reasoningKey: 'reasoningKey', }; diff --git a/packages/agent-core-v2/src/kosong/model/model.ts b/packages/agent-core-v2/src/kosong/model/model.ts index a32ff5d3de..daf143aba4 100644 --- a/packages/agent-core-v2/src/kosong/model/model.ts +++ b/packages/agent-core-v2/src/kosong/model/model.ts @@ -41,6 +41,7 @@ export interface ModelOverride { displayName?: string; reasoningKey?: string; adaptiveThinking?: boolean; + effortParam?: boolean; supportEfforts?: string[]; defaultEffort?: string; offEffort?: string; @@ -67,6 +68,7 @@ export interface ModelRecord { displayName?: string; reasoningKey?: string; adaptiveThinking?: boolean; + effortParam?: boolean; betaApi?: boolean; supportEfforts?: string[]; defaultEffort?: string; diff --git a/packages/agent-core-v2/src/kosong/protocol/protocol.ts b/packages/agent-core-v2/src/kosong/protocol/protocol.ts index 3e44e5ff57..24ff3f9b0e 100644 --- a/packages/agent-core-v2/src/kosong/protocol/protocol.ts +++ b/packages/agent-core-v2/src/kosong/protocol/protocol.ts @@ -44,6 +44,7 @@ export interface ProtocolProviderOptions { readonly supportEfforts?: readonly string[]; readonly offEffort?: string; readonly adaptiveThinking?: boolean; + readonly effortParam?: boolean; readonly betaApi?: boolean; readonly metadata?: Readonly>; readonly vertexai?: boolean; diff --git a/packages/agent-core-v2/src/kosong/provider/bases/anthropic/anthropic.contrib.ts b/packages/agent-core-v2/src/kosong/provider/bases/anthropic/anthropic.contrib.ts index e0d87ecfe7..b22116c7eb 100644 --- a/packages/agent-core-v2/src/kosong/provider/bases/anthropic/anthropic.contrib.ts +++ b/packages/agent-core-v2/src/kosong/provider/bases/anthropic/anthropic.contrib.ts @@ -31,6 +31,7 @@ registerProtocolBase({ defaultMaxTokens: config.providerOptions?.defaultMaxTokens, adaptiveThinking: config.providerOptions?.adaptiveThinking, supportEfforts: config.providerOptions?.supportEfforts, + effortParam: config.providerOptions?.effortParam, betaApi: config.providerOptions?.betaApi, metadata: config.providerOptions?.metadata === undefined diff --git a/packages/agent-core-v2/src/kosong/provider/bases/anthropic/anthropic.ts b/packages/agent-core-v2/src/kosong/provider/bases/anthropic/anthropic.ts index 5a0cab4764..12dc238a37 100644 --- a/packages/agent-core-v2/src/kosong/provider/bases/anthropic/anthropic.ts +++ b/packages/agent-core-v2/src/kosong/provider/bases/anthropic/anthropic.ts @@ -144,6 +144,16 @@ export interface AnthropicOptions { stream?: boolean | undefined; adaptiveThinking?: boolean | undefined; supportEfforts?: readonly string[] | undefined; + /** + * Opt-in: declare that this model's endpoint honors Anthropic + * `output_config.effort` on the *enabled* thinking path. The provider only + * emits `output_config.effort` for model names it recognizes (adaptive + * profiles); third-party Anthropic-compatible endpoints that honor effort + * without a recognizable name (e.g. z.ai GLM over `/api/anthropic`) set + * this so `/thinking` effort levels take effect. budget_tokens is still + * sent (required by Anthropic's enabled-thinking contract; ignored by z.ai). + */ + effortParam?: boolean | undefined; betaApi?: boolean | undefined; thinkingEffort?: ThinkingEffort | undefined; clientFactory?: (auth: ProviderRequestAuth) => Anthropic; @@ -811,6 +821,7 @@ export class AnthropicChatProvider implements ChatProvider { private readonly _clientFactory: ((auth: ProviderRequestAuth) => Anthropic) | undefined; private readonly _adaptiveThinking: boolean | undefined; private readonly _supportEfforts: readonly string[] | undefined; + private readonly _effortParam: boolean | undefined; private readonly _betaApi: boolean; private readonly _thinkingEffort: ThinkingEffort | undefined; private readonly _explicitMaxTokens: boolean; @@ -822,6 +833,7 @@ export class AnthropicChatProvider implements ChatProvider { this._metadata = options.metadata; this._adaptiveThinking = options.adaptiveThinking; this._supportEfforts = options.supportEfforts; + this._effortParam = options.effortParam; this._betaApi = options.betaApi ?? false; this._thinkingEffort = options.thinkingEffort; this._hooks = options.hooks; @@ -1089,7 +1101,10 @@ export class AnthropicChatProvider implements ChatProvider { : { type: 'enabled', budget_tokens: budgetTokens }, betaFeatures: newBetas, }; - if ((profile.supportsEffortParam || budgetTokens === undefined) && effort !== 'on') { + if ( + (profile.supportsEffortParam || this._effortParam === true || budgetTokens === undefined) && + effort !== 'on' + ) { patch.output_config = { effort } as MessageCreateParams['output_config']; } else { patch.output_config = undefined; diff --git a/packages/agent-core-v2/test/app/kosongConfig/envOverlay.test.ts b/packages/agent-core-v2/test/app/kosongConfig/envOverlay.test.ts index 7c2c574ad9..6448f151a1 100644 --- a/packages/agent-core-v2/test/app/kosongConfig/envOverlay.test.ts +++ b/packages/agent-core-v2/test/app/kosongConfig/envOverlay.test.ts @@ -103,6 +103,7 @@ describe('kimiModelEnvOverlay.apply', () => { KIMI_MODEL_DISPLAY_NAME: 'Mine', KIMI_MODEL_REASONING_KEY: 'reasoning_content', KIMI_MODEL_ADAPTIVE_THINKING: 'true', + KIMI_MODEL_EFFORT_PARAM: 'true', }); expect((effective['models'] as Record)[ENV_MODEL_ALIAS_KEY]).toEqual({ provider: ENV_MODEL_PROVIDER_KEY, @@ -113,6 +114,7 @@ describe('kimiModelEnvOverlay.apply', () => { displayName: 'Mine', reasoningKey: 'reasoning_content', adaptiveThinking: true, + effortParam: true, }); expect(() => apply({}, { KIMI_MODEL_NAME: 'm', KIMI_MODEL_MAX_CONTEXT_SIZE: 'abc' })).toThrowError( diff --git a/packages/agent-core-v2/test/app/model/model.test.ts b/packages/agent-core-v2/test/app/model/model.test.ts index c30a43cdbc..bc8745b68e 100644 --- a/packages/agent-core-v2/test/app/model/model.test.ts +++ b/packages/agent-core-v2/test/app/model/model.test.ts @@ -446,6 +446,7 @@ describe('kimiModelEnvOverlay', () => { KIMI_MODEL_DISPLAY_NAME: 'Custom Model', KIMI_MODEL_REASONING_KEY: 'reasoning', KIMI_MODEL_ADAPTIVE_THINKING: 'true', + KIMI_MODEL_EFFORT_PARAM: 'true', KIMI_MODEL_TEMPERATURE: '0.3', KIMI_MODEL_TOP_P: ' 0.95 ', KIMI_MODEL_THINKING_KEEP: 'all', @@ -465,6 +466,7 @@ describe('kimiModelEnvOverlay', () => { displayName: 'Custom Model', reasoningKey: 'reasoning', adaptiveThinking: true, + effortParam: true, }); expect(effective['modelOverrides']).toEqual({ temperature: 0.3, @@ -488,6 +490,7 @@ describe('kimiModelEnvOverlay', () => { ['KIMI_MODEL_MAX_CONTEXT_SIZE', '1.5'], ['KIMI_MODEL_MAX_OUTPUT_SIZE', 'nope'], ['KIMI_MODEL_ADAPTIVE_THINKING', 'maybe'], + ['KIMI_MODEL_EFFORT_PARAM', 'maybe'], ['KIMI_MODEL_TEMPERATURE', 'abc'], ['KIMI_MODEL_TEMPERATURE', '1.2.3'], ['KIMI_MODEL_TOP_P', 'NaN'], diff --git a/packages/agent-core-v2/test/kosong/model/catalog.test.ts b/packages/agent-core-v2/test/kosong/model/catalog.test.ts index a2d308a64d..d50d99c7c0 100644 --- a/packages/agent-core-v2/test/kosong/model/catalog.test.ts +++ b/packages/agent-core-v2/test/kosong/model/catalog.test.ts @@ -274,6 +274,28 @@ describe('Model assembly (pure data)', () => { } }); + it('passes a declared effortParam through providerOptions for the Anthropic wire', () => { + const { host, catalog } = createHost({ + providers: { + zai: { + type: 'anthropic', + apiKey: 'sk-z', + baseUrl: 'https://zai.example.test/api/anthropic', + }, + }, + models: { + glm: { provider: 'zai', model: 'glm-5.2', maxContextSize: 200000, effortParam: true }, + plain: { provider: 'zai', model: 'glm-4.6', maxContextSize: 200000 }, + }, + }); + try { + expect(catalog.get('glm').providerOptions).toEqual({ effortParam: true }); + expect(catalog.get('plain').providerOptions).toBeUndefined(); + } finally { + host.dispose(); + } + }); + it('enables google-genai vertex mode through providerOptions when project and location resolve', () => { const { host, catalog } = createHost({ providers: { diff --git a/packages/agent-core-v2/test/kosong/model/modelService.test.ts b/packages/agent-core-v2/test/kosong/model/modelService.test.ts index 10d44bb1cc..3e72432819 100644 --- a/packages/agent-core-v2/test/kosong/model/modelService.test.ts +++ b/packages/agent-core-v2/test/kosong/model/modelService.test.ts @@ -26,6 +26,7 @@ describe('models TOML transforms', () => { display_name: 'K2', reasoning_key: 'reasoning_content', adaptive_thinking: true, + effort_param: true, beta_api: true, support_efforts: ['low', 'high'], default_effort: 'high', @@ -40,6 +41,7 @@ describe('models TOML transforms', () => { displayName: 'K2', reasoningKey: 'reasoning_content', adaptiveThinking: true, + effortParam: true, betaApi: true, supportEfforts: ['low', 'high'], defaultEffort: 'high', @@ -55,6 +57,7 @@ describe('models TOML transforms', () => { display_name: 'K2', reasoning_key: 'reasoning_content', adaptive_thinking: true, + effort_param: true, beta_api: true, support_efforts: ['low', 'high'], default_effort: 'high', diff --git a/packages/agent-core-v2/test/kosong/provider/composition.test.ts b/packages/agent-core-v2/test/kosong/provider/composition.test.ts index c7ebdb9feb..77a83b18cd 100644 --- a/packages/agent-core-v2/test/kosong/provider/composition.test.ts +++ b/packages/agent-core-v2/test/kosong/provider/composition.test.ts @@ -739,6 +739,37 @@ describe('per-turn intent wire encoding (behavior probes)', () => { // adds nothing else: no beta header reaches the wire at all. expect(requestOptions).toBeUndefined(); }); + + it('emits output_config.effort on the budget path only with the effortParam opt-in', async () => { + // Third-party Anthropic-compatible endpoints (e.g. z.ai GLM over + // /api/anthropic) honor output_config.effort on the enabled thinking path + // even though their model name is not name-recognized. + // adaptiveThinking:false forces budget mode (supportsEffortParam:false), + // so effortParam is the ONLY way effort reaches the wire for these models. + const optedIn = new AnthropicChatProvider({ + model: 'glm-5.2', + apiKey: 'sk-probe', + stream: false, + adaptiveThinking: false, + effortParam: true, + }); + const { params } = await captureAnthropicBody(optedIn, { thinking: { effort: 'high' } }); + expect(params['thinking']).toEqual({ type: 'enabled', budget_tokens: 32000 }); + expect(params['output_config']).toEqual({ effort: 'high' }); + + // Same budget-mode config, no opt-in -> budget_tokens only. + const optedOut = new AnthropicChatProvider({ + model: 'glm-5.2', + apiKey: 'sk-probe', + stream: false, + adaptiveThinking: false, + }); + const { params: plainParams } = await captureAnthropicBody(optedOut, { + thinking: { effort: 'high' }, + }); + expect(plainParams['thinking']).toEqual({ type: 'enabled', budget_tokens: 32000 }); + expect(plainParams['output_config']).toBeUndefined(); + }); }); describe('quota-exhausted classification through the real composition (behavior probes)', () => { From 6fa72f7813c104e8bc683f984b901f84384b923e Mon Sep 17 00:00:00 2001 From: kevingatera <22301610+kevingatera@users.noreply.github.com> Date: Fri, 31 Jul 2026 10:29:22 -0400 Subject: [PATCH 04/12] test(agent-core): cover KIMI_MODEL_EFFORT_PARAM env parsing --- .../agent-core/test/config/env-model.test.ts | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/packages/agent-core/test/config/env-model.test.ts b/packages/agent-core/test/config/env-model.test.ts index b9ac80e127..14d529d78d 100644 --- a/packages/agent-core/test/config/env-model.test.ts +++ b/packages/agent-core/test/config/env-model.test.ts @@ -161,6 +161,26 @@ describe('applyEnvModelConfig', () => { ); }); + it('maps KIMI_MODEL_EFFORT_PARAM onto the alias', () => { + expect( + apply({ ...MIN, KIMI_MODEL_EFFORT_PARAM: 'true' }) + .models?.[ENV_MODEL_ALIAS_KEY]?.effortParam, + ).toBe(true); + expect( + apply({ ...MIN, KIMI_MODEL_EFFORT_PARAM: 'false' }) + .models?.[ENV_MODEL_ALIAS_KEY]?.effortParam, + ).toBe(false); + expect( + apply({ ...MIN }).models?.[ENV_MODEL_ALIAS_KEY]?.effortParam, + ).toBeUndefined(); + }); + + it('rejects an invalid KIMI_MODEL_EFFORT_PARAM', () => { + expectConfigInvalid(() => + apply({ ...MIN, KIMI_MODEL_EFFORT_PARAM: 'maybe' }), + ); + }); + it('preserves unrelated config fields', () => { const base = getDefaultConfig(); base.defaultPermissionMode = 'auto'; From 57e216b73c688177383f2aa35ba0732be8337880 Mon Sep 17 00:00:00 2001 From: kevingatera <22301610+kevingatera@users.noreply.github.com> Date: Fri, 31 Jul 2026 10:29:22 -0400 Subject: [PATCH 05/12] style(kosong): wrap the overlong withThinking effort condition --- packages/kosong/src/providers/anthropic.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/kosong/src/providers/anthropic.ts b/packages/kosong/src/providers/anthropic.ts index 79b5d92785..ebe7ca7fe7 100644 --- a/packages/kosong/src/providers/anthropic.ts +++ b/packages/kosong/src/providers/anthropic.ts @@ -1259,7 +1259,8 @@ export class AnthropicChatProvider implements ChatProvider { ? ({ type: 'enabled' } as MessageCreateParams['thinking']) : { type: 'enabled', budget_tokens: budgetTokens }; outputConfig = - (profile.supportsEffortParam || this._effortParam === true || budgetTokens === undefined) && effort !== 'on' + (profile.supportsEffortParam || this._effortParam === true || budgetTokens === undefined) && + effort !== 'on' ? ({ effort } as MessageCreateParams['output_config']) : undefined; } From 60721c64828918d8bceb93c82fa46bc995e9b1f5 Mon Sep 17 00:00:00 2001 From: kevingatera <22301610+kevingatera@users.noreply.github.com> Date: Fri, 31 Jul 2026 10:29:22 -0400 Subject: [PATCH 06/12] chore: match effort-param changeset to the adaptive-thinking package set --- .changeset/anthropic-effort-param.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.changeset/anthropic-effort-param.md b/.changeset/anthropic-effort-param.md index dd97cb8bc7..769be262eb 100644 --- a/.changeset/anthropic-effort-param.md +++ b/.changeset/anthropic-effort-param.md @@ -1,5 +1,7 @@ --- -"@moonshot-ai/kimi-code": patch +"@moonshot-ai/agent-core": minor +"@moonshot-ai/kimi-code": minor +"@moonshot-ai/kosong": minor --- -Add an opt-in to send the Anthropic output_config effort field for providers that require it. Set effortParam on the model config or KIMI_MODEL_EFFORT_PARAM to enable. +Add an opt-in to send the Anthropic output_config effort field for providers that require it. Set `effort_param` on the model config or `KIMI_MODEL_EFFORT_PARAM` to enable. From b692011ad58557ee524f525caced5fbc3140831e Mon Sep 17 00:00:00 2001 From: kevingatera <22301610+kevingatera@users.noreply.github.com> Date: Fri, 31 Jul 2026 10:29:22 -0400 Subject: [PATCH 07/12] docs: document KIMI_MODEL_EFFORT_PARAM and the effort_param model field --- docs/en/configuration/config-files.md | 3 ++- docs/en/configuration/env-vars.md | 1 + docs/zh/configuration/config-files.md | 3 ++- docs/zh/configuration/env-vars.md | 1 + 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/en/configuration/config-files.md b/docs/en/configuration/config-files.md index b671922578..4abb1a2e0f 100644 --- a/docs/en/configuration/config-files.md +++ b/docs/en/configuration/config-files.md @@ -159,6 +159,7 @@ Each entry in the `models` table defines a model alias (the name used in `defaul | `display_name` | `string` | No | Name shown in the UI; falls back to `model` when unset | | `reasoning_key` | `string` | No | `openai` provider only. Override the field name used for reasoning content when the gateway returns it under a non-standard name; by default `reasoning_content`, `reasoning_details`, and `reasoning` are auto-detected | | `adaptive_thinking` | `boolean` | No | `anthropic` provider only. Force adaptive thinking on or off, overriding the version inference based on the model name. Omit to infer automatically (Claude ≥ 4.6 uses adaptive) | +| `effort_param` | `boolean` | No | `anthropic` provider only. Opt in to sending `output_config.effort` on the enabled thinking path for endpoints that honor effort but whose model name is not recognized (e.g. third-party Anthropic-compatible gateways). Omit to send effort only for recognized model names | When an alias contains `.`, use a quoted key: @@ -184,7 +185,7 @@ max_context_size = 131072 display_name = "Kimi for Coding (custom)" ``` -`[models."".overrides]` accepts ordinary model fields such as `max_context_size`, `max_input_size`, `max_output_size`, `capabilities`, `display_name`, `reasoning_key`, `adaptive_thinking`, `support_efforts`, `default_effort`, and `off_effort`. It does not accept identity / routing fields: `provider`, `model`, `protocol`, `beta_api`, and `base_url`. +`[models."".overrides]` accepts ordinary model fields such as `max_context_size`, `max_input_size`, `max_output_size`, `capabilities`, `display_name`, `reasoning_key`, `adaptive_thinking`, `effort_param`, `support_efforts`, `default_effort`, and `off_effort`. It does not accept identity / routing fields: `provider`, `model`, `protocol`, `beta_api`, and `base_url`. You can also switch models temporarily without touching the config file — by setting `KIMI_MODEL_*` environment variables, the CLI synthesizes a temporary provider in memory that does not persist after restart. See [Define a model from environment variables](./env-vars.md#define-a-model-from-environment-variables-kimi-model). diff --git a/docs/en/configuration/env-vars.md b/docs/en/configuration/env-vars.md index 9fb803d56c..d7bab8fe07 100644 --- a/docs/en/configuration/env-vars.md +++ b/docs/en/configuration/env-vars.md @@ -111,6 +111,7 @@ Complete variable list: | `KIMI_MODEL_REASONING_KEY` | No | Reasoning field name override (`openai` only) | Auto-detected | | `KIMI_MODEL_THINKING_EFFORT` | No | Thinking effort level: `low`/`medium`/`high`/`xhigh`/`max` | — | | `KIMI_MODEL_ADAPTIVE_THINKING` | No | Force adaptive thinking on or off (`anthropic` only) | Inferred from model name | +| `KIMI_MODEL_EFFORT_PARAM` | No | Send the Anthropic `output_config.effort` field on the enabled thinking path even when the model name is not recognized (`anthropic` only) | Off | If `KIMI_MODEL_NAME` is set but a required variable is missing, startup fails immediately with a clear error message. diff --git a/docs/zh/configuration/config-files.md b/docs/zh/configuration/config-files.md index 478959acf6..02c5c95e23 100644 --- a/docs/zh/configuration/config-files.md +++ b/docs/zh/configuration/config-files.md @@ -159,6 +159,7 @@ KIMI_BASE_URL = "https://api.moonshot.ai/v1" | `display_name` | `string` | 否 | UI 中显示的名称,未设时回退到 `model` | | `reasoning_key` | `string` | 否 | 仅 `openai` 供应商。当网关用非标准字段名返回推理内容时才需要设置;默认自动识别 `reasoning_content` / `reasoning_details` / `reasoning` | | `adaptive_thinking` | `boolean` | 否 | 仅 `anthropic` 供应商。强制开启或关闭 adaptive thinking,覆盖按模型名推断的逻辑。省略时自动推断(Claude ≥ 4.6 使用 adaptive) | +| `effort_param` | `boolean` | 否 | 仅 `anthropic` 供应商。选择性地在 enabled thinking 路径上发送 `output_config.effort` 字段,适用于模型名无法被识别、但支持 effort 的端点(例如第三方 Anthropic 兼容网关)。省略时仅对可识别的模型名发送 effort | 别名中含 `.` 时需要加引号: @@ -184,7 +185,7 @@ max_context_size = 131072 display_name = "Kimi for Coding (custom)" ``` -`[models."".overrides]` 接受普通模型字段,例如 `max_context_size`、`max_input_size`、`max_output_size`、`capabilities`、`display_name`、`reasoning_key`、`adaptive_thinking`、`support_efforts`、`default_effort` 和 `off_effort`。不接受身份 / 路由字段:`provider`、`model`、`protocol`、`beta_api` 和 `base_url`。 +`[models."".overrides]` 接受普通模型字段,例如 `max_context_size`、`max_input_size`、`max_output_size`、`capabilities`、`display_name`、`reasoning_key`、`adaptive_thinking`、`effort_param`、`support_efforts`、`default_effort` 和 `off_effort`。不接受身份 / 路由字段:`provider`、`model`、`protocol`、`beta_api` 和 `base_url`。 无需修改配置文件也可以临时切换模型——通过 `KIMI_MODEL_*` 环境变量在内存里合成一个临时供应商,详见[用环境变量定义模型](./env-vars.md#用环境变量定义模型-kimi-model)。 diff --git a/docs/zh/configuration/env-vars.md b/docs/zh/configuration/env-vars.md index 2b5c461a4b..7c2f7c9c12 100644 --- a/docs/zh/configuration/env-vars.md +++ b/docs/zh/configuration/env-vars.md @@ -111,6 +111,7 @@ kimi | `KIMI_MODEL_REASONING_KEY` | 否 | 推理字段名覆盖(仅 `openai`) | 自动探测 | | `KIMI_MODEL_THINKING_EFFORT` | 否 | Thinking 强度:`low`/`medium`/`high`/`xhigh`/`max` | — | | `KIMI_MODEL_ADAPTIVE_THINKING` | 否 | 强制开启或关闭 adaptive thinking(仅 `anthropic`) | 按模型名推断 | +| `KIMI_MODEL_EFFORT_PARAM` | 否 | 在 enabled thinking 路径上发送 Anthropic `output_config.effort` 字段,即使模型名无法被识别(仅 `anthropic`) | 关闭 | 设置了 `KIMI_MODEL_NAME` 但缺少必填变量时,启动会立即失败并给出明确提示。 From 7d336c2d0cf56550ce7390f73e33af6653f9676a Mon Sep 17 00:00:00 2001 From: kevingatera <22301610+kevingatera@users.noreply.github.com> Date: Fri, 31 Jul 2026 10:31:16 -0400 Subject: [PATCH 08/12] chore(agent-core-v2): regenerate config manifest for effort_param --- packages/agent-core-v2/docs/config-manifest.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/agent-core-v2/docs/config-manifest.toml b/packages/agent-core-v2/docs/config-manifest.toml index 8092e735f1..ece01cd413 100644 --- a/packages/agent-core-v2/docs/config-manifest.toml +++ b/packages/agent-core-v2/docs/config-manifest.toml @@ -227,6 +227,7 @@ merge_all_available_skills = true # display_name: string # reasoning_key: string # adaptive_thinking: boolean + # effort_param: boolean # beta_api: boolean # support_efforts: string[] # default_effort: string @@ -239,6 +240,7 @@ merge_all_available_skills = true # display_name: string # reasoning_key: string # adaptive_thinking: boolean + # effort_param: boolean # support_efforts: string[] # default_effort: string # off_effort: string @@ -303,6 +305,7 @@ merge_all_available_skills = true # display_name: string # reasoning_key: string # adaptive_thinking: boolean +# effort_param: boolean # support_efforts: string[] # default_effort: string # off_effort: string From 3414a43adb424564b4f9c7fa0ceb812b3abf4894 Mon Sep 17 00:00:00 2001 From: kevingatera <22301610+kevingatera@users.noreply.github.com> Date: Fri, 31 Jul 2026 12:07:46 -0400 Subject: [PATCH 09/12] style(agent-core): pass effortParam directly instead of conditional spread --- packages/agent-core/src/config/env-model.ts | 2 +- packages/agent-core/src/session/provider-manager.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/agent-core/src/config/env-model.ts b/packages/agent-core/src/config/env-model.ts index 0346a87305..bf243ce099 100644 --- a/packages/agent-core/src/config/env-model.ts +++ b/packages/agent-core/src/config/env-model.ts @@ -140,7 +140,7 @@ export function applyEnvModelConfig(config: KimiConfig, env: Env = process.env): ...(maxOutputSize !== undefined ? { maxOutputSize } : {}), ...(reasoningKey !== undefined ? { reasoningKey } : {}), ...(adaptiveThinking !== undefined ? { adaptiveThinking } : {}), - ...(effortParam !== undefined ? { effortParam } : {}), + effortParam, }; const thinkingEffort = trimmed(env['KIMI_MODEL_THINKING_EFFORT']); diff --git a/packages/agent-core/src/session/provider-manager.ts b/packages/agent-core/src/session/provider-manager.ts index 2e79b999eb..f788dbbf9a 100644 --- a/packages/agent-core/src/session/provider-manager.ts +++ b/packages/agent-core/src/session/provider-manager.ts @@ -298,7 +298,7 @@ function toKosongProviderConfig( ...(provider.type === 'kimi' ? { kimiThinking: true, convertError: classifyKimiQuotaError } : {}), - ...(effortParam !== undefined ? { effortParam } : {}), + effortParam, ...(betaApi !== undefined ? { betaApi } : {}), // Session affinity: Anthropic's analog of OpenAI `prompt_cache_key` is // `metadata.user_id` on the Messages API (cache-affinity / end-user id). From 1d4027e43f7b018079c1eda8b4b3dc5380177c24 Mon Sep 17 00:00:00 2001 From: kevingatera <22301610+kevingatera@users.noreply.github.com> Date: Fri, 31 Jul 2026 12:07:46 -0400 Subject: [PATCH 10/12] style(kosong,oauth): drop redundant undefined union from effortParam optionals --- packages/kosong/src/providers/anthropic.ts | 2 +- packages/oauth/src/managed-kimi-code.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/kosong/src/providers/anthropic.ts b/packages/kosong/src/providers/anthropic.ts index ebe7ca7fe7..7244da26cc 100644 --- a/packages/kosong/src/providers/anthropic.ts +++ b/packages/kosong/src/providers/anthropic.ts @@ -121,7 +121,7 @@ export interface AnthropicOptions { * `/thinking` effort levels take effect. budget_tokens is still sent * (required by Anthropic's enabled-thinking contract; ignored by z.ai). */ - effortParam?: boolean | undefined; + effortParam?: boolean; /** * Use the Anthropic **beta** Messages API (`client.beta.messages.create`, * `POST /v1/messages?beta=true`) instead of the standard Messages API. diff --git a/packages/oauth/src/managed-kimi-code.ts b/packages/oauth/src/managed-kimi-code.ts index e375153ff5..cd55a5bff6 100644 --- a/packages/oauth/src/managed-kimi-code.ts +++ b/packages/oauth/src/managed-kimi-code.ts @@ -142,7 +142,7 @@ export interface ManagedKimiModelAliasOverrides { displayName?: string | undefined; reasoningKey?: string | undefined; adaptiveThinking?: boolean | undefined; - effortParam?: boolean | undefined; + effortParam?: boolean; supportEfforts?: readonly string[] | undefined; defaultEffort?: string | undefined; readonly [key: string]: unknown; @@ -159,7 +159,7 @@ export interface ManagedKimiModelAlias { protocol?: ManagedKimiCodeProtocol; betaApi?: boolean; adaptiveThinking?: boolean | undefined; - effortParam?: boolean | undefined; + effortParam?: boolean; overrides?: ManagedKimiModelAliasOverrides | undefined; readonly [key: string]: unknown; } From 2ec50df789695c34633eccd52750a7dc1b325f8c Mon Sep 17 00:00:00 2001 From: kevingatera <22301610+kevingatera@users.noreply.github.com> Date: Fri, 31 Jul 2026 12:07:52 -0400 Subject: [PATCH 11/12] docs(agent-core-v2): move effortParam explanation into the module header --- .../provider/bases/anthropic/anthropic.ts | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/packages/agent-core-v2/src/kosong/provider/bases/anthropic/anthropic.ts b/packages/agent-core-v2/src/kosong/provider/bases/anthropic/anthropic.ts index 12dc238a37..6d2efa4821 100644 --- a/packages/agent-core-v2/src/kosong/provider/bases/anthropic/anthropic.ts +++ b/packages/agent-core-v2/src/kosong/provider/bases/anthropic/anthropic.ts @@ -6,6 +6,13 @@ * headers vs the beta endpoint, and the thinking profile matrix (budget vs * adaptive). * + * `output_config.effort` is emitted only for name-recognized (adaptive) + * profiles; the `effortParam` option is an opt-in for third-party + * Anthropic-compatible endpoints (e.g. z.ai GLM over `/api/anthropic`) that + * honor effort on the enabled thinking path without a recognizable model + * name. budget_tokens is still sent there (required by Anthropic's + * enabled-thinking contract; ignored by such gateways). + * * The hook surface is `withThinking` plus `convertError`. `withThinking` * lets a vendor dialect running over this transport re-encode the thinking * intent; when the per-turn thinking intent carries `keep`, the BASE @@ -144,16 +151,7 @@ export interface AnthropicOptions { stream?: boolean | undefined; adaptiveThinking?: boolean | undefined; supportEfforts?: readonly string[] | undefined; - /** - * Opt-in: declare that this model's endpoint honors Anthropic - * `output_config.effort` on the *enabled* thinking path. The provider only - * emits `output_config.effort` for model names it recognizes (adaptive - * profiles); third-party Anthropic-compatible endpoints that honor effort - * without a recognizable name (e.g. z.ai GLM over `/api/anthropic`) set - * this so `/thinking` effort levels take effect. budget_tokens is still - * sent (required by Anthropic's enabled-thinking contract; ignored by z.ai). - */ - effortParam?: boolean | undefined; + effortParam?: boolean; betaApi?: boolean | undefined; thinkingEffort?: ThinkingEffort | undefined; clientFactory?: (auth: ProviderRequestAuth) => Anthropic; From 0fc1f7ae8527e5259c5a65f79896555f29ca037c Mon Sep 17 00:00:00 2001 From: kevingatera <22301610+kevingatera@users.noreply.github.com> Date: Fri, 31 Jul 2026 12:07:52 -0400 Subject: [PATCH 12/12] chore(changeset): scope effort-param release note to kimi-code --- .changeset/anthropic-effort-param.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/.changeset/anthropic-effort-param.md b/.changeset/anthropic-effort-param.md index 769be262eb..991c7818b6 100644 --- a/.changeset/anthropic-effort-param.md +++ b/.changeset/anthropic-effort-param.md @@ -1,7 +1,5 @@ --- -"@moonshot-ai/agent-core": minor "@moonshot-ai/kimi-code": minor -"@moonshot-ai/kosong": minor --- Add an opt-in to send the Anthropic output_config effort field for providers that require it. Set `effort_param` on the model config or `KIMI_MODEL_EFFORT_PARAM` to enable.