@huyooo/ai-chat-core 0.2.45 → 0.3.3

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.
Files changed (247) hide show
  1. package/dist/adapter/index.d.ts +11 -0
  2. package/dist/adapter/index.d.ts.map +1 -0
  3. package/dist/adapter/model-adapter.d.ts +25 -0
  4. package/dist/adapter/model-adapter.d.ts.map +1 -0
  5. package/dist/adapter/model-options.d.ts +53 -0
  6. package/dist/adapter/model-options.d.ts.map +1 -0
  7. package/dist/adapter/types.d.ts +28 -0
  8. package/dist/adapter/types.d.ts.map +1 -0
  9. package/dist/chat-runtime.d.ts +96 -0
  10. package/dist/chat-runtime.d.ts.map +1 -0
  11. package/dist/constants.d.ts +12 -0
  12. package/dist/constants.d.ts.map +1 -0
  13. package/dist/events.d.ts +605 -1
  14. package/dist/events.d.ts.map +1 -0
  15. package/dist/events.js +1 -1
  16. package/dist/extension/index.d.ts +9 -0
  17. package/dist/extension/index.d.ts.map +1 -0
  18. package/dist/extension/types.d.ts +46 -0
  19. package/dist/extension/types.d.ts.map +1 -0
  20. package/dist/families/index.d.ts +11 -0
  21. package/dist/families/index.d.ts.map +1 -0
  22. package/dist/families/presets.d.ts +31 -0
  23. package/dist/families/presets.d.ts.map +1 -0
  24. package/dist/families/resolver.d.ts +11 -0
  25. package/dist/families/resolver.d.ts.map +1 -0
  26. package/dist/families/types.d.ts +29 -0
  27. package/dist/families/types.d.ts.map +1 -0
  28. package/dist/governance/command-safety.d.ts +34 -0
  29. package/dist/governance/command-safety.d.ts.map +1 -0
  30. package/dist/governance/governance.d.ts +19 -0
  31. package/dist/governance/governance.d.ts.map +1 -0
  32. package/dist/governance/index.d.ts +12 -0
  33. package/dist/governance/index.d.ts.map +1 -0
  34. package/dist/governance/types.d.ts +29 -0
  35. package/dist/governance/types.d.ts.map +1 -0
  36. package/dist/index.d.ts +72 -804
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +51 -1
  39. package/dist/internal/management-args.d.ts +13 -0
  40. package/dist/internal/management-args.d.ts.map +1 -0
  41. package/dist/internal/management-results.d.ts +21 -0
  42. package/dist/internal/management-results.d.ts.map +1 -0
  43. package/dist/llm-config.d.ts +108 -0
  44. package/dist/llm-config.d.ts.map +1 -0
  45. package/dist/logger/core.d.ts +31 -0
  46. package/dist/logger/core.d.ts.map +1 -0
  47. package/dist/logger/index.d.ts +9 -0
  48. package/dist/logger/index.d.ts.map +1 -0
  49. package/dist/orchestrator/compression-handler.d.ts +29 -0
  50. package/dist/orchestrator/compression-handler.d.ts.map +1 -0
  51. package/dist/orchestrator/context-compressor.d.ts +51 -0
  52. package/dist/orchestrator/context-compressor.d.ts.map +1 -0
  53. package/dist/orchestrator/context-summarizer.d.ts +41 -0
  54. package/dist/orchestrator/context-summarizer.d.ts.map +1 -0
  55. package/dist/orchestrator/index.d.ts +12 -0
  56. package/dist/orchestrator/index.d.ts.map +1 -0
  57. package/dist/orchestrator/orchestrator.d.ts +46 -0
  58. package/dist/orchestrator/orchestrator.d.ts.map +1 -0
  59. package/dist/orchestrator/types.d.ts +58 -0
  60. package/dist/orchestrator/types.d.ts.map +1 -0
  61. package/dist/parts/index.d.ts +13 -0
  62. package/dist/parts/index.d.ts.map +1 -0
  63. package/dist/parts/registry.d.ts +11 -0
  64. package/dist/parts/registry.d.ts.map +1 -0
  65. package/dist/parts/summaries.d.ts +9 -0
  66. package/dist/parts/summaries.d.ts.map +1 -0
  67. package/dist/parts/types.d.ts +61 -0
  68. package/dist/parts/types.d.ts.map +1 -0
  69. package/dist/platform.d.ts +17 -0
  70. package/dist/platform.d.ts.map +1 -0
  71. package/dist/platform.js +1 -0
  72. package/dist/protocols/anthropic.d.ts +20 -0
  73. package/dist/protocols/anthropic.d.ts.map +1 -0
  74. package/dist/protocols/ark.d.ts +36 -0
  75. package/dist/protocols/ark.d.ts.map +1 -0
  76. package/dist/protocols/deepseek.d.ts +24 -0
  77. package/dist/protocols/deepseek.d.ts.map +1 -0
  78. package/dist/protocols/error-utils.d.ts +14 -0
  79. package/dist/protocols/error-utils.d.ts.map +1 -0
  80. package/dist/protocols/gemini.d.ts +24 -0
  81. package/dist/protocols/gemini.d.ts.map +1 -0
  82. package/dist/protocols/glm.d.ts +20 -0
  83. package/dist/protocols/glm.d.ts.map +1 -0
  84. package/dist/protocols/grok.d.ts +20 -0
  85. package/dist/protocols/grok.d.ts.map +1 -0
  86. package/dist/protocols/index.d.ts +31 -0
  87. package/dist/protocols/index.d.ts.map +1 -0
  88. package/dist/protocols/minimax.d.ts +38 -0
  89. package/dist/protocols/minimax.d.ts.map +1 -0
  90. package/dist/protocols/moonshot.d.ts +20 -0
  91. package/dist/protocols/moonshot.d.ts.map +1 -0
  92. package/dist/protocols/openai-sse.d.ts +33 -0
  93. package/dist/protocols/openai-sse.d.ts.map +1 -0
  94. package/dist/protocols/openai.d.ts +19 -0
  95. package/dist/protocols/openai.d.ts.map +1 -0
  96. package/dist/protocols/qwen.d.ts +26 -0
  97. package/dist/protocols/qwen.d.ts.map +1 -0
  98. package/dist/protocols/responses-sse.d.ts +30 -0
  99. package/dist/protocols/responses-sse.d.ts.map +1 -0
  100. package/dist/protocols/sse-reader.d.ts +23 -0
  101. package/dist/protocols/sse-reader.d.ts.map +1 -0
  102. package/dist/protocols/tool-arguments.d.ts +8 -0
  103. package/dist/protocols/tool-arguments.d.ts.map +1 -0
  104. package/dist/protocols/types.d.ts +148 -0
  105. package/dist/protocols/types.d.ts.map +1 -0
  106. package/dist/protocols/vercel-gateway.d.ts +15 -0
  107. package/dist/protocols/vercel-gateway.d.ts.map +1 -0
  108. package/dist/runtime.d.ts +151 -0
  109. package/dist/runtime.d.ts.map +1 -0
  110. package/dist/runtime.js +1 -0
  111. package/dist/skills/index.d.ts +14 -0
  112. package/dist/skills/index.d.ts.map +1 -0
  113. package/dist/skills/management/admin.d.ts +10 -0
  114. package/dist/skills/management/admin.d.ts.map +1 -0
  115. package/dist/skills/management/index.d.ts +11 -0
  116. package/dist/skills/management/index.d.ts.map +1 -0
  117. package/dist/skills/management/inputs.d.ts +44 -0
  118. package/dist/skills/management/inputs.d.ts.map +1 -0
  119. package/dist/skills/management/operations.d.ts +78 -0
  120. package/dist/skills/management/operations.d.ts.map +1 -0
  121. package/dist/skills/management/types.d.ts +70 -0
  122. package/dist/skills/management/types.d.ts.map +1 -0
  123. package/dist/skills/registry.d.ts +37 -0
  124. package/dist/skills/registry.d.ts.map +1 -0
  125. package/dist/skills/summaries.d.ts +9 -0
  126. package/dist/skills/summaries.d.ts.map +1 -0
  127. package/dist/skills/types.d.ts +61 -0
  128. package/dist/skills/types.d.ts.map +1 -0
  129. package/dist/test-utils/mock-sse.d.ts +13 -0
  130. package/dist/test-utils/mock-sse.d.ts.map +1 -0
  131. package/dist/tool-manager/define-tool.d.ts +35 -0
  132. package/dist/tool-manager/define-tool.d.ts.map +1 -0
  133. package/dist/tool-manager/formats.d.ts +46 -0
  134. package/dist/tool-manager/formats.d.ts.map +1 -0
  135. package/dist/tool-manager/identity.d.ts +18 -0
  136. package/dist/tool-manager/identity.d.ts.map +1 -0
  137. package/dist/tool-manager/in-process-provider.d.ts +15 -0
  138. package/dist/tool-manager/in-process-provider.d.ts.map +1 -0
  139. package/dist/tool-manager/index.d.ts +18 -0
  140. package/dist/tool-manager/index.d.ts.map +1 -0
  141. package/dist/tool-manager/manager.d.ts +18 -0
  142. package/dist/tool-manager/manager.d.ts.map +1 -0
  143. package/dist/tool-manager/mcp-provider.d.ts +21 -0
  144. package/dist/tool-manager/mcp-provider.d.ts.map +1 -0
  145. package/dist/tool-manager/summaries.d.ts +39 -0
  146. package/dist/tool-manager/summaries.d.ts.map +1 -0
  147. package/dist/tool-manager/types.d.ts +314 -0
  148. package/dist/tool-manager/types.d.ts.map +1 -0
  149. package/dist/types.d.ts +663 -0
  150. package/dist/types.d.ts.map +1 -0
  151. package/package.json +26 -15
  152. package/src/adapter/index.ts +25 -0
  153. package/src/adapter/model-adapter.ts +196 -0
  154. package/src/adapter/model-options.ts +143 -0
  155. package/src/adapter/types.ts +41 -0
  156. package/src/chat-runtime.ts +515 -0
  157. package/src/constants.ts +9 -102
  158. package/src/events.ts +364 -150
  159. package/src/extension/index.ts +24 -0
  160. package/src/extension/types.ts +49 -0
  161. package/src/families/index.ts +28 -0
  162. package/src/families/presets.ts +124 -0
  163. package/src/families/resolver.ts +22 -0
  164. package/src/families/types.ts +55 -0
  165. package/src/governance/command-safety.ts +224 -0
  166. package/src/governance/governance.ts +125 -0
  167. package/src/governance/index.ts +38 -0
  168. package/src/governance/types.ts +44 -0
  169. package/src/index.ts +250 -145
  170. package/src/internal/management-args.ts +39 -0
  171. package/src/internal/management-results.ts +60 -0
  172. package/src/llm-config.ts +137 -0
  173. package/src/logger/core.ts +96 -0
  174. package/src/logger/index.ts +8 -0
  175. package/src/orchestrator/compression-handler.ts +137 -0
  176. package/src/{providers → orchestrator}/context-compressor.ts +79 -47
  177. package/src/orchestrator/context-summarizer.ts +123 -0
  178. package/src/orchestrator/index.ts +20 -0
  179. package/src/orchestrator/orchestrator.ts +1002 -0
  180. package/src/orchestrator/types.ts +70 -0
  181. package/src/parts/index.ts +20 -0
  182. package/src/parts/registry.ts +95 -0
  183. package/src/parts/summaries.ts +40 -0
  184. package/src/parts/types.ts +63 -0
  185. package/src/platform.ts +73 -0
  186. package/src/protocols/anthropic.ts +377 -0
  187. package/src/protocols/ark.ts +300 -0
  188. package/src/protocols/deepseek.ts +192 -0
  189. package/src/{providers/protocols → protocols}/error-utils.ts +17 -20
  190. package/src/protocols/gemini.ts +352 -0
  191. package/src/protocols/glm.ts +212 -0
  192. package/src/protocols/grok.ts +98 -0
  193. package/src/protocols/index.ts +48 -0
  194. package/src/protocols/minimax.ts +308 -0
  195. package/src/protocols/moonshot.ts +186 -0
  196. package/src/protocols/openai-sse.ts +156 -0
  197. package/src/protocols/openai.ts +97 -0
  198. package/src/protocols/qwen.ts +358 -0
  199. package/src/protocols/responses-sse.ts +224 -0
  200. package/src/protocols/sse-reader.ts +54 -0
  201. package/src/protocols/tool-arguments.ts +32 -0
  202. package/src/{providers/protocols → protocols}/types.ts +46 -37
  203. package/src/protocols/vercel-gateway.ts +391 -0
  204. package/src/runtime.ts +167 -0
  205. package/src/skills/index.ts +29 -0
  206. package/src/skills/management/admin.ts +170 -0
  207. package/src/skills/management/index.ts +27 -0
  208. package/src/skills/management/inputs.ts +79 -0
  209. package/src/skills/management/operations.ts +256 -0
  210. package/src/skills/management/types.ts +57 -0
  211. package/src/skills/registry.ts +120 -0
  212. package/src/skills/summaries.ts +48 -0
  213. package/src/skills/types.ts +65 -0
  214. package/src/test-utils/mock-sse.ts +3 -3
  215. package/src/tool-manager/define-tool.ts +201 -0
  216. package/src/tool-manager/formats.ts +146 -0
  217. package/src/tool-manager/identity.ts +80 -0
  218. package/src/tool-manager/in-process-provider.ts +164 -0
  219. package/src/tool-manager/index.ts +63 -0
  220. package/src/tool-manager/manager.ts +562 -0
  221. package/src/tool-manager/mcp-provider.ts +509 -0
  222. package/src/tool-manager/summaries.ts +136 -0
  223. package/src/tool-manager/types.ts +389 -0
  224. package/src/types.ts +750 -191
  225. package/dist/events-CU5D5ray.d.ts +0 -1128
  226. package/src/agent.ts +0 -409
  227. package/src/internal/update-plan.ts +0 -2
  228. package/src/internal/web-search.ts +0 -77
  229. package/src/mcp/client-manager.ts +0 -302
  230. package/src/mcp/index.ts +0 -2
  231. package/src/mcp/types.ts +0 -43
  232. package/src/providers/context-summarizer.ts +0 -70
  233. package/src/providers/index.ts +0 -125
  234. package/src/providers/model-registry.ts +0 -466
  235. package/src/providers/orchestrator.ts +0 -839
  236. package/src/providers/protocols/anthropic.ts +0 -406
  237. package/src/providers/protocols/ark.ts +0 -362
  238. package/src/providers/protocols/deepseek.ts +0 -344
  239. package/src/providers/protocols/gemini.ts +0 -350
  240. package/src/providers/protocols/index.ts +0 -36
  241. package/src/providers/protocols/openai.ts +0 -420
  242. package/src/providers/protocols/qwen.ts +0 -315
  243. package/src/providers/types.ts +0 -264
  244. package/src/providers/unified-adapter.ts +0 -367
  245. package/src/router.ts +0 -72
  246. package/src/tools.ts +0 -162
  247. package/src/utils.ts +0 -86
@@ -1,466 +0,0 @@
1
- /**
2
- * 模型注册表
3
- *
4
- * 核心设计:Protocol + Family 分离
5
- * - Protocol:负责 API 通信协议(HTTP/SSE/认证)
6
- * - Family:负责模型行为差异(thinking格式、搜索方式、工具格式)
7
- *
8
- * 这样设计的好处:
9
- * 1. 同协议不同行为的模型可以复用协议层(如 ARK 上的豆包和 DeepSeek)
10
- * 2. 新增模型只需配置 family,无需修改 adapter 代码
11
- * 3. 行为差异集中管理,易于维护
12
- */
13
-
14
- // ==================== 模型家族定义 ====================
15
-
16
- /** 模型家族 ID */
17
- export type ModelFamilyId =
18
- | 'doubao' // 豆包系列
19
- | 'deepseek' // DeepSeek 系列
20
- | 'qwen' // 通义千问系列
21
- | 'gemini' // Gemini 系列
22
- | 'gpt' // GPT 系列(OpenAI)
23
- | 'claude'; // Claude 系列(Anthropic)
24
-
25
- /** 协议类型 */
26
- export type ProtocolId =
27
- | 'ark' // 火山引擎 Responses API(豆包)
28
- | 'deepseek' // DeepSeek(通过火山引擎 ARK)
29
- | 'qwen' // 通义千问 DashScope API
30
- | 'gemini' // Google Gemini API
31
- | 'openai' // OpenAI API(通过 OpenRouter)
32
- | 'anthropic'; // Anthropic API(通过 OpenRouter)
33
-
34
- /** Thinking 输出格式 */
35
- export type ThinkingFormat =
36
- | 'reasoning' // ARK/豆包/DeepSeek: reasoning_summary_text
37
- | 'thinking_enabled' // Qwen: thinking 参数
38
- | 'thought_signature' // Gemini: 需要 thought_signature 循环
39
- | 'none'; // 不支持 thinking
40
-
41
- /**
42
- * 搜索实现方式(谁提供搜索、行为是否由我们统一)
43
- * - provider_native:厂商原生,协议层各自实现(ARK type:web_search / Gemini googleSearch 等),行为各异
44
- * - tavily:我们注入 Tavily web_search 工具,行为一致(GPT/Claude/Qwen/Gemini 有工具时)
45
- */
46
- export type SearchStrategy =
47
- | 'provider_native'
48
- | 'tavily';
49
-
50
- /** 工具调用格式 */
51
- export type ToolCallFormat =
52
- | 'responses' // ARK Responses API: function_call/function_call_output
53
- | 'openai' // OpenAI 兼容: tool_calls/tool
54
- | 'gemini'; // Gemini: functionCall/functionResponse
55
-
56
- /**
57
- * 模型家族配置
58
- * 定义同一家族模型的共同行为特征
59
- */
60
- export interface ModelFamilyConfig {
61
- /** 家族 ID */
62
- id: ModelFamilyId;
63
- /** 显示名称 */
64
- displayName: string;
65
-
66
- // === 多模态配置 ===
67
- /** 是否支持图片理解 */
68
- supportsVision: boolean;
69
-
70
- // === Thinking 配置 ===
71
- /** 是否支持 thinking */
72
- supportsThinking: boolean;
73
- /** Thinking 输出格式 */
74
- thinkingFormat: ThinkingFormat;
75
-
76
- // === 搜索配置 ===
77
- /** 是否支持原生搜索 */
78
- supportsNativeSearch: boolean;
79
- /** 搜索实现方式 */
80
- searchStrategy: SearchStrategy;
81
-
82
- // === 工具调用配置 ===
83
- /** 工具调用格式 */
84
- toolCallFormat: ToolCallFormat;
85
-
86
- // === 默认参数 ===
87
- /** 默认最大输出 token */
88
- defaultMaxTokens?: number;
89
- /** 是否需要特殊处理(如 Gemini 的 thought_signature) */
90
- requiresSpecialHandling?: string[];
91
- }
92
-
93
- // ==================== 家族配置定义 ====================
94
-
95
- /** 豆包家族(联网搜索统一走 web_search_ai/Tavily,与其它模型事件与数据格式一致) */
96
- export const DOUBAO_FAMILY: ModelFamilyConfig = {
97
- id: 'doubao',
98
- displayName: '豆包',
99
- supportsVision: true,
100
- supportsThinking: true,
101
- thinkingFormat: 'reasoning',
102
- supportsNativeSearch: false,
103
- searchStrategy: 'tavily',
104
- toolCallFormat: 'responses',
105
- // Seed 1.6 最大输出 16K(默认 4K,需手动设置)
106
- defaultMaxTokens: 16384,
107
- };
108
-
109
- /** DeepSeek 家族(联网搜索统一走 web_search_ai/Tavily,与其它模型事件与数据格式一致) */
110
- export const DEEPSEEK_FAMILY: ModelFamilyConfig = {
111
- id: 'deepseek',
112
- displayName: 'DeepSeek',
113
- supportsVision: false,
114
- supportsThinking: true,
115
- thinkingFormat: 'reasoning',
116
- supportsNativeSearch: false,
117
- searchStrategy: 'tavily',
118
- toolCallFormat: 'responses',
119
- defaultMaxTokens: 32768,
120
- };
121
-
122
- /** 通义千问家族 */
123
- /** Qwen 家族(使用 Tavily 统一搜索) */
124
- export const QWEN_FAMILY: ModelFamilyConfig = {
125
- id: 'qwen',
126
- displayName: '通义千问',
127
- supportsVision: false,
128
- supportsThinking: true,
129
- thinkingFormat: 'thinking_enabled',
130
- supportsNativeSearch: false, // 关闭原生搜索,使用 Tavily
131
- searchStrategy: 'tavily',
132
- toolCallFormat: 'openai',
133
- defaultMaxTokens: 32768,
134
- };
135
-
136
- /** Gemini 家族(注意:googleSearch 不能与其他工具同时使用,有工具时走 Tavily) */
137
- export const GEMINI_FAMILY: ModelFamilyConfig = {
138
- id: 'gemini',
139
- displayName: 'Gemini',
140
- supportsVision: true,
141
- supportsThinking: true,
142
- thinkingFormat: 'thought_signature',
143
- supportsNativeSearch: false, // googleSearch 与其他工具冲突,统一使用 Tavily
144
- searchStrategy: 'tavily',
145
- toolCallFormat: 'gemini',
146
- defaultMaxTokens: 65536,
147
- requiresSpecialHandling: ['thought_signature'],
148
- };
149
-
150
- /** GPT 家族 */
151
- export const GPT_FAMILY: ModelFamilyConfig = {
152
- id: 'gpt',
153
- displayName: 'GPT',
154
- supportsVision: true,
155
- supportsThinking: true, // GPT-5.x 支持 reasoning
156
- thinkingFormat: 'reasoning',
157
- supportsNativeSearch: false,
158
- searchStrategy: 'tavily',
159
- toolCallFormat: 'openai',
160
- defaultMaxTokens: 128000,
161
- };
162
-
163
- /** Claude 家族(使用 Vercel AI SDK / @ai-sdk/anthropic) */
164
- export const CLAUDE_FAMILY: ModelFamilyConfig = {
165
- id: 'claude',
166
- displayName: 'Claude',
167
- supportsVision: true,
168
- supportsThinking: true,
169
- thinkingFormat: 'reasoning',
170
- supportsNativeSearch: false,
171
- searchStrategy: 'tavily',
172
- toolCallFormat: 'openai',
173
- // Bedrock fallback 限制 64K output,取 64000 保证各 provider 兼容
174
- defaultMaxTokens: 64000,
175
- };
176
-
177
- /** 家族配置映射 */
178
- export const MODEL_FAMILIES: Record<ModelFamilyId, ModelFamilyConfig> = {
179
- doubao: DOUBAO_FAMILY,
180
- deepseek: DEEPSEEK_FAMILY,
181
- qwen: QWEN_FAMILY,
182
- gemini: GEMINI_FAMILY,
183
- gpt: GPT_FAMILY,
184
- claude: CLAUDE_FAMILY,
185
- };
186
-
187
- // ==================== 模型注册项 ====================
188
-
189
- /**
190
- * 模型注册项
191
- */
192
- export interface ModelRegistryEntry {
193
- /** 模型 ID(API 调用用) */
194
- id: string;
195
- /** 显示名称 */
196
- displayName: string;
197
- /** 所属家族 */
198
- family: ModelFamilyId;
199
- /** 使用的协议 */
200
- protocol: ProtocolId;
201
- /** 是否在前端显示 */
202
- visible?: boolean;
203
- /** 是否支持图片理解(优先级高于 family.supportsVision) */
204
- supportsVision?: boolean;
205
- /** 上下文窗口大小(如 "256K"),用于展示 */
206
- contextWindow?: string;
207
- /** 上下文窗口精确 token 数(用于压缩器计算) */
208
- contextWindowTokens?: number;
209
- /** 价格信息(数组,分行显示) */
210
- pricing?: string[];
211
- }
212
-
213
- // ==================== 模型注册表 ====================
214
-
215
- /**
216
- * 全局模型注册表
217
- *
218
- * 每个模型只有一家供应商,无需分组
219
- */
220
- export const MODEL_REGISTRY: ModelRegistryEntry[] = [
221
- // 豆包(价格为输入<=32k档,输出价格取决于输出长度)
222
- { id: 'doubao-seed-1-6-250615', displayName: '豆包 Seed 1.6', family: 'doubao', protocol: 'ark', visible: true, supportsVision: true, contextWindow: '256K', contextWindowTokens: 256_000, pricing: ['输入 0.8 元/百万tokens', '输出 2-8 元/百万tokens'] },
223
- { id: 'doubao-seed-1-8-251215', displayName: '豆包 Seed 1.8', family: 'doubao', protocol: 'ark', contextWindow: '256K', contextWindowTokens: 256_000, pricing: ['输入 0.8 元/百万tokens', '输出 2-8 元/百万tokens'] },
224
-
225
- // DeepSeek(价格为输入<=32k档)
226
- { id: 'deepseek-v3-2-251201', displayName: 'DeepSeek V3.2', family: 'deepseek', protocol: 'deepseek', visible: true, supportsVision: false, contextWindow: '128K', contextWindowTokens: 128_000, pricing: ['输入 2 元/百万tokens', '输出 3 元/百万tokens'] },
227
-
228
- // 通义千问
229
- { id: 'qwen3-vl-plus', displayName: '通义千问 3 VL', family: 'qwen', protocol: 'qwen', visible: true, supportsVision: true, contextWindow: '262K', contextWindowTokens: 262_144, pricing: ['输入 1 元/百万tokens', '输出 10 元/百万tokens'] },
230
- { id: 'qwen3.5-plus', displayName: '通义千问 3.5 Plus', family: 'qwen', protocol: 'qwen', contextWindow: '1M', contextWindowTokens: 1_000_000, pricing: ['输入 0.8 元/百万tokens', '输出 4.8 元/百万tokens'] },
231
- { id: 'qwen-long', displayName: '通义千问 Long', family: 'qwen', protocol: 'qwen', contextWindow: '10M', contextWindowTokens: 10_000_000, pricing: ['输入 0.5 元/百万tokens', '输出 2 元/百万tokens'] },
232
-
233
- // Gemini
234
- { id: 'gemini-3-pro-preview', displayName: 'Gemini 3 Pro', family: 'gemini', protocol: 'gemini', visible: true, supportsVision: true, contextWindow: '1M', contextWindowTokens: 1_000_000, pricing: ['输入 1.25 元/百万tokens', '输出 10 元/百万tokens'] },
235
- { id: 'gemini-2.5-flash-preview-05-20', displayName: 'Gemini 2.5 Flash', family: 'gemini', protocol: 'gemini', contextWindow: '1M', contextWindowTokens: 1_000_000, pricing: ['输入 0.15 元/百万tokens', '输出 0.6 元/百万tokens'] },
236
- { id: 'gemini-2.5-pro-preview-05-06', displayName: 'Gemini 2.5 Pro', family: 'gemini', protocol: 'gemini', contextWindow: '1M', contextWindowTokens: 1_000_000, pricing: ['输入 1.25 元/百万tokens', '输出 10 元/百万tokens'] },
237
-
238
- // GPT(OpenRouter,美元价格按约7.2汇率换算)
239
- { id: 'openai/gpt-5.2', displayName: 'GPT-5.2', family: 'gpt', protocol: 'openai', visible: true, supportsVision: true, contextWindow: '400K', contextWindowTokens: 400_000, pricing: ['输入 12.6 元/百万tokens', '输出 100.8 元/百万tokens'] },
240
-
241
- // Claude(Vercel AI SDK,美元价格按约7.2汇率换算)
242
- { id: 'anthropic/claude-opus-4.5', displayName: 'Claude Opus 4.5', family: 'claude', protocol: 'anthropic', visible: true, supportsVision: true, contextWindow: '200K', contextWindowTokens: 200_000, pricing: ['输入 36 元/百万tokens', '输出 180 元/百万tokens'] },
243
- ];
244
-
245
- // ==================== 查询辅助函数 ====================
246
-
247
- /**
248
- * 根据模型 ID 获取注册信息
249
- */
250
- export function getModelEntry(modelId: string): ModelRegistryEntry | undefined {
251
- return MODEL_REGISTRY.find(m => m.id === modelId || modelId.includes(m.id));
252
- }
253
-
254
- /**
255
- * 根据模型 ID 获取家族配置
256
- */
257
- export function getModelFamily(modelId: string): ModelFamilyConfig | undefined {
258
- const entry = getModelEntry(modelId);
259
- if (!entry) return undefined;
260
- return MODEL_FAMILIES[entry.family];
261
- }
262
-
263
- /**
264
- * 根据模型 ID 获取协议类型
265
- */
266
- export function getModelProtocol(modelId: string): ProtocolId | undefined {
267
- const entry = getModelEntry(modelId);
268
- return entry?.protocol;
269
- }
270
-
271
- /**
272
- * 获取所有可见模型(用于前端显示)
273
- */
274
- export function getVisibleModels(): ModelRegistryEntry[] {
275
- return MODEL_REGISTRY.filter(m => m.visible);
276
- }
277
-
278
- /**
279
- * 根据家族 ID 获取所有模型
280
- */
281
- export function getModelsByFamily(familyId: ModelFamilyId): ModelRegistryEntry[] {
282
- return MODEL_REGISTRY.filter(m => m.family === familyId);
283
- }
284
-
285
- /**
286
- * 根据协议获取所有模型
287
- */
288
- export function getModelsByProtocol(protocol: ProtocolId): ModelRegistryEntry[] {
289
- return MODEL_REGISTRY.filter(m => m.protocol === protocol);
290
- }
291
-
292
- /**
293
- * 检查模型是否支持 thinking
294
- */
295
- export function modelSupportsThinking(modelId: string): boolean {
296
- const family = getModelFamily(modelId);
297
- return family?.supportsThinking ?? false;
298
- }
299
-
300
- /**
301
- * 检查模型是否支持原生搜索
302
- */
303
- export function modelSupportsNativeSearch(modelId: string): boolean {
304
- const family = getModelFamily(modelId);
305
- return family?.supportsNativeSearch ?? false;
306
- }
307
-
308
- /**
309
- * 检查模型是否支持图片理解
310
- */
311
- export function modelSupportsVision(modelId: string): boolean {
312
- const entry = getModelEntry(modelId);
313
- if (!entry) return false;
314
- if (typeof entry.supportsVision === 'boolean') return entry.supportsVision;
315
- const family = getModelFamily(modelId);
316
- return family?.supportsVision ?? false;
317
- }
318
-
319
- /**
320
- * 获取模型的搜索策略
321
- */
322
- export function getModelSearchStrategy(modelId: string): SearchStrategy {
323
- const family = getModelFamily(modelId);
324
- return family?.searchStrategy ?? 'tavily';
325
- }
326
-
327
- // ==================== Context 配置 ====================
328
-
329
- export interface ModelContextConfig {
330
- contextWindowTokens: number;
331
- maxOutputTokens: number;
332
- }
333
-
334
- /**
335
- * 获取模型的 context 配置(供压缩器使用)
336
- *
337
- * 所有模型必须注册且声明 contextWindowTokens,否则抛错。
338
- */
339
- export function getModelContextConfig(modelId: string): ModelContextConfig {
340
- const entry = getModelEntry(modelId);
341
- if (!entry) throw new Error(`模型 ${modelId} 未在 MODEL_REGISTRY 中注册`);
342
-
343
- const family = MODEL_FAMILIES[entry.family];
344
- if (!family) throw new Error(`模型 ${modelId} 的家族 ${entry.family} 未定义`);
345
-
346
- if (!entry.contextWindowTokens) {
347
- throw new Error(`模型 ${modelId} 缺少 contextWindowTokens 配置`);
348
- }
349
- if (!family.defaultMaxTokens) {
350
- throw new Error(`模型家族 ${entry.family} 缺少 defaultMaxTokens 配置`);
351
- }
352
-
353
- return {
354
- contextWindowTokens: entry.contextWindowTokens,
355
- maxOutputTokens: family.defaultMaxTokens,
356
- };
357
- }
358
-
359
- /** 解析 "256K" / "1M" 格式为 token 数 */
360
- function parseContextWindowString(s: string): number | undefined {
361
- const match = s.match(/^([\d.]+)\s*(K|M)$/i);
362
- if (!match) return undefined;
363
- const num = parseFloat(match[1]);
364
- const unit = match[2].toUpperCase();
365
- return unit === 'M' ? num * 1_000_000 : num * 1_000;
366
- }
367
-
368
- // ==================== 配置校验 ====================
369
-
370
- export interface ConfigValidationError {
371
- modelId: string;
372
- field: string;
373
- message: string;
374
- severity: 'error' | 'warning';
375
- }
376
-
377
- /**
378
- * 校验所有模型配置的合法性
379
- *
380
- * 检查项:
381
- * 1. defaultMaxTokens 不能超过 contextWindow
382
- * 2. contextWindowTokens 与 contextWindow 字符串必须一致
383
- * 3. 必须声明 contextWindowTokens(否则压缩器无法工作)
384
- * 4. defaultMaxTokens 必须大于 0
385
- * 5. 各 provider 的已知硬限制(如 Bedrock 64K output)
386
- */
387
- export function validateModelConfigs(): ConfigValidationError[] {
388
- const errors: ConfigValidationError[] = [];
389
-
390
- // 各 provider 已知 maxOutputTokens 硬限制
391
- const providerOutputLimits: Record<string, number> = {
392
- anthropic: 64_000, // Bedrock fallback 限制
393
- gemini: 65_536,
394
- ark: 16_384, // 豆包 Seed 系列最大输出 16K
395
- deepseek: 64_000, // V3.2 reasoner 最大 64K
396
- qwen: 32_768,
397
- };
398
-
399
- for (const entry of MODEL_REGISTRY) {
400
- const family = MODEL_FAMILIES[entry.family];
401
- if (!family) {
402
- errors.push({ modelId: entry.id, field: 'family', message: `未找到家族配置: ${entry.family}`, severity: 'error' });
403
- continue;
404
- }
405
-
406
- // 检查 contextWindowTokens 声明
407
- if (!entry.contextWindowTokens) {
408
- errors.push({
409
- modelId: entry.id,
410
- field: 'contextWindowTokens',
411
- message: '缺少 contextWindowTokens,压缩器将回退到字符数阈值',
412
- severity: 'warning',
413
- });
414
- }
415
-
416
- // 检查 contextWindow 字符串与数值一致性
417
- if (entry.contextWindow && entry.contextWindowTokens) {
418
- const parsed = parseContextWindowString(entry.contextWindow);
419
- if (parsed && parsed !== entry.contextWindowTokens) {
420
- errors.push({
421
- modelId: entry.id,
422
- field: 'contextWindow',
423
- message: `contextWindow "${entry.contextWindow}" (${parsed}) 与 contextWindowTokens (${entry.contextWindowTokens}) 不一致`,
424
- severity: 'error',
425
- });
426
- }
427
- }
428
-
429
- // 检查 defaultMaxTokens
430
- const maxTokens = family.defaultMaxTokens;
431
- if (maxTokens !== undefined) {
432
- if (maxTokens <= 0) {
433
- errors.push({
434
- modelId: entry.id,
435
- field: 'defaultMaxTokens',
436
- message: `defaultMaxTokens (${maxTokens}) 必须大于 0`,
437
- severity: 'error',
438
- });
439
- }
440
-
441
- // 不能超过 contextWindow
442
- if (entry.contextWindowTokens && maxTokens > entry.contextWindowTokens) {
443
- errors.push({
444
- modelId: entry.id,
445
- field: 'defaultMaxTokens',
446
- message: `defaultMaxTokens (${maxTokens}) 超过 contextWindow (${entry.contextWindowTokens})`,
447
- severity: 'error',
448
- });
449
- }
450
-
451
- // 检查 provider 硬限制
452
- const providerLimit = providerOutputLimits[entry.protocol];
453
- if (providerLimit && maxTokens > providerLimit) {
454
- errors.push({
455
- modelId: entry.id,
456
- field: 'defaultMaxTokens',
457
- message: `defaultMaxTokens (${maxTokens}) 超过 ${entry.protocol} 的硬限制 (${providerLimit})`,
458
- severity: 'error',
459
- });
460
- }
461
- }
462
- }
463
-
464
- return errors;
465
- }
466
-