@qduc/term2 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/agent.d.ts +19 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +143 -0
- package/dist/agent.js.map +1 -0
- package/dist/app.d.ts +22 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +403 -0
- package/dist/app.js.map +1 -0
- package/dist/app.model-command-feedback.test.d.ts +2 -0
- package/dist/app.model-command-feedback.test.d.ts.map +1 -0
- package/dist/app.model-command-feedback.test.js +19 -0
- package/dist/app.model-command-feedback.test.js.map +1 -0
- package/dist/app.parseInput.test.d.ts +2 -0
- package/dist/app.parseInput.test.d.ts.map +1 -0
- package/dist/app.parseInput.test.js +97 -0
- package/dist/app.parseInput.test.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +241 -0
- package/dist/cli.js.map +1 -0
- package/dist/components/ApprovalPrompt.d.ts +10 -0
- package/dist/components/ApprovalPrompt.d.ts.map +1 -0
- package/dist/components/ApprovalPrompt.js +163 -0
- package/dist/components/ApprovalPrompt.js.map +1 -0
- package/dist/components/Banner.d.ts +9 -0
- package/dist/components/Banner.d.ts.map +1 -0
- package/dist/components/Banner.js +86 -0
- package/dist/components/Banner.js.map +1 -0
- package/dist/components/BottomArea.d.ts +33 -0
- package/dist/components/BottomArea.d.ts.map +1 -0
- package/dist/components/BottomArea.js +31 -0
- package/dist/components/BottomArea.js.map +1 -0
- package/dist/components/BottomArea.test.d.ts +2 -0
- package/dist/components/BottomArea.test.d.ts.map +1 -0
- package/dist/components/BottomArea.test.js +73 -0
- package/dist/components/BottomArea.test.js.map +1 -0
- package/dist/components/ChatMessage.d.ts +7 -0
- package/dist/components/ChatMessage.d.ts.map +1 -0
- package/dist/components/ChatMessage.js +10 -0
- package/dist/components/ChatMessage.js.map +1 -0
- package/dist/components/CommandMessage.d.ts +15 -0
- package/dist/components/CommandMessage.d.ts.map +1 -0
- package/dist/components/CommandMessage.js +188 -0
- package/dist/components/CommandMessage.js.map +1 -0
- package/dist/components/CommandMessage.test.d.ts +2 -0
- package/dist/components/CommandMessage.test.d.ts.map +1 -0
- package/dist/components/CommandMessage.test.js +35 -0
- package/dist/components/CommandMessage.test.js.map +1 -0
- package/dist/components/ErrorBoundary.d.ts +27 -0
- package/dist/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/components/ErrorBoundary.js +77 -0
- package/dist/components/ErrorBoundary.js.map +1 -0
- package/dist/components/ErrorBoundary.test.d.ts +2 -0
- package/dist/components/ErrorBoundary.test.d.ts.map +1 -0
- package/dist/components/ErrorBoundary.test.js +32 -0
- package/dist/components/ErrorBoundary.test.js.map +1 -0
- package/dist/components/Input/PopupManager.d.ts +42 -0
- package/dist/components/Input/PopupManager.d.ts.map +1 -0
- package/dist/components/Input/PopupManager.js +13 -0
- package/dist/components/Input/PopupManager.js.map +1 -0
- package/dist/components/InputBox.d.ts +18 -0
- package/dist/components/InputBox.d.ts.map +1 -0
- package/dist/components/InputBox.js +384 -0
- package/dist/components/InputBox.js.map +1 -0
- package/dist/components/InputBox.menu-logic.test.d.ts +2 -0
- package/dist/components/InputBox.menu-logic.test.d.ts.map +1 -0
- package/dist/components/InputBox.menu-logic.test.js +151 -0
- package/dist/components/InputBox.menu-logic.test.js.map +1 -0
- package/dist/components/InputBox.test.d.ts +2 -0
- package/dist/components/InputBox.test.d.ts.map +1 -0
- package/dist/components/InputBox.test.js +91 -0
- package/dist/components/InputBox.test.js.map +1 -0
- package/dist/components/LiveResponse.d.ts +13 -0
- package/dist/components/LiveResponse.d.ts.map +1 -0
- package/dist/components/LiveResponse.js +16 -0
- package/dist/components/LiveResponse.js.map +1 -0
- package/dist/components/MarkdownRenderer.d.ts +8 -0
- package/dist/components/MarkdownRenderer.d.ts.map +1 -0
- package/dist/components/MarkdownRenderer.js +225 -0
- package/dist/components/MarkdownRenderer.js.map +1 -0
- package/dist/components/MentorMode.test.d.ts +2 -0
- package/dist/components/MentorMode.test.d.ts.map +1 -0
- package/dist/components/MentorMode.test.js.map +1 -0
- package/dist/components/MessageList.d.ts +7 -0
- package/dist/components/MessageList.d.ts.map +1 -0
- package/dist/components/MessageList.js +29 -0
- package/dist/components/MessageList.js.map +1 -0
- package/dist/components/MessageList.test.d.ts +2 -0
- package/dist/components/MessageList.test.d.ts.map +1 -0
- package/dist/components/MessageList.test.js +15 -0
- package/dist/components/MessageList.test.js.map +1 -0
- package/dist/components/ModelSelectionMenu.d.ts +18 -0
- package/dist/components/ModelSelectionMenu.d.ts.map +1 -0
- package/dist/components/ModelSelectionMenu.js +91 -0
- package/dist/components/ModelSelectionMenu.js.map +1 -0
- package/dist/components/ModelSelectionMenu.test.d.ts +2 -0
- package/dist/components/ModelSelectionMenu.test.d.ts.map +1 -0
- package/dist/components/ModelSelectionMenu.test.js +83 -0
- package/dist/components/ModelSelectionMenu.test.js.map +1 -0
- package/dist/components/PathSelectionMenu.d.ts +12 -0
- package/dist/components/PathSelectionMenu.d.ts.map +1 -0
- package/dist/components/PathSelectionMenu.js +42 -0
- package/dist/components/PathSelectionMenu.js.map +1 -0
- package/dist/components/SettingsSelectionMenu.d.ts +9 -0
- package/dist/components/SettingsSelectionMenu.d.ts.map +1 -0
- package/dist/components/SettingsSelectionMenu.js +21 -0
- package/dist/components/SettingsSelectionMenu.js.map +1 -0
- package/dist/components/SlashCommandMenu.d.ts +15 -0
- package/dist/components/SlashCommandMenu.d.ts.map +1 -0
- package/dist/components/SlashCommandMenu.js +20 -0
- package/dist/components/SlashCommandMenu.js.map +1 -0
- package/dist/components/StatusBar.d.ts +11 -0
- package/dist/components/StatusBar.d.ts.map +1 -0
- package/dist/components/StatusBar.js +59 -0
- package/dist/components/StatusBar.js.map +1 -0
- package/dist/components/TextInput.d.ts +42 -0
- package/dist/components/TextInput.d.ts.map +1 -0
- package/dist/components/TextInput.js +397 -0
- package/dist/components/TextInput.js.map +1 -0
- package/dist/components/TextInput.test.d.ts +2 -0
- package/dist/components/TextInput.test.d.ts.map +1 -0
- package/dist/components/TextInput.test.js +75 -0
- package/dist/components/TextInput.test.js.map +1 -0
- package/dist/context/InputContext.d.ts +31 -0
- package/dist/context/InputContext.d.ts.map +1 -0
- package/dist/context/InputContext.js +36 -0
- package/dist/context/InputContext.js.map +1 -0
- package/dist/context/InputContext.stability.test.d.ts +2 -0
- package/dist/context/InputContext.stability.test.d.ts.map +1 -0
- package/dist/context/InputContext.stability.test.js +28 -0
- package/dist/context/InputContext.stability.test.js.map +1 -0
- package/dist/context/InputContext.test.d.ts +2 -0
- package/dist/context/InputContext.test.d.ts.map +1 -0
- package/dist/context/InputContext.test.js +168 -0
- package/dist/context/InputContext.test.js.map +1 -0
- package/dist/debug-schema.d.ts +2 -0
- package/dist/debug-schema.d.ts.map +1 -0
- package/dist/debug-schema.js +22 -0
- package/dist/debug-schema.js.map +1 -0
- package/dist/hooks/use-conversation.d.ts +78 -0
- package/dist/hooks/use-conversation.d.ts.map +1 -0
- package/dist/hooks/use-conversation.js +1017 -0
- package/dist/hooks/use-conversation.js.map +1 -0
- package/dist/hooks/use-input-history.d.ts +16 -0
- package/dist/hooks/use-input-history.d.ts.map +1 -0
- package/dist/hooks/use-input-history.js +71 -0
- package/dist/hooks/use-input-history.js.map +1 -0
- package/dist/hooks/use-model-selection.d.ts +27 -0
- package/dist/hooks/use-model-selection.d.ts.map +1 -0
- package/dist/hooks/use-model-selection.js +187 -0
- package/dist/hooks/use-model-selection.js.map +1 -0
- package/dist/hooks/use-model-selection.test.d.ts +2 -0
- package/dist/hooks/use-model-selection.test.d.ts.map +1 -0
- package/dist/hooks/use-model-selection.test.js +28 -0
- package/dist/hooks/use-model-selection.test.js.map +1 -0
- package/dist/hooks/use-path-completion.d.ts +22 -0
- package/dist/hooks/use-path-completion.d.ts.map +1 -0
- package/dist/hooks/use-path-completion.js +153 -0
- package/dist/hooks/use-path-completion.js.map +1 -0
- package/dist/hooks/use-path-completion.test.d.ts +2 -0
- package/dist/hooks/use-path-completion.test.d.ts.map +1 -0
- package/dist/hooks/use-path-completion.test.js +29 -0
- package/dist/hooks/use-path-completion.test.js.map +1 -0
- package/dist/hooks/use-setting.d.ts +7 -0
- package/dist/hooks/use-setting.d.ts.map +1 -0
- package/dist/hooks/use-setting.js +35 -0
- package/dist/hooks/use-setting.js.map +1 -0
- package/dist/hooks/use-settings-completion.d.ts +23 -0
- package/dist/hooks/use-settings-completion.d.ts.map +1 -0
- package/dist/hooks/use-settings-completion.js +164 -0
- package/dist/hooks/use-settings-completion.js.map +1 -0
- package/dist/hooks/use-settings-completion.test.d.ts +2 -0
- package/dist/hooks/use-settings-completion.test.d.ts.map +1 -0
- package/dist/hooks/use-settings-completion.test.js +334 -0
- package/dist/hooks/use-settings-completion.test.js.map +1 -0
- package/dist/hooks/use-slash-commands.d.ts +21 -0
- package/dist/hooks/use-slash-commands.d.ts.map +1 -0
- package/dist/hooks/use-slash-commands.js +87 -0
- package/dist/hooks/use-slash-commands.js.map +1 -0
- package/dist/hooks/use-slash-commands.test.d.ts +2 -0
- package/dist/hooks/use-slash-commands.test.d.ts.map +1 -0
- package/dist/hooks/use-slash-commands.test.js +246 -0
- package/dist/hooks/use-slash-commands.test.js.map +1 -0
- package/dist/lib/editor-impl.d.ts +23 -0
- package/dist/lib/editor-impl.d.ts.map +1 -0
- package/dist/lib/editor-impl.js +235 -0
- package/dist/lib/editor-impl.js.map +1 -0
- package/dist/lib/openai-agent-client.chat.test.d.ts +2 -0
- package/dist/lib/openai-agent-client.chat.test.d.ts.map +1 -0
- package/dist/lib/openai-agent-client.chat.test.js +68 -0
- package/dist/lib/openai-agent-client.chat.test.js.map +1 -0
- package/dist/lib/openai-agent-client.d.ts +48 -0
- package/dist/lib/openai-agent-client.d.ts.map +1 -0
- package/dist/lib/openai-agent-client.js +653 -0
- package/dist/lib/openai-agent-client.js.map +1 -0
- package/dist/lib/openai-agent-client.test.d.ts +2 -0
- package/dist/lib/openai-agent-client.test.d.ts.map +1 -0
- package/dist/lib/openai-agent-client.test.js +181 -0
- package/dist/lib/openai-agent-client.test.js.map +1 -0
- package/dist/lib/shell.d.ts +7 -0
- package/dist/lib/shell.d.ts.map +1 -0
- package/dist/lib/shell.js +56 -0
- package/dist/lib/shell.js.map +1 -0
- package/dist/lib/tool-invoke.d.ts +4 -0
- package/dist/lib/tool-invoke.d.ts.map +1 -0
- package/dist/lib/tool-invoke.js +26 -0
- package/dist/lib/tool-invoke.js.map +1 -0
- package/dist/lib/tool-invoke.test.d.ts +2 -0
- package/dist/lib/tool-invoke.test.d.ts.map +1 -0
- package/dist/lib/tool-invoke.test.js +19 -0
- package/dist/lib/tool-invoke.test.js.map +1 -0
- package/dist/no-singleton-imports.test.d.ts +2 -0
- package/dist/no-singleton-imports.test.d.ts.map +1 -0
- package/dist/no-singleton-imports.test.js +30 -0
- package/dist/no-singleton-imports.test.js.map +1 -0
- package/dist/prompts/anthropic.md +79 -0
- package/dist/prompts/codex.md +97 -0
- package/dist/prompts/default.md +77 -0
- package/dist/prompts/default.md.bak +77 -0
- package/dist/prompts/gpt-5.md +318 -0
- package/dist/prompts/lite.md +29 -0
- package/dist/prompts/simple-mentor.md +207 -0
- package/dist/prompts/simple.md +189 -0
- package/dist/providers/index.d.ts +5 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +8 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai-compatible/api.d.ts +17 -0
- package/dist/providers/openai-compatible/api.d.ts.map +1 -0
- package/dist/providers/openai-compatible/api.js +58 -0
- package/dist/providers/openai-compatible/api.js.map +1 -0
- package/dist/providers/openai-compatible/model.d.ts +17 -0
- package/dist/providers/openai-compatible/model.d.ts.map +1 -0
- package/dist/providers/openai-compatible/model.js +435 -0
- package/dist/providers/openai-compatible/model.js.map +1 -0
- package/dist/providers/openai-compatible/provider.d.ts +22 -0
- package/dist/providers/openai-compatible/provider.d.ts.map +1 -0
- package/dist/providers/openai-compatible/provider.js +43 -0
- package/dist/providers/openai-compatible/provider.js.map +1 -0
- package/dist/providers/openai-compatible/utils.d.ts +3 -0
- package/dist/providers/openai-compatible/utils.d.ts.map +1 -0
- package/dist/providers/openai-compatible/utils.js +11 -0
- package/dist/providers/openai-compatible/utils.js.map +1 -0
- package/dist/providers/openai-compatible.provider.d.ts +8 -0
- package/dist/providers/openai-compatible.provider.d.ts.map +1 -0
- package/dist/providers/openai-compatible.provider.js +71 -0
- package/dist/providers/openai-compatible.provider.js.map +1 -0
- package/dist/providers/openai.provider.d.ts +2 -0
- package/dist/providers/openai.provider.d.ts.map +1 -0
- package/dist/providers/openai.provider.js +36 -0
- package/dist/providers/openai.provider.js.map +1 -0
- package/dist/providers/openrouter/api.d.ts +39 -0
- package/dist/providers/openrouter/api.d.ts.map +1 -0
- package/dist/providers/openrouter/api.js +172 -0
- package/dist/providers/openrouter/api.js.map +1 -0
- package/dist/providers/openrouter/converters.d.ts +8 -0
- package/dist/providers/openrouter/converters.d.ts.map +1 -0
- package/dist/providers/openrouter/converters.js +382 -0
- package/dist/providers/openrouter/converters.js.map +1 -0
- package/dist/providers/openrouter/converters.test.d.ts +2 -0
- package/dist/providers/openrouter/converters.test.d.ts.map +1 -0
- package/dist/providers/openrouter/converters.test.js +158 -0
- package/dist/providers/openrouter/converters.test.js.map +1 -0
- package/dist/providers/openrouter/index.d.ts +4 -0
- package/dist/providers/openrouter/index.d.ts.map +1 -0
- package/dist/providers/openrouter/index.js +4 -0
- package/dist/providers/openrouter/index.js.map +1 -0
- package/dist/providers/openrouter/model.d.ts +14 -0
- package/dist/providers/openrouter/model.d.ts.map +1 -0
- package/dist/providers/openrouter/model.js +485 -0
- package/dist/providers/openrouter/model.js.map +1 -0
- package/dist/providers/openrouter/provider.d.ts +15 -0
- package/dist/providers/openrouter/provider.d.ts.map +1 -0
- package/dist/providers/openrouter/provider.js +21 -0
- package/dist/providers/openrouter/provider.js.map +1 -0
- package/dist/providers/openrouter/utils.d.ts +10 -0
- package/dist/providers/openrouter/utils.d.ts.map +1 -0
- package/dist/providers/openrouter/utils.js +27 -0
- package/dist/providers/openrouter/utils.js.map +1 -0
- package/dist/providers/openrouter.api.retry.test.d.ts +2 -0
- package/dist/providers/openrouter.api.retry.test.d.ts.map +1 -0
- package/dist/providers/openrouter.api.retry.test.js +148 -0
- package/dist/providers/openrouter.api.retry.test.js.map +1 -0
- package/dist/providers/openrouter.d.ts +2 -0
- package/dist/providers/openrouter.d.ts.map +1 -0
- package/dist/providers/openrouter.history.test.d.ts +2 -0
- package/dist/providers/openrouter.history.test.d.ts.map +1 -0
- package/dist/providers/openrouter.history.test.js +533 -0
- package/dist/providers/openrouter.history.test.js.map +1 -0
- package/dist/providers/openrouter.js +4 -0
- package/dist/providers/openrouter.js.map +1 -0
- package/dist/providers/openrouter.provider.createRunner.test.d.ts +2 -0
- package/dist/providers/openrouter.provider.createRunner.test.d.ts.map +1 -0
- package/dist/providers/openrouter.provider.createRunner.test.js +23 -0
- package/dist/providers/openrouter.provider.createRunner.test.js.map +1 -0
- package/dist/providers/openrouter.provider.d.ts +2 -0
- package/dist/providers/openrouter.provider.d.ts.map +1 -0
- package/dist/providers/openrouter.provider.js +56 -0
- package/dist/providers/openrouter.provider.js.map +1 -0
- package/dist/providers/openrouter.test.d.ts +2 -0
- package/dist/providers/openrouter.test.d.ts.map +1 -0
- package/dist/providers/openrouter.test.js +1382 -0
- package/dist/providers/openrouter.test.js.map +1 -0
- package/dist/providers/registry.d.ts +65 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +44 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/registry.test.d.ts +2 -0
- package/dist/providers/registry.test.d.ts.map +1 -0
- package/dist/providers/registry.test.js +76 -0
- package/dist/providers/registry.test.js.map +1 -0
- package/dist/providers/web-search/index.d.ts +8 -0
- package/dist/providers/web-search/index.d.ts.map +1 -0
- package/dist/providers/web-search/index.js +9 -0
- package/dist/providers/web-search/index.js.map +1 -0
- package/dist/providers/web-search/registry.d.ts +35 -0
- package/dist/providers/web-search/registry.d.ts.map +1 -0
- package/dist/providers/web-search/registry.js +56 -0
- package/dist/providers/web-search/registry.js.map +1 -0
- package/dist/providers/web-search/registry.test.d.ts +2 -0
- package/dist/providers/web-search/registry.test.d.ts.map +1 -0
- package/dist/providers/web-search/registry.test.js +105 -0
- package/dist/providers/web-search/registry.test.js.map +1 -0
- package/dist/providers/web-search/tavily.provider.d.ts +15 -0
- package/dist/providers/web-search/tavily.provider.d.ts.map +1 -0
- package/dist/providers/web-search/tavily.provider.js +69 -0
- package/dist/providers/web-search/tavily.provider.js.map +1 -0
- package/dist/providers/web-search/tavily.provider.test.d.ts +2 -0
- package/dist/providers/web-search/tavily.provider.test.d.ts.map +1 -0
- package/dist/providers/web-search/tavily.provider.test.js +67 -0
- package/dist/providers/web-search/tavily.provider.test.js.map +1 -0
- package/dist/providers/web-search/types.d.ts +55 -0
- package/dist/providers/web-search/types.d.ts.map +1 -0
- package/dist/providers/web-search/types.js +6 -0
- package/dist/providers/web-search/types.js.map +1 -0
- package/dist/safety-checker.js +57 -0
- package/dist/services/conversation-events.d.ts +76 -0
- package/dist/services/conversation-events.d.ts.map +1 -0
- package/dist/services/conversation-events.js +2 -0
- package/dist/services/conversation-events.js.map +1 -0
- package/dist/services/conversation-service.d.ts +31 -0
- package/dist/services/conversation-service.d.ts.map +1 -0
- package/dist/services/conversation-service.js +46 -0
- package/dist/services/conversation-service.js.map +1 -0
- package/dist/services/conversation-service.test.js +190 -0
- package/dist/services/conversation-session.d.ts +99 -0
- package/dist/services/conversation-session.d.ts.map +1 -0
- package/dist/services/conversation-session.js +978 -0
- package/dist/services/conversation-session.js.map +1 -0
- package/dist/services/conversation-store.d.ts +24 -0
- package/dist/services/conversation-store.d.ts.map +1 -0
- package/dist/services/conversation-store.js +216 -0
- package/dist/services/conversation-store.js.map +1 -0
- package/dist/services/conversation-store.test.d.ts +2 -0
- package/dist/services/conversation-store.test.d.ts.map +1 -0
- package/dist/services/conversation-store.test.js +167 -0
- package/dist/services/conversation-store.test.js.map +1 -0
- package/dist/services/execution-context.d.ts +10 -0
- package/dist/services/execution-context.d.ts.map +1 -0
- package/dist/services/execution-context.js +22 -0
- package/dist/services/execution-context.js.map +1 -0
- package/dist/services/execution-context.test.d.ts +2 -0
- package/dist/services/execution-context.test.d.ts.map +1 -0
- package/dist/services/execution-context.test.js +49 -0
- package/dist/services/execution-context.test.js.map +1 -0
- package/dist/services/file-service.d.ts +12 -0
- package/dist/services/file-service.d.ts.map +1 -0
- package/dist/services/file-service.js +90 -0
- package/dist/services/file-service.js.map +1 -0
- package/dist/services/history-service.d.ts +39 -0
- package/dist/services/history-service.d.ts.map +1 -0
- package/dist/services/history-service.js +152 -0
- package/dist/services/history-service.js.map +1 -0
- package/dist/services/logging-service.d.ts +75 -0
- package/dist/services/logging-service.d.ts.map +1 -0
- package/dist/services/logging-service.js +343 -0
- package/dist/services/logging-service.js.map +1 -0
- package/dist/services/model-service.d.ts +15 -0
- package/dist/services/model-service.d.ts.map +1 -0
- package/dist/services/model-service.js +46 -0
- package/dist/services/model-service.js.map +1 -0
- package/dist/services/model-service.test.d.ts +2 -0
- package/dist/services/model-service.test.d.ts.map +1 -0
- package/dist/services/model-service.test.js +128 -0
- package/dist/services/model-service.test.js.map +1 -0
- package/dist/services/service-interfaces.d.ts +33 -0
- package/dist/services/service-interfaces.d.ts.map +1 -0
- package/dist/services/service-interfaces.js +2 -0
- package/dist/services/service-interfaces.js.map +1 -0
- package/dist/services/settings-service.d.ts +316 -0
- package/dist/services/settings-service.d.ts.map +1 -0
- package/dist/services/settings-service.js +1128 -0
- package/dist/services/settings-service.js.map +1 -0
- package/dist/services/settings-service.mock.d.ts +20 -0
- package/dist/services/settings-service.mock.d.ts.map +1 -0
- package/dist/services/settings-service.mock.js +55 -0
- package/dist/services/settings-service.mock.js.map +1 -0
- package/dist/services/singleton-deprecation.test.d.ts +2 -0
- package/dist/services/singleton-deprecation.test.d.ts.map +1 -0
- package/dist/services/singleton-deprecation.test.js +59 -0
- package/dist/services/singleton-deprecation.test.js.map +1 -0
- package/dist/services/ssh-service.d.ts +32 -0
- package/dist/services/ssh-service.d.ts.map +1 -0
- package/dist/services/ssh-service.js +119 -0
- package/dist/services/ssh-service.js.map +1 -0
- package/dist/services/ssh-service.test.d.ts +2 -0
- package/dist/services/ssh-service.test.d.ts.map +1 -0
- package/dist/services/ssh-service.test.js +269 -0
- package/dist/services/ssh-service.test.js.map +1 -0
- package/dist/test-search-tool.d.ts +2 -0
- package/dist/test-search-tool.d.ts.map +1 -0
- package/dist/test-search-tool.js +36 -0
- package/dist/test-search-tool.js.map +1 -0
- package/dist/tools/apply-patch.d.ts +28 -0
- package/dist/tools/apply-patch.d.ts.map +1 -0
- package/dist/tools/apply-patch.js +399 -0
- package/dist/tools/apply-patch.js.map +1 -0
- package/dist/tools/apply-patch.test.d.ts +2 -0
- package/dist/tools/apply-patch.test.d.ts.map +1 -0
- package/dist/tools/apply-patch.test.js +155 -0
- package/dist/tools/apply-patch.test.js.map +1 -0
- package/dist/tools/ask-mentor.d.ts +11 -0
- package/dist/tools/ask-mentor.d.ts.map +1 -0
- package/dist/tools/ask-mentor.js +52 -0
- package/dist/tools/ask-mentor.js.map +1 -0
- package/dist/tools/ask-mentor.test.d.ts +2 -0
- package/dist/tools/ask-mentor.test.d.ts.map +1 -0
- package/dist/tools/ask-mentor.test.js +47 -0
- package/dist/tools/ask-mentor.test.js.map +1 -0
- package/dist/tools/bash.d.ts +10 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +55 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/find-files.d.ts +15 -0
- package/dist/tools/find-files.d.ts.map +1 -0
- package/dist/tools/find-files.js +179 -0
- package/dist/tools/find-files.js.map +1 -0
- package/dist/tools/find-files.test.d.ts +2 -0
- package/dist/tools/find-files.test.d.ts.map +1 -0
- package/dist/tools/find-files.test.js +131 -0
- package/dist/tools/find-files.test.js.map +1 -0
- package/dist/tools/format-helpers.d.ts +34 -0
- package/dist/tools/format-helpers.d.ts.map +1 -0
- package/dist/tools/format-helpers.js +131 -0
- package/dist/tools/format-helpers.js.map +1 -0
- package/dist/tools/grep.d.ts +16 -0
- package/dist/tools/grep.d.ts.map +1 -0
- package/dist/tools/grep.js +211 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/read-file.d.ts +15 -0
- package/dist/tools/read-file.d.ts.map +1 -0
- package/dist/tools/read-file.js +114 -0
- package/dist/tools/read-file.js.map +1 -0
- package/dist/tools/read-file.test.d.ts +2 -0
- package/dist/tools/read-file.test.d.ts.map +1 -0
- package/dist/tools/read-file.test.js +122 -0
- package/dist/tools/read-file.test.js.map +1 -0
- package/dist/tools/search-replace.d.ts +19 -0
- package/dist/tools/search-replace.d.ts.map +1 -0
- package/dist/tools/search-replace.js +411 -0
- package/dist/tools/search-replace.js.map +1 -0
- package/dist/tools/search-replace.test.d.ts +2 -0
- package/dist/tools/search-replace.test.d.ts.map +1 -0
- package/dist/tools/search-replace.test.js +302 -0
- package/dist/tools/search-replace.test.js.map +1 -0
- package/dist/tools/search.d.ts +15 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +143 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/shell.d.ts +19 -0
- package/dist/tools/shell.d.ts.map +1 -0
- package/dist/tools/shell.js +278 -0
- package/dist/tools/shell.js.map +1 -0
- package/dist/tools/tool-execution-context.d.ts +7 -0
- package/dist/tools/tool-execution-context.d.ts.map +1 -0
- package/dist/tools/tool-execution-context.js +7 -0
- package/dist/tools/tool-execution-context.js.map +1 -0
- package/dist/tools/types.d.ts +30 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/utils.d.ts +12 -0
- package/dist/tools/utils.d.ts.map +1 -0
- package/dist/tools/utils.js +19 -0
- package/dist/tools/utils.js.map +1 -0
- package/dist/tools/web-search.d.ts +29 -0
- package/dist/tools/web-search.d.ts.map +1 -0
- package/dist/tools/web-search.js +106 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/tools/web-search.test.d.ts +2 -0
- package/dist/tools/web-search.test.d.ts.map +1 -0
- package/dist/tools/web-search.test.js +176 -0
- package/dist/tools/web-search.test.js.map +1 -0
- package/dist/utils/command-logger.d.ts +11 -0
- package/dist/utils/command-logger.d.ts.map +1 -0
- package/dist/utils/command-logger.js +34 -0
- package/dist/utils/command-logger.js.map +1 -0
- package/dist/utils/command-safety/constants.d.ts +21 -0
- package/dist/utils/command-safety/constants.d.ts.map +1 -0
- package/dist/utils/command-safety/constants.js +245 -0
- package/dist/utils/command-safety/constants.js.map +1 -0
- package/dist/utils/command-safety/find-helpers.d.ts +15 -0
- package/dist/utils/command-safety/find-helpers.d.ts.map +1 -0
- package/dist/utils/command-safety/find-helpers.js +218 -0
- package/dist/utils/command-safety/find-helpers.js.map +1 -0
- package/dist/utils/command-safety/handlers/find-handler.d.ts +6 -0
- package/dist/utils/command-safety/handlers/find-handler.d.ts.map +1 -0
- package/dist/utils/command-safety/handlers/find-handler.js +113 -0
- package/dist/utils/command-safety/handlers/find-handler.js.map +1 -0
- package/dist/utils/command-safety/handlers/git-handler.d.ts +6 -0
- package/dist/utils/command-safety/handlers/git-handler.d.ts.map +1 -0
- package/dist/utils/command-safety/handlers/git-handler.js +68 -0
- package/dist/utils/command-safety/handlers/git-handler.js.map +1 -0
- package/dist/utils/command-safety/handlers/index.d.ts +13 -0
- package/dist/utils/command-safety/handlers/index.d.ts.map +1 -0
- package/dist/utils/command-safety/handlers/index.js +20 -0
- package/dist/utils/command-safety/handlers/index.js.map +1 -0
- package/dist/utils/command-safety/handlers/sed-handler.d.ts +6 -0
- package/dist/utils/command-safety/handlers/sed-handler.d.ts.map +1 -0
- package/dist/utils/command-safety/handlers/sed-handler.js +94 -0
- package/dist/utils/command-safety/handlers/sed-handler.js.map +1 -0
- package/dist/utils/command-safety/handlers/types.d.ts +36 -0
- package/dist/utils/command-safety/handlers/types.d.ts.map +1 -0
- package/dist/utils/command-safety/handlers/types.js +2 -0
- package/dist/utils/command-safety/handlers/types.js.map +1 -0
- package/dist/utils/command-safety/index.d.ts +14 -0
- package/dist/utils/command-safety/index.d.ts.map +1 -0
- package/dist/utils/command-safety/index.js +183 -0
- package/dist/utils/command-safety/index.js.map +1 -0
- package/dist/utils/command-safety/path-analysis.d.ts +4 -0
- package/dist/utils/command-safety/path-analysis.d.ts.map +1 -0
- package/dist/utils/command-safety/path-analysis.js +153 -0
- package/dist/utils/command-safety/path-analysis.js.map +1 -0
- package/dist/utils/command-safety/utils.d.ts +2 -0
- package/dist/utils/command-safety/utils.d.ts.map +1 -0
- package/dist/utils/command-safety/utils.js +22 -0
- package/dist/utils/command-safety/utils.js.map +1 -0
- package/dist/utils/command-safety.d.ts +21 -0
- package/dist/utils/command-safety.d.ts.map +1 -0
- package/dist/utils/command-safety.find.test.d.ts +2 -0
- package/dist/utils/command-safety.find.test.d.ts.map +1 -0
- package/dist/utils/command-safety.find.test.js +342 -0
- package/dist/utils/command-safety.find.test.js.map +1 -0
- package/dist/utils/command-safety.js +702 -0
- package/dist/utils/command-safety.js.map +1 -0
- package/dist/utils/command-safety.path.test.d.ts +2 -0
- package/dist/utils/command-safety.path.test.d.ts.map +1 -0
- package/dist/utils/command-safety.path.test.js +360 -0
- package/dist/utils/command-safety.path.test.js.map +1 -0
- package/dist/utils/diff.d.ts +2 -0
- package/dist/utils/diff.d.ts.map +1 -0
- package/dist/utils/diff.js +44 -0
- package/dist/utils/diff.js.map +1 -0
- package/dist/utils/diff.test.d.ts +2 -0
- package/dist/utils/diff.test.d.ts.map +1 -0
- package/dist/utils/diff.test.js +85 -0
- package/dist/utils/diff.test.js.map +1 -0
- package/dist/utils/error-helpers.d.ts +6 -0
- package/dist/utils/error-helpers.d.ts.map +1 -0
- package/dist/utils/error-helpers.js +46 -0
- package/dist/utils/error-helpers.js.map +1 -0
- package/dist/utils/error-helpers.test.d.ts +2 -0
- package/dist/utils/error-helpers.test.d.ts.map +1 -0
- package/dist/utils/error-helpers.test.js +152 -0
- package/dist/utils/error-helpers.test.js.map +1 -0
- package/dist/utils/execute-shell.d.ts +15 -0
- package/dist/utils/execute-shell.d.ts.map +1 -0
- package/dist/utils/execute-shell.js +34 -0
- package/dist/utils/execute-shell.js.map +1 -0
- package/dist/utils/execute-shell.test.d.ts +2 -0
- package/dist/utils/execute-shell.test.d.ts.map +1 -0
- package/dist/utils/execute-shell.test.js +20 -0
- package/dist/utils/execute-shell.test.js.map +1 -0
- package/dist/utils/extract-command-messages.d.ts +5 -0
- package/dist/utils/extract-command-messages.d.ts.map +1 -0
- package/dist/utils/extract-command-messages.js +140 -0
- package/dist/utils/extract-command-messages.js.map +1 -0
- package/dist/utils/extract-command-messages.repro.test.d.ts +2 -0
- package/dist/utils/extract-command-messages.repro.test.d.ts.map +1 -0
- package/dist/utils/extract-command-messages.repro.test.js +31 -0
- package/dist/utils/extract-command-messages.repro.test.js.map +1 -0
- package/dist/utils/extract-command-messages.test.js +57 -0
- package/dist/utils/message-buffer.d.ts +2 -0
- package/dist/utils/message-buffer.d.ts.map +1 -0
- package/dist/utils/message-buffer.js +15 -0
- package/dist/utils/message-buffer.js.map +1 -0
- package/dist/utils/message-buffer.test.d.ts +2 -0
- package/dist/utils/message-buffer.test.d.ts.map +1 -0
- package/dist/utils/message-buffer.test.js +17 -0
- package/dist/utils/message-buffer.test.js.map +1 -0
- package/dist/utils/output-trim.d.ts +31 -0
- package/dist/utils/output-trim.d.ts.map +1 -0
- package/dist/utils/output-trim.js +71 -0
- package/dist/utils/output-trim.js.map +1 -0
- package/dist/utils/provider-credentials.d.ts +10 -0
- package/dist/utils/provider-credentials.d.ts.map +1 -0
- package/dist/utils/provider-credentials.js +22 -0
- package/dist/utils/provider-credentials.js.map +1 -0
- package/dist/utils/settings-command.d.ts +13 -0
- package/dist/utils/settings-command.d.ts.map +1 -0
- package/dist/utils/settings-command.js +173 -0
- package/dist/utils/settings-command.js.map +1 -0
- package/dist/utils/ssh-config-parser.d.ts +21 -0
- package/dist/utils/ssh-config-parser.d.ts.map +1 -0
- package/dist/utils/ssh-config-parser.js +89 -0
- package/dist/utils/ssh-config-parser.js.map +1 -0
- package/dist/utils/ssh-config-parser.test.d.ts +2 -0
- package/dist/utils/ssh-config-parser.test.d.ts.map +1 -0
- package/dist/utils/ssh-config-parser.test.js +153 -0
- package/dist/utils/ssh-config-parser.test.js.map +1 -0
- package/dist/utils/streaming-updater.d.ts +7 -0
- package/dist/utils/streaming-updater.d.ts.map +1 -0
- package/dist/utils/streaming-updater.js +41 -0
- package/dist/utils/streaming-updater.js.map +1 -0
- package/dist/utils/throttle.d.ts +7 -0
- package/dist/utils/throttle.d.ts.map +1 -0
- package/dist/utils/throttle.js +49 -0
- package/dist/utils/throttle.js.map +1 -0
- package/package.json +108 -0
- package/readme.md +428 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { registerProvider } from './registry.js';
|
|
2
|
+
const OPENAI_MODELS_URL = 'https://api.openai.com/v1/models';
|
|
3
|
+
async function fetchOpenAIModels(_deps, fetchImpl = fetch) {
|
|
4
|
+
const headers = {
|
|
5
|
+
'Content-Type': 'application/json',
|
|
6
|
+
};
|
|
7
|
+
const apiKey = process.env.OPENAI_API_KEY;
|
|
8
|
+
if (apiKey) {
|
|
9
|
+
headers.Authorization = `Bearer ${apiKey}`;
|
|
10
|
+
}
|
|
11
|
+
const response = await fetchImpl(OPENAI_MODELS_URL, { headers });
|
|
12
|
+
if (!response.ok) {
|
|
13
|
+
throw new Error(`OpenAI models request failed (${response.status})`);
|
|
14
|
+
}
|
|
15
|
+
const body = await response.json();
|
|
16
|
+
const raw = body?.data || [];
|
|
17
|
+
if (!Array.isArray(raw))
|
|
18
|
+
return [];
|
|
19
|
+
return raw
|
|
20
|
+
.map((item) => {
|
|
21
|
+
const id = item?.id || item?.model || '';
|
|
22
|
+
const name = item?.name || item?.display_name || item?.description;
|
|
23
|
+
return id ? { id, name } : null;
|
|
24
|
+
})
|
|
25
|
+
.filter(Boolean);
|
|
26
|
+
}
|
|
27
|
+
// Register OpenAI provider
|
|
28
|
+
registerProvider({
|
|
29
|
+
id: 'openai',
|
|
30
|
+
label: 'OpenAI',
|
|
31
|
+
createRunner: undefined, // Use SDK default
|
|
32
|
+
fetchModels: fetchOpenAIModels,
|
|
33
|
+
clearConversations: undefined, // No conversation state to clear
|
|
34
|
+
sensitiveSettingKeys: [],
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=openai.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.provider.js","sourceRoot":"","sources":["../../source/providers/openai.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gBAAgB,EAAC,MAAM,eAAe,CAAC;AAE/C,MAAM,iBAAiB,GAAG,kCAAkC,CAAC;AAE7D,KAAK,UAAU,iBAAiB,CAC5B,KAAkD,EAClD,YAA0D,KAAY;IAEtE,MAAM,OAAO,GAA2B;QACpC,cAAc,EAAE,kBAAkB;KACrC,CAAC;IACF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC1C,IAAI,MAAM,EAAE,CAAC;QACT,OAAO,CAAC,aAAa,GAAG,UAAU,MAAM,EAAE,CAAC;IAC/C,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,iBAAiB,EAAE,EAAC,OAAO,EAAC,CAAC,CAAC;IAC/D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;IAE7B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAEnC,OAAO,GAAG;SACL,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE;QACf,MAAM,EAAE,GAAG,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,YAAY,IAAI,IAAI,EAAE,WAAW,CAAC;QACnE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAC,EAAE,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClC,CAAC,CAAC;SACD,MAAM,CAAC,OAAO,CAAuC,CAAC;AAC/D,CAAC;AAED,2BAA2B;AAC3B,gBAAgB,CAAC;IACb,EAAE,EAAE,QAAQ;IACZ,KAAK,EAAE,QAAQ;IACf,YAAY,EAAE,SAAS,EAAE,kBAAkB;IAC3C,WAAW,EAAE,iBAAiB;IAC9B,kBAAkB,EAAE,SAAS,EAAE,iCAAiC;IAChE,oBAAoB,EAAE,EAAE;CAC3B,CAAC,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { ISettingsService } from '../../services/service-interfaces.js';
|
|
2
|
+
type FetchImpl = (url: string, init?: RequestInit) => Promise<Response>;
|
|
3
|
+
type SleepImpl = (ms: number, signal?: AbortSignal) => Promise<void>;
|
|
4
|
+
export type OpenRouterRetryOptions = {
|
|
5
|
+
/**
|
|
6
|
+
* Number of retries after the initial attempt.
|
|
7
|
+
* Example: maxRetries=2 => up to 3 total attempts.
|
|
8
|
+
*/
|
|
9
|
+
maxRetries?: number;
|
|
10
|
+
/** Base delay for exponential backoff (ms). */
|
|
11
|
+
baseDelayMs?: number;
|
|
12
|
+
/** Max delay cap (ms). */
|
|
13
|
+
maxDelayMs?: number;
|
|
14
|
+
/**
|
|
15
|
+
* Jitter factor. 1 = full jitter (random 0..delay), 0 = no jitter (exact delay).
|
|
16
|
+
*/
|
|
17
|
+
jitter?: number;
|
|
18
|
+
};
|
|
19
|
+
export declare class OpenRouterError extends Error {
|
|
20
|
+
status: number;
|
|
21
|
+
headers: Record<string, string>;
|
|
22
|
+
responseBody?: string;
|
|
23
|
+
constructor(message: string, status: number, headers: Record<string, string>, responseBody?: string);
|
|
24
|
+
}
|
|
25
|
+
export declare function callOpenRouter({ apiKey, model, messages, stream, signal, settings, tools, settingsService, fetchImpl, sleepImpl, retry, }: {
|
|
26
|
+
apiKey: string;
|
|
27
|
+
model: string;
|
|
28
|
+
messages: any[];
|
|
29
|
+
stream: boolean;
|
|
30
|
+
signal?: AbortSignal;
|
|
31
|
+
settings?: any;
|
|
32
|
+
tools?: any[];
|
|
33
|
+
settingsService: ISettingsService;
|
|
34
|
+
fetchImpl?: FetchImpl;
|
|
35
|
+
sleepImpl?: SleepImpl;
|
|
36
|
+
retry?: OpenRouterRetryOptions;
|
|
37
|
+
}): Promise<Response>;
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../source/providers/openrouter/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,sCAAsC,CAAC;AAI3E,KAAK,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AACxE,KAAK,SAAS,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAErE,MAAM,MAAM,sBAAsB,GAAG;IACjC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAiFF,qBAAa,eAAgB,SAAQ,KAAK;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;gBAGlB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,YAAY,CAAC,EAAE,MAAM;CAQ5B;AAED,wBAAsB,cAAc,CAAC,EACjC,MAAM,EACN,KAAK,EACL,QAAQ,EACR,MAAM,EACN,MAAM,EACN,QAAQ,EACR,KAAK,EACL,eAAe,EACf,SAAS,EACT,SAAS,EACT,KAAK,GACR,EAAE;IACC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,GAAG,EAAE,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;IACd,eAAe,EAAE,gBAAgB,CAAC;IAClC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,KAAK,CAAC,EAAE,sBAAsB,CAAC;CAClC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAqHpB"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { getOpenRouterBaseUrl } from './utils.js';
|
|
2
|
+
import { extractModelSettingsForRequest } from './converters.js';
|
|
3
|
+
function isAbortError(err) {
|
|
4
|
+
return ((err instanceof DOMException && err.name === 'AbortError') ||
|
|
5
|
+
(typeof err === 'object' &&
|
|
6
|
+
err !== null &&
|
|
7
|
+
err.name === 'AbortError'));
|
|
8
|
+
}
|
|
9
|
+
function defaultSleep(ms, signal) {
|
|
10
|
+
if (ms <= 0)
|
|
11
|
+
return Promise.resolve();
|
|
12
|
+
return new Promise((resolve, reject) => {
|
|
13
|
+
const id = setTimeout(() => {
|
|
14
|
+
cleanup();
|
|
15
|
+
resolve();
|
|
16
|
+
}, ms);
|
|
17
|
+
const onAbort = () => {
|
|
18
|
+
cleanup();
|
|
19
|
+
clearTimeout(id);
|
|
20
|
+
reject(new DOMException('Aborted', 'AbortError'));
|
|
21
|
+
};
|
|
22
|
+
const cleanup = () => {
|
|
23
|
+
signal?.removeEventListener('abort', onAbort);
|
|
24
|
+
};
|
|
25
|
+
if (signal) {
|
|
26
|
+
if (signal.aborted) {
|
|
27
|
+
onAbort();
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
signal.addEventListener('abort', onAbort);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
function parseRetryAfterToMs(value) {
|
|
35
|
+
if (!value)
|
|
36
|
+
return undefined;
|
|
37
|
+
// Retry-After can be seconds or an HTTP date.
|
|
38
|
+
const asSeconds = Number.parseInt(value, 10);
|
|
39
|
+
if (Number.isFinite(asSeconds)) {
|
|
40
|
+
return Math.max(0, asSeconds) * 1000;
|
|
41
|
+
}
|
|
42
|
+
const asDate = Date.parse(value);
|
|
43
|
+
if (!Number.isNaN(asDate)) {
|
|
44
|
+
return Math.max(0, asDate - Date.now());
|
|
45
|
+
}
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
function isRetryableStatus(status) {
|
|
49
|
+
// 408 can occur for upstream timeouts; treat as transient.
|
|
50
|
+
return status === 429 || status === 408 || status >= 500;
|
|
51
|
+
}
|
|
52
|
+
function computeRetryDelayMs(opts) {
|
|
53
|
+
if (typeof opts.retryAfterMs === 'number' && opts.retryAfterMs >= 0) {
|
|
54
|
+
return opts.retryAfterMs;
|
|
55
|
+
}
|
|
56
|
+
const exponential = opts.baseDelayMs * Math.pow(2, opts.attemptIndex);
|
|
57
|
+
const capped = Math.min(exponential, opts.maxDelayMs);
|
|
58
|
+
if (opts.jitter > 0) {
|
|
59
|
+
return Math.random() * capped;
|
|
60
|
+
}
|
|
61
|
+
return capped;
|
|
62
|
+
}
|
|
63
|
+
export class OpenRouterError extends Error {
|
|
64
|
+
status;
|
|
65
|
+
headers;
|
|
66
|
+
responseBody;
|
|
67
|
+
constructor(message, status, headers, responseBody) {
|
|
68
|
+
super(message);
|
|
69
|
+
this.name = 'OpenRouterError';
|
|
70
|
+
this.status = status;
|
|
71
|
+
this.headers = headers;
|
|
72
|
+
this.responseBody = responseBody;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export async function callOpenRouter({ apiKey, model, messages, stream, signal, settings, tools, settingsService, fetchImpl, sleepImpl, retry, }) {
|
|
76
|
+
const url = `${getOpenRouterBaseUrl(settingsService)}/chat/completions`;
|
|
77
|
+
const body = {
|
|
78
|
+
model,
|
|
79
|
+
messages,
|
|
80
|
+
stream,
|
|
81
|
+
};
|
|
82
|
+
// Merge settings into request body
|
|
83
|
+
const settingsParams = extractModelSettingsForRequest(settings);
|
|
84
|
+
Object.assign(body, settingsParams);
|
|
85
|
+
// Add tools if provided
|
|
86
|
+
const functionTools = tools ?? [];
|
|
87
|
+
body.tools = functionTools;
|
|
88
|
+
if (functionTools.length > 0) {
|
|
89
|
+
body.tool_choice = 'auto'; // Let model choose when to use tools
|
|
90
|
+
}
|
|
91
|
+
const effectiveFetch = fetchImpl ?? fetch;
|
|
92
|
+
const effectiveSleep = sleepImpl ?? defaultSleep;
|
|
93
|
+
const retryCfg = {
|
|
94
|
+
maxRetries: retry?.maxRetries ?? 2,
|
|
95
|
+
baseDelayMs: retry?.baseDelayMs ?? 500,
|
|
96
|
+
maxDelayMs: retry?.maxDelayMs ?? 30000,
|
|
97
|
+
jitter: retry?.jitter ?? 1,
|
|
98
|
+
};
|
|
99
|
+
let attemptIndex = 0;
|
|
100
|
+
// attemptIndex tracks the retry attempt number (0 for first retry).
|
|
101
|
+
// We allow up to maxRetries retries after the initial attempt.
|
|
102
|
+
while (true) {
|
|
103
|
+
if (signal?.aborted) {
|
|
104
|
+
throw new DOMException('Aborted', 'AbortError');
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
const res = await effectiveFetch(url, {
|
|
108
|
+
method: 'POST',
|
|
109
|
+
headers: {
|
|
110
|
+
'Content-Type': 'application/json',
|
|
111
|
+
Authorization: `Bearer ${apiKey}`,
|
|
112
|
+
'HTTP-Referer': settingsService.get('agent.openrouter.referrer') ||
|
|
113
|
+
'http://localhost',
|
|
114
|
+
'X-Title': settingsService.get('agent.openrouter.title') ||
|
|
115
|
+
'term2',
|
|
116
|
+
},
|
|
117
|
+
body: JSON.stringify(body),
|
|
118
|
+
signal,
|
|
119
|
+
});
|
|
120
|
+
if (res.ok)
|
|
121
|
+
return res;
|
|
122
|
+
let errText;
|
|
123
|
+
try {
|
|
124
|
+
errText = await res.text();
|
|
125
|
+
}
|
|
126
|
+
catch { }
|
|
127
|
+
// Extract headers for retry logic (especially Retry-After)
|
|
128
|
+
const headers = {};
|
|
129
|
+
res.headers.forEach((value, key) => {
|
|
130
|
+
headers[key.toLowerCase()] = value;
|
|
131
|
+
});
|
|
132
|
+
const message = `OpenRouter request failed: ${res.status} ${res.statusText}${errText ? ` - ${errText}` : ''}`;
|
|
133
|
+
const error = new OpenRouterError(message, res.status, headers, errText);
|
|
134
|
+
const canRetry = retryCfg.maxRetries > 0 &&
|
|
135
|
+
isRetryableStatus(res.status) &&
|
|
136
|
+
attemptIndex < retryCfg.maxRetries;
|
|
137
|
+
if (!canRetry)
|
|
138
|
+
throw error;
|
|
139
|
+
const retryAfterMs = parseRetryAfterToMs(headers['retry-after']);
|
|
140
|
+
const delayMs = computeRetryDelayMs({
|
|
141
|
+
attemptIndex,
|
|
142
|
+
retryAfterMs,
|
|
143
|
+
baseDelayMs: retryCfg.baseDelayMs,
|
|
144
|
+
maxDelayMs: retryCfg.maxDelayMs,
|
|
145
|
+
jitter: retryCfg.jitter,
|
|
146
|
+
});
|
|
147
|
+
await effectiveSleep(delayMs, signal);
|
|
148
|
+
attemptIndex++;
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
if (isAbortError(err) || signal?.aborted)
|
|
153
|
+
throw err;
|
|
154
|
+
// Network-level failures (DNS, connection reset, etc.) often surface as TypeError.
|
|
155
|
+
const isNetworkError = err instanceof TypeError;
|
|
156
|
+
const canRetry = isNetworkError &&
|
|
157
|
+
retryCfg.maxRetries > 0 &&
|
|
158
|
+
attemptIndex < retryCfg.maxRetries;
|
|
159
|
+
if (!canRetry)
|
|
160
|
+
throw err;
|
|
161
|
+
const delayMs = computeRetryDelayMs({
|
|
162
|
+
attemptIndex,
|
|
163
|
+
baseDelayMs: retryCfg.baseDelayMs,
|
|
164
|
+
maxDelayMs: retryCfg.maxDelayMs,
|
|
165
|
+
jitter: retryCfg.jitter,
|
|
166
|
+
});
|
|
167
|
+
await effectiveSleep(delayMs, signal);
|
|
168
|
+
attemptIndex++;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../source/providers/openrouter/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ModelRequest } from '@openai/agents-core';
|
|
2
|
+
import type { ILoggingService } from '../../services/service-interfaces.js';
|
|
3
|
+
export declare function addCacheControlToLastUserMessage(messages: any[]): void;
|
|
4
|
+
export declare function addCacheControlToLastToolMessage(messages: any[]): void;
|
|
5
|
+
export declare function buildMessagesFromRequest(req: ModelRequest, modelId?: string, loggingService?: ILoggingService): any[];
|
|
6
|
+
export declare function extractFunctionToolsFromRequest(req: ModelRequest): any[];
|
|
7
|
+
export declare function extractModelSettingsForRequest(settings: any): any;
|
|
8
|
+
//# sourceMappingURL=converters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"converters.d.ts","sourceRoot":"","sources":["../../../source/providers/openrouter/converters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,YAAY,EAAC,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,sCAAsC,CAAC;AA2J1E,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI,CA4BtE;AAED,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI,CA4BtE;AAED,wBAAgB,wBAAwB,CACpC,GAAG,EAAE,YAAY,EACjB,OAAO,CAAC,EAAE,MAAM,EAChB,cAAc,CAAC,EAAE,eAAe,GACjC,GAAG,EAAE,CAwKP;AAED,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,YAAY,GAAG,GAAG,EAAE,CAsBxE;AAED,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,GAAG,GAAG,GAAG,CAgDjE"}
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
import { isAnthropicModel } from './utils.js';
|
|
2
|
+
// No-op logger for fallback when loggingService is not provided
|
|
3
|
+
const noOpLogger = {
|
|
4
|
+
debug: () => { },
|
|
5
|
+
error: () => { },
|
|
6
|
+
info: () => { },
|
|
7
|
+
warn: () => { },
|
|
8
|
+
security: () => { },
|
|
9
|
+
setCorrelationId: () => { },
|
|
10
|
+
getCorrelationId: () => undefined,
|
|
11
|
+
clearCorrelationId: () => { },
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Converts an agent item into a structured OpenRouter message object that adheres to
|
|
15
|
+
* expected formats for roles such as user, assistant, or tool, based on the item's properties.
|
|
16
|
+
* Supports handling various item types like input text, messages, function calls, and function call outputs.
|
|
17
|
+
*
|
|
18
|
+
* @param {any} item - The agent item to be converted. It may represent different types of messages
|
|
19
|
+
* (e.g., user input, assistant messages, tool calls) and can contain nested properties like rawItem, content,
|
|
20
|
+
* reasoning, tool calls, or reasoning details.
|
|
21
|
+
* @param {ILoggingService} loggingService - Logging service for debug output
|
|
22
|
+
*
|
|
23
|
+
* @return {any|null} - Returns a structured OpenRouter message object with specified properties like `role`,
|
|
24
|
+
* `content`, `reasoning`, `reasoning_details`, or `tool_calls`. Returns `null` if the input `item` is null or
|
|
25
|
+
* cannot be converted into a recognized format.
|
|
26
|
+
*/
|
|
27
|
+
function convertAgentItemToOpenRouterMessage(item, loggingService) {
|
|
28
|
+
if (!item) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
const rawItem = item.rawItem || item;
|
|
32
|
+
if (rawItem.type === 'input_text' && typeof rawItem.text === 'string') {
|
|
33
|
+
return { role: 'user', content: rawItem.text };
|
|
34
|
+
}
|
|
35
|
+
if (rawItem.role === 'assistant' && rawItem.type === 'message') {
|
|
36
|
+
const message = { role: 'assistant' };
|
|
37
|
+
if (Array.isArray(rawItem.content)) {
|
|
38
|
+
const textContent = rawItem.content
|
|
39
|
+
.filter((c) => c?.type === 'output_text' && c?.text)
|
|
40
|
+
.map((c) => c.text)
|
|
41
|
+
.join('');
|
|
42
|
+
if (textContent) {
|
|
43
|
+
message.content = textContent;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Preserve OpenRouter "reasoning" field (aka reasoning tokens) when present.
|
|
47
|
+
// This is distinct from reasoning_details blocks.
|
|
48
|
+
const reasoning = rawItem.reasoning ?? item.reasoning;
|
|
49
|
+
if (typeof reasoning === 'string') {
|
|
50
|
+
message.reasoning = reasoning;
|
|
51
|
+
}
|
|
52
|
+
// Preserve reasoning_details EXACTLY as received (required by OpenRouter).
|
|
53
|
+
// Some SDK history items may carry these fields under `rawItem`.
|
|
54
|
+
const reasoningDetails = rawItem.reasoning_details ?? item.reasoning_details;
|
|
55
|
+
if (reasoningDetails != null) {
|
|
56
|
+
loggingService.debug('convertAgentItemToOpenRouterMessage: reasoning_details', reasoningDetails);
|
|
57
|
+
message.reasoning_details = reasoningDetails;
|
|
58
|
+
}
|
|
59
|
+
const toolCalls = rawItem.tool_calls ?? item.tool_calls;
|
|
60
|
+
if (toolCalls != null) {
|
|
61
|
+
message.tool_calls = toolCalls;
|
|
62
|
+
}
|
|
63
|
+
return message;
|
|
64
|
+
}
|
|
65
|
+
// Handle explicit user messages included in array-form inputs
|
|
66
|
+
if (rawItem.role === 'user' && rawItem.type === 'message') {
|
|
67
|
+
if (typeof rawItem.content === 'string') {
|
|
68
|
+
return { role: 'user', content: rawItem.content };
|
|
69
|
+
}
|
|
70
|
+
if (Array.isArray(rawItem.content)) {
|
|
71
|
+
const textContent = rawItem.content
|
|
72
|
+
.filter((c) => (c?.type === 'input_text' ||
|
|
73
|
+
c?.type === 'output_text') &&
|
|
74
|
+
c?.text)
|
|
75
|
+
.map((c) => c.text)
|
|
76
|
+
.join('');
|
|
77
|
+
if (textContent) {
|
|
78
|
+
return { role: 'user', content: textContent };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (rawItem?.type === 'function_call') {
|
|
83
|
+
// Tool-call continuation: to preserve reasoning blocks across tool flows,
|
|
84
|
+
// we may need to replay reasoning_details/reasoning alongside tool_calls.
|
|
85
|
+
const reasoning = rawItem.reasoning ?? item.reasoning;
|
|
86
|
+
const reasoningDetails = rawItem.reasoning_details ?? item.reasoning_details;
|
|
87
|
+
return {
|
|
88
|
+
role: 'assistant',
|
|
89
|
+
content: null,
|
|
90
|
+
tool_calls: [
|
|
91
|
+
{
|
|
92
|
+
id: rawItem.callId || rawItem.id,
|
|
93
|
+
type: 'function',
|
|
94
|
+
function: {
|
|
95
|
+
name: rawItem.name,
|
|
96
|
+
arguments: rawItem.arguments ??
|
|
97
|
+
(rawItem.args ? JSON.stringify(rawItem.args) : ''),
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
...(typeof reasoning === 'string' ? { reasoning } : {}),
|
|
102
|
+
...(reasoningDetails != null
|
|
103
|
+
? { reasoning_details: reasoningDetails }
|
|
104
|
+
: {}),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
if (rawItem?.type === 'function_call_output' ||
|
|
108
|
+
rawItem?.type === 'function_call_result' ||
|
|
109
|
+
rawItem?.type === 'function_call_output_result') {
|
|
110
|
+
let outputContent = '';
|
|
111
|
+
if (typeof rawItem.output === 'string') {
|
|
112
|
+
outputContent = rawItem.output;
|
|
113
|
+
}
|
|
114
|
+
else if (rawItem.output && typeof rawItem.output === 'object') {
|
|
115
|
+
outputContent = JSON.stringify(rawItem.output);
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
role: 'tool',
|
|
119
|
+
tool_call_id: rawItem.callId || rawItem.id,
|
|
120
|
+
content: outputContent,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
export function addCacheControlToLastUserMessage(messages) {
|
|
126
|
+
// Find the last user message by iterating from the end
|
|
127
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
128
|
+
const msg = messages[i];
|
|
129
|
+
if (msg.role === 'user') {
|
|
130
|
+
// Transform the message content to include cache_control
|
|
131
|
+
if (typeof msg.content === 'string') {
|
|
132
|
+
// Convert string content to array format with cache_control
|
|
133
|
+
msg.content = [
|
|
134
|
+
{
|
|
135
|
+
type: 'text',
|
|
136
|
+
text: msg.content,
|
|
137
|
+
cache_control: { type: 'ephemeral' },
|
|
138
|
+
},
|
|
139
|
+
];
|
|
140
|
+
}
|
|
141
|
+
else if (Array.isArray(msg.content) && msg.content.length > 0) {
|
|
142
|
+
// Add cache_control to the last text item in the array
|
|
143
|
+
for (let j = msg.content.length - 1; j >= 0; j--) {
|
|
144
|
+
const item = msg.content[j];
|
|
145
|
+
if (item.type === 'text') {
|
|
146
|
+
item.cache_control = { type: 'ephemeral' };
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
break; // Only process the last user message
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
export function addCacheControlToLastToolMessage(messages) {
|
|
156
|
+
// Find the last tool message by iterating from the end
|
|
157
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
158
|
+
const msg = messages[i];
|
|
159
|
+
if (msg.role === 'tool') {
|
|
160
|
+
// Transform the message content to include cache_control
|
|
161
|
+
if (typeof msg.content === 'string') {
|
|
162
|
+
// Convert string content to array format with cache_control
|
|
163
|
+
msg.content = [
|
|
164
|
+
{
|
|
165
|
+
type: 'text',
|
|
166
|
+
text: msg.content,
|
|
167
|
+
cache_control: { type: 'ephemeral' },
|
|
168
|
+
},
|
|
169
|
+
];
|
|
170
|
+
}
|
|
171
|
+
else if (Array.isArray(msg.content) && msg.content.length > 0) {
|
|
172
|
+
// Add cache_control to the last text item in the array
|
|
173
|
+
for (let j = msg.content.length - 1; j >= 0; j--) {
|
|
174
|
+
const item = msg.content[j];
|
|
175
|
+
if (item.type === 'text') {
|
|
176
|
+
item.cache_control = { type: 'ephemeral' };
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
break; // Only process the last tool message
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
export function buildMessagesFromRequest(req, modelId, loggingService) {
|
|
186
|
+
const messages = [];
|
|
187
|
+
let pendingReasoningDetails = [];
|
|
188
|
+
const logger = loggingService || noOpLogger;
|
|
189
|
+
logger.debug('buildMessagesFromRequest: req.input', {
|
|
190
|
+
inputType: typeof req.input,
|
|
191
|
+
isArray: Array.isArray(req.input),
|
|
192
|
+
inputLength: Array.isArray(req.input)
|
|
193
|
+
? req.input.length
|
|
194
|
+
: typeof req.input === 'string'
|
|
195
|
+
? req.input.length
|
|
196
|
+
: 'N/A',
|
|
197
|
+
inputPreview: Array.isArray(req.input)
|
|
198
|
+
? req.input.map((item) => ({
|
|
199
|
+
role: item?.role || item?.rawItem?.role,
|
|
200
|
+
type: item?.type || item?.rawItem?.type,
|
|
201
|
+
}))
|
|
202
|
+
: typeof req.input === 'string'
|
|
203
|
+
? req.input.substring(0, 100)
|
|
204
|
+
: 'non-string, non-array',
|
|
205
|
+
});
|
|
206
|
+
const isToolCallOnlyAssistant = (m) => {
|
|
207
|
+
return (m != null &&
|
|
208
|
+
m.role === 'assistant' &&
|
|
209
|
+
m.content == null &&
|
|
210
|
+
Array.isArray(m.tool_calls) &&
|
|
211
|
+
m.tool_calls.length > 0);
|
|
212
|
+
};
|
|
213
|
+
if (req.systemInstructions && req.systemInstructions.trim().length > 0) {
|
|
214
|
+
// For Anthropic models, use array format with cache_control for prompt caching.
|
|
215
|
+
// This enables caching of the system message (agent instructions) which is large and rarely changes.
|
|
216
|
+
// See: https://openrouter.ai/docs/guides/best-practices/prompt-caching#anthropic-claude
|
|
217
|
+
if (modelId && isAnthropicModel(modelId)) {
|
|
218
|
+
messages.push({
|
|
219
|
+
role: 'system',
|
|
220
|
+
content: [
|
|
221
|
+
{
|
|
222
|
+
type: 'text',
|
|
223
|
+
text: req.systemInstructions,
|
|
224
|
+
cache_control: { type: 'ephemeral' },
|
|
225
|
+
},
|
|
226
|
+
],
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
messages.push({ role: 'system', content: req.systemInstructions });
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
// Note: History is managed by the SDK
|
|
234
|
+
// The SDK provides full conversation context in req.input
|
|
235
|
+
if (typeof req.input === 'string') {
|
|
236
|
+
const userMessage = { role: 'user', content: req.input };
|
|
237
|
+
messages.push(userMessage);
|
|
238
|
+
}
|
|
239
|
+
else if (Array.isArray(req.input)) {
|
|
240
|
+
for (const item of req.input) {
|
|
241
|
+
// The Agents SDK may represent preserved reasoning blocks as standalone
|
|
242
|
+
// output items of type "reasoning" (with providerData containing the
|
|
243
|
+
// original reasoning detail object). Gemini models require these blocks
|
|
244
|
+
// to be replayed as reasoning_details in subsequent requests.
|
|
245
|
+
const raw = item?.rawItem ?? item;
|
|
246
|
+
if (raw?.type === 'reasoning') {
|
|
247
|
+
const detail = raw?.providerData ?? item?.providerData;
|
|
248
|
+
if (detail && typeof detail === 'object') {
|
|
249
|
+
pendingReasoningDetails.push(detail);
|
|
250
|
+
}
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
const converted = convertAgentItemToOpenRouterMessage(item, loggingService || noOpLogger);
|
|
254
|
+
if (converted) {
|
|
255
|
+
// Attach any pending reasoning blocks to the next assistant message we
|
|
256
|
+
// emit (including assistant tool_calls messages), unless already present.
|
|
257
|
+
if (pendingReasoningDetails.length > 0 &&
|
|
258
|
+
converted.role === 'assistant' &&
|
|
259
|
+
converted.reasoning_details == null) {
|
|
260
|
+
converted.reasoning_details = pendingReasoningDetails;
|
|
261
|
+
pendingReasoningDetails = [];
|
|
262
|
+
}
|
|
263
|
+
// Merge consecutive assistant messages with tool_calls to fix incorrect conversation flow
|
|
264
|
+
// when parallel tool calls are stored as separate history items.
|
|
265
|
+
const lastMessage = messages[messages.length - 1];
|
|
266
|
+
// Case 1: Both are tool-call-only assistant messages - merge tool_calls
|
|
267
|
+
if (isToolCallOnlyAssistant(lastMessage) &&
|
|
268
|
+
isToolCallOnlyAssistant(converted)) {
|
|
269
|
+
lastMessage.tool_calls.push(...converted.tool_calls);
|
|
270
|
+
// Preserve reasoning if the merged message didn't have it but the new one does
|
|
271
|
+
if (lastMessage.reasoning_details == null &&
|
|
272
|
+
converted.reasoning_details != null) {
|
|
273
|
+
lastMessage.reasoning_details =
|
|
274
|
+
converted.reasoning_details;
|
|
275
|
+
}
|
|
276
|
+
if (lastMessage.reasoning == null &&
|
|
277
|
+
converted.reasoning != null) {
|
|
278
|
+
lastMessage.reasoning = converted.reasoning;
|
|
279
|
+
}
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
// Case 2: Last message is assistant (with or without content), current is tool-call-only assistant
|
|
283
|
+
// This happens when SDK history has assistant message followed by function_call items
|
|
284
|
+
if (lastMessage?.role === 'assistant' &&
|
|
285
|
+
isToolCallOnlyAssistant(converted)) {
|
|
286
|
+
if (lastMessage.content != null) {
|
|
287
|
+
messages.push(converted);
|
|
288
|
+
continue;
|
|
289
|
+
}
|
|
290
|
+
// Merge the tool_calls into the previous assistant message
|
|
291
|
+
if (!lastMessage.tool_calls) {
|
|
292
|
+
lastMessage.tool_calls = [];
|
|
293
|
+
}
|
|
294
|
+
lastMessage.tool_calls.push(...converted.tool_calls);
|
|
295
|
+
// Preserve reasoning
|
|
296
|
+
if (lastMessage.reasoning_details == null &&
|
|
297
|
+
converted.reasoning_details != null) {
|
|
298
|
+
lastMessage.reasoning_details =
|
|
299
|
+
converted.reasoning_details;
|
|
300
|
+
}
|
|
301
|
+
if (lastMessage.reasoning == null &&
|
|
302
|
+
converted.reasoning != null) {
|
|
303
|
+
lastMessage.reasoning = converted.reasoning;
|
|
304
|
+
}
|
|
305
|
+
continue;
|
|
306
|
+
}
|
|
307
|
+
messages.push(converted);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
// For Anthropic models, add cache_control to the last user message.
|
|
312
|
+
// This is an efficient caching strategy using 2 of 4 available cache points:
|
|
313
|
+
// 1. System message (static, large) - already cached above
|
|
314
|
+
// 2. Last user message (marks end of reusable conversation history)
|
|
315
|
+
// As the conversation grows, the cache automatically moves with the last user message.
|
|
316
|
+
// See: https://openrouter.ai/docs/guides/best-practices/prompt-caching#anthropic-claude
|
|
317
|
+
if (modelId && isAnthropicModel(modelId)) {
|
|
318
|
+
addCacheControlToLastUserMessage(messages);
|
|
319
|
+
addCacheControlToLastToolMessage(messages);
|
|
320
|
+
}
|
|
321
|
+
return messages;
|
|
322
|
+
}
|
|
323
|
+
export function extractFunctionToolsFromRequest(req) {
|
|
324
|
+
if (!req.tools || req.tools.length === 0) {
|
|
325
|
+
return [];
|
|
326
|
+
}
|
|
327
|
+
const functionTools = [];
|
|
328
|
+
for (const tool of req.tools) {
|
|
329
|
+
if (tool.type === 'function') {
|
|
330
|
+
functionTools.push({
|
|
331
|
+
type: 'function',
|
|
332
|
+
function: {
|
|
333
|
+
name: tool.name,
|
|
334
|
+
description: tool.description,
|
|
335
|
+
parameters: tool.parameters,
|
|
336
|
+
strict: tool.strict,
|
|
337
|
+
},
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return functionTools;
|
|
342
|
+
}
|
|
343
|
+
export function extractModelSettingsForRequest(settings) {
|
|
344
|
+
const body = {};
|
|
345
|
+
if (settings) {
|
|
346
|
+
// Temperature: Supported by both SDK and OpenRouter
|
|
347
|
+
if (settings.temperature != null)
|
|
348
|
+
body.temperature = settings.temperature;
|
|
349
|
+
// Top P: Supported by both (SDK uses topP, OpenRouter uses top_p)
|
|
350
|
+
if (settings.topP != null)
|
|
351
|
+
body.top_p = settings.topP;
|
|
352
|
+
// Max Tokens: Supported by both (SDK uses maxTokens, OpenRouter uses max_tokens)
|
|
353
|
+
if (settings.maxTokens != null)
|
|
354
|
+
body.max_tokens = settings.maxTokens;
|
|
355
|
+
// Top K: Supported by some models via OpenRouter
|
|
356
|
+
if (settings.topK != null)
|
|
357
|
+
body.top_k = settings.topK;
|
|
358
|
+
// Frequency Penalty: OpenAI standard parameter
|
|
359
|
+
if (settings.frequencyPenalty != null)
|
|
360
|
+
body.frequency_penalty = settings.frequencyPenalty;
|
|
361
|
+
// Presence Penalty: OpenAI standard parameter
|
|
362
|
+
if (settings.presencePenalty != null)
|
|
363
|
+
body.presence_penalty = settings.presencePenalty;
|
|
364
|
+
const hasReasoningObj = settings.reasoning && typeof settings.reasoning === 'object';
|
|
365
|
+
if (hasReasoningObj) {
|
|
366
|
+
// Pass through the full reasoning object unmodified. (OpenRouter supports
|
|
367
|
+
// additional fields like max_tokens and exclude.)
|
|
368
|
+
body.reasoning = { ...settings.reasoning };
|
|
369
|
+
}
|
|
370
|
+
const reasoningEffort = settings.reasoningEffort ?? settings.reasoning?.effort;
|
|
371
|
+
const normalizedEffort = reasoningEffort === 'default' ? 'medium' : reasoningEffort;
|
|
372
|
+
// If an effort is provided (and isn't explicitly disabled), ensure it's set.
|
|
373
|
+
if (normalizedEffort && normalizedEffort !== 'none') {
|
|
374
|
+
body.reasoning = {
|
|
375
|
+
...(body.reasoning ?? {}),
|
|
376
|
+
effort: normalizedEffort,
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
return body;
|
|
381
|
+
}
|
|
382
|
+
//# sourceMappingURL=converters.js.map
|