@tyvm/knowhow 0.0.159 → 0.0.161
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/README.md +6 -6
- package/package.json +2 -2
- package/ts_build/package.json +2 -2
- package/ts_build/src/chat/CliChatService.d.ts +2 -1
- package/ts_build/src/chat/CliChatService.js +29 -3
- package/ts_build/src/chat/CliChatService.js.map +1 -1
- package/ts_build/src/chat/modules/AgentModule.js +21 -17
- package/ts_build/src/chat/modules/AgentModule.js.map +1 -1
- package/ts_build/src/chat/renderer/ConsoleRenderer.js +32 -25
- package/ts_build/src/chat/renderer/ConsoleRenderer.js.map +1 -1
- package/ts_build/src/clients/anthropic.js +4 -1
- package/ts_build/src/clients/anthropic.js.map +1 -1
- package/ts_build/src/clients/contextLimits.js +13 -7
- package/ts_build/src/clients/contextLimits.js.map +1 -1
- package/ts_build/src/clients/index.js +3 -1
- package/ts_build/src/clients/index.js.map +1 -1
- package/ts_build/src/clients/openai.js +18 -5
- package/ts_build/src/clients/openai.js.map +1 -1
- package/ts_build/src/clients/pricing/anthropic.d.ts +2 -0
- package/ts_build/src/clients/pricing/anthropic.js +21 -1
- package/ts_build/src/clients/pricing/anthropic.js.map +1 -1
- package/ts_build/src/clients/pricing/openai.d.ts +2 -0
- package/ts_build/src/clients/pricing/openai.js +32 -7
- package/ts_build/src/clients/pricing/openai.js.map +1 -1
- package/ts_build/src/clients/pricing/types.d.ts +4 -0
- package/ts_build/src/clients/pricing/types.js.map +1 -1
- package/ts_build/src/clients/pricing/xai.d.ts +2 -0
- package/ts_build/src/clients/pricing/xai.js +13 -8
- package/ts_build/src/clients/pricing/xai.js.map +1 -1
- package/ts_build/src/clients/xai.js +20 -8
- package/ts_build/src/clients/xai.js.map +1 -1
- package/ts_build/src/commands/misc.js +15 -2
- package/ts_build/src/commands/misc.js.map +1 -1
- package/ts_build/src/logger.d.ts +1 -0
- package/ts_build/src/logger.js +13 -1
- package/ts_build/src/logger.js.map +1 -1
- package/ts_build/src/remotes.d.ts +2 -0
- package/ts_build/src/remotes.js +20 -2
- package/ts_build/src/remotes.js.map +1 -1
- package/ts_build/src/tunnel.js +7 -2
- package/ts_build/src/tunnel.js.map +1 -1
- package/ts_build/src/types.d.ts +12 -1
- package/ts_build/src/types.js.map +1 -1
- package/ts_build/src/utils/InputQueueManager.d.ts +8 -1
- package/ts_build/src/utils/InputQueueManager.js +74 -3
- package/ts_build/src/utils/InputQueueManager.js.map +1 -1
- package/ts_build/src/utils/index.d.ts +3 -1
- package/ts_build/src/utils/index.js +11 -3
- package/ts_build/src/utils/index.js.map +1 -1
- package/ts_build/src/worker.js +4 -1
- package/ts_build/src/worker.js.map +1 -1
- package/ts_build/src/workers/tools/listAllowedPorts.d.ts +2 -1
- package/ts_build/src/workers/tools/listAllowedPorts.js +1 -1
- package/ts_build/src/workers/tools/listAllowedPorts.js.map +1 -1
- package/CONFIG.md +0 -429
- package/PROCESSING.md +0 -450
- package/WORKER.md +0 -260
- package/autodoc/README.md +0 -324
- package/autodoc/chat-guide.md +0 -444
- package/autodoc/cli-reference.md +0 -720
- package/autodoc/config-reference.md +0 -642
- package/autodoc/embeddings-guide.md +0 -467
- package/autodoc/generate-guide.md +0 -437
- package/autodoc/language-plugin-guide.md +0 -417
- package/autodoc/modules-guide.md +0 -379
- package/autodoc/plugins-guide.md +0 -721
- package/autodoc/quickstart-guide.md +0 -126
- package/autodoc/skills-guide.md +0 -584
- package/autodoc/worker-guide.md +0 -519
- package/docs/input-queue-manager.md +0 -142
- package/docs/multi-worker-management.md +0 -142
- package/docs/shell-commands.md +0 -174
- package/jest.config.js +0 -19
- package/jest.manual.config.js +0 -19
- package/scripts/README.md +0 -119
- package/scripts/build-for-node.sh +0 -148
- package/scripts/cache-miss-debug.ts +0 -365
- package/scripts/check-isolated-deps.sh +0 -69
- package/scripts/check-model-pricing.ts +0 -509
- package/scripts/compare-openrouter-coverage.ts +0 -576
- package/scripts/migrate-usage-json.js +0 -147
- package/scripts/publish.sh +0 -86
- package/scripts/restore_keys.sh +0 -59
- package/scripts/test-repetition-hint.ts +0 -302
- package/scripts/unset_keys.sh +0 -60
- package/src/agents/base/base.ts +0 -1963
- package/src/agents/base/prompt.ts +0 -55
- package/src/agents/configurable/ConfigAgent.ts +0 -24
- package/src/agents/developer/developer.ts +0 -76
- package/src/agents/historyRollback.ts +0 -36
- package/src/agents/index.ts +0 -52
- package/src/agents/interface.ts +0 -11
- package/src/agents/patcher/codebase.md +0 -27
- package/src/agents/patcher/patcher.ts +0 -131
- package/src/agents/researcher/researcher.ts +0 -115
- package/src/agents/setup/setup.ts +0 -63
- package/src/agents/tools/addInternalTools.ts +0 -21
- package/src/agents/tools/agentCall.ts +0 -34
- package/src/agents/tools/aiClient.ts +0 -178
- package/src/agents/tools/askHuman.ts +0 -10
- package/src/agents/tools/callPlugin.ts +0 -10
- package/src/agents/tools/connectAgent.ts +0 -355
- package/src/agents/tools/embeddingSearch.ts +0 -6
- package/src/agents/tools/execCommand.ts +0 -162
- package/src/agents/tools/fileSearch.ts +0 -35
- package/src/agents/tools/finalAnswer.ts +0 -4
- package/src/agents/tools/googleSearch.ts +0 -243
- package/src/agents/tools/index.ts +0 -33
- package/src/agents/tools/language/definitions.ts +0 -105
- package/src/agents/tools/language/index.ts +0 -20
- package/src/agents/tools/lazy/definitions.ts +0 -72
- package/src/agents/tools/lazy/disableTools.ts +0 -16
- package/src/agents/tools/lazy/enableTools.ts +0 -16
- package/src/agents/tools/lazy/index.ts +0 -3
- package/src/agents/tools/lazy/listAvailableTools.ts +0 -17
- package/src/agents/tools/lintFile.ts +0 -19
- package/src/agents/tools/list.ts +0 -739
- package/src/agents/tools/loadImageAsBase64.ts +0 -83
- package/src/agents/tools/loadWebpage.ts +0 -19
- package/src/agents/tools/mcp/connectMcpServer.ts +0 -40
- package/src/agents/tools/mcp/definitions.ts +0 -67
- package/src/agents/tools/mcp/disconnectMcpServer.ts +0 -40
- package/src/agents/tools/mcp/index.ts +0 -3
- package/src/agents/tools/mcp/listAvailableMcpServers.ts +0 -28
- package/src/agents/tools/minimal/callTool.ts +0 -45
- package/src/agents/tools/minimal/definitions.ts +0 -50
- package/src/agents/tools/minimal/index.ts +0 -3
- package/src/agents/tools/minimal/inspectTools.ts +0 -27
- package/src/agents/tools/modifyFile.ts +0 -53
- package/src/agents/tools/observe.ts +0 -247
- package/src/agents/tools/patch.ts +0 -1287
- package/src/agents/tools/readBlocks.ts +0 -83
- package/src/agents/tools/readFile.ts +0 -105
- package/src/agents/tools/replyToParent.ts +0 -123
- package/src/agents/tools/runGenerate.ts +0 -210
- package/src/agents/tools/scanFile.ts +0 -16
- package/src/agents/tools/sendAgentMessage.ts +0 -139
- package/src/agents/tools/skills.ts +0 -79
- package/src/agents/tools/startAgentTask.ts +0 -393
- package/src/agents/tools/stringReplace.ts +0 -105
- package/src/agents/tools/textSearch.ts +0 -128
- package/src/agents/tools/types/fileblock.ts +0 -5
- package/src/agents/tools/visionTool.ts +0 -35
- package/src/agents/tools/waitForAgentCompleted.ts +0 -270
- package/src/agents/tools/writeFile.ts +0 -106
- package/src/agents/tools/ycmd/client.ts +0 -608
- package/src/agents/tools/ycmd/definitions.ts +0 -294
- package/src/agents/tools/ycmd/detection.ts +0 -211
- package/src/agents/tools/ycmd/index.ts +0 -11
- package/src/agents/tools/ycmd/installer.ts +0 -251
- package/src/agents/tools/ycmd/server.ts +0 -545
- package/src/agents/tools/ycmd/serverManager.ts +0 -316
- package/src/agents/tools/ycmd/tools/completion.ts +0 -113
- package/src/agents/tools/ycmd/tools/diagnostics.ts +0 -166
- package/src/agents/tools/ycmd/tools/getLocations.ts +0 -173
- package/src/agents/tools/ycmd/tools/goto.ts +0 -169
- package/src/agents/tools/ycmd/tools/refactor.ts +0 -204
- package/src/agents/tools/ycmd/tools/signature.ts +0 -174
- package/src/agents/tools/ycmd/tools/start.ts +0 -95
- package/src/agents/tools/ycmd/utils/pathUtils.ts +0 -59
- package/src/ai.ts +0 -306
- package/src/auth/browserLogin.ts +0 -406
- package/src/auth/environmentAuth.ts +0 -51
- package/src/auth/errors.ts +0 -6
- package/src/auth/jwtStore.ts +0 -70
- package/src/auth/keyAuth.ts +0 -142
- package/src/auth/keyManager.ts +0 -331
- package/src/auth/registerIdentity.ts +0 -67
- package/src/auth/spinner.ts +0 -23
- package/src/chat/CliChatService.ts +0 -438
- package/src/chat/modules/AgentModule.ts +0 -1664
- package/src/chat/modules/AskModule.ts +0 -98
- package/src/chat/modules/BaseChatModule.ts +0 -65
- package/src/chat/modules/ClipboardImageModule.ts +0 -136
- package/src/chat/modules/CustomCommandsModule.ts +0 -80
- package/src/chat/modules/InternalChatModule.ts +0 -216
- package/src/chat/modules/RemoteSyncModule.ts +0 -482
- package/src/chat/modules/RendererModule.ts +0 -139
- package/src/chat/modules/SearchModule.ts +0 -168
- package/src/chat/modules/SessionsModule.ts +0 -969
- package/src/chat/modules/SetupModule.ts +0 -185
- package/src/chat/modules/ShellCommandModule.ts +0 -98
- package/src/chat/modules/SystemModule.ts +0 -161
- package/src/chat/modules/ToolCommandModule.ts +0 -102
- package/src/chat/modules/VoiceModule.ts +0 -70
- package/src/chat/modules/index.ts +0 -8
- package/src/chat/renderer/CompactRenderer.ts +0 -229
- package/src/chat/renderer/ConsoleRenderer.ts +0 -160
- package/src/chat/renderer/FancyRenderer.ts +0 -440
- package/src/chat/renderer/PlainRenderer.ts +0 -218
- package/src/chat/renderer/index.ts +0 -6
- package/src/chat/renderer/loadRenderer.ts +0 -316
- package/src/chat/renderer/messagesToRenderEvents.ts +0 -96
- package/src/chat/renderer/types.ts +0 -99
- package/src/chat/types.ts +0 -146
- package/src/chat.ts +0 -140
- package/src/cli.ts +0 -180
- package/src/clients/anthropic.ts +0 -772
- package/src/clients/attribution.ts +0 -53
- package/src/clients/cerebras.ts +0 -10
- package/src/clients/contextLimits.ts +0 -263
- package/src/clients/copilot.ts +0 -23
- package/src/clients/deepseek.ts +0 -16
- package/src/clients/fireworks.ts +0 -71
- package/src/clients/gemini.ts +0 -1169
- package/src/clients/github.ts +0 -16
- package/src/clients/groq.ts +0 -15
- package/src/clients/http.ts +0 -719
- package/src/clients/index.ts +0 -1153
- package/src/clients/knowhow.ts +0 -130
- package/src/clients/knowhowMcp.ts +0 -118
- package/src/clients/llama.ts +0 -16
- package/src/clients/meta.ts +0 -27
- package/src/clients/mistral.ts +0 -16
- package/src/clients/nvidia.ts +0 -16
- package/src/clients/openai.ts +0 -1186
- package/src/clients/openrouter.ts +0 -24
- package/src/clients/pricing/anthropic.ts +0 -149
- package/src/clients/pricing/cerebras.ts +0 -11
- package/src/clients/pricing/copilot.ts +0 -60
- package/src/clients/pricing/deepseek.ts +0 -15
- package/src/clients/pricing/fireworks.ts +0 -182
- package/src/clients/pricing/github.ts +0 -69
- package/src/clients/pricing/google.ts +0 -385
- package/src/clients/pricing/groq.ts +0 -56
- package/src/clients/pricing/index.ts +0 -44
- package/src/clients/pricing/llama.ts +0 -18
- package/src/clients/pricing/meta.ts +0 -12
- package/src/clients/pricing/mistral.ts +0 -34
- package/src/clients/pricing/models.ts +0 -25
- package/src/clients/pricing/nvidia.ts +0 -102
- package/src/clients/pricing/openai.ts +0 -409
- package/src/clients/pricing/openrouter.ts +0 -36
- package/src/clients/pricing/qwen.ts +0 -80
- package/src/clients/pricing/types.ts +0 -125
- package/src/clients/pricing/xai.ts +0 -137
- package/src/clients/qwen.ts +0 -16
- package/src/clients/responseMetadata.ts +0 -221
- package/src/clients/types.ts +0 -531
- package/src/clients/withRetry.ts +0 -89
- package/src/clients/xai.ts +0 -693
- package/src/cloudWorker.ts +0 -394
- package/src/commands/agent.ts +0 -342
- package/src/commands/agents.ts +0 -1037
- package/src/commands/behaviors.ts +0 -47
- package/src/commands/convert.ts +0 -291
- package/src/commands/hash.ts +0 -179
- package/src/commands/mcp.ts +0 -743
- package/src/commands/misc.ts +0 -373
- package/src/commands/modules.ts +0 -704
- package/src/commands/processes.ts +0 -248
- package/src/commands/remote.ts +0 -77
- package/src/commands/replay.ts +0 -503
- package/src/commands/sandbox.ts +0 -566
- package/src/commands/services.ts +0 -168
- package/src/commands/skills.ts +0 -107
- package/src/commands/workers.ts +0 -168
- package/src/config.ts +0 -468
- package/src/conversion.ts +0 -69
- package/src/dataset/diffs/README.md +0 -12
- package/src/dataset/diffs/debug-errors.ts +0 -29
- package/src/dataset/diffs/debug.ts +0 -64
- package/src/dataset/diffs/generate.ts +0 -71
- package/src/dataset/diffs/jsonl.ts +0 -53
- package/src/dataset/diffs/test.ts +0 -194
- package/src/embeddings.ts +0 -494
- package/src/fileSync.ts +0 -369
- package/src/generate.ts +0 -529
- package/src/hashes.ts +0 -180
- package/src/index.ts +0 -261
- package/src/logger.ts +0 -197
- package/src/login.ts +0 -209
- package/src/microphone.ts +0 -141
- package/src/migrations.ts +0 -151
- package/src/plugins/AgentsMdPlugin.ts +0 -118
- package/src/plugins/GitPlugin.ts +0 -598
- package/src/plugins/LinterPlugin.ts +0 -214
- package/src/plugins/PluginBase.ts +0 -70
- package/src/plugins/SkillsPlugin.ts +0 -37
- package/src/plugins/embedding.ts +0 -82
- package/src/plugins/exec.ts +0 -70
- package/src/plugins/language.ts +0 -290
- package/src/plugins/plugins.ts +0 -175
- package/src/plugins/tmux.ts +0 -132
- package/src/plugins/types.ts +0 -36
- package/src/plugins/url.ts +0 -101
- package/src/plugins/vim.ts +0 -89
- package/src/processes/ProcessManager.ts +0 -96
- package/src/processes/managedProcessShim.ts +0 -138
- package/src/processors/Base64ImageDetector.ts +0 -502
- package/src/processors/CustomVariables.ts +0 -693
- package/src/processors/GemmaToolProcessor.ts +0 -163
- package/src/processors/HarmonyToolProcessor.ts +0 -264
- package/src/processors/JsonCompressor.ts +0 -510
- package/src/processors/MinimalToolsMessageProcessor.ts +0 -113
- package/src/processors/TokenCompressor.ts +0 -620
- package/src/processors/ToolResponseCache.ts +0 -322
- package/src/processors/XmlToolCallProcessor.ts +0 -533
- package/src/processors/index.ts +0 -14
- package/src/processors/tools/boundedToolResponse.ts +0 -49
- package/src/processors/tools/grepToolResponse.ts +0 -230
- package/src/processors/tools/index.ts +0 -23
- package/src/processors/tools/jqToolResponse.ts +0 -159
- package/src/processors/tools/listStoredToolResponses.ts +0 -124
- package/src/processors/tools/tailToolResponse.ts +0 -148
- package/src/prompts/BasicCodeDocumenter.ts +0 -1
- package/src/prompts/BasicProjectDocumenter.ts +0 -1
- package/src/prompts/EmbeddingSeachHelper.ts +0 -1
- package/src/prompts/KnowhowConfigExamples.ts +0 -376
- package/src/prompts/index.ts +0 -9
- package/src/remotes.ts +0 -110
- package/src/server/index.ts +0 -16
- package/src/services/AgentService.ts +0 -134
- package/src/services/AgentSyncFs.ts +0 -775
- package/src/services/AgentSyncKnowhowWeb.ts +0 -389
- package/src/services/BehaviorsService.ts +0 -466
- package/src/services/DockerService.ts +0 -511
- package/src/services/EmbeddingService.ts +0 -427
- package/src/services/EmbeddingsService.ts +0 -73
- package/src/services/EventService.ts +0 -279
- package/src/services/ExtensionsService.ts +0 -25
- package/src/services/KnowhowClient.ts +0 -928
- package/src/services/LazyToolsService.ts +0 -210
- package/src/services/Mcp.ts +0 -727
- package/src/services/McpServer.ts +0 -155
- package/src/services/McpWebsocketTransport.ts +0 -87
- package/src/services/MediaProcessorService.ts +0 -669
- package/src/services/MessageProcessor.ts +0 -114
- package/src/services/MinimalToolsService.ts +0 -177
- package/src/services/RuntimeReloadService.ts +0 -31
- package/src/services/S3.ts +0 -61
- package/src/services/SessionManager.ts +0 -358
- package/src/services/SkillsService.ts +0 -822
- package/src/services/SyncedAgentWatcher.ts +0 -124
- package/src/services/SyncerService.ts +0 -191
- package/src/services/TaskRegistry.ts +0 -110
- package/src/services/Tools.ts +0 -580
- package/src/services/TracingService.ts +0 -116
- package/src/services/conversion/ConversionService.ts +0 -757
- package/src/services/conversion/index.ts +0 -2
- package/src/services/conversion/types.ts +0 -87
- package/src/services/flags.ts +0 -51
- package/src/services/index.ts +0 -117
- package/src/services/modules/computerUse.ts +0 -218
- package/src/services/modules/index.ts +0 -314
- package/src/services/modules/types.ts +0 -109
- package/src/services/types.ts +0 -60
- package/src/services/watchers/FsSyncer.ts +0 -199
- package/src/services/watchers/RemoteSyncer.ts +0 -196
- package/src/services/watchers/index.ts +0 -2
- package/src/tunnel.ts +0 -243
- package/src/types.ts +0 -282
- package/src/util/Trace.ts +0 -236
- package/src/utils/InputQueueManager.ts +0 -493
- package/src/utils/errors.ts +0 -0
- package/src/utils/http.ts +0 -150
- package/src/utils/index.ts +0 -111
- package/src/worker.ts +0 -696
- package/src/workerRegistry.ts +0 -152
- package/src/workers/auth/PasskeySetup.ts +0 -181
- package/src/workers/auth/WorkerPasskeyAuth.ts +0 -190
- package/src/workers/auth/WsMiddleware.ts +0 -99
- package/src/workers/auth/authMiddleware.ts +0 -104
- package/src/workers/auth/types.ts +0 -70
- package/src/workers/tools/getChallenge.ts +0 -33
- package/src/workers/tools/index.ts +0 -20
- package/src/workers/tools/listAllowedPorts.ts +0 -30
- package/src/workers/tools/lock.ts +0 -31
- package/src/workers/tools/reloadConfig.ts +0 -84
- package/src/workers/tools/unlock.ts +0 -116
- package/tests/XmlToolCallProcessor.test.ts +0 -468
- package/tests/agents/interrupt.test.ts +0 -200
- package/tests/agents/observe-base.test.ts +0 -183
- package/tests/agents/tools/connectAgent.test.ts +0 -138
- package/tests/agents/tools/observe.test.ts +0 -179
- package/tests/agents/tools/readFile.test.ts +0 -88
- package/tests/agents/tools/replyToParent.test.ts +0 -125
- package/tests/agents/tools/sendAgentMessage.test.ts +0 -99
- package/tests/agents/tools/waitForAgentCompleted.test.ts +0 -147
- package/tests/chat/detach-attach-rendering.test.ts +0 -315
- package/tests/clients/AIClient.test.ts +0 -668
- package/tests/clients/anthropic.test.ts +0 -202
- package/tests/clients/contextLimits.test.ts +0 -97
- package/tests/clients/fireworks.test.ts +0 -65
- package/tests/clients/openai.images.test.ts +0 -105
- package/tests/clients/pricing.test.ts +0 -206
- package/tests/clients/reasoningEffort.test.ts +0 -140
- package/tests/compressor/bigstring.test.ts +0 -450
- package/tests/compressor/bigstring.txt +0 -1
- package/tests/compressor/githubjson.txt +0 -1
- package/tests/compressor/toolResponseCache.test.ts +0 -304
- package/tests/compressor/usageBase64.json +0 -159
- package/tests/compressor/usageBase64.test.ts +0 -175
- package/tests/fixtures/fake-secret.txt +0 -1
- package/tests/manual/agent-events/run-test.ts +0 -203
- package/tests/manual/browser-login/README.md +0 -189
- package/tests/manual/browser-login/test_browser_login_basic.ts +0 -115
- package/tests/manual/browser-login/test_cli_integration.ts +0 -169
- package/tests/manual/browser-login/test_cross_platform_browser.ts +0 -186
- package/tests/manual/browser-login/test_error_scenarios.ts +0 -223
- package/tests/manual/cli/no-env.sh +0 -274
- package/tests/manual/clients/completions.json +0 -1151
- package/tests/manual/clients/completions.test.ts +0 -198
- package/tests/manual/file-edits/figma.test.ts +0 -3
- package/tests/manual/file-edits/fileblocks/readwrite.test.ts +0 -100
- package/tests/manual/file-edits/patching/input.txt +0 -145
- package/tests/manual/file-edits/patching/output.txt +0 -145
- package/tests/manual/file-edits/patching/patch.txt +0 -15
- package/tests/manual/file-edits/patching/unseen.txt +0 -80
- package/tests/manual/file-edits/patching.test.ts +0 -139
- package/tests/manual/modalities/README.md +0 -157
- package/tests/manual/modalities/google.modalities.test.ts +0 -335
- package/tests/manual/modalities/openai.modalities.test.ts +0 -329
- package/tests/manual/modalities/streaming.test.ts +0 -260
- package/tests/manual/modalities/xai.modalities.test.ts +0 -294
- package/tests/manual/test-concurrent-ask.ts +0 -43
- package/tests/manual/ycmd/debug_diagnostics_test.ts +0 -127
- package/tests/manual/ycmd/fixtures/debug_diagnostics.ts +0 -26
- package/tests/manual/ycmd/fixtures/file_change_test.ts +0 -17
- package/tests/manual/ycmd/minimal_advanced_test.ts +0 -108
- package/tests/manual/ycmd/simple_diagnostics_test.ts +0 -61
- package/tests/manual/ycmd/simple_test.ts +0 -74
- package/tests/manual/ycmd/test-typescript-sample.ts +0 -34
- package/tests/manual/ycmd/test_advanced_features.ts +0 -407
- package/tests/manual/ycmd/test_advanced_with_tools.ts +0 -320
- package/tests/manual/ycmd/test_comprehensive_typescript.ts +0 -179
- package/tests/manual/ycmd/test_diagnostics_file_changes.ts +0 -249
- package/tests/manual/ycmd/test_diagnostics_fix.ts +0 -99
- package/tests/manual/ycmd/test_diagnostics_simple.ts +0 -100
- package/tests/manual/ycmd/test_diagnostics_timing.ts +0 -120
- package/tests/manual/ycmd/test_discover_commands.ts +0 -310
- package/tests/manual/ycmd/test_endpoints.ts +0 -115
- package/tests/manual/ycmd/test_final_comprehensive.ts +0 -218
- package/tests/manual/ycmd/test_final_validation.ts +0 -150
- package/tests/manual/ycmd/test_implementation.js +0 -42
- package/tests/manual/ycmd/test_individual_ycmd_tool.ts +0 -39
- package/tests/manual/ycmd/test_server_manager.ts +0 -52
- package/tests/manual/ycmd/test_simple_debug.ts +0 -86
- package/tests/manual/ycmd/test_tsserver_workflow.js +0 -83
- package/tests/manual/ycmd/test_tsserver_workflow.ts +0 -122
- package/tests/manual/ycmd/test_typescript_simple.ts +0 -48
- package/tests/manual/ycmd/test_typescript_ycmd.ts +0 -105
- package/tests/manual/ycmd/test_workspace_config.ts +0 -90
- package/tests/manual/ycmd/test_ycmd_auto_start.ts +0 -137
- package/tests/manual/ycmd/test_ycmd_comprehensive.ts +0 -73
- package/tests/manual/ycmd/test_ycmd_connection.py +0 -10
- package/tests/manual/ycmd/test_ycmd_direct.ts +0 -142
- package/tests/manual/ycmd/test_ycmd_experiment.ts +0 -48
- package/tests/manual/ycmd/test_ycmd_final.ts +0 -200
- package/tests/manual/ycmd/test_ycmd_fixed.py +0 -18
- package/tests/manual/ycmd/test_ycmd_integration.ts +0 -112
- package/tests/manual/ycmd/test_ycmd_simple.ts +0 -45
- package/tests/manual/ycmd/test_ycmd_usage.py +0 -27
- package/tests/manual/ycmd/working_simple_test.ts +0 -134
- package/tests/patching/corrupted.test.ts +0 -78
- package/tests/patching/fixtures/transcript-mangles/agent-sync-fs-nested-catch.json +0 -9
- package/tests/patching/fixtures/transcript-mangles/automation-functions-crossed.json +0 -9
- package/tests/patching/fixtures/transcript-mangles/fruit-ninja-confirmed-retirement.json +0 -8
- package/tests/patching/imports.patch.txt +0 -11
- package/tests/patching/imports.test.ts +0 -43
- package/tests/patching/imports.txt +0 -11
- package/tests/patching/interface.patch.txt +0 -15
- package/tests/patching/interface.txt +0 -7
- package/tests/patching/patchFileOutput.test.ts +0 -328
- package/tests/patching/regression-2026.test.ts +0 -752
- package/tests/patching/transcriptMangleRegression.test.ts +0 -125
- package/tests/plugins/language/languagePlugin-content-triggers.test.ts +0 -346
- package/tests/plugins/language/languagePlugin-integration.test.ts +0 -471
- package/tests/plugins/language/languagePlugin.test.ts +0 -385
- package/tests/processes/managedProcessShim.test.ts +0 -59
- package/tests/processors/Base64ImageDetector.test.ts +0 -979
- package/tests/processors/CustomVariables.test.ts +0 -981
- package/tests/processors/CustomVariablesBenchmark.test.ts +0 -237
- package/tests/processors/HarmonyToolProcessor.test.ts +0 -490
- package/tests/processors/TokenCompressor.test.ts +0 -674
- package/tests/processors/ToolResponseCache.test.ts +0 -864
- package/tests/processors/tools/boundedRetrievalTools.test.ts +0 -68
- package/tests/processors/tools/grepToolResponse.test.ts +0 -159
- package/tests/services/ConversionService.test.ts +0 -154
- package/tests/services/DockerService.test.ts +0 -24
- package/tests/services/Tools.test.ts +0 -1738
- package/tests/services/ToolsService.setFunction.test.ts +0 -68
- package/tests/services/WorkerReloadConfig.test.ts +0 -141
- package/tests/test.spec.ts +0 -163
- package/tests/unit/InputQueueManager.test.ts +0 -174
- package/tests/unit/McpWebsocketTransport.test.ts +0 -56
- package/tests/unit/agents/historyRollback.test.ts +0 -53
- package/tests/unit/agents/tools/loadImageAsBase64.test.ts +0 -44
- package/tests/unit/auth/jwtStore.test.ts +0 -55
- package/tests/unit/auth/keyAuth.test.ts +0 -152
- package/tests/unit/auth/keyManager.test.ts +0 -130
- package/tests/unit/auth/registerIdentity.test.ts +0 -99
- package/tests/unit/chat/ToolCommandModule.test.ts +0 -71
- package/tests/unit/chat/historyCommandArgs.test.ts +0 -37
- package/tests/unit/clients/AIClient.test.ts +0 -454
- package/tests/unit/clients/anthropic.responseMetadata.test.ts +0 -81
- package/tests/unit/clients/attribution.test.ts +0 -185
- package/tests/unit/clients/http.responseMetadata.test.ts +0 -86
- package/tests/unit/clients/openai.responseMetadata.test.ts +0 -90
- package/tests/unit/clients/responseMetadata.test.ts +0 -123
- package/tests/unit/clients/withRetry.test.ts +0 -319
- package/tests/unit/commands/agents.test.ts +0 -111
- package/tests/unit/commands/github-credentials.test.ts +0 -210
- package/tests/unit/commands/misc.test.ts +0 -85
- package/tests/unit/commands/remote.test.ts +0 -79
- package/tests/unit/commands/sandbox.test.ts +0 -350
- package/tests/unit/hashes.test.ts +0 -23
- package/tests/unit/input-queue.test.ts +0 -80
- package/tests/unit/login.test.ts +0 -218
- package/tests/unit/modules/moduleLoading.test.ts +0 -305
- package/tests/unit/plugins/pluginLoading.test.ts +0 -97
- package/tests/unit/services/AgentSyncKnowhowWeb.test.ts +0 -38
- package/tests/unit/services/KnowhowClient.test.ts +0 -84
- package/tests/unit/services/LazyToolsService.test.ts +0 -53
- package/tests/unit/services/Mcp.test.ts +0 -56
- package/tests/unit/services/MinimalToolsService.test.ts +0 -424
- package/tests/unit/services/RuntimeReloadService.test.ts +0 -29
- package/tests/unit/services/SessionManager.test.ts +0 -43
- package/tests/unit/services/SyncedAgentWatcher.test.ts +0 -89
- package/tests/unit/services/SyncerService.test.ts +0 -45
- package/tests/unit/tunnel.test.ts +0 -51
- package/tests/unit/util/Trace.test.ts +0 -119
- package/tests/unit/utils/http.test.ts +0 -43
- package/ts_build/tests/XmlToolCallProcessor.test.d.ts +0 -1
- package/ts_build/tests/XmlToolCallProcessor.test.js +0 -376
- package/ts_build/tests/XmlToolCallProcessor.test.js.map +0 -1
- package/ts_build/tests/agents/interrupt.test.d.ts +0 -14
- package/ts_build/tests/agents/interrupt.test.js +0 -136
- package/ts_build/tests/agents/interrupt.test.js.map +0 -1
- package/ts_build/tests/agents/observe-base.test.d.ts +0 -1
- package/ts_build/tests/agents/observe-base.test.js +0 -149
- package/ts_build/tests/agents/observe-base.test.js.map +0 -1
- package/ts_build/tests/agents/tools/connectAgent.test.d.ts +0 -1
- package/ts_build/tests/agents/tools/connectAgent.test.js +0 -142
- package/ts_build/tests/agents/tools/connectAgent.test.js.map +0 -1
- package/ts_build/tests/agents/tools/observe.test.d.ts +0 -1
- package/ts_build/tests/agents/tools/observe.test.js +0 -148
- package/ts_build/tests/agents/tools/observe.test.js.map +0 -1
- package/ts_build/tests/agents/tools/readFile.test.d.ts +0 -1
- package/ts_build/tests/agents/tools/readFile.test.js +0 -90
- package/ts_build/tests/agents/tools/readFile.test.js.map +0 -1
- package/ts_build/tests/agents/tools/replyToParent.test.d.ts +0 -1
- package/ts_build/tests/agents/tools/replyToParent.test.js +0 -116
- package/ts_build/tests/agents/tools/replyToParent.test.js.map +0 -1
- package/ts_build/tests/agents/tools/sendAgentMessage.test.d.ts +0 -1
- package/ts_build/tests/agents/tools/sendAgentMessage.test.js +0 -112
- package/ts_build/tests/agents/tools/sendAgentMessage.test.js.map +0 -1
- package/ts_build/tests/agents/tools/waitForAgentCompleted.test.d.ts +0 -1
- package/ts_build/tests/agents/tools/waitForAgentCompleted.test.js +0 -147
- package/ts_build/tests/agents/tools/waitForAgentCompleted.test.js.map +0 -1
- package/ts_build/tests/chat/detach-attach-rendering.test.d.ts +0 -1
- package/ts_build/tests/chat/detach-attach-rendering.test.js +0 -168
- package/ts_build/tests/chat/detach-attach-rendering.test.js.map +0 -1
- package/ts_build/tests/clients/AIClient.test.d.ts +0 -1
- package/ts_build/tests/clients/AIClient.test.js +0 -483
- package/ts_build/tests/clients/AIClient.test.js.map +0 -1
- package/ts_build/tests/clients/anthropic.test.d.ts +0 -1
- package/ts_build/tests/clients/anthropic.test.js +0 -159
- package/ts_build/tests/clients/anthropic.test.js.map +0 -1
- package/ts_build/tests/clients/contextLimits.test.d.ts +0 -1
- package/ts_build/tests/clients/contextLimits.test.js +0 -69
- package/ts_build/tests/clients/contextLimits.test.js.map +0 -1
- package/ts_build/tests/clients/fireworks.test.d.ts +0 -1
- package/ts_build/tests/clients/fireworks.test.js +0 -65
- package/ts_build/tests/clients/fireworks.test.js.map +0 -1
- package/ts_build/tests/clients/openai.images.test.d.ts +0 -1
- package/ts_build/tests/clients/openai.images.test.js +0 -94
- package/ts_build/tests/clients/openai.images.test.js.map +0 -1
- package/ts_build/tests/clients/pricing.test.d.ts +0 -1
- package/ts_build/tests/clients/pricing.test.js +0 -124
- package/ts_build/tests/clients/pricing.test.js.map +0 -1
- package/ts_build/tests/clients/reasoningEffort.test.d.ts +0 -1
- package/ts_build/tests/clients/reasoningEffort.test.js +0 -116
- package/ts_build/tests/clients/reasoningEffort.test.js.map +0 -1
- package/ts_build/tests/compressor/bigstring.test.d.ts +0 -1
- package/ts_build/tests/compressor/bigstring.test.js +0 -275
- package/ts_build/tests/compressor/bigstring.test.js.map +0 -1
- package/ts_build/tests/compressor/toolResponseCache.test.d.ts +0 -1
- package/ts_build/tests/compressor/toolResponseCache.test.js +0 -250
- package/ts_build/tests/compressor/toolResponseCache.test.js.map +0 -1
- package/ts_build/tests/compressor/usageBase64.test.d.ts +0 -1
- package/ts_build/tests/compressor/usageBase64.test.js +0 -109
- package/ts_build/tests/compressor/usageBase64.test.js.map +0 -1
- package/ts_build/tests/manual/agent-events/run-test.d.ts +0 -2
- package/ts_build/tests/manual/agent-events/run-test.js +0 -148
- package/ts_build/tests/manual/agent-events/run-test.js.map +0 -1
- package/ts_build/tests/manual/browser-login/test_browser_login_basic.d.ts +0 -2
- package/ts_build/tests/manual/browser-login/test_browser_login_basic.js +0 -118
- package/ts_build/tests/manual/browser-login/test_browser_login_basic.js.map +0 -1
- package/ts_build/tests/manual/browser-login/test_cli_integration.d.ts +0 -2
- package/ts_build/tests/manual/browser-login/test_cli_integration.js +0 -163
- package/ts_build/tests/manual/browser-login/test_cli_integration.js.map +0 -1
- package/ts_build/tests/manual/browser-login/test_cross_platform_browser.d.ts +0 -2
- package/ts_build/tests/manual/browser-login/test_cross_platform_browser.js +0 -169
- package/ts_build/tests/manual/browser-login/test_cross_platform_browser.js.map +0 -1
- package/ts_build/tests/manual/browser-login/test_error_scenarios.d.ts +0 -2
- package/ts_build/tests/manual/browser-login/test_error_scenarios.js +0 -207
- package/ts_build/tests/manual/browser-login/test_error_scenarios.js.map +0 -1
- package/ts_build/tests/manual/clients/completions.test.d.ts +0 -1
- package/ts_build/tests/manual/clients/completions.test.js +0 -151
- package/ts_build/tests/manual/clients/completions.test.js.map +0 -1
- package/ts_build/tests/manual/file-edits/figma.test.d.ts +0 -0
- package/ts_build/tests/manual/file-edits/figma.test.js +0 -2
- package/ts_build/tests/manual/file-edits/figma.test.js.map +0 -1
- package/ts_build/tests/manual/file-edits/fileblocks/readwrite.test.d.ts +0 -1
- package/ts_build/tests/manual/file-edits/fileblocks/readwrite.test.js +0 -110
- package/ts_build/tests/manual/file-edits/fileblocks/readwrite.test.js.map +0 -1
- package/ts_build/tests/manual/file-edits/patching.test.d.ts +0 -1
- package/ts_build/tests/manual/file-edits/patching.test.js +0 -129
- package/ts_build/tests/manual/file-edits/patching.test.js.map +0 -1
- package/ts_build/tests/manual/modalities/google.modalities.test.d.ts +0 -1
- package/ts_build/tests/manual/modalities/google.modalities.test.js +0 -262
- package/ts_build/tests/manual/modalities/google.modalities.test.js.map +0 -1
- package/ts_build/tests/manual/modalities/openai.modalities.test.d.ts +0 -1
- package/ts_build/tests/manual/modalities/openai.modalities.test.js +0 -262
- package/ts_build/tests/manual/modalities/openai.modalities.test.js.map +0 -1
- package/ts_build/tests/manual/modalities/streaming.test.d.ts +0 -1
- package/ts_build/tests/manual/modalities/streaming.test.js +0 -216
- package/ts_build/tests/manual/modalities/streaming.test.js.map +0 -1
- package/ts_build/tests/manual/modalities/xai.modalities.test.d.ts +0 -1
- package/ts_build/tests/manual/modalities/xai.modalities.test.js +0 -219
- package/ts_build/tests/manual/modalities/xai.modalities.test.js.map +0 -1
- package/ts_build/tests/manual/test-concurrent-ask.d.ts +0 -1
- package/ts_build/tests/manual/test-concurrent-ask.js +0 -22
- package/ts_build/tests/manual/test-concurrent-ask.js.map +0 -1
- package/ts_build/tests/manual/ycmd/debug_diagnostics_test.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/debug_diagnostics_test.js +0 -124
- package/ts_build/tests/manual/ycmd/debug_diagnostics_test.js.map +0 -1
- package/ts_build/tests/manual/ycmd/minimal_advanced_test.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/minimal_advanced_test.js +0 -114
- package/ts_build/tests/manual/ycmd/minimal_advanced_test.js.map +0 -1
- package/ts_build/tests/manual/ycmd/simple_diagnostics_test.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/simple_diagnostics_test.js +0 -84
- package/ts_build/tests/manual/ycmd/simple_diagnostics_test.js.map +0 -1
- package/ts_build/tests/manual/ycmd/simple_test.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/simple_test.js +0 -92
- package/ts_build/tests/manual/ycmd/simple_test.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test-typescript-sample.d.ts +0 -14
- package/ts_build/tests/manual/ycmd/test-typescript-sample.js +0 -20
- package/ts_build/tests/manual/ycmd/test-typescript-sample.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_advanced_features.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_advanced_features.js +0 -306
- package/ts_build/tests/manual/ycmd/test_advanced_features.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_advanced_with_tools.d.ts +0 -3
- package/ts_build/tests/manual/ycmd/test_advanced_with_tools.js +0 -271
- package/ts_build/tests/manual/ycmd/test_advanced_with_tools.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.js +0 -196
- package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.js +0 -184
- package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_diagnostics_fix.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_diagnostics_fix.js +0 -116
- package/ts_build/tests/manual/ycmd/test_diagnostics_fix.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_diagnostics_simple.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/test_diagnostics_simple.js +0 -114
- package/ts_build/tests/manual/ycmd/test_diagnostics_simple.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_diagnostics_timing.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/test_diagnostics_timing.js +0 -129
- package/ts_build/tests/manual/ycmd/test_diagnostics_timing.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_discover_commands.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_discover_commands.js +0 -252
- package/ts_build/tests/manual/ycmd/test_discover_commands.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_endpoints.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_endpoints.js +0 -130
- package/ts_build/tests/manual/ycmd/test_endpoints.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_final_comprehensive.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_final_comprehensive.js +0 -231
- package/ts_build/tests/manual/ycmd/test_final_comprehensive.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_final_validation.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_final_validation.js +0 -170
- package/ts_build/tests/manual/ycmd/test_final_validation.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.js +0 -37
- package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_server_manager.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/test_server_manager.js +0 -38
- package/ts_build/tests/manual/ycmd/test_server_manager.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_simple_debug.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_simple_debug.js +0 -109
- package/ts_build/tests/manual/ycmd/test_simple_debug.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_tsserver_workflow.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/test_tsserver_workflow.js +0 -138
- package/ts_build/tests/manual/ycmd/test_tsserver_workflow.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_typescript_simple.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/test_typescript_simple.js +0 -76
- package/ts_build/tests/manual/ycmd/test_typescript_simple.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_typescript_ycmd.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/test_typescript_ycmd.js +0 -115
- package/ts_build/tests/manual/ycmd/test_typescript_ycmd.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_workspace_config.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/test_workspace_config.js +0 -99
- package/ts_build/tests/manual/ycmd/test_workspace_config.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.js +0 -140
- package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.js +0 -93
- package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_ycmd_direct.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_ycmd_direct.js +0 -159
- package/ts_build/tests/manual/ycmd/test_ycmd_direct.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_ycmd_experiment.d.ts +0 -15
- package/ts_build/tests/manual/ycmd/test_ycmd_experiment.js +0 -68
- package/ts_build/tests/manual/ycmd/test_ycmd_experiment.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_ycmd_final.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_ycmd_final.js +0 -205
- package/ts_build/tests/manual/ycmd/test_ycmd_final.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_ycmd_integration.d.ts +0 -3
- package/ts_build/tests/manual/ycmd/test_ycmd_integration.js +0 -119
- package/ts_build/tests/manual/ycmd/test_ycmd_integration.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_ycmd_simple.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_ycmd_simple.js +0 -36
- package/ts_build/tests/manual/ycmd/test_ycmd_simple.js.map +0 -1
- package/ts_build/tests/manual/ycmd/working_simple_test.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/working_simple_test.js +0 -144
- package/ts_build/tests/manual/ycmd/working_simple_test.js.map +0 -1
- package/ts_build/tests/patching/corrupted.test.d.ts +0 -1
- package/ts_build/tests/patching/corrupted.test.js +0 -53
- package/ts_build/tests/patching/corrupted.test.js.map +0 -1
- package/ts_build/tests/patching/imports.test.d.ts +0 -1
- package/ts_build/tests/patching/imports.test.js +0 -71
- package/ts_build/tests/patching/imports.test.js.map +0 -1
- package/ts_build/tests/patching/patchFileOutput.test.d.ts +0 -1
- package/ts_build/tests/patching/patchFileOutput.test.js +0 -269
- package/ts_build/tests/patching/patchFileOutput.test.js.map +0 -1
- package/ts_build/tests/patching/regression-2026.test.d.ts +0 -1
- package/ts_build/tests/patching/regression-2026.test.js +0 -528
- package/ts_build/tests/patching/regression-2026.test.js.map +0 -1
- package/ts_build/tests/patching/transcriptMangleRegression.test.d.ts +0 -1
- package/ts_build/tests/patching/transcriptMangleRegression.test.js +0 -104
- package/ts_build/tests/patching/transcriptMangleRegression.test.js.map +0 -1
- package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.d.ts +0 -1
- package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js +0 -294
- package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js.map +0 -1
- package/ts_build/tests/plugins/language/languagePlugin-integration.test.d.ts +0 -1
- package/ts_build/tests/plugins/language/languagePlugin-integration.test.js +0 -343
- package/ts_build/tests/plugins/language/languagePlugin-integration.test.js.map +0 -1
- package/ts_build/tests/plugins/language/languagePlugin.test.d.ts +0 -1
- package/ts_build/tests/plugins/language/languagePlugin.test.js +0 -315
- package/ts_build/tests/plugins/language/languagePlugin.test.js.map +0 -1
- package/ts_build/tests/processes/managedProcessShim.test.d.ts +0 -1
- package/ts_build/tests/processes/managedProcessShim.test.js +0 -92
- package/ts_build/tests/processes/managedProcessShim.test.js.map +0 -1
- package/ts_build/tests/processors/Base64ImageDetector.test.d.ts +0 -1
- package/ts_build/tests/processors/Base64ImageDetector.test.js +0 -792
- package/ts_build/tests/processors/Base64ImageDetector.test.js.map +0 -1
- package/ts_build/tests/processors/CustomVariables.test.d.ts +0 -1
- package/ts_build/tests/processors/CustomVariables.test.js +0 -764
- package/ts_build/tests/processors/CustomVariables.test.js.map +0 -1
- package/ts_build/tests/processors/CustomVariablesBenchmark.test.d.ts +0 -1
- package/ts_build/tests/processors/CustomVariablesBenchmark.test.js +0 -179
- package/ts_build/tests/processors/CustomVariablesBenchmark.test.js.map +0 -1
- package/ts_build/tests/processors/HarmonyToolProcessor.test.d.ts +0 -1
- package/ts_build/tests/processors/HarmonyToolProcessor.test.js +0 -382
- package/ts_build/tests/processors/HarmonyToolProcessor.test.js.map +0 -1
- package/ts_build/tests/processors/TokenCompressor.test.d.ts +0 -1
- package/ts_build/tests/processors/TokenCompressor.test.js +0 -473
- package/ts_build/tests/processors/TokenCompressor.test.js.map +0 -1
- package/ts_build/tests/processors/ToolResponseCache.test.d.ts +0 -1
- package/ts_build/tests/processors/ToolResponseCache.test.js +0 -657
- package/ts_build/tests/processors/ToolResponseCache.test.js.map +0 -1
- package/ts_build/tests/processors/tools/boundedRetrievalTools.test.d.ts +0 -1
- package/ts_build/tests/processors/tools/boundedRetrievalTools.test.js +0 -57
- package/ts_build/tests/processors/tools/boundedRetrievalTools.test.js.map +0 -1
- package/ts_build/tests/processors/tools/grepToolResponse.test.d.ts +0 -1
- package/ts_build/tests/processors/tools/grepToolResponse.test.js +0 -77
- package/ts_build/tests/processors/tools/grepToolResponse.test.js.map +0 -1
- package/ts_build/tests/services/ConversionService.test.d.ts +0 -1
- package/ts_build/tests/services/ConversionService.test.js +0 -154
- package/ts_build/tests/services/ConversionService.test.js.map +0 -1
- package/ts_build/tests/services/DockerService.test.d.ts +0 -1
- package/ts_build/tests/services/DockerService.test.js +0 -22
- package/ts_build/tests/services/DockerService.test.js.map +0 -1
- package/ts_build/tests/services/Tools.test.d.ts +0 -1
- package/ts_build/tests/services/Tools.test.js +0 -1365
- package/ts_build/tests/services/Tools.test.js.map +0 -1
- package/ts_build/tests/services/ToolsService.setFunction.test.d.ts +0 -1
- package/ts_build/tests/services/ToolsService.setFunction.test.js +0 -51
- package/ts_build/tests/services/ToolsService.setFunction.test.js.map +0 -1
- package/ts_build/tests/services/WorkerReloadConfig.test.d.ts +0 -1
- package/ts_build/tests/services/WorkerReloadConfig.test.js +0 -86
- package/ts_build/tests/services/WorkerReloadConfig.test.js.map +0 -1
- package/ts_build/tests/test.spec.d.ts +0 -1
- package/ts_build/tests/test.spec.js +0 -139
- package/ts_build/tests/test.spec.js.map +0 -1
- package/ts_build/tests/unit/InputQueueManager.test.d.ts +0 -1
- package/ts_build/tests/unit/InputQueueManager.test.js +0 -104
- package/ts_build/tests/unit/InputQueueManager.test.js.map +0 -1
- package/ts_build/tests/unit/McpWebsocketTransport.test.d.ts +0 -1
- package/ts_build/tests/unit/McpWebsocketTransport.test.js +0 -47
- package/ts_build/tests/unit/McpWebsocketTransport.test.js.map +0 -1
- package/ts_build/tests/unit/agents/historyRollback.test.d.ts +0 -1
- package/ts_build/tests/unit/agents/historyRollback.test.js +0 -42
- package/ts_build/tests/unit/agents/historyRollback.test.js.map +0 -1
- package/ts_build/tests/unit/agents/tools/loadImageAsBase64.test.d.ts +0 -1
- package/ts_build/tests/unit/agents/tools/loadImageAsBase64.test.js +0 -67
- package/ts_build/tests/unit/agents/tools/loadImageAsBase64.test.js.map +0 -1
- package/ts_build/tests/unit/auth/jwtStore.test.d.ts +0 -1
- package/ts_build/tests/unit/auth/jwtStore.test.js +0 -46
- package/ts_build/tests/unit/auth/jwtStore.test.js.map +0 -1
- package/ts_build/tests/unit/auth/keyAuth.test.d.ts +0 -1
- package/ts_build/tests/unit/auth/keyAuth.test.js +0 -118
- package/ts_build/tests/unit/auth/keyAuth.test.js.map +0 -1
- package/ts_build/tests/unit/auth/keyManager.test.d.ts +0 -1
- package/ts_build/tests/unit/auth/keyManager.test.js +0 -96
- package/ts_build/tests/unit/auth/keyManager.test.js.map +0 -1
- package/ts_build/tests/unit/auth/registerIdentity.test.d.ts +0 -1
- package/ts_build/tests/unit/auth/registerIdentity.test.js +0 -92
- package/ts_build/tests/unit/auth/registerIdentity.test.js.map +0 -1
- package/ts_build/tests/unit/chat/ToolCommandModule.test.d.ts +0 -1
- package/ts_build/tests/unit/chat/ToolCommandModule.test.js +0 -61
- package/ts_build/tests/unit/chat/ToolCommandModule.test.js.map +0 -1
- package/ts_build/tests/unit/chat/historyCommandArgs.test.d.ts +0 -1
- package/ts_build/tests/unit/chat/historyCommandArgs.test.js +0 -29
- package/ts_build/tests/unit/chat/historyCommandArgs.test.js.map +0 -1
- package/ts_build/tests/unit/clients/AIClient.test.d.ts +0 -1
- package/ts_build/tests/unit/clients/AIClient.test.js +0 -342
- package/ts_build/tests/unit/clients/AIClient.test.js.map +0 -1
- package/ts_build/tests/unit/clients/anthropic.responseMetadata.test.d.ts +0 -1
- package/ts_build/tests/unit/clients/anthropic.responseMetadata.test.js +0 -77
- package/ts_build/tests/unit/clients/anthropic.responseMetadata.test.js.map +0 -1
- package/ts_build/tests/unit/clients/attribution.test.d.ts +0 -1
- package/ts_build/tests/unit/clients/attribution.test.js +0 -153
- package/ts_build/tests/unit/clients/attribution.test.js.map +0 -1
- package/ts_build/tests/unit/clients/http.responseMetadata.test.d.ts +0 -1
- package/ts_build/tests/unit/clients/http.responseMetadata.test.js +0 -77
- package/ts_build/tests/unit/clients/http.responseMetadata.test.js.map +0 -1
- package/ts_build/tests/unit/clients/openai.responseMetadata.test.d.ts +0 -1
- package/ts_build/tests/unit/clients/openai.responseMetadata.test.js +0 -86
- package/ts_build/tests/unit/clients/openai.responseMetadata.test.js.map +0 -1
- package/ts_build/tests/unit/clients/responseMetadata.test.d.ts +0 -1
- package/ts_build/tests/unit/clients/responseMetadata.test.js +0 -96
- package/ts_build/tests/unit/clients/responseMetadata.test.js.map +0 -1
- package/ts_build/tests/unit/clients/withRetry.test.d.ts +0 -1
- package/ts_build/tests/unit/clients/withRetry.test.js +0 -225
- package/ts_build/tests/unit/clients/withRetry.test.js.map +0 -1
- package/ts_build/tests/unit/commands/agents.test.d.ts +0 -1
- package/ts_build/tests/unit/commands/agents.test.js +0 -119
- package/ts_build/tests/unit/commands/agents.test.js.map +0 -1
- package/ts_build/tests/unit/commands/github-credentials.test.d.ts +0 -1
- package/ts_build/tests/unit/commands/github-credentials.test.js +0 -145
- package/ts_build/tests/unit/commands/github-credentials.test.js.map +0 -1
- package/ts_build/tests/unit/commands/misc.test.d.ts +0 -1
- package/ts_build/tests/unit/commands/misc.test.js +0 -70
- package/ts_build/tests/unit/commands/misc.test.js.map +0 -1
- package/ts_build/tests/unit/commands/remote.test.d.ts +0 -1
- package/ts_build/tests/unit/commands/remote.test.js +0 -70
- package/ts_build/tests/unit/commands/remote.test.js.map +0 -1
- package/ts_build/tests/unit/commands/sandbox.test.d.ts +0 -1
- package/ts_build/tests/unit/commands/sandbox.test.js +0 -258
- package/ts_build/tests/unit/commands/sandbox.test.js.map +0 -1
- package/ts_build/tests/unit/hashes.test.d.ts +0 -1
- package/ts_build/tests/unit/hashes.test.js +0 -25
- package/ts_build/tests/unit/hashes.test.js.map +0 -1
- package/ts_build/tests/unit/input-queue.test.d.ts +0 -1
- package/ts_build/tests/unit/input-queue.test.js +0 -32
- package/ts_build/tests/unit/input-queue.test.js.map +0 -1
- package/ts_build/tests/unit/login.test.d.ts +0 -1
- package/ts_build/tests/unit/login.test.js +0 -166
- package/ts_build/tests/unit/login.test.js.map +0 -1
- package/ts_build/tests/unit/modules/moduleLoading.test.d.ts +0 -1
- package/ts_build/tests/unit/modules/moduleLoading.test.js +0 -272
- package/ts_build/tests/unit/modules/moduleLoading.test.js.map +0 -1
- package/ts_build/tests/unit/plugins/pluginLoading.test.d.ts +0 -1
- package/ts_build/tests/unit/plugins/pluginLoading.test.js +0 -117
- package/ts_build/tests/unit/plugins/pluginLoading.test.js.map +0 -1
- package/ts_build/tests/unit/services/AgentSyncKnowhowWeb.test.d.ts +0 -1
- package/ts_build/tests/unit/services/AgentSyncKnowhowWeb.test.js +0 -32
- package/ts_build/tests/unit/services/AgentSyncKnowhowWeb.test.js.map +0 -1
- package/ts_build/tests/unit/services/KnowhowClient.test.d.ts +0 -1
- package/ts_build/tests/unit/services/KnowhowClient.test.js +0 -69
- package/ts_build/tests/unit/services/KnowhowClient.test.js.map +0 -1
- package/ts_build/tests/unit/services/LazyToolsService.test.d.ts +0 -1
- package/ts_build/tests/unit/services/LazyToolsService.test.js +0 -47
- package/ts_build/tests/unit/services/LazyToolsService.test.js.map +0 -1
- package/ts_build/tests/unit/services/Mcp.test.d.ts +0 -1
- package/ts_build/tests/unit/services/Mcp.test.js +0 -45
- package/ts_build/tests/unit/services/Mcp.test.js.map +0 -1
- package/ts_build/tests/unit/services/MinimalToolsService.test.d.ts +0 -1
- package/ts_build/tests/unit/services/MinimalToolsService.test.js +0 -320
- package/ts_build/tests/unit/services/MinimalToolsService.test.js.map +0 -1
- package/ts_build/tests/unit/services/RuntimeReloadService.test.d.ts +0 -1
- package/ts_build/tests/unit/services/RuntimeReloadService.test.js +0 -26
- package/ts_build/tests/unit/services/RuntimeReloadService.test.js.map +0 -1
- package/ts_build/tests/unit/services/SessionManager.test.d.ts +0 -1
- package/ts_build/tests/unit/services/SessionManager.test.js +0 -72
- package/ts_build/tests/unit/services/SessionManager.test.js.map +0 -1
- package/ts_build/tests/unit/services/SyncedAgentWatcher.test.d.ts +0 -1
- package/ts_build/tests/unit/services/SyncedAgentWatcher.test.js +0 -78
- package/ts_build/tests/unit/services/SyncedAgentWatcher.test.js.map +0 -1
- package/ts_build/tests/unit/services/SyncerService.test.d.ts +0 -1
- package/ts_build/tests/unit/services/SyncerService.test.js +0 -40
- package/ts_build/tests/unit/services/SyncerService.test.js.map +0 -1
- package/ts_build/tests/unit/tunnel.test.d.ts +0 -1
- package/ts_build/tests/unit/tunnel.test.js +0 -47
- package/ts_build/tests/unit/tunnel.test.js.map +0 -1
- package/ts_build/tests/unit/util/Trace.test.d.ts +0 -1
- package/ts_build/tests/unit/util/Trace.test.js +0 -107
- package/ts_build/tests/unit/util/Trace.test.js.map +0 -1
- package/ts_build/tests/unit/utils/http.test.d.ts +0 -1
- package/ts_build/tests/unit/utils/http.test.js +0 -69
- package/ts_build/tests/unit/utils/http.test.js.map +0 -1
- package/tsconfig.json +0 -34
- package/tslint.json +0 -11
package/src/clients/openai.ts
DELETED
|
@@ -1,1186 +0,0 @@
|
|
|
1
|
-
import OpenAI from "openai";
|
|
2
|
-
import { getConfigSync } from "../config";
|
|
3
|
-
import { emitResponseMetadata } from "./responseMetadata";
|
|
4
|
-
import { OpenAiTextPricing } from "./pricing";
|
|
5
|
-
import { ContextLimits } from "./contextLimits";
|
|
6
|
-
import {
|
|
7
|
-
GenericClient,
|
|
8
|
-
CompletionOptions,
|
|
9
|
-
CompletionResponse,
|
|
10
|
-
EmbeddingOptions,
|
|
11
|
-
EmbeddingResponse,
|
|
12
|
-
AudioTranscriptionOptions,
|
|
13
|
-
AudioTranscriptionResponse,
|
|
14
|
-
AudioGenerationOptions,
|
|
15
|
-
AudioGenerationResponse,
|
|
16
|
-
ImageGenerationOptions,
|
|
17
|
-
ImageGenerationResponse,
|
|
18
|
-
VideoGenerationOptions,
|
|
19
|
-
VideoGenerationResponse,
|
|
20
|
-
VideoStatusOptions,
|
|
21
|
-
VideoStatusResponse,
|
|
22
|
-
FileUploadOptions,
|
|
23
|
-
FileUploadResponse,
|
|
24
|
-
FileDownloadOptions,
|
|
25
|
-
FileDownloadResponse,
|
|
26
|
-
Message,
|
|
27
|
-
} from "./types";
|
|
28
|
-
import {
|
|
29
|
-
ChatCompletionMessageParam,
|
|
30
|
-
ChatCompletionToolMessageParam,
|
|
31
|
-
ChatCompletionMessageToolCall,
|
|
32
|
-
} from "openai/resources/chat";
|
|
33
|
-
import {
|
|
34
|
-
ResponseFunctionToolCall,
|
|
35
|
-
ResponseInputMessageContentList,
|
|
36
|
-
} from "openai/resources/responses/responses";
|
|
37
|
-
|
|
38
|
-
import {
|
|
39
|
-
EmbeddingModels,
|
|
40
|
-
Models,
|
|
41
|
-
OpenAiReasoningModels,
|
|
42
|
-
OpenAiChatModels,
|
|
43
|
-
OpenAiResponsesOnlyModels,
|
|
44
|
-
OpenAiImageModels,
|
|
45
|
-
OpenAiVideoModels,
|
|
46
|
-
OpenAiTTSModels,
|
|
47
|
-
OpenAiTranscriptionModels,
|
|
48
|
-
OpenAiEmbeddingModelsList,
|
|
49
|
-
OpenAiRealtimeModels,
|
|
50
|
-
} from "../types";
|
|
51
|
-
import { ModelModality } from "./types";
|
|
52
|
-
|
|
53
|
-
const config = getConfigSync();
|
|
54
|
-
|
|
55
|
-
export class GenericOpenAiClient implements GenericClient {
|
|
56
|
-
client: OpenAI;
|
|
57
|
-
apiKey?: string;
|
|
58
|
-
|
|
59
|
-
constructor(apiKey = process.env.OPENAI_KEY) {
|
|
60
|
-
this.setKey(apiKey);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
private emitErrorMetadata(
|
|
64
|
-
options:
|
|
65
|
-
| CompletionOptions
|
|
66
|
-
| EmbeddingOptions
|
|
67
|
-
| AudioTranscriptionOptions
|
|
68
|
-
| AudioGenerationOptions,
|
|
69
|
-
error: unknown
|
|
70
|
-
) {
|
|
71
|
-
if (!error || typeof error !== "object") return;
|
|
72
|
-
const apiError = error as {
|
|
73
|
-
status?: number;
|
|
74
|
-
headers?: Headers | Record<string, unknown>;
|
|
75
|
-
request_id?: string;
|
|
76
|
-
requestID?: string;
|
|
77
|
-
response?: Response;
|
|
78
|
-
};
|
|
79
|
-
const statusCode = apiError.status ?? apiError.response?.status;
|
|
80
|
-
const headers = apiError.headers ?? apiError.response?.headers;
|
|
81
|
-
if (typeof statusCode === "number" || headers) {
|
|
82
|
-
emitResponseMetadata(options, {
|
|
83
|
-
statusCode,
|
|
84
|
-
headers,
|
|
85
|
-
requestId: apiError.request_id ?? apiError.requestID,
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
setKey(apiKey: string) {
|
|
91
|
-
this.apiKey = apiKey;
|
|
92
|
-
this.client = new OpenAI({
|
|
93
|
-
apiKey,
|
|
94
|
-
// SDK retries hide individual responses, which breaks response-scoped telemetry.
|
|
95
|
-
maxRetries: 0,
|
|
96
|
-
...(config?.openaiBaseUrl && { baseURL: config.openaiBaseUrl }),
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Execute a function with timeout, retries, and exponential backoff.
|
|
102
|
-
* Retriable errors: 5xx, timeout, ECONNRESET, ETIMEDOUT, rate limits (429).
|
|
103
|
-
*/
|
|
104
|
-
reasoningEffort(
|
|
105
|
-
messages: CompletionOptions["messages"]
|
|
106
|
-
): "low" | "medium" | "high" {
|
|
107
|
-
return this.detectReasoningEffort(messages);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
detectReasoningEffort(
|
|
111
|
-
messages: CompletionOptions["messages"]
|
|
112
|
-
): "low" | "medium" | "high" {
|
|
113
|
-
const effortMap: Record<string, "low" | "medium" | "high"> = {
|
|
114
|
-
ultrathink: "high",
|
|
115
|
-
"think hard": "high",
|
|
116
|
-
"reason hard": "high",
|
|
117
|
-
|
|
118
|
-
"think carefully": "medium",
|
|
119
|
-
"reason carefully": "medium",
|
|
120
|
-
"think medium": "medium",
|
|
121
|
-
"reason medium": "medium",
|
|
122
|
-
|
|
123
|
-
"think low": "low",
|
|
124
|
-
"reason low": "low",
|
|
125
|
-
"think simple": "low",
|
|
126
|
-
"reason simple": "low",
|
|
127
|
-
};
|
|
128
|
-
|
|
129
|
-
for (const key in effortMap) {
|
|
130
|
-
if (
|
|
131
|
-
messages.some(
|
|
132
|
-
(msg) =>
|
|
133
|
-
typeof msg.content === "string" &&
|
|
134
|
-
msg.role === "user" &&
|
|
135
|
-
msg.content?.includes(key)
|
|
136
|
-
)
|
|
137
|
-
) {
|
|
138
|
-
return effortMap[key];
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
return "medium"; // Default to medium if no specific effort is mentioned
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
resolveReasoningEffort(
|
|
146
|
-
options: CompletionOptions
|
|
147
|
-
): "low" | "medium" | "high" {
|
|
148
|
-
const effort =
|
|
149
|
-
options.reasoning_effort ?? this.detectReasoningEffort(options.messages);
|
|
150
|
-
// Chat Completions only accepts low/medium/high. Preserve newer values on
|
|
151
|
-
// the Responses API, but map them to the nearest legacy level here.
|
|
152
|
-
if (effort === "none" || effort === "minimal") return "low";
|
|
153
|
-
if (effort === "xhigh" || effort === "max") return "high";
|
|
154
|
-
return effort;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Resolves the reasoning effort for a specific model, clamping to the model's
|
|
159
|
-
* supported levels if `reasoningLevels` is set in its pricing entry.
|
|
160
|
-
* If the requested level is not supported, picks the lowest supported level.
|
|
161
|
-
*/
|
|
162
|
-
resolveReasoningEffortForModel(options: CompletionOptions): string {
|
|
163
|
-
const raw =
|
|
164
|
-
options.reasoning_effort ?? this.detectReasoningEffort(options.messages);
|
|
165
|
-
// Anthropic calls its highest level `max`; OpenAI calls it `xhigh`.
|
|
166
|
-
// Accept both provider-neutral CLI spellings.
|
|
167
|
-
const requested = raw === "max" ? "xhigh" : raw;
|
|
168
|
-
const pricing = OpenAiTextPricing[options.model];
|
|
169
|
-
const supportedLevels = pricing?.reasoningLevels;
|
|
170
|
-
if (!supportedLevels || supportedLevels.length === 0) {
|
|
171
|
-
return requested;
|
|
172
|
-
}
|
|
173
|
-
// If the requested level is supported, use it
|
|
174
|
-
if (supportedLevels.includes(requested)) {
|
|
175
|
-
return requested;
|
|
176
|
-
}
|
|
177
|
-
// Otherwise use the first (lowest) supported level
|
|
178
|
-
return supportedLevels[0];
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
/** Returns true when the caller explicitly requested thinking/reasoning to be disabled. */
|
|
182
|
-
isReasoningDisabled(options: CompletionOptions): boolean {
|
|
183
|
-
return options.reasoning_effort === "none";
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
/**
|
|
187
|
-
* OpenAI only permits image parts on user messages. A Chat Completions
|
|
188
|
-
* `tool` message may contain text parts, but not `image_url` parts. Keep the
|
|
189
|
-
* required tool result and attach images in a following user message.
|
|
190
|
-
*/
|
|
191
|
-
toChatCompletionMessages(
|
|
192
|
-
messages: CompletionOptions["messages"]
|
|
193
|
-
): ChatCompletionMessageParam[] {
|
|
194
|
-
return messages.flatMap((msg): ChatCompletionMessageParam[] => {
|
|
195
|
-
if (msg.role !== "tool") return [msg as ChatCompletionMessageParam];
|
|
196
|
-
|
|
197
|
-
const parts = Array.isArray(msg.content) ? msg.content : [];
|
|
198
|
-
const unsupportedPart = parts.find(
|
|
199
|
-
(part) => part.type !== "text" && part.type !== "image_url"
|
|
200
|
-
);
|
|
201
|
-
if (unsupportedPart) {
|
|
202
|
-
throw new Error(
|
|
203
|
-
`OpenAI Chat Completions cannot attach ${unsupportedPart.type} content to a tool result.`
|
|
204
|
-
);
|
|
205
|
-
}
|
|
206
|
-
const imageParts = parts.filter((part) => part.type === "image_url");
|
|
207
|
-
const textParts = parts.filter((part) => part.type === "text");
|
|
208
|
-
const toolMessage: ChatCompletionToolMessageParam = {
|
|
209
|
-
role: "tool",
|
|
210
|
-
tool_call_id: msg.tool_call_id!,
|
|
211
|
-
content: Array.isArray(msg.content)
|
|
212
|
-
? textParts.length
|
|
213
|
-
? textParts
|
|
214
|
-
: [
|
|
215
|
-
{
|
|
216
|
-
type: "text",
|
|
217
|
-
text: "Image output attached in the following user message.",
|
|
218
|
-
},
|
|
219
|
-
]
|
|
220
|
-
: msg.content || "",
|
|
221
|
-
};
|
|
222
|
-
|
|
223
|
-
if (!imageParts.length) return [toolMessage];
|
|
224
|
-
return [
|
|
225
|
-
toolMessage,
|
|
226
|
-
{ role: "user", content: imageParts } as ChatCompletionMessageParam,
|
|
227
|
-
];
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
/** Convert the CLI's Chat Completions-style parts to Responses API parts. */
|
|
232
|
-
toResponseContent(
|
|
233
|
-
content: Message["content"]
|
|
234
|
-
): string | ResponseInputMessageContentList {
|
|
235
|
-
if (!Array.isArray(content)) return content || "";
|
|
236
|
-
const result: ResponseInputMessageContentList = [];
|
|
237
|
-
for (const part of content) {
|
|
238
|
-
if (part.type === "text") {
|
|
239
|
-
result.push({ type: "input_text", text: part.text });
|
|
240
|
-
} else if (part.type === "image_url") {
|
|
241
|
-
result.push({
|
|
242
|
-
type: "input_image",
|
|
243
|
-
image_url: part.image_url.url,
|
|
244
|
-
detail: part.image_url.detail || "auto",
|
|
245
|
-
});
|
|
246
|
-
} else {
|
|
247
|
-
throw new Error(
|
|
248
|
-
`OpenAI Responses API conversion does not support ${part.type} content.`
|
|
249
|
-
);
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
return result;
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
async createChatCompletion(
|
|
256
|
-
options: CompletionOptions
|
|
257
|
-
): Promise<CompletionResponse> {
|
|
258
|
-
// Route to Responses API for models that don't support Chat Completions
|
|
259
|
-
if (OpenAiResponsesOnlyModels.includes(options.model)) {
|
|
260
|
-
return this.createChatResponse(options);
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
const openaiMessages = this.toChatCompletionMessages(options.messages);
|
|
264
|
-
|
|
265
|
-
let result;
|
|
266
|
-
try {
|
|
267
|
-
result = await this.client.chat.completions
|
|
268
|
-
.create(
|
|
269
|
-
{
|
|
270
|
-
model: options.model,
|
|
271
|
-
messages: openaiMessages,
|
|
272
|
-
max_tokens: options.max_tokens,
|
|
273
|
-
...(OpenAiReasoningModels.includes(options.model) &&
|
|
274
|
-
!this.isReasoningDisabled(options) && {
|
|
275
|
-
max_tokens: undefined,
|
|
276
|
-
max_completion_tokens: Math.max(
|
|
277
|
-
options.max_tokens ?? 0,
|
|
278
|
-
16_000
|
|
279
|
-
),
|
|
280
|
-
reasoning_effort: this.resolveReasoningEffort(options),
|
|
281
|
-
}),
|
|
282
|
-
...(options.tools?.length && {
|
|
283
|
-
tools: options.tools,
|
|
284
|
-
tool_choice: options.tool_choice ?? "auto",
|
|
285
|
-
}),
|
|
286
|
-
},
|
|
287
|
-
{ signal: options.signal }
|
|
288
|
-
)
|
|
289
|
-
.withResponse();
|
|
290
|
-
} catch (error) {
|
|
291
|
-
this.emitErrorMetadata(options, error);
|
|
292
|
-
throw error;
|
|
293
|
-
}
|
|
294
|
-
const { data: response, response: nativeResponse, request_id } = result;
|
|
295
|
-
emitResponseMetadata(options, {
|
|
296
|
-
statusCode: nativeResponse.status,
|
|
297
|
-
headers: nativeResponse.headers,
|
|
298
|
-
requestId: request_id,
|
|
299
|
-
});
|
|
300
|
-
|
|
301
|
-
const usdCost = this.calculateCost(options.model, response.usage);
|
|
302
|
-
|
|
303
|
-
return {
|
|
304
|
-
choices: response.choices.map((choice) => ({
|
|
305
|
-
message: {
|
|
306
|
-
role: choice.message?.role || "assistant",
|
|
307
|
-
content: choice.message?.content || null,
|
|
308
|
-
tool_calls: choice.message?.tool_calls
|
|
309
|
-
? choice.message.tool_calls
|
|
310
|
-
: undefined,
|
|
311
|
-
},
|
|
312
|
-
})),
|
|
313
|
-
|
|
314
|
-
model: options.model,
|
|
315
|
-
usage: response.usage
|
|
316
|
-
? {
|
|
317
|
-
prompt_tokens: response.usage.prompt_tokens ?? 0,
|
|
318
|
-
completion_tokens: response.usage.completion_tokens ?? 0,
|
|
319
|
-
total_tokens: response.usage.total_tokens,
|
|
320
|
-
prompt_tokens_details: {
|
|
321
|
-
cached_tokens:
|
|
322
|
-
response.usage.prompt_tokens_details?.cached_tokens ?? 0,
|
|
323
|
-
},
|
|
324
|
-
...(response.usage.completion_tokens_details?.reasoning_tokens !=
|
|
325
|
-
null && {
|
|
326
|
-
output_tokens_details: {
|
|
327
|
-
reasoning_tokens:
|
|
328
|
-
response.usage.completion_tokens_details.reasoning_tokens,
|
|
329
|
-
},
|
|
330
|
-
}),
|
|
331
|
-
}
|
|
332
|
-
: undefined,
|
|
333
|
-
usd_cost: usdCost,
|
|
334
|
-
};
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
/**
|
|
338
|
-
* Streams a chat completion token-by-token.
|
|
339
|
-
* Yields delta content strings as they arrive, then yields a final
|
|
340
|
-
* CompletionResponse with usage info when the stream ends.
|
|
341
|
-
*/
|
|
342
|
-
async *createChatCompletionStream(
|
|
343
|
-
options: CompletionOptions
|
|
344
|
-
): AsyncGenerator<{
|
|
345
|
-
delta?: string;
|
|
346
|
-
done: boolean;
|
|
347
|
-
usage?: CompletionResponse["usage"];
|
|
348
|
-
usd_cost?: number;
|
|
349
|
-
}> {
|
|
350
|
-
if (OpenAiResponsesOnlyModels.includes(options.model)) {
|
|
351
|
-
// Fallback: non-streaming for Responses-only models
|
|
352
|
-
const result = await this.createChatCompletion(options);
|
|
353
|
-
yield { delta: result.choices[0]?.message?.content ?? "", done: false };
|
|
354
|
-
yield { done: true, usage: result.usage, usd_cost: result.usd_cost };
|
|
355
|
-
return;
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
const openaiMessages = this.toChatCompletionMessages(options.messages);
|
|
359
|
-
|
|
360
|
-
let result;
|
|
361
|
-
try {
|
|
362
|
-
result = await this.client.chat.completions
|
|
363
|
-
.create(
|
|
364
|
-
{
|
|
365
|
-
model: options.model,
|
|
366
|
-
messages: openaiMessages,
|
|
367
|
-
max_tokens: options.max_tokens,
|
|
368
|
-
stream: true,
|
|
369
|
-
stream_options: { include_usage: true },
|
|
370
|
-
...(options.tools?.length && {
|
|
371
|
-
tools: options.tools,
|
|
372
|
-
tool_choice: options.tool_choice ?? "auto",
|
|
373
|
-
}),
|
|
374
|
-
},
|
|
375
|
-
{ signal: options.signal }
|
|
376
|
-
)
|
|
377
|
-
.withResponse();
|
|
378
|
-
} catch (error) {
|
|
379
|
-
this.emitErrorMetadata(options, error);
|
|
380
|
-
throw error;
|
|
381
|
-
}
|
|
382
|
-
const { data: stream, response: nativeResponse, request_id } = result;
|
|
383
|
-
emitResponseMetadata(options, {
|
|
384
|
-
statusCode: nativeResponse.status,
|
|
385
|
-
headers: nativeResponse.headers,
|
|
386
|
-
requestId: request_id,
|
|
387
|
-
});
|
|
388
|
-
|
|
389
|
-
let usage: CompletionResponse["usage"] | undefined;
|
|
390
|
-
for await (const chunk of stream) {
|
|
391
|
-
const delta = chunk.choices[0]?.delta?.content;
|
|
392
|
-
if (delta) {
|
|
393
|
-
yield { delta, done: false };
|
|
394
|
-
}
|
|
395
|
-
if (chunk.usage) {
|
|
396
|
-
usage = {
|
|
397
|
-
prompt_tokens: chunk.usage.prompt_tokens ?? 0,
|
|
398
|
-
completion_tokens: chunk.usage.completion_tokens ?? 0,
|
|
399
|
-
total_tokens: chunk.usage.total_tokens ?? 0,
|
|
400
|
-
};
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
const usdCost = usage
|
|
404
|
-
? this.calculateCost(
|
|
405
|
-
options.model,
|
|
406
|
-
usage as OpenAI.ChatCompletion["usage"]
|
|
407
|
-
)
|
|
408
|
-
: undefined;
|
|
409
|
-
yield { done: true, usage, usd_cost: usdCost };
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
/**
|
|
413
|
-
* Creates a completion using the OpenAI Responses API.
|
|
414
|
-
* Used for models that only support the Responses API (e.g. gpt-5.3-codex, gpt-5.4).
|
|
415
|
-
* Translates Chat Completions message format to Responses API format and maps the
|
|
416
|
-
* response back to CompletionResponse.
|
|
417
|
-
*/
|
|
418
|
-
/**
|
|
419
|
-
* Attempts to repair truncated JSON arguments from the Responses API.
|
|
420
|
-
* Codex sometimes returns function_call arguments with truncated JSON strings.
|
|
421
|
-
* This tries to close open strings/objects to produce valid JSON.
|
|
422
|
-
*/
|
|
423
|
-
private repairTruncatedJson(args: string): string {
|
|
424
|
-
try {
|
|
425
|
-
JSON.parse(args);
|
|
426
|
-
return args; // Already valid
|
|
427
|
-
} catch {
|
|
428
|
-
// Try to repair by closing open structures
|
|
429
|
-
let repaired = args.trimEnd();
|
|
430
|
-
// Count open/close braces and brackets
|
|
431
|
-
let depth = 0;
|
|
432
|
-
let inString = false;
|
|
433
|
-
let escaped = false;
|
|
434
|
-
for (const ch of repaired) {
|
|
435
|
-
if (escaped) {
|
|
436
|
-
escaped = false;
|
|
437
|
-
continue;
|
|
438
|
-
}
|
|
439
|
-
if (ch === "\\" && inString) {
|
|
440
|
-
escaped = true;
|
|
441
|
-
continue;
|
|
442
|
-
}
|
|
443
|
-
if (ch === '"') {
|
|
444
|
-
inString = !inString;
|
|
445
|
-
continue;
|
|
446
|
-
}
|
|
447
|
-
if (!inString) {
|
|
448
|
-
if (ch === "{" || ch === "[") depth++;
|
|
449
|
-
else if (ch === "}" || ch === "]") depth--;
|
|
450
|
-
}
|
|
451
|
-
}
|
|
452
|
-
// If we're inside a string, close it
|
|
453
|
-
if (inString) repaired += '"';
|
|
454
|
-
// Close any open objects/arrays
|
|
455
|
-
for (let i = 0; i < depth; i++) repaired += "}";
|
|
456
|
-
try {
|
|
457
|
-
JSON.parse(repaired);
|
|
458
|
-
return repaired;
|
|
459
|
-
} catch {
|
|
460
|
-
return args; // Return original if repair failed
|
|
461
|
-
}
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
/**
|
|
466
|
-
* Resolve the OpenAI-native reasoning items to re-inject for an assistant
|
|
467
|
-
* message. Reads the provider-agnostic `_reasoning_details` slot (only when
|
|
468
|
-
* it was produced by this provider) and falls back to the deprecated
|
|
469
|
-
* `_reasoning_items` for backward compatibility.
|
|
470
|
-
*/
|
|
471
|
-
private getReasoningItems(msg: any): any[] {
|
|
472
|
-
const details = (msg as any)._reasoning_details;
|
|
473
|
-
if (
|
|
474
|
-
details &&
|
|
475
|
-
details.provider === "openai" &&
|
|
476
|
-
Array.isArray(details.items)
|
|
477
|
-
) {
|
|
478
|
-
return details.items;
|
|
479
|
-
}
|
|
480
|
-
return (msg as any)._reasoning_items ?? [];
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
async createChatResponse(
|
|
484
|
-
options: CompletionOptions
|
|
485
|
-
): Promise<CompletionResponse> {
|
|
486
|
-
// Extract system message to use as instructions
|
|
487
|
-
const systemMessages = options.messages.filter((m) => m.role === "system");
|
|
488
|
-
const nonSystemMessages = options.messages.filter(
|
|
489
|
-
(m) => m.role !== "system"
|
|
490
|
-
);
|
|
491
|
-
const instructions =
|
|
492
|
-
systemMessages
|
|
493
|
-
.map((m) => (typeof m.content === "string" ? m.content : ""))
|
|
494
|
-
.join("\n")
|
|
495
|
-
.trim() || undefined;
|
|
496
|
-
|
|
497
|
-
// Convert chat messages to Responses API input items
|
|
498
|
-
// The Responses API accepts: user/assistant/system messages and function_call_output items
|
|
499
|
-
// OpenAI Responses API hard limit: 10,485,760 chars per function_call_output.output
|
|
500
|
-
const MAX_TOOL_OUTPUT = 10_485_000;
|
|
501
|
-
const truncateToolOutput = (s: string) =>
|
|
502
|
-
s.length > MAX_TOOL_OUTPUT
|
|
503
|
-
? s.slice(0, MAX_TOOL_OUTPUT) +
|
|
504
|
-
"\n\n[TRUNCATED: output exceeded 10MB API limit]"
|
|
505
|
-
: s;
|
|
506
|
-
const input: any[] = nonSystemMessages
|
|
507
|
-
.map((msg) => {
|
|
508
|
-
if (msg.role === "tool") {
|
|
509
|
-
// OpenAI function outputs cannot directly contain image content. Send
|
|
510
|
-
// the required function output, then attach images as a user message.
|
|
511
|
-
const parts = Array.isArray(msg.content) ? msg.content : [];
|
|
512
|
-
const imageParts = parts.filter((part) => part.type === "image_url");
|
|
513
|
-
const text = parts
|
|
514
|
-
.filter((part) => part.type === "text")
|
|
515
|
-
.map((part: any) => part.text)
|
|
516
|
-
.join("\n");
|
|
517
|
-
const toolOutput = {
|
|
518
|
-
type: "function_call_output",
|
|
519
|
-
call_id: msg.tool_call_id,
|
|
520
|
-
output: truncateToolOutput(
|
|
521
|
-
typeof msg.content === "string"
|
|
522
|
-
? msg.content
|
|
523
|
-
: text || "Image output attached in the following user message."
|
|
524
|
-
),
|
|
525
|
-
};
|
|
526
|
-
if (!imageParts.length) return toolOutput;
|
|
527
|
-
return [
|
|
528
|
-
toolOutput,
|
|
529
|
-
{ role: "user", content: this.toResponseContent(imageParts) },
|
|
530
|
-
];
|
|
531
|
-
}
|
|
532
|
-
if (msg.role === "assistant" && msg.tool_calls?.length) {
|
|
533
|
-
// assistant message with tool calls → function_call items.
|
|
534
|
-
// If the prior turn captured reasoning items (encrypted_content path),
|
|
535
|
-
// re-inject them *before* the function_call items so the model keeps its
|
|
536
|
-
// chain-of-thought instead of re-deriving it from scratch.
|
|
537
|
-
const reasoningItems = this.getReasoningItems(msg);
|
|
538
|
-
return [
|
|
539
|
-
...reasoningItems,
|
|
540
|
-
...msg.tool_calls.map((tc) => ({
|
|
541
|
-
type: "function_call",
|
|
542
|
-
// id must start with 'fc_'; call_id is the original call_ ID used for function_call_output matching
|
|
543
|
-
id: tc.id.startsWith("fc") ? tc.id : `fc_${tc.id}`,
|
|
544
|
-
call_id: tc.id,
|
|
545
|
-
name: tc.function.name,
|
|
546
|
-
arguments: tc.function.arguments,
|
|
547
|
-
})),
|
|
548
|
-
];
|
|
549
|
-
}
|
|
550
|
-
if (msg.role === "assistant" && this.getReasoningItems(msg).length) {
|
|
551
|
-
// assistant message (no tool calls) that carried reasoning items →
|
|
552
|
-
// re-inject reasoning items, then the visible message content.
|
|
553
|
-
return [
|
|
554
|
-
...this.getReasoningItems(msg),
|
|
555
|
-
{
|
|
556
|
-
role: msg.role,
|
|
557
|
-
content: this.toResponseContent(msg.content),
|
|
558
|
-
},
|
|
559
|
-
];
|
|
560
|
-
}
|
|
561
|
-
// Regular user/assistant message
|
|
562
|
-
return {
|
|
563
|
-
role: msg.role,
|
|
564
|
-
content: this.toResponseContent(msg.content),
|
|
565
|
-
};
|
|
566
|
-
})
|
|
567
|
-
.flat();
|
|
568
|
-
|
|
569
|
-
// Convert Chat Completions tool definitions to Responses API FunctionTool format
|
|
570
|
-
const tools = options.tools?.map((tool) => ({
|
|
571
|
-
type: "function" as const,
|
|
572
|
-
name: tool.function.name,
|
|
573
|
-
description: tool.function.description,
|
|
574
|
-
parameters: tool.function.parameters as Record<string, unknown>,
|
|
575
|
-
strict: false,
|
|
576
|
-
}));
|
|
577
|
-
|
|
578
|
-
// Reasoning persistence:
|
|
579
|
-
// - store === true → OpenAI persists the response server-side; the next
|
|
580
|
-
// turn passes previous_response_id to continue the reasoning chain.
|
|
581
|
-
// - store !== true → stateless; ask OpenAI to return encrypted reasoning
|
|
582
|
-
// content so we can thread it back into the next request's input ourselves.
|
|
583
|
-
const store = options.store === true;
|
|
584
|
-
const wantsReasoning =
|
|
585
|
-
OpenAiReasoningModels.includes(options.model) &&
|
|
586
|
-
!this.isReasoningDisabled(options);
|
|
587
|
-
|
|
588
|
-
let result;
|
|
589
|
-
try {
|
|
590
|
-
result = await this.client.responses
|
|
591
|
-
.create({
|
|
592
|
-
model: options.model as any,
|
|
593
|
-
input,
|
|
594
|
-
...(instructions && { instructions }),
|
|
595
|
-
...(store && { store: true }),
|
|
596
|
-
...(!store && { store: false }),
|
|
597
|
-
...(options.previous_response_id && {
|
|
598
|
-
previous_response_id: options.previous_response_id,
|
|
599
|
-
}),
|
|
600
|
-
// When stateless, request encrypted reasoning so we can re-inject it next turn.
|
|
601
|
-
...(!store &&
|
|
602
|
-
wantsReasoning && {
|
|
603
|
-
include: ["reasoning.encrypted_content"],
|
|
604
|
-
}),
|
|
605
|
-
// Don't limit max_output_tokens for Responses API - codex truncates tool call arguments when limited
|
|
606
|
-
...(OpenAiReasoningModels.includes(options.model) && {
|
|
607
|
-
reasoning: {
|
|
608
|
-
...(this.isReasoningDisabled(options)
|
|
609
|
-
? { effort: "none" }
|
|
610
|
-
: {
|
|
611
|
-
effort: this.resolveReasoningEffortForModel(options),
|
|
612
|
-
...(options.reasoning_summary && { summary: "auto" }),
|
|
613
|
-
}),
|
|
614
|
-
},
|
|
615
|
-
}),
|
|
616
|
-
...(wantsReasoning && {
|
|
617
|
-
max_output_tokens: Math.max(options.max_tokens || 0, 16000),
|
|
618
|
-
}),
|
|
619
|
-
...(tools?.length && {
|
|
620
|
-
tools,
|
|
621
|
-
tool_choice: options.tool_choice ?? "auto",
|
|
622
|
-
}),
|
|
623
|
-
} as any)
|
|
624
|
-
.withResponse();
|
|
625
|
-
} catch (error) {
|
|
626
|
-
this.emitErrorMetadata(options, error);
|
|
627
|
-
throw error;
|
|
628
|
-
}
|
|
629
|
-
const { data: response, response: nativeResponse, request_id } = result;
|
|
630
|
-
emitResponseMetadata(options, {
|
|
631
|
-
statusCode: nativeResponse.status,
|
|
632
|
-
headers: nativeResponse.headers,
|
|
633
|
-
requestId: request_id,
|
|
634
|
-
});
|
|
635
|
-
|
|
636
|
-
// Map Responses API usage to Chat Completions usage format
|
|
637
|
-
const usage = response.usage
|
|
638
|
-
? {
|
|
639
|
-
prompt_tokens: response.usage.input_tokens,
|
|
640
|
-
completion_tokens: response.usage.output_tokens,
|
|
641
|
-
total_tokens:
|
|
642
|
-
response.usage.input_tokens + response.usage.output_tokens,
|
|
643
|
-
prompt_tokens_details: {
|
|
644
|
-
cached_tokens:
|
|
645
|
-
response.usage.input_tokens_details?.cached_tokens ?? 0,
|
|
646
|
-
},
|
|
647
|
-
...((response.usage as any).output_tokens_details?.reasoning_tokens !=
|
|
648
|
-
null && {
|
|
649
|
-
output_tokens_details: {
|
|
650
|
-
reasoning_tokens: (response.usage as any).output_tokens_details
|
|
651
|
-
.reasoning_tokens,
|
|
652
|
-
},
|
|
653
|
-
}),
|
|
654
|
-
}
|
|
655
|
-
: undefined;
|
|
656
|
-
|
|
657
|
-
const usdCost = usage
|
|
658
|
-
? this.calculateCost(options.model, usage)
|
|
659
|
-
: undefined;
|
|
660
|
-
|
|
661
|
-
// Collect text content and tool calls from the output items
|
|
662
|
-
let textContent: string | null = null;
|
|
663
|
-
const toolCalls: ChatCompletionMessageToolCall[] = [];
|
|
664
|
-
// Reasoning items (with encrypted_content) to thread back into the next turn,
|
|
665
|
-
// and a human-readable summary of the model's thinking (when requested).
|
|
666
|
-
const reasoningItems: any[] = [];
|
|
667
|
-
let reasoningSummary: string | null = null;
|
|
668
|
-
|
|
669
|
-
for (const item of response.output) {
|
|
670
|
-
if (item.type === "message") {
|
|
671
|
-
// ResponseOutputMessage
|
|
672
|
-
const msgItem = item as any;
|
|
673
|
-
for (const part of msgItem.content ?? []) {
|
|
674
|
-
if (part.type === "output_text") {
|
|
675
|
-
textContent = (textContent ?? "") + part.text;
|
|
676
|
-
}
|
|
677
|
-
}
|
|
678
|
-
} else if (item.type === "reasoning") {
|
|
679
|
-
// ResponseReasoningItem — keep the raw item so we can re-inject it
|
|
680
|
-
// (it carries encrypted_content when include was requested), and pull
|
|
681
|
-
// out any human-readable summary text.
|
|
682
|
-
reasoningItems.push(item);
|
|
683
|
-
const summaryParts = (item as any).summary ?? [];
|
|
684
|
-
for (const part of summaryParts) {
|
|
685
|
-
const text = typeof part === "string" ? part : part?.text;
|
|
686
|
-
if (text) {
|
|
687
|
-
reasoningSummary = (reasoningSummary ?? "") + text;
|
|
688
|
-
}
|
|
689
|
-
}
|
|
690
|
-
} else if (item.type === "function_call") {
|
|
691
|
-
// ResponseFunctionToolCall
|
|
692
|
-
const fc = item as ResponseFunctionToolCall;
|
|
693
|
-
const repairedArgs = this.repairTruncatedJson(fc.arguments);
|
|
694
|
-
// Validate at the boundary - log if still invalid after repair
|
|
695
|
-
try {
|
|
696
|
-
JSON.parse(repairedArgs);
|
|
697
|
-
} catch (e) {
|
|
698
|
-
console.warn(
|
|
699
|
-
`[Responses API] Invalid JSON arguments for ${fc.name} after repair: ${e.message}`
|
|
700
|
-
);
|
|
701
|
-
}
|
|
702
|
-
toolCalls.push({
|
|
703
|
-
// Store call_id so function_call_output.call_id matches it in subsequent turns
|
|
704
|
-
id: fc.call_id,
|
|
705
|
-
type: "function",
|
|
706
|
-
function: {
|
|
707
|
-
name: fc.name,
|
|
708
|
-
arguments: repairedArgs,
|
|
709
|
-
},
|
|
710
|
-
});
|
|
711
|
-
}
|
|
712
|
-
}
|
|
713
|
-
|
|
714
|
-
// Tool-only responses are valid agent turns. Warn only when the response
|
|
715
|
-
// contains neither visible text nor any callable output, and include enough
|
|
716
|
-
// provider metadata to diagnose incomplete or reasoning-only responses.
|
|
717
|
-
if (!textContent?.trim() && toolCalls.length === 0) {
|
|
718
|
-
const outputShape = response.output.map((item: any) => ({
|
|
719
|
-
type: item.type,
|
|
720
|
-
contentTypes: Array.isArray(item.content)
|
|
721
|
-
? item.content.map((part: any) => part?.type ?? typeof part)
|
|
722
|
-
: [],
|
|
723
|
-
}));
|
|
724
|
-
const reasoningSummaryCount = response.output
|
|
725
|
-
.filter((item: any) => item.type === "reasoning")
|
|
726
|
-
.reduce(
|
|
727
|
-
(count: number, item: any) =>
|
|
728
|
-
count + (Array.isArray(item.summary) ? item.summary.length : 0),
|
|
729
|
-
0
|
|
730
|
-
);
|
|
731
|
-
console.warn("[Responses API] Response contained no text or tool calls", {
|
|
732
|
-
responseId: (response as any).id,
|
|
733
|
-
status: (response as any).status,
|
|
734
|
-
incompleteDetails: (response as any).incomplete_details,
|
|
735
|
-
outputShape,
|
|
736
|
-
reasoningSummaryCount,
|
|
737
|
-
usage: response.usage,
|
|
738
|
-
});
|
|
739
|
-
}
|
|
740
|
-
|
|
741
|
-
return {
|
|
742
|
-
choices: [
|
|
743
|
-
{
|
|
744
|
-
message: {
|
|
745
|
-
role: "assistant",
|
|
746
|
-
content: textContent,
|
|
747
|
-
...(toolCalls.length > 0 && { tool_calls: toolCalls }),
|
|
748
|
-
...(reasoningSummary && { reasoning_summary: reasoningSummary }),
|
|
749
|
-
// Stash the raw reasoning items (encrypted_content) so the next call
|
|
750
|
-
// to createChatResponse can re-inject them into the input. We populate
|
|
751
|
-
// both the provider-agnostic slot and the deprecated legacy field.
|
|
752
|
-
...(reasoningItems.length > 0 && {
|
|
753
|
-
_reasoning_items: reasoningItems,
|
|
754
|
-
_reasoning_details: { provider: "openai", items: reasoningItems },
|
|
755
|
-
}),
|
|
756
|
-
},
|
|
757
|
-
},
|
|
758
|
-
],
|
|
759
|
-
model: options.model,
|
|
760
|
-
usage,
|
|
761
|
-
usd_cost: usdCost,
|
|
762
|
-
response_id: (response as any).id,
|
|
763
|
-
};
|
|
764
|
-
}
|
|
765
|
-
|
|
766
|
-
pricesPerMillion() {
|
|
767
|
-
return OpenAiTextPricing;
|
|
768
|
-
}
|
|
769
|
-
|
|
770
|
-
getPricing(
|
|
771
|
-
model?: string
|
|
772
|
-
):
|
|
773
|
-
| import("./pricing/types").ModelPricing
|
|
774
|
-
| Record<string, import("./pricing/types").ModelPricing>
|
|
775
|
-
| undefined {
|
|
776
|
-
if (model !== undefined) {
|
|
777
|
-
return OpenAiTextPricing[model as keyof typeof OpenAiTextPricing] as
|
|
778
|
-
| import("./pricing/types").ModelPricing
|
|
779
|
-
| undefined;
|
|
780
|
-
}
|
|
781
|
-
return OpenAiTextPricing as unknown as Record<
|
|
782
|
-
string,
|
|
783
|
-
import("./pricing/types").ModelPricing
|
|
784
|
-
>;
|
|
785
|
-
}
|
|
786
|
-
|
|
787
|
-
calculateCost(
|
|
788
|
-
model: string,
|
|
789
|
-
usage:
|
|
790
|
-
| OpenAI.ChatCompletion["usage"]
|
|
791
|
-
| OpenAI.CreateEmbeddingResponse["usage"]
|
|
792
|
-
): number | undefined {
|
|
793
|
-
const pricing = this.pricesPerMillion()[model] || OpenAiTextPricing[model];
|
|
794
|
-
|
|
795
|
-
if (!pricing) {
|
|
796
|
-
return undefined;
|
|
797
|
-
}
|
|
798
|
-
|
|
799
|
-
const cachedInputTokens =
|
|
800
|
-
("prompt_tokens_details" in usage &&
|
|
801
|
-
usage.prompt_tokens_details?.cached_tokens) ||
|
|
802
|
-
0;
|
|
803
|
-
const cachedInputCost =
|
|
804
|
-
(cachedInputTokens * (pricing.cached_input ?? 0)) / 1e6;
|
|
805
|
-
|
|
806
|
-
const inputTokens = usage.prompt_tokens;
|
|
807
|
-
const inputCost =
|
|
808
|
-
((inputTokens - cachedInputTokens) * (pricing.input ?? 0)) / 1e6;
|
|
809
|
-
|
|
810
|
-
const outputTokens =
|
|
811
|
-
("completion_tokens" in usage && usage?.completion_tokens) || 0;
|
|
812
|
-
const outputCost = (outputTokens * (pricing.output ?? 0)) / 1e6;
|
|
813
|
-
|
|
814
|
-
const total = cachedInputCost + inputCost + outputCost;
|
|
815
|
-
return total;
|
|
816
|
-
}
|
|
817
|
-
|
|
818
|
-
async getModels(modality?: ModelModality): Promise<{ id: string }[]> {
|
|
819
|
-
if (modality) {
|
|
820
|
-
const map: Partial<Record<ModelModality, string[]>> = {
|
|
821
|
-
completion: [
|
|
822
|
-
...new Set([...OpenAiChatModels, ...OpenAiResponsesOnlyModels]),
|
|
823
|
-
],
|
|
824
|
-
embedding: OpenAiEmbeddingModelsList,
|
|
825
|
-
image: OpenAiImageModels,
|
|
826
|
-
audio: [...OpenAiTTSModels, ...OpenAiTranscriptionModels],
|
|
827
|
-
transcription: OpenAiTranscriptionModels,
|
|
828
|
-
video: OpenAiVideoModels,
|
|
829
|
-
};
|
|
830
|
-
return (map[modality] ?? []).map((id) => ({ id }));
|
|
831
|
-
}
|
|
832
|
-
// No modality — live API call (backward compat)
|
|
833
|
-
const models = await this.client.models.list();
|
|
834
|
-
return models.data.map((m) => ({
|
|
835
|
-
id: m.id,
|
|
836
|
-
}));
|
|
837
|
-
}
|
|
838
|
-
|
|
839
|
-
async createEmbedding(options: EmbeddingOptions): Promise<EmbeddingResponse> {
|
|
840
|
-
let result;
|
|
841
|
-
try {
|
|
842
|
-
result = await this.client.embeddings
|
|
843
|
-
.create({
|
|
844
|
-
input: options.input,
|
|
845
|
-
model: options.model,
|
|
846
|
-
})
|
|
847
|
-
.withResponse();
|
|
848
|
-
} catch (error) {
|
|
849
|
-
this.emitErrorMetadata(options, error);
|
|
850
|
-
throw error;
|
|
851
|
-
}
|
|
852
|
-
const {
|
|
853
|
-
data: openAiEmbedding,
|
|
854
|
-
response: nativeResponse,
|
|
855
|
-
request_id,
|
|
856
|
-
} = result;
|
|
857
|
-
emitResponseMetadata(options, {
|
|
858
|
-
statusCode: nativeResponse.status,
|
|
859
|
-
headers: nativeResponse.headers,
|
|
860
|
-
requestId: request_id,
|
|
861
|
-
});
|
|
862
|
-
|
|
863
|
-
return {
|
|
864
|
-
data: openAiEmbedding.data,
|
|
865
|
-
model: options.model,
|
|
866
|
-
usage: openAiEmbedding.usage,
|
|
867
|
-
usd_cost: this.calculateCost(options.model, openAiEmbedding.usage),
|
|
868
|
-
};
|
|
869
|
-
}
|
|
870
|
-
|
|
871
|
-
async createAudioTranscription(
|
|
872
|
-
options: AudioTranscriptionOptions
|
|
873
|
-
): Promise<AudioTranscriptionResponse> {
|
|
874
|
-
// Convert Buffer to File if needed
|
|
875
|
-
let file = options.file;
|
|
876
|
-
if (Buffer.isBuffer(options.file)) {
|
|
877
|
-
const fileName = options.fileName || "audio.mp3";
|
|
878
|
-
file = await OpenAI.toFile(options.file, fileName);
|
|
879
|
-
}
|
|
880
|
-
|
|
881
|
-
let result;
|
|
882
|
-
try {
|
|
883
|
-
result = await this.client.audio.transcriptions
|
|
884
|
-
.create(
|
|
885
|
-
{
|
|
886
|
-
file,
|
|
887
|
-
model: options.model || "whisper-1",
|
|
888
|
-
language: options.language,
|
|
889
|
-
prompt: options.prompt,
|
|
890
|
-
response_format: options.response_format || "verbose_json",
|
|
891
|
-
temperature: options.temperature,
|
|
892
|
-
},
|
|
893
|
-
{ signal: options.signal }
|
|
894
|
-
)
|
|
895
|
-
.withResponse();
|
|
896
|
-
} catch (error) {
|
|
897
|
-
this.emitErrorMetadata(options, error);
|
|
898
|
-
throw error;
|
|
899
|
-
}
|
|
900
|
-
const { data: response, response: nativeResponse, request_id } = result;
|
|
901
|
-
emitResponseMetadata(options, {
|
|
902
|
-
statusCode: nativeResponse.status,
|
|
903
|
-
headers: nativeResponse.headers,
|
|
904
|
-
requestId: request_id,
|
|
905
|
-
});
|
|
906
|
-
|
|
907
|
-
// Calculate cost: $0.006 per minute for Whisper
|
|
908
|
-
const duration =
|
|
909
|
-
typeof response === "object" &&
|
|
910
|
-
"duration" in response &&
|
|
911
|
-
typeof response.duration === "number"
|
|
912
|
-
? response.duration
|
|
913
|
-
: undefined;
|
|
914
|
-
const usdCost = duration ? (duration / 60) * 0.006 : undefined;
|
|
915
|
-
|
|
916
|
-
if (typeof response === "string") {
|
|
917
|
-
return {
|
|
918
|
-
text: response,
|
|
919
|
-
usd_cost: usdCost,
|
|
920
|
-
};
|
|
921
|
-
}
|
|
922
|
-
|
|
923
|
-
// Cast to any to access verbose response properties
|
|
924
|
-
const verboseResponse = response as any;
|
|
925
|
-
|
|
926
|
-
return {
|
|
927
|
-
text: response.text,
|
|
928
|
-
language: verboseResponse.language,
|
|
929
|
-
duration: verboseResponse.duration,
|
|
930
|
-
segments: verboseResponse.segments,
|
|
931
|
-
usd_cost: usdCost,
|
|
932
|
-
};
|
|
933
|
-
}
|
|
934
|
-
|
|
935
|
-
async createAudioGeneration(
|
|
936
|
-
options: AudioGenerationOptions
|
|
937
|
-
): Promise<AudioGenerationResponse> {
|
|
938
|
-
let result;
|
|
939
|
-
try {
|
|
940
|
-
result = await this.client.audio.speech
|
|
941
|
-
.create(
|
|
942
|
-
{
|
|
943
|
-
model: options.model,
|
|
944
|
-
input: options.input,
|
|
945
|
-
voice: options.voice as any,
|
|
946
|
-
response_format: options.response_format || "mp3",
|
|
947
|
-
speed: options.speed,
|
|
948
|
-
},
|
|
949
|
-
{ signal: options.signal }
|
|
950
|
-
)
|
|
951
|
-
.withResponse();
|
|
952
|
-
} catch (error) {
|
|
953
|
-
this.emitErrorMetadata(options, error);
|
|
954
|
-
throw error;
|
|
955
|
-
}
|
|
956
|
-
const { data: response, response: nativeResponse, request_id } = result;
|
|
957
|
-
emitResponseMetadata(options, {
|
|
958
|
-
statusCode: nativeResponse.status,
|
|
959
|
-
headers: nativeResponse.headers,
|
|
960
|
-
requestId: request_id,
|
|
961
|
-
});
|
|
962
|
-
|
|
963
|
-
const buffer = Buffer.from(await response.arrayBuffer());
|
|
964
|
-
|
|
965
|
-
// Calculate cost based on model and character count
|
|
966
|
-
// TTS: $15.00 / 1M characters, TTS HD: $30.00 / 1M characters
|
|
967
|
-
const isHD = options.model.includes("hd");
|
|
968
|
-
const pricePerMillion = isHD ? 30.0 : 15.0;
|
|
969
|
-
const usdCost = (options.input.length * pricePerMillion) / 1e6;
|
|
970
|
-
|
|
971
|
-
return {
|
|
972
|
-
audio: buffer,
|
|
973
|
-
format: options.response_format || "mp3",
|
|
974
|
-
usd_cost: usdCost,
|
|
975
|
-
};
|
|
976
|
-
}
|
|
977
|
-
|
|
978
|
-
async createImageGeneration(
|
|
979
|
-
options: ImageGenerationOptions
|
|
980
|
-
): Promise<ImageGenerationResponse> {
|
|
981
|
-
const response = await this.client.images.generate(
|
|
982
|
-
{
|
|
983
|
-
model: options.model,
|
|
984
|
-
prompt: options.prompt,
|
|
985
|
-
n: options.n,
|
|
986
|
-
size: options.size,
|
|
987
|
-
quality: options.quality,
|
|
988
|
-
style: options.style,
|
|
989
|
-
response_format: options.response_format,
|
|
990
|
-
user: options.user,
|
|
991
|
-
},
|
|
992
|
-
{ signal: options.signal }
|
|
993
|
-
);
|
|
994
|
-
|
|
995
|
-
// Cost calculation varies by model and settings
|
|
996
|
-
// DALL-E 3: $0.040-$0.120 per image depending on quality/size
|
|
997
|
-
// DALL-E 2: $0.016-$0.020 per image
|
|
998
|
-
const estimatedCostPerImage = options.quality === "hd" ? 0.08 : 0.04;
|
|
999
|
-
const usdCost = (options.n || 1) * estimatedCostPerImage;
|
|
1000
|
-
|
|
1001
|
-
return { ...response, usd_cost: usdCost };
|
|
1002
|
-
}
|
|
1003
|
-
|
|
1004
|
-
async createVideoGeneration(
|
|
1005
|
-
options: VideoGenerationOptions
|
|
1006
|
-
): Promise<VideoGenerationResponse> {
|
|
1007
|
-
const apiKey = this.apiKey || process.env.OPENAI_KEY;
|
|
1008
|
-
if (!apiKey) {
|
|
1009
|
-
throw new Error("OpenAI API key is required for video generation");
|
|
1010
|
-
}
|
|
1011
|
-
|
|
1012
|
-
const model = options.model || "sora-2";
|
|
1013
|
-
|
|
1014
|
-
// Step 1: Create the video job
|
|
1015
|
-
const createPayload: any = {
|
|
1016
|
-
model,
|
|
1017
|
-
prompt: options.prompt,
|
|
1018
|
-
};
|
|
1019
|
-
|
|
1020
|
-
if (options.duration) {
|
|
1021
|
-
// OpenAI API requires seconds as a string: '4', '8', or '12'
|
|
1022
|
-
// Round to nearest valid value
|
|
1023
|
-
const validSeconds = [4, 8, 12];
|
|
1024
|
-
const duration = options.duration as number;
|
|
1025
|
-
const nearest = validSeconds.reduce((prev, curr) =>
|
|
1026
|
-
Math.abs(curr - duration) < Math.abs(prev - duration) ? curr : prev
|
|
1027
|
-
);
|
|
1028
|
-
createPayload.seconds = String(nearest);
|
|
1029
|
-
}
|
|
1030
|
-
if (options.resolution) {
|
|
1031
|
-
createPayload.size = options.resolution;
|
|
1032
|
-
}
|
|
1033
|
-
if (options.n) {
|
|
1034
|
-
createPayload.n = options.n;
|
|
1035
|
-
}
|
|
1036
|
-
|
|
1037
|
-
const createResponse = await fetch("https://api.openai.com/v1/videos", {
|
|
1038
|
-
method: "POST",
|
|
1039
|
-
headers: {
|
|
1040
|
-
"Content-Type": "application/json",
|
|
1041
|
-
Authorization: `Bearer ${apiKey}`,
|
|
1042
|
-
},
|
|
1043
|
-
body: JSON.stringify(createPayload),
|
|
1044
|
-
});
|
|
1045
|
-
|
|
1046
|
-
if (!createResponse.ok) {
|
|
1047
|
-
const errorText = await createResponse.text();
|
|
1048
|
-
throw new Error(
|
|
1049
|
-
`OpenAI video generation failed: ${createResponse.status} ${errorText}`
|
|
1050
|
-
);
|
|
1051
|
-
}
|
|
1052
|
-
|
|
1053
|
-
const createData = await createResponse.json();
|
|
1054
|
-
const videoId = createData.id;
|
|
1055
|
-
|
|
1056
|
-
if (!videoId) {
|
|
1057
|
-
throw new Error("No video ID returned from OpenAI video generation");
|
|
1058
|
-
}
|
|
1059
|
-
|
|
1060
|
-
// Return immediately with the jobId – do NOT poll here.
|
|
1061
|
-
// Use getVideoStatus() to poll and downloadVideo() to fetch the result.
|
|
1062
|
-
return {
|
|
1063
|
-
created: createData.created_at || Math.floor(Date.now() / 1000),
|
|
1064
|
-
data: [],
|
|
1065
|
-
jobId: videoId,
|
|
1066
|
-
usd_cost: undefined,
|
|
1067
|
-
};
|
|
1068
|
-
}
|
|
1069
|
-
|
|
1070
|
-
async getVideoStatus(
|
|
1071
|
-
options: VideoStatusOptions
|
|
1072
|
-
): Promise<VideoStatusResponse> {
|
|
1073
|
-
const apiKey = this.apiKey || process.env.OPENAI_KEY;
|
|
1074
|
-
if (!apiKey) throw new Error("OpenAI API key not set");
|
|
1075
|
-
const response = await fetch(
|
|
1076
|
-
`https://api.openai.com/v1/videos/${options.jobId}`,
|
|
1077
|
-
{
|
|
1078
|
-
method: "GET",
|
|
1079
|
-
headers: { Authorization: `Bearer ${apiKey}` },
|
|
1080
|
-
}
|
|
1081
|
-
);
|
|
1082
|
-
if (!response.ok) {
|
|
1083
|
-
const errorText = await response.text();
|
|
1084
|
-
throw new Error(
|
|
1085
|
-
`OpenAI getVideoStatus failed: ${response.status} ${errorText}`
|
|
1086
|
-
);
|
|
1087
|
-
}
|
|
1088
|
-
const data = await response.json();
|
|
1089
|
-
let status: VideoStatusResponse["status"] = "in_progress";
|
|
1090
|
-
if (data.status === "completed") status = "completed";
|
|
1091
|
-
else if (data.status === "failed") status = "failed";
|
|
1092
|
-
else if (data.status === "queued") status = "queued";
|
|
1093
|
-
else if (data.status === "in_progress") status = "in_progress";
|
|
1094
|
-
return {
|
|
1095
|
-
jobId: options.jobId,
|
|
1096
|
-
status,
|
|
1097
|
-
data: data.result?.url ? [{ url: data.result.url }] : undefined,
|
|
1098
|
-
error: data.error?.message,
|
|
1099
|
-
};
|
|
1100
|
-
}
|
|
1101
|
-
|
|
1102
|
-
async downloadVideo(
|
|
1103
|
-
options: FileDownloadOptions
|
|
1104
|
-
): Promise<FileDownloadResponse> {
|
|
1105
|
-
const apiKey = this.apiKey || process.env.OPENAI_KEY;
|
|
1106
|
-
if (!apiKey) throw new Error("OpenAI API key not set");
|
|
1107
|
-
const fileId = options.fileId;
|
|
1108
|
-
if (!fileId) throw new Error("downloadVideo requires fileId (the jobId)");
|
|
1109
|
-
const response = await fetch(
|
|
1110
|
-
`https://api.openai.com/v1/videos/${fileId}/content`,
|
|
1111
|
-
{
|
|
1112
|
-
method: "GET",
|
|
1113
|
-
headers: { Authorization: `Bearer ${apiKey}` },
|
|
1114
|
-
}
|
|
1115
|
-
);
|
|
1116
|
-
if (!response.ok) {
|
|
1117
|
-
const errorText = await response.text();
|
|
1118
|
-
throw new Error(
|
|
1119
|
-
`OpenAI downloadVideo failed: ${response.status} ${errorText}`
|
|
1120
|
-
);
|
|
1121
|
-
}
|
|
1122
|
-
const mimeType = response.headers.get("content-type") || "video/mp4";
|
|
1123
|
-
return { data: Buffer.from(await response.arrayBuffer()), mimeType };
|
|
1124
|
-
}
|
|
1125
|
-
|
|
1126
|
-
async uploadFile(options: FileUploadOptions): Promise<FileUploadResponse> {
|
|
1127
|
-
const apiKey = this.apiKey || process.env.OPENAI_KEY;
|
|
1128
|
-
if (!apiKey) throw new Error("OpenAI API key not set");
|
|
1129
|
-
const formData = new FormData();
|
|
1130
|
-
formData.append("purpose", "assistants");
|
|
1131
|
-
const blob = new Blob([new Uint8Array(options.data)], {
|
|
1132
|
-
type: options.mimeType || "application/octet-stream",
|
|
1133
|
-
});
|
|
1134
|
-
formData.append("file", blob, options.fileName || "upload");
|
|
1135
|
-
const response = await fetch("https://api.openai.com/v1/files", {
|
|
1136
|
-
method: "POST",
|
|
1137
|
-
headers: { Authorization: `Bearer ${apiKey}` },
|
|
1138
|
-
body: formData,
|
|
1139
|
-
});
|
|
1140
|
-
if (!response.ok) {
|
|
1141
|
-
const errorText = await response.text();
|
|
1142
|
-
throw new Error(
|
|
1143
|
-
`OpenAI uploadFile failed: ${response.status} ${errorText}`
|
|
1144
|
-
);
|
|
1145
|
-
}
|
|
1146
|
-
const data = await response.json();
|
|
1147
|
-
return { fileId: data.id, uri: data.uri };
|
|
1148
|
-
}
|
|
1149
|
-
|
|
1150
|
-
async downloadFile(
|
|
1151
|
-
options: FileDownloadOptions
|
|
1152
|
-
): Promise<FileDownloadResponse> {
|
|
1153
|
-
const apiKey = this.apiKey || process.env.OPENAI_KEY;
|
|
1154
|
-
if (!apiKey) throw new Error("OpenAI API key not set");
|
|
1155
|
-
const fileId = options.fileId;
|
|
1156
|
-
if (!fileId) throw new Error("downloadFile requires fileId");
|
|
1157
|
-
const response = await fetch(
|
|
1158
|
-
`https://api.openai.com/v1/files/${fileId}/content`,
|
|
1159
|
-
{
|
|
1160
|
-
method: "GET",
|
|
1161
|
-
headers: { Authorization: `Bearer ${apiKey}` },
|
|
1162
|
-
}
|
|
1163
|
-
);
|
|
1164
|
-
if (!response.ok) {
|
|
1165
|
-
const errorText = await response.text();
|
|
1166
|
-
throw new Error(
|
|
1167
|
-
`OpenAI downloadFile failed: ${response.status} ${errorText}`
|
|
1168
|
-
);
|
|
1169
|
-
}
|
|
1170
|
-
const mimeType = response.headers.get("content-type") || undefined;
|
|
1171
|
-
const data = Buffer.from(await response.arrayBuffer());
|
|
1172
|
-
return { data, mimeType };
|
|
1173
|
-
}
|
|
1174
|
-
|
|
1175
|
-
getContextLimit(
|
|
1176
|
-
model: string
|
|
1177
|
-
): { contextLimit: number; threshold: number } | undefined {
|
|
1178
|
-
const contextLimit = ContextLimits[model];
|
|
1179
|
-
if (contextLimit === undefined) return undefined;
|
|
1180
|
-
const pricing = OpenAiTextPricing[model];
|
|
1181
|
-
// If the model has tiered pricing above 200k tokens, use 200k as the threshold
|
|
1182
|
-
const threshold =
|
|
1183
|
-
pricing && "input_gt_200k" in pricing ? 200_000 : contextLimit;
|
|
1184
|
-
return { contextLimit, threshold };
|
|
1185
|
-
}
|
|
1186
|
-
}
|