@zimtsui/brainswitch 0.0.55 → 0.0.57

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 (272) hide show
  1. package/DEVELOPMENT.md +13 -14
  2. package/README.md +110 -62
  3. package/assets/verbatim/declarations.handlebars +11 -0
  4. package/assets/verbatim/instruction.md +49 -0
  5. package/build/adaptor.d.ts +38 -7
  6. package/build/adaptor.js +35 -37
  7. package/build/adaptor.js.map +1 -1
  8. package/build/api-types/anthropic/billing.d.ts +12 -0
  9. package/build/api-types/anthropic/billing.js +14 -0
  10. package/build/api-types/anthropic/billing.js.map +1 -0
  11. package/build/api-types/anthropic/tool-codec.d.ts +16 -0
  12. package/build/api-types/anthropic/tool-codec.js +58 -0
  13. package/build/api-types/anthropic/tool-codec.js.map +1 -0
  14. package/build/api-types/google/billing.d.ts +12 -0
  15. package/build/api-types/google/billing.js +23 -0
  16. package/build/api-types/google/billing.js.map +1 -0
  17. package/build/api-types/google/restful-request.d.ts +8 -0
  18. package/build/api-types/google/restful-request.js +1 -0
  19. package/build/api-types/google/restful-request.js.map +1 -0
  20. package/build/api-types/google/tool-codec.d.ts +16 -0
  21. package/build/api-types/{google.js → google/tool-codec.js} +32 -29
  22. package/build/api-types/google/tool-codec.js.map +1 -0
  23. package/build/api-types/openai-chatcompletions/billing.d.ts +12 -0
  24. package/build/api-types/openai-chatcompletions/billing.js +14 -0
  25. package/build/api-types/openai-chatcompletions/billing.js.map +1 -0
  26. package/build/api-types/openai-chatcompletions/tool-codec.d.ts +17 -0
  27. package/build/api-types/openai-chatcompletions/tool-codec.js +80 -0
  28. package/build/api-types/openai-chatcompletions/tool-codec.js.map +1 -0
  29. package/build/api-types/openai-responses/billing.d.ts +12 -0
  30. package/build/api-types/openai-responses/billing.js +14 -0
  31. package/build/api-types/openai-responses/billing.js.map +1 -0
  32. package/build/api-types/openai-responses/tool-codec.d.ts +16 -0
  33. package/build/api-types/openai-responses/tool-codec.js +76 -0
  34. package/build/api-types/openai-responses/tool-codec.js.map +1 -0
  35. package/build/assets.d.ts +7 -0
  36. package/build/assets.js +8 -0
  37. package/build/assets.js.map +1 -0
  38. package/build/compatible-engine/session.d.ts +67 -0
  39. package/build/compatible-engine/session.js +92 -0
  40. package/build/compatible-engine/session.js.map +1 -0
  41. package/build/compatible-engine/structuring.d.ts +36 -0
  42. package/build/compatible-engine/structuring.js +34 -0
  43. package/build/compatible-engine/structuring.js.map +1 -0
  44. package/build/compatible-engine/validation.d.ts +21 -0
  45. package/build/compatible-engine/validation.js +82 -0
  46. package/build/compatible-engine/validation.js.map +1 -0
  47. package/build/compatible-engine.d/agentloop.d.ts +12 -0
  48. package/build/compatible-engine.d/agentloop.js +52 -0
  49. package/build/compatible-engine.d/agentloop.js.map +1 -0
  50. package/build/compatible-engine.d/aliyun/transport.d.ts +12 -0
  51. package/build/compatible-engine.d/aliyun/transport.js +7 -0
  52. package/build/compatible-engine.d/aliyun/transport.js.map +1 -0
  53. package/build/compatible-engine.d/aliyun.d.ts +24 -0
  54. package/build/compatible-engine.d/aliyun.js +46 -0
  55. package/build/compatible-engine.d/aliyun.js.map +1 -0
  56. package/build/compatible-engine.d/anthropic/choice-codec.d.ts +5 -0
  57. package/build/compatible-engine.d/anthropic/choice-codec.js +26 -0
  58. package/build/compatible-engine.d/anthropic/choice-codec.js.map +1 -0
  59. package/build/compatible-engine.d/anthropic/message-codec.d.ts +36 -0
  60. package/build/compatible-engine.d/anthropic/message-codec.js +86 -0
  61. package/build/compatible-engine.d/anthropic/message-codec.js.map +1 -0
  62. package/build/compatible-engine.d/anthropic/transport.d.ts +34 -0
  63. package/build/compatible-engine.d/anthropic/transport.js +150 -0
  64. package/build/compatible-engine.d/anthropic/transport.js.map +1 -0
  65. package/build/compatible-engine.d/anthropic.d.ts +26 -0
  66. package/build/compatible-engine.d/anthropic.js +46 -0
  67. package/build/compatible-engine.d/anthropic.js.map +1 -0
  68. package/build/compatible-engine.d/google/choice-codec.d.ts +5 -0
  69. package/build/compatible-engine.d/google/choice-codec.js +27 -0
  70. package/build/compatible-engine.d/google/choice-codec.js.map +1 -0
  71. package/build/compatible-engine.d/google/message-codec.d.ts +36 -0
  72. package/build/compatible-engine.d/google/message-codec.js +94 -0
  73. package/build/compatible-engine.d/google/message-codec.js.map +1 -0
  74. package/build/compatible-engine.d/google/transport.d.ts +30 -0
  75. package/build/compatible-engine.d/google/transport.js +78 -0
  76. package/build/compatible-engine.d/google/transport.js.map +1 -0
  77. package/build/compatible-engine.d/google.d.ts +26 -0
  78. package/build/compatible-engine.d/google.js +50 -0
  79. package/build/compatible-engine.d/google.js.map +1 -0
  80. package/build/compatible-engine.d/openai-chatcompletions/choice-codec.d.ts +5 -0
  81. package/build/compatible-engine.d/openai-chatcompletions/choice-codec.js +31 -0
  82. package/build/compatible-engine.d/openai-chatcompletions/choice-codec.js.map +1 -0
  83. package/build/compatible-engine.d/openai-chatcompletions/message-codec.d.ts +24 -0
  84. package/build/compatible-engine.d/openai-chatcompletions/message-codec.js +71 -0
  85. package/build/compatible-engine.d/openai-chatcompletions/message-codec.js.map +1 -0
  86. package/build/compatible-engine.d/openai-chatcompletions/transport.d/monolith.d.ts +38 -0
  87. package/build/compatible-engine.d/openai-chatcompletions/transport.d/monolith.js +77 -0
  88. package/build/compatible-engine.d/openai-chatcompletions/transport.d/monolith.js.map +1 -0
  89. package/build/compatible-engine.d/openai-chatcompletions/transport.d/stream.d.ts +37 -0
  90. package/build/compatible-engine.d/openai-chatcompletions/transport.d/stream.js +190 -0
  91. package/build/compatible-engine.d/openai-chatcompletions/transport.d/stream.js.map +1 -0
  92. package/build/compatible-engine.d/openai-chatcompletions/transport.d.ts +10 -0
  93. package/build/compatible-engine.d/openai-chatcompletions/transport.js +11 -0
  94. package/build/compatible-engine.d/openai-chatcompletions/transport.js.map +1 -0
  95. package/build/compatible-engine.d/openai-chatcompletions.d.ts +17 -0
  96. package/build/compatible-engine.d/openai-chatcompletions.js +14 -0
  97. package/build/compatible-engine.d/openai-chatcompletions.js.map +1 -0
  98. package/build/compatible-engine.d/openai-responses/choice-codec.d.ts +5 -0
  99. package/build/compatible-engine.d/openai-responses/choice-codec.js +30 -0
  100. package/build/compatible-engine.d/openai-responses/choice-codec.js.map +1 -0
  101. package/build/compatible-engine.d/openai-responses/message-codec.d.ts +36 -0
  102. package/build/compatible-engine.d/openai-responses/message-codec.js +96 -0
  103. package/build/compatible-engine.d/openai-responses/message-codec.js.map +1 -0
  104. package/build/compatible-engine.d/openai-responses/transport.d.ts +35 -0
  105. package/build/compatible-engine.d/openai-responses/transport.js +80 -0
  106. package/build/compatible-engine.d/openai-responses/transport.js.map +1 -0
  107. package/build/compatible-engine.d/openai-responses.d.ts +26 -0
  108. package/build/compatible-engine.d/openai-responses.js +46 -0
  109. package/build/compatible-engine.d/openai-responses.js.map +1 -0
  110. package/build/compatible-engine.d.ts +17 -46
  111. package/build/compatible-engine.js +20 -58
  112. package/build/compatible-engine.js.map +1 -1
  113. package/build/config.d.ts +1 -0
  114. package/build/config.js +0 -1
  115. package/build/config.js.map +1 -1
  116. package/build/endpoint-spec.d.ts +1 -0
  117. package/build/endpoint-spec.js +2 -1
  118. package/build/endpoint-spec.js.map +1 -1
  119. package/build/engine/session.d.ts +7 -0
  120. package/build/engine/session.js +1 -0
  121. package/build/engine/session.js.map +1 -0
  122. package/build/engine/transport.d.ts +5 -0
  123. package/build/engine/transport.js +1 -0
  124. package/build/engine/transport.js.map +1 -0
  125. package/build/engine/validation.d.ts +9 -0
  126. package/build/engine/validation.js +1 -0
  127. package/build/engine/validation.js.map +1 -0
  128. package/build/engine.d.ts +60 -29
  129. package/build/engine.js +86 -19
  130. package/build/engine.js.map +1 -1
  131. package/build/exports.d.ts +4 -3
  132. package/build/exports.js +4 -3
  133. package/build/exports.js.map +1 -1
  134. package/build/function.d.ts +79 -54
  135. package/build/function.js +30 -46
  136. package/build/function.js.map +1 -1
  137. package/build/inference-context.d.ts +2 -2
  138. package/build/inference-context.js +0 -1
  139. package/build/inference-context.js.map +1 -1
  140. package/build/native-engines.d/google/message-codec.d.ts +23 -0
  141. package/build/native-engines.d/google/message-codec.js +67 -0
  142. package/build/native-engines.d/google/message-codec.js.map +1 -0
  143. package/build/native-engines.d/google/session.d.ts +45 -51
  144. package/build/native-engines.d/google/session.js +84 -80
  145. package/build/native-engines.d/google/session.js.map +1 -1
  146. package/build/native-engines.d/google/transport.d.ts +34 -0
  147. package/build/native-engines.d/google/transport.js +81 -0
  148. package/build/native-engines.d/google/transport.js.map +1 -0
  149. package/build/native-engines.d/google/validation.d.ts +22 -0
  150. package/build/native-engines.d/google/validation.js +20 -0
  151. package/build/native-engines.d/google/validation.js.map +1 -0
  152. package/build/native-engines.d/google.d/agentloop.d.ts +12 -0
  153. package/build/native-engines.d/google.d/agentloop.js +57 -0
  154. package/build/native-engines.d/google.d/agentloop.js.map +1 -0
  155. package/build/native-engines.d/google.d/exports.d.ts +3 -0
  156. package/build/native-engines.d/google.d/exports.js +4 -0
  157. package/build/native-engines.d/google.d/exports.js.map +1 -0
  158. package/build/native-engines.d/google.d.ts +42 -0
  159. package/build/native-engines.d/google.js +83 -0
  160. package/build/native-engines.d/google.js.map +1 -0
  161. package/build/native-engines.d/openai-responses/choice-codec.d.ts +5 -0
  162. package/build/native-engines.d/openai-responses/choice-codec.js +30 -0
  163. package/build/native-engines.d/openai-responses/choice-codec.js.map +1 -0
  164. package/build/native-engines.d/openai-responses/message-codec.d.ts +23 -0
  165. package/build/native-engines.d/openai-responses/message-codec.js +75 -0
  166. package/build/native-engines.d/openai-responses/message-codec.js.map +1 -0
  167. package/build/native-engines.d/openai-responses/session.d.ts +47 -44
  168. package/build/native-engines.d/openai-responses/session.js +73 -103
  169. package/build/native-engines.d/openai-responses/session.js.map +1 -1
  170. package/build/native-engines.d/openai-responses/structuring.d.ts +19 -0
  171. package/build/native-engines.d/openai-responses/structuring.js +19 -0
  172. package/build/native-engines.d/openai-responses/structuring.js.map +1 -0
  173. package/build/native-engines.d/openai-responses/tool.d.ts +14 -11
  174. package/build/native-engines.d/openai-responses/tool.js +1 -12
  175. package/build/native-engines.d/openai-responses/tool.js.map +1 -1
  176. package/build/native-engines.d/openai-responses/transport.d.ts +35 -0
  177. package/build/native-engines.d/openai-responses/transport.js +84 -0
  178. package/build/native-engines.d/openai-responses/transport.js.map +1 -0
  179. package/build/native-engines.d/openai-responses/validation.d.ts +20 -0
  180. package/build/native-engines.d/openai-responses/validation.js +80 -0
  181. package/build/native-engines.d/openai-responses/validation.js.map +1 -0
  182. package/build/native-engines.d/openai-responses.d/agentloop.d.ts +12 -0
  183. package/build/native-engines.d/openai-responses.d/agentloop.js +61 -0
  184. package/build/native-engines.d/openai-responses.d/agentloop.js.map +1 -0
  185. package/build/native-engines.d/{google → openai-responses.d}/exports.d.ts +1 -2
  186. package/build/native-engines.d/{google → openai-responses.d}/exports.js +1 -2
  187. package/build/native-engines.d/openai-responses.d/exports.js.map +1 -0
  188. package/build/native-engines.d/openai-responses.d.ts +44 -0
  189. package/build/native-engines.d/openai-responses.js +78 -0
  190. package/build/native-engines.d/openai-responses.js.map +1 -0
  191. package/build/throttle.d.ts +5 -4
  192. package/build/throttle.js +17 -14
  193. package/build/throttle.js.map +1 -1
  194. package/build/tsconfig.tsbuildinfo +1 -1
  195. package/build/verbatim/codec/declarations.d.ts +2 -0
  196. package/build/verbatim/codec/declarations.js +22 -0
  197. package/build/verbatim/codec/declarations.js.map +1 -0
  198. package/build/verbatim/codec/request.d.ts +7 -0
  199. package/build/verbatim/codec/request.js +53 -0
  200. package/build/verbatim/codec/request.js.map +1 -0
  201. package/build/verbatim/codec.d.ts +2 -0
  202. package/build/verbatim/codec.js +3 -0
  203. package/build/verbatim/codec.js.map +1 -0
  204. package/build/verbatim.d.ts +74 -0
  205. package/build/verbatim.js +17 -0
  206. package/build/verbatim.js.map +1 -0
  207. package/examples/agent.ts +65 -0
  208. package/examples/chat.ts +24 -0
  209. package/examples/config.ts +24 -0
  210. package/examples/tsconfig.json +34 -0
  211. package/examples/verbatim.ts +44 -0
  212. package/package.json +10 -9
  213. package/build/agentloop.d.ts +0 -12
  214. package/build/agentloop.js +0 -43
  215. package/build/agentloop.js.map +0 -1
  216. package/build/api-types/anthropic.d.ts +0 -29
  217. package/build/api-types/anthropic.js +0 -93
  218. package/build/api-types/anthropic.js.map +0 -1
  219. package/build/api-types/google.d.ts +0 -28
  220. package/build/api-types/google.js.map +0 -1
  221. package/build/api-types/openai-chat-completions.d.ts +0 -31
  222. package/build/api-types/openai-chat-completions.js +0 -113
  223. package/build/api-types/openai-chat-completions.js.map +0 -1
  224. package/build/api-types/openai-responses.d.ts +0 -23
  225. package/build/api-types/openai-responses.js +0 -71
  226. package/build/api-types/openai-responses.js.map +0 -1
  227. package/build/compatible-engines.d/aliyun.d.ts +0 -69
  228. package/build/compatible-engines.d/aliyun.js +0 -149
  229. package/build/compatible-engines.d/aliyun.js.map +0 -1
  230. package/build/compatible-engines.d/anthropic.d.ts +0 -78
  231. package/build/compatible-engines.d/anthropic.js +0 -312
  232. package/build/compatible-engines.d/anthropic.js.map +0 -1
  233. package/build/compatible-engines.d/google.d.ts +0 -83
  234. package/build/compatible-engines.d/google.js +0 -279
  235. package/build/compatible-engines.d/google.js.map +0 -1
  236. package/build/compatible-engines.d/openai-chatcompletions.d/monolith.d.ts +0 -15
  237. package/build/compatible-engines.d/openai-chatcompletions.d/monolith.js +0 -75
  238. package/build/compatible-engines.d/openai-chatcompletions.d/monolith.js.map +0 -1
  239. package/build/compatible-engines.d/openai-chatcompletions.d/stream.d.ts +0 -21
  240. package/build/compatible-engines.d/openai-chatcompletions.d/stream.js +0 -186
  241. package/build/compatible-engines.d/openai-chatcompletions.d/stream.js.map +0 -1
  242. package/build/compatible-engines.d/openai-chatcompletions.d.ts +0 -27
  243. package/build/compatible-engines.d/openai-chatcompletions.js +0 -76
  244. package/build/compatible-engines.d/openai-chatcompletions.js.map +0 -1
  245. package/build/compatible-engines.d/openai-responses.d.ts +0 -93
  246. package/build/compatible-engines.d/openai-responses.js +0 -300
  247. package/build/compatible-engines.d/openai-responses.js.map +0 -1
  248. package/build/frontmatter.d.ts +0 -5
  249. package/build/frontmatter.js +0 -13
  250. package/build/frontmatter.js.map +0 -1
  251. package/build/native-engines.d/google/agentloop.d.ts +0 -12
  252. package/build/native-engines.d/google/agentloop.js +0 -42
  253. package/build/native-engines.d/google/agentloop.js.map +0 -1
  254. package/build/native-engines.d/google/engine.d.ts +0 -110
  255. package/build/native-engines.d/google/engine.js +0 -314
  256. package/build/native-engines.d/google/engine.js.map +0 -1
  257. package/build/native-engines.d/google/exports.js.map +0 -1
  258. package/build/native-engines.d/openai-responses/agentloop.d.ts +0 -13
  259. package/build/native-engines.d/openai-responses/agentloop.js +0 -53
  260. package/build/native-engines.d/openai-responses/agentloop.js.map +0 -1
  261. package/build/native-engines.d/openai-responses/engine.d.ts +0 -112
  262. package/build/native-engines.d/openai-responses/engine.js +0 -344
  263. package/build/native-engines.d/openai-responses/engine.js.map +0 -1
  264. package/build/native-engines.d/openai-responses/exports.d.ts +0 -7
  265. package/build/native-engines.d/openai-responses/exports.js +0 -8
  266. package/build/native-engines.d/openai-responses/exports.js.map +0 -1
  267. package/build/session.d.ts +0 -77
  268. package/build/session.js +0 -137
  269. package/build/session.js.map +0 -1
  270. package/build/test.d.ts +0 -1
  271. package/build/test.js +0 -198
  272. package/build/test.js.map +0 -1
package/DEVELOPMENT.md CHANGED
@@ -3,21 +3,20 @@
3
3
  ```mermaid
4
4
  classDiagram
5
5
 
6
- OpenAIResponsesEngine <|.. OpenAIResponsesNativeEngine
7
-
8
- CompatibleEngine <|.. OpenAIResponsesCompatibleEngine
9
- OpenAIResponsesEngine <|.. OpenAIResponsesCompatibleEngine
10
- Engine <|.. OpenAIResponsesEngine
11
-
12
6
  Engine <|.. CompatibleEngine
13
7
 
14
- Engine <|.. OpenAIChatCompletionsEngine
15
- OpenAIChatCompletionsEngine <|.. OpenAIChatCompletionsCompatibleEngine
16
- CompatibleEngine <|.. OpenAIChatCompletionsCompatibleEngine
17
- OpenAIChatCompletionsCompatibleEngine <|.. OpenAIChatCompletionsCompatibleMonolithEngine
18
- OpenAIChatCompletionsCompatibleEngine <|.. OpenAIChatCompletionsCompatibleStreamEngine
19
- ```
8
+ Engine <|.. OpenAIResponsesNativeEngine
9
+ OpenAIResponsesNativeEngine o--> OpenAIResponsesNativeHelpers
10
+ OpenAIResponsesNativeHelpers o--> OpenAIResponsesHelpers
20
11
 
21
- ## 继承
12
+ CompatibleEngine <|.. AliyunEngine
13
+ OpenAIChatCompletionsCompatibleHelpers o--> OpenAIChatCompletionsHelpers
14
+ OpenAIChatCompletionsCompatibleMonolithHelpers o--> OpenAIChatCompletionsCompatibleHelpers
15
+ OpenAIChatCompletionsCompatibleStreamHelpers o--> OpenAIChatCompletionsCompatibleHelpers
16
+ AliyunEngine o--> OpenAIChatCompletionsCompatibleStreamHelpers
22
17
 
23
- 用组合代替继承以实现多重继承的效果。
18
+ CompatibleEngine <|.. OpenAICompatibleEngine
19
+ OpenAICompatibleEngine o--> OpenAIResponsesCompatibleHelpers
20
+ OpenAIResponsesCompatibleHelpers o--> OpenAIResponsesHelpers
21
+
22
+ ```
package/README.md CHANGED
@@ -4,13 +4,7 @@
4
4
 
5
5
  [![NPM Version](https://img.shields.io/npm/v/@zimtsui/brainswitch?style=flat-square)](https://www.npmjs.com/package/@zimtsui/brainswitch)
6
6
 
7
- Brainswitch 是一个为 AI 工作流设计的 LLM 推理 API 适配器,支持在会话中途切换模型。
8
-
9
- ## Motivation
10
-
11
- 大多数 LLM 的[聊天模板](https://huggingface.co/docs/transformers/en/chat_templating) ChatML 原生不支持[严格函数调用](https://platform.openai.com/docs/guides/function-calling#strict-mode),在批处理 AI 工作流中难以达到生产级可靠性。如果仅使用 OpenAI 等支持严格函数调用的服务商,那么可选的模型型号会大幅受限。
12
-
13
- Brainswitch 支持在一次会话中途切换模型并保持对话上下文,包括 OpenAI、Google、Anthropic 的深度思考模型[交替思考](https://platform.claude.com/docs/en/build-with-claude/extended-thinking#interleaved-thinking)的加密思考内容,这样即可在会话的大量推理阶段使用最合适的模型生成自然语言结果,在最后的总结阶段切换成支持严格函数调用的模型进行结构化提交。
7
+ Brainswitch 是一个强类型的 LLM 推理 API 适配器。
14
8
 
15
9
  ## 支持服务商 API 类型
16
10
 
@@ -40,47 +34,14 @@ npm install @zimtsui/brainswitch
40
34
  ## 配置
41
35
 
42
36
  ```ts
43
- export type Config = {
44
- brainswitch: {
45
- endpoints: Record<string, {
46
- baseUrl: string;
47
- apiKey: string;
48
- model: string;
49
- name: string;
50
- apiType:
51
- | 'openai-responses'
52
- | 'google'
53
- | 'aliyun'
54
- | 'anthropic'
55
- ;
56
- proxy?: string;
57
- inputPrice?: number; // CNY per MToken
58
- outputPrice?: number; // CNY per MToken
59
- cachePrice?: number; // CNY per MToken
60
- rpm?: number; // Requests per minute
61
- timeout?: number; // Time limit in milliseconds
62
- maxTokens?: number; // Maximum number of generated tokens
63
- additionalOptions?: Record<string, unknown>;
64
- };
65
- };
66
- }
67
- ```
68
-
69
- ## 快速上手
70
-
71
- ```ts
72
- import { Adaptor, agentloop, RoleMessage, Function, type InferenceContext, type Config, Session } from '@zimtsui/brainswitch';
73
- import { Type } from '@sinclair/typebox';
74
- import { RWLock } from '@zimtsui/coroutine-locks';
75
- import { Channel } from '@zimtsui/typelog';
76
- import * as Presets from '@zimtsui/typelog/presets';
37
+ import { type Config } from '@zimtsui/brainswitch';
77
38
 
78
39
  // 配置推理服务商 API 接入点
79
- const config: Config = {
40
+ export const config: Config = {
80
41
  brainswitch: {
81
42
  endpoints: {
82
- 'gpt-5-mini': {
83
- name: 'GPT-5 mini',
43
+ 'gpt-5.4-mini': {
44
+ name: 'GPT-5.4 mini',
84
45
  apiType: 'openai-responses',
85
46
  baseUrl: 'https://api.openai.com/v1',
86
47
  apiKey: process.env.OPENAI_API_KEY!,
@@ -96,26 +57,63 @@ const config: Config = {
96
57
  }
97
58
  }
98
59
  }
60
+ ```
61
+
62
+ ## 对话
63
+
64
+ ```ts
65
+ import { Adaptor, RoleMessage, type Session } from '@zimtsui/brainswitch';
66
+ import { config } from './config.ts';
67
+
68
+
69
+ // 创建会话
70
+ const session: Session<never, never> = {
71
+ developerMessage: new RoleMessage.Developer([
72
+ RoleMessage.Part.Text.paragraph('You are a helpful assistant.'),
73
+ ]),
74
+ chatMessages: [
75
+ new RoleMessage.User([ RoleMessage.Part.Text.paragraph('Hello!') ]),
76
+ ],
77
+ };
78
+
79
+ // 选择推理引擎
80
+ const adaptor = Adaptor.create(config);
81
+ const engine = adaptor.makeCompatibleEngine<{}, {}>({
82
+ endpoint: 'gpt-5.4-mini',
83
+ functionDeclarationMap: {},
84
+ verbatimDeclarationMap: {},
85
+ });
86
+
87
+ const response = await engine.stateless({}, session);
88
+ console.log(response.getText());
89
+ ```
90
+
91
+ ## 智能体
92
+
93
+ ```ts
94
+ import { Adaptor, agentloop, RoleMessage, Function, type Session, Structuring } from '@zimtsui/brainswitch';
95
+ import { Type } from '@sinclair/typebox';
96
+ import { config } from './config.ts';
99
97
 
100
98
  // 声明函数工具
101
99
  const fdm = {
102
100
  get_weather: {
103
101
  description: '获取指定城市的天气',
104
- paraschema: Type.Object({
102
+ parameters: Type.Object({
105
103
  city: Type.String(),
106
104
  unit: Type.Optional(Type.Union([Type.Literal('C'), Type.Literal('F')]))
107
105
  }),
108
106
  },
109
107
  submit_result: {
110
108
  description: '提交最终结果',
111
- paraschema: Type.Object({
109
+ parameters: Type.Object({
112
110
  weather: Type.String(),
113
111
  advice: Type.String(),
114
112
  }),
115
113
  },
116
- } satisfies Function.Declaration.Map;
114
+ } satisfies Function.Decl.Map.Proto;
117
115
  type fdm = typeof fdm;
118
- type fdu = Function.Declaration.From<fdm>;
116
+ type fdu = Function.Decl.From<fdm>;
119
117
 
120
118
  // 实现函数工具
121
119
  export class Submission {
@@ -131,34 +129,84 @@ const fnm: Function.Map<fdm> = {
131
129
  },
132
130
  };
133
131
 
134
- // 初始化工作流上下文
135
- const ctx: InferenceContext = {
136
- busy: new RWLock(),
137
- cost(deltaCost) {
138
- console.log((-deltaCost).toFixed(2));
139
- },
140
- };
141
-
142
132
  // 创建会话
143
- const session: Session<fdu> = {
144
- developerMessage: RoleMessage.Developer.create([
145
- RoleMessage.Part.Text.create('你的工作是为用户查询天气,并给出穿衣建议。调用工具提交最终结果'),
133
+ const session: Session<fdu, never> = {
134
+ developerMessage: new RoleMessage.Developer([
135
+ RoleMessage.Part.Text.paragraph('你的工作是为用户查询天气,并给出穿衣建议。调用工具提交最终结果'),
146
136
  ]),
147
137
  chatMessages: [
148
- RoleMessage.User.create([ RoleMessage.Part.Text.create('请查询现在北京的天气,并给穿衣建议。') ]),
138
+ new RoleMessage.User([ RoleMessage.Part.Text.paragraph('请查询现在北京的天气,并给穿衣建议。') ]),
149
139
  ],
150
140
  };
151
141
 
152
142
  // 选择推理引擎
153
143
  const adaptor = Adaptor.create(config);
154
- const engine = adaptor.makeEngine('gpt-5-mini', fdm, Function.ToolChoice.REQUIRED);
144
+ const engine = adaptor.makeCompatibleEngine<fdm, {}>({
145
+ endpoint: 'gpt-5.4-mini',
146
+ functionDeclarationMap: fdm,
147
+ verbatimDeclarationMap: {},
148
+ structuringChoice: Structuring.Choice.FCall.REQUIRED,
149
+ });
155
150
 
156
151
  // 使用 agentloop 驱动智能体循环,最多 8 轮对话
157
152
  try {
158
- for await (const text of agentloop(ctx, session, engine, fnm, 8)) console.log(text);
153
+ for await (const text of agentloop({}, session, engine, fnm, 8)) console.log(text);
159
154
  } catch (e) {
160
155
  if (e instanceof Submission) {} else throw e;
161
156
  console.log(e.weather);
162
157
  console.log(e.advice);
163
158
  }
164
159
  ```
160
+
161
+ ### XML Verbatim 频道
162
+
163
+ When a LLM outputs structured data in JSON format, if there are too many special characters in the parameters (for example, a large Markdown document containing a lot of LaTeX math formulas), the LLM is prone to make mistakes in JSON escaping.
164
+
165
+ XML Verbatim Channel is designed to avoid escaping in structured output of large text.
166
+
167
+ ```ts
168
+ import { Adaptor, RoleMessage, type Session, Structuring, Verbatim } from '@zimtsui/brainswitch';
169
+ import Assets from '@zimtsui/brainswitch/assets';
170
+ import * as Codec from '@zimtsui/brainswitch/codec';
171
+ import { config } from './config.ts';
172
+
173
+ // 声明 XML Verbatim 频道
174
+ const vdm = {
175
+ bash: {
176
+ description: '执行 Bash 命令',
177
+ parameters: {
178
+ command: {
179
+ description: 'Bash 命令',
180
+ mimeType: 'text/plain',
181
+ },
182
+ },
183
+ },
184
+ } satisfies Verbatim.Decl.Map.Proto;
185
+ type vdm = typeof vdm;
186
+ type vdu = Verbatim.Decl.From<vdm>;
187
+
188
+
189
+ // 创建会话
190
+ const session: Session<never, vdu> = {
191
+ developerMessage: new RoleMessage.Developer([
192
+ Assets.verbatim.instruction,
193
+ RoleMessage.Part.Text.paragraph('# Available Verbatim Channels'),
194
+ RoleMessage.Part.Text.paragraph(Codec.Declarations.encode(vdm)),
195
+ ]),
196
+ chatMessages: [
197
+ new RoleMessage.User([ RoleMessage.Part.Text.paragraph('请使用 Bash 命令查询当前系统时间。') ]),
198
+ ],
199
+ };
200
+
201
+ // 选择推理引擎
202
+ const adaptor = Adaptor.create(config);
203
+ const engine = adaptor.makeCompatibleEngine<{}, vdm>({
204
+ endpoint: 'gpt-5.4-mini',
205
+ functionDeclarationMap: {},
206
+ verbatimDeclarationMap: vdm,
207
+ structuringChoice: Structuring.Choice.VRequest.ANYONE,
208
+ });
209
+
210
+ const response = await engine.stateless({}, session);
211
+ console.log(response.getOnlyVerbatimRequest().args.command);
212
+ ```
@@ -0,0 +1,11 @@
1
+ {{#each declarations}}
2
+ <verbatim:declaration name="{{this.name}}">
3
+ <verbatim:description>{{this.description}}</verbatim:description>
4
+ {{#each this.parameters}}
5
+ <verbatim:parameter name="{{this.name}}">
6
+ <verbatim:description>{{this.description}}</verbatim:description>
7
+ <verbatim:mime-type>{{this.mimeType}}</verbatim:mime-type>
8
+ </verbatim:parameter>
9
+ {{/each}}
10
+ </verbatim:declaration>
11
+ {{/each}}
@@ -0,0 +1,49 @@
1
+ # XML Verbatim Channel
2
+
3
+ ## Motivation
4
+
5
+ When a LLM outputs structured data in JSON format, if there are too many special characters in the parameters (for example, a large Markdown document containing a lot of LaTeX math formulas), the LLM is prone to make mistakes in JSON escaping.
6
+
7
+ XML Verbatim Channel is designed to avoid escaping in structured output of large text.
8
+
9
+ ## Declaration
10
+
11
+ The system or the user will declare all available XML Verbatim Channels in the form of
12
+
13
+ <verbatim:declaration name="CHANNEL_1_NAME">
14
+ <verbatim:description>DESCRIPTION_OF_CHANNEL_1</verbatim:description>
15
+ <verbatim:parameter name="PARAMETER_1_NAME">
16
+ <verbatim:description>DESCRIPTION_OF_PARAMETER_1</verbatim:description>
17
+ <verbatim:mime-type>VALUE_MIME_TYPE_OF_PARAMETER_1</verbatim:mime-type>
18
+ </verbatim:parameter>
19
+ <verbatim:parameter name="PARAMETER_2_NAME">
20
+ <verbatim:description>DESCRIPTION_OF_PARAMETER_2</verbatim:description>
21
+ <verbatim:mime-type>VALUE_MIME_TYPE_OF_PARAMETER_2</verbatim:mime-type>
22
+ </verbatim:parameter>
23
+ </verbatim:declaration>
24
+
25
+ ## Request
26
+
27
+ You can make a request through the channel CHANNEL_1_NAME in the form of
28
+
29
+ <verbatim:request name="CHANNEL_1_NAME">
30
+ <verbatim:argument name="PARAMETER_1_NAME"><![CDATA[PARAMETER_1_VALUE]]></verbatim:argument>
31
+ <verbatim:argument name="PARAMETER_2_NAME"><![CDATA[PARAMETER_2_VALUE]]></verbatim:argument>
32
+ </verbatim:request>
33
+
34
+ - All parameters are required
35
+ - All arguments must be wrapped in CDATA
36
+
37
+ # Available XML Verbatim Channels
38
+
39
+ <verbatim:declaration name="submit">
40
+ <verbatim:description>提交文章</verbatim:description>
41
+ <verbatim:parameter name="title">
42
+ <verbatim:description>文章标题</verbatim:description>
43
+ <verbatim:mime-type>text/plain</verbatim:mime-type>
44
+ </verbatim:parameter>
45
+ <verbatim:parameter name="body">
46
+ <verbatim:description>文章内容</verbatim:description>
47
+ <verbatim:mime-type>text/markdown;dialect=gfm+tex_math_dollars</verbatim:mime-type>
48
+ </verbatim:parameter>
49
+ </verbatim:declaration>
@@ -1,14 +1,45 @@
1
- import { Config } from '#config';
1
+ import { Config } from './config.ts';
2
2
  import { Function } from './function.ts';
3
3
  import { type CompatibleEngine } from './compatible-engine.ts';
4
- import { OpenAIResponsesNativeEngine } from './native-engines.d/openai-responses/engine.ts';
5
- import { GoogleNativeEngine } from './native-engines.d/google/engine.ts';
4
+ import { Throttle } from './throttle.ts';
5
+ import { OpenAIResponsesNativeEngine } from './native-engines.d/openai-responses.ts';
6
+ import { GoogleNativeEngine } from './native-engines.d/google.ts';
7
+ import type { Verbatim } from './verbatim.ts';
8
+ import type { Structuring } from './compatible-engine/structuring.ts';
9
+ import type { Structuring as OpenAIResponsesNativeStructuring } from './native-engines.d/openai-responses/structuring.ts';
6
10
  export declare class Adaptor {
7
11
  config: Config;
8
12
  static create(config: Config): Adaptor;
9
- private throttles;
13
+ protected throttles: Map<string, Throttle>;
10
14
  protected constructor(config: Config);
11
- makeEngine<fdm extends Function.Declaration.Map>(endpoint: string, functionDeclarationMap: fdm, toolChoice?: Function.ToolChoice<fdm>, parallelToolCall?: boolean): CompatibleEngine<fdm>;
12
- makeOpenAIResponsesNativeEngine<fdm extends Function.Declaration.Map>(endpoint: string, functionDeclarationMap: fdm, applyPatch?: boolean, toolChoice?: Function.ToolChoice<fdm>, parallelToolCall?: boolean): OpenAIResponsesNativeEngine<fdm>;
13
- makeGoogleNativeEngine<fdm extends Function.Declaration.Map>(endpoint: string, functionDeclarationMap: fdm, toolChoice?: Function.ToolChoice<fdm>, codeExecution?: boolean, urlContext?: boolean, googleSearch?: boolean, parallelToolCall?: boolean): GoogleNativeEngine<fdm>;
15
+ makeCompatibleEngine<fdm extends Function.Decl.Map.Proto, vdm extends Verbatim.Decl.Map.Proto>(adaptorOptions: Adaptor.CompatibleEngine.Options<fdm, vdm>): CompatibleEngine<fdm, vdm>;
16
+ makeOpenAIResponsesNativeEngine<fdm extends Function.Decl.Map.Proto, vdm extends Verbatim.Decl.Map.Proto>(adaptorOptions: Adaptor.OpenAIResponsesNativeEngineOptions<fdm, vdm>): OpenAIResponsesNativeEngine<fdm, vdm>;
17
+ makeGoogleNativeEngine<fdm extends Function.Decl.Map.Proto, vdm extends Verbatim.Decl.Map.Proto>(adaptorOptions: Adaptor.GoogleNativeEngineOptions<fdm, vdm>): GoogleNativeEngine<fdm, vdm>;
18
+ }
19
+ export declare namespace Adaptor {
20
+ namespace CompatibleEngine {
21
+ interface Options<in out fdm extends Function.Decl.Map.Proto, in out vdm extends Verbatim.Decl.Map.Proto> {
22
+ endpoint: string;
23
+ functionDeclarationMap: fdm;
24
+ verbatimDeclarationMap: vdm;
25
+ structuringChoice?: Structuring.Choice.From<fdm, vdm>;
26
+ }
27
+ }
28
+ interface OpenAIResponsesNativeEngineOptions<in out fdm extends Function.Decl.Map.Proto, in out vdm extends Verbatim.Decl.Map.Proto> {
29
+ endpoint: string;
30
+ functionDeclarationMap: fdm;
31
+ verbatimDeclarationMap: vdm;
32
+ applyPatch?: boolean;
33
+ structuringChoice?: OpenAIResponsesNativeStructuring.Choice.From<fdm, vdm>;
34
+ }
35
+ interface GoogleNativeEngineOptions<in out fdm extends Function.Decl.Map.Proto, in out vdm extends Verbatim.Decl.Map.Proto> {
36
+ endpoint: string;
37
+ functionDeclarationMap: fdm;
38
+ verbatimDeclarationMap: vdm;
39
+ structuringChoice?: Structuring.Choice.From<fdm, vdm>;
40
+ codeExecution?: boolean;
41
+ urlContext?: boolean;
42
+ googleSearch?: boolean;
43
+ parallelToolCall?: boolean;
44
+ }
14
45
  }
package/build/adaptor.js CHANGED
@@ -1,13 +1,10 @@
1
- import { Config } from '#config';
2
- import { Function } from "./function.js";
3
- import {} from "./compatible-engine.js";
4
1
  import { Throttle } from "./throttle.js";
5
- import { GoogleCompatibleEngine } from "./compatible-engines.d/google.js";
6
- import { AliyunEngine } from "./compatible-engines.d/aliyun.js";
7
- import { OpenAIResponsesCompatibleEngine } from "./compatible-engines.d/openai-responses.js";
8
- import { AnthropicCompatibleEngine } from "./compatible-engines.d/anthropic.js";
9
- import { OpenAIResponsesNativeEngine } from "./native-engines.d/openai-responses/engine.js";
10
- import { GoogleNativeEngine } from "./native-engines.d/google/engine.js";
2
+ import { GoogleCompatibleEngine } from "./compatible-engine.d/google.js";
3
+ import { OpenAIResponsesCompatibleEngine } from "./compatible-engine.d/openai-responses.js";
4
+ import { AnthropicCompatibleEngine } from "./compatible-engine.d/anthropic.js";
5
+ import { AliyunCompatibleEngine } from "./compatible-engine.d/aliyun.js";
6
+ import { OpenAIResponsesNativeEngine } from "./native-engines.d/openai-responses.js";
7
+ import { GoogleNativeEngine } from "./native-engines.d/google.js";
11
8
  export class Adaptor {
12
9
  config;
13
10
  static create(config) {
@@ -21,72 +18,73 @@ export class Adaptor {
21
18
  this.throttles.set(endpointId, new Throttle(rpm));
22
19
  }
23
20
  }
24
- makeEngine(endpoint, functionDeclarationMap, toolChoice, parallelToolCall) {
25
- const endpointSpec = this.config.brainswitch.endpoints[endpoint];
21
+ makeCompatibleEngine(adaptorOptions) {
22
+ const endpointSpec = this.config.brainswitch.endpoints[adaptorOptions.endpoint];
26
23
  if (endpointSpec) { }
27
24
  else
28
25
  throw new Error();
29
- const throttle = this.throttles.get(endpoint);
26
+ const throttle = this.throttles.get(adaptorOptions.endpoint);
30
27
  if (throttle) { }
31
28
  else
32
29
  throw new Error();
33
30
  const options = {
34
31
  ...endpointSpec,
35
- functionDeclarationMap,
36
- toolChoice,
37
- parallelToolCall,
32
+ functionDeclarationMap: adaptorOptions.functionDeclarationMap,
33
+ verbatimDeclarationMap: adaptorOptions.verbatimDeclarationMap,
34
+ structuringChoice: adaptorOptions.structuringChoice,
38
35
  throttle,
39
36
  };
40
37
  if (endpointSpec.apiType === 'openai-responses')
41
- return OpenAIResponsesCompatibleEngine.create(options);
38
+ return new OpenAIResponsesCompatibleEngine.Instance(options);
42
39
  else if (endpointSpec.apiType === 'google')
43
- return GoogleCompatibleEngine.create(options);
40
+ return new GoogleCompatibleEngine.Instance(options);
44
41
  else if (endpointSpec.apiType === 'aliyun')
45
- return AliyunEngine.create(options);
42
+ return new AliyunCompatibleEngine.Instance(options);
46
43
  else if (endpointSpec.apiType === 'anthropic')
47
- return AnthropicCompatibleEngine.create(options);
44
+ return new AnthropicCompatibleEngine.Instance(options);
48
45
  else
49
46
  throw new Error();
50
47
  }
51
- makeOpenAIResponsesNativeEngine(endpoint, functionDeclarationMap, applyPatch, toolChoice, parallelToolCall) {
52
- const endpointSpec = this.config.brainswitch.endpoints[endpoint];
48
+ makeOpenAIResponsesNativeEngine(adaptorOptions) {
49
+ const endpointSpec = this.config.brainswitch.endpoints[adaptorOptions.endpoint];
53
50
  if (endpointSpec?.apiType === 'openai-responses') { }
54
51
  else
55
52
  throw new Error();
56
- const throttle = this.throttles.get(endpoint);
53
+ const throttle = this.throttles.get(adaptorOptions.endpoint);
57
54
  if (throttle) { }
58
55
  else
59
56
  throw new Error();
60
57
  const options = {
61
58
  ...endpointSpec,
62
- functionDeclarationMap,
63
- toolChoice,
64
- parallelToolCall,
59
+ functionDeclarationMap: adaptorOptions.functionDeclarationMap,
60
+ verbatimDeclarationMap: adaptorOptions.verbatimDeclarationMap,
61
+ structuringChoice: adaptorOptions.structuringChoice,
65
62
  throttle,
66
- applyPatch,
63
+ applyPatch: adaptorOptions.applyPatch,
67
64
  };
68
- return OpenAIResponsesNativeEngine.create(options);
65
+ return new OpenAIResponsesNativeEngine.Instance(options);
69
66
  }
70
- makeGoogleNativeEngine(endpoint, functionDeclarationMap, toolChoice, codeExecution, urlContext, googleSearch, parallelToolCall) {
71
- const endpointSpec = this.config.brainswitch.endpoints[endpoint];
67
+ makeGoogleNativeEngine(adaptorOptions) {
68
+ const endpointSpec = this.config.brainswitch.endpoints[adaptorOptions.endpoint];
72
69
  if (endpointSpec?.apiType === 'google') { }
73
70
  else
74
71
  throw new Error();
75
- const throttle = this.throttles.get(endpoint);
72
+ const throttle = this.throttles.get(adaptorOptions.endpoint);
76
73
  if (throttle) { }
77
74
  else
78
75
  throw new Error();
79
76
  const options = {
80
77
  ...endpointSpec,
81
- functionDeclarationMap,
82
- toolChoice,
83
- parallelToolCall,
78
+ functionDeclarationMap: adaptorOptions.functionDeclarationMap,
79
+ verbatimDeclarationMap: adaptorOptions.verbatimDeclarationMap,
80
+ structuringChoice: adaptorOptions.structuringChoice,
81
+ parallelToolCall: adaptorOptions.parallelToolCall,
84
82
  throttle,
85
- codeExecution,
86
- urlContext,
87
- googleSearch,
83
+ codeExecution: adaptorOptions.codeExecution,
84
+ urlContext: adaptorOptions.urlContext,
85
+ googleSearch: adaptorOptions.googleSearch,
88
86
  };
89
- return GoogleNativeEngine.create(options);
87
+ return new GoogleNativeEngine.Instance(options);
90
88
  }
91
89
  }
92
90
  //# sourceMappingURL=adaptor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"adaptor.js","sourceRoot":"","sources":["../src/adaptor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adaptor.js","sourceRoot":"","sources":["../src/adaptor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Pricing } from '../../engine.ts';
2
+ import Anthropic from '@anthropic-ai/sdk';
3
+ export declare class Billing {
4
+ protected ctx: Billing.Context;
5
+ constructor(ctx: Billing.Context);
6
+ charge(usage: Anthropic.Usage): number;
7
+ }
8
+ export declare namespace Billing {
9
+ interface Context {
10
+ pricing: Pricing;
11
+ }
12
+ }
@@ -0,0 +1,14 @@
1
+ export class Billing {
2
+ ctx;
3
+ constructor(ctx) {
4
+ this.ctx = ctx;
5
+ }
6
+ charge(usage) {
7
+ const cacheHitTokenCount = usage.cache_read_input_tokens || 0;
8
+ const cacheMissTokenCount = usage.input_tokens - cacheHitTokenCount;
9
+ return (this.ctx.pricing.inputPrice * cacheMissTokenCount / 1e6 +
10
+ this.ctx.pricing.cachePrice * cacheHitTokenCount / 1e6 +
11
+ this.ctx.pricing.outputPrice * usage.output_tokens / 1e6);
12
+ }
13
+ }
14
+ //# sourceMappingURL=billing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing.js","sourceRoot":"","sources":["../../../src/api-types/anthropic/billing.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,OAAO;IACa;IAA7B,YAA6B,GAAoB;QAApB,QAAG,GAAH,GAAG,CAAiB;IAAG,CAAC;IAE9C,MAAM,CAAC,KAAsB;QAChC,MAAM,kBAAkB,GAAG,KAAK,CAAC,uBAAuB,IAAI,CAAC,CAAC;QAC9D,MAAM,mBAAmB,GAAG,KAAK,CAAC,YAAY,GAAG,kBAAkB,CAAC;QACpE,OAAO,CACH,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,GAAG,mBAAmB,GAAG,GAAG;YACvD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,GAAG,kBAAkB,GAAG,GAAG;YACtD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC,aAAa,GAAG,GAAG,CAC3D,CAAC;IACN,CAAC;CACJ"}
@@ -0,0 +1,16 @@
1
+ import { Function } from '../../function.ts';
2
+ import Anthropic from '@anthropic-ai/sdk';
3
+ export declare class ToolCodec<in out fdm extends Function.Decl.Map.Proto> {
4
+ protected ctx: ToolCodec.Context<fdm>;
5
+ constructor(ctx: ToolCodec.Context<fdm>);
6
+ encodeFunctionCall(fc: Function.Call.From<fdm>): Anthropic.ToolUseBlock;
7
+ decodeFunctionCall(apifc: Anthropic.ToolUseBlock): Function.Call.From<fdm>;
8
+ encodeFunctionResponse(fr: Function.Response.From<fdm>): Anthropic.ToolResultBlockParam;
9
+ protected encodeFunctionDeclarationEntry(fdentry: Function.Decl.Entry.From<fdm>): Anthropic.Tool;
10
+ encodeFunctionDeclarationMap(fdm: fdm): Anthropic.Tool[];
11
+ }
12
+ export declare namespace ToolCodec {
13
+ interface Context<in out fdm extends Function.Decl.Map.Proto> {
14
+ fdm: fdm;
15
+ }
16
+ }
@@ -0,0 +1,58 @@
1
+ import { Function } from "../../function.js";
2
+ import { ResponseInvalid } from "../../engine.js";
3
+ import Ajv from 'ajv';
4
+ const ajv = new Ajv();
5
+ export class ToolCodec {
6
+ ctx;
7
+ constructor(ctx) {
8
+ this.ctx = ctx;
9
+ }
10
+ encodeFunctionCall(fc) {
11
+ throw new Error('Anthropic compatible engine requires native function calls.');
12
+ }
13
+ decodeFunctionCall(apifc) {
14
+ const fditem = this.ctx.fdm[apifc.name];
15
+ if (fditem) { }
16
+ else
17
+ throw new ResponseInvalid('Unknown function call', { cause: apifc });
18
+ if (ajv.validate(fditem.parameters, apifc.input)) { }
19
+ else
20
+ throw new ResponseInvalid('Function call not conforming to schema', { cause: apifc });
21
+ return Function.Call.of({
22
+ id: apifc.id,
23
+ name: apifc.name,
24
+ args: apifc.input,
25
+ });
26
+ }
27
+ encodeFunctionResponse(fr) {
28
+ if (fr.id) { }
29
+ else
30
+ throw new Error();
31
+ if (fr instanceof Function.Response.Successful)
32
+ return {
33
+ type: 'tool_result',
34
+ tool_use_id: fr.id,
35
+ content: fr.text,
36
+ };
37
+ else if (fr instanceof Function.Response.Failed)
38
+ return {
39
+ type: 'tool_result',
40
+ tool_use_id: fr.id,
41
+ content: fr.error,
42
+ };
43
+ else
44
+ throw new Error();
45
+ }
46
+ encodeFunctionDeclarationEntry(fdentry) {
47
+ return {
48
+ name: fdentry[0],
49
+ description: fdentry[1].description,
50
+ input_schema: fdentry[1].parameters,
51
+ };
52
+ }
53
+ encodeFunctionDeclarationMap(fdm) {
54
+ const fdentries = Object.entries(fdm);
55
+ return fdentries.map(fdentry => this.encodeFunctionDeclarationEntry(fdentry));
56
+ }
57
+ }
58
+ //# sourceMappingURL=tool-codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-codec.js","sourceRoot":"","sources":["../../../src/api-types/anthropic/tool-codec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,GAAG,MAAM,KAAK,CAAC;AAGtB,MAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;AAGtB,MAAM,OAAO,SAAS;IACW;IAA7B,YAA6B,GAA2B;QAA3B,QAAG,GAAH,GAAG,CAAwB;IAAG,CAAC;IAErD,kBAAkB,CACrB,EAA2B;QAE3B,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACnF,CAAC;IAEM,kBAAkB,CACrB,KAA6B;QAE7B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,MAAM,EAAE,CAAC,CAAA,CAAC;;YAAM,MAAM,IAAI,eAAe,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACzF,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA,CAAC;;YAC/C,MAAM,IAAI,eAAe,CAAC,wCAAwC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3F,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,KAAK;SACe,CAAC,CAAC;IAC1C,CAAC;IAEM,sBAAsB,CACzB,EAA+B;QAE/B,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA,CAAC;;YAAM,MAAM,IAAI,KAAK,EAAE,CAAC;QACrC,IAAI,EAAE,YAAY,QAAQ,CAAC,QAAQ,CAAC,UAAU;YAC1C,OAAO;gBACH,IAAI,EAAE,aAAa;gBACnB,WAAW,EAAE,EAAE,CAAC,EAAE;gBAClB,OAAO,EAAE,EAAE,CAAC,IAAI;aACnB,CAAC;aACD,IAAI,EAAE,YAAY,QAAQ,CAAC,QAAQ,CAAC,MAAM;YAC3C,OAAO;gBACH,IAAI,EAAE,aAAa;gBACnB,WAAW,EAAE,EAAE,CAAC,EAAE;gBAClB,OAAO,EAAE,EAAE,CAAC,KAAK;aACpB,CAAC;;YACD,MAAM,IAAI,KAAK,EAAE,CAAC;IAC3B,CAAC;IAES,8BAA8B,CACpC,OAAsC;QAEtC,OAAO;YACH,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YAChB,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW;YACnC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,UAAqB;SACjD,CAAC;IACN,CAAC;IAEM,4BAA4B,CAC/B,GAAQ;QAER,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAoC,CAAC;QAEzE,OAAO,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,8BAA8B,CAAC,OAAO,CAAC,CAAC,CAAC;IAClF,CAAC;CAEJ"}
@@ -0,0 +1,12 @@
1
+ import * as Google from '@google/genai';
2
+ import type { Pricing } from '../../engine.ts';
3
+ export declare class Billing {
4
+ protected ctx: Billing.Context;
5
+ constructor(ctx: Billing.Context);
6
+ charge(usageMetadata: Google.GenerateContentResponseUsageMetadata): number;
7
+ }
8
+ export declare namespace Billing {
9
+ interface Context {
10
+ pricing: Pricing;
11
+ }
12
+ }