thatgfsj-code 2.2.9 → 3.0.1

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 (190) hide show
  1. package/CHANGELOG.md +15 -67
  2. package/dist/app/index.d.ts +28 -5
  3. package/dist/app/index.d.ts.map +1 -1
  4. package/dist/app/index.js +76 -10
  5. package/dist/app/index.js.map +1 -1
  6. package/dist/cache/fingerprint.d.ts +49 -0
  7. package/dist/cache/fingerprint.d.ts.map +1 -0
  8. package/dist/cache/fingerprint.js +100 -0
  9. package/dist/cache/fingerprint.js.map +1 -0
  10. package/dist/cache/index.d.ts +15 -0
  11. package/dist/cache/index.d.ts.map +1 -0
  12. package/dist/cache/index.js +15 -0
  13. package/dist/cache/index.js.map +1 -0
  14. package/dist/cache/smartModel.d.ts +40 -0
  15. package/dist/cache/smartModel.d.ts.map +1 -0
  16. package/dist/cache/smartModel.js +43 -0
  17. package/dist/cache/smartModel.js.map +1 -0
  18. package/dist/cache/stats.d.ts +93 -0
  19. package/dist/cache/stats.d.ts.map +1 -0
  20. package/dist/cache/stats.js +155 -0
  21. package/dist/cache/stats.js.map +1 -0
  22. package/dist/cache/volatile.d.ts +32 -0
  23. package/dist/cache/volatile.d.ts.map +1 -0
  24. package/dist/cache/volatile.js +44 -0
  25. package/dist/cache/volatile.js.map +1 -0
  26. package/dist/cmd/index.js +49 -57
  27. package/dist/cmd/index.js.map +1 -1
  28. package/dist/config/index.d.ts.map +1 -1
  29. package/dist/config/index.js +8 -0
  30. package/dist/config/index.js.map +1 -1
  31. package/dist/config/types.d.ts +14 -0
  32. package/dist/config/types.d.ts.map +1 -1
  33. package/dist/llm/anthropic.d.ts +55 -5
  34. package/dist/llm/anthropic.d.ts.map +1 -1
  35. package/dist/llm/anthropic.js +172 -26
  36. package/dist/llm/anthropic.js.map +1 -1
  37. package/dist/llm/index.d.ts +26 -8
  38. package/dist/llm/index.d.ts.map +1 -1
  39. package/dist/llm/index.js +83 -15
  40. package/dist/llm/index.js.map +1 -1
  41. package/dist/llm/openai.d.ts +28 -8
  42. package/dist/llm/openai.d.ts.map +1 -1
  43. package/dist/llm/openai.js +58 -8
  44. package/dist/llm/openai.js.map +1 -1
  45. package/dist/llm/provider.d.ts +40 -8
  46. package/dist/llm/provider.d.ts.map +1 -1
  47. package/dist/llm/provider.js +8 -1
  48. package/dist/llm/provider.js.map +1 -1
  49. package/dist/prompts/index.d.ts +32 -0
  50. package/dist/prompts/index.d.ts.map +1 -1
  51. package/dist/prompts/index.js +33 -11
  52. package/dist/prompts/index.js.map +1 -1
  53. package/dist/session/index.d.ts +32 -3
  54. package/dist/session/index.d.ts.map +1 -1
  55. package/dist/session/index.js +51 -36
  56. package/dist/session/index.js.map +1 -1
  57. package/dist/skills/brainstorming.js +33 -33
  58. package/dist/skills/code-review.js +35 -35
  59. package/dist/skills/executing-plans.js +18 -18
  60. package/dist/skills/frontend-design.js +25 -25
  61. package/dist/skills/git-workflow.js +26 -26
  62. package/dist/skills/improve-architecture.js +28 -28
  63. package/dist/skills/neuroweave.js +37 -37
  64. package/dist/skills/playwright.js +62 -62
  65. package/dist/skills/prototype.js +20 -20
  66. package/dist/skills/subagent.js +19 -19
  67. package/dist/skills/supabase.js +34 -34
  68. package/dist/skills/systematic-debugging.js +34 -34
  69. package/dist/skills/tdd.js +29 -29
  70. package/dist/skills/triage.js +25 -25
  71. package/dist/skills/verification.js +22 -22
  72. package/dist/skills/writing-plans.js +32 -32
  73. package/dist/tools/nwt.js +16 -16
  74. package/dist/tui/app.d.ts.map +1 -1
  75. package/dist/tui/app.js +9 -2
  76. package/dist/tui/app.js.map +1 -1
  77. package/dist/tui/components/Header.d.ts +8 -0
  78. package/dist/tui/components/Header.d.ts.map +1 -1
  79. package/dist/tui/components/Header.js +17 -4
  80. package/dist/tui/components/Header.js.map +1 -1
  81. package/dist/tui/components/InitWizard.d.ts +12 -1
  82. package/dist/tui/components/InitWizard.d.ts.map +1 -1
  83. package/dist/tui/components/InitWizard.js +58 -3
  84. package/dist/tui/components/InitWizard.js.map +1 -1
  85. package/dist/tui/components/ModelSelector.d.ts +3 -1
  86. package/dist/tui/components/ModelSelector.d.ts.map +1 -1
  87. package/dist/tui/components/ModelSelector.js +24 -7
  88. package/dist/tui/components/ModelSelector.js.map +1 -1
  89. package/dist/tui/components/ToolCall.d.ts.map +1 -1
  90. package/dist/tui/components/ToolCall.js +1 -6
  91. package/dist/tui/components/ToolCall.js.map +1 -1
  92. package/dist/tui/components/UserInput.d.ts.map +1 -1
  93. package/dist/tui/components/UserInput.js +20 -0
  94. package/dist/tui/components/UserInput.js.map +1 -1
  95. package/dist/tui/hooks/useChat.d.ts +22 -0
  96. package/dist/tui/hooks/useChat.d.ts.map +1 -1
  97. package/dist/tui/hooks/useChat.js +82 -46
  98. package/dist/tui/hooks/useChat.js.map +1 -1
  99. package/dist/tui/hooks/useCommands.d.ts.map +1 -1
  100. package/dist/tui/hooks/useCommands.js +57 -0
  101. package/dist/tui/hooks/useCommands.js.map +1 -1
  102. package/dist/tui/welcome.d.ts.map +1 -1
  103. package/dist/tui/welcome.js +2 -3
  104. package/dist/tui/welcome.js.map +1 -1
  105. package/dist/types.d.ts +79 -6
  106. package/dist/types.d.ts.map +1 -1
  107. package/dist/types.js +7 -0
  108. package/dist/types.js.map +1 -1
  109. package/dist/utils/stableStringify.d.ts +21 -0
  110. package/dist/utils/stableStringify.d.ts.map +1 -0
  111. package/dist/utils/stableStringify.js +53 -0
  112. package/dist/utils/stableStringify.js.map +1 -0
  113. package/dist/utils/thinking.d.ts.map +1 -1
  114. package/dist/utils/thinking.js +0 -3
  115. package/dist/utils/thinking.js.map +1 -1
  116. package/package.json +7 -6
  117. package/src/app/index.ts +189 -124
  118. package/src/cache/fingerprint.ts +101 -0
  119. package/src/cache/index.ts +15 -0
  120. package/src/cache/smartModel.ts +52 -0
  121. package/src/cache/stats.ts +199 -0
  122. package/src/cache/volatile.ts +47 -0
  123. package/src/cmd/index.tsx +288 -292
  124. package/src/config/index.ts +156 -148
  125. package/src/config/providers.ts +234 -234
  126. package/src/config/types.ts +67 -53
  127. package/src/hooks/index.ts +111 -111
  128. package/src/llm/anthropic.ts +388 -243
  129. package/src/llm/gemini.ts +169 -169
  130. package/src/llm/index.ts +265 -200
  131. package/src/llm/openai.ts +243 -196
  132. package/src/llm/provider.ts +66 -34
  133. package/src/prompts/index.ts +260 -220
  134. package/src/session/compactor.ts +103 -103
  135. package/src/session/index.ts +181 -168
  136. package/src/session/message.ts +42 -42
  137. package/src/skills/brainstorming.ts +43 -43
  138. package/src/skills/code-review.ts +45 -45
  139. package/src/skills/executing-plans.ts +27 -27
  140. package/src/skills/frontend-design.ts +35 -35
  141. package/src/skills/git-workflow.ts +36 -36
  142. package/src/skills/improve-architecture.ts +38 -38
  143. package/src/skills/index.ts +136 -136
  144. package/src/skills/neuroweave.ts +47 -47
  145. package/src/skills/playwright.ts +72 -72
  146. package/src/skills/prototype.ts +30 -30
  147. package/src/skills/subagent.ts +28 -28
  148. package/src/skills/supabase.ts +44 -44
  149. package/src/skills/systematic-debugging.ts +44 -44
  150. package/src/skills/tdd.ts +39 -39
  151. package/src/skills/triage.ts +35 -35
  152. package/src/skills/verification.ts +31 -31
  153. package/src/skills/writing-plans.ts +42 -42
  154. package/src/tools/nwt.ts +598 -598
  155. package/src/tools/types.ts +122 -122
  156. package/src/tui/app.tsx +200 -186
  157. package/src/tui/components/ChatList.tsx +41 -41
  158. package/src/tui/components/ChatMessage.tsx +54 -54
  159. package/src/tui/components/Header.tsx +56 -29
  160. package/src/tui/components/InitWizard.tsx +217 -132
  161. package/src/tui/components/Markdown.tsx +35 -35
  162. package/src/tui/components/ModelSelector.tsx +107 -87
  163. package/src/tui/components/StatusBar.tsx +30 -30
  164. package/src/tui/components/Thinking.tsx +17 -17
  165. package/src/tui/components/ToolCall.tsx +102 -107
  166. package/src/tui/components/UserInput.tsx +151 -131
  167. package/src/tui/hooks/useChat.ts +287 -238
  168. package/src/tui/hooks/useCommands.ts +234 -176
  169. package/src/tui/index.ts +6 -6
  170. package/src/tui/welcome.ts +177 -178
  171. package/src/types.ts +104 -42
  172. package/src/utils/diff.ts +71 -71
  173. package/src/utils/project.ts +99 -99
  174. package/src/utils/stableStringify.ts +47 -0
  175. package/src/utils/thinking.ts +118 -121
  176. package/tests/cache/fingerprint.test.ts +75 -0
  177. package/tests/cache/providerCatalog.test.ts +31 -0
  178. package/tests/cache/stableStringify.test.ts +43 -0
  179. package/tests/cache/stats.test.ts +146 -0
  180. package/tests/cache/volatile.test.ts +75 -0
  181. package/tests/smoke-pollution.mjs +78 -0
  182. package/tests/smoke-thinking.mjs +110 -0
  183. package/tests/smoke-tool-stream.mjs +69 -0
  184. package/tests/smoke-tool.mjs +117 -0
  185. package/.nwt/meta.json +0 -5
  186. package/dist/version.d.ts +0 -16
  187. package/dist/version.d.ts.map +0 -1
  188. package/dist/version.js +0 -16
  189. package/dist/version.js.map +0 -1
  190. package/src/version.ts +0 -16
@@ -1,234 +1,234 @@
1
- /**
2
- * Provider definitions and model catalogs
3
- * Updated with correct API formats and more providers
4
- */
5
-
6
- import type { ProviderConfig, ProviderName, ModelInfo } from './types.js';
7
-
8
- // ==================== Provider Definitions ====================
9
-
10
- export const PROVIDERS: Record<ProviderName, ProviderConfig> = {
11
- siliconflow: {
12
- name: 'SiliconFlow (硅基流动)',
13
- baseUrl: 'https://api.siliconflow.cn/v1',
14
- defaultModel: 'Qwen/Qwen2.5-7B-Instruct',
15
- envKeys: ['SILICONFLOW_API_KEY'],
16
- format: 'openai',
17
- },
18
- openai: {
19
- name: 'OpenAI',
20
- baseUrl: 'https://api.openai.com/v1',
21
- defaultModel: 'gpt-4o-mini',
22
- envKeys: ['OPENAI_API_KEY'],
23
- format: 'openai',
24
- },
25
- deepseek: {
26
- name: 'DeepSeek (深度求索)',
27
- baseUrl: 'https://api.deepseek.com',
28
- defaultModel: 'deepseek-chat',
29
- envKeys: ['DEEPSEEK_API_KEY'],
30
- format: 'openai',
31
- },
32
- kimi: {
33
- name: 'Kimi (月之暗面)',
34
- baseUrl: 'https://api.moonshot.cn/v1',
35
- defaultModel: 'kimi-k2.6',
36
- envKeys: ['KIMI_API_KEY', 'MOONSHOT_API_KEY'],
37
- format: 'openai',
38
- },
39
- zhipu: {
40
- name: 'Zhipu GLM (智谱)',
41
- baseUrl: 'https://open.bigmodel.cn/api/paas/v4',
42
- defaultModel: 'glm-4-flash',
43
- envKeys: ['ZHIPU_API_KEY', 'GLM_API_KEY'],
44
- format: 'openai',
45
- },
46
- minimax: {
47
- name: 'MiniMax',
48
- baseUrl: 'https://api.minimax.chat/v1',
49
- defaultModel: 'MiniMax-Text-01',
50
- envKeys: ['MINIMAX_API_KEY'],
51
- format: 'openai',
52
- },
53
- baichuan: {
54
- name: 'Baichuan (百川)',
55
- baseUrl: 'https://api.baichuan-ai.com/v1',
56
- defaultModel: 'Baichuan4',
57
- envKeys: ['BAICHUAN_API_KEY'],
58
- format: 'openai',
59
- },
60
- stepfun: {
61
- name: 'Stepfun (阶跃星辰)',
62
- baseUrl: 'https://api.stepfun.com/v1',
63
- defaultModel: 'step-1-flash',
64
- envKeys: ['STEPFUN_API_KEY'],
65
- format: 'openai',
66
- },
67
- doubao: {
68
- name: 'Doubao (火山引擎豆包)',
69
- baseUrl: 'https://ark.cn-beijing.volces.com/api/v3',
70
- defaultModel: 'doubao-1.5-pro-32k',
71
- envKeys: ['DOUBAO_API_KEY', 'ARK_API_KEY'],
72
- format: 'openai',
73
- },
74
- anthropic: {
75
- name: 'Anthropic (Claude)',
76
- baseUrl: 'https://api.anthropic.com/v1',
77
- defaultModel: 'claude-sonnet-4-20250514',
78
- envKeys: ['ANTHROPIC_API_KEY'],
79
- format: 'anthropic',
80
- },
81
- gemini: {
82
- name: 'Google Gemini',
83
- baseUrl: 'https://generativelanguage.googleapis.com/v1beta',
84
- defaultModel: 'gemini-2.0-flash',
85
- envKeys: ['GEMINI_API_KEY'],
86
- format: 'gemini',
87
- },
88
- ollama: {
89
- name: 'Ollama (本地)',
90
- baseUrl: 'http://localhost:11434/v1',
91
- defaultModel: 'llama3.1',
92
- envKeys: [],
93
- format: 'openai',
94
- },
95
- ernie: {
96
- name: 'ERNIE (百度文心)',
97
- baseUrl: 'https://qianfan.baidubce.com/v2',
98
- defaultModel: 'ernie-4.5-8k',
99
- envKeys: ['ERNIE_API_KEY', 'QIANFAN_API_KEY'],
100
- format: 'openai',
101
- },
102
- custom_openai: {
103
- name: '自定义 OpenAI 兼容 (中转站)',
104
- baseUrl: '',
105
- defaultModel: 'gpt-4o-mini',
106
- envKeys: ['CUSTOM_API_KEY'],
107
- format: 'openai',
108
- },
109
- custom_anthropic: {
110
- name: '自定义 Anthropic 兼容 (中转站)',
111
- baseUrl: '',
112
- defaultModel: 'claude-sonnet-4-20250514',
113
- envKeys: ['CUSTOM_API_KEY'],
114
- format: 'anthropic',
115
- },
116
- };
117
-
118
- // ==================== Model Catalogs ====================
119
-
120
- export const MODEL_CATALOGS: Record<ProviderName, ModelInfo[]> = {
121
- siliconflow: [
122
- { id: 'Qwen/Qwen2.5-7B-Instruct', name: 'Qwen2.5-7B', desc: '免费,日常编程' },
123
- { id: 'Qwen/Qwen2.5-32B-Instruct', name: 'Qwen2.5-32B', desc: '更强性能' },
124
- { id: 'Qwen/Qwen2.5-72B-Instruct', name: 'Qwen2.5-72B', desc: '旗舰模型' },
125
- { id: 'Qwen/Qwen3-8B', name: 'Qwen3-8B', desc: '最新 Qwen3' },
126
- { id: 'Pro/deepseek-ai/DeepSeek-V3', name: 'DeepSeek-V3', desc: '深度求索' },
127
- { id: 'Pro/deepseek-ai/DeepSeek-R1', name: 'DeepSeek-R1', desc: '推理模型' },
128
- { id: 'deepseek-ai/DeepSeek-V3', name: 'DeepSeek-V3 (免费)', desc: '免费版' },
129
- { id: 'THUDM/glm-4-9b-chat', name: 'GLM-4-9B', desc: '智谱模型' },
130
- { id: 'internlm/internlm2_5-7b-chat', name: 'InternLM2.5-7B', desc: '书生模型' },
131
- ],
132
- openai: [
133
- { id: 'gpt-4o-mini', name: 'GPT-4o-mini', desc: '性价比高' },
134
- { id: 'gpt-4o', name: 'GPT-4o', desc: '旗舰多模态' },
135
- { id: 'gpt-4-turbo', name: 'GPT-4-Turbo', desc: '强性能' },
136
- { id: 'o3-mini', name: 'o3-mini', desc: '推理模型' },
137
- ],
138
- deepseek: [
139
- { id: 'deepseek-chat', name: 'DeepSeek-Chat', desc: '通用对话' },
140
- { id: 'deepseek-reasoner', name: 'DeepSeek-Reasoner', desc: '推理增强' },
141
- ],
142
- kimi: [
143
- { id: 'kimi-k2.6', name: 'Kimi K2.6', desc: '最新旗舰,支持思考' },
144
- { id: 'kimi-k2.5', name: 'Kimi K2.5', desc: '稳定版' },
145
- { id: 'moonshot-v1-128k', name: 'Moonshot-128K', desc: '超长上下文' },
146
- { id: 'moonshot-v1-32k', name: 'Moonshot-32K', desc: '长上下文' },
147
- { id: 'moonshot-v1-8k', name: 'Moonshot-8K', desc: '基础版' },
148
- ],
149
- zhipu: [
150
- { id: 'glm-4-plus', name: 'GLM-4-Plus', desc: '旗舰模型' },
151
- { id: 'glm-4-flash', name: 'GLM-4-Flash', desc: '快速免费' },
152
- { id: 'glm-4-long', name: 'GLM-4-Long', desc: '超长上下文 1M' },
153
- { id: 'glm-4-flashx', name: 'GLM-4-FlashX', desc: '加速版' },
154
- { id: 'glm-4-air', name: 'GLM-4-Air', desc: '轻量版' },
155
- ],
156
- minimax: [
157
- { id: 'MiniMax-Text-01', name: 'MiniMax-Text-01', desc: '旗舰模型' },
158
- { id: 'abab6.5s-chat', name: 'abab6.5s', desc: '轻量版' },
159
- ],
160
- baichuan: [
161
- { id: 'Baichuan4', name: 'Baichuan4', desc: '最新旗舰' },
162
- { id: 'Baichuan3-Turbo', name: 'Baichuan3-Turbo', desc: '快速版' },
163
- ],
164
- stepfun: [
165
- { id: 'step-1-flash', name: 'Step-1-Flash', desc: '快速免费' },
166
- { id: 'step-1-8k', name: 'Step-1-8K', desc: '基础版' },
167
- { id: 'step-2-16k', name: 'Step-2-16K', desc: '增强版' },
168
- ],
169
- doubao: [
170
- { id: 'doubao-1.5-pro-32k', name: 'Doubao-1.5-Pro-32K', desc: '旗舰版' },
171
- { id: 'doubao-1.5-lite-32k', name: 'Doubao-1.5-Lite-32K', desc: '轻量版' },
172
- { id: 'doubao-pro-256k', name: 'Doubao-Pro-256K', desc: '超长上下文' },
173
- ],
174
- anthropic: [
175
- { id: 'claude-sonnet-4-20250514', name: 'Claude Sonnet 4', desc: '最新旗舰' },
176
- { id: 'claude-3-5-haiku-20241022', name: 'Claude 3.5 Haiku', desc: '快速便宜' },
177
- { id: 'claude-3-opus-20240229', name: 'Claude 3 Opus', desc: '最强性能' },
178
- ],
179
- gemini: [
180
- { id: 'gemini-2.0-flash', name: 'Gemini 2.0 Flash', desc: '最新快速' },
181
- { id: 'gemini-2.5-pro-preview-05-06', name: 'Gemini 2.5 Pro', desc: '最强推理' },
182
- { id: 'gemini-1.5-flash', name: 'Gemini 1.5 Flash', desc: '经典版' },
183
- ],
184
- ollama: [
185
- { id: 'llama3.1', name: 'Llama 3.1', desc: 'Meta 开源' },
186
- { id: 'qwen2.5', name: 'Qwen 2.5', desc: '通义千问' },
187
- { id: 'deepseek-coder-v2', name: 'DeepSeek Coder V2', desc: '编程专用' },
188
- { id: 'codellama', name: 'Code Llama', desc: 'Meta 编程' },
189
- { id: 'mistral', name: 'Mistral', desc: '高性能' },
190
- ],
191
- ernie: [
192
- { id: 'ernie-4.5-8k', name: 'ERNIE-4.5-8K', desc: '最新旗舰' },
193
- { id: 'ernie-4.0-8k', name: 'ERNIE-4.0-8K', desc: '强性能' },
194
- { id: 'ernie-3.5-8k', name: 'ERNIE-3.5-8K', desc: '性价比高' },
195
- ],
196
- custom_openai: [
197
- { id: 'gpt-4o-mini', name: 'GPT-4o-mini', desc: '默认模型,可自定义' },
198
- { id: 'gpt-4o', name: 'GPT-4o', desc: '可自定义' },
199
- { id: 'claude-sonnet-4-20250514', name: 'Claude Sonnet 4', desc: '可自定义' },
200
- ],
201
- custom_anthropic: [
202
- { id: 'claude-sonnet-4-20250514', name: 'Claude Sonnet 4', desc: '默认模型,可自定义' },
203
- { id: 'claude-3-5-haiku-20241022', name: 'Claude 3.5 Haiku', desc: '可自定义' },
204
- ],
205
- };
206
-
207
- // ==================== Helpers ====================
208
-
209
- export function getModelsForProvider(provider: ProviderName): ModelInfo[] {
210
- return MODEL_CATALOGS[provider] || [];
211
- }
212
-
213
- export function getApiKeyFromEnv(provider: ProviderName): string {
214
- const providerConfig = PROVIDERS[provider];
215
- if (!providerConfig) return '';
216
- for (const envKey of providerConfig.envKeys) {
217
- if (process.env[envKey]) return process.env[envKey];
218
- }
219
- return '';
220
- }
221
-
222
- export function listProviders(): Array<{ key: ProviderName; name: string }> {
223
- return Object.entries(PROVIDERS).map(([key, val]) => ({
224
- key: key as ProviderName,
225
- name: val.name,
226
- }));
227
- }
228
-
229
- /**
230
- * Check if a provider name is a custom/relay provider
231
- */
232
- export function isCustomProvider(provider: ProviderName): boolean {
233
- return provider === 'custom_openai' || provider === 'custom_anthropic';
234
- }
1
+ /**
2
+ * Provider definitions and model catalogs
3
+ * Updated with correct API formats and more providers
4
+ */
5
+
6
+ import type { ProviderConfig, ProviderName, ModelInfo } from './types.js';
7
+
8
+ // ==================== Provider Definitions ====================
9
+
10
+ export const PROVIDERS: Record<ProviderName, ProviderConfig> = {
11
+ siliconflow: {
12
+ name: 'SiliconFlow (硅基流动)',
13
+ baseUrl: 'https://api.siliconflow.cn/v1',
14
+ defaultModel: 'Qwen/Qwen2.5-7B-Instruct',
15
+ envKeys: ['SILICONFLOW_API_KEY'],
16
+ format: 'openai',
17
+ },
18
+ openai: {
19
+ name: 'OpenAI',
20
+ baseUrl: 'https://api.openai.com/v1',
21
+ defaultModel: 'gpt-4o-mini',
22
+ envKeys: ['OPENAI_API_KEY'],
23
+ format: 'openai',
24
+ },
25
+ deepseek: {
26
+ name: 'DeepSeek (深度求索)',
27
+ baseUrl: 'https://api.deepseek.com',
28
+ defaultModel: 'deepseek-chat',
29
+ envKeys: ['DEEPSEEK_API_KEY'],
30
+ format: 'openai',
31
+ },
32
+ kimi: {
33
+ name: 'Kimi (月之暗面)',
34
+ baseUrl: 'https://api.moonshot.cn/v1',
35
+ defaultModel: 'kimi-k2.6',
36
+ envKeys: ['KIMI_API_KEY', 'MOONSHOT_API_KEY'],
37
+ format: 'openai',
38
+ },
39
+ zhipu: {
40
+ name: 'Zhipu GLM (智谱)',
41
+ baseUrl: 'https://open.bigmodel.cn/api/paas/v4',
42
+ defaultModel: 'glm-4-flash',
43
+ envKeys: ['ZHIPU_API_KEY', 'GLM_API_KEY'],
44
+ format: 'openai',
45
+ },
46
+ minimax: {
47
+ name: 'MiniMax',
48
+ baseUrl: 'https://api.minimax.chat/v1',
49
+ defaultModel: 'MiniMax-Text-01',
50
+ envKeys: ['MINIMAX_API_KEY'],
51
+ format: 'openai',
52
+ },
53
+ baichuan: {
54
+ name: 'Baichuan (百川)',
55
+ baseUrl: 'https://api.baichuan-ai.com/v1',
56
+ defaultModel: 'Baichuan4',
57
+ envKeys: ['BAICHUAN_API_KEY'],
58
+ format: 'openai',
59
+ },
60
+ stepfun: {
61
+ name: 'Stepfun (阶跃星辰)',
62
+ baseUrl: 'https://api.stepfun.com/v1',
63
+ defaultModel: 'step-1-flash',
64
+ envKeys: ['STEPFUN_API_KEY'],
65
+ format: 'openai',
66
+ },
67
+ doubao: {
68
+ name: 'Doubao (火山引擎豆包)',
69
+ baseUrl: 'https://ark.cn-beijing.volces.com/api/v3',
70
+ defaultModel: 'doubao-1.5-pro-32k',
71
+ envKeys: ['DOUBAO_API_KEY', 'ARK_API_KEY'],
72
+ format: 'openai',
73
+ },
74
+ anthropic: {
75
+ name: 'Anthropic (Claude)',
76
+ baseUrl: 'https://api.anthropic.com/v1',
77
+ defaultModel: 'claude-sonnet-4-20250514',
78
+ envKeys: ['ANTHROPIC_API_KEY'],
79
+ format: 'anthropic',
80
+ },
81
+ gemini: {
82
+ name: 'Google Gemini',
83
+ baseUrl: 'https://generativelanguage.googleapis.com/v1beta',
84
+ defaultModel: 'gemini-2.0-flash',
85
+ envKeys: ['GEMINI_API_KEY'],
86
+ format: 'gemini',
87
+ },
88
+ ollama: {
89
+ name: 'Ollama (本地)',
90
+ baseUrl: 'http://localhost:11434/v1',
91
+ defaultModel: 'llama3.1',
92
+ envKeys: [],
93
+ format: 'openai',
94
+ },
95
+ ernie: {
96
+ name: 'ERNIE (百度文心)',
97
+ baseUrl: 'https://qianfan.baidubce.com/v2',
98
+ defaultModel: 'ernie-4.5-8k',
99
+ envKeys: ['ERNIE_API_KEY', 'QIANFAN_API_KEY'],
100
+ format: 'openai',
101
+ },
102
+ custom_openai: {
103
+ name: '自定义 OpenAI 兼容 (中转站)',
104
+ baseUrl: '',
105
+ defaultModel: 'gpt-4o-mini',
106
+ envKeys: ['CUSTOM_API_KEY'],
107
+ format: 'openai',
108
+ },
109
+ custom_anthropic: {
110
+ name: '自定义 Anthropic 兼容 (中转站)',
111
+ baseUrl: '',
112
+ defaultModel: 'claude-sonnet-4-20250514',
113
+ envKeys: ['CUSTOM_API_KEY'],
114
+ format: 'anthropic',
115
+ },
116
+ };
117
+
118
+ // ==================== Model Catalogs ====================
119
+
120
+ export const MODEL_CATALOGS: Record<ProviderName, ModelInfo[]> = {
121
+ siliconflow: [
122
+ { id: 'Qwen/Qwen2.5-7B-Instruct', name: 'Qwen2.5-7B', desc: '免费,日常编程' },
123
+ { id: 'Qwen/Qwen2.5-32B-Instruct', name: 'Qwen2.5-32B', desc: '更强性能' },
124
+ { id: 'Qwen/Qwen2.5-72B-Instruct', name: 'Qwen2.5-72B', desc: '旗舰模型' },
125
+ { id: 'Qwen/Qwen3-8B', name: 'Qwen3-8B', desc: '最新 Qwen3' },
126
+ { id: 'Pro/deepseek-ai/DeepSeek-V3', name: 'DeepSeek-V3', desc: '深度求索' },
127
+ { id: 'Pro/deepseek-ai/DeepSeek-R1', name: 'DeepSeek-R1', desc: '推理模型' },
128
+ { id: 'deepseek-ai/DeepSeek-V3', name: 'DeepSeek-V3 (免费)', desc: '免费版' },
129
+ { id: 'THUDM/glm-4-9b-chat', name: 'GLM-4-9B', desc: '智谱模型' },
130
+ { id: 'internlm/internlm2_5-7b-chat', name: 'InternLM2.5-7B', desc: '书生模型' },
131
+ ],
132
+ openai: [
133
+ { id: 'gpt-4o-mini', name: 'GPT-4o-mini', desc: '性价比高' },
134
+ { id: 'gpt-4o', name: 'GPT-4o', desc: '旗舰多模态' },
135
+ { id: 'gpt-4-turbo', name: 'GPT-4-Turbo', desc: '强性能' },
136
+ { id: 'o3-mini', name: 'o3-mini', desc: '推理模型' },
137
+ ],
138
+ deepseek: [
139
+ { id: 'deepseek-chat', name: 'DeepSeek-Chat', desc: '通用对话' },
140
+ { id: 'deepseek-reasoner', name: 'DeepSeek-Reasoner', desc: '推理增强' },
141
+ ],
142
+ kimi: [
143
+ { id: 'kimi-k2.6', name: 'Kimi K2.6', desc: '最新旗舰,支持思考' },
144
+ { id: 'kimi-k2.5', name: 'Kimi K2.5', desc: '稳定版' },
145
+ { id: 'moonshot-v1-128k', name: 'Moonshot-128K', desc: '超长上下文' },
146
+ { id: 'moonshot-v1-32k', name: 'Moonshot-32K', desc: '长上下文' },
147
+ { id: 'moonshot-v1-8k', name: 'Moonshot-8K', desc: '基础版' },
148
+ ],
149
+ zhipu: [
150
+ { id: 'glm-4-plus', name: 'GLM-4-Plus', desc: '旗舰模型' },
151
+ { id: 'glm-4-flash', name: 'GLM-4-Flash', desc: '快速免费' },
152
+ { id: 'glm-4-long', name: 'GLM-4-Long', desc: '超长上下文 1M' },
153
+ { id: 'glm-4-flashx', name: 'GLM-4-FlashX', desc: '加速版' },
154
+ { id: 'glm-4-air', name: 'GLM-4-Air', desc: '轻量版' },
155
+ ],
156
+ minimax: [
157
+ { id: 'MiniMax-Text-01', name: 'MiniMax-Text-01', desc: '旗舰模型' },
158
+ { id: 'abab6.5s-chat', name: 'abab6.5s', desc: '轻量版' },
159
+ ],
160
+ baichuan: [
161
+ { id: 'Baichuan4', name: 'Baichuan4', desc: '最新旗舰' },
162
+ { id: 'Baichuan3-Turbo', name: 'Baichuan3-Turbo', desc: '快速版' },
163
+ ],
164
+ stepfun: [
165
+ { id: 'step-1-flash', name: 'Step-1-Flash', desc: '快速免费' },
166
+ { id: 'step-1-8k', name: 'Step-1-8K', desc: '基础版' },
167
+ { id: 'step-2-16k', name: 'Step-2-16K', desc: '增强版' },
168
+ ],
169
+ doubao: [
170
+ { id: 'doubao-1.5-pro-32k', name: 'Doubao-1.5-Pro-32K', desc: '旗舰版' },
171
+ { id: 'doubao-1.5-lite-32k', name: 'Doubao-1.5-Lite-32K', desc: '轻量版' },
172
+ { id: 'doubao-pro-256k', name: 'Doubao-Pro-256K', desc: '超长上下文' },
173
+ ],
174
+ anthropic: [
175
+ { id: 'claude-sonnet-4-20250514', name: 'Claude Sonnet 4', desc: '最新旗舰' },
176
+ { id: 'claude-3-5-haiku-20241022', name: 'Claude 3.5 Haiku', desc: '快速便宜' },
177
+ { id: 'claude-3-opus-20240229', name: 'Claude 3 Opus', desc: '最强性能' },
178
+ ],
179
+ gemini: [
180
+ { id: 'gemini-2.0-flash', name: 'Gemini 2.0 Flash', desc: '最新快速' },
181
+ { id: 'gemini-2.5-pro-preview-05-06', name: 'Gemini 2.5 Pro', desc: '最强推理' },
182
+ { id: 'gemini-1.5-flash', name: 'Gemini 1.5 Flash', desc: '经典版' },
183
+ ],
184
+ ollama: [
185
+ { id: 'llama3.1', name: 'Llama 3.1', desc: 'Meta 开源' },
186
+ { id: 'qwen2.5', name: 'Qwen 2.5', desc: '通义千问' },
187
+ { id: 'deepseek-coder-v2', name: 'DeepSeek Coder V2', desc: '编程专用' },
188
+ { id: 'codellama', name: 'Code Llama', desc: 'Meta 编程' },
189
+ { id: 'mistral', name: 'Mistral', desc: '高性能' },
190
+ ],
191
+ ernie: [
192
+ { id: 'ernie-4.5-8k', name: 'ERNIE-4.5-8K', desc: '最新旗舰' },
193
+ { id: 'ernie-4.0-8k', name: 'ERNIE-4.0-8K', desc: '强性能' },
194
+ { id: 'ernie-3.5-8k', name: 'ERNIE-3.5-8K', desc: '性价比高' },
195
+ ],
196
+ custom_openai: [
197
+ { id: 'gpt-4o-mini', name: 'GPT-4o-mini', desc: '默认模型,可自定义' },
198
+ { id: 'gpt-4o', name: 'GPT-4o', desc: '可自定义' },
199
+ { id: 'claude-sonnet-4-20250514', name: 'Claude Sonnet 4', desc: '可自定义' },
200
+ ],
201
+ custom_anthropic: [
202
+ { id: 'claude-sonnet-4-20250514', name: 'Claude Sonnet 4', desc: '默认模型,可自定义' },
203
+ { id: 'claude-3-5-haiku-20241022', name: 'Claude 3.5 Haiku', desc: '可自定义' },
204
+ ],
205
+ };
206
+
207
+ // ==================== Helpers ====================
208
+
209
+ export function getModelsForProvider(provider: ProviderName): ModelInfo[] {
210
+ return MODEL_CATALOGS[provider] || [];
211
+ }
212
+
213
+ export function getApiKeyFromEnv(provider: ProviderName): string {
214
+ const providerConfig = PROVIDERS[provider];
215
+ if (!providerConfig) return '';
216
+ for (const envKey of providerConfig.envKeys) {
217
+ if (process.env[envKey]) return process.env[envKey];
218
+ }
219
+ return '';
220
+ }
221
+
222
+ export function listProviders(): Array<{ key: ProviderName; name: string }> {
223
+ return Object.entries(PROVIDERS).map(([key, val]) => ({
224
+ key: key as ProviderName,
225
+ name: val.name,
226
+ }));
227
+ }
228
+
229
+ /**
230
+ * Check if a provider name is a custom/relay provider
231
+ */
232
+ export function isCustomProvider(provider: ProviderName): boolean {
233
+ return provider === 'custom_openai' || provider === 'custom_anthropic';
234
+ }
@@ -1,53 +1,67 @@
1
- /**
2
- * Configuration types for Thatgfsj Code
3
- */
4
-
5
- export type ProviderName =
6
- | 'siliconflow'
7
- | 'openai'
8
- | 'deepseek'
9
- | 'kimi'
10
- | 'zhipu'
11
- | 'minimax'
12
- | 'baichuan'
13
- | 'stepfun'
14
- | 'doubao'
15
- | 'anthropic'
16
- | 'gemini'
17
- | 'ollama'
18
- | 'ernie'
19
- | 'custom_openai'
20
- | 'custom_anthropic';
21
-
22
- export interface ProviderConfig {
23
- name: string;
24
- baseUrl: string;
25
- defaultModel: string;
26
- envKeys: string[];
27
- format: 'openai' | 'anthropic' | 'gemini';
28
- }
29
-
30
- export interface Config {
31
- model: string;
32
- apiKey: string;
33
- temperature: number;
34
- maxTokens: number;
35
- contextLength: number;
36
- provider: ProviderName;
37
- baseUrl?: string;
38
- }
39
-
40
- export interface AIConfig {
41
- model: string;
42
- apiKey?: string;
43
- temperature?: number;
44
- maxTokens?: number;
45
- baseUrl?: string;
46
- provider?: ProviderName;
47
- }
48
-
49
- export interface ModelInfo {
50
- id: string;
51
- name: string;
52
- desc: string;
53
- }
1
+ /**
2
+ * Configuration types for Thatgfsj Code
3
+ */
4
+
5
+ export type ProviderName =
6
+ | 'siliconflow'
7
+ | 'openai'
8
+ | 'deepseek'
9
+ | 'kimi'
10
+ | 'zhipu'
11
+ | 'minimax'
12
+ | 'baichuan'
13
+ | 'stepfun'
14
+ | 'doubao'
15
+ | 'anthropic'
16
+ | 'gemini'
17
+ | 'ollama'
18
+ | 'ernie'
19
+ | 'custom_openai'
20
+ | 'custom_anthropic';
21
+
22
+ export interface ProviderConfig {
23
+ name: string;
24
+ baseUrl: string;
25
+ defaultModel: string;
26
+ envKeys: string[];
27
+ format: 'openai' | 'anthropic' | 'gemini';
28
+ }
29
+
30
+ export interface Config {
31
+ model: string;
32
+ apiKey: string;
33
+ temperature: number;
34
+ maxTokens: number;
35
+ contextLength: number;
36
+ provider: ProviderName;
37
+ baseUrl?: string;
38
+ /**
39
+ * v3.0.0: prompt-cache policy. Default = Anthropic-style explicit
40
+ * cache_control on (ttl 5m), all other providers fall through to their
41
+ * built-in automatic caching.
42
+ *
43
+ * Note: enabling/disabling only affects Anthropic; other providers do
44
+ * not expose a programmatic cache toggle, so the flag is purely
45
+ * advisory there.
46
+ */
47
+ cache?: {
48
+ enabled: boolean;
49
+ ttl?: '5m' | '1h';
50
+ strategy?: 'auto' | 'manual' | 'off';
51
+ };
52
+ }
53
+
54
+ export interface AIConfig {
55
+ model: string;
56
+ apiKey?: string;
57
+ temperature?: number;
58
+ maxTokens?: number;
59
+ baseUrl?: string;
60
+ provider?: ProviderName;
61
+ }
62
+
63
+ export interface ModelInfo {
64
+ id: string;
65
+ name: string;
66
+ desc: string;
67
+ }