@cicctencent/agent-core 0.1.18 → 0.1.20

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 (252) hide show
  1. package/README.md +70 -1
  2. package/dist/cjs/agent/engine.d.ts +23 -0
  3. package/dist/cjs/agent/engine.d.ts.map +1 -1
  4. package/dist/cjs/agent/engine.js +88 -9
  5. package/dist/cjs/agent/engine.js.map +1 -1
  6. package/dist/cjs/agent/history-manager.d.ts +66 -1
  7. package/dist/cjs/agent/history-manager.d.ts.map +1 -1
  8. package/dist/cjs/agent/history-manager.js +232 -0
  9. package/dist/cjs/agent/history-manager.js.map +1 -1
  10. package/dist/cjs/agent/llm-caller.d.ts +4 -1
  11. package/dist/cjs/agent/llm-caller.d.ts.map +1 -1
  12. package/dist/cjs/agent/llm-caller.js +25 -19
  13. package/dist/cjs/agent/llm-caller.js.map +1 -1
  14. package/dist/cjs/agent/profile-loader.d.ts +56 -0
  15. package/dist/cjs/agent/profile-loader.d.ts.map +1 -0
  16. package/dist/cjs/agent/profile-loader.js +145 -0
  17. package/dist/cjs/agent/profile-loader.js.map +1 -0
  18. package/dist/cjs/agent/types.d.ts +32 -3
  19. package/dist/cjs/agent/types.d.ts.map +1 -1
  20. package/dist/cjs/agent/types.js.map +1 -1
  21. package/dist/cjs/calendar/types.d.ts +41 -0
  22. package/dist/cjs/calendar/types.d.ts.map +1 -0
  23. package/dist/cjs/calendar/types.js +6 -0
  24. package/dist/cjs/calendar/types.js.map +1 -0
  25. package/dist/cjs/context/types.d.ts +3 -3
  26. package/dist/cjs/context/types.d.ts.map +1 -1
  27. package/dist/cjs/email/types.d.ts +46 -0
  28. package/dist/cjs/email/types.d.ts.map +1 -0
  29. package/dist/cjs/email/types.js +6 -0
  30. package/dist/cjs/email/types.js.map +1 -0
  31. package/dist/cjs/index.d.ts +28 -3
  32. package/dist/cjs/index.d.ts.map +1 -1
  33. package/dist/cjs/index.js +42 -11
  34. package/dist/cjs/index.js.map +1 -1
  35. package/dist/cjs/kb/in-memory-kb.d.ts +29 -0
  36. package/dist/cjs/kb/in-memory-kb.d.ts.map +1 -0
  37. package/dist/cjs/kb/in-memory-kb.js +210 -0
  38. package/dist/cjs/kb/in-memory-kb.js.map +1 -0
  39. package/dist/cjs/kb/rag-middleware.d.ts +31 -0
  40. package/dist/cjs/kb/rag-middleware.d.ts.map +1 -0
  41. package/dist/cjs/kb/rag-middleware.js +94 -0
  42. package/dist/cjs/kb/rag-middleware.js.map +1 -0
  43. package/dist/cjs/kb/types.d.ts +63 -0
  44. package/dist/cjs/kb/types.d.ts.map +1 -0
  45. package/dist/cjs/kb/types.js +6 -0
  46. package/dist/cjs/kb/types.js.map +1 -0
  47. package/dist/cjs/llm/anthropic-provider.d.ts +7 -0
  48. package/dist/cjs/llm/anthropic-provider.d.ts.map +1 -1
  49. package/dist/cjs/llm/anthropic-provider.js +84 -9
  50. package/dist/cjs/llm/anthropic-provider.js.map +1 -1
  51. package/dist/cjs/llm/ollama-provider.d.ts +18 -0
  52. package/dist/cjs/llm/ollama-provider.d.ts.map +1 -1
  53. package/dist/cjs/llm/ollama-provider.js +41 -0
  54. package/dist/cjs/llm/ollama-provider.js.map +1 -1
  55. package/dist/cjs/llm/openai-provider.d.ts +39 -2
  56. package/dist/cjs/llm/openai-provider.d.ts.map +1 -1
  57. package/dist/cjs/llm/openai-provider.js +302 -1
  58. package/dist/cjs/llm/openai-provider.js.map +1 -1
  59. package/dist/cjs/llm/pricing.d.ts +26 -0
  60. package/dist/cjs/llm/pricing.d.ts.map +1 -0
  61. package/dist/cjs/llm/pricing.js +86 -0
  62. package/dist/cjs/llm/pricing.js.map +1 -0
  63. package/dist/cjs/llm/provider.d.ts +2 -1
  64. package/dist/cjs/llm/provider.d.ts.map +1 -1
  65. package/dist/cjs/llm/provider.js +6 -1
  66. package/dist/cjs/llm/provider.js.map +1 -1
  67. package/dist/cjs/llm/types.d.ts +139 -0
  68. package/dist/cjs/llm/types.d.ts.map +1 -1
  69. package/dist/cjs/llm/types.js +74 -0
  70. package/dist/cjs/llm/types.js.map +1 -1
  71. package/dist/cjs/llm/usage-tracker.d.ts +119 -0
  72. package/dist/cjs/llm/usage-tracker.d.ts.map +1 -0
  73. package/dist/cjs/llm/usage-tracker.js +105 -0
  74. package/dist/cjs/llm/usage-tracker.js.map +1 -0
  75. package/dist/cjs/memory/extractor.js +1 -1
  76. package/dist/cjs/memory/extractor.js.map +1 -1
  77. package/dist/cjs/memory/persona.js +1 -1
  78. package/dist/cjs/memory/persona.js.map +1 -1
  79. package/dist/cjs/memory/scene.js +1 -1
  80. package/dist/cjs/memory/scene.js.map +1 -1
  81. package/dist/cjs/middleware/types.d.ts +2 -4
  82. package/dist/cjs/middleware/types.d.ts.map +1 -1
  83. package/dist/cjs/middleware/workspace-notes.d.ts +36 -0
  84. package/dist/cjs/middleware/workspace-notes.d.ts.map +1 -0
  85. package/dist/cjs/middleware/workspace-notes.js +53 -0
  86. package/dist/cjs/middleware/workspace-notes.js.map +1 -0
  87. package/dist/cjs/observability/logger.d.ts +1 -0
  88. package/dist/cjs/observability/logger.d.ts.map +1 -1
  89. package/dist/cjs/observability/logger.js.map +1 -1
  90. package/dist/cjs/observability/trace.d.ts +45 -0
  91. package/dist/cjs/observability/trace.d.ts.map +1 -0
  92. package/dist/cjs/observability/trace.js +59 -0
  93. package/dist/cjs/observability/trace.js.map +1 -0
  94. package/dist/cjs/runtime/run-registry-interface.d.ts +42 -0
  95. package/dist/cjs/runtime/run-registry-interface.d.ts.map +1 -0
  96. package/dist/cjs/runtime/run-registry-interface.js +7 -0
  97. package/dist/cjs/runtime/run-registry-interface.js.map +1 -0
  98. package/dist/cjs/runtime/run-registry.d.ts +15 -2
  99. package/dist/cjs/runtime/run-registry.d.ts.map +1 -1
  100. package/dist/cjs/runtime/run-registry.js +43 -1
  101. package/dist/cjs/runtime/run-registry.js.map +1 -1
  102. package/dist/cjs/sandbox/code-sandbox.d.ts +42 -0
  103. package/dist/cjs/sandbox/code-sandbox.d.ts.map +1 -0
  104. package/dist/cjs/sandbox/code-sandbox.js +59 -0
  105. package/dist/cjs/sandbox/code-sandbox.js.map +1 -0
  106. package/dist/cjs/skill/router.d.ts +20 -1
  107. package/dist/cjs/skill/router.d.ts.map +1 -1
  108. package/dist/cjs/skill/router.js +39 -1
  109. package/dist/cjs/skill/router.js.map +1 -1
  110. package/dist/cjs/skill/types.d.ts +1 -1
  111. package/dist/cjs/skill/types.d.ts.map +1 -1
  112. package/dist/cjs/skill/vector-index.d.ts +50 -0
  113. package/dist/cjs/skill/vector-index.d.ts.map +1 -0
  114. package/dist/cjs/skill/vector-index.js +57 -0
  115. package/dist/cjs/skill/vector-index.js.map +1 -0
  116. package/dist/cjs/store/history-persistence.d.ts +36 -0
  117. package/dist/cjs/store/history-persistence.d.ts.map +1 -0
  118. package/dist/cjs/store/history-persistence.js +142 -0
  119. package/dist/cjs/store/history-persistence.js.map +1 -0
  120. package/dist/cjs/types.d.ts +40 -1
  121. package/dist/cjs/types.d.ts.map +1 -1
  122. package/dist/cjs/types.js +34 -0
  123. package/dist/cjs/types.js.map +1 -1
  124. package/dist/cjs/utils/token-counter.d.ts.map +1 -1
  125. package/dist/cjs/utils/token-counter.js +33 -1
  126. package/dist/cjs/utils/token-counter.js.map +1 -1
  127. package/dist/esm/agent/engine.d.ts +23 -0
  128. package/dist/esm/agent/engine.d.ts.map +1 -1
  129. package/dist/esm/agent/engine.js +88 -9
  130. package/dist/esm/agent/engine.js.map +1 -1
  131. package/dist/esm/agent/history-manager.d.ts +66 -1
  132. package/dist/esm/agent/history-manager.d.ts.map +1 -1
  133. package/dist/esm/agent/history-manager.js +232 -0
  134. package/dist/esm/agent/history-manager.js.map +1 -1
  135. package/dist/esm/agent/llm-caller.d.ts +4 -1
  136. package/dist/esm/agent/llm-caller.d.ts.map +1 -1
  137. package/dist/esm/agent/llm-caller.js +25 -19
  138. package/dist/esm/agent/llm-caller.js.map +1 -1
  139. package/dist/esm/agent/profile-loader.d.ts +56 -0
  140. package/dist/esm/agent/profile-loader.d.ts.map +1 -0
  141. package/dist/esm/agent/profile-loader.js +108 -0
  142. package/dist/esm/agent/profile-loader.js.map +1 -0
  143. package/dist/esm/agent/types.d.ts +32 -3
  144. package/dist/esm/agent/types.d.ts.map +1 -1
  145. package/dist/esm/agent/types.js.map +1 -1
  146. package/dist/esm/calendar/types.d.ts +41 -0
  147. package/dist/esm/calendar/types.d.ts.map +1 -0
  148. package/dist/esm/calendar/types.js +5 -0
  149. package/dist/esm/calendar/types.js.map +1 -0
  150. package/dist/esm/context/types.d.ts +3 -3
  151. package/dist/esm/context/types.d.ts.map +1 -1
  152. package/dist/esm/email/types.d.ts +46 -0
  153. package/dist/esm/email/types.d.ts.map +1 -0
  154. package/dist/esm/email/types.js +5 -0
  155. package/dist/esm/email/types.js.map +1 -0
  156. package/dist/esm/index.d.ts +28 -3
  157. package/dist/esm/index.d.ts.map +1 -1
  158. package/dist/esm/index.js +12 -0
  159. package/dist/esm/index.js.map +1 -1
  160. package/dist/esm/kb/in-memory-kb.d.ts +29 -0
  161. package/dist/esm/kb/in-memory-kb.d.ts.map +1 -0
  162. package/dist/esm/kb/in-memory-kb.js +206 -0
  163. package/dist/esm/kb/in-memory-kb.js.map +1 -0
  164. package/dist/esm/kb/rag-middleware.d.ts +31 -0
  165. package/dist/esm/kb/rag-middleware.d.ts.map +1 -0
  166. package/dist/esm/kb/rag-middleware.js +91 -0
  167. package/dist/esm/kb/rag-middleware.js.map +1 -0
  168. package/dist/esm/kb/types.d.ts +63 -0
  169. package/dist/esm/kb/types.d.ts.map +1 -0
  170. package/dist/esm/kb/types.js +5 -0
  171. package/dist/esm/kb/types.js.map +1 -0
  172. package/dist/esm/llm/anthropic-provider.d.ts +7 -0
  173. package/dist/esm/llm/anthropic-provider.d.ts.map +1 -1
  174. package/dist/esm/llm/anthropic-provider.js +84 -9
  175. package/dist/esm/llm/anthropic-provider.js.map +1 -1
  176. package/dist/esm/llm/ollama-provider.d.ts +18 -0
  177. package/dist/esm/llm/ollama-provider.d.ts.map +1 -1
  178. package/dist/esm/llm/ollama-provider.js +41 -0
  179. package/dist/esm/llm/ollama-provider.js.map +1 -1
  180. package/dist/esm/llm/openai-provider.d.ts +39 -2
  181. package/dist/esm/llm/openai-provider.d.ts.map +1 -1
  182. package/dist/esm/llm/openai-provider.js +302 -1
  183. package/dist/esm/llm/openai-provider.js.map +1 -1
  184. package/dist/esm/llm/pricing.d.ts +26 -0
  185. package/dist/esm/llm/pricing.d.ts.map +1 -0
  186. package/dist/esm/llm/pricing.js +81 -0
  187. package/dist/esm/llm/pricing.js.map +1 -0
  188. package/dist/esm/llm/provider.d.ts +2 -1
  189. package/dist/esm/llm/provider.d.ts.map +1 -1
  190. package/dist/esm/llm/provider.js +1 -0
  191. package/dist/esm/llm/provider.js.map +1 -1
  192. package/dist/esm/llm/types.d.ts +139 -0
  193. package/dist/esm/llm/types.d.ts.map +1 -1
  194. package/dist/esm/llm/types.js +70 -1
  195. package/dist/esm/llm/types.js.map +1 -1
  196. package/dist/esm/llm/usage-tracker.d.ts +119 -0
  197. package/dist/esm/llm/usage-tracker.d.ts.map +1 -0
  198. package/dist/esm/llm/usage-tracker.js +101 -0
  199. package/dist/esm/llm/usage-tracker.js.map +1 -0
  200. package/dist/esm/memory/extractor.js +1 -1
  201. package/dist/esm/memory/extractor.js.map +1 -1
  202. package/dist/esm/memory/persona.js +1 -1
  203. package/dist/esm/memory/persona.js.map +1 -1
  204. package/dist/esm/memory/scene.js +1 -1
  205. package/dist/esm/memory/scene.js.map +1 -1
  206. package/dist/esm/middleware/types.d.ts +2 -4
  207. package/dist/esm/middleware/types.d.ts.map +1 -1
  208. package/dist/esm/middleware/workspace-notes.d.ts +36 -0
  209. package/dist/esm/middleware/workspace-notes.d.ts.map +1 -0
  210. package/dist/esm/middleware/workspace-notes.js +49 -0
  211. package/dist/esm/middleware/workspace-notes.js.map +1 -0
  212. package/dist/esm/observability/logger.d.ts +1 -0
  213. package/dist/esm/observability/logger.d.ts.map +1 -1
  214. package/dist/esm/observability/logger.js.map +1 -1
  215. package/dist/esm/observability/trace.d.ts +45 -0
  216. package/dist/esm/observability/trace.d.ts.map +1 -0
  217. package/dist/esm/observability/trace.js +55 -0
  218. package/dist/esm/observability/trace.js.map +1 -0
  219. package/dist/esm/runtime/run-registry-interface.d.ts +42 -0
  220. package/dist/esm/runtime/run-registry-interface.d.ts.map +1 -0
  221. package/dist/esm/runtime/run-registry-interface.js +6 -0
  222. package/dist/esm/runtime/run-registry-interface.js.map +1 -0
  223. package/dist/esm/runtime/run-registry.d.ts +15 -2
  224. package/dist/esm/runtime/run-registry.d.ts.map +1 -1
  225. package/dist/esm/runtime/run-registry.js +43 -1
  226. package/dist/esm/runtime/run-registry.js.map +1 -1
  227. package/dist/esm/sandbox/code-sandbox.d.ts +42 -0
  228. package/dist/esm/sandbox/code-sandbox.d.ts.map +1 -0
  229. package/dist/esm/sandbox/code-sandbox.js +56 -0
  230. package/dist/esm/sandbox/code-sandbox.js.map +1 -0
  231. package/dist/esm/skill/router.d.ts +20 -1
  232. package/dist/esm/skill/router.d.ts.map +1 -1
  233. package/dist/esm/skill/router.js +37 -0
  234. package/dist/esm/skill/router.js.map +1 -1
  235. package/dist/esm/skill/types.d.ts +1 -1
  236. package/dist/esm/skill/types.d.ts.map +1 -1
  237. package/dist/esm/skill/vector-index.d.ts +50 -0
  238. package/dist/esm/skill/vector-index.d.ts.map +1 -0
  239. package/dist/esm/skill/vector-index.js +53 -0
  240. package/dist/esm/skill/vector-index.js.map +1 -0
  241. package/dist/esm/store/history-persistence.d.ts +36 -0
  242. package/dist/esm/store/history-persistence.d.ts.map +1 -0
  243. package/dist/esm/store/history-persistence.js +105 -0
  244. package/dist/esm/store/history-persistence.js.map +1 -0
  245. package/dist/esm/types.d.ts +40 -1
  246. package/dist/esm/types.d.ts.map +1 -1
  247. package/dist/esm/types.js +32 -1
  248. package/dist/esm/types.js.map +1 -1
  249. package/dist/esm/utils/token-counter.d.ts.map +1 -1
  250. package/dist/esm/utils/token-counter.js +33 -1
  251. package/dist/esm/utils/token-counter.js.map +1 -1
  252. package/package.json +1 -1
@@ -3,11 +3,29 @@
3
3
  * @description 继承 OpenAIProvider,对接 Ollama 本地推理服务
4
4
  * Ollama 原生支持 OpenAI 兼容接口(/v1/chat/completions)
5
5
  * 默认地址 http://localhost:11434/v1
6
+ *
7
+ * 注意:Ollama 不支持 Batch API 和 Files API,虽然继承了父类的实现,
8
+ * 但 isBatchProvider() / isFileProvider() 会返回 false(通过覆盖方法禁用)。
6
9
  */
7
10
  import type { ModelConfig, ModelInfo } from './types.js';
8
11
  import { OpenAIProvider } from './openai-provider.js';
9
12
  export declare class OllamaProvider extends OpenAIProvider {
10
13
  constructor(config: ModelConfig);
11
14
  getModel(): ModelInfo;
15
+ /**
16
+ * Ollama 不需要 Authorization header,重写请求方法去掉它
17
+ * 当 apiKey 为空时父类已经会跳过,所以这里只需复用父类逻辑
18
+ */
19
+ createBatch(): Promise<never>;
20
+ getBatch(): Promise<never>;
21
+ listBatches(): Promise<never>;
22
+ cancelBatch(): Promise<never>;
23
+ getBatchResults(): Promise<never>;
24
+ uploadFile(): Promise<never>;
25
+ getFile(): Promise<never>;
26
+ listFiles(): Promise<never>;
27
+ deleteFile(): Promise<never>;
28
+ downloadFile(): Promise<never>;
29
+ getFileContent(): Promise<never>;
12
30
  }
13
31
  //# sourceMappingURL=ollama-provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ollama-provider.d.ts","sourceRoot":"","sources":["../../../src/llm/ollama-provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,qBAAa,cAAe,SAAQ,cAAc;gBAEpC,MAAM,EAAE,WAAW;IAW/B,QAAQ,IAAI,SAAS;CAetB"}
1
+ {"version":3,"file":"ollama-provider.d.ts","sourceRoot":"","sources":["../../../src/llm/ollama-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,qBAAa,cAAe,SAAQ,cAAc;gBAEpC,MAAM,EAAE,WAAW;IAW/B,QAAQ,IAAI,SAAS;IAWrB;;;OAGG;IAIG,WAAW,IAAI,OAAO,CAAC,KAAK,CAAC;IAG7B,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC;IAG1B,WAAW,IAAI,OAAO,CAAC,KAAK,CAAC;IAG7B,WAAW,IAAI,OAAO,CAAC,KAAK,CAAC;IAG7B,eAAe,IAAI,OAAO,CAAC,KAAK,CAAC;IAGjC,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC;IAG5B,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC;IAGzB,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC;IAG3B,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC;IAG5B,YAAY,IAAI,OAAO,CAAC,KAAK,CAAC;IAG9B,cAAc,IAAI,OAAO,CAAC,KAAK,CAAC;CAGvC"}
@@ -3,6 +3,9 @@
3
3
  * @description 继承 OpenAIProvider,对接 Ollama 本地推理服务
4
4
  * Ollama 原生支持 OpenAI 兼容接口(/v1/chat/completions)
5
5
  * 默认地址 http://localhost:11434/v1
6
+ *
7
+ * 注意:Ollama 不支持 Batch API 和 Files API,虽然继承了父类的实现,
8
+ * 但 isBatchProvider() / isFileProvider() 会返回 false(通过覆盖方法禁用)。
6
9
  */
7
10
  import { OpenAIProvider } from "./openai-provider.js";
8
11
  export class OllamaProvider extends OpenAIProvider {
@@ -26,5 +29,43 @@ export class OllamaProvider extends OpenAIProvider {
26
29
  supportsStreaming: true,
27
30
  };
28
31
  }
32
+ /**
33
+ * Ollama 不需要 Authorization header,重写请求方法去掉它
34
+ * 当 apiKey 为空时父类已经会跳过,所以这里只需复用父类逻辑
35
+ */
36
+ // ---- 覆盖 Batch/File 方法:Ollama 不支持这些 API ----
37
+ async createBatch() {
38
+ throw new Error('Ollama does not support Batch API');
39
+ }
40
+ async getBatch() {
41
+ throw new Error('Ollama does not support Batch API');
42
+ }
43
+ async listBatches() {
44
+ throw new Error('Ollama does not support Batch API');
45
+ }
46
+ async cancelBatch() {
47
+ throw new Error('Ollama does not support Batch API');
48
+ }
49
+ async getBatchResults() {
50
+ throw new Error('Ollama does not support Batch API');
51
+ }
52
+ async uploadFile() {
53
+ throw new Error('Ollama does not support Files API');
54
+ }
55
+ async getFile() {
56
+ throw new Error('Ollama does not support Files API');
57
+ }
58
+ async listFiles() {
59
+ throw new Error('Ollama does not support Files API');
60
+ }
61
+ async deleteFile() {
62
+ throw new Error('Ollama does not support Files API');
63
+ }
64
+ async downloadFile() {
65
+ throw new Error('Ollama does not support Files API');
66
+ }
67
+ async getFileContent() {
68
+ throw new Error('Ollama does not support Files API');
69
+ }
29
70
  }
30
71
  //# sourceMappingURL=ollama-provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ollama-provider.js","sourceRoot":"","sources":["../../../src/llm/ollama-provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,OAAO,cAAe,SAAQ,cAAc;IAEhD,YAAY,MAAmB;QAC7B,KAAK,CAAC;YACJ,GAAG,MAAM;YACT,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,2BAA2B;YACtD,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,QAAQ;YAC/B,oCAAoC;YACpC,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,QAAQ;QACN,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,2BAA2B;YAC3B,aAAa,EAAE,IAAI;YACnB,aAAa,EAAE,IAAI;YACnB,iBAAiB,EAAE,IAAI;SACxB,CAAC;IACJ,CAAC;CAMF"}
1
+ {"version":3,"file":"ollama-provider.js","sourceRoot":"","sources":["../../../src/llm/ollama-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,OAAO,cAAe,SAAQ,cAAc;IAEhD,YAAY,MAAmB;QAC7B,KAAK,CAAC;YACJ,GAAG,MAAM;YACT,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,2BAA2B;YACtD,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,QAAQ;YAC/B,oCAAoC;YACpC,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,QAAQ;QACN,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,2BAA2B;YAC3B,aAAa,EAAE,IAAI;YACnB,aAAa,EAAE,IAAI;YACnB,iBAAiB,EAAE,IAAI;SACxB,CAAC;IACJ,CAAC;IAED;;;OAGG;IAEH,8CAA8C;IAE9C,KAAK,CAAC,WAAW;QACf,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,KAAK,CAAC,WAAW;QACf,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,KAAK,CAAC,WAAW;QACf,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,KAAK,CAAC,eAAe;QACnB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,KAAK,CAAC,SAAS;QACb,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,KAAK,CAAC,YAAY;QAChB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,KAAK,CAAC,cAAc;QAClB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;CACF"}
@@ -1,9 +1,11 @@
1
1
  /**
2
2
  * @file OpenAI 兼容 LLM Provider
3
3
  * @description 使用原生 fetch 实现,支持任意 OpenAI 兼容端点(OpenAI / DeepSeek / Ollama / vLLM 等)
4
+ * 额外实现 BatchProvider + FileProvider 接口(OpenAI Batch API + Files API)
4
5
  */
5
- import type { LLMProvider, ModelConfig, ModelInfo, ChatParams, ChatResponse, ChatChunk } from './types.js';
6
- export declare class OpenAIProvider implements LLMProvider {
6
+ import type { LLMProvider, ModelConfig, ModelInfo, ChatParams, ChatResponse, ChatChunk, BatchProvider, BatchInfo, BatchResult, FileProvider, UploadedFileInfo } from './types.js';
7
+ import type { Message, ContentPart } from '../types.js';
8
+ export declare class OpenAIProvider implements LLMProvider, BatchProvider, FileProvider {
7
9
  protected config: Required<Pick<ModelConfig, 'provider' | 'model'>> & ModelConfig;
8
10
  constructor(config: ModelConfig);
9
11
  getModel(): ModelInfo;
@@ -13,6 +15,41 @@ export declare class OpenAIProvider implements LLMProvider {
13
15
  /** 更新配置(如 API Key 变更后) */
14
16
  updateConfig(updates: Partial<ModelConfig>): void;
15
17
  protected buildRequestBody(params: ChatParams, stream: boolean): Record<string, any>;
18
+ /**
19
+ * 将内部 Message[] 转换为 OpenAI API 格式
20
+ * - string content 直接透传
21
+ * - ContentPart[] 转换为 OpenAI 多模态格式
22
+ */
23
+ protected convertMessagesForApi(messages: Message[]): Record<string, any>[];
24
+ /** 将 ContentPart 转换为 OpenAI API 格式 */
25
+ protected convertContentPartForOpenAI(part: ContentPart): Record<string, any>;
16
26
  protected doRequest(body: Record<string, any>, signal?: AbortSignal): Promise<Response>;
27
+ uploadFile(filename: string, content: Buffer | string, purpose: 'assistants' | 'batch' | 'fine-tune' | 'vision'): Promise<UploadedFileInfo>;
28
+ getFile(fileId: string): Promise<UploadedFileInfo>;
29
+ listFiles(limit?: number, purpose?: string): Promise<UploadedFileInfo[]>;
30
+ deleteFile(fileId: string): Promise<boolean>;
31
+ downloadFile(fileId: string): Promise<Buffer>;
32
+ getFileContent(fileId: string): Promise<string>;
33
+ createBatch(inputFileId: string, options?: {
34
+ completionWindow?: '24h';
35
+ endpoint?: '/v1/chat/completions';
36
+ metadata?: Record<string, string>;
37
+ }): Promise<BatchInfo>;
38
+ getBatch(batchId: string): Promise<BatchInfo>;
39
+ listBatches(limit?: number): Promise<BatchInfo[]>;
40
+ cancelBatch(batchId: string): Promise<BatchInfo>;
41
+ getBatchResults(batchId: string): Promise<BatchResult[]>;
42
+ /** 认证 headers */
43
+ protected authHeaders(): Record<string, string>;
44
+ /** 原始 fetch 请求(不带 JSON Content-Type,用于 multipart/GET) */
45
+ protected doRawRequest(url: string, init: RequestInit & {
46
+ proxy?: string;
47
+ }): Promise<Response>;
48
+ /** 解析文件信息 */
49
+ protected parseFileInfo(data: any): UploadedFileInfo;
50
+ /** 解析批处理任务信息 */
51
+ protected parseBatchInfo(data: any): BatchInfo;
52
+ /** 解析单条批处理结果 */
53
+ protected parseBatchResult(data: any): BatchResult;
17
54
  }
18
55
  //# sourceMappingURL=openai-provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openai-provider.d.ts","sourceRoot":"","sources":["../../../src/llm/openai-provider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG3G,qBAAa,cAAe,YAAW,WAAW;IAChD,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,GAAG,WAAW,CAAC;gBAEtE,MAAM,EAAE,WAAW;IAY/B,QAAQ,IAAI,SAAS;IAUf,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAaxB,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IAyB9C,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,cAAc,CAAC,SAAS,CAAC;IAqEhE,0BAA0B;IAC1B,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;IAMjD,SAAS,CAAC,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;cAyBpE,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;CA2B9F"}
1
+ {"version":3,"file":"openai-provider.d.ts","sourceRoot":"","sources":["../../../src/llm/openai-provider.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * @file OpenAI 兼容 LLM Provider
3
3
  * @description 使用原生 fetch 实现,支持任意 OpenAI 兼容端点(OpenAI / DeepSeek / Ollama / vLLM 等)
4
+ * 额外实现 BatchProvider + FileProvider 接口(OpenAI Batch API + Files API)
4
5
  */
5
6
  export class OpenAIProvider {
6
7
  config;
@@ -132,7 +133,7 @@ export class OpenAIProvider {
132
133
  buildRequestBody(params, stream) {
133
134
  const body = {
134
135
  model: this.config.model,
135
- messages: params.messages,
136
+ messages: this.convertMessagesForApi(params.messages),
136
137
  temperature: params.temperature ?? this.config.temperature,
137
138
  max_tokens: (typeof params.maxTokens === 'number' && params.maxTokens > 0)
138
139
  ? params.maxTokens
@@ -151,6 +152,46 @@ export class OpenAIProvider {
151
152
  }
152
153
  return body;
153
154
  }
155
+ /**
156
+ * 将内部 Message[] 转换为 OpenAI API 格式
157
+ * - string content 直接透传
158
+ * - ContentPart[] 转换为 OpenAI 多模态格式
159
+ */
160
+ convertMessagesForApi(messages) {
161
+ return messages.map(msg => {
162
+ if (msg.content == null || typeof msg.content === 'string') {
163
+ return msg;
164
+ }
165
+ // ContentPart[] → OpenAI content parts
166
+ return {
167
+ ...msg,
168
+ content: msg.content.map(part => this.convertContentPartForOpenAI(part)),
169
+ };
170
+ });
171
+ }
172
+ /** 将 ContentPart 转换为 OpenAI API 格式 */
173
+ convertContentPartForOpenAI(part) {
174
+ switch (part.type) {
175
+ case 'text':
176
+ return { type: 'text', text: part.text };
177
+ case 'image':
178
+ return {
179
+ type: 'image_url',
180
+ image_url: {
181
+ url: part.source,
182
+ detail: part.detail || 'auto',
183
+ },
184
+ };
185
+ case 'file':
186
+ // OpenAI Chat API 无原生文件类型,转为文本注入
187
+ return {
188
+ type: 'text',
189
+ text: `[File: ${part.filename}]\n\n${part.content}`,
190
+ };
191
+ default:
192
+ return { type: 'text', text: '' };
193
+ }
194
+ }
154
195
  async doRequest(body, signal) {
155
196
  const url = `${this.config.baseUrl.replace(/\/$/, '')}/chat/completions`;
156
197
  const controller = new AbortController();
@@ -178,5 +219,265 @@ export class OpenAIProvider {
178
219
  clearTimeout(timeout);
179
220
  }
180
221
  }
222
+ // ============================================================
223
+ // FileProvider — 文件上传与管理(OpenAI Files API)
224
+ // ============================================================
225
+ async uploadFile(filename, content, purpose) {
226
+ const url = `${this.config.baseUrl.replace(/\/$/, '')}/files`;
227
+ const buffer = typeof content === 'string' ? Buffer.from(content, 'utf-8') : content;
228
+ const formData = new FormData();
229
+ formData.append('purpose', purpose);
230
+ formData.append('file', new Blob([buffer]), filename);
231
+ const res = await this.doRawRequest(url, {
232
+ method: 'POST',
233
+ headers: {
234
+ ...(this.config.apiKey ? { Authorization: `Bearer ${this.config.apiKey}` } : {}),
235
+ },
236
+ body: formData,
237
+ });
238
+ if (!res.ok) {
239
+ const errText = await res.text().catch(() => 'Unknown error');
240
+ throw new Error(`File upload error ${res.status}: ${errText}`);
241
+ }
242
+ const data = await res.json();
243
+ return this.parseFileInfo(data);
244
+ }
245
+ async getFile(fileId) {
246
+ const url = `${this.config.baseUrl.replace(/\/$/, '')}/files/${fileId}`;
247
+ const res = await this.doRawRequest(url, {
248
+ method: 'GET',
249
+ headers: this.authHeaders(),
250
+ });
251
+ if (!res.ok) {
252
+ const errText = await res.text().catch(() => 'Unknown error');
253
+ throw new Error(`Get file error ${res.status}: ${errText}`);
254
+ }
255
+ return this.parseFileInfo(await res.json());
256
+ }
257
+ async listFiles(limit = 20, purpose) {
258
+ let url = `${this.config.baseUrl.replace(/\/$/, '')}/files?limit=${limit}`;
259
+ if (purpose)
260
+ url += `&purpose=${purpose}`;
261
+ const res = await this.doRawRequest(url, {
262
+ method: 'GET',
263
+ headers: this.authHeaders(),
264
+ });
265
+ if (!res.ok) {
266
+ const errText = await res.text().catch(() => 'Unknown error');
267
+ throw new Error(`List files error ${res.status}: ${errText}`);
268
+ }
269
+ const data = await res.json();
270
+ return (data.data || []).map((f) => this.parseFileInfo(f));
271
+ }
272
+ async deleteFile(fileId) {
273
+ const url = `${this.config.baseUrl.replace(/\/$/, '')}/files/${fileId}`;
274
+ const res = await this.doRawRequest(url, {
275
+ method: 'DELETE',
276
+ headers: this.authHeaders(),
277
+ });
278
+ if (!res.ok) {
279
+ const errText = await res.text().catch(() => 'Unknown error');
280
+ throw new Error(`Delete file error ${res.status}: ${errText}`);
281
+ }
282
+ const data = await res.json();
283
+ return data.deleted === true;
284
+ }
285
+ async downloadFile(fileId) {
286
+ const url = `${this.config.baseUrl.replace(/\/$/, '')}/files/${fileId}/content`;
287
+ const res = await this.doRawRequest(url, {
288
+ method: 'GET',
289
+ headers: this.authHeaders(),
290
+ });
291
+ if (!res.ok) {
292
+ const errText = await res.text().catch(() => 'Unknown error');
293
+ throw new Error(`Download file error ${res.status}: ${errText}`);
294
+ }
295
+ const arrayBuffer = await res.arrayBuffer();
296
+ return Buffer.from(arrayBuffer);
297
+ }
298
+ async getFileContent(fileId) {
299
+ const buffer = await this.downloadFile(fileId);
300
+ return buffer.toString('utf-8');
301
+ }
302
+ // ============================================================
303
+ // BatchProvider — 批处理(OpenAI Batch API)
304
+ // ============================================================
305
+ async createBatch(inputFileId, options) {
306
+ const url = `${this.config.baseUrl.replace(/\/$/, '')}/batches`;
307
+ const body = {
308
+ input_file_id: inputFileId,
309
+ endpoint: options?.endpoint || '/v1/chat/completions',
310
+ completion_window: options?.completionWindow || '24h',
311
+ };
312
+ if (options?.metadata)
313
+ body.metadata = options.metadata;
314
+ const res = await this.doRawRequest(url, {
315
+ method: 'POST',
316
+ headers: { ...this.authHeaders(), 'Content-Type': 'application/json' },
317
+ body: JSON.stringify(body),
318
+ });
319
+ if (!res.ok) {
320
+ const errText = await res.text().catch(() => 'Unknown error');
321
+ throw new Error(`Create batch error ${res.status}: ${errText}`);
322
+ }
323
+ return this.parseBatchInfo(await res.json());
324
+ }
325
+ async getBatch(batchId) {
326
+ const url = `${this.config.baseUrl.replace(/\/$/, '')}/batches/${batchId}`;
327
+ const res = await this.doRawRequest(url, {
328
+ method: 'GET',
329
+ headers: this.authHeaders(),
330
+ });
331
+ if (!res.ok) {
332
+ const errText = await res.text().catch(() => 'Unknown error');
333
+ throw new Error(`Get batch error ${res.status}: ${errText}`);
334
+ }
335
+ return this.parseBatchInfo(await res.json());
336
+ }
337
+ async listBatches(limit = 20) {
338
+ const url = `${this.config.baseUrl.replace(/\/$/, '')}/batches?limit=${limit}`;
339
+ const res = await this.doRawRequest(url, {
340
+ method: 'GET',
341
+ headers: this.authHeaders(),
342
+ });
343
+ if (!res.ok) {
344
+ const errText = await res.text().catch(() => 'Unknown error');
345
+ throw new Error(`List batches error ${res.status}: ${errText}`);
346
+ }
347
+ const data = await res.json();
348
+ return (data.data || []).map((b) => this.parseBatchInfo(b));
349
+ }
350
+ async cancelBatch(batchId) {
351
+ const url = `${this.config.baseUrl.replace(/\/$/, '')}/batches/${batchId}/cancel`;
352
+ const res = await this.doRawRequest(url, {
353
+ method: 'POST',
354
+ headers: this.authHeaders(),
355
+ });
356
+ if (!res.ok) {
357
+ const errText = await res.text().catch(() => 'Unknown error');
358
+ throw new Error(`Cancel batch error ${res.status}: ${errText}`);
359
+ }
360
+ return this.parseBatchInfo(await res.json());
361
+ }
362
+ async getBatchResults(batchId) {
363
+ const batch = await this.getBatch(batchId);
364
+ if (batch.status !== 'completed' && batch.status !== 'failed' && batch.status !== 'expired') {
365
+ throw new Error(`Batch ${batchId} is not finished yet (status: ${batch.status})`);
366
+ }
367
+ const results = [];
368
+ // 下载成功结果
369
+ if (batch.outputFileId) {
370
+ const content = await this.getFileContent(batch.outputFileId);
371
+ for (const line of content.split('\n')) {
372
+ const trimmed = line.trim();
373
+ if (!trimmed)
374
+ continue;
375
+ try {
376
+ results.push(this.parseBatchResult(JSON.parse(trimmed)));
377
+ }
378
+ catch { /* skip malformed lines */ }
379
+ }
380
+ }
381
+ // 下载失败结果
382
+ if (batch.errorFileId) {
383
+ const content = await this.getFileContent(batch.errorFileId);
384
+ for (const line of content.split('\n')) {
385
+ const trimmed = line.trim();
386
+ if (!trimmed)
387
+ continue;
388
+ try {
389
+ results.push(this.parseBatchResult(JSON.parse(trimmed)));
390
+ }
391
+ catch { /* skip malformed lines */ }
392
+ }
393
+ }
394
+ return results;
395
+ }
396
+ // ============================================================
397
+ // 内部辅助方法
398
+ // ============================================================
399
+ /** 认证 headers */
400
+ authHeaders() {
401
+ return {
402
+ ...(this.config.apiKey ? { Authorization: `Bearer ${this.config.apiKey}` } : {}),
403
+ };
404
+ }
405
+ /** 原始 fetch 请求(不带 JSON Content-Type,用于 multipart/GET) */
406
+ async doRawRequest(url, init) {
407
+ const controller = new AbortController();
408
+ const timeout = setTimeout(() => controller.abort(), this.config.timeout);
409
+ try {
410
+ return await fetch(url, {
411
+ ...init,
412
+ signal: controller.signal,
413
+ ...(this.config.proxy ? { proxy: this.config.proxy } : {}),
414
+ });
415
+ }
416
+ finally {
417
+ clearTimeout(timeout);
418
+ }
419
+ }
420
+ /** 解析文件信息 */
421
+ parseFileInfo(data) {
422
+ return {
423
+ id: data.id,
424
+ filename: data.filename,
425
+ bytes: data.bytes,
426
+ createdAt: data.created_at,
427
+ purpose: data.purpose,
428
+ status: data.status,
429
+ mimeType: data.mime_type,
430
+ };
431
+ }
432
+ /** 解析批处理任务信息 */
433
+ parseBatchInfo(data) {
434
+ return {
435
+ id: data.id,
436
+ status: data.status,
437
+ inputFileId: data.input_file_id,
438
+ completionWindow: data.completion_window,
439
+ createdAt: data.created_at,
440
+ expiresAt: data.expires_at,
441
+ outputFileId: data.output_file_id,
442
+ errorFileId: data.error_file_id,
443
+ requestCounts: data.request_counts ? {
444
+ total: data.request_counts.total,
445
+ completed: data.request_counts.completed,
446
+ failed: data.request_counts.failed,
447
+ } : undefined,
448
+ metadata: data.metadata,
449
+ };
450
+ }
451
+ /** 解析单条批处理结果 */
452
+ parseBatchResult(data) {
453
+ const result = {
454
+ id: data.id,
455
+ customId: data.custom_id,
456
+ };
457
+ if (data.response) {
458
+ result.response = {
459
+ status: data.response.status,
460
+ body: {
461
+ choices: data.response.body?.choices?.map((c) => ({
462
+ message: c.message,
463
+ finish_reason: c.finish_reason || 'stop',
464
+ })) || [],
465
+ usage: data.response.body?.usage ? {
466
+ promptTokens: data.response.body.usage.prompt_tokens || 0,
467
+ completionTokens: data.response.body.usage.completion_tokens || 0,
468
+ totalTokens: data.response.body.usage.total_tokens || 0,
469
+ } : undefined,
470
+ },
471
+ };
472
+ }
473
+ if (data.error) {
474
+ result.error = {
475
+ message: data.error.message,
476
+ type: data.error.type,
477
+ code: data.error.code,
478
+ };
479
+ }
480
+ return result;
481
+ }
181
482
  }
182
483
  //# sourceMappingURL=openai-provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"openai-provider.js","sourceRoot":"","sources":["../../../src/llm/openai-provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openai-provider.js","sourceRoot":"","sources":["../../../src/llm/openai-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export interface ModelPricing {
2
+ /** 输入 token 单价(美元/百万 token) */
3
+ inputPerMillion: number;
4
+ /** 输出 token 单价(美元/百万 token) */
5
+ outputPerMillion: number;
6
+ /** 上下文窗口(token) */
7
+ contextWindow?: number;
8
+ }
9
+ /**
10
+ * 注册自定义模型定价
11
+ * @param key 模型标识,格式 {provider}:{model}
12
+ */
13
+ export declare function registerPricing(key: string, pricing: ModelPricing): void;
14
+ /**
15
+ * 查询模型定价
16
+ * 查找顺序:自定义 → 内置精确匹配 → 内置前缀匹配 → 默认值
17
+ */
18
+ export declare function getPricing(provider: string, model: string): ModelPricing;
19
+ /**
20
+ * 计算 token 使用成本(美元)
21
+ */
22
+ export declare function calculateCost(provider: string, model: string, usage: {
23
+ promptTokens: number;
24
+ completionTokens: number;
25
+ }): number;
26
+ //# sourceMappingURL=pricing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../../src/llm/pricing.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,YAAY;IAC3B,+BAA+B;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,+BAA+B;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAyCD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAExE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,CAkBxE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,GACxD,MAAM,CAKR"}
@@ -0,0 +1,81 @@
1
+ // ============================================================
2
+ // TokenPricing — 内置模型定价表
3
+ // ============================================================
4
+ //
5
+ // 常见模型的 input/output token 单价(美元/百万 token)
6
+ // 数据来源:各 Provider 官方定价页(2025-06)
7
+ //
8
+ // 上层可通过 registerPricing() 注册自定义模型定价
9
+ /**
10
+ * 内置模型定价表
11
+ * key 格式:{provider}:{model} 或 {model-prefix}
12
+ * 查找时先精确匹配,再前缀匹配
13
+ */
14
+ const BUILTIN_PRICING = {
15
+ // ---- OpenAI ----
16
+ 'openai:gpt-4o': { inputPerMillion: 2.5, outputPerMillion: 10, contextWindow: 128000 },
17
+ 'openai:gpt-4o-mini': { inputPerMillion: 0.15, outputPerMillion: 0.6, contextWindow: 128000 },
18
+ 'openai:gpt-4-turbo': { inputPerMillion: 10, outputPerMillion: 30, contextWindow: 128000 },
19
+ 'openai:gpt-4': { inputPerMillion: 30, outputPerMillion: 60, contextWindow: 8192 },
20
+ 'openai:gpt-3.5-turbo': { inputPerMillion: 0.5, outputPerMillion: 1.5, contextWindow: 16385 },
21
+ 'openai:o1': { inputPerMillion: 15, outputPerMillion: 60, contextWindow: 200000 },
22
+ 'openai:o1-mini': { inputPerMillion: 3, outputPerMillion: 12, contextWindow: 128000 },
23
+ 'openai:o3': { inputPerMillion: 15, outputPerMillion: 60, contextWindow: 200000 },
24
+ 'openai:o3-mini': { inputPerMillion: 1.1, outputPerMillion: 4.4, contextWindow: 200000 },
25
+ 'openai:o4-mini': { inputPerMillion: 1.1, outputPerMillion: 4.4, contextWindow: 200000 },
26
+ // ---- Anthropic ----
27
+ 'anthropic:claude-sonnet-4': { inputPerMillion: 3, outputPerMillion: 15, contextWindow: 200000 },
28
+ 'anthropic:claude-opus-4': { inputPerMillion: 15, outputPerMillion: 75, contextWindow: 200000 },
29
+ 'anthropic:claude-3-5-sonnet': { inputPerMillion: 3, outputPerMillion: 15, contextWindow: 200000 },
30
+ 'anthropic:claude-3-5-haiku': { inputPerMillion: 0.8, outputPerMillion: 4, contextWindow: 200000 },
31
+ 'anthropic:claude-3-opus': { inputPerMillion: 15, outputPerMillion: 75, contextWindow: 200000 },
32
+ 'anthropic:claude-3-sonnet': { inputPerMillion: 3, outputPerMillion: 15, contextWindow: 200000 },
33
+ 'anthropic:claude-3-haiku': { inputPerMillion: 0.25, outputPerMillion: 1.25, contextWindow: 200000 },
34
+ // ---- DeepSeek ----
35
+ 'deepseek:deepseek-chat': { inputPerMillion: 0.27, outputPerMillion: 1.1, contextWindow: 64000 },
36
+ 'deepseek:deepseek-reasoner': { inputPerMillion: 0.55, outputPerMillion: 2.19, contextWindow: 64000 },
37
+ // ---- Ollama(本地免费,标记为 0)----
38
+ 'ollama:llama3': { inputPerMillion: 0, outputPerMillion: 0, contextWindow: 8192 },
39
+ 'ollama:qwen2': { inputPerMillion: 0, outputPerMillion: 0, contextWindow: 32768 },
40
+ };
41
+ /** 自定义定价覆盖(上层注册) */
42
+ const customPricing = new Map();
43
+ /**
44
+ * 注册自定义模型定价
45
+ * @param key 模型标识,格式 {provider}:{model}
46
+ */
47
+ export function registerPricing(key, pricing) {
48
+ customPricing.set(key, pricing);
49
+ }
50
+ /**
51
+ * 查询模型定价
52
+ * 查找顺序:自定义 → 内置精确匹配 → 内置前缀匹配 → 默认值
53
+ */
54
+ export function getPricing(provider, model) {
55
+ const key = `${provider}:${model}`;
56
+ // 1. 自定义定价
57
+ const custom = customPricing.get(key);
58
+ if (custom)
59
+ return custom;
60
+ // 2. 内置精确匹配
61
+ const exact = BUILTIN_PRICING[key];
62
+ if (exact)
63
+ return exact;
64
+ // 3. 内置前缀匹配(如 claude-sonnet-4-20250514 → claude-sonnet-4)
65
+ for (const [pricingKey, pricing] of Object.entries(BUILTIN_PRICING)) {
66
+ if (key.startsWith(pricingKey))
67
+ return pricing;
68
+ }
69
+ // 4. 默认值(未知模型)
70
+ return { inputPerMillion: 1, outputPerMillion: 3 };
71
+ }
72
+ /**
73
+ * 计算 token 使用成本(美元)
74
+ */
75
+ export function calculateCost(provider, model, usage) {
76
+ const pricing = getPricing(provider, model);
77
+ const inputCost = (usage.promptTokens / 1_000_000) * pricing.inputPerMillion;
78
+ const outputCost = (usage.completionTokens / 1_000_000) * pricing.outputPerMillion;
79
+ return Math.round((inputCost + outputCost) * 1_000_000) / 1_000_000; // 保留 6 位小数
80
+ }
81
+ //# sourceMappingURL=pricing.js.map