snow-ai 0.4.15 → 0.4.17
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/bundle/cli.mjs +477445 -0
- package/bundle/sql-wasm.wasm +0 -0
- package/package.json +31 -26
- package/dist/agents/codebaseIndexAgent.d.ts +0 -102
- package/dist/agents/codebaseIndexAgent.js +0 -641
- package/dist/agents/codebaseReviewAgent.d.ts +0 -61
- package/dist/agents/codebaseReviewAgent.js +0 -301
- package/dist/agents/compactAgent.d.ts +0 -55
- package/dist/agents/compactAgent.js +0 -306
- package/dist/agents/promptOptimizeAgent.d.ts +0 -54
- package/dist/agents/promptOptimizeAgent.js +0 -268
- package/dist/agents/reviewAgent.d.ts +0 -50
- package/dist/agents/reviewAgent.js +0 -265
- package/dist/agents/summaryAgent.d.ts +0 -57
- package/dist/agents/summaryAgent.js +0 -260
- package/dist/api/anthropic.d.ts +0 -44
- package/dist/api/anthropic.js +0 -598
- package/dist/api/chat.d.ts +0 -73
- package/dist/api/chat.js +0 -386
- package/dist/api/embedding.d.ts +0 -34
- package/dist/api/embedding.js +0 -80
- package/dist/api/gemini.d.ts +0 -31
- package/dist/api/gemini.js +0 -445
- package/dist/api/models.d.ts +0 -15
- package/dist/api/models.js +0 -139
- package/dist/api/responses.d.ts +0 -38
- package/dist/api/responses.js +0 -515
- package/dist/api/systemPrompt.d.ts +0 -4
- package/dist/api/systemPrompt.js +0 -408
- package/dist/api/types.d.ts +0 -53
- package/dist/api/types.js +0 -4
- package/dist/app.d.ts +0 -8
- package/dist/app.js +0 -112
- package/dist/cli.d.ts +0 -2
- package/dist/cli.js +0 -199
- package/dist/hooks/useAgentPicker.d.ts +0 -14
- package/dist/hooks/useAgentPicker.js +0 -119
- package/dist/hooks/useClipboard.d.ts +0 -4
- package/dist/hooks/useClipboard.js +0 -175
- package/dist/hooks/useCommandHandler.d.ts +0 -35
- package/dist/hooks/useCommandHandler.js +0 -346
- package/dist/hooks/useCommandPanel.d.ts +0 -17
- package/dist/hooks/useCommandPanel.js +0 -114
- package/dist/hooks/useConversation.d.ts +0 -49
- package/dist/hooks/useConversation.js +0 -1052
- package/dist/hooks/useFilePicker.d.ts +0 -18
- package/dist/hooks/useFilePicker.js +0 -224
- package/dist/hooks/useGlobalExit.d.ts +0 -5
- package/dist/hooks/useGlobalExit.js +0 -34
- package/dist/hooks/useGlobalNavigation.d.ts +0 -6
- package/dist/hooks/useGlobalNavigation.js +0 -17
- package/dist/hooks/useHistoryNavigation.d.ts +0 -35
- package/dist/hooks/useHistoryNavigation.js +0 -133
- package/dist/hooks/useInputBuffer.d.ts +0 -6
- package/dist/hooks/useInputBuffer.js +0 -45
- package/dist/hooks/useKeyboardInput.d.ts +0 -80
- package/dist/hooks/useKeyboardInput.js +0 -608
- package/dist/hooks/useSessionManagement.d.ts +0 -10
- package/dist/hooks/useSessionManagement.js +0 -43
- package/dist/hooks/useSessionSave.d.ts +0 -8
- package/dist/hooks/useSessionSave.js +0 -63
- package/dist/hooks/useSnapshotState.d.ts +0 -26
- package/dist/hooks/useSnapshotState.js +0 -28
- package/dist/hooks/useStreamingState.d.ts +0 -33
- package/dist/hooks/useStreamingState.js +0 -105
- package/dist/hooks/useTerminalFocus.d.ts +0 -28
- package/dist/hooks/useTerminalFocus.js +0 -87
- package/dist/hooks/useTerminalSize.d.ts +0 -4
- package/dist/hooks/useTerminalSize.js +0 -20
- package/dist/hooks/useTodoPicker.d.ts +0 -16
- package/dist/hooks/useTodoPicker.js +0 -94
- package/dist/hooks/useToolConfirmation.d.ts +0 -19
- package/dist/hooks/useToolConfirmation.js +0 -61
- package/dist/hooks/useVSCodeState.d.ts +0 -8
- package/dist/hooks/useVSCodeState.js +0 -81
- package/dist/i18n/I18nContext.d.ts +0 -14
- package/dist/i18n/I18nContext.js +0 -24
- package/dist/i18n/index.d.ts +0 -3
- package/dist/i18n/index.js +0 -2
- package/dist/i18n/lang/en.d.ts +0 -2
- package/dist/i18n/lang/en.js +0 -502
- package/dist/i18n/lang/es.d.ts +0 -2
- package/dist/i18n/lang/es.js +0 -502
- package/dist/i18n/lang/ja.d.ts +0 -2
- package/dist/i18n/lang/ja.js +0 -502
- package/dist/i18n/lang/ko.d.ts +0 -2
- package/dist/i18n/lang/ko.js +0 -502
- package/dist/i18n/lang/zh-TW.d.ts +0 -2
- package/dist/i18n/lang/zh-TW.js +0 -502
- package/dist/i18n/lang/zh.d.ts +0 -2
- package/dist/i18n/lang/zh.js +0 -502
- package/dist/i18n/translations.d.ts +0 -2
- package/dist/i18n/translations.js +0 -14
- package/dist/i18n/types.d.ts +0 -478
- package/dist/i18n/types.js +0 -1
- package/dist/mcp/aceCodeSearch.d.ts +0 -247
- package/dist/mcp/aceCodeSearch.js +0 -1058
- package/dist/mcp/bash.d.ts +0 -50
- package/dist/mcp/bash.js +0 -153
- package/dist/mcp/codebaseSearch.d.ts +0 -44
- package/dist/mcp/codebaseSearch.js +0 -275
- package/dist/mcp/filesystem.d.ts +0 -392
- package/dist/mcp/filesystem.js +0 -1445
- package/dist/mcp/ideDiagnostics.d.ts +0 -36
- package/dist/mcp/ideDiagnostics.js +0 -90
- package/dist/mcp/notebook.d.ts +0 -10
- package/dist/mcp/notebook.js +0 -367
- package/dist/mcp/subagent.d.ts +0 -37
- package/dist/mcp/subagent.js +0 -113
- package/dist/mcp/todo.d.ts +0 -46
- package/dist/mcp/todo.js +0 -511
- package/dist/mcp/types/aceCodeSearch.types.d.ts +0 -92
- package/dist/mcp/types/aceCodeSearch.types.js +0 -4
- package/dist/mcp/types/bash.types.d.ts +0 -13
- package/dist/mcp/types/bash.types.js +0 -4
- package/dist/mcp/types/filesystem.types.d.ts +0 -210
- package/dist/mcp/types/filesystem.types.js +0 -27
- package/dist/mcp/types/todo.types.d.ts +0 -27
- package/dist/mcp/types/todo.types.js +0 -4
- package/dist/mcp/types/websearch.types.d.ts +0 -30
- package/dist/mcp/types/websearch.types.js +0 -4
- package/dist/mcp/utils/aceCodeSearch/filesystem.utils.d.ts +0 -34
- package/dist/mcp/utils/aceCodeSearch/filesystem.utils.js +0 -146
- package/dist/mcp/utils/aceCodeSearch/language.utils.d.ts +0 -14
- package/dist/mcp/utils/aceCodeSearch/language.utils.js +0 -418
- package/dist/mcp/utils/aceCodeSearch/search.utils.d.ts +0 -31
- package/dist/mcp/utils/aceCodeSearch/search.utils.js +0 -136
- package/dist/mcp/utils/aceCodeSearch/symbol.utils.d.ts +0 -20
- package/dist/mcp/utils/aceCodeSearch/symbol.utils.js +0 -141
- package/dist/mcp/utils/bash/security.utils.d.ts +0 -20
- package/dist/mcp/utils/bash/security.utils.js +0 -34
- package/dist/mcp/utils/filesystem/batch-operations.utils.d.ts +0 -39
- package/dist/mcp/utils/filesystem/batch-operations.utils.js +0 -182
- package/dist/mcp/utils/filesystem/code-analysis.utils.d.ts +0 -18
- package/dist/mcp/utils/filesystem/code-analysis.utils.js +0 -165
- package/dist/mcp/utils/filesystem/match-finder.utils.d.ts +0 -16
- package/dist/mcp/utils/filesystem/match-finder.utils.js +0 -85
- package/dist/mcp/utils/filesystem/office-parser.utils.d.ts +0 -43
- package/dist/mcp/utils/filesystem/office-parser.utils.js +0 -163
- package/dist/mcp/utils/filesystem/path-fixer.utils.d.ts +0 -7
- package/dist/mcp/utils/filesystem/path-fixer.utils.js +0 -60
- package/dist/mcp/utils/filesystem/similarity.utils.d.ts +0 -22
- package/dist/mcp/utils/filesystem/similarity.utils.js +0 -75
- package/dist/mcp/utils/todo/date.utils.d.ts +0 -9
- package/dist/mcp/utils/todo/date.utils.js +0 -14
- package/dist/mcp/utils/websearch/browser.utils.d.ts +0 -8
- package/dist/mcp/utils/websearch/browser.utils.js +0 -58
- package/dist/mcp/utils/websearch/text.utils.d.ts +0 -16
- package/dist/mcp/utils/websearch/text.utils.js +0 -39
- package/dist/mcp/websearch.d.ts +0 -88
- package/dist/mcp/websearch.js +0 -375
- package/dist/test/logger-test.d.ts +0 -1
- package/dist/test/logger-test.js +0 -7
- package/dist/types/index.d.ts +0 -15
- package/dist/types/index.js +0 -1
- package/dist/ui/components/AgentPickerPanel.d.ts +0 -10
- package/dist/ui/components/AgentPickerPanel.js +0 -74
- package/dist/ui/components/ChatInput.d.ts +0 -46
- package/dist/ui/components/ChatInput.js +0 -379
- package/dist/ui/components/CommandPanel.d.ts +0 -15
- package/dist/ui/components/CommandPanel.js +0 -80
- package/dist/ui/components/DiffViewer.d.ts +0 -11
- package/dist/ui/components/DiffViewer.js +0 -178
- package/dist/ui/components/FileList.d.ts +0 -15
- package/dist/ui/components/FileList.js +0 -360
- package/dist/ui/components/FileRollbackConfirmation.d.ts +0 -8
- package/dist/ui/components/FileRollbackConfirmation.js +0 -108
- package/dist/ui/components/HelpPanel.d.ts +0 -2
- package/dist/ui/components/HelpPanel.js +0 -67
- package/dist/ui/components/MCPInfoPanel.d.ts +0 -2
- package/dist/ui/components/MCPInfoPanel.js +0 -108
- package/dist/ui/components/MCPInfoScreen.d.ts +0 -7
- package/dist/ui/components/MCPInfoScreen.js +0 -115
- package/dist/ui/components/MarkdownRenderer.d.ts +0 -6
- package/dist/ui/components/MarkdownRenderer.js +0 -70
- package/dist/ui/components/Menu.d.ts +0 -17
- package/dist/ui/components/Menu.js +0 -88
- package/dist/ui/components/MessageList.d.ts +0 -56
- package/dist/ui/components/MessageList.js +0 -97
- package/dist/ui/components/PendingMessages.d.ts +0 -13
- package/dist/ui/components/PendingMessages.js +0 -29
- package/dist/ui/components/PendingToolCalls.d.ts +0 -11
- package/dist/ui/components/PendingToolCalls.js +0 -35
- package/dist/ui/components/ScrollableSelectInput.d.ts +0 -29
- package/dist/ui/components/ScrollableSelectInput.js +0 -157
- package/dist/ui/components/SessionListPanel.d.ts +0 -7
- package/dist/ui/components/SessionListPanel.js +0 -175
- package/dist/ui/components/SessionListScreen.d.ts +0 -7
- package/dist/ui/components/SessionListScreen.js +0 -217
- package/dist/ui/components/SessionListScreenWrapper.d.ts +0 -7
- package/dist/ui/components/SessionListScreenWrapper.js +0 -14
- package/dist/ui/components/ShimmerText.d.ts +0 -9
- package/dist/ui/components/ShimmerText.js +0 -30
- package/dist/ui/components/TodoPickerPanel.d.ts +0 -14
- package/dist/ui/components/TodoPickerPanel.js +0 -119
- package/dist/ui/components/TodoTree.d.ts +0 -15
- package/dist/ui/components/TodoTree.js +0 -60
- package/dist/ui/components/ToolConfirmation.d.ts +0 -21
- package/dist/ui/components/ToolConfirmation.js +0 -204
- package/dist/ui/components/ToolResultPreview.d.ts +0 -13
- package/dist/ui/components/ToolResultPreview.js +0 -337
- package/dist/ui/components/UsagePanel.d.ts +0 -2
- package/dist/ui/components/UsagePanel.js +0 -394
- package/dist/ui/contexts/ThemeContext.d.ts +0 -13
- package/dist/ui/contexts/ThemeContext.js +0 -28
- package/dist/ui/pages/ChatScreen.d.ts +0 -6
- package/dist/ui/pages/ChatScreen.js +0 -1495
- package/dist/ui/pages/CodeBaseConfigScreen.d.ts +0 -8
- package/dist/ui/pages/CodeBaseConfigScreen.js +0 -350
- package/dist/ui/pages/ConfigScreen.d.ts +0 -8
- package/dist/ui/pages/ConfigScreen.js +0 -1101
- package/dist/ui/pages/CustomHeadersScreen.d.ts +0 -6
- package/dist/ui/pages/CustomHeadersScreen.js +0 -502
- package/dist/ui/pages/HeadlessModeScreen.d.ts +0 -7
- package/dist/ui/pages/HeadlessModeScreen.js +0 -381
- package/dist/ui/pages/LanguageSettingsScreen.d.ts +0 -7
- package/dist/ui/pages/LanguageSettingsScreen.js +0 -91
- package/dist/ui/pages/MCPConfigScreen.d.ts +0 -6
- package/dist/ui/pages/MCPConfigScreen.js +0 -55
- package/dist/ui/pages/ProxyConfigScreen.d.ts +0 -8
- package/dist/ui/pages/ProxyConfigScreen.js +0 -149
- package/dist/ui/pages/SensitiveCommandConfigScreen.d.ts +0 -7
- package/dist/ui/pages/SensitiveCommandConfigScreen.js +0 -271
- package/dist/ui/pages/SubAgentConfigScreen.d.ts +0 -9
- package/dist/ui/pages/SubAgentConfigScreen.js +0 -435
- package/dist/ui/pages/SubAgentListScreen.d.ts +0 -9
- package/dist/ui/pages/SubAgentListScreen.js +0 -131
- package/dist/ui/pages/SystemPromptConfigScreen.d.ts +0 -6
- package/dist/ui/pages/SystemPromptConfigScreen.js +0 -326
- package/dist/ui/pages/ThemeSettingsScreen.d.ts +0 -7
- package/dist/ui/pages/ThemeSettingsScreen.js +0 -106
- package/dist/ui/pages/WelcomeScreen.d.ts +0 -7
- package/dist/ui/pages/WelcomeScreen.js +0 -217
- package/dist/ui/themes/index.d.ts +0 -23
- package/dist/ui/themes/index.js +0 -140
- package/dist/utils/apiConfig.d.ts +0 -126
- package/dist/utils/apiConfig.js +0 -423
- package/dist/utils/autoCompress.d.ts +0 -15
- package/dist/utils/autoCompress.js +0 -24
- package/dist/utils/chatExporter.d.ts +0 -9
- package/dist/utils/chatExporter.js +0 -118
- package/dist/utils/checkpointManager.d.ts +0 -74
- package/dist/utils/checkpointManager.js +0 -181
- package/dist/utils/codebaseConfig.d.ts +0 -16
- package/dist/utils/codebaseConfig.js +0 -67
- package/dist/utils/codebaseDatabase.d.ts +0 -102
- package/dist/utils/codebaseDatabase.js +0 -333
- package/dist/utils/codebaseSearchEvents.d.ts +0 -16
- package/dist/utils/codebaseSearchEvents.js +0 -13
- package/dist/utils/commandExecutor.d.ts +0 -13
- package/dist/utils/commandExecutor.js +0 -26
- package/dist/utils/commands/agent.d.ts +0 -2
- package/dist/utils/commands/agent.js +0 -12
- package/dist/utils/commands/clear.d.ts +0 -2
- package/dist/utils/commands/clear.js +0 -12
- package/dist/utils/commands/compact.d.ts +0 -2
- package/dist/utils/commands/compact.js +0 -12
- package/dist/utils/commands/export.d.ts +0 -2
- package/dist/utils/commands/export.js +0 -12
- package/dist/utils/commands/help.d.ts +0 -2
- package/dist/utils/commands/help.js +0 -11
- package/dist/utils/commands/home.d.ts +0 -2
- package/dist/utils/commands/home.js +0 -34
- package/dist/utils/commands/ide.d.ts +0 -2
- package/dist/utils/commands/ide.js +0 -32
- package/dist/utils/commands/init.d.ts +0 -2
- package/dist/utils/commands/init.js +0 -93
- package/dist/utils/commands/mcp.d.ts +0 -2
- package/dist/utils/commands/mcp.js +0 -12
- package/dist/utils/commands/resume.d.ts +0 -2
- package/dist/utils/commands/resume.js +0 -12
- package/dist/utils/commands/review.d.ts +0 -2
- package/dist/utils/commands/review.js +0 -81
- package/dist/utils/commands/role.d.ts +0 -2
- package/dist/utils/commands/role.js +0 -37
- package/dist/utils/commands/todoPicker.d.ts +0 -2
- package/dist/utils/commands/todoPicker.js +0 -12
- package/dist/utils/commands/usage.d.ts +0 -2
- package/dist/utils/commands/usage.js +0 -12
- package/dist/utils/commands/yolo.d.ts +0 -2
- package/dist/utils/commands/yolo.js +0 -12
- package/dist/utils/configManager.d.ts +0 -45
- package/dist/utils/configManager.js +0 -303
- package/dist/utils/contextCompressor.d.ts +0 -16
- package/dist/utils/contextCompressor.js +0 -334
- package/dist/utils/devMode.d.ts +0 -13
- package/dist/utils/devMode.js +0 -54
- package/dist/utils/escapeHandler.d.ts +0 -79
- package/dist/utils/escapeHandler.js +0 -153
- package/dist/utils/fileDialog.d.ts +0 -9
- package/dist/utils/fileDialog.js +0 -74
- package/dist/utils/fileUtils.d.ts +0 -40
- package/dist/utils/fileUtils.js +0 -185
- package/dist/utils/historyManager.d.ts +0 -45
- package/dist/utils/historyManager.js +0 -159
- package/dist/utils/incrementalSnapshot.d.ts +0 -109
- package/dist/utils/incrementalSnapshot.js +0 -383
- package/dist/utils/index.d.ts +0 -11
- package/dist/utils/index.js +0 -18
- package/dist/utils/languageConfig.d.ts +0 -21
- package/dist/utils/languageConfig.js +0 -61
- package/dist/utils/logger.d.ts +0 -37
- package/dist/utils/logger.js +0 -122
- package/dist/utils/mcpToolsManager.d.ts +0 -52
- package/dist/utils/mcpToolsManager.js +0 -878
- package/dist/utils/messageFormatter.d.ts +0 -12
- package/dist/utils/messageFormatter.js +0 -115
- package/dist/utils/notebookManager.d.ts +0 -59
- package/dist/utils/notebookManager.js +0 -213
- package/dist/utils/patch-highlight.d.ts +0 -5
- package/dist/utils/patch-highlight.js +0 -23
- package/dist/utils/processManager.d.ts +0 -27
- package/dist/utils/processManager.js +0 -75
- package/dist/utils/proxyUtils.d.ts +0 -15
- package/dist/utils/proxyUtils.js +0 -50
- package/dist/utils/resourceMonitor.d.ts +0 -65
- package/dist/utils/resourceMonitor.js +0 -175
- package/dist/utils/retryUtils.d.ts +0 -49
- package/dist/utils/retryUtils.js +0 -303
- package/dist/utils/sensitiveCommandManager.d.ts +0 -53
- package/dist/utils/sensitiveCommandManager.js +0 -308
- package/dist/utils/sessionConverter.d.ts +0 -7
- package/dist/utils/sessionConverter.js +0 -306
- package/dist/utils/sessionManager.d.ts +0 -53
- package/dist/utils/sessionManager.js +0 -371
- package/dist/utils/subAgentConfig.d.ts +0 -50
- package/dist/utils/subAgentConfig.js +0 -221
- package/dist/utils/subAgentExecutor.d.ts +0 -40
- package/dist/utils/subAgentExecutor.js +0 -434
- package/dist/utils/terminal.d.ts +0 -5
- package/dist/utils/terminal.js +0 -13
- package/dist/utils/textBuffer.d.ts +0 -99
- package/dist/utils/textBuffer.js +0 -547
- package/dist/utils/textUtils.d.ts +0 -37
- package/dist/utils/textUtils.js +0 -102
- package/dist/utils/themeConfig.d.ts +0 -21
- package/dist/utils/themeConfig.js +0 -61
- package/dist/utils/todoPreprocessor.d.ts +0 -5
- package/dist/utils/todoPreprocessor.js +0 -18
- package/dist/utils/todoScanner.d.ts +0 -8
- package/dist/utils/todoScanner.js +0 -148
- package/dist/utils/toolDisplayConfig.d.ts +0 -16
- package/dist/utils/toolDisplayConfig.js +0 -47
- package/dist/utils/toolExecutor.d.ts +0 -37
- package/dist/utils/toolExecutor.js +0 -224
- package/dist/utils/usageLogger.d.ts +0 -11
- package/dist/utils/usageLogger.js +0 -114
- package/dist/utils/vscodeConnection.d.ts +0 -76
- package/dist/utils/vscodeConnection.js +0 -430
- package/dist/utils/workspaceSnapshot.d.ts +0 -63
- package/dist/utils/workspaceSnapshot.js +0 -300
package/dist/api/gemini.js
DELETED
|
@@ -1,445 +0,0 @@
|
|
|
1
|
-
import { getOpenAiConfig, getCustomSystemPrompt, getCustomHeaders, } from '../utils/apiConfig.js';
|
|
2
|
-
import { getSystemPrompt } from './systemPrompt.js';
|
|
3
|
-
import { withRetryGenerator, parseJsonWithFix } from '../utils/retryUtils.js';
|
|
4
|
-
import { addProxyToFetchOptions } from '../utils/proxyUtils.js';
|
|
5
|
-
import { saveUsageToFile } from '../utils/usageLogger.js';
|
|
6
|
-
let geminiConfig = null;
|
|
7
|
-
function getGeminiConfig() {
|
|
8
|
-
if (!geminiConfig) {
|
|
9
|
-
const config = getOpenAiConfig();
|
|
10
|
-
if (!config.apiKey) {
|
|
11
|
-
throw new Error('Gemini API configuration is incomplete. Please configure API key first.');
|
|
12
|
-
}
|
|
13
|
-
const customHeaders = getCustomHeaders();
|
|
14
|
-
geminiConfig = {
|
|
15
|
-
apiKey: config.apiKey,
|
|
16
|
-
baseUrl: config.baseUrl && config.baseUrl !== 'https://api.openai.com/v1'
|
|
17
|
-
? config.baseUrl
|
|
18
|
-
: 'https://generativelanguage.googleapis.com/v1beta',
|
|
19
|
-
customHeaders,
|
|
20
|
-
geminiThinking: config.geminiThinking,
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
return geminiConfig;
|
|
24
|
-
}
|
|
25
|
-
export function resetGeminiClient() {
|
|
26
|
-
geminiConfig = null;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Convert OpenAI-style tools to Gemini function declarations
|
|
30
|
-
*/
|
|
31
|
-
function convertToolsToGemini(tools) {
|
|
32
|
-
if (!tools || tools.length === 0) {
|
|
33
|
-
return undefined;
|
|
34
|
-
}
|
|
35
|
-
const functionDeclarations = tools
|
|
36
|
-
.filter(tool => tool.type === 'function' && 'function' in tool)
|
|
37
|
-
.map(tool => {
|
|
38
|
-
if (tool.type === 'function' && 'function' in tool) {
|
|
39
|
-
// Convert OpenAI parameters schema to Gemini format
|
|
40
|
-
const params = tool.function.parameters;
|
|
41
|
-
return {
|
|
42
|
-
name: tool.function.name,
|
|
43
|
-
description: tool.function.description || '',
|
|
44
|
-
parametersJsonSchema: {
|
|
45
|
-
type: 'object',
|
|
46
|
-
properties: params.properties || {},
|
|
47
|
-
required: params.required || [],
|
|
48
|
-
},
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
throw new Error('Invalid tool format');
|
|
52
|
-
});
|
|
53
|
-
return [{ functionDeclarations }];
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Convert our ChatMessage format to Gemini's format
|
|
57
|
-
* @param messages - The messages to convert
|
|
58
|
-
* @param includeBuiltinSystemPrompt - Whether to include builtin system prompt (default true)
|
|
59
|
-
*/
|
|
60
|
-
function convertToGeminiMessages(messages, includeBuiltinSystemPrompt = true) {
|
|
61
|
-
const customSystemPrompt = getCustomSystemPrompt();
|
|
62
|
-
let systemInstruction;
|
|
63
|
-
const contents = [];
|
|
64
|
-
for (let i = 0; i < messages.length; i++) {
|
|
65
|
-
const msg = messages[i];
|
|
66
|
-
if (!msg)
|
|
67
|
-
continue;
|
|
68
|
-
// Extract system message as systemInstruction
|
|
69
|
-
if (msg.role === 'system') {
|
|
70
|
-
systemInstruction = msg.content;
|
|
71
|
-
continue;
|
|
72
|
-
}
|
|
73
|
-
// Handle tool results
|
|
74
|
-
if (msg.role === 'tool') {
|
|
75
|
-
// Find the corresponding function call to get the function name
|
|
76
|
-
// Look backwards in contents to find the matching tool call
|
|
77
|
-
let functionName = 'unknown_function';
|
|
78
|
-
for (let j = contents.length - 1; j >= 0; j--) {
|
|
79
|
-
const contentMsg = contents[j];
|
|
80
|
-
if (contentMsg.role === 'model' && contentMsg.parts) {
|
|
81
|
-
for (const part of contentMsg.parts) {
|
|
82
|
-
if (part.functionCall) {
|
|
83
|
-
functionName = part.functionCall.name;
|
|
84
|
-
break;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
if (functionName !== 'unknown_function')
|
|
88
|
-
break;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
// Tool response must be a valid object for Gemini API
|
|
92
|
-
// If content is a JSON string, parse it; otherwise wrap it in an object
|
|
93
|
-
let responseData;
|
|
94
|
-
const imageParts = [];
|
|
95
|
-
// Handle images from tool result
|
|
96
|
-
if (msg.images && msg.images.length > 0) {
|
|
97
|
-
for (const image of msg.images) {
|
|
98
|
-
imageParts.push({
|
|
99
|
-
inlineData: {
|
|
100
|
-
mimeType: image.mimeType,
|
|
101
|
-
data: image.data,
|
|
102
|
-
},
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
if (!msg.content) {
|
|
107
|
-
responseData = {};
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
let contentToParse = msg.content;
|
|
111
|
-
// Sometimes the content is double-encoded as JSON
|
|
112
|
-
// First, try to parse it once
|
|
113
|
-
const firstParseResult = parseJsonWithFix(contentToParse, {
|
|
114
|
-
toolName: 'Gemini tool response (first parse)',
|
|
115
|
-
logWarning: false,
|
|
116
|
-
logError: false,
|
|
117
|
-
});
|
|
118
|
-
if (firstParseResult.success &&
|
|
119
|
-
typeof firstParseResult.data === 'string') {
|
|
120
|
-
// If it's a string, it might be double-encoded, try parsing again
|
|
121
|
-
contentToParse = firstParseResult.data;
|
|
122
|
-
}
|
|
123
|
-
// Now parse or wrap the final content
|
|
124
|
-
const finalParseResult = parseJsonWithFix(contentToParse, {
|
|
125
|
-
toolName: 'Gemini tool response (final parse)',
|
|
126
|
-
logWarning: false,
|
|
127
|
-
logError: false,
|
|
128
|
-
});
|
|
129
|
-
if (finalParseResult.success) {
|
|
130
|
-
const parsed = finalParseResult.data;
|
|
131
|
-
// If parsed result is an object (not array, not null), use it directly
|
|
132
|
-
if (typeof parsed === 'object' &&
|
|
133
|
-
parsed !== null &&
|
|
134
|
-
!Array.isArray(parsed)) {
|
|
135
|
-
responseData = parsed;
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
// If it's a primitive, array, or null, wrap it
|
|
139
|
-
responseData = { content: parsed };
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
else {
|
|
143
|
-
// Not valid JSON, wrap the raw string
|
|
144
|
-
responseData = { content: contentToParse };
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
// Build parts array with functionResponse and optional images
|
|
148
|
-
const parts = [
|
|
149
|
-
{
|
|
150
|
-
functionResponse: {
|
|
151
|
-
name: functionName,
|
|
152
|
-
response: responseData,
|
|
153
|
-
},
|
|
154
|
-
},
|
|
155
|
-
];
|
|
156
|
-
// Add images as inline data parts
|
|
157
|
-
if (imageParts.length > 0) {
|
|
158
|
-
parts.push(...imageParts);
|
|
159
|
-
}
|
|
160
|
-
contents.push({
|
|
161
|
-
role: 'user',
|
|
162
|
-
parts,
|
|
163
|
-
});
|
|
164
|
-
continue;
|
|
165
|
-
}
|
|
166
|
-
// Handle tool calls in assistant messages
|
|
167
|
-
if (msg.role === 'assistant' &&
|
|
168
|
-
msg.tool_calls &&
|
|
169
|
-
msg.tool_calls.length > 0) {
|
|
170
|
-
const parts = [];
|
|
171
|
-
// Add text content if exists
|
|
172
|
-
if (msg.content) {
|
|
173
|
-
parts.push({ text: msg.content });
|
|
174
|
-
}
|
|
175
|
-
// Add function calls
|
|
176
|
-
for (const toolCall of msg.tool_calls) {
|
|
177
|
-
const argsParseResult = parseJsonWithFix(toolCall.function.arguments, {
|
|
178
|
-
toolName: `Gemini function call: ${toolCall.function.name}`,
|
|
179
|
-
fallbackValue: {},
|
|
180
|
-
logWarning: true,
|
|
181
|
-
logError: true,
|
|
182
|
-
});
|
|
183
|
-
parts.push({
|
|
184
|
-
functionCall: {
|
|
185
|
-
name: toolCall.function.name,
|
|
186
|
-
args: argsParseResult.data,
|
|
187
|
-
},
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
contents.push({
|
|
191
|
-
role: 'model',
|
|
192
|
-
parts,
|
|
193
|
-
});
|
|
194
|
-
continue;
|
|
195
|
-
}
|
|
196
|
-
// Build message parts
|
|
197
|
-
const parts = [];
|
|
198
|
-
// Add text content
|
|
199
|
-
if (msg.content) {
|
|
200
|
-
parts.push({ text: msg.content });
|
|
201
|
-
}
|
|
202
|
-
// Add images for user messages
|
|
203
|
-
if (msg.role === 'user' && msg.images && msg.images.length > 0) {
|
|
204
|
-
for (const image of msg.images) {
|
|
205
|
-
const base64Match = image.data.match(/^data:([^;]+);base64,(.+)$/);
|
|
206
|
-
if (base64Match) {
|
|
207
|
-
parts.push({
|
|
208
|
-
inlineData: {
|
|
209
|
-
mimeType: base64Match[1] || image.mimeType,
|
|
210
|
-
data: base64Match[2] || '',
|
|
211
|
-
},
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
// Add to contents
|
|
217
|
-
const role = msg.role === 'assistant' ? 'model' : 'user';
|
|
218
|
-
contents.push({ role, parts });
|
|
219
|
-
}
|
|
220
|
-
// Handle system instruction
|
|
221
|
-
// 如果配置了自定义系统提示词(最高优先级,始终添加)
|
|
222
|
-
if (customSystemPrompt) {
|
|
223
|
-
systemInstruction = customSystemPrompt;
|
|
224
|
-
if (includeBuiltinSystemPrompt) {
|
|
225
|
-
// Prepend default system prompt as first user message
|
|
226
|
-
contents.unshift({
|
|
227
|
-
role: 'user',
|
|
228
|
-
parts: [{ text: getSystemPrompt() }],
|
|
229
|
-
});
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
else if (!systemInstruction && includeBuiltinSystemPrompt) {
|
|
233
|
-
// 没有自定义系统提示词,但需要添加默认系统提示词
|
|
234
|
-
systemInstruction = getSystemPrompt();
|
|
235
|
-
}
|
|
236
|
-
return { systemInstruction, contents };
|
|
237
|
-
}
|
|
238
|
-
/**
|
|
239
|
-
* Create streaming chat completion using Gemini API
|
|
240
|
-
*/
|
|
241
|
-
export async function* createStreamingGeminiCompletion(options, abortSignal, onRetry) {
|
|
242
|
-
const config = getGeminiConfig();
|
|
243
|
-
// 使用重试包装生成器
|
|
244
|
-
yield* withRetryGenerator(async function* () {
|
|
245
|
-
const { systemInstruction, contents } = convertToGeminiMessages(options.messages, options.includeBuiltinSystemPrompt !== false);
|
|
246
|
-
// Build request payload
|
|
247
|
-
const requestBody = {
|
|
248
|
-
contents,
|
|
249
|
-
systemInstruction: systemInstruction
|
|
250
|
-
? { parts: [{ text: systemInstruction }] }
|
|
251
|
-
: undefined,
|
|
252
|
-
};
|
|
253
|
-
// Add thinking configuration if enabled
|
|
254
|
-
// Only include generationConfig when thinking is enabled
|
|
255
|
-
if (config.geminiThinking?.enabled) {
|
|
256
|
-
requestBody.generationConfig = {
|
|
257
|
-
thinkingConfig: {
|
|
258
|
-
thinkingBudget: config.geminiThinking.budget,
|
|
259
|
-
},
|
|
260
|
-
};
|
|
261
|
-
}
|
|
262
|
-
// Add tools if provided
|
|
263
|
-
const geminiTools = convertToolsToGemini(options.tools);
|
|
264
|
-
if (geminiTools) {
|
|
265
|
-
requestBody.tools = geminiTools;
|
|
266
|
-
}
|
|
267
|
-
// Extract model name from options.model (e.g., "gemini-pro" or "models/gemini-pro")
|
|
268
|
-
const modelName = options.model.startsWith('models/')
|
|
269
|
-
? options.model
|
|
270
|
-
: `models/${options.model}`;
|
|
271
|
-
const url = `${config.baseUrl}/${modelName}:streamGenerateContent?key=${config.apiKey}&alt=sse`;
|
|
272
|
-
const fetchOptions = addProxyToFetchOptions(url, {
|
|
273
|
-
method: 'POST',
|
|
274
|
-
headers: {
|
|
275
|
-
'Content-Type': 'application/json',
|
|
276
|
-
Authorization: `Bearer ${config.apiKey}`,
|
|
277
|
-
'x-snow': 'true',
|
|
278
|
-
...config.customHeaders,
|
|
279
|
-
},
|
|
280
|
-
body: JSON.stringify(requestBody),
|
|
281
|
-
signal: abortSignal,
|
|
282
|
-
});
|
|
283
|
-
const response = await fetch(url, fetchOptions);
|
|
284
|
-
if (!response.ok) {
|
|
285
|
-
const errorText = await response.text();
|
|
286
|
-
throw new Error(`Gemini API error: ${response.status} ${response.statusText} - ${errorText}`);
|
|
287
|
-
}
|
|
288
|
-
if (!response.body) {
|
|
289
|
-
throw new Error('No response body from Gemini API');
|
|
290
|
-
}
|
|
291
|
-
let contentBuffer = '';
|
|
292
|
-
let thinkingTextBuffer = ''; // Accumulate thinking text content
|
|
293
|
-
let toolCallsBuffer = [];
|
|
294
|
-
let hasToolCalls = false;
|
|
295
|
-
let toolCallIndex = 0;
|
|
296
|
-
let totalTokens = { prompt: 0, completion: 0, total: 0 };
|
|
297
|
-
// Parse SSE stream
|
|
298
|
-
const reader = response.body.getReader();
|
|
299
|
-
const decoder = new TextDecoder();
|
|
300
|
-
let buffer = '';
|
|
301
|
-
try {
|
|
302
|
-
while (true) {
|
|
303
|
-
const { done, value } = await reader.read();
|
|
304
|
-
if (done) {
|
|
305
|
-
// ✅ 关键修复:检查buffer是否有残留数据
|
|
306
|
-
if (buffer.trim()) {
|
|
307
|
-
// 连接异常中断,抛出明确错误
|
|
308
|
-
throw new Error(`Stream terminated unexpectedly with incomplete data: ${buffer.substring(0, 100)}...`);
|
|
309
|
-
}
|
|
310
|
-
break; // 正常结束
|
|
311
|
-
}
|
|
312
|
-
if (abortSignal?.aborted) {
|
|
313
|
-
return;
|
|
314
|
-
}
|
|
315
|
-
buffer += decoder.decode(value, { stream: true });
|
|
316
|
-
const lines = buffer.split('\n');
|
|
317
|
-
buffer = lines.pop() || '';
|
|
318
|
-
for (const line of lines) {
|
|
319
|
-
const trimmed = line.trim();
|
|
320
|
-
if (!trimmed || trimmed.startsWith(':'))
|
|
321
|
-
continue;
|
|
322
|
-
if (trimmed === 'data: [DONE]' || trimmed === 'data:[DONE]') {
|
|
323
|
-
break;
|
|
324
|
-
}
|
|
325
|
-
// Handle both "event: " and "event:" formats
|
|
326
|
-
if (trimmed.startsWith('event:')) {
|
|
327
|
-
// Event type, will be followed by data
|
|
328
|
-
continue;
|
|
329
|
-
}
|
|
330
|
-
// Handle both "data: " and "data:" formats
|
|
331
|
-
if (trimmed.startsWith('data:')) {
|
|
332
|
-
const data = trimmed.startsWith('data: ')
|
|
333
|
-
? trimmed.slice(6)
|
|
334
|
-
: trimmed.slice(5);
|
|
335
|
-
const parseResult = parseJsonWithFix(data, {
|
|
336
|
-
toolName: 'Gemini SSE stream',
|
|
337
|
-
logWarning: false,
|
|
338
|
-
logError: true,
|
|
339
|
-
});
|
|
340
|
-
if (parseResult.success) {
|
|
341
|
-
const chunk = parseResult.data;
|
|
342
|
-
// Process candidates
|
|
343
|
-
if (chunk.candidates && chunk.candidates.length > 0) {
|
|
344
|
-
const candidate = chunk.candidates[0];
|
|
345
|
-
if (candidate.content && candidate.content.parts) {
|
|
346
|
-
for (const part of candidate.content.parts) {
|
|
347
|
-
// Process thought content (Gemini thinking)
|
|
348
|
-
// When part.thought === true, the text field contains thinking content
|
|
349
|
-
if (part.thought === true && part.text) {
|
|
350
|
-
thinkingTextBuffer += part.text;
|
|
351
|
-
yield {
|
|
352
|
-
type: 'reasoning_delta',
|
|
353
|
-
delta: part.text,
|
|
354
|
-
};
|
|
355
|
-
}
|
|
356
|
-
// Process regular text content (when thought is not true)
|
|
357
|
-
else if (part.text) {
|
|
358
|
-
contentBuffer += part.text;
|
|
359
|
-
yield {
|
|
360
|
-
type: 'content',
|
|
361
|
-
content: part.text,
|
|
362
|
-
};
|
|
363
|
-
}
|
|
364
|
-
// Process function calls
|
|
365
|
-
if (part.functionCall) {
|
|
366
|
-
hasToolCalls = true;
|
|
367
|
-
const fc = part.functionCall;
|
|
368
|
-
const toolCall = {
|
|
369
|
-
id: `call_${toolCallIndex++}`,
|
|
370
|
-
type: 'function',
|
|
371
|
-
function: {
|
|
372
|
-
name: fc.name,
|
|
373
|
-
arguments: JSON.stringify(fc.args || {}),
|
|
374
|
-
},
|
|
375
|
-
};
|
|
376
|
-
toolCallsBuffer.push(toolCall);
|
|
377
|
-
// Yield delta for token counting
|
|
378
|
-
const deltaText = fc.name + JSON.stringify(fc.args || {});
|
|
379
|
-
yield {
|
|
380
|
-
type: 'tool_call_delta',
|
|
381
|
-
delta: deltaText,
|
|
382
|
-
};
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
// Track usage info
|
|
388
|
-
if (chunk.usageMetadata) {
|
|
389
|
-
totalTokens = {
|
|
390
|
-
prompt: chunk.usageMetadata.promptTokenCount || 0,
|
|
391
|
-
completion: chunk.usageMetadata.candidatesTokenCount || 0,
|
|
392
|
-
total: chunk.usageMetadata.totalTokenCount || 0,
|
|
393
|
-
};
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
catch (error) {
|
|
401
|
-
const { logger } = await import('../utils/logger.js');
|
|
402
|
-
logger.error('Gemini SSE stream parsing error:', {
|
|
403
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
404
|
-
remainingBuffer: buffer.substring(0, 200),
|
|
405
|
-
});
|
|
406
|
-
throw error;
|
|
407
|
-
}
|
|
408
|
-
// Yield tool calls if any
|
|
409
|
-
if (hasToolCalls && toolCallsBuffer.length > 0) {
|
|
410
|
-
yield {
|
|
411
|
-
type: 'tool_calls',
|
|
412
|
-
tool_calls: toolCallsBuffer,
|
|
413
|
-
};
|
|
414
|
-
}
|
|
415
|
-
// Yield usage info
|
|
416
|
-
if (totalTokens.total > 0) {
|
|
417
|
-
const usageData = {
|
|
418
|
-
prompt_tokens: totalTokens.prompt,
|
|
419
|
-
completion_tokens: totalTokens.completion,
|
|
420
|
-
total_tokens: totalTokens.total,
|
|
421
|
-
};
|
|
422
|
-
// Save usage to file system at API layer
|
|
423
|
-
saveUsageToFile(options.model, usageData);
|
|
424
|
-
yield {
|
|
425
|
-
type: 'usage',
|
|
426
|
-
usage: usageData,
|
|
427
|
-
};
|
|
428
|
-
}
|
|
429
|
-
// Return complete thinking block if thinking content exists
|
|
430
|
-
const thinkingBlock = thinkingTextBuffer
|
|
431
|
-
? {
|
|
432
|
-
type: 'thinking',
|
|
433
|
-
thinking: thinkingTextBuffer,
|
|
434
|
-
}
|
|
435
|
-
: undefined;
|
|
436
|
-
// Signal completion
|
|
437
|
-
yield {
|
|
438
|
-
type: 'done',
|
|
439
|
-
thinking: thinkingBlock,
|
|
440
|
-
};
|
|
441
|
-
}, {
|
|
442
|
-
abortSignal,
|
|
443
|
-
onRetry,
|
|
444
|
-
});
|
|
445
|
-
}
|
package/dist/api/models.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export interface Model {
|
|
2
|
-
id: string;
|
|
3
|
-
object: string;
|
|
4
|
-
created: number;
|
|
5
|
-
owned_by: string;
|
|
6
|
-
}
|
|
7
|
-
export interface ModelsResponse {
|
|
8
|
-
object: string;
|
|
9
|
-
data: Model[];
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Fetch available models based on configured request method
|
|
13
|
-
*/
|
|
14
|
-
export declare function fetchAvailableModels(): Promise<Model[]>;
|
|
15
|
-
export declare function filterModels(models: Model[], searchTerm: string): Model[];
|
package/dist/api/models.js
DELETED
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
import { getOpenAiConfig, getCustomHeaders } from '../utils/apiConfig.js';
|
|
2
|
-
/**
|
|
3
|
-
* Fetch models from OpenAI-compatible API
|
|
4
|
-
*/
|
|
5
|
-
async function fetchOpenAIModels(baseUrl, apiKey, customHeaders) {
|
|
6
|
-
const url = `${baseUrl}/models`;
|
|
7
|
-
const headers = {
|
|
8
|
-
'Content-Type': 'application/json',
|
|
9
|
-
...customHeaders,
|
|
10
|
-
};
|
|
11
|
-
if (apiKey) {
|
|
12
|
-
headers['Authorization'] = `Bearer ${apiKey}`;
|
|
13
|
-
}
|
|
14
|
-
const response = await fetch(url, {
|
|
15
|
-
method: 'GET',
|
|
16
|
-
headers,
|
|
17
|
-
});
|
|
18
|
-
if (!response.ok) {
|
|
19
|
-
throw new Error(`Failed to fetch models: ${response.status} ${response.statusText}`);
|
|
20
|
-
}
|
|
21
|
-
const data = await response.json();
|
|
22
|
-
return data.data || [];
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Fetch models from Gemini API
|
|
26
|
-
*/
|
|
27
|
-
async function fetchGeminiModels(baseUrl, apiKey) {
|
|
28
|
-
// Gemini uses API key as query parameter
|
|
29
|
-
const url = `${baseUrl}/models?key=${apiKey}`;
|
|
30
|
-
const response = await fetch(url, {
|
|
31
|
-
method: 'GET',
|
|
32
|
-
headers: {
|
|
33
|
-
'Content-Type': 'application/json',
|
|
34
|
-
},
|
|
35
|
-
});
|
|
36
|
-
if (!response.ok) {
|
|
37
|
-
throw new Error(`Failed to fetch models: ${response.status} ${response.statusText}`);
|
|
38
|
-
}
|
|
39
|
-
const data = await response.json();
|
|
40
|
-
// Convert Gemini format to standard Model format
|
|
41
|
-
return (data.models || []).map(model => ({
|
|
42
|
-
id: model.name.replace('models/', ''), // Remove "models/" prefix
|
|
43
|
-
object: 'model',
|
|
44
|
-
created: 0,
|
|
45
|
-
owned_by: 'google',
|
|
46
|
-
}));
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Fetch models from Anthropic API
|
|
50
|
-
* Supports both Anthropic native format and OpenAI-compatible format for backward compatibility
|
|
51
|
-
*/
|
|
52
|
-
async function fetchAnthropicModels(baseUrl, apiKey, customHeaders) {
|
|
53
|
-
const url = `${baseUrl}/models`;
|
|
54
|
-
const headers = {
|
|
55
|
-
'Content-Type': 'application/json',
|
|
56
|
-
...customHeaders,
|
|
57
|
-
};
|
|
58
|
-
if (apiKey) {
|
|
59
|
-
headers['x-api-key'] = apiKey;
|
|
60
|
-
headers['Authorization'] = `Bearer ${apiKey}`;
|
|
61
|
-
}
|
|
62
|
-
const response = await fetch(url, {
|
|
63
|
-
method: 'GET',
|
|
64
|
-
headers,
|
|
65
|
-
});
|
|
66
|
-
if (!response.ok) {
|
|
67
|
-
throw new Error(`Failed to fetch models: ${response.status} ${response.statusText}`);
|
|
68
|
-
}
|
|
69
|
-
const data = await response.json();
|
|
70
|
-
// Try to parse as Anthropic format first
|
|
71
|
-
if (data.data && Array.isArray(data.data) && data.data.length > 0) {
|
|
72
|
-
const firstItem = data.data[0];
|
|
73
|
-
// Check if it's Anthropic format (has created_at field)
|
|
74
|
-
if ('created_at' in firstItem && typeof firstItem.created_at === 'string') {
|
|
75
|
-
// Anthropic native format
|
|
76
|
-
return data.data.map(model => ({
|
|
77
|
-
id: model.id,
|
|
78
|
-
object: 'model',
|
|
79
|
-
created: new Date(model.created_at).getTime() / 1000,
|
|
80
|
-
owned_by: 'anthropic',
|
|
81
|
-
}));
|
|
82
|
-
}
|
|
83
|
-
// Fallback to OpenAI format (has created field as number)
|
|
84
|
-
if ('id' in firstItem && 'object' in firstItem) {
|
|
85
|
-
// OpenAI-compatible format
|
|
86
|
-
return data.data;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
// If no data array or empty, return empty array
|
|
90
|
-
return [];
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Fetch available models based on configured request method
|
|
94
|
-
*/
|
|
95
|
-
export async function fetchAvailableModels() {
|
|
96
|
-
const config = getOpenAiConfig();
|
|
97
|
-
if (!config.baseUrl) {
|
|
98
|
-
throw new Error('Base URL not configured. Please configure API settings first.');
|
|
99
|
-
}
|
|
100
|
-
const customHeaders = getCustomHeaders();
|
|
101
|
-
try {
|
|
102
|
-
let models;
|
|
103
|
-
switch (config.requestMethod) {
|
|
104
|
-
case 'gemini':
|
|
105
|
-
if (!config.apiKey) {
|
|
106
|
-
throw new Error('API key is required for Gemini API');
|
|
107
|
-
}
|
|
108
|
-
models = await fetchGeminiModels(config.baseUrl.replace(/\/$/, ''), config.apiKey);
|
|
109
|
-
break;
|
|
110
|
-
case 'anthropic':
|
|
111
|
-
if (!config.apiKey) {
|
|
112
|
-
throw new Error('API key is required for Anthropic API');
|
|
113
|
-
}
|
|
114
|
-
models = await fetchAnthropicModels(config.baseUrl.replace(/\/$/, ''), config.apiKey, customHeaders);
|
|
115
|
-
break;
|
|
116
|
-
case 'chat':
|
|
117
|
-
case 'responses':
|
|
118
|
-
default:
|
|
119
|
-
// OpenAI-compatible API
|
|
120
|
-
models = await fetchOpenAIModels(config.baseUrl.replace(/\/$/, ''), config.apiKey, customHeaders);
|
|
121
|
-
break;
|
|
122
|
-
}
|
|
123
|
-
// Sort models alphabetically by id for better UX
|
|
124
|
-
return models.sort((a, b) => a.id.localeCompare(b.id));
|
|
125
|
-
}
|
|
126
|
-
catch (error) {
|
|
127
|
-
if (error instanceof Error) {
|
|
128
|
-
throw new Error(`Error fetching models: ${error.message}`);
|
|
129
|
-
}
|
|
130
|
-
throw new Error('Unknown error occurred while fetching models');
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
export function filterModels(models, searchTerm) {
|
|
134
|
-
if (!searchTerm.trim()) {
|
|
135
|
-
return models;
|
|
136
|
-
}
|
|
137
|
-
const lowerSearchTerm = searchTerm.toLowerCase();
|
|
138
|
-
return models.filter(model => model.id.toLowerCase().includes(lowerSearchTerm));
|
|
139
|
-
}
|
package/dist/api/responses.d.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import type { ChatMessage, ToolCall, ChatCompletionTool, UsageInfo } from './types.js';
|
|
2
|
-
export interface ResponseOptions {
|
|
3
|
-
model: string;
|
|
4
|
-
messages: ChatMessage[];
|
|
5
|
-
stream?: boolean;
|
|
6
|
-
temperature?: number;
|
|
7
|
-
max_tokens?: number;
|
|
8
|
-
tools?: ChatCompletionTool[];
|
|
9
|
-
tool_choice?: 'auto' | 'none' | 'required';
|
|
10
|
-
reasoning?: {
|
|
11
|
-
summary?: 'auto' | 'none';
|
|
12
|
-
effort?: 'low' | 'medium' | 'high';
|
|
13
|
-
} | null;
|
|
14
|
-
prompt_cache_key?: string;
|
|
15
|
-
store?: boolean;
|
|
16
|
-
include?: string[];
|
|
17
|
-
includeBuiltinSystemPrompt?: boolean;
|
|
18
|
-
}
|
|
19
|
-
export interface ResponseStreamChunk {
|
|
20
|
-
type: 'content' | 'tool_calls' | 'tool_call_delta' | 'reasoning_delta' | 'reasoning_started' | 'reasoning_data' | 'done' | 'usage';
|
|
21
|
-
content?: string;
|
|
22
|
-
tool_calls?: ToolCall[];
|
|
23
|
-
delta?: string;
|
|
24
|
-
usage?: UsageInfo;
|
|
25
|
-
reasoning?: {
|
|
26
|
-
summary?: Array<{
|
|
27
|
-
type: 'summary_text';
|
|
28
|
-
text: string;
|
|
29
|
-
}>;
|
|
30
|
-
content?: any;
|
|
31
|
-
encrypted_content?: string;
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
export declare function resetOpenAIClient(): void;
|
|
35
|
-
/**
|
|
36
|
-
* 使用 Responses API 创建流式响应(带自动工具调用)
|
|
37
|
-
*/
|
|
38
|
-
export declare function createStreamingResponse(options: ResponseOptions, abortSignal?: AbortSignal, onRetry?: (error: Error, attempt: number, nextDelay: number) => void): AsyncGenerator<ResponseStreamChunk, void, unknown>;
|