@huyooo/ai-chat-core 0.2.45 → 0.3.2
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/dist/adapter/index.d.ts +11 -0
- package/dist/adapter/index.d.ts.map +1 -0
- package/dist/adapter/model-adapter.d.ts +25 -0
- package/dist/adapter/model-adapter.d.ts.map +1 -0
- package/dist/adapter/model-options.d.ts +53 -0
- package/dist/adapter/model-options.d.ts.map +1 -0
- package/dist/adapter/types.d.ts +28 -0
- package/dist/adapter/types.d.ts.map +1 -0
- package/dist/chat-runtime.d.ts +96 -0
- package/dist/chat-runtime.d.ts.map +1 -0
- package/dist/constants.d.ts +12 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/events.d.ts +605 -1
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +1 -1
- package/dist/extension/index.d.ts +9 -0
- package/dist/extension/index.d.ts.map +1 -0
- package/dist/extension/types.d.ts +46 -0
- package/dist/extension/types.d.ts.map +1 -0
- package/dist/families/index.d.ts +11 -0
- package/dist/families/index.d.ts.map +1 -0
- package/dist/families/presets.d.ts +31 -0
- package/dist/families/presets.d.ts.map +1 -0
- package/dist/families/resolver.d.ts +11 -0
- package/dist/families/resolver.d.ts.map +1 -0
- package/dist/families/types.d.ts +29 -0
- package/dist/families/types.d.ts.map +1 -0
- package/dist/governance/command-safety.d.ts +34 -0
- package/dist/governance/command-safety.d.ts.map +1 -0
- package/dist/governance/governance.d.ts +19 -0
- package/dist/governance/governance.d.ts.map +1 -0
- package/dist/governance/index.d.ts +12 -0
- package/dist/governance/index.d.ts.map +1 -0
- package/dist/governance/types.d.ts +29 -0
- package/dist/governance/types.d.ts.map +1 -0
- package/dist/index.d.ts +72 -804
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -1
- package/dist/internal/management-args.d.ts +13 -0
- package/dist/internal/management-args.d.ts.map +1 -0
- package/dist/internal/management-results.d.ts +21 -0
- package/dist/internal/management-results.d.ts.map +1 -0
- package/dist/llm-config.d.ts +108 -0
- package/dist/llm-config.d.ts.map +1 -0
- package/dist/logger/core.d.ts +31 -0
- package/dist/logger/core.d.ts.map +1 -0
- package/dist/logger/index.d.ts +9 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/orchestrator/compression-handler.d.ts +29 -0
- package/dist/orchestrator/compression-handler.d.ts.map +1 -0
- package/dist/orchestrator/context-compressor.d.ts +51 -0
- package/dist/orchestrator/context-compressor.d.ts.map +1 -0
- package/dist/orchestrator/context-summarizer.d.ts +41 -0
- package/dist/orchestrator/context-summarizer.d.ts.map +1 -0
- package/dist/orchestrator/index.d.ts +12 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/orchestrator.d.ts +46 -0
- package/dist/orchestrator/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator/types.d.ts +58 -0
- package/dist/orchestrator/types.d.ts.map +1 -0
- package/dist/parts/index.d.ts +13 -0
- package/dist/parts/index.d.ts.map +1 -0
- package/dist/parts/registry.d.ts +11 -0
- package/dist/parts/registry.d.ts.map +1 -0
- package/dist/parts/summaries.d.ts +9 -0
- package/dist/parts/summaries.d.ts.map +1 -0
- package/dist/parts/types.d.ts +61 -0
- package/dist/parts/types.d.ts.map +1 -0
- package/dist/platform.d.ts +17 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +1 -0
- package/dist/protocols/anthropic.d.ts +20 -0
- package/dist/protocols/anthropic.d.ts.map +1 -0
- package/dist/protocols/ark.d.ts +36 -0
- package/dist/protocols/ark.d.ts.map +1 -0
- package/dist/protocols/deepseek.d.ts +24 -0
- package/dist/protocols/deepseek.d.ts.map +1 -0
- package/dist/protocols/error-utils.d.ts +14 -0
- package/dist/protocols/error-utils.d.ts.map +1 -0
- package/dist/protocols/gemini.d.ts +24 -0
- package/dist/protocols/gemini.d.ts.map +1 -0
- package/dist/protocols/glm.d.ts +20 -0
- package/dist/protocols/glm.d.ts.map +1 -0
- package/dist/protocols/grok.d.ts +20 -0
- package/dist/protocols/grok.d.ts.map +1 -0
- package/dist/protocols/index.d.ts +31 -0
- package/dist/protocols/index.d.ts.map +1 -0
- package/dist/protocols/minimax.d.ts +38 -0
- package/dist/protocols/minimax.d.ts.map +1 -0
- package/dist/protocols/moonshot.d.ts +20 -0
- package/dist/protocols/moonshot.d.ts.map +1 -0
- package/dist/protocols/openai-sse.d.ts +33 -0
- package/dist/protocols/openai-sse.d.ts.map +1 -0
- package/dist/protocols/openai.d.ts +19 -0
- package/dist/protocols/openai.d.ts.map +1 -0
- package/dist/protocols/qwen.d.ts +26 -0
- package/dist/protocols/qwen.d.ts.map +1 -0
- package/dist/protocols/responses-sse.d.ts +30 -0
- package/dist/protocols/responses-sse.d.ts.map +1 -0
- package/dist/protocols/sse-reader.d.ts +23 -0
- package/dist/protocols/sse-reader.d.ts.map +1 -0
- package/dist/protocols/tool-arguments.d.ts +8 -0
- package/dist/protocols/tool-arguments.d.ts.map +1 -0
- package/dist/protocols/types.d.ts +148 -0
- package/dist/protocols/types.d.ts.map +1 -0
- package/dist/protocols/vercel-gateway.d.ts +15 -0
- package/dist/protocols/vercel-gateway.d.ts.map +1 -0
- package/dist/runtime.d.ts +151 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1 -0
- package/dist/skills/index.d.ts +14 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/management/admin.d.ts +10 -0
- package/dist/skills/management/admin.d.ts.map +1 -0
- package/dist/skills/management/index.d.ts +11 -0
- package/dist/skills/management/index.d.ts.map +1 -0
- package/dist/skills/management/inputs.d.ts +44 -0
- package/dist/skills/management/inputs.d.ts.map +1 -0
- package/dist/skills/management/operations.d.ts +78 -0
- package/dist/skills/management/operations.d.ts.map +1 -0
- package/dist/skills/management/types.d.ts +70 -0
- package/dist/skills/management/types.d.ts.map +1 -0
- package/dist/skills/registry.d.ts +37 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/summaries.d.ts +9 -0
- package/dist/skills/summaries.d.ts.map +1 -0
- package/dist/skills/types.d.ts +61 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/test-utils/mock-sse.d.ts +13 -0
- package/dist/test-utils/mock-sse.d.ts.map +1 -0
- package/dist/tool-manager/define-tool.d.ts +35 -0
- package/dist/tool-manager/define-tool.d.ts.map +1 -0
- package/dist/tool-manager/formats.d.ts +46 -0
- package/dist/tool-manager/formats.d.ts.map +1 -0
- package/dist/tool-manager/identity.d.ts +18 -0
- package/dist/tool-manager/identity.d.ts.map +1 -0
- package/dist/tool-manager/in-process-provider.d.ts +15 -0
- package/dist/tool-manager/in-process-provider.d.ts.map +1 -0
- package/dist/tool-manager/index.d.ts +18 -0
- package/dist/tool-manager/index.d.ts.map +1 -0
- package/dist/tool-manager/manager.d.ts +18 -0
- package/dist/tool-manager/manager.d.ts.map +1 -0
- package/dist/tool-manager/mcp-provider.d.ts +21 -0
- package/dist/tool-manager/mcp-provider.d.ts.map +1 -0
- package/dist/tool-manager/summaries.d.ts +39 -0
- package/dist/tool-manager/summaries.d.ts.map +1 -0
- package/dist/tool-manager/types.d.ts +314 -0
- package/dist/tool-manager/types.d.ts.map +1 -0
- package/dist/types.d.ts +663 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +26 -15
- package/src/adapter/index.ts +25 -0
- package/src/adapter/model-adapter.ts +196 -0
- package/src/adapter/model-options.ts +143 -0
- package/src/adapter/types.ts +41 -0
- package/src/chat-runtime.ts +515 -0
- package/src/constants.ts +9 -102
- package/src/events.ts +364 -150
- package/src/extension/index.ts +24 -0
- package/src/extension/types.ts +49 -0
- package/src/families/index.ts +28 -0
- package/src/families/presets.ts +124 -0
- package/src/families/resolver.ts +22 -0
- package/src/families/types.ts +55 -0
- package/src/governance/command-safety.ts +224 -0
- package/src/governance/governance.ts +125 -0
- package/src/governance/index.ts +38 -0
- package/src/governance/types.ts +44 -0
- package/src/index.ts +250 -145
- package/src/internal/management-args.ts +39 -0
- package/src/internal/management-results.ts +60 -0
- package/src/llm-config.ts +137 -0
- package/src/logger/core.ts +96 -0
- package/src/logger/index.ts +8 -0
- package/src/orchestrator/compression-handler.ts +137 -0
- package/src/{providers → orchestrator}/context-compressor.ts +79 -47
- package/src/orchestrator/context-summarizer.ts +123 -0
- package/src/orchestrator/index.ts +20 -0
- package/src/orchestrator/orchestrator.ts +1002 -0
- package/src/orchestrator/types.ts +70 -0
- package/src/parts/index.ts +20 -0
- package/src/parts/registry.ts +95 -0
- package/src/parts/summaries.ts +40 -0
- package/src/parts/types.ts +63 -0
- package/src/platform.ts +73 -0
- package/src/protocols/anthropic.ts +377 -0
- package/src/protocols/ark.ts +300 -0
- package/src/protocols/deepseek.ts +192 -0
- package/src/{providers/protocols → protocols}/error-utils.ts +17 -20
- package/src/protocols/gemini.ts +352 -0
- package/src/protocols/glm.ts +212 -0
- package/src/protocols/grok.ts +98 -0
- package/src/protocols/index.ts +48 -0
- package/src/protocols/minimax.ts +308 -0
- package/src/protocols/moonshot.ts +186 -0
- package/src/protocols/openai-sse.ts +156 -0
- package/src/protocols/openai.ts +97 -0
- package/src/protocols/qwen.ts +358 -0
- package/src/protocols/responses-sse.ts +224 -0
- package/src/protocols/sse-reader.ts +54 -0
- package/src/protocols/tool-arguments.ts +32 -0
- package/src/{providers/protocols → protocols}/types.ts +46 -37
- package/src/protocols/vercel-gateway.ts +391 -0
- package/src/runtime.ts +167 -0
- package/src/skills/index.ts +29 -0
- package/src/skills/management/admin.ts +170 -0
- package/src/skills/management/index.ts +27 -0
- package/src/skills/management/inputs.ts +79 -0
- package/src/skills/management/operations.ts +256 -0
- package/src/skills/management/types.ts +57 -0
- package/src/skills/registry.ts +120 -0
- package/src/skills/summaries.ts +48 -0
- package/src/skills/types.ts +65 -0
- package/src/test-utils/mock-sse.ts +3 -3
- package/src/tool-manager/define-tool.ts +201 -0
- package/src/tool-manager/formats.ts +146 -0
- package/src/tool-manager/identity.ts +80 -0
- package/src/tool-manager/in-process-provider.ts +164 -0
- package/src/tool-manager/index.ts +63 -0
- package/src/tool-manager/manager.ts +562 -0
- package/src/tool-manager/mcp-provider.ts +509 -0
- package/src/tool-manager/summaries.ts +136 -0
- package/src/tool-manager/types.ts +389 -0
- package/src/types.ts +750 -191
- package/dist/events-CU5D5ray.d.ts +0 -1128
- package/src/agent.ts +0 -409
- package/src/internal/update-plan.ts +0 -2
- package/src/internal/web-search.ts +0 -77
- package/src/mcp/client-manager.ts +0 -302
- package/src/mcp/index.ts +0 -2
- package/src/mcp/types.ts +0 -43
- package/src/providers/context-summarizer.ts +0 -70
- package/src/providers/index.ts +0 -125
- package/src/providers/model-registry.ts +0 -466
- package/src/providers/orchestrator.ts +0 -839
- package/src/providers/protocols/anthropic.ts +0 -406
- package/src/providers/protocols/ark.ts +0 -362
- package/src/providers/protocols/deepseek.ts +0 -344
- package/src/providers/protocols/gemini.ts +0 -350
- package/src/providers/protocols/index.ts +0 -36
- package/src/providers/protocols/openai.ts +0 -420
- package/src/providers/protocols/qwen.ts +0 -315
- package/src/providers/types.ts +0 -264
- package/src/providers/unified-adapter.ts +0 -367
- package/src/router.ts +0 -72
- package/src/tools.ts +0 -162
- package/src/utils.ts +0 -86
|
@@ -0,0 +1,515 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChatRuntime - 聊天运行时
|
|
3
|
+
*
|
|
4
|
+
* 新架构(ToolRuntimeManager 工具运行时管理):
|
|
5
|
+
* - Core Runtime:`tools` 配置注入的内核 in-process 能力
|
|
6
|
+
* - Local Assets:由 asset 管理链创建并扫描的 `tools/parts/skills/mcp-servers`
|
|
7
|
+
* - External Providers:外部 MCP 接入层
|
|
8
|
+
* - ModelAdapter / ChatOrchestrator / ToolRuntimeManager 负责把三层能力收口到运行时
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type {
|
|
12
|
+
AgentConfig,
|
|
13
|
+
ToolExecutor,
|
|
14
|
+
ChatOptions,
|
|
15
|
+
ThinkingMode,
|
|
16
|
+
Tool,
|
|
17
|
+
ToolContext,
|
|
18
|
+
ToolConfigItem,
|
|
19
|
+
DataEngineContext,
|
|
20
|
+
ToolExecutionAuditHooks,
|
|
21
|
+
} from './types';
|
|
22
|
+
import { resolveTools } from './types';
|
|
23
|
+
import type { ChatEvent } from './events';
|
|
24
|
+
import { createApiError } from './events';
|
|
25
|
+
import { DEFAULT_MODEL, AGENT_MODE_PROMPT } from './constants';
|
|
26
|
+
import { buildModelOptions } from './adapter';
|
|
27
|
+
import { resolveModelFamilyConfig } from './families';
|
|
28
|
+
import type { ModelFamilyConfig } from './families';
|
|
29
|
+
import type { ModelOption } from './adapter';
|
|
30
|
+
import type { McpServerConfig, McpConnectionInfo, ToolRuntimeManager } from './tool-manager';
|
|
31
|
+
import { createToolRuntimeManager, createInProcessProvider, createMcpProvider } from './tool-manager';
|
|
32
|
+
import type { LLMConfig } from './llm-config';
|
|
33
|
+
|
|
34
|
+
import type { OrchestratorContext, ToolExecutionHooks } from './orchestrator/types';
|
|
35
|
+
import type { ProtocolToolDefinition } from './protocols';
|
|
36
|
+
import { ChatOrchestrator } from './orchestrator';
|
|
37
|
+
import { ModelAdapter } from './adapter';
|
|
38
|
+
|
|
39
|
+
/** 运行时配置 */
|
|
40
|
+
export interface RuntimeConfig {
|
|
41
|
+
llmConfig: LLMConfig;
|
|
42
|
+
cwd: string;
|
|
43
|
+
maxIterations?: number;
|
|
44
|
+
maxDurationMs?: number;
|
|
45
|
+
maxToolCalls?: number;
|
|
46
|
+
maxTotalTokens?: number;
|
|
47
|
+
dataEngine?: DataEngineContext;
|
|
48
|
+
audit?: ToolExecutionAuditHooks;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function createAuditTraceId(): string {
|
|
52
|
+
return `tool-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* 聊天运行时
|
|
57
|
+
*
|
|
58
|
+
* 职责:
|
|
59
|
+
* 1. 管理 ModelAdapter(模型适配器)
|
|
60
|
+
* 2. 使用 ChatOrchestrator 统一处理工具调用
|
|
61
|
+
* 3. 通过 ToolRuntimeManager 统一管理所有工具
|
|
62
|
+
*/
|
|
63
|
+
export class ChatRuntime {
|
|
64
|
+
private config: RuntimeConfig;
|
|
65
|
+
private adapter: ModelAdapter;
|
|
66
|
+
private orchestrator: ChatOrchestrator;
|
|
67
|
+
private toolExecutor: ToolExecutor;
|
|
68
|
+
private abortController: AbortController | null = null;
|
|
69
|
+
|
|
70
|
+
private toolRuntimeManager: ToolRuntimeManager;
|
|
71
|
+
private toolConfig: ToolConfigItem[] | undefined;
|
|
72
|
+
private mcpConfigs: McpServerConfig[] | undefined;
|
|
73
|
+
private initialized = false;
|
|
74
|
+
|
|
75
|
+
constructor(config: AgentConfig, toolExecutor: ToolExecutor) {
|
|
76
|
+
if (!config.cwd) {
|
|
77
|
+
throw new Error('AgentConfig.cwd is required (browser-safe: no process.cwd() fallback)');
|
|
78
|
+
}
|
|
79
|
+
this.config = {
|
|
80
|
+
llmConfig: config.llmConfig,
|
|
81
|
+
cwd: config.cwd,
|
|
82
|
+
maxIterations: config.maxIterations,
|
|
83
|
+
maxDurationMs: config.maxDurationMs,
|
|
84
|
+
maxToolCalls: config.maxToolCalls,
|
|
85
|
+
maxTotalTokens: config.maxTotalTokens,
|
|
86
|
+
dataEngine: config.dataEngine,
|
|
87
|
+
audit: config.audit,
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
this.toolExecutor = toolExecutor;
|
|
91
|
+
this.toolConfig = config.tools;
|
|
92
|
+
this.mcpConfigs = config.mcpServers;
|
|
93
|
+
this.toolRuntimeManager = createToolRuntimeManager();
|
|
94
|
+
|
|
95
|
+
this.adapter = new ModelAdapter(config.llmConfig);
|
|
96
|
+
|
|
97
|
+
const summarizeFn = this.createDefaultSummarize();
|
|
98
|
+
|
|
99
|
+
this.orchestrator = new ChatOrchestrator({
|
|
100
|
+
maxIterations: config.maxIterations,
|
|
101
|
+
maxDurationMs: config.maxDurationMs,
|
|
102
|
+
maxToolCalls: config.maxToolCalls,
|
|
103
|
+
maxTotalTokens: config.maxTotalTokens,
|
|
104
|
+
executeTool: this.executeTool.bind(this),
|
|
105
|
+
tools: this.toolRuntimeManager.getSessionTools(),
|
|
106
|
+
getToolDescriptor: this.toolRuntimeManager.getDescriptor,
|
|
107
|
+
onToolApprovalRequest: config.onToolApprovalRequest,
|
|
108
|
+
getAutoRunConfig: config.getAutoRunConfig,
|
|
109
|
+
summarize: summarizeFn,
|
|
110
|
+
compressionConfig: config.llmConfig.compression,
|
|
111
|
+
llmConfig: config.llmConfig,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** 异步初始化工具(懒加载,允许桥接层显式触发) */
|
|
116
|
+
private async asyncInit(): Promise<void> {
|
|
117
|
+
if (this.initialized) return;
|
|
118
|
+
this.initialized = true;
|
|
119
|
+
|
|
120
|
+
// 第一层:注册 Core Runtime 的 in-process 内核能力
|
|
121
|
+
if (this.toolConfig) {
|
|
122
|
+
const resolvedTools = await resolveTools(this.toolConfig);
|
|
123
|
+
const builtinProvider = createInProcessProvider('builtin');
|
|
124
|
+
for (const tool of resolvedTools) {
|
|
125
|
+
builtinProvider.register(tool, { source: tool.source, category: tool.category, tags: tool.tags });
|
|
126
|
+
}
|
|
127
|
+
await this.toolRuntimeManager.addProvider(builtinProvider);
|
|
128
|
+
|
|
129
|
+
// 内置工具默认全部启用到会话
|
|
130
|
+
await this.toolRuntimeManager.enable(
|
|
131
|
+
builtinProvider.getDescriptors().map(d => d.id),
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// 第三层:注册 External Providers 的 MCP 连接
|
|
136
|
+
if (this.mcpConfigs?.length) {
|
|
137
|
+
const results = await Promise.allSettled(
|
|
138
|
+
this.mcpConfigs.map(async cfg => {
|
|
139
|
+
const provider = createMcpProvider(cfg);
|
|
140
|
+
await this.toolRuntimeManager.addProvider(provider);
|
|
141
|
+
// MCP 工具默认全部启用到会话
|
|
142
|
+
const descriptors = provider.getDescriptors();
|
|
143
|
+
await this.toolRuntimeManager.enable(descriptors.map(d => d.id));
|
|
144
|
+
}),
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
for (let i = 0; i < results.length; i++) {
|
|
148
|
+
if (results[i].status === 'rejected') {
|
|
149
|
+
console.error(`[MCP] ${this.mcpConfigs[i].name} 连接失败:`, (results[i] as PromiseRejectedResult).reason);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
getModelFamilyConfig(model: string): ModelFamilyConfig | undefined {
|
|
156
|
+
const modelConfig = this.config.llmConfig.models[model];
|
|
157
|
+
if (!modelConfig) return undefined;
|
|
158
|
+
return resolveModelFamilyConfig(model, modelConfig, this.config.llmConfig);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
getModelRouteInfo(model: string): { available: boolean; familyConfig?: ModelFamilyConfig } {
|
|
162
|
+
const modelConfig = this.config.llmConfig.models[model];
|
|
163
|
+
return {
|
|
164
|
+
available: this.adapter.supportsModel(model),
|
|
165
|
+
familyConfig: modelConfig ? resolveModelFamilyConfig(model, modelConfig, this.config.llmConfig) : undefined,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
private buildSystemPrompt(options: ChatOptions): string {
|
|
170
|
+
const model = options.model || DEFAULT_MODEL;
|
|
171
|
+
const mc = this.config.llmConfig.models[model];
|
|
172
|
+
const familyConfig = mc ? resolveModelFamilyConfig(model, mc, this.config.llmConfig) : undefined;
|
|
173
|
+
|
|
174
|
+
let prompt = AGENT_MODE_PROMPT;
|
|
175
|
+
|
|
176
|
+
if (options.platformPrompt) {
|
|
177
|
+
prompt += '\n\n' + options.platformPrompt;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
if (options.skillContents?.length) {
|
|
181
|
+
prompt += '\n\n【用户指令】\n' + options.skillContents.join('\n\n');
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const searchTool = this.findSearchTool();
|
|
185
|
+
if (options.enableWebSearch && searchTool) {
|
|
186
|
+
prompt += `\n\n【联网搜索】当用户问题需要实时信息/最新事实/可引用来源时,请先调用 ${searchTool.name} 工具获取结果,然后基于返回的 title/url/snippet 作答,并在回答中给出来源链接。`;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return prompt;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
private createToolContext(signal?: AbortSignal, hooks?: Partial<ToolExecutionHooks>): ToolContext {
|
|
193
|
+
const cwd = this.config.cwd;
|
|
194
|
+
const executor = this.toolExecutor;
|
|
195
|
+
return {
|
|
196
|
+
toolCallId: hooks?.toolCallId,
|
|
197
|
+
toolName: hooks?.toolName,
|
|
198
|
+
allowedToolNames: hooks?.allowedToolNames,
|
|
199
|
+
cwd,
|
|
200
|
+
exec: async (cmd: string, args?: string[], options?: { timeout?: number }) => {
|
|
201
|
+
const command = args?.length ? `${cmd} ${args.join(' ')}` : cmd;
|
|
202
|
+
const r = await executor.executeCommand(command, cwd, signal, {
|
|
203
|
+
onStdout: hooks?.onStdout,
|
|
204
|
+
onStderr: hooks?.onStderr,
|
|
205
|
+
}, options?.timeout);
|
|
206
|
+
return {
|
|
207
|
+
stdout: r.output ?? '',
|
|
208
|
+
stderr: r.error ?? '',
|
|
209
|
+
exitCode: r.success ? 0 : 1,
|
|
210
|
+
};
|
|
211
|
+
},
|
|
212
|
+
signal,
|
|
213
|
+
onStdout: hooks?.onStdout,
|
|
214
|
+
onStderr: hooks?.onStderr,
|
|
215
|
+
dataEngine: this.config.dataEngine,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
public async executeTool(
|
|
220
|
+
name: string,
|
|
221
|
+
args: Record<string, unknown>,
|
|
222
|
+
signal?: AbortSignal,
|
|
223
|
+
hooks?: ToolExecutionHooks,
|
|
224
|
+
): Promise<import('./types').ToolExecuteResult> {
|
|
225
|
+
const sessionTools = this.toolRuntimeManager.getSessionTools();
|
|
226
|
+
const tool = sessionTools.get(name);
|
|
227
|
+
if (!tool) {
|
|
228
|
+
return { error: `未知工具: ${name}` };
|
|
229
|
+
}
|
|
230
|
+
const descriptor = this.toolRuntimeManager.getDescriptor(name);
|
|
231
|
+
const auditGovernance = hooks?.governance;
|
|
232
|
+
const traceId = createAuditTraceId();
|
|
233
|
+
const audit = this.config.audit;
|
|
234
|
+
const auditToolCallId = audit?.startToolCall({
|
|
235
|
+
id: hooks?.toolCallId,
|
|
236
|
+
traceId,
|
|
237
|
+
extensionId: descriptor?.assetId ?? tool.assetId ?? null,
|
|
238
|
+
toolName: descriptor?.name ?? hooks?.toolName ?? tool.name,
|
|
239
|
+
displayName: descriptor?.displayName ?? tool.displayName ?? null,
|
|
240
|
+
source: descriptor?.source ?? tool.source ?? null,
|
|
241
|
+
cwd: this.config.cwd,
|
|
242
|
+
args,
|
|
243
|
+
approvalPolicy: auditGovernance?.approvalPolicy ?? descriptor?.approvalPolicy ?? tool.approvalPolicy ?? null,
|
|
244
|
+
sideEffectLevel: auditGovernance?.sideEffectLevel ?? descriptor?.sideEffectLevel ?? tool.sideEffectLevel ?? null,
|
|
245
|
+
hostDependency: auditGovernance?.hostDependency ?? descriptor?.hostDependency ?? tool.hostDependency ?? null,
|
|
246
|
+
metadata: {
|
|
247
|
+
alias: descriptor?.alias ?? tool.alias ?? name,
|
|
248
|
+
provider: descriptor?.provider,
|
|
249
|
+
category: descriptor?.category ?? tool.category,
|
|
250
|
+
tags: descriptor?.tags ?? tool.tags,
|
|
251
|
+
},
|
|
252
|
+
}) ?? hooks?.toolCallId;
|
|
253
|
+
const context = this.createToolContext(signal, {
|
|
254
|
+
...hooks,
|
|
255
|
+
toolCallId: auditToolCallId ?? hooks?.toolCallId,
|
|
256
|
+
toolName: descriptor?.name ?? hooks?.toolName ?? tool.name,
|
|
257
|
+
});
|
|
258
|
+
try {
|
|
259
|
+
const result = await (audit
|
|
260
|
+
? audit.runWithContext({ toolCallId: auditToolCallId ?? null, traceId }, () => tool.execute(args, context))
|
|
261
|
+
: tool.execute(args, context));
|
|
262
|
+
if (auditToolCallId) {
|
|
263
|
+
audit?.finishToolCall({ toolCallId: auditToolCallId, traceId, result });
|
|
264
|
+
}
|
|
265
|
+
return result;
|
|
266
|
+
} catch (error) {
|
|
267
|
+
if (auditToolCallId) {
|
|
268
|
+
audit?.failToolCall({ toolCallId: auditToolCallId, traceId, error });
|
|
269
|
+
}
|
|
270
|
+
throw error;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
private getToolDefinitions(enabledTools?: string[], forceInclude?: string[]): ProtocolToolDefinition[] {
|
|
275
|
+
const sessionTools = this.toolRuntimeManager.getSessionTools();
|
|
276
|
+
const allTools = Array.from(sessionTools.values());
|
|
277
|
+
let selected = enabledTools !== undefined
|
|
278
|
+
? allTools.filter(t => enabledTools.includes(t.name))
|
|
279
|
+
: allTools;
|
|
280
|
+
|
|
281
|
+
if (forceInclude?.length) {
|
|
282
|
+
for (const name of forceInclude) {
|
|
283
|
+
if (!selected.some(t => t.name === name)) {
|
|
284
|
+
const t = sessionTools.get(name);
|
|
285
|
+
if (t) selected = [...selected, t];
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
return selected.map(tool => ({
|
|
291
|
+
name: tool.name,
|
|
292
|
+
description: tool.description,
|
|
293
|
+
parameters: tool.parameters,
|
|
294
|
+
}));
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/** 查找第一个搜索工具(通过 ui.name 以 _search 结尾标识) */
|
|
298
|
+
private findSearchTool(): Tool | undefined {
|
|
299
|
+
for (const t of this.toolRuntimeManager.getSessionTools().values()) {
|
|
300
|
+
if (t.ui?.type === 'render' && t.ui.name.endsWith('_search')) return t;
|
|
301
|
+
}
|
|
302
|
+
return undefined;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/** 获取所有搜索工具名(enableWebSearch 开启时 forceInclude 用) */
|
|
306
|
+
private getSearchToolNames(): string[] {
|
|
307
|
+
const names: string[] = [];
|
|
308
|
+
for (const t of this.toolRuntimeManager.getSessionTools().values()) {
|
|
309
|
+
if (t.ui?.type === 'render' && t.ui.name.endsWith('_search')) names.push(t.name);
|
|
310
|
+
}
|
|
311
|
+
return names;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
public getAllTools(): Array<{
|
|
315
|
+
name: string;
|
|
316
|
+
description: string;
|
|
317
|
+
displayName: string;
|
|
318
|
+
assetId: string;
|
|
319
|
+
source: import('./governance').AssetSource;
|
|
320
|
+
category: string;
|
|
321
|
+
parameters?: import('./types').JsonSchemaObject;
|
|
322
|
+
outputSchema?: import('./types').JsonSchemaObject;
|
|
323
|
+
resolvedOutputSchema?: import('./types').JsonSchemaObject;
|
|
324
|
+
errorSchema?: import('./types').JsonSchemaObject;
|
|
325
|
+
approvalPolicy?: import('./governance').AssetApprovalPolicy;
|
|
326
|
+
sideEffectLevel?: import('./governance').AssetSideEffectLevel;
|
|
327
|
+
hostDependency?: import('./governance').AssetHostDependency;
|
|
328
|
+
}> {
|
|
329
|
+
return this.toolRuntimeManager.getSessionToolNames()
|
|
330
|
+
.map((name) => {
|
|
331
|
+
const descriptor = this.toolRuntimeManager.getDescriptor(name);
|
|
332
|
+
if (!descriptor) return null;
|
|
333
|
+
return {
|
|
334
|
+
name: descriptor.alias,
|
|
335
|
+
description: descriptor.description,
|
|
336
|
+
displayName: descriptor.displayName,
|
|
337
|
+
assetId: descriptor.assetId,
|
|
338
|
+
source: descriptor.source,
|
|
339
|
+
category: descriptor.category,
|
|
340
|
+
parameters: descriptor.parameters,
|
|
341
|
+
outputSchema: descriptor.outputSchema,
|
|
342
|
+
resolvedOutputSchema: descriptor.resolvedOutputSchema,
|
|
343
|
+
errorSchema: descriptor.errorSchema,
|
|
344
|
+
approvalPolicy: descriptor.approvalPolicy,
|
|
345
|
+
sideEffectLevel: descriptor.sideEffectLevel,
|
|
346
|
+
hostDependency: descriptor.hostDependency,
|
|
347
|
+
};
|
|
348
|
+
})
|
|
349
|
+
.filter((item): item is NonNullable<typeof item> => !!item);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/** 显式确保工具完成初始化,供 bridge / 宿主在聊天前读取工具列表使用 */
|
|
353
|
+
public async ensureInitialized(): Promise<void> {
|
|
354
|
+
await this.asyncInit();
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/** 获取 ToolRuntimeManager(供外部 assetManager 等集成使用) */
|
|
358
|
+
public getToolRuntimeManager(): ToolRuntimeManager {
|
|
359
|
+
return this.toolRuntimeManager;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* 聊天入口
|
|
364
|
+
*/
|
|
365
|
+
async *chat(
|
|
366
|
+
message: string,
|
|
367
|
+
options: ChatOptions = {},
|
|
368
|
+
images?: string[],
|
|
369
|
+
): AsyncGenerator<ChatEvent> {
|
|
370
|
+
await this.ensureInitialized();
|
|
371
|
+
|
|
372
|
+
this.abortController = new AbortController();
|
|
373
|
+
const signal = this.abortController.signal;
|
|
374
|
+
|
|
375
|
+
const model = options.model || DEFAULT_MODEL;
|
|
376
|
+
|
|
377
|
+
if (!this.adapter.supportsModel(model)) {
|
|
378
|
+
yield createApiError(`模型 ${model} 未在 LLMConfig.models 中配置`, { code: 'MODEL_NOT_SUPPORTED' });
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
const modelConfig = this.config.llmConfig.models[model];
|
|
383
|
+
if (!modelConfig) {
|
|
384
|
+
yield createApiError(`模型 ${model} 未在 LLMConfig.models 中配置`, { code: 'MODEL_NOT_SUPPORTED' });
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
const familyConfig = resolveModelFamilyConfig(model, modelConfig, this.config.llmConfig);
|
|
388
|
+
if (!familyConfig) {
|
|
389
|
+
yield createApiError(`模型 ${model} 无法解析家族配置`, { code: 'MODEL_NOT_SUPPORTED' });
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
const supportsThinking = modelConfig.supportsThinking;
|
|
394
|
+
// 未传 thinkingMode 时:支持思考的模型默认 enabled(与前端 useChat thinking 默认 true 一致);不支持则 disabled
|
|
395
|
+
const rawThinkingMode = options.thinkingMode ?? (supportsThinking ? 'enabled' : 'disabled');
|
|
396
|
+
const thinkingMode: ThinkingMode = rawThinkingMode === 'enabled' ? 'enabled' : 'disabled';
|
|
397
|
+
const systemPrompt = this.buildSystemPrompt(options);
|
|
398
|
+
|
|
399
|
+
const isAskMode = options.mode === 'ask';
|
|
400
|
+
const enableSearch = !isAskMode && !!options.enableWebSearch;
|
|
401
|
+
|
|
402
|
+
const searchToolNames = enableSearch ? this.getSearchToolNames() : undefined;
|
|
403
|
+
const resolveCloudTools = async () => {
|
|
404
|
+
if (isAskMode) return [];
|
|
405
|
+
const enabledTools = options.resolveEnabledTools
|
|
406
|
+
? await options.resolveEnabledTools()
|
|
407
|
+
: options.enabledTools;
|
|
408
|
+
return this.getToolDefinitions(enabledTools, searchToolNames);
|
|
409
|
+
};
|
|
410
|
+
const cloudTools = await resolveCloudTools();
|
|
411
|
+
|
|
412
|
+
const userTools = options.userTools || [];
|
|
413
|
+
const userToolDefinitions = userTools.map(t => ({
|
|
414
|
+
name: t.name,
|
|
415
|
+
description: t.description,
|
|
416
|
+
parameters: {
|
|
417
|
+
...t.parameters,
|
|
418
|
+
required: t.parameters.required || [],
|
|
419
|
+
},
|
|
420
|
+
}));
|
|
421
|
+
|
|
422
|
+
const tools = [...cloudTools, ...userToolDefinitions];
|
|
423
|
+
|
|
424
|
+
const clientToolNames = userTools.length > 0
|
|
425
|
+
? new Set(userTools.map(t => t.name))
|
|
426
|
+
: undefined;
|
|
427
|
+
|
|
428
|
+
const enableThinking = thinkingMode === 'enabled' && supportsThinking;
|
|
429
|
+
|
|
430
|
+
const history = options.history || [];
|
|
431
|
+
|
|
432
|
+
const context: OrchestratorContext = {
|
|
433
|
+
systemPrompt,
|
|
434
|
+
history,
|
|
435
|
+
tools,
|
|
436
|
+
refreshTools: userToolDefinitions.length > 0
|
|
437
|
+
? async () => [...await resolveCloudTools(), ...userToolDefinitions]
|
|
438
|
+
: resolveCloudTools,
|
|
439
|
+
signal,
|
|
440
|
+
images,
|
|
441
|
+
clientToolNames,
|
|
442
|
+
};
|
|
443
|
+
|
|
444
|
+
try {
|
|
445
|
+
yield* this.orchestrator.chat(this.adapter, message, context, {
|
|
446
|
+
model,
|
|
447
|
+
enableThinking,
|
|
448
|
+
autoRunConfig: options.autoRunConfig,
|
|
449
|
+
maxIterations: options.maxIterations,
|
|
450
|
+
maxDurationMs: options.maxDurationMs,
|
|
451
|
+
maxToolCalls: options.maxToolCalls,
|
|
452
|
+
maxTotalTokens: options.maxTotalTokens,
|
|
453
|
+
});
|
|
454
|
+
} finally {
|
|
455
|
+
this.abortController = null;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
abort(): void {
|
|
460
|
+
if (this.abortController) {
|
|
461
|
+
this.abortController.abort();
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
setCwd(dir: string): void {
|
|
466
|
+
this.config.cwd = dir;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
getConfig(): RuntimeConfig {
|
|
470
|
+
return { ...this.config };
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
getSupportedModels(): ModelOption[] {
|
|
474
|
+
return buildModelOptions(this.config.llmConfig);
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
getMcpConnections(): McpConnectionInfo[] {
|
|
478
|
+
return this.toolRuntimeManager.getMcpConnectionInfos();
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
/**
|
|
482
|
+
* 创建内置 summarize 实现
|
|
483
|
+
*/
|
|
484
|
+
private createDefaultSummarize(): ((systemPrompt: string, userPrompt: string, model: string) => Promise<string>) | undefined {
|
|
485
|
+
return async (systemPrompt: string, userPrompt: string, model: string): Promise<string> => {
|
|
486
|
+
if (!this.adapter.supportsModel(model)) {
|
|
487
|
+
throw new Error(`压缩模型 ${model} 无可用路由,请在 LLMConfig.models 中配置`);
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
const abortController = new AbortController();
|
|
491
|
+
const messages = [
|
|
492
|
+
{ role: 'system' as const, content: systemPrompt },
|
|
493
|
+
{ role: 'user' as const, content: userPrompt },
|
|
494
|
+
];
|
|
495
|
+
|
|
496
|
+
let text = '';
|
|
497
|
+
for await (const event of this.adapter.streamOnce(messages, [], {
|
|
498
|
+
model,
|
|
499
|
+
signal: abortController.signal,
|
|
500
|
+
})) {
|
|
501
|
+
if (event.type === 'text_delta' && event.delta) {
|
|
502
|
+
text += event.delta;
|
|
503
|
+
}
|
|
504
|
+
if (event.type === 'error') {
|
|
505
|
+
throw new Error(event.error ?? '压缩请求失败');
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
return text.trim();
|
|
509
|
+
};
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
async destroy(): Promise<void> {
|
|
513
|
+
await this.toolRuntimeManager.destroy();
|
|
514
|
+
}
|
|
515
|
+
}
|
package/src/constants.ts
CHANGED
|
@@ -1,112 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 常量定义
|
|
3
|
-
*
|
|
4
|
-
*
|
|
3
|
+
*
|
|
4
|
+
* 非模型相关的常量。模型数据唯一来源为 LLMConfig。
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
// ====================
|
|
8
|
-
export const DEFAULT_ARK_URL = 'https://ark.cn-beijing.volces.com/api/v3';
|
|
9
|
-
// Qwen 使用 OpenAI 兼容模式以支持工具调用
|
|
10
|
-
export const DEFAULT_QWEN_URL = 'https://dashscope.aliyuncs.com/compatible-mode/v1';
|
|
11
|
-
export const DEFAULT_OPENROUTER_URL = 'https://openrouter.ai/api/v1';
|
|
12
|
-
|
|
13
|
-
// ==================== 模型配置类型 ====================
|
|
14
|
-
interface ModelConfig {
|
|
15
|
-
id: string;
|
|
16
|
-
displayName: string;
|
|
17
|
-
isOpenRouter?: boolean;
|
|
18
|
-
/** 提供商名称(用于分组) */
|
|
19
|
-
provider?: string;
|
|
20
|
-
/** 模型描述 */
|
|
21
|
-
description?: string;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// ==================== 豆包模型 (ARK) ====================
|
|
25
|
-
export const DOUBAO_SEED_1_8: ModelConfig = {
|
|
26
|
-
id: 'doubao-seed-1-8-251215',
|
|
27
|
-
displayName: '豆包 Seed 1.8',
|
|
28
|
-
provider: '豆包',
|
|
29
|
-
};
|
|
30
|
-
export const DOUBAO_SEED_1_6: ModelConfig = {
|
|
31
|
-
id: 'doubao-seed-1-6-250615',
|
|
32
|
-
displayName: '豆包 Seed 1.6',
|
|
33
|
-
provider: '豆包',
|
|
34
|
-
};
|
|
35
|
-
export const DOUBAO_SEED_1_6_LATEST: ModelConfig = {
|
|
36
|
-
id: 'doubao-seed-1-6-251015',
|
|
37
|
-
displayName: '豆包 Seed 1.6 Latest',
|
|
38
|
-
provider: '豆包',
|
|
39
|
-
};
|
|
40
|
-
export const DOUBAO_SEED_1_6_FLASH: ModelConfig = {
|
|
41
|
-
id: 'doubao-seed-1-6-flash-250617',
|
|
42
|
-
displayName: '豆包 Seed 1.6 Flash',
|
|
43
|
-
provider: '豆包',
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
// ==================== DeepSeek 模型 (ARK) ====================
|
|
47
|
-
export const DEEPSEEK_V3: ModelConfig = {
|
|
48
|
-
id: 'deepseek-v3-2-251201',
|
|
49
|
-
displayName: 'DeepSeek V3.2',
|
|
50
|
-
// 展示层显式标注:该模型通过 ARK(火山/豆包平台)托管接入
|
|
51
|
-
provider: 'DeepSeek(ARK)',
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
// ==================== 通义千问模型 ====================
|
|
55
|
-
export const QWEN_MAX: ModelConfig = { id: 'qwen-max', displayName: '通义千问 Max', provider: '通义千问' };
|
|
56
|
-
export const QWEN_MAX_LATEST: ModelConfig = { id: 'qwen-max-latest', displayName: '通义千问 Max Latest', provider: '通义千问' };
|
|
57
|
-
export const QWEN_PLUS: ModelConfig = { id: 'qwen-plus', displayName: '通义千问 Plus', provider: '通义千问' };
|
|
58
|
-
export const QWEN_PLUS_LATEST: ModelConfig = { id: 'qwen-plus-latest', displayName: '通义千问 Plus Latest', provider: '通义千问' };
|
|
59
|
-
export const QWEN_TURBO: ModelConfig = { id: 'qwen-turbo', displayName: '通义千问 Turbo', provider: '通义千问' };
|
|
60
|
-
export const QWEN_TURBO_LATEST: ModelConfig = { id: 'qwen-turbo-latest', displayName: '通义千问 Turbo Latest', provider: '通义千问' };
|
|
61
|
-
export const QWEN3_235B: ModelConfig = { id: 'qwen3-235b-a22b', displayName: 'Qwen3 235B', provider: '通义千问' };
|
|
62
|
-
export const QWEN3_MAX_PREVIEW: ModelConfig = {
|
|
63
|
-
id: 'qwen3-max-preview',
|
|
64
|
-
displayName: '通义千问 3 Max',
|
|
65
|
-
provider: '通义千问',
|
|
66
|
-
};
|
|
7
|
+
// ==================== 协议默认 URL ====================
|
|
67
8
|
|
|
68
|
-
|
|
69
|
-
export const
|
|
70
|
-
export const GEMINI_2_5_PRO: ModelConfig = { id: 'gemini-2.5-pro-preview-05-06', displayName: 'Gemini 2.5 Pro', provider: 'Gemini' };
|
|
71
|
-
export const GEMINI_2_0_FLASH: ModelConfig = { id: 'gemini-2.0-flash', displayName: 'Gemini 2.0 Flash', provider: 'Gemini' };
|
|
72
|
-
export const GEMINI_2_0_FLASH_LITE: ModelConfig = { id: 'gemini-2.0-flash-lite', displayName: 'Gemini 2.0 Flash Lite', provider: 'Gemini' };
|
|
73
|
-
export const GEMINI_3_PRO: ModelConfig = {
|
|
74
|
-
id: 'gemini-3-pro-preview',
|
|
75
|
-
displayName: 'Gemini 3 Pro',
|
|
76
|
-
provider: 'Gemini',
|
|
77
|
-
};
|
|
78
|
-
// 图片模型(仅 id)
|
|
79
|
-
export const GEMINI_IMAGE_MODEL = 'gemini-2.0-flash';
|
|
80
|
-
export const GEMINI_IMAGE_GEN_MODEL = 'gemini-3-pro-image-preview';
|
|
9
|
+
export const DEFAULT_ARK_URL = 'https://ark.cn-beijing.volces.com/api/v3';
|
|
10
|
+
export const DEFAULT_AIMLAPI_URL = 'https://api.aimlapi.com/v1';
|
|
81
11
|
|
|
82
|
-
// ====================
|
|
83
|
-
export const OR_GPT_5_1: ModelConfig = {
|
|
84
|
-
id: 'openai/gpt-5.1-codex',
|
|
85
|
-
displayName: 'GPT-5.1 Codex',
|
|
86
|
-
isOpenRouter: true,
|
|
87
|
-
provider: 'OpenAI',
|
|
88
|
-
};
|
|
89
|
-
export const CLAUDE_OPUS_4_5: ModelConfig = {
|
|
90
|
-
id: 'anthropic/claude-opus-4.5',
|
|
91
|
-
displayName: 'Claude Opus 4.5',
|
|
92
|
-
provider: 'Anthropic',
|
|
93
|
-
};
|
|
12
|
+
// ==================== 默认配置 ====================
|
|
94
13
|
|
|
95
|
-
|
|
96
|
-
export const
|
|
97
|
-
// 原生模型
|
|
98
|
-
DOUBAO_SEED_1_6,
|
|
99
|
-
DEEPSEEK_V3,
|
|
100
|
-
QWEN3_MAX_PREVIEW,
|
|
101
|
-
GEMINI_3_PRO,
|
|
102
|
-
// OpenRouter 模型
|
|
103
|
-
OR_GPT_5_1,
|
|
104
|
-
// Vercel AI SDK 模型
|
|
105
|
-
CLAUDE_OPUS_4_5,
|
|
106
|
-
];
|
|
14
|
+
/** 默认模型 ID(仅用于应用层未指定时的 fallback,不是唯一真相源) */
|
|
15
|
+
export const DEFAULT_MODEL = 'doubao-seed-2-0-pro-260215';
|
|
107
16
|
|
|
108
|
-
// ====================
|
|
109
|
-
export const DEFAULT_MODEL = DOUBAO_SEED_1_6.id;
|
|
17
|
+
// ==================== 提示词 ====================
|
|
110
18
|
|
|
111
19
|
/** agent 模式提示词(核心库通用,不引用具体工具名) */
|
|
112
20
|
export const AGENT_MODE_PROMPT = `你是一个专业的 AI 助手,具备自主执行复杂任务的能力。
|
|
@@ -122,4 +30,3 @@ export const AGENT_MODE_PROMPT = `你是一个专业的 AI 助手,具备自主
|
|
|
122
30
|
- 不使用表情符号(emoji),除非用户要求
|
|
123
31
|
- 使用 Markdown 格式组织内容
|
|
124
32
|
- 代码块使用正确的语言标识`;
|
|
125
|
-
|