@cleanslate/sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/NOTICE +48 -0
- package/README.md +103 -0
- package/VENDOR.md +60 -0
- package/dist/agent/cleanSlateAgentExecutionPhase.d.ts +55 -0
- package/dist/agent/cleanSlateAgentExecutionPhase.d.ts.map +1 -0
- package/dist/agent/cleanSlateAgentExecutionPhase.js +474 -0
- package/dist/agent/cleanSlateAgentExecutionPhase.js.map +1 -0
- package/dist/agent/cleanSlateAgentExecutionSupport.d.ts +22 -0
- package/dist/agent/cleanSlateAgentExecutionSupport.d.ts.map +1 -0
- package/dist/agent/cleanSlateAgentExecutionSupport.js +205 -0
- package/dist/agent/cleanSlateAgentExecutionSupport.js.map +1 -0
- package/dist/agent/cleanSlateAgentParsing.d.ts +21 -0
- package/dist/agent/cleanSlateAgentParsing.d.ts.map +1 -0
- package/dist/agent/cleanSlateAgentParsing.js +106 -0
- package/dist/agent/cleanSlateAgentParsing.js.map +1 -0
- package/dist/agent/cleanSlateAgentSession.d.ts +44 -0
- package/dist/agent/cleanSlateAgentSession.d.ts.map +1 -0
- package/dist/agent/cleanSlateAgentSession.js +205 -0
- package/dist/agent/cleanSlateAgentSession.js.map +1 -0
- package/dist/agent/cleanSlateAgentTypes.d.ts +91 -0
- package/dist/agent/cleanSlateAgentTypes.d.ts.map +1 -0
- package/dist/agent/cleanSlateAgentTypes.js +27 -0
- package/dist/agent/cleanSlateAgentTypes.js.map +1 -0
- package/dist/agent/cleanSlateCommandPolicy.d.ts +12 -0
- package/dist/agent/cleanSlateCommandPolicy.d.ts.map +1 -0
- package/dist/agent/cleanSlateCommandPolicy.js +30 -0
- package/dist/agent/cleanSlateCommandPolicy.js.map +1 -0
- package/dist/agent/cleanSlateContextBudgetManager.d.ts +82 -0
- package/dist/agent/cleanSlateContextBudgetManager.d.ts.map +1 -0
- package/dist/agent/cleanSlateContextBudgetManager.js +419 -0
- package/dist/agent/cleanSlateContextBudgetManager.js.map +1 -0
- package/dist/agent/cleanSlateDomainProfile.d.ts +71 -0
- package/dist/agent/cleanSlateDomainProfile.d.ts.map +1 -0
- package/dist/agent/cleanSlateDomainProfile.js +124 -0
- package/dist/agent/cleanSlateDomainProfile.js.map +1 -0
- package/dist/agent/cleanSlateExecutionBudget.d.ts +19 -0
- package/dist/agent/cleanSlateExecutionBudget.d.ts.map +1 -0
- package/dist/agent/cleanSlateExecutionBudget.js +28 -0
- package/dist/agent/cleanSlateExecutionBudget.js.map +1 -0
- package/dist/agent/cleanSlateExecutionEditPolicy.d.ts +15 -0
- package/dist/agent/cleanSlateExecutionEditPolicy.d.ts.map +1 -0
- package/dist/agent/cleanSlateExecutionEditPolicy.js +148 -0
- package/dist/agent/cleanSlateExecutionEditPolicy.js.map +1 -0
- package/dist/agent/cleanSlateExecutionEvidenceLedger.d.ts +23 -0
- package/dist/agent/cleanSlateExecutionEvidenceLedger.d.ts.map +1 -0
- package/dist/agent/cleanSlateExecutionEvidenceLedger.js +121 -0
- package/dist/agent/cleanSlateExecutionEvidenceLedger.js.map +1 -0
- package/dist/agent/cleanSlateExecutionLoopPrompts.d.ts +5 -0
- package/dist/agent/cleanSlateExecutionLoopPrompts.d.ts.map +1 -0
- package/dist/agent/cleanSlateExecutionLoopPrompts.js +41 -0
- package/dist/agent/cleanSlateExecutionLoopPrompts.js.map +1 -0
- package/dist/agent/cleanSlateExecutionQuery.d.ts +162 -0
- package/dist/agent/cleanSlateExecutionQuery.d.ts.map +1 -0
- package/dist/agent/cleanSlateExecutionQuery.js +1448 -0
- package/dist/agent/cleanSlateExecutionQuery.js.map +1 -0
- package/dist/agent/cleanSlateFilesModifiedService.d.ts +96 -0
- package/dist/agent/cleanSlateFilesModifiedService.d.ts.map +1 -0
- package/dist/agent/cleanSlateFilesModifiedService.js +581 -0
- package/dist/agent/cleanSlateFilesModifiedService.js.map +1 -0
- package/dist/agent/cleanSlateNativeToolTranscript.d.ts +22 -0
- package/dist/agent/cleanSlateNativeToolTranscript.d.ts.map +1 -0
- package/dist/agent/cleanSlateNativeToolTranscript.js +77 -0
- package/dist/agent/cleanSlateNativeToolTranscript.js.map +1 -0
- package/dist/agent/cleanSlatePrompts.d.ts +30 -0
- package/dist/agent/cleanSlatePrompts.d.ts.map +1 -0
- package/dist/agent/cleanSlatePrompts.js +65 -0
- package/dist/agent/cleanSlatePrompts.js.map +1 -0
- package/dist/agent/cleanSlateQueryRunner.d.ts +56 -0
- package/dist/agent/cleanSlateQueryRunner.d.ts.map +1 -0
- package/dist/agent/cleanSlateQueryRunner.js +69 -0
- package/dist/agent/cleanSlateQueryRunner.js.map +1 -0
- package/dist/agent/cleanSlateRuntimePromptBuilder.d.ts +30 -0
- package/dist/agent/cleanSlateRuntimePromptBuilder.d.ts.map +1 -0
- package/dist/agent/cleanSlateRuntimePromptBuilder.js +99 -0
- package/dist/agent/cleanSlateRuntimePromptBuilder.js.map +1 -0
- package/dist/agent/cleanSlateStreamingToolExecutor.d.ts +55 -0
- package/dist/agent/cleanSlateStreamingToolExecutor.d.ts.map +1 -0
- package/dist/agent/cleanSlateStreamingToolExecutor.js +214 -0
- package/dist/agent/cleanSlateStreamingToolExecutor.js.map +1 -0
- package/dist/agent/cleanSlateToolCallLedger.d.ts +32 -0
- package/dist/agent/cleanSlateToolCallLedger.d.ts.map +1 -0
- package/dist/agent/cleanSlateToolCallLedger.js +164 -0
- package/dist/agent/cleanSlateToolCallLedger.js.map +1 -0
- package/dist/agent/cleanSlateToolResultPromptSerializer.d.ts +9 -0
- package/dist/agent/cleanSlateToolResultPromptSerializer.d.ts.map +1 -0
- package/dist/agent/cleanSlateToolResultPromptSerializer.js +184 -0
- package/dist/agent/cleanSlateToolResultPromptSerializer.js.map +1 -0
- package/dist/composer/commands/slashCommands.d.ts +8 -0
- package/dist/composer/commands/slashCommands.d.ts.map +1 -0
- package/dist/composer/commands/slashCommands.js +46 -0
- package/dist/composer/commands/slashCommands.js.map +1 -0
- package/dist/composer/instructions/baseInstructions.d.ts +3 -0
- package/dist/composer/instructions/baseInstructions.d.ts.map +1 -0
- package/dist/composer/instructions/baseInstructions.js +35 -0
- package/dist/composer/instructions/baseInstructions.js.map +1 -0
- package/dist/composer/instructions/runtimeInstructions.d.ts +11 -0
- package/dist/composer/instructions/runtimeInstructions.d.ts.map +1 -0
- package/dist/composer/instructions/runtimeInstructions.js +31 -0
- package/dist/composer/instructions/runtimeInstructions.js.map +1 -0
- package/dist/composer/kernel/coreKernel.d.ts +3 -0
- package/dist/composer/kernel/coreKernel.d.ts.map +1 -0
- package/dist/composer/kernel/coreKernel.js +11 -0
- package/dist/composer/kernel/coreKernel.js.map +1 -0
- package/dist/composer/kernel/editingRules.d.ts +3 -0
- package/dist/composer/kernel/editingRules.d.ts.map +1 -0
- package/dist/composer/kernel/editingRules.js +24 -0
- package/dist/composer/kernel/editingRules.js.map +1 -0
- package/dist/composer/kernel/toolProtocols.d.ts +2 -0
- package/dist/composer/kernel/toolProtocols.d.ts.map +1 -0
- package/dist/composer/kernel/toolProtocols.js +32 -0
- package/dist/composer/kernel/toolProtocols.js.map +1 -0
- package/dist/composer/modes/execution.mode.d.ts +2 -0
- package/dist/composer/modes/execution.mode.d.ts.map +1 -0
- package/dist/composer/modes/execution.mode.js +21 -0
- package/dist/composer/modes/execution.mode.js.map +1 -0
- package/dist/composer/modes/planning.mode.d.ts +2 -0
- package/dist/composer/modes/planning.mode.d.ts.map +1 -0
- package/dist/composer/modes/planning.mode.js +23 -0
- package/dist/composer/modes/planning.mode.js.map +1 -0
- package/dist/composer/promptComposer.d.ts +22 -0
- package/dist/composer/promptComposer.d.ts.map +1 -0
- package/dist/composer/promptComposer.js +62 -0
- package/dist/composer/promptComposer.js.map +1 -0
- package/dist/composer/registry/agentSchema.d.ts +16 -0
- package/dist/composer/registry/agentSchema.d.ts.map +1 -0
- package/dist/composer/registry/agentSchema.js +6 -0
- package/dist/composer/registry/agentSchema.js.map +1 -0
- package/dist/core/arrays.d.ts +311 -0
- package/dist/core/arrays.d.ts.map +1 -0
- package/dist/core/arrays.js +811 -0
- package/dist/core/arrays.js.map +1 -0
- package/dist/core/arraysFind.d.ts +72 -0
- package/dist/core/arraysFind.d.ts.map +1 -0
- package/dist/core/arraysFind.js +200 -0
- package/dist/core/arraysFind.js.map +1 -0
- package/dist/core/assert.d.ts +36 -0
- package/dist/core/assert.d.ts.map +1 -0
- package/dist/core/assert.js +84 -0
- package/dist/core/assert.js.map +1 -0
- package/dist/core/async.d.ts +11 -0
- package/dist/core/async.d.ts.map +1 -0
- package/dist/core/async.js +6 -0
- package/dist/core/async.js.map +1 -0
- package/dist/core/buffer.d.ts +23 -0
- package/dist/core/buffer.d.ts.map +1 -0
- package/dist/core/buffer.js +40 -0
- package/dist/core/buffer.js.map +1 -0
- package/dist/core/cancellation.d.ts +52 -0
- package/dist/core/cancellation.d.ts.map +1 -0
- package/dist/core/cancellation.js +169 -0
- package/dist/core/cancellation.js.map +1 -0
- package/dist/core/charCode.d.ts +428 -0
- package/dist/core/charCode.d.ts.map +1 -0
- package/dist/core/charCode.js +439 -0
- package/dist/core/charCode.js.map +1 -0
- package/dist/core/collections.d.ts +49 -0
- package/dist/core/collections.d.ts.map +1 -0
- package/dist/core/collections.js +132 -0
- package/dist/core/collections.js.map +1 -0
- package/dist/core/diff/diff.d.ts +151 -0
- package/dist/core/diff/diff.d.ts.map +1 -0
- package/dist/core/diff/diff.js +1076 -0
- package/dist/core/diff/diff.js.map +1 -0
- package/dist/core/diff/diffChange.d.ts +39 -0
- package/dist/core/diff/diffChange.d.ts.map +1 -0
- package/dist/core/diff/diffChange.js +37 -0
- package/dist/core/diff/diffChange.js.map +1 -0
- package/dist/core/errors.d.ts +114 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +258 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/event.d.ts +595 -0
- package/dist/core/event.d.ts.map +1 -0
- package/dist/core/event.js +1479 -0
- package/dist/core/event.js.map +1 -0
- package/dist/core/functional.d.ts +5 -0
- package/dist/core/functional.d.ts.map +1 -0
- package/dist/core/functional.js +35 -0
- package/dist/core/functional.js.map +1 -0
- package/dist/core/hash.d.ts +15 -0
- package/dist/core/hash.d.ts.map +1 -0
- package/dist/core/hash.js +27 -0
- package/dist/core/hash.js.map +1 -0
- package/dist/core/iterator.d.ts +33 -0
- package/dist/core/iterator.d.ts.map +1 -0
- package/dist/core/iterator.js +188 -0
- package/dist/core/iterator.js.map +1 -0
- package/dist/core/lifecycle.d.ts +313 -0
- package/dist/core/lifecycle.d.ts.map +1 -0
- package/dist/core/lifecycle.js +789 -0
- package/dist/core/lifecycle.js.map +1 -0
- package/dist/core/linkedList.d.ts +17 -0
- package/dist/core/linkedList.d.ts.map +1 -0
- package/dist/core/linkedList.js +138 -0
- package/dist/core/linkedList.js.map +1 -0
- package/dist/core/map.d.ts +175 -0
- package/dist/core/map.d.ts.map +1 -0
- package/dist/core/map.js +796 -0
- package/dist/core/map.js.map +1 -0
- package/dist/core/marshallingIds.d.ts +29 -0
- package/dist/core/marshallingIds.d.ts.map +1 -0
- package/dist/core/marshallingIds.js +38 -0
- package/dist/core/marshallingIds.js.map +1 -0
- package/dist/core/observable.d.ts +28 -0
- package/dist/core/observable.d.ts.map +1 -0
- package/dist/core/observable.js +6 -0
- package/dist/core/observable.js.map +1 -0
- package/dist/core/platform.d.ts +4 -0
- package/dist/core/platform.d.ts.map +1 -0
- package/dist/core/platform.js +17 -0
- package/dist/core/platform.js.map +1 -0
- package/dist/core/position.d.ts +91 -0
- package/dist/core/position.d.ts.map +1 -0
- package/dist/core/position.js +145 -0
- package/dist/core/position.js.map +1 -0
- package/dist/core/range.d.ts +198 -0
- package/dist/core/range.d.ts.map +1 -0
- package/dist/core/range.js +426 -0
- package/dist/core/range.js.map +1 -0
- package/dist/core/resources.d.ts +10 -0
- package/dist/core/resources.d.ts.map +1 -0
- package/dist/core/resources.js +126 -0
- package/dist/core/resources.js.map +1 -0
- package/dist/core/sequence.d.ts +20 -0
- package/dist/core/sequence.d.ts.map +1 -0
- package/dist/core/sequence.js +21 -0
- package/dist/core/sequence.js.map +1 -0
- package/dist/core/stopwatch.d.ts +11 -0
- package/dist/core/stopwatch.d.ts.map +1 -0
- package/dist/core/stopwatch.js +33 -0
- package/dist/core/stopwatch.js.map +1 -0
- package/dist/core/symbols.d.ts +5 -0
- package/dist/core/symbols.d.ts.map +1 -0
- package/dist/core/symbols.js +13 -0
- package/dist/core/symbols.js.map +1 -0
- package/dist/core/types.d.ts +229 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +278 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/uint.d.ts +32 -0
- package/dist/core/uint.d.ts.map +1 -0
- package/dist/core/uint.js +57 -0
- package/dist/core/uint.js.map +1 -0
- package/dist/core/uri.d.ts +172 -0
- package/dist/core/uri.d.ts.map +1 -0
- package/dist/core/uri.js +623 -0
- package/dist/core/uri.js.map +1 -0
- package/dist/host/browserAutomation.d.ts +276 -0
- package/dist/host/browserAutomation.d.ts.map +1 -0
- package/dist/host/browserAutomation.js +6 -0
- package/dist/host/browserAutomation.js.map +1 -0
- package/dist/host/diagnostics.d.ts +68 -0
- package/dist/host/diagnostics.d.ts.map +1 -0
- package/dist/host/diagnostics.js +41 -0
- package/dist/host/diagnostics.js.map +1 -0
- package/dist/host/files.d.ts +70 -0
- package/dist/host/files.d.ts.map +1 -0
- package/dist/host/files.js +54 -0
- package/dist/host/files.js.map +1 -0
- package/dist/host/services.d.ts +106 -0
- package/dist/host/services.d.ts.map +1 -0
- package/dist/host/services.js +6 -0
- package/dist/host/services.js.map +1 -0
- package/dist/host/symbols.d.ts +45 -0
- package/dist/host/symbols.d.ts.map +1 -0
- package/dist/host/symbols.js +43 -0
- package/dist/host/symbols.js.map +1 -0
- package/dist/host/textModel.d.ts +83 -0
- package/dist/host/textModel.d.ts.map +1 -0
- package/dist/host/textModel.js +6 -0
- package/dist/host/textModel.js.map +1 -0
- package/dist/host/workspace.d.ts +123 -0
- package/dist/host/workspace.d.ts.map +1 -0
- package/dist/host/workspace.js +32 -0
- package/dist/host/workspace.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/node/cleanSlateAnthropicMessageAdapter.d.ts +12 -0
- package/dist/node/cleanSlateAnthropicMessageAdapter.d.ts.map +1 -0
- package/dist/node/cleanSlateAnthropicMessageAdapter.js +130 -0
- package/dist/node/cleanSlateAnthropicMessageAdapter.js.map +1 -0
- package/dist/node/cleanSlateHeadlessRunner.d.ts +63 -0
- package/dist/node/cleanSlateHeadlessRunner.d.ts.map +1 -0
- package/dist/node/cleanSlateHeadlessRunner.js +84 -0
- package/dist/node/cleanSlateHeadlessRunner.js.map +1 -0
- package/dist/node/cleanSlateNodeAgentRuntime.d.ts +94 -0
- package/dist/node/cleanSlateNodeAgentRuntime.d.ts.map +1 -0
- package/dist/node/cleanSlateNodeAgentRuntime.js +339 -0
- package/dist/node/cleanSlateNodeAgentRuntime.js.map +1 -0
- package/dist/node/cleanSlateNodeBrowserAutomation.d.ts +279 -0
- package/dist/node/cleanSlateNodeBrowserAutomation.d.ts.map +1 -0
- package/dist/node/cleanSlateNodeBrowserAutomation.js +470 -0
- package/dist/node/cleanSlateNodeBrowserAutomation.js.map +1 -0
- package/dist/node/cleanSlateNodeCommandService.d.ts +40 -0
- package/dist/node/cleanSlateNodeCommandService.d.ts.map +1 -0
- package/dist/node/cleanSlateNodeCommandService.js +435 -0
- package/dist/node/cleanSlateNodeCommandService.js.map +1 -0
- package/dist/node/cleanSlateNodeFileServices.d.ts +68 -0
- package/dist/node/cleanSlateNodeFileServices.d.ts.map +1 -0
- package/dist/node/cleanSlateNodeFileServices.js +138 -0
- package/dist/node/cleanSlateNodeFileServices.js.map +1 -0
- package/dist/node/cleanSlateNodeIndexService.d.ts +17 -0
- package/dist/node/cleanSlateNodeIndexService.d.ts.map +1 -0
- package/dist/node/cleanSlateNodeIndexService.js +128 -0
- package/dist/node/cleanSlateNodeIndexService.js.map +1 -0
- package/dist/node/cleanSlateNodeLanguageCommands.d.ts +11 -0
- package/dist/node/cleanSlateNodeLanguageCommands.d.ts.map +1 -0
- package/dist/node/cleanSlateNodeLanguageCommands.js +146 -0
- package/dist/node/cleanSlateNodeLanguageCommands.js.map +1 -0
- package/dist/node/cleanSlateNodeMainService.d.ts +87 -0
- package/dist/node/cleanSlateNodeMainService.d.ts.map +1 -0
- package/dist/node/cleanSlateNodeMainService.js +1304 -0
- package/dist/node/cleanSlateNodeMainService.js.map +1 -0
- package/dist/node/cleanSlateNodeMcpClient.d.ts +20 -0
- package/dist/node/cleanSlateNodeMcpClient.d.ts.map +1 -0
- package/dist/node/cleanSlateNodeMcpClient.js +184 -0
- package/dist/node/cleanSlateNodeMcpClient.js.map +1 -0
- package/dist/node/cleanSlateNodeSearchService.d.ts +14 -0
- package/dist/node/cleanSlateNodeSearchService.d.ts.map +1 -0
- package/dist/node/cleanSlateNodeSearchService.js +180 -0
- package/dist/node/cleanSlateNodeSearchService.js.map +1 -0
- package/dist/node/cleanSlateNodeTextModel.d.ts +56 -0
- package/dist/node/cleanSlateNodeTextModel.d.ts.map +1 -0
- package/dist/node/cleanSlateNodeTextModel.js +127 -0
- package/dist/node/cleanSlateNodeTextModel.js.map +1 -0
- package/dist/node/cleanSlateNodeToolContext.d.ts +50 -0
- package/dist/node/cleanSlateNodeToolContext.d.ts.map +1 -0
- package/dist/node/cleanSlateNodeToolContext.js +134 -0
- package/dist/node/cleanSlateNodeToolContext.js.map +1 -0
- package/dist/node/cleanSlateNodeWebRetrieval.d.ts +20 -0
- package/dist/node/cleanSlateNodeWebRetrieval.d.ts.map +1 -0
- package/dist/node/cleanSlateNodeWebRetrieval.js +379 -0
- package/dist/node/cleanSlateNodeWebRetrieval.js.map +1 -0
- package/dist/node/cleanSlateOpenAIMessageAdapter.d.ts +8 -0
- package/dist/node/cleanSlateOpenAIMessageAdapter.d.ts.map +1 -0
- package/dist/node/cleanSlateOpenAIMessageAdapter.js +111 -0
- package/dist/node/cleanSlateOpenAIMessageAdapter.js.map +1 -0
- package/dist/node/cleanSlateProviderSchemaNormalizer.d.ts +18 -0
- package/dist/node/cleanSlateProviderSchemaNormalizer.d.ts.map +1 -0
- package/dist/node/cleanSlateProviderSchemaNormalizer.js +175 -0
- package/dist/node/cleanSlateProviderSchemaNormalizer.js.map +1 -0
- package/dist/node/index.d.ts +25 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +28 -0
- package/dist/node/index.js.map +1 -0
- package/dist/protocol/cleanSlateAI.d.ts +964 -0
- package/dist/protocol/cleanSlateAI.d.ts.map +1 -0
- package/dist/protocol/cleanSlateAI.js +35 -0
- package/dist/protocol/cleanSlateAI.js.map +1 -0
- package/dist/protocol/cleanSlateModelCapabilities.d.ts +86 -0
- package/dist/protocol/cleanSlateModelCapabilities.d.ts.map +1 -0
- package/dist/protocol/cleanSlateModelCapabilities.js +1104 -0
- package/dist/protocol/cleanSlateModelCapabilities.js.map +1 -0
- package/dist/protocol/cleanSlateProviderMessageTransforms.d.ts +11 -0
- package/dist/protocol/cleanSlateProviderMessageTransforms.d.ts.map +1 -0
- package/dist/protocol/cleanSlateProviderMessageTransforms.js +178 -0
- package/dist/protocol/cleanSlateProviderMessageTransforms.js.map +1 -0
- package/dist/protocol/cleanSlateService.d.ts +68 -0
- package/dist/protocol/cleanSlateService.d.ts.map +1 -0
- package/dist/protocol/cleanSlateService.js +1149 -0
- package/dist/protocol/cleanSlateService.js.map +1 -0
- package/dist/services/cleanSlateCancellation.d.ts +7 -0
- package/dist/services/cleanSlateCancellation.d.ts.map +1 -0
- package/dist/services/cleanSlateCancellation.js +56 -0
- package/dist/services/cleanSlateCancellation.js.map +1 -0
- package/dist/services/cleanSlateCommandExecutionService.d.ts +25 -0
- package/dist/services/cleanSlateCommandExecutionService.d.ts.map +1 -0
- package/dist/services/cleanSlateCommandExecutionService.js +31 -0
- package/dist/services/cleanSlateCommandExecutionService.js.map +1 -0
- package/dist/services/cleanSlateDiffService.d.ts +62 -0
- package/dist/services/cleanSlateDiffService.d.ts.map +1 -0
- package/dist/services/cleanSlateDiffService.js +428 -0
- package/dist/services/cleanSlateDiffService.js.map +1 -0
- package/dist/services/cleanSlateEditMatchValidator.d.ts +63 -0
- package/dist/services/cleanSlateEditMatchValidator.d.ts.map +1 -0
- package/dist/services/cleanSlateEditMatchValidator.js +341 -0
- package/dist/services/cleanSlateEditMatchValidator.js.map +1 -0
- package/dist/services/cleanSlateEditService.d.ts +155 -0
- package/dist/services/cleanSlateEditService.d.ts.map +1 -0
- package/dist/services/cleanSlateEditService.js +848 -0
- package/dist/services/cleanSlateEditService.js.map +1 -0
- package/dist/services/cleanSlateFileHistory.d.ts +56 -0
- package/dist/services/cleanSlateFileHistory.d.ts.map +1 -0
- package/dist/services/cleanSlateFileHistory.js +157 -0
- package/dist/services/cleanSlateFileHistory.js.map +1 -0
- package/dist/services/cleanSlateTaskEvidenceCodec.d.ts +15 -0
- package/dist/services/cleanSlateTaskEvidenceCodec.d.ts.map +1 -0
- package/dist/services/cleanSlateTaskEvidenceCodec.js +151 -0
- package/dist/services/cleanSlateTaskEvidenceCodec.js.map +1 -0
- package/dist/services/cleanSlateTaskSessionService.d.ts +258 -0
- package/dist/services/cleanSlateTaskSessionService.d.ts.map +1 -0
- package/dist/services/cleanSlateTaskSessionService.js +1079 -0
- package/dist/services/cleanSlateTaskSessionService.js.map +1 -0
- package/dist/services/cleanSlateTaskState.d.ts +32 -0
- package/dist/services/cleanSlateTaskState.d.ts.map +1 -0
- package/dist/services/cleanSlateTaskState.js +40 -0
- package/dist/services/cleanSlateTaskState.js.map +1 -0
- package/dist/services/cleanSlateThreadService.d.ts +64 -0
- package/dist/services/cleanSlateThreadService.d.ts.map +1 -0
- package/dist/services/cleanSlateThreadService.js +188 -0
- package/dist/services/cleanSlateThreadService.js.map +1 -0
- package/dist/services/cleanSlateTools.d.ts +29 -0
- package/dist/services/cleanSlateTools.d.ts.map +1 -0
- package/dist/services/cleanSlateTools.js +38 -0
- package/dist/services/cleanSlateTools.js.map +1 -0
- package/dist/services/cleanSlateVerificationTargetTracker.d.ts +23 -0
- package/dist/services/cleanSlateVerificationTargetTracker.d.ts.map +1 -0
- package/dist/services/cleanSlateVerificationTargetTracker.js +214 -0
- package/dist/services/cleanSlateVerificationTargetTracker.js.map +1 -0
- package/dist/skills/cleanSlateSkillCatalog.d.ts +29 -0
- package/dist/skills/cleanSlateSkillCatalog.d.ts.map +1 -0
- package/dist/skills/cleanSlateSkillCatalog.js +225 -0
- package/dist/skills/cleanSlateSkillCatalog.js.map +1 -0
- package/dist/tools/ApplyEditTool.d.ts +73 -0
- package/dist/tools/ApplyEditTool.d.ts.map +1 -0
- package/dist/tools/ApplyEditTool.js +741 -0
- package/dist/tools/ApplyEditTool.js.map +1 -0
- package/dist/tools/AskQuestionTool.d.ts +3 -0
- package/dist/tools/AskQuestionTool.d.ts.map +1 -0
- package/dist/tools/AskQuestionTool.js +113 -0
- package/dist/tools/AskQuestionTool.js.map +1 -0
- package/dist/tools/BrowserAutomationTools.d.ts +28 -0
- package/dist/tools/BrowserAutomationTools.d.ts.map +1 -0
- package/dist/tools/BrowserAutomationTools.js +639 -0
- package/dist/tools/BrowserAutomationTools.js.map +1 -0
- package/dist/tools/CreateMultipleFilesTool.d.ts +6 -0
- package/dist/tools/CreateMultipleFilesTool.d.ts.map +1 -0
- package/dist/tools/CreateMultipleFilesTool.js +115 -0
- package/dist/tools/CreateMultipleFilesTool.js.map +1 -0
- package/dist/tools/ExecuteCommandTool.d.ts +12 -0
- package/dist/tools/ExecuteCommandTool.d.ts.map +1 -0
- package/dist/tools/ExecuteCommandTool.js +378 -0
- package/dist/tools/ExecuteCommandTool.js.map +1 -0
- package/dist/tools/FileHistoryRewindTool.d.ts +3 -0
- package/dist/tools/FileHistoryRewindTool.d.ts.map +1 -0
- package/dist/tools/FileHistoryRewindTool.js +45 -0
- package/dist/tools/FileHistoryRewindTool.js.map +1 -0
- package/dist/tools/FindByNameTool.d.ts +6 -0
- package/dist/tools/FindByNameTool.d.ts.map +1 -0
- package/dist/tools/FindByNameTool.js +80 -0
- package/dist/tools/FindByNameTool.js.map +1 -0
- package/dist/tools/FindReferencesTool.d.ts +3 -0
- package/dist/tools/FindReferencesTool.d.ts.map +1 -0
- package/dist/tools/FindReferencesTool.js +128 -0
- package/dist/tools/FindReferencesTool.js.map +1 -0
- package/dist/tools/GetDefinitionsTool.d.ts +3 -0
- package/dist/tools/GetDefinitionsTool.d.ts.map +1 -0
- package/dist/tools/GetDefinitionsTool.js +136 -0
- package/dist/tools/GetDefinitionsTool.js.map +1 -0
- package/dist/tools/GetOpenFilesTool.d.ts +6 -0
- package/dist/tools/GetOpenFilesTool.d.ts.map +1 -0
- package/dist/tools/GetOpenFilesTool.js +21 -0
- package/dist/tools/GetOpenFilesTool.js.map +1 -0
- package/dist/tools/GrepSearchTool.d.ts +7 -0
- package/dist/tools/GrepSearchTool.d.ts.map +1 -0
- package/dist/tools/GrepSearchTool.js +95 -0
- package/dist/tools/GrepSearchTool.js.map +1 -0
- package/dist/tools/ListDirTool.d.ts +6 -0
- package/dist/tools/ListDirTool.d.ts.map +1 -0
- package/dist/tools/ListDirTool.js +39 -0
- package/dist/tools/ListDirTool.js.map +1 -0
- package/dist/tools/MCPTools.d.ts +6 -0
- package/dist/tools/MCPTools.d.ts.map +1 -0
- package/dist/tools/MCPTools.js +103 -0
- package/dist/tools/MCPTools.js.map +1 -0
- package/dist/tools/MultiFileReplaceTool.d.ts +6 -0
- package/dist/tools/MultiFileReplaceTool.d.ts.map +1 -0
- package/dist/tools/MultiFileReplaceTool.js +345 -0
- package/dist/tools/MultiFileReplaceTool.js.map +1 -0
- package/dist/tools/ReadFileRangeTool.d.ts +6 -0
- package/dist/tools/ReadFileRangeTool.d.ts.map +1 -0
- package/dist/tools/ReadFileRangeTool.js +150 -0
- package/dist/tools/ReadFileRangeTool.js.map +1 -0
- package/dist/tools/ReadFileTool.d.ts +6 -0
- package/dist/tools/ReadFileTool.d.ts.map +1 -0
- package/dist/tools/ReadFileTool.js +183 -0
- package/dist/tools/ReadFileTool.js.map +1 -0
- package/dist/tools/ReadLintsTool.d.ts +6 -0
- package/dist/tools/ReadLintsTool.d.ts.map +1 -0
- package/dist/tools/ReadLintsTool.js +83 -0
- package/dist/tools/ReadLintsTool.js.map +1 -0
- package/dist/tools/ReadReferenceTool.d.ts +6 -0
- package/dist/tools/ReadReferenceTool.d.ts.map +1 -0
- package/dist/tools/ReadReferenceTool.js +24 -0
- package/dist/tools/ReadReferenceTool.js.map +1 -0
- package/dist/tools/ReadSymbolsTool.d.ts +3 -0
- package/dist/tools/ReadSymbolsTool.d.ts.map +1 -0
- package/dist/tools/ReadSymbolsTool.js +100 -0
- package/dist/tools/ReadSymbolsTool.js.map +1 -0
- package/dist/tools/SearchCodebaseTool.d.ts +6 -0
- package/dist/tools/SearchCodebaseTool.d.ts.map +1 -0
- package/dist/tools/SearchCodebaseTool.js +30 -0
- package/dist/tools/SearchCodebaseTool.js.map +1 -0
- package/dist/tools/SearchWorkspaceTool.d.ts +7 -0
- package/dist/tools/SearchWorkspaceTool.d.ts.map +1 -0
- package/dist/tools/SearchWorkspaceTool.js +21 -0
- package/dist/tools/SearchWorkspaceTool.js.map +1 -0
- package/dist/tools/SemanticSearchTool.d.ts +12 -0
- package/dist/tools/SemanticSearchTool.d.ts.map +1 -0
- package/dist/tools/SemanticSearchTool.js +46 -0
- package/dist/tools/SemanticSearchTool.js.map +1 -0
- package/dist/tools/SkillTools.d.ts +3 -0
- package/dist/tools/SkillTools.d.ts.map +1 -0
- package/dist/tools/SkillTools.js +108 -0
- package/dist/tools/SkillTools.js.map +1 -0
- package/dist/tools/SpawnWorkerTool.d.ts +6 -0
- package/dist/tools/SpawnWorkerTool.d.ts.map +1 -0
- package/dist/tools/SpawnWorkerTool.js +28 -0
- package/dist/tools/SpawnWorkerTool.js.map +1 -0
- package/dist/tools/SubmitArtifactTool.d.ts +3 -0
- package/dist/tools/SubmitArtifactTool.d.ts.map +1 -0
- package/dist/tools/SubmitArtifactTool.js +121 -0
- package/dist/tools/SubmitArtifactTool.js.map +1 -0
- package/dist/tools/UndoEditTool.d.ts +3 -0
- package/dist/tools/UndoEditTool.d.ts.map +1 -0
- package/dist/tools/UndoEditTool.js +66 -0
- package/dist/tools/UndoEditTool.js.map +1 -0
- package/dist/tools/UpdateTodoTool.d.ts +6 -0
- package/dist/tools/UpdateTodoTool.d.ts.map +1 -0
- package/dist/tools/UpdateTodoTool.js +116 -0
- package/dist/tools/UpdateTodoTool.js.map +1 -0
- package/dist/tools/WebRetrievalTools.d.ts +4 -0
- package/dist/tools/WebRetrievalTools.d.ts.map +1 -0
- package/dist/tools/WebRetrievalTools.js +169 -0
- package/dist/tools/WebRetrievalTools.js.map +1 -0
- package/dist/tools/WriteFileTool.d.ts +6 -0
- package/dist/tools/WriteFileTool.d.ts.map +1 -0
- package/dist/tools/WriteFileTool.js +145 -0
- package/dist/tools/WriteFileTool.js.map +1 -0
- package/dist/tools/cleanSlateFileReadPolicy.d.ts +33 -0
- package/dist/tools/cleanSlateFileReadPolicy.d.ts.map +1 -0
- package/dist/tools/cleanSlateFileReadPolicy.js +84 -0
- package/dist/tools/cleanSlateFileReadPolicy.js.map +1 -0
- package/dist/tools/cleanSlateHostTypes.d.ts +100 -0
- package/dist/tools/cleanSlateHostTypes.d.ts.map +1 -0
- package/dist/tools/cleanSlateHostTypes.js +6 -0
- package/dist/tools/cleanSlateHostTypes.js.map +1 -0
- package/dist/tools/cleanSlatePlanArtifactPolicy.d.ts +47 -0
- package/dist/tools/cleanSlatePlanArtifactPolicy.d.ts.map +1 -0
- package/dist/tools/cleanSlatePlanArtifactPolicy.js +126 -0
- package/dist/tools/cleanSlatePlanArtifactPolicy.js.map +1 -0
- package/dist/tools/cleanSlateStaleDiagnosticPolicy.d.ts +3 -0
- package/dist/tools/cleanSlateStaleDiagnosticPolicy.d.ts.map +1 -0
- package/dist/tools/cleanSlateStaleDiagnosticPolicy.js +13 -0
- package/dist/tools/cleanSlateStaleDiagnosticPolicy.js.map +1 -0
- package/dist/tools/languageFeatureActivation.d.ts +13 -0
- package/dist/tools/languageFeatureActivation.d.ts.map +1 -0
- package/dist/tools/languageFeatureActivation.js +95 -0
- package/dist/tools/languageFeatureActivation.js.map +1 -0
- package/dist/tools/registry.d.ts +5 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +104 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/structuredEditCanonicalizer.d.ts +11 -0
- package/dist/tools/structuredEditCanonicalizer.d.ts.map +1 -0
- package/dist/tools/structuredEditCanonicalizer.js +44 -0
- package/dist/tools/structuredEditCanonicalizer.js.map +1 -0
- package/dist/tools/symbolContext.d.ts +36 -0
- package/dist/tools/symbolContext.d.ts.map +1 -0
- package/dist/tools/symbolContext.js +146 -0
- package/dist/tools/symbolContext.js.map +1 -0
- package/dist/tools/symbolEditResolver.d.ts +11 -0
- package/dist/tools/symbolEditResolver.d.ts.map +1 -0
- package/dist/tools/symbolEditResolver.js +259 -0
- package/dist/tools/symbolEditResolver.js.map +1 -0
- package/dist/tools/symbolIndex.d.ts +18 -0
- package/dist/tools/symbolIndex.d.ts.map +1 -0
- package/dist/tools/symbolIndex.js +235 -0
- package/dist/tools/symbolIndex.js.map +1 -0
- package/dist/tools/types.d.ts +108 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +6 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/utils.d.ts +56 -0
- package/dist/tools/utils.d.ts.map +1 -0
- package/dist/tools/utils.js +205 -0
- package/dist/tools/utils.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,1104 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) CleanSlate. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { CLEANSLATE_FALLBACK_CONTEXT_WINDOW_TOKENS, CLEANSLATE_REASONING_LEVELS, isCleanSlateReasoningLevel } from './cleanSlateAI.js';
|
|
6
|
+
const DEFAULT_CONTEXT_WINDOW_TOKENS = CLEANSLATE_FALLBACK_CONTEXT_WINDOW_TOKENS;
|
|
7
|
+
const MIN_CONTEXT_WINDOW_TOKENS = 1024;
|
|
8
|
+
const DEFAULT_KNOWN_INPUT_BUFFER_TOKENS = 20_000;
|
|
9
|
+
const DEFAULT_REQUEST_OUTPUT_CAP_TOKENS = 32_000;
|
|
10
|
+
const DEFAULT_MODEL_OUTPUT_TOKENS = 16_384;
|
|
11
|
+
const MODEL_LIMITS = {
|
|
12
|
+
openai: {
|
|
13
|
+
gpt5: { modelContextWindowTokens: 400_000, maxInputTokens: 272_000, modelMaxOutputTokens: 128_000 },
|
|
14
|
+
gpt5Long: { modelContextWindowTokens: 1_050_000, maxInputTokens: 922_000, modelMaxOutputTokens: 128_000 },
|
|
15
|
+
gpt41: { modelContextWindowTokens: 1_047_576, modelMaxOutputTokens: 32_768 },
|
|
16
|
+
defaultChat: { modelContextWindowTokens: 128_000 }
|
|
17
|
+
},
|
|
18
|
+
claude: {
|
|
19
|
+
default: { modelContextWindowTokens: 200_000, modelMaxOutputTokens: 64_000 },
|
|
20
|
+
long: { modelContextWindowTokens: 1_000_000, modelMaxOutputTokens: 64_000 }
|
|
21
|
+
},
|
|
22
|
+
gemini: {
|
|
23
|
+
default: { modelContextWindowTokens: 128_000 },
|
|
24
|
+
pro15: { modelContextWindowTokens: 1_000_000 },
|
|
25
|
+
long: { modelContextWindowTokens: 1_048_576, modelMaxOutputTokens: 65_536 }
|
|
26
|
+
},
|
|
27
|
+
grok: {
|
|
28
|
+
default: { modelContextWindowTokens: 256_000, modelMaxOutputTokens: 30_000 },
|
|
29
|
+
grok4: { modelContextWindowTokens: 1_000_000, modelMaxOutputTokens: 30_000 },
|
|
30
|
+
grok420: { modelContextWindowTokens: 2_000_000, modelMaxOutputTokens: 30_000 }
|
|
31
|
+
},
|
|
32
|
+
qwen: {
|
|
33
|
+
default: { modelContextWindowTokens: 128_000, modelMaxOutputTokens: 32_000 },
|
|
34
|
+
coder: { modelContextWindowTokens: 262_144, modelMaxOutputTokens: 32_000 },
|
|
35
|
+
max: { modelContextWindowTokens: 262_144, modelMaxOutputTokens: 65_536 },
|
|
36
|
+
plus: { modelContextWindowTokens: 1_000_000, modelMaxOutputTokens: 32_000 }
|
|
37
|
+
},
|
|
38
|
+
kimi: {
|
|
39
|
+
default: { modelContextWindowTokens: 256_000, modelMaxOutputTokens: 32_000 },
|
|
40
|
+
k8: { modelContextWindowTokens: 8_192, modelMaxOutputTokens: 32_000 },
|
|
41
|
+
k32: { modelContextWindowTokens: 32_768, modelMaxOutputTokens: 32_000 },
|
|
42
|
+
k128: { modelContextWindowTokens: 131_072, modelMaxOutputTokens: 32_000 },
|
|
43
|
+
k25: { modelContextWindowTokens: 256_000, modelMaxOutputTokens: 262_144 }
|
|
44
|
+
},
|
|
45
|
+
deepseek: {
|
|
46
|
+
default: { modelContextWindowTokens: 64_000, modelMaxOutputTokens: 32_000 },
|
|
47
|
+
// DeepSeek V4 (Flash and Pro) serve a 1M-token context window; Flash
|
|
48
|
+
// supports up to 384K output tokens (requests are still clamped by
|
|
49
|
+
// DEFAULT_REQUEST_OUTPUT_CAP_TOKENS).
|
|
50
|
+
v4: { modelContextWindowTokens: 1_000_000, modelMaxOutputTokens: 384_000 }
|
|
51
|
+
},
|
|
52
|
+
glm: {
|
|
53
|
+
default: { modelContextWindowTokens: 128_000 }
|
|
54
|
+
},
|
|
55
|
+
minimax: {
|
|
56
|
+
default: { modelContextWindowTokens: 128_000, modelMaxOutputTokens: 32_000 },
|
|
57
|
+
m2: { modelContextWindowTokens: 200_000, modelMaxOutputTokens: 32_000 }
|
|
58
|
+
},
|
|
59
|
+
mistral: {
|
|
60
|
+
default: { modelContextWindowTokens: 128_000 },
|
|
61
|
+
mixtral8x7b: { modelContextWindowTokens: 32_768, modelMaxOutputTokens: 16_384 },
|
|
62
|
+
mixtral8x22b: { modelContextWindowTokens: 65_536, modelMaxOutputTokens: 13_108 }
|
|
63
|
+
},
|
|
64
|
+
llama: {
|
|
65
|
+
default: { modelContextWindowTokens: 128_000 }
|
|
66
|
+
},
|
|
67
|
+
cohere: {
|
|
68
|
+
default: { modelContextWindowTokens: 128_000 },
|
|
69
|
+
commandA: { modelContextWindowTokens: 256_000 }
|
|
70
|
+
},
|
|
71
|
+
nemotron: {
|
|
72
|
+
default: { modelContextWindowTokens: 128_000, modelMaxOutputTokens: 32_000 },
|
|
73
|
+
ultra550b: { modelContextWindowTokens: 1_000_000, modelMaxOutputTokens: 65_536 }
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
const HIGH_CONTEXT_THRESHOLD_TOKENS = 100_000;
|
|
77
|
+
const DEFAULT_GLOBAL_CONTEXT_BUDGET_CHARS = 20_000;
|
|
78
|
+
const HIGH_CONTEXT_GLOBAL_BUDGET_CHARS = 120_000;
|
|
79
|
+
const HIGH_CONTEXT_LOW_REASONING_GLOBAL_BUDGET_CHARS = 80_000;
|
|
80
|
+
const OPENAI_REASONING_GLOBAL_BUDGET_CHARS = 80_000;
|
|
81
|
+
const OPENAI_REASONING_LOW_GLOBAL_BUDGET_CHARS = 48_000;
|
|
82
|
+
const DEFAULT_FILE_TRUNCATION_CHARS = 4_000;
|
|
83
|
+
const HIGH_CONTEXT_FILE_TRUNCATION_CHARS = 12_000;
|
|
84
|
+
const HIGH_CONTEXT_LOW_REASONING_FILE_TRUNCATION_CHARS = 8_000;
|
|
85
|
+
const OPENAI_REASONING_FILE_TRUNCATION_CHARS = 8_000;
|
|
86
|
+
const OPENAI_REASONING_LOW_FILE_TRUNCATION_CHARS = 6_000;
|
|
87
|
+
const WIDELY_SUPPORTED_EFFORTS = ['low', 'medium', 'high'];
|
|
88
|
+
// OpenAI request tuning: reasoning-effort availability and request-shape gates.
|
|
89
|
+
const OPENAI_EFFORTS = ['none', 'minimal', ...WIDELY_SUPPORTED_EFFORTS, 'xhigh'];
|
|
90
|
+
const OPENAI_GPT5_1_EFFORTS = ['none', ...WIDELY_SUPPORTED_EFFORTS];
|
|
91
|
+
const OPENAI_GPT5_2_PLUS_EFFORTS = [...OPENAI_GPT5_1_EFFORTS, 'xhigh'];
|
|
92
|
+
const OPENAI_GPT5_6_PLUS_EFFORTS = [...OPENAI_GPT5_2_PLUS_EFFORTS, 'max'];
|
|
93
|
+
const ANTHROPIC_FABLE_5_EFFORTS = ['low', 'medium', 'high', 'xhigh', 'max'];
|
|
94
|
+
const OPENAI_GPT5_PRO_EFFORTS = ['high'];
|
|
95
|
+
const OPENAI_GPT5_PRO_2_PLUS_EFFORTS = ['medium', 'high', 'xhigh'];
|
|
96
|
+
const OPENAI_GPT5_CHAT_EFFORTS = ['medium'];
|
|
97
|
+
const OPENAI_GPT5_CODEX_XHIGH_EFFORTS = [...WIDELY_SUPPORTED_EFFORTS, 'xhigh'];
|
|
98
|
+
const OPENAI_GPT5_CODEX_3_PLUS_EFFORTS = ['none', ...OPENAI_GPT5_CODEX_XHIGH_EFFORTS];
|
|
99
|
+
const OPENAI_NONE_EFFORT_RELEASE_DATE = '2025-11-13';
|
|
100
|
+
const OPENAI_XHIGH_EFFORT_RELEASE_DATE = '2025-12-04';
|
|
101
|
+
const GPT5_FAMILY_RE = /(?:^|\/)gpt-5(?:[.-]|$)/;
|
|
102
|
+
const GPT5_VERSION_RE = /(?:^|\/)gpt-5[.-](\d+)(?:[.-]|$)/;
|
|
103
|
+
const GPT5_PRO_RE = /(?:^|\/)gpt-5[.-]?pro(?:[.-]|$)/;
|
|
104
|
+
const GPT5_VERSIONED_PRO_RE = /(?:^|\/)gpt-5[.-]\d+[.-]pro(?:[.-]|$)/;
|
|
105
|
+
export function getCleanSlateOutputTokenBudget(reasoningLevel, configuredMaxOutputTokens) {
|
|
106
|
+
void reasoningLevel;
|
|
107
|
+
const configured = Number.isFinite(configuredMaxOutputTokens) && configuredMaxOutputTokens > 0
|
|
108
|
+
? Math.floor(configuredMaxOutputTokens)
|
|
109
|
+
: undefined;
|
|
110
|
+
if (configured === undefined) {
|
|
111
|
+
return DEFAULT_REQUEST_OUTPUT_CAP_TOKENS;
|
|
112
|
+
}
|
|
113
|
+
return configured;
|
|
114
|
+
}
|
|
115
|
+
export function resolveCleanSlateModelCapabilities(request) {
|
|
116
|
+
const effectiveRequest = request.modelReleaseDate || !request.modelsDevMetadata?.releaseDate
|
|
117
|
+
? request
|
|
118
|
+
: { ...request, modelReleaseDate: request.modelsDevMetadata.releaseDate };
|
|
119
|
+
const family = resolveCleanSlateModelFamily(effectiveRequest.provider, effectiveRequest.model);
|
|
120
|
+
const openAICompatibleThirdParty = isOpenAICompatibleThirdPartyFamily(family);
|
|
121
|
+
const modelLimits = inferModelLimitProfile(family, effectiveRequest.model, effectiveRequest.modelsDevMetadata);
|
|
122
|
+
const modelMaxOutputTokens = modelLimits.modelMaxOutputTokens ?? DEFAULT_MODEL_OUTPUT_TOKENS;
|
|
123
|
+
const modelTuning = resolveCleanSlateProviderTuning(effectiveRequest, family);
|
|
124
|
+
if (effectiveRequest.modelsDevMetadata?.reasoningEfforts?.length) {
|
|
125
|
+
modelTuning.supportedReasoningEfforts = [...effectiveRequest.modelsDevMetadata.reasoningEfforts];
|
|
126
|
+
}
|
|
127
|
+
if (effectiveRequest.modelsDevMetadata?.temperature === false) {
|
|
128
|
+
modelTuning.temperature = undefined;
|
|
129
|
+
modelTuning.topP = undefined;
|
|
130
|
+
}
|
|
131
|
+
const maxOutputTokens = resolveCleanSlateMaxOutputTokens(effectiveRequest, family);
|
|
132
|
+
const useMaxCompletionTokens = modelTuning.useMaxCompletionTokens ?? (family === 'openai-reasoning' && isOpenAICompatibleEndpoint(request.provider, request.flavor));
|
|
133
|
+
const azureOpenAIModelEndpoint = isAzureOpenAIModelEndpoint(request.provider, request.flavor, family);
|
|
134
|
+
const normalizedContextLimits = normalizeContextLimits(modelLimits, modelMaxOutputTokens);
|
|
135
|
+
return {
|
|
136
|
+
provider: request.provider,
|
|
137
|
+
model: request.model,
|
|
138
|
+
flavor: request.flavor,
|
|
139
|
+
family,
|
|
140
|
+
nativeToolCalls: effectiveRequest.modelsDevMetadata?.toolCall ?? supportsNativeToolCalls(effectiveRequest.provider, family),
|
|
141
|
+
openAICompatibleThirdParty,
|
|
142
|
+
useMaxCompletionTokens,
|
|
143
|
+
useResponsesApi: modelTuning.useResponsesApi,
|
|
144
|
+
includeSamplingParameters: shouldIncludeSamplingParameters(request.flavor, useMaxCompletionTokens),
|
|
145
|
+
temperature: modelTuning.temperature,
|
|
146
|
+
topP: modelTuning.topP,
|
|
147
|
+
topK: modelTuning.topK,
|
|
148
|
+
reasoningEffort: useMaxCompletionTokens
|
|
149
|
+
? (modelTuning.reasoningEffort ?? (modelTuning.suppressDefaultReasoningEffort ? undefined : resolveReasoningEffort(getRequestReasoningLevel(request), azureOpenAIModelEndpoint)))
|
|
150
|
+
: modelTuning.reasoningEffort,
|
|
151
|
+
supportedReasoningEfforts: modelTuning.supportedReasoningEfforts,
|
|
152
|
+
reasoningSummary: modelTuning.reasoningSummary,
|
|
153
|
+
parallelToolCalls: azureOpenAIModelEndpoint ? true : undefined,
|
|
154
|
+
store: modelTuning.store,
|
|
155
|
+
promptCacheKey: modelTuning.promptCacheKey,
|
|
156
|
+
include: modelTuning.include,
|
|
157
|
+
bodyOptions: modelTuning.bodyOptions,
|
|
158
|
+
thinkingConfig: modelTuning.thinkingConfig,
|
|
159
|
+
thinking: modelTuning.thinking,
|
|
160
|
+
additionalModelRequestFields: modelTuning.additionalModelRequestFields,
|
|
161
|
+
suppressReasoningContent: modelTuning.suppressReasoningContent,
|
|
162
|
+
maxOutputTokens,
|
|
163
|
+
contextWindowTokens: normalizedContextLimits.effectiveContextWindowTokens,
|
|
164
|
+
modelContextWindowTokens: normalizedContextLimits.modelContextWindowTokens,
|
|
165
|
+
modelMaxOutputTokens,
|
|
166
|
+
maxInputTokens: normalizedContextLimits.maxInputTokens,
|
|
167
|
+
autoCompactReserveTokens: normalizedContextLimits.autoCompactReserveTokens
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
export function resolveCleanSlateReasoningLevelOptions(request) {
|
|
171
|
+
const family = resolveCleanSlateModelFamily(request.provider, request.model);
|
|
172
|
+
const modelId = normalizeModelId(request.model);
|
|
173
|
+
const nativeLevels = resolveCleanSlateNativeReasoningLevels(request, family, modelId);
|
|
174
|
+
const modelLabel = request.model?.trim() || 'Selected model';
|
|
175
|
+
return CLEANSLATE_REASONING_LEVELS.map(level => {
|
|
176
|
+
const native = nativeLevels.has(level);
|
|
177
|
+
const enabled = native || (level === 'none' && !isCleanSlateGpt5Pro(modelId));
|
|
178
|
+
return {
|
|
179
|
+
level,
|
|
180
|
+
enabled,
|
|
181
|
+
native,
|
|
182
|
+
disabledReason: enabled
|
|
183
|
+
? undefined
|
|
184
|
+
: `${modelLabel} does not support ${level} reasoning.`
|
|
185
|
+
};
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
export function resolveCleanSlateEffectiveReasoningLevel(request) {
|
|
189
|
+
const requested = getRequestReasoningLevel(request);
|
|
190
|
+
const options = resolveCleanSlateReasoningLevelOptions({
|
|
191
|
+
provider: request.provider,
|
|
192
|
+
model: request.model,
|
|
193
|
+
flavor: request.flavor,
|
|
194
|
+
modelReleaseDate: request.modelReleaseDate
|
|
195
|
+
});
|
|
196
|
+
if (options.some(option => option.level === requested && option.enabled)) {
|
|
197
|
+
return requested;
|
|
198
|
+
}
|
|
199
|
+
return options.find(option => option.enabled)?.level ?? 'low';
|
|
200
|
+
}
|
|
201
|
+
export function getCleanSlateContextDefaults(request) {
|
|
202
|
+
const capabilities = resolveCleanSlateModelCapabilities(request);
|
|
203
|
+
const inferredContextWindowTokens = capabilities.contextWindowTokens ?? DEFAULT_CONTEXT_WINDOW_TOKENS;
|
|
204
|
+
const configuredContextWindowTokens = normalizePositiveInteger(request.configuredContextWindowTokens, MIN_CONTEXT_WINDOW_TOKENS);
|
|
205
|
+
const contextWindowTokens = configuredContextWindowTokens ?? inferredContextWindowTokens;
|
|
206
|
+
const modelContextWindowTokens = capabilities.modelContextWindowTokens ?? Math.max(contextWindowTokens, DEFAULT_CONTEXT_WINDOW_TOKENS);
|
|
207
|
+
const modelMaxOutputTokens = capabilities.modelMaxOutputTokens ?? DEFAULT_REQUEST_OUTPUT_CAP_TOKENS;
|
|
208
|
+
const maxInputTokens = configuredContextWindowTokens ?? capabilities.maxInputTokens ?? Math.max(contextWindowTokens, DEFAULT_CONTEXT_WINDOW_TOKENS);
|
|
209
|
+
const autoCompactReserveTokens = configuredContextWindowTokens !== undefined
|
|
210
|
+
? 0
|
|
211
|
+
: capabilities.autoCompactReserveTokens ?? resolveInputReserveTokens(modelMaxOutputTokens);
|
|
212
|
+
const highContext = contextWindowTokens >= HIGH_CONTEXT_THRESHOLD_TOKENS;
|
|
213
|
+
const azureOpenAIReasoning = capabilities.family === 'openai-reasoning' && isAzureOpenAIModelEndpoint(request.provider, request.flavor, capabilities.family);
|
|
214
|
+
const requestReasoningLevel = getRequestReasoningLevel(request);
|
|
215
|
+
const lowReasoning = requestReasoningLevel === 'none' || requestReasoningLevel === 'minimal' || requestReasoningLevel === 'low';
|
|
216
|
+
const defaultGlobalBudget = highContext
|
|
217
|
+
? azureOpenAIReasoning
|
|
218
|
+
? (lowReasoning ? OPENAI_REASONING_LOW_GLOBAL_BUDGET_CHARS : OPENAI_REASONING_GLOBAL_BUDGET_CHARS)
|
|
219
|
+
: (lowReasoning ? HIGH_CONTEXT_LOW_REASONING_GLOBAL_BUDGET_CHARS : HIGH_CONTEXT_GLOBAL_BUDGET_CHARS)
|
|
220
|
+
: DEFAULT_GLOBAL_CONTEXT_BUDGET_CHARS;
|
|
221
|
+
const defaultFileTruncation = highContext
|
|
222
|
+
? azureOpenAIReasoning
|
|
223
|
+
? (lowReasoning ? OPENAI_REASONING_LOW_FILE_TRUNCATION_CHARS : OPENAI_REASONING_FILE_TRUNCATION_CHARS)
|
|
224
|
+
: (lowReasoning ? HIGH_CONTEXT_LOW_REASONING_FILE_TRUNCATION_CHARS : HIGH_CONTEXT_FILE_TRUNCATION_CHARS)
|
|
225
|
+
: DEFAULT_FILE_TRUNCATION_CHARS;
|
|
226
|
+
return {
|
|
227
|
+
contextWindowTokens,
|
|
228
|
+
modelContextWindowTokens,
|
|
229
|
+
modelMaxOutputTokens,
|
|
230
|
+
maxInputTokens,
|
|
231
|
+
autoCompactReserveTokens,
|
|
232
|
+
globalContextBudgetChars: normalizePositiveInteger(request.configuredGlobalContextBudgetChars, 2000)
|
|
233
|
+
?? Math.min(contextWindowTokens * 4, defaultGlobalBudget),
|
|
234
|
+
fileTruncationChars: normalizePositiveInteger(request.configuredFileTruncationChars, 500)
|
|
235
|
+
?? defaultFileTruncation
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
export function resolveCleanSlateModelFamily(provider, model) {
|
|
239
|
+
const normalized = normalizeModelId(model);
|
|
240
|
+
if (provider === 'anthropic' || normalized.includes('claude')) {
|
|
241
|
+
return 'claude';
|
|
242
|
+
}
|
|
243
|
+
if (provider === 'gemini' || normalized.includes('gemini')) {
|
|
244
|
+
return 'gemini';
|
|
245
|
+
}
|
|
246
|
+
if (normalized.includes('gemma')) {
|
|
247
|
+
// Gemma models (e.g. google/gemma-4-3b-it) are served on NVIDIA NIM and
|
|
248
|
+
// other openai-compatible endpoints. They support OpenAI-compatible tool
|
|
249
|
+
// calling and must not fall through to 'unknown'.
|
|
250
|
+
return 'gemma';
|
|
251
|
+
}
|
|
252
|
+
if (provider === 'bedrock') {
|
|
253
|
+
return 'bedrock';
|
|
254
|
+
}
|
|
255
|
+
if (normalized.includes('grok')) {
|
|
256
|
+
return 'grok';
|
|
257
|
+
}
|
|
258
|
+
if (normalized.includes('kimi') || normalized.includes('moonshot')) {
|
|
259
|
+
return 'kimi';
|
|
260
|
+
}
|
|
261
|
+
if (normalized.includes('deepseek')) {
|
|
262
|
+
return 'deepseek';
|
|
263
|
+
}
|
|
264
|
+
if (normalized.includes('qwen')) {
|
|
265
|
+
return 'qwen';
|
|
266
|
+
}
|
|
267
|
+
if (normalized.includes('glm')) {
|
|
268
|
+
return 'glm';
|
|
269
|
+
}
|
|
270
|
+
if (normalized.includes('minimax')) {
|
|
271
|
+
return 'minimax';
|
|
272
|
+
}
|
|
273
|
+
if (normalized.includes('mistral') || normalized.includes('mixtral')) {
|
|
274
|
+
return 'mistral';
|
|
275
|
+
}
|
|
276
|
+
if (normalized.includes('llama')) {
|
|
277
|
+
return 'llama';
|
|
278
|
+
}
|
|
279
|
+
if (normalized.includes('cohere') || normalized.includes('command-r')) {
|
|
280
|
+
return 'cohere';
|
|
281
|
+
}
|
|
282
|
+
if (normalized.includes('nemotron')) {
|
|
283
|
+
return 'nemotron';
|
|
284
|
+
}
|
|
285
|
+
if (isOpenAIReasoningModel(normalized)) {
|
|
286
|
+
return 'openai-reasoning';
|
|
287
|
+
}
|
|
288
|
+
if (normalized.includes('gpt-oss')) {
|
|
289
|
+
// gpt-oss is frequently hosted behind OpenAI-compatible routes (NVIDIA,
|
|
290
|
+
// OpenRouter, Azure Foundry, local/custom proxies) and can expose hidden
|
|
291
|
+
// reasoning in provider-specific delta fields. Treat it as a reasoning
|
|
292
|
+
// model wherever CleanSlate uses the compatible chat bridge.
|
|
293
|
+
return provider === 'openai' ? 'openai-chat' : 'openai-reasoning';
|
|
294
|
+
}
|
|
295
|
+
if ((provider === 'nvidia' || provider === 'openrouter' || provider === 'custom') && normalized.length > 0) {
|
|
296
|
+
// OpenAI-compatible providers expose chat/tool APIs for many models whose
|
|
297
|
+
// names do not carry a known family marker. Treat those as generic
|
|
298
|
+
// OpenAI-compatible chat models instead of degrading agentic tool execution.
|
|
299
|
+
return 'openai-compatible-chat';
|
|
300
|
+
}
|
|
301
|
+
if (provider === 'openai' || provider === 'azureOpenAI') {
|
|
302
|
+
return 'openai-chat';
|
|
303
|
+
}
|
|
304
|
+
return 'unknown';
|
|
305
|
+
}
|
|
306
|
+
function normalizeModelId(model) {
|
|
307
|
+
return (model ?? '').trim().toLowerCase();
|
|
308
|
+
}
|
|
309
|
+
function getRequestReasoningLevel(request) {
|
|
310
|
+
if (isCleanSlateReasoningLevel(request.reasoningLevel)) {
|
|
311
|
+
return request.reasoningLevel;
|
|
312
|
+
}
|
|
313
|
+
return 'low';
|
|
314
|
+
}
|
|
315
|
+
function isOpenAIReasoningModel(normalizedModel) {
|
|
316
|
+
if (!normalizedModel) {
|
|
317
|
+
return false;
|
|
318
|
+
}
|
|
319
|
+
return normalizedModel.includes('gpt-5')
|
|
320
|
+
|| /(?:^|[^0-9])5\.[1-9](?:[^0-9]|$)/.test(normalizedModel)
|
|
321
|
+
|| /(?:^|[^a-z0-9])o[134](?:[^a-z0-9]|$)/.test(normalizedModel);
|
|
322
|
+
}
|
|
323
|
+
function isOpenAICompatibleThirdPartyFamily(family) {
|
|
324
|
+
return family === 'grok'
|
|
325
|
+
|| family === 'openai-compatible-chat'
|
|
326
|
+
|| family === 'kimi'
|
|
327
|
+
|| family === 'deepseek'
|
|
328
|
+
|| family === 'qwen'
|
|
329
|
+
|| family === 'glm'
|
|
330
|
+
|| family === 'minimax'
|
|
331
|
+
|| family === 'mistral'
|
|
332
|
+
|| family === 'llama'
|
|
333
|
+
|| family === 'cohere'
|
|
334
|
+
|| family === 'nemotron'
|
|
335
|
+
|| family === 'gemma';
|
|
336
|
+
}
|
|
337
|
+
function isOpenAICompatibleFlavor(flavor) {
|
|
338
|
+
return flavor === 'openai'
|
|
339
|
+
|| flavor === 'xai'
|
|
340
|
+
|| flavor === 'nvidia'
|
|
341
|
+
|| flavor === 'openrouter'
|
|
342
|
+
|| flavor === 'custom'
|
|
343
|
+
|| flavor === 'azureOpenAI'
|
|
344
|
+
|| flavor === 'azureFoundry';
|
|
345
|
+
}
|
|
346
|
+
function isOpenAICompatibleEndpoint(provider, flavor) {
|
|
347
|
+
return provider === 'openai'
|
|
348
|
+
|| provider === 'azureOpenAI'
|
|
349
|
+
|| provider === 'nvidia'
|
|
350
|
+
|| provider === 'openrouter'
|
|
351
|
+
|| provider === 'custom'
|
|
352
|
+
|| isOpenAICompatibleFlavor(flavor);
|
|
353
|
+
}
|
|
354
|
+
function isAzureOpenAIModelEndpoint(provider, flavor, family) {
|
|
355
|
+
return (provider === 'azureOpenAI' || flavor === 'azureOpenAI' || flavor === 'azureFoundry')
|
|
356
|
+
&& (family === 'openai-reasoning' || family === 'openai-chat');
|
|
357
|
+
}
|
|
358
|
+
function shouldIncludeSamplingParameters(flavor, useMaxCompletionTokens) {
|
|
359
|
+
if (useMaxCompletionTokens) {
|
|
360
|
+
return false;
|
|
361
|
+
}
|
|
362
|
+
// Azure AI Foundry hosts both OpenAI and non-OpenAI models behind an OpenAI-compatible
|
|
363
|
+
// endpoint. Several third-party deployments reject or ignore OpenAI sampling defaults.
|
|
364
|
+
return flavor !== 'azureFoundry';
|
|
365
|
+
}
|
|
366
|
+
function resolveCleanSlateProviderTuning(request, family) {
|
|
367
|
+
const modelId = normalizeModelId(request.model);
|
|
368
|
+
const providerID = toCleanSlateProviderID(request.provider, request.flavor);
|
|
369
|
+
const providerAdapter = toCleanSlateProviderAdapter(request.provider, request.flavor);
|
|
370
|
+
const outputLimit = inferOutputTokenLimit(family, request.model);
|
|
371
|
+
const reasoningLevel = getRequestReasoningLevel(request);
|
|
372
|
+
const result = {
|
|
373
|
+
temperature: resolveCleanSlateTemperature(modelId),
|
|
374
|
+
topP: resolveCleanSlateTopP(modelId),
|
|
375
|
+
topK: resolveCleanSlateTopK(modelId)
|
|
376
|
+
};
|
|
377
|
+
if (providerID === 'openai' || providerAdapter === 'openai') {
|
|
378
|
+
result.store = false;
|
|
379
|
+
}
|
|
380
|
+
if (providerID === 'cleanslate' && request.sessionId) {
|
|
381
|
+
result.promptCacheKey = request.sessionId;
|
|
382
|
+
}
|
|
383
|
+
if (providerAdapter === 'azure') {
|
|
384
|
+
result.store = false;
|
|
385
|
+
if (request.sessionId) {
|
|
386
|
+
result.promptCacheKey = request.sessionId;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
if (providerID === 'openai' && request.sessionId) {
|
|
390
|
+
result.promptCacheKey = request.sessionId;
|
|
391
|
+
}
|
|
392
|
+
if (providerAdapter === 'google') {
|
|
393
|
+
result.thinkingConfig = resolveCleanSlateGeminiThinkingConfig(request, family, modelId);
|
|
394
|
+
}
|
|
395
|
+
if (providerAdapter === 'anthropic' && (modelId.includes('k2p') || modelId.includes('kimi-k2.') || modelId.includes('kimi-k2p'))) {
|
|
396
|
+
result.thinking = {
|
|
397
|
+
type: 'enabled',
|
|
398
|
+
budgetTokens: Math.max(1024, Math.min(16_000, Math.floor(outputLimit / 2 - 1)))
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
if (providerAdapter === 'anthropic' && family === 'claude' && reasoningLevel === 'high' && hasCleanSlateNativeReasoningCapability(family, modelId)) {
|
|
402
|
+
result.thinking = resolveCleanSlateAnthropicThinkingConfig(modelId, outputLimit);
|
|
403
|
+
}
|
|
404
|
+
if (providerAdapter === 'anthropic' && modelId.includes('claude-fable-5')) {
|
|
405
|
+
result.supportedReasoningEfforts = [...ANTHROPIC_FABLE_5_EFFORTS];
|
|
406
|
+
}
|
|
407
|
+
if (providerID.includes('zai') || providerID.includes('zhipuai')) {
|
|
408
|
+
result.bodyOptions = {
|
|
409
|
+
...(result.bodyOptions ?? {}),
|
|
410
|
+
thinking: {
|
|
411
|
+
type: 'enabled',
|
|
412
|
+
clear_thinking: false
|
|
413
|
+
}
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
if (providerID === 'alibaba-cn' && hasCleanSlateNativeReasoningCapability(family, modelId) && !modelId.includes('kimi-k2-thinking')) {
|
|
417
|
+
result.bodyOptions = {
|
|
418
|
+
...(result.bodyOptions ?? {}),
|
|
419
|
+
enable_thinking: true
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
if (isCleanSlateGpt5Family(modelId)) {
|
|
423
|
+
const supportedEfforts = providerAdapter === 'openai-compatible'
|
|
424
|
+
? resolveCleanSlateOpenAICompatibleReasoningEfforts(modelId)
|
|
425
|
+
: resolveCleanSlateGpt5ReasoningEfforts(modelId, request.modelReleaseDate);
|
|
426
|
+
result.supportedReasoningEfforts = supportedEfforts;
|
|
427
|
+
result.useMaxCompletionTokens = true;
|
|
428
|
+
result.reasoningEffort = resolveCleanSlateGpt5ReasoningEffort(reasoningLevel, modelId, supportedEfforts);
|
|
429
|
+
result.suppressDefaultReasoningEffort = supportedEfforts.length === 0 || !result.reasoningEffort;
|
|
430
|
+
result.useResponsesApi = shouldUseResponsesApiForProvider(providerID, providerAdapter, modelId);
|
|
431
|
+
if (shouldUseOpenAIPriorityProcessing(providerID, modelId)) {
|
|
432
|
+
result.bodyOptions = {
|
|
433
|
+
...(result.bodyOptions ?? {}),
|
|
434
|
+
service_tier: 'priority'
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
// Request streamed reasoning summaries wherever the Responses API is used
|
|
438
|
+
// against a first-party OpenAI host — including Azure's v1/Foundry path,
|
|
439
|
+
// whose adapter is 'openai-compatible' but whose providerID is azure-foundry.
|
|
440
|
+
const isFirstPartyOpenAIHost = providerAdapter === 'openai' || providerAdapter === 'azure' || providerID === 'azure-foundry';
|
|
441
|
+
if (result.reasoningEffort && result.reasoningEffort !== 'none' && !isCleanSlateGpt5Pro(modelId) && isFirstPartyOpenAIHost && result.useResponsesApi) {
|
|
442
|
+
result.reasoningSummary = 'auto';
|
|
443
|
+
result.include = ['reasoning.encrypted_content'];
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
if (providerID === 'grok' && reasoningLevel !== 'none' && hasCleanSlateNativeReasoningCapability(family, modelId)) {
|
|
447
|
+
result.reasoningEffort = reasoningLevel;
|
|
448
|
+
}
|
|
449
|
+
if (providerAdapter === 'amazon-bedrock') {
|
|
450
|
+
const bedrockReasoning = resolveCleanSlateBedrockReasoningConfig(request, modelId, family, outputLimit);
|
|
451
|
+
if (bedrockReasoning) {
|
|
452
|
+
result.additionalModelRequestFields = bedrockReasoning;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
if (providerID === 'nvidia' || (family === 'openai-reasoning' && isOpenAICompatibleEndpoint(request.provider, request.flavor))) {
|
|
456
|
+
result.suppressReasoningContent = true;
|
|
457
|
+
}
|
|
458
|
+
return result;
|
|
459
|
+
}
|
|
460
|
+
function resolveCleanSlateMaxOutputTokens(request, family) {
|
|
461
|
+
const advertisedLimit = request.modelsDevMetadata?.maxOutputTokens
|
|
462
|
+
?? inferOutputTokenLimit(family, request.model)
|
|
463
|
+
?? DEFAULT_REQUEST_OUTPUT_CAP_TOKENS;
|
|
464
|
+
const managedOperationalLimit = request.provider === 'cleanslate'
|
|
465
|
+
&& normalizeModelId(request.model).includes('kimi-k2.6')
|
|
466
|
+
? 8_192
|
|
467
|
+
: DEFAULT_REQUEST_OUTPUT_CAP_TOKENS;
|
|
468
|
+
const modelLimit = Math.min(advertisedLimit, managedOperationalLimit, DEFAULT_REQUEST_OUTPUT_CAP_TOKENS);
|
|
469
|
+
const configured = Number.isFinite(request.configuredMaxOutputTokens) && request.configuredMaxOutputTokens > 0
|
|
470
|
+
? Math.floor(request.configuredMaxOutputTokens)
|
|
471
|
+
: undefined;
|
|
472
|
+
if (configured !== undefined) {
|
|
473
|
+
return Math.min(configured, modelLimit);
|
|
474
|
+
}
|
|
475
|
+
return modelLimit || DEFAULT_REQUEST_OUTPUT_CAP_TOKENS;
|
|
476
|
+
}
|
|
477
|
+
function toCleanSlateProviderID(provider, flavor) {
|
|
478
|
+
if (provider === 'openai') {
|
|
479
|
+
return 'openai';
|
|
480
|
+
}
|
|
481
|
+
if (provider === 'azureOpenAI') {
|
|
482
|
+
return flavor === 'azureFoundry' ? 'azure-foundry' : 'azure';
|
|
483
|
+
}
|
|
484
|
+
if (provider === 'grok') {
|
|
485
|
+
return 'grok';
|
|
486
|
+
}
|
|
487
|
+
if (provider === 'nvidia') {
|
|
488
|
+
return 'nvidia';
|
|
489
|
+
}
|
|
490
|
+
if (provider === 'openrouter') {
|
|
491
|
+
return 'openrouter';
|
|
492
|
+
}
|
|
493
|
+
if (provider === 'custom') {
|
|
494
|
+
return 'custom';
|
|
495
|
+
}
|
|
496
|
+
if (provider === 'anthropic') {
|
|
497
|
+
return 'anthropic';
|
|
498
|
+
}
|
|
499
|
+
if (provider === 'gemini') {
|
|
500
|
+
return 'google';
|
|
501
|
+
}
|
|
502
|
+
if (provider === 'bedrock') {
|
|
503
|
+
return 'amazon-bedrock';
|
|
504
|
+
}
|
|
505
|
+
return provider;
|
|
506
|
+
}
|
|
507
|
+
function toCleanSlateProviderAdapter(provider, flavor) {
|
|
508
|
+
if (provider === 'openai') {
|
|
509
|
+
return 'openai';
|
|
510
|
+
}
|
|
511
|
+
if (provider === 'azureOpenAI') {
|
|
512
|
+
return flavor === 'azureFoundry' ? 'openai-compatible' : 'azure';
|
|
513
|
+
}
|
|
514
|
+
if (provider === 'grok') {
|
|
515
|
+
return 'xai';
|
|
516
|
+
}
|
|
517
|
+
if (provider === 'nvidia') {
|
|
518
|
+
return 'openai-compatible';
|
|
519
|
+
}
|
|
520
|
+
if (provider === 'openrouter' || provider === 'custom') {
|
|
521
|
+
return 'openai-compatible';
|
|
522
|
+
}
|
|
523
|
+
if (provider === 'anthropic') {
|
|
524
|
+
return 'anthropic';
|
|
525
|
+
}
|
|
526
|
+
if (provider === 'gemini') {
|
|
527
|
+
return 'google';
|
|
528
|
+
}
|
|
529
|
+
if (provider === 'bedrock') {
|
|
530
|
+
return 'amazon-bedrock';
|
|
531
|
+
}
|
|
532
|
+
return 'openai-compatible';
|
|
533
|
+
}
|
|
534
|
+
function resolveCleanSlateTemperature(id) {
|
|
535
|
+
if (id.includes('qwen')) {
|
|
536
|
+
return 0.55;
|
|
537
|
+
}
|
|
538
|
+
if (id.includes('claude')) {
|
|
539
|
+
return undefined;
|
|
540
|
+
}
|
|
541
|
+
if (id.includes('gemini')) {
|
|
542
|
+
return 1.0;
|
|
543
|
+
}
|
|
544
|
+
if (id.includes('glm-4.6') || id.includes('glm-4.7')) {
|
|
545
|
+
return 1.0;
|
|
546
|
+
}
|
|
547
|
+
if (id.includes('minimax-m2')) {
|
|
548
|
+
return 1.0;
|
|
549
|
+
}
|
|
550
|
+
if (id.includes('kimi-k2')) {
|
|
551
|
+
if (['thinking', 'k2.', 'k2p', 'k2-5'].some(value => id.includes(value))) {
|
|
552
|
+
return 1.0;
|
|
553
|
+
}
|
|
554
|
+
return 0.6;
|
|
555
|
+
}
|
|
556
|
+
return undefined;
|
|
557
|
+
}
|
|
558
|
+
function resolveCleanSlateTopP(id) {
|
|
559
|
+
if (id.includes('qwen')) {
|
|
560
|
+
return 1;
|
|
561
|
+
}
|
|
562
|
+
if (['minimax-m2', 'gemini', 'kimi-k2.5', 'kimi-k2p5', 'kimi-k2-5'].some(value => id.includes(value))) {
|
|
563
|
+
return 0.95;
|
|
564
|
+
}
|
|
565
|
+
return undefined;
|
|
566
|
+
}
|
|
567
|
+
function resolveCleanSlateTopK(id) {
|
|
568
|
+
if (id.includes('minimax-m2')) {
|
|
569
|
+
return ['m2.', 'm25', 'm21'].some(value => id.includes(value)) ? 40 : 20;
|
|
570
|
+
}
|
|
571
|
+
if (id.includes('gemini')) {
|
|
572
|
+
return 64;
|
|
573
|
+
}
|
|
574
|
+
return undefined;
|
|
575
|
+
}
|
|
576
|
+
function resolveCleanSlateGpt5ReasoningEffort(reasoningLevel, modelId, supportedEfforts) {
|
|
577
|
+
if (!supportedEfforts.length) {
|
|
578
|
+
return undefined;
|
|
579
|
+
}
|
|
580
|
+
if (supportedEfforts.includes(reasoningLevel)) {
|
|
581
|
+
return reasoningLevel;
|
|
582
|
+
}
|
|
583
|
+
if (isCleanSlateGpt5Pro(modelId) && (reasoningLevel === 'none' || reasoningLevel === 'low')) {
|
|
584
|
+
return supportedEfforts[0];
|
|
585
|
+
}
|
|
586
|
+
if (reasoningLevel === 'low') {
|
|
587
|
+
return supportedEfforts.includes('minimal')
|
|
588
|
+
? 'minimal'
|
|
589
|
+
: supportedEfforts.includes('none')
|
|
590
|
+
? 'none'
|
|
591
|
+
: undefined;
|
|
592
|
+
}
|
|
593
|
+
return undefined;
|
|
594
|
+
}
|
|
595
|
+
function resolveCleanSlateNativeReasoningLevels(request, family, modelId) {
|
|
596
|
+
const levels = new Set();
|
|
597
|
+
const providerID = toCleanSlateProviderID(request.provider, request.flavor);
|
|
598
|
+
const providerAdapter = toCleanSlateProviderAdapter(request.provider, request.flavor);
|
|
599
|
+
if (isCleanSlateGpt5Family(modelId)) {
|
|
600
|
+
const supportedEfforts = providerAdapter === 'openai-compatible'
|
|
601
|
+
? resolveCleanSlateOpenAICompatibleReasoningEfforts(modelId)
|
|
602
|
+
: resolveCleanSlateGpt5ReasoningEfforts(modelId, request.modelReleaseDate);
|
|
603
|
+
for (const level of CLEANSLATE_REASONING_LEVELS) {
|
|
604
|
+
if (supportedEfforts.includes(level)) {
|
|
605
|
+
levels.add(level);
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
return levels;
|
|
609
|
+
}
|
|
610
|
+
if (family === 'openai-reasoning' && isOpenAICompatibleEndpoint(request.provider, request.flavor)) {
|
|
611
|
+
for (const level of ['none', ...WIDELY_SUPPORTED_EFFORTS]) {
|
|
612
|
+
levels.add(level);
|
|
613
|
+
}
|
|
614
|
+
return levels;
|
|
615
|
+
}
|
|
616
|
+
if (providerAdapter === 'google' && hasCleanSlateNativeReasoningCapability(family, modelId)) {
|
|
617
|
+
const googleLevels = googleThinkingLevelEfforts(modelId);
|
|
618
|
+
if (modelId.includes('2.5')) {
|
|
619
|
+
for (const level of ['none', 'low', 'medium', 'high']) {
|
|
620
|
+
levels.add(level);
|
|
621
|
+
}
|
|
622
|
+
return levels;
|
|
623
|
+
}
|
|
624
|
+
for (const level of CLEANSLATE_REASONING_LEVELS) {
|
|
625
|
+
if (googleLevels.includes(level)) {
|
|
626
|
+
levels.add(level);
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
return levels;
|
|
630
|
+
}
|
|
631
|
+
if (providerAdapter === 'anthropic' && family === 'claude' && hasCleanSlateNativeReasoningCapability(family, modelId)) {
|
|
632
|
+
levels.add('high');
|
|
633
|
+
return levels;
|
|
634
|
+
}
|
|
635
|
+
if (providerID === 'grok' && hasCleanSlateNativeReasoningCapability(family, modelId)) {
|
|
636
|
+
levels.add('low');
|
|
637
|
+
levels.add('medium');
|
|
638
|
+
levels.add('high');
|
|
639
|
+
return levels;
|
|
640
|
+
}
|
|
641
|
+
if (providerAdapter === 'amazon-bedrock' && hasCleanSlateNativeReasoningCapability(family, modelId)) {
|
|
642
|
+
levels.add('low');
|
|
643
|
+
levels.add('high');
|
|
644
|
+
return levels;
|
|
645
|
+
}
|
|
646
|
+
return levels;
|
|
647
|
+
}
|
|
648
|
+
function isCleanSlateGpt5Family(modelId) {
|
|
649
|
+
return GPT5_FAMILY_RE.test(modelId);
|
|
650
|
+
}
|
|
651
|
+
function isCleanSlateGpt5Pro(modelId) {
|
|
652
|
+
return GPT5_PRO_RE.test(modelId) || GPT5_VERSIONED_PRO_RE.test(modelId);
|
|
653
|
+
}
|
|
654
|
+
function resolveCleanSlateGpt5ReasoningEfforts(modelId, releaseDate) {
|
|
655
|
+
if (modelId.includes('deep-research')) {
|
|
656
|
+
return ['medium'];
|
|
657
|
+
}
|
|
658
|
+
const chatEfforts = resolveCleanSlateGpt5ChatReasoningEfforts(modelId);
|
|
659
|
+
if (chatEfforts) {
|
|
660
|
+
return [...chatEfforts];
|
|
661
|
+
}
|
|
662
|
+
if (GPT5_VERSIONED_PRO_RE.test(modelId)) {
|
|
663
|
+
return [...OPENAI_GPT5_PRO_2_PLUS_EFFORTS];
|
|
664
|
+
}
|
|
665
|
+
if (isCleanSlateGpt5Pro(modelId)) {
|
|
666
|
+
return [...OPENAI_GPT5_PRO_EFFORTS];
|
|
667
|
+
}
|
|
668
|
+
const codexEfforts = resolveCleanSlateGpt5CodexReasoningEfforts(modelId);
|
|
669
|
+
if (codexEfforts) {
|
|
670
|
+
return [...codexEfforts];
|
|
671
|
+
}
|
|
672
|
+
const versionedEfforts = resolveCleanSlateVersionedGpt5ReasoningEfforts(modelId);
|
|
673
|
+
if (versionedEfforts) {
|
|
674
|
+
return [...versionedEfforts];
|
|
675
|
+
}
|
|
676
|
+
const efforts = [...WIDELY_SUPPORTED_EFFORTS];
|
|
677
|
+
if (isCleanSlateGpt5Family(modelId)) {
|
|
678
|
+
efforts.unshift('minimal');
|
|
679
|
+
}
|
|
680
|
+
if (releaseDate && releaseDate >= OPENAI_NONE_EFFORT_RELEASE_DATE) {
|
|
681
|
+
efforts.unshift('none');
|
|
682
|
+
}
|
|
683
|
+
if (releaseDate && releaseDate >= OPENAI_XHIGH_EFFORT_RELEASE_DATE) {
|
|
684
|
+
efforts.push('xhigh');
|
|
685
|
+
}
|
|
686
|
+
return efforts;
|
|
687
|
+
}
|
|
688
|
+
function resolveCleanSlateOpenAICompatibleReasoningEfforts(modelId) {
|
|
689
|
+
const chatEfforts = resolveCleanSlateGpt5ChatReasoningEfforts(modelId);
|
|
690
|
+
if (chatEfforts) {
|
|
691
|
+
return [...chatEfforts];
|
|
692
|
+
}
|
|
693
|
+
if (GPT5_VERSIONED_PRO_RE.test(modelId)) {
|
|
694
|
+
return [...OPENAI_GPT5_PRO_2_PLUS_EFFORTS];
|
|
695
|
+
}
|
|
696
|
+
if (isCleanSlateGpt5Pro(modelId)) {
|
|
697
|
+
return [...OPENAI_GPT5_PRO_EFFORTS];
|
|
698
|
+
}
|
|
699
|
+
return [
|
|
700
|
+
...(resolveCleanSlateGpt5CodexReasoningEfforts(modelId)
|
|
701
|
+
?? resolveCleanSlateVersionedGpt5ReasoningEfforts(modelId)
|
|
702
|
+
?? OPENAI_EFFORTS)
|
|
703
|
+
];
|
|
704
|
+
}
|
|
705
|
+
function resolveCleanSlateGpt5Version(modelId) {
|
|
706
|
+
return Number(GPT5_VERSION_RE.exec(modelId)?.[1]) || undefined;
|
|
707
|
+
}
|
|
708
|
+
function shouldUseOpenAIResponsesApiForModel(modelId) {
|
|
709
|
+
const version = resolveCleanSlateGpt5Version(modelId);
|
|
710
|
+
return version !== undefined
|
|
711
|
+
&& version >= 4
|
|
712
|
+
&& !modelId.includes('codex')
|
|
713
|
+
&& !modelId.includes('-chat');
|
|
714
|
+
}
|
|
715
|
+
function shouldUseResponsesApiForProvider(providerID, providerAdapter, modelId) {
|
|
716
|
+
if (!shouldUseOpenAIResponsesApiForModel(modelId)) {
|
|
717
|
+
return false;
|
|
718
|
+
}
|
|
719
|
+
if (providerID === 'openai') {
|
|
720
|
+
return true;
|
|
721
|
+
}
|
|
722
|
+
return (providerID === 'azure-foundry' || providerAdapter === 'azure')
|
|
723
|
+
&& shouldUseAzureOpenAIResponsesApiForModel(modelId);
|
|
724
|
+
}
|
|
725
|
+
function shouldUseAzureOpenAIResponsesApiForModel(modelId) {
|
|
726
|
+
const version = resolveCleanSlateGpt5Version(modelId);
|
|
727
|
+
// Align with direct OpenAI (gpt-5.4+): Azure's v1 endpoint serves the Responses
|
|
728
|
+
// API for these models, and it is required for streamed reasoning summaries.
|
|
729
|
+
return isCleanSlateGpt5Pro(modelId) || (version !== undefined && version >= 4);
|
|
730
|
+
}
|
|
731
|
+
function shouldUseOpenAIPriorityProcessing(providerID, modelId) {
|
|
732
|
+
if (providerID !== 'openai' || isCleanSlateGpt5Pro(modelId) || modelId.includes('codex') || modelId.includes('-chat') || modelId.includes('nano')) {
|
|
733
|
+
return false;
|
|
734
|
+
}
|
|
735
|
+
if (modelId === 'gpt-5' || modelId.startsWith('gpt-5-mini')) {
|
|
736
|
+
return true;
|
|
737
|
+
}
|
|
738
|
+
const version = resolveCleanSlateGpt5Version(modelId);
|
|
739
|
+
return version === 1 || version === 2 || version === 4 || version === 5 || version === 6;
|
|
740
|
+
}
|
|
741
|
+
function resolveCleanSlateVersionedGpt5ReasoningEfforts(modelId) {
|
|
742
|
+
if (GPT5_VERSIONED_PRO_RE.test(modelId)) {
|
|
743
|
+
return OPENAI_GPT5_PRO_2_PLUS_EFFORTS;
|
|
744
|
+
}
|
|
745
|
+
const version = resolveCleanSlateGpt5Version(modelId);
|
|
746
|
+
if (version === undefined) {
|
|
747
|
+
return undefined;
|
|
748
|
+
}
|
|
749
|
+
if (version === 1) {
|
|
750
|
+
return OPENAI_GPT5_1_EFFORTS;
|
|
751
|
+
}
|
|
752
|
+
if (version >= 6) {
|
|
753
|
+
return OPENAI_GPT5_6_PLUS_EFFORTS;
|
|
754
|
+
}
|
|
755
|
+
return OPENAI_GPT5_2_PLUS_EFFORTS;
|
|
756
|
+
}
|
|
757
|
+
function resolveCleanSlateGpt5CodexReasoningEfforts(modelId) {
|
|
758
|
+
if (!isCleanSlateGpt5Family(modelId) || !modelId.includes('codex')) {
|
|
759
|
+
return undefined;
|
|
760
|
+
}
|
|
761
|
+
const version = resolveCleanSlateGpt5Version(modelId);
|
|
762
|
+
if (version !== undefined && version >= 3) {
|
|
763
|
+
return OPENAI_GPT5_CODEX_3_PLUS_EFFORTS;
|
|
764
|
+
}
|
|
765
|
+
if (modelId.includes('codex-max') || (version !== undefined && version >= 2)) {
|
|
766
|
+
return OPENAI_GPT5_CODEX_XHIGH_EFFORTS;
|
|
767
|
+
}
|
|
768
|
+
return WIDELY_SUPPORTED_EFFORTS;
|
|
769
|
+
}
|
|
770
|
+
function resolveCleanSlateGpt5ChatReasoningEfforts(modelId) {
|
|
771
|
+
if (!isCleanSlateGpt5Family(modelId) || !modelId.includes('-chat')) {
|
|
772
|
+
return undefined;
|
|
773
|
+
}
|
|
774
|
+
return resolveCleanSlateGpt5Version(modelId) === undefined ? [] : OPENAI_GPT5_CHAT_EFFORTS;
|
|
775
|
+
}
|
|
776
|
+
function resolveCleanSlateBedrockReasoningConfig(request, modelId, family, outputLimit) {
|
|
777
|
+
if (!hasCleanSlateNativeReasoningCapability(family, modelId)) {
|
|
778
|
+
return undefined;
|
|
779
|
+
}
|
|
780
|
+
const reasoningLevel = getRequestReasoningLevel(request);
|
|
781
|
+
const effort = reasoningLevel === 'high' ? 'high' : reasoningLevel === 'low' ? 'low' : undefined;
|
|
782
|
+
if (!effort) {
|
|
783
|
+
return undefined;
|
|
784
|
+
}
|
|
785
|
+
if (modelId.includes('anthropic')) {
|
|
786
|
+
return {
|
|
787
|
+
reasoningConfig: {
|
|
788
|
+
type: 'enabled',
|
|
789
|
+
budgetTokens: Math.min(effort === 'high' ? 16_000 : 4_000, outputLimit - 1)
|
|
790
|
+
}
|
|
791
|
+
};
|
|
792
|
+
}
|
|
793
|
+
return {
|
|
794
|
+
reasoningConfig: {
|
|
795
|
+
type: 'enabled',
|
|
796
|
+
maxReasoningEffort: effort
|
|
797
|
+
}
|
|
798
|
+
};
|
|
799
|
+
}
|
|
800
|
+
function resolveCleanSlateAnthropicThinkingConfig(modelId, outputLimit) {
|
|
801
|
+
if (modelId.includes('claude-fable-5') || ['opus-4-7', 'opus-4.7', 'opus-4-6', 'opus-4.6', 'sonnet-4-6', 'sonnet-4.6'].some(value => modelId.includes(value))) {
|
|
802
|
+
return { type: 'adaptive' };
|
|
803
|
+
}
|
|
804
|
+
if (['opus-4-5', 'opus-4.5'].some(value => modelId.includes(value))) {
|
|
805
|
+
return { type: 'enabled', budgetTokens: Math.min(16_000, Math.floor(outputLimit / 2 - 1)) };
|
|
806
|
+
}
|
|
807
|
+
return {
|
|
808
|
+
type: 'enabled',
|
|
809
|
+
budgetTokens: Math.min(16_000, Math.floor(outputLimit / 2 - 1))
|
|
810
|
+
};
|
|
811
|
+
}
|
|
812
|
+
function resolveCleanSlateGeminiThinkingConfig(request, family, modelId) {
|
|
813
|
+
if (!hasCleanSlateNativeReasoningCapability(family, modelId)) {
|
|
814
|
+
return undefined;
|
|
815
|
+
}
|
|
816
|
+
const reasoningLevel = getRequestReasoningLevel(request);
|
|
817
|
+
if (reasoningLevel === 'none') {
|
|
818
|
+
return undefined;
|
|
819
|
+
}
|
|
820
|
+
if (reasoningLevel === 'minimal' || reasoningLevel === 'low') {
|
|
821
|
+
return {
|
|
822
|
+
includeThoughts: true,
|
|
823
|
+
...googleSmallThinkingConfig(modelId)
|
|
824
|
+
};
|
|
825
|
+
}
|
|
826
|
+
if (reasoningLevel === 'high') {
|
|
827
|
+
if (modelId.includes('2.5')) {
|
|
828
|
+
return {
|
|
829
|
+
includeThoughts: true,
|
|
830
|
+
thinkingBudget: 16_000
|
|
831
|
+
};
|
|
832
|
+
}
|
|
833
|
+
return {
|
|
834
|
+
includeThoughts: true,
|
|
835
|
+
thinkingLevel: googleThinkingLevelEfforts(modelId).includes('high') ? 'high' : 'low'
|
|
836
|
+
};
|
|
837
|
+
}
|
|
838
|
+
const config = { includeThoughts: true };
|
|
839
|
+
if (modelId.includes('gemini-3')) {
|
|
840
|
+
config.thinkingLevel = 'high';
|
|
841
|
+
}
|
|
842
|
+
return config;
|
|
843
|
+
}
|
|
844
|
+
function googleThinkingLevelEfforts(modelId) {
|
|
845
|
+
if (!modelId.includes('gemini-3')) {
|
|
846
|
+
return ['low', 'high'];
|
|
847
|
+
}
|
|
848
|
+
if (modelId.includes('flash-image')) {
|
|
849
|
+
return ['minimal', 'high'];
|
|
850
|
+
}
|
|
851
|
+
if (modelId.includes('pro-image')) {
|
|
852
|
+
return ['high'];
|
|
853
|
+
}
|
|
854
|
+
if (modelId.includes('flash')) {
|
|
855
|
+
return ['minimal', 'low', 'medium', 'high'];
|
|
856
|
+
}
|
|
857
|
+
return ['low', 'medium', 'high'];
|
|
858
|
+
}
|
|
859
|
+
function googleThinkingBudgetMax(modelId) {
|
|
860
|
+
return modelId.includes('2.5') && modelId.includes('pro') && !modelId.includes('flash')
|
|
861
|
+
? 32_768
|
|
862
|
+
: 24_576;
|
|
863
|
+
}
|
|
864
|
+
function googleSmallThinkingConfig(modelId) {
|
|
865
|
+
const levels = googleThinkingLevelEfforts(modelId);
|
|
866
|
+
if (modelId.includes('gemini-3')) {
|
|
867
|
+
return {
|
|
868
|
+
thinkingLevel: levels.includes('minimal') ? 'minimal' : levels.includes('low') ? 'low' : 'high'
|
|
869
|
+
};
|
|
870
|
+
}
|
|
871
|
+
return {
|
|
872
|
+
thinkingBudget: googleThinkingBudgetMax(modelId) === 32_768 ? 128 : 0
|
|
873
|
+
};
|
|
874
|
+
}
|
|
875
|
+
function hasCleanSlateNativeReasoningCapability(family, modelId) {
|
|
876
|
+
if (family === 'openai-reasoning' || family === 'deepseek' || family === 'qwen' || family === 'glm' || family === 'minimax') {
|
|
877
|
+
return true;
|
|
878
|
+
}
|
|
879
|
+
if (family === 'grok') {
|
|
880
|
+
return modelId.includes('grok-3-mini') || modelId.includes('grok-4');
|
|
881
|
+
}
|
|
882
|
+
if (family === 'gemini') {
|
|
883
|
+
return modelId.includes('2.5') || modelId.includes('gemini-3');
|
|
884
|
+
}
|
|
885
|
+
if (family === 'claude') {
|
|
886
|
+
return /claude-(?:3[.-]7|4|opus-4|sonnet-4|haiku-4|fable-5)/.test(modelId);
|
|
887
|
+
}
|
|
888
|
+
if (family === 'bedrock') {
|
|
889
|
+
return modelId.includes('anthropic') || modelId.includes('nova');
|
|
890
|
+
}
|
|
891
|
+
if (family === 'kimi') {
|
|
892
|
+
return modelId.includes('thinking') || modelId.includes('k2p') || modelId.includes('kimi-k2.');
|
|
893
|
+
}
|
|
894
|
+
return false;
|
|
895
|
+
}
|
|
896
|
+
function resolveReasoningEffort(reasoningLevel, azureOpenAIModelEndpoint) {
|
|
897
|
+
void azureOpenAIModelEndpoint;
|
|
898
|
+
if (reasoningLevel === 'none') {
|
|
899
|
+
return undefined;
|
|
900
|
+
}
|
|
901
|
+
return reasoningLevel;
|
|
902
|
+
}
|
|
903
|
+
function supportsNativeToolCalls(provider, family) {
|
|
904
|
+
if (family === 'unknown') {
|
|
905
|
+
return false;
|
|
906
|
+
}
|
|
907
|
+
return provider === 'openai'
|
|
908
|
+
|| provider === 'azureOpenAI'
|
|
909
|
+
|| provider === 'anthropic'
|
|
910
|
+
|| provider === 'gemini'
|
|
911
|
+
|| provider === 'grok'
|
|
912
|
+
|| provider === 'nvidia'
|
|
913
|
+
|| provider === 'openrouter'
|
|
914
|
+
|| provider === 'custom'
|
|
915
|
+
|| provider === 'bedrock';
|
|
916
|
+
}
|
|
917
|
+
function normalizePositiveInteger(value, minimum) {
|
|
918
|
+
return Number.isFinite(value) && value > 0
|
|
919
|
+
? Math.max(minimum, Math.floor(value))
|
|
920
|
+
: undefined;
|
|
921
|
+
}
|
|
922
|
+
function normalizeContextLimits(limits, modelOutputTokenLimit) {
|
|
923
|
+
const resolvedLimits = limits ?? fallbackContextLimit();
|
|
924
|
+
const modelContextWindowTokens = normalizePositiveInteger(resolvedLimits.modelContextWindowTokens, MIN_CONTEXT_WINDOW_TOKENS) ?? DEFAULT_CONTEXT_WINDOW_TOKENS;
|
|
925
|
+
const maxInputTokens = normalizePositiveInteger(resolvedLimits.maxInputTokens, MIN_CONTEXT_WINDOW_TOKENS) ?? modelContextWindowTokens;
|
|
926
|
+
const explicitEffectiveContextWindowTokens = normalizePositiveInteger(resolvedLimits.effectiveContextWindowTokens, MIN_CONTEXT_WINDOW_TOKENS);
|
|
927
|
+
const outputReserveTokens = resolveOutputReserveTokens(modelOutputTokenLimit);
|
|
928
|
+
const autoCompactReserveTokens = explicitEffectiveContextWindowTokens !== undefined
|
|
929
|
+
? Math.max(0, maxInputTokens - explicitEffectiveContextWindowTokens)
|
|
930
|
+
: resolvedLimits.maxInputTokens !== undefined
|
|
931
|
+
? resolveInputReserveTokens(modelOutputTokenLimit)
|
|
932
|
+
: outputReserveTokens;
|
|
933
|
+
const effectiveContextWindowTokens = explicitEffectiveContextWindowTokens
|
|
934
|
+
?? Math.max(MIN_CONTEXT_WINDOW_TOKENS, maxInputTokens - autoCompactReserveTokens);
|
|
935
|
+
return {
|
|
936
|
+
modelContextWindowTokens,
|
|
937
|
+
maxInputTokens,
|
|
938
|
+
effectiveContextWindowTokens,
|
|
939
|
+
autoCompactReserveTokens
|
|
940
|
+
};
|
|
941
|
+
}
|
|
942
|
+
function resolveOutputReserveTokens(modelOutputTokenLimit) {
|
|
943
|
+
const normalizedLimit = normalizePositiveInteger(modelOutputTokenLimit, MIN_CONTEXT_WINDOW_TOKENS) ?? DEFAULT_REQUEST_OUTPUT_CAP_TOKENS;
|
|
944
|
+
return Math.min(normalizedLimit, DEFAULT_REQUEST_OUTPUT_CAP_TOKENS);
|
|
945
|
+
}
|
|
946
|
+
function resolveInputReserveTokens(modelOutputTokenLimit) {
|
|
947
|
+
return Math.min(DEFAULT_KNOWN_INPUT_BUFFER_TOKENS, resolveOutputReserveTokens(modelOutputTokenLimit));
|
|
948
|
+
}
|
|
949
|
+
function inferModelLimitProfile(family, model, metadata) {
|
|
950
|
+
const catalogLimits = toModelsDevLimitProfile(metadata);
|
|
951
|
+
if (catalogLimits) {
|
|
952
|
+
return catalogLimits;
|
|
953
|
+
}
|
|
954
|
+
const normalizedModel = normalizeModelId(model);
|
|
955
|
+
switch (family) {
|
|
956
|
+
case 'grok':
|
|
957
|
+
if (normalizedModel.includes('grok-4.20')) {
|
|
958
|
+
return MODEL_LIMITS.grok.grok420;
|
|
959
|
+
}
|
|
960
|
+
if (normalizedModel.includes('grok-4.3') || normalizedModel.includes('grok-4')) {
|
|
961
|
+
return MODEL_LIMITS.grok.grok4;
|
|
962
|
+
}
|
|
963
|
+
return MODEL_LIMITS.grok.default;
|
|
964
|
+
case 'kimi':
|
|
965
|
+
if (normalizedModel.includes('8k')) {
|
|
966
|
+
return MODEL_LIMITS.kimi.k8;
|
|
967
|
+
}
|
|
968
|
+
if (normalizedModel.includes('32k')) {
|
|
969
|
+
return MODEL_LIMITS.kimi.k32;
|
|
970
|
+
}
|
|
971
|
+
if (normalizedModel.includes('128k')) {
|
|
972
|
+
return MODEL_LIMITS.kimi.k128;
|
|
973
|
+
}
|
|
974
|
+
if (normalizedModel.includes('kimi-k2.5') || normalizedModel.includes('kimi-k2p5') || normalizedModel.includes('kimi-k2-5')) {
|
|
975
|
+
return MODEL_LIMITS.kimi.k25;
|
|
976
|
+
}
|
|
977
|
+
return MODEL_LIMITS.kimi.default;
|
|
978
|
+
case 'deepseek':
|
|
979
|
+
if (normalizedModel.includes('v4')) {
|
|
980
|
+
return MODEL_LIMITS.deepseek.v4;
|
|
981
|
+
}
|
|
982
|
+
return MODEL_LIMITS.deepseek.default;
|
|
983
|
+
case 'qwen':
|
|
984
|
+
if (normalizedModel.includes('qwen3.5-plus')) {
|
|
985
|
+
return MODEL_LIMITS.qwen.plus;
|
|
986
|
+
}
|
|
987
|
+
if (normalizedModel.includes('qwen3-max')) {
|
|
988
|
+
return MODEL_LIMITS.qwen.max;
|
|
989
|
+
}
|
|
990
|
+
if (normalizedModel.includes('qwen3-coder')) {
|
|
991
|
+
return MODEL_LIMITS.qwen.coder;
|
|
992
|
+
}
|
|
993
|
+
return MODEL_LIMITS.qwen.default;
|
|
994
|
+
case 'glm':
|
|
995
|
+
return MODEL_LIMITS.glm.default;
|
|
996
|
+
case 'minimax':
|
|
997
|
+
if (normalizedModel.includes('m2')) {
|
|
998
|
+
return MODEL_LIMITS.minimax.m2;
|
|
999
|
+
}
|
|
1000
|
+
return MODEL_LIMITS.minimax.default;
|
|
1001
|
+
case 'mistral':
|
|
1002
|
+
if (normalizedModel.includes('mixtral-8x7b')) {
|
|
1003
|
+
return MODEL_LIMITS.mistral.mixtral8x7b;
|
|
1004
|
+
}
|
|
1005
|
+
if (normalizedModel.includes('mixtral-8x22b')) {
|
|
1006
|
+
return MODEL_LIMITS.mistral.mixtral8x22b;
|
|
1007
|
+
}
|
|
1008
|
+
return MODEL_LIMITS.mistral.default;
|
|
1009
|
+
case 'llama':
|
|
1010
|
+
return MODEL_LIMITS.llama.default;
|
|
1011
|
+
case 'cohere':
|
|
1012
|
+
if (normalizedModel.includes('command-a')) {
|
|
1013
|
+
return MODEL_LIMITS.cohere.commandA;
|
|
1014
|
+
}
|
|
1015
|
+
return MODEL_LIMITS.cohere.default;
|
|
1016
|
+
case 'nemotron':
|
|
1017
|
+
if (normalizedModel.includes('nemotron-3-ultra-550b-a55b')) {
|
|
1018
|
+
return MODEL_LIMITS.nemotron.ultra550b;
|
|
1019
|
+
}
|
|
1020
|
+
return MODEL_LIMITS.nemotron.default;
|
|
1021
|
+
case 'openai-reasoning':
|
|
1022
|
+
return inferOpenAIContextLimits(normalizedModel);
|
|
1023
|
+
case 'openai-compatible-chat':
|
|
1024
|
+
// Sarvam's OpenAI-compatible API rejects the generic 16K default on
|
|
1025
|
+
// starter subscriptions, whose per-request output ceiling is 4K.
|
|
1026
|
+
if (normalizedModel.includes('sarvam')) {
|
|
1027
|
+
return { modelContextWindowTokens: 128_000, modelMaxOutputTokens: 4_096 };
|
|
1028
|
+
}
|
|
1029
|
+
return { modelContextWindowTokens: 128_000, modelMaxOutputTokens: DEFAULT_MODEL_OUTPUT_TOKENS };
|
|
1030
|
+
case 'openai-chat':
|
|
1031
|
+
if (normalizedModel.includes('gpt-4.1')) {
|
|
1032
|
+
return MODEL_LIMITS.openai.gpt41;
|
|
1033
|
+
}
|
|
1034
|
+
return MODEL_LIMITS.openai.defaultChat;
|
|
1035
|
+
case 'gemini':
|
|
1036
|
+
if (normalizedModel.includes('gemini-2.5') || normalizedModel.includes('gemini-3')) {
|
|
1037
|
+
return MODEL_LIMITS.gemini.long;
|
|
1038
|
+
}
|
|
1039
|
+
if (normalizedModel.includes('gemini-1.5-pro')) {
|
|
1040
|
+
return MODEL_LIMITS.gemini.pro15;
|
|
1041
|
+
}
|
|
1042
|
+
return MODEL_LIMITS.gemini.default;
|
|
1043
|
+
case 'claude':
|
|
1044
|
+
if (normalizedModel.includes('claude-fable-5')) {
|
|
1045
|
+
return { modelContextWindowTokens: 1_000_000, modelMaxOutputTokens: 128_000 };
|
|
1046
|
+
}
|
|
1047
|
+
if (normalizedModel.includes('4.6') || normalizedModel.includes('4.7') || normalizedModel.includes('mythos')) {
|
|
1048
|
+
return MODEL_LIMITS.claude.long;
|
|
1049
|
+
}
|
|
1050
|
+
return MODEL_LIMITS.claude.default;
|
|
1051
|
+
case 'bedrock':
|
|
1052
|
+
if (normalizedModel.includes('anthropic') || normalizedModel.includes('claude')) {
|
|
1053
|
+
return inferModelLimitProfile('claude', normalizedModel);
|
|
1054
|
+
}
|
|
1055
|
+
return { ...fallbackContextLimit(), modelMaxOutputTokens: 32_000 };
|
|
1056
|
+
default:
|
|
1057
|
+
return fallbackContextLimit();
|
|
1058
|
+
}
|
|
1059
|
+
}
|
|
1060
|
+
function toModelsDevLimitProfile(metadata) {
|
|
1061
|
+
if (!metadata || !Number.isSafeInteger(metadata.contextWindowTokens) || metadata.contextWindowTokens < MIN_CONTEXT_WINDOW_TOKENS) {
|
|
1062
|
+
return undefined;
|
|
1063
|
+
}
|
|
1064
|
+
return {
|
|
1065
|
+
modelContextWindowTokens: metadata.contextWindowTokens,
|
|
1066
|
+
maxInputTokens: Number.isSafeInteger(metadata.maxInputTokens) && metadata.maxInputTokens > 0 ? metadata.maxInputTokens : undefined,
|
|
1067
|
+
modelMaxOutputTokens: Number.isSafeInteger(metadata.maxOutputTokens) && metadata.maxOutputTokens > 0 ? metadata.maxOutputTokens : undefined
|
|
1068
|
+
};
|
|
1069
|
+
}
|
|
1070
|
+
function inferOpenAIContextLimits(normalizedModel) {
|
|
1071
|
+
if (normalizedModel.includes('codex')) {
|
|
1072
|
+
return MODEL_LIMITS.openai.gpt5;
|
|
1073
|
+
}
|
|
1074
|
+
const version = resolveGpt5Version(normalizedModel);
|
|
1075
|
+
if (version !== undefined && version >= 4 && !normalizedModel.includes('mini')) {
|
|
1076
|
+
return MODEL_LIMITS.openai.gpt5Long;
|
|
1077
|
+
}
|
|
1078
|
+
if (normalizedModel.includes('gpt-5') || version !== undefined) {
|
|
1079
|
+
return MODEL_LIMITS.openai.gpt5;
|
|
1080
|
+
}
|
|
1081
|
+
return MODEL_LIMITS.openai.defaultChat;
|
|
1082
|
+
}
|
|
1083
|
+
function resolveGpt5Version(normalizedModel) {
|
|
1084
|
+
const gpt5Match = normalizedModel.match(GPT5_VERSION_RE);
|
|
1085
|
+
if (gpt5Match?.[1]) {
|
|
1086
|
+
return Number.parseInt(gpt5Match[1], 10);
|
|
1087
|
+
}
|
|
1088
|
+
const bareMatch = normalizedModel.match(/(?:^|[^0-9])5\.(\d+)(?:[^0-9]|$)/);
|
|
1089
|
+
if (bareMatch?.[1]) {
|
|
1090
|
+
return Number.parseInt(bareMatch[1], 10);
|
|
1091
|
+
}
|
|
1092
|
+
return undefined;
|
|
1093
|
+
}
|
|
1094
|
+
function fallbackContextLimit() {
|
|
1095
|
+
return {
|
|
1096
|
+
modelContextWindowTokens: DEFAULT_CONTEXT_WINDOW_TOKENS,
|
|
1097
|
+
maxInputTokens: DEFAULT_CONTEXT_WINDOW_TOKENS,
|
|
1098
|
+
effectiveContextWindowTokens: DEFAULT_CONTEXT_WINDOW_TOKENS
|
|
1099
|
+
};
|
|
1100
|
+
}
|
|
1101
|
+
function inferOutputTokenLimit(family, model) {
|
|
1102
|
+
return inferModelLimitProfile(family, model).modelMaxOutputTokens ?? DEFAULT_MODEL_OUTPUT_TOKENS;
|
|
1103
|
+
}
|
|
1104
|
+
//# sourceMappingURL=cleanSlateModelCapabilities.js.map
|