@clinebot/llms 0.0.20 → 0.0.22

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 (319) hide show
  1. package/dist/config-browser.d.ts +1 -0
  2. package/dist/config-browser.d.ts.map +1 -0
  3. package/dist/config.d.ts +1 -0
  4. package/dist/config.d.ts.map +1 -0
  5. package/dist/index.browser.d.ts +1 -0
  6. package/dist/index.browser.d.ts.map +1 -0
  7. package/dist/index.browser.js +5 -5
  8. package/dist/index.d.ts +1 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +12 -12
  11. package/dist/models/generated-access.d.ts +1 -0
  12. package/dist/models/generated-access.d.ts.map +1 -0
  13. package/dist/models/generated-provider-loaders.d.ts +1 -0
  14. package/dist/models/generated-provider-loaders.d.ts.map +1 -0
  15. package/dist/models/generated.d.ts +1 -0
  16. package/dist/models/generated.d.ts.map +1 -0
  17. package/dist/models/index.d.ts +1 -0
  18. package/dist/models/index.d.ts.map +1 -0
  19. package/dist/models/models-dev-catalog.d.ts +1 -0
  20. package/dist/models/models-dev-catalog.d.ts.map +1 -0
  21. package/dist/models/providers/aihubmix.d.ts +1 -0
  22. package/dist/models/providers/aihubmix.d.ts.map +1 -0
  23. package/dist/models/providers/anthropic.d.ts +1 -0
  24. package/dist/models/providers/anthropic.d.ts.map +1 -0
  25. package/dist/models/providers/asksage.d.ts +1 -0
  26. package/dist/models/providers/asksage.d.ts.map +1 -0
  27. package/dist/models/providers/baseten.d.ts +1 -0
  28. package/dist/models/providers/baseten.d.ts.map +1 -0
  29. package/dist/models/providers/bedrock.d.ts +1 -0
  30. package/dist/models/providers/bedrock.d.ts.map +1 -0
  31. package/dist/models/providers/cerebras.d.ts +1 -0
  32. package/dist/models/providers/cerebras.d.ts.map +1 -0
  33. package/dist/models/providers/claude-code.d.ts +1 -0
  34. package/dist/models/providers/claude-code.d.ts.map +1 -0
  35. package/dist/models/providers/cline.d.ts +1 -0
  36. package/dist/models/providers/cline.d.ts.map +1 -0
  37. package/dist/models/providers/deepseek.d.ts +1 -0
  38. package/dist/models/providers/deepseek.d.ts.map +1 -0
  39. package/dist/models/providers/dify.d.ts +1 -0
  40. package/dist/models/providers/dify.d.ts.map +1 -0
  41. package/dist/models/providers/doubao.d.ts +1 -0
  42. package/dist/models/providers/doubao.d.ts.map +1 -0
  43. package/dist/models/providers/fireworks.d.ts +1 -0
  44. package/dist/models/providers/fireworks.d.ts.map +1 -0
  45. package/dist/models/providers/gemini.d.ts +1 -0
  46. package/dist/models/providers/gemini.d.ts.map +1 -0
  47. package/dist/models/providers/groq.d.ts +1 -0
  48. package/dist/models/providers/groq.d.ts.map +1 -0
  49. package/dist/models/providers/hicap.d.ts +1 -0
  50. package/dist/models/providers/hicap.d.ts.map +1 -0
  51. package/dist/models/providers/huawei-cloud-maas.d.ts +1 -0
  52. package/dist/models/providers/huawei-cloud-maas.d.ts.map +1 -0
  53. package/dist/models/providers/huggingface.d.ts +1 -0
  54. package/dist/models/providers/huggingface.d.ts.map +1 -0
  55. package/dist/models/providers/index.d.ts +1 -0
  56. package/dist/models/providers/index.d.ts.map +1 -0
  57. package/dist/models/providers/litellm.d.ts +1 -0
  58. package/dist/models/providers/litellm.d.ts.map +1 -0
  59. package/dist/models/providers/lmstudio.d.ts +1 -0
  60. package/dist/models/providers/lmstudio.d.ts.map +1 -0
  61. package/dist/models/providers/minimax.d.ts +1 -0
  62. package/dist/models/providers/minimax.d.ts.map +1 -0
  63. package/dist/models/providers/mistral.d.ts +1 -0
  64. package/dist/models/providers/mistral.d.ts.map +1 -0
  65. package/dist/models/providers/moonshot.d.ts +1 -0
  66. package/dist/models/providers/moonshot.d.ts.map +1 -0
  67. package/dist/models/providers/nebius.d.ts +1 -0
  68. package/dist/models/providers/nebius.d.ts.map +1 -0
  69. package/dist/models/providers/nous-research.d.ts +1 -0
  70. package/dist/models/providers/nous-research.d.ts.map +1 -0
  71. package/dist/models/providers/oca.d.ts +1 -0
  72. package/dist/models/providers/oca.d.ts.map +1 -0
  73. package/dist/models/providers/ollama.d.ts +1 -0
  74. package/dist/models/providers/ollama.d.ts.map +1 -0
  75. package/dist/models/providers/openai-codex.d.ts +1 -0
  76. package/dist/models/providers/openai-codex.d.ts.map +1 -0
  77. package/dist/models/providers/openai.d.ts +1 -0
  78. package/dist/models/providers/openai.d.ts.map +1 -0
  79. package/dist/models/providers/opencode.d.ts +1 -0
  80. package/dist/models/providers/opencode.d.ts.map +1 -0
  81. package/dist/models/providers/openrouter.d.ts +1 -0
  82. package/dist/models/providers/openrouter.d.ts.map +1 -0
  83. package/dist/models/providers/qwen-code.d.ts +1 -0
  84. package/dist/models/providers/qwen-code.d.ts.map +1 -0
  85. package/dist/models/providers/qwen.d.ts +1 -0
  86. package/dist/models/providers/qwen.d.ts.map +1 -0
  87. package/dist/models/providers/requesty.d.ts +1 -0
  88. package/dist/models/providers/requesty.d.ts.map +1 -0
  89. package/dist/models/providers/sambanova.d.ts +1 -0
  90. package/dist/models/providers/sambanova.d.ts.map +1 -0
  91. package/dist/models/providers/sapaicore.d.ts +1 -0
  92. package/dist/models/providers/sapaicore.d.ts.map +1 -0
  93. package/dist/models/providers/together.d.ts +1 -0
  94. package/dist/models/providers/together.d.ts.map +1 -0
  95. package/dist/models/providers/vercel-ai-gateway.d.ts +1 -0
  96. package/dist/models/providers/vercel-ai-gateway.d.ts.map +1 -0
  97. package/dist/models/providers/vertex.d.ts +1 -0
  98. package/dist/models/providers/vertex.d.ts.map +1 -0
  99. package/dist/models/providers/xai.d.ts +1 -0
  100. package/dist/models/providers/xai.d.ts.map +1 -0
  101. package/dist/models/providers/zai.d.ts +1 -0
  102. package/dist/models/providers/zai.d.ts.map +1 -0
  103. package/dist/models/query.d.ts +1 -0
  104. package/dist/models/query.d.ts.map +1 -0
  105. package/dist/models/registry.d.ts +1 -0
  106. package/dist/models/registry.d.ts.map +1 -0
  107. package/dist/models/schemas/index.d.ts +1 -0
  108. package/dist/models/schemas/index.d.ts.map +1 -0
  109. package/dist/models/schemas/model.d.ts +1 -0
  110. package/dist/models/schemas/model.d.ts.map +1 -0
  111. package/dist/models/schemas/query.d.ts +1 -0
  112. package/dist/models/schemas/query.d.ts.map +1 -0
  113. package/dist/providers/handlers/ai-sdk-community.d.ts +1 -0
  114. package/dist/providers/handlers/ai-sdk-community.d.ts.map +1 -0
  115. package/dist/providers/handlers/ai-sdk-provider-base.d.ts +1 -0
  116. package/dist/providers/handlers/ai-sdk-provider-base.d.ts.map +1 -0
  117. package/dist/providers/handlers/anthropic-base.d.ts +1 -0
  118. package/dist/providers/handlers/anthropic-base.d.ts.map +1 -0
  119. package/dist/providers/handlers/asksage.d.ts +1 -0
  120. package/dist/providers/handlers/asksage.d.ts.map +1 -0
  121. package/dist/providers/handlers/auth.d.ts +1 -0
  122. package/dist/providers/handlers/auth.d.ts.map +1 -0
  123. package/dist/providers/handlers/base.d.ts +1 -0
  124. package/dist/providers/handlers/base.d.ts.map +1 -0
  125. package/dist/providers/handlers/bedrock-base.d.ts +1 -0
  126. package/dist/providers/handlers/bedrock-base.d.ts.map +1 -0
  127. package/dist/providers/handlers/bedrock-client.d.ts +1 -0
  128. package/dist/providers/handlers/bedrock-client.d.ts.map +1 -0
  129. package/dist/providers/handlers/community-sdk.d.ts +1 -0
  130. package/dist/providers/handlers/community-sdk.d.ts.map +1 -0
  131. package/dist/providers/handlers/fetch-base.d.ts +1 -0
  132. package/dist/providers/handlers/fetch-base.d.ts.map +1 -0
  133. package/dist/providers/handlers/gemini-base.d.ts +1 -0
  134. package/dist/providers/handlers/gemini-base.d.ts.map +1 -0
  135. package/dist/providers/handlers/index.d.ts +1 -0
  136. package/dist/providers/handlers/index.d.ts.map +1 -0
  137. package/dist/providers/handlers/openai-base.d.ts +1 -0
  138. package/dist/providers/handlers/openai-base.d.ts.map +1 -0
  139. package/dist/providers/handlers/openai-responses.d.ts +1 -0
  140. package/dist/providers/handlers/openai-responses.d.ts.map +1 -0
  141. package/dist/providers/handlers/providers.d.ts +1 -0
  142. package/dist/providers/handlers/providers.d.ts.map +1 -0
  143. package/dist/providers/handlers/r1-base.d.ts +1 -0
  144. package/dist/providers/handlers/r1-base.d.ts.map +1 -0
  145. package/dist/providers/handlers/registry.d.ts +1 -0
  146. package/dist/providers/handlers/registry.d.ts.map +1 -0
  147. package/dist/providers/handlers/vertex.d.ts +1 -0
  148. package/dist/providers/handlers/vertex.d.ts.map +1 -0
  149. package/dist/providers/index.d.ts +1 -0
  150. package/dist/providers/index.d.ts.map +1 -0
  151. package/dist/providers/public.browser.d.ts +1 -0
  152. package/dist/providers/public.browser.d.ts.map +1 -0
  153. package/dist/providers/public.d.ts +1 -0
  154. package/dist/providers/public.d.ts.map +1 -0
  155. package/dist/providers/shared/openai-compatible.d.ts +1 -0
  156. package/dist/providers/shared/openai-compatible.d.ts.map +1 -0
  157. package/dist/providers/transform/ai-sdk-community-format.d.ts +1 -0
  158. package/dist/providers/transform/ai-sdk-community-format.d.ts.map +1 -0
  159. package/dist/providers/transform/anthropic-format.d.ts +1 -0
  160. package/dist/providers/transform/anthropic-format.d.ts.map +1 -0
  161. package/dist/providers/transform/content-format.d.ts +1 -0
  162. package/dist/providers/transform/content-format.d.ts.map +1 -0
  163. package/dist/providers/transform/gemini-format.d.ts +1 -0
  164. package/dist/providers/transform/gemini-format.d.ts.map +1 -0
  165. package/dist/providers/transform/index.d.ts +1 -0
  166. package/dist/providers/transform/index.d.ts.map +1 -0
  167. package/dist/providers/transform/openai-format.d.ts +1 -0
  168. package/dist/providers/transform/openai-format.d.ts.map +1 -0
  169. package/dist/providers/transform/r1-format.d.ts +1 -0
  170. package/dist/providers/transform/r1-format.d.ts.map +1 -0
  171. package/dist/providers/types/config.d.ts +1 -0
  172. package/dist/providers/types/config.d.ts.map +1 -0
  173. package/dist/providers/types/handler.d.ts +1 -0
  174. package/dist/providers/types/handler.d.ts.map +1 -0
  175. package/dist/providers/types/index.d.ts +1 -0
  176. package/dist/providers/types/index.d.ts.map +1 -0
  177. package/dist/providers/types/messages.d.ts +1 -0
  178. package/dist/providers/types/messages.d.ts.map +1 -0
  179. package/dist/providers/types/model-info.d.ts +1 -0
  180. package/dist/providers/types/model-info.d.ts.map +1 -0
  181. package/dist/providers/types/provider-ids.d.ts +1 -1
  182. package/dist/providers/types/provider-ids.d.ts.map +1 -0
  183. package/dist/providers/types/settings.d.ts +1 -0
  184. package/dist/providers/types/settings.d.ts.map +1 -0
  185. package/dist/providers/types/stream.d.ts +1 -0
  186. package/dist/providers/types/stream.d.ts.map +1 -0
  187. package/dist/providers/utils/index.d.ts +1 -0
  188. package/dist/providers/utils/index.d.ts.map +1 -0
  189. package/dist/providers/utils/retry.d.ts +1 -0
  190. package/dist/providers/utils/retry.d.ts.map +1 -0
  191. package/dist/providers/utils/stream-processor.d.ts +1 -0
  192. package/dist/providers/utils/stream-processor.d.ts.map +1 -0
  193. package/dist/providers/utils/tool-processor.d.ts +1 -0
  194. package/dist/providers/utils/tool-processor.d.ts.map +1 -0
  195. package/dist/sdk.d.ts +1 -0
  196. package/dist/sdk.d.ts.map +1 -0
  197. package/dist/types.d.ts +1 -0
  198. package/dist/types.d.ts.map +1 -0
  199. package/package.json +3 -4
  200. package/src/catalog.ts +0 -20
  201. package/src/config-browser.ts +0 -11
  202. package/src/config.ts +0 -49
  203. package/src/index.browser.ts +0 -9
  204. package/src/index.ts +0 -10
  205. package/src/live-providers.test.ts +0 -138
  206. package/src/models/generated-access.ts +0 -41
  207. package/src/models/generated-provider-loaders.ts +0 -166
  208. package/src/models/generated.ts +0 -11785
  209. package/src/models/index.ts +0 -271
  210. package/src/models/models-dev-catalog.test.ts +0 -161
  211. package/src/models/models-dev-catalog.ts +0 -168
  212. package/src/models/providers/aihubmix.ts +0 -19
  213. package/src/models/providers/anthropic.ts +0 -60
  214. package/src/models/providers/asksage.ts +0 -19
  215. package/src/models/providers/baseten.ts +0 -21
  216. package/src/models/providers/bedrock.ts +0 -30
  217. package/src/models/providers/cerebras.ts +0 -24
  218. package/src/models/providers/claude-code.ts +0 -51
  219. package/src/models/providers/cline.ts +0 -25
  220. package/src/models/providers/deepseek.ts +0 -33
  221. package/src/models/providers/dify.ts +0 -17
  222. package/src/models/providers/doubao.ts +0 -33
  223. package/src/models/providers/fireworks.ts +0 -34
  224. package/src/models/providers/gemini.ts +0 -43
  225. package/src/models/providers/groq.ts +0 -33
  226. package/src/models/providers/hicap.ts +0 -18
  227. package/src/models/providers/huawei-cloud-maas.ts +0 -18
  228. package/src/models/providers/huggingface.ts +0 -22
  229. package/src/models/providers/index.ts +0 -162
  230. package/src/models/providers/litellm.ts +0 -19
  231. package/src/models/providers/lmstudio.ts +0 -22
  232. package/src/models/providers/minimax.ts +0 -34
  233. package/src/models/providers/mistral.ts +0 -19
  234. package/src/models/providers/moonshot.ts +0 -34
  235. package/src/models/providers/nebius.ts +0 -24
  236. package/src/models/providers/nous-research.ts +0 -21
  237. package/src/models/providers/oca.ts +0 -30
  238. package/src/models/providers/ollama.ts +0 -18
  239. package/src/models/providers/openai-codex.ts +0 -46
  240. package/src/models/providers/openai.ts +0 -43
  241. package/src/models/providers/opencode.ts +0 -28
  242. package/src/models/providers/openrouter.ts +0 -24
  243. package/src/models/providers/qwen-code.ts +0 -33
  244. package/src/models/providers/qwen.ts +0 -34
  245. package/src/models/providers/requesty.ts +0 -23
  246. package/src/models/providers/sambanova.ts +0 -23
  247. package/src/models/providers/sapaicore.ts +0 -34
  248. package/src/models/providers/together.ts +0 -35
  249. package/src/models/providers/vercel-ai-gateway.ts +0 -23
  250. package/src/models/providers/vertex.ts +0 -36
  251. package/src/models/providers/xai.ts +0 -34
  252. package/src/models/providers/zai.ts +0 -25
  253. package/src/models/query.ts +0 -407
  254. package/src/models/registry.ts +0 -511
  255. package/src/models/schemas/index.ts +0 -62
  256. package/src/models/schemas/model.ts +0 -308
  257. package/src/models/schemas/query.ts +0 -336
  258. package/src/providers/browser.ts +0 -4
  259. package/src/providers/handlers/ai-sdk-community.ts +0 -229
  260. package/src/providers/handlers/ai-sdk-provider-base.ts +0 -203
  261. package/src/providers/handlers/anthropic-base.test.ts +0 -30
  262. package/src/providers/handlers/anthropic-base.ts +0 -387
  263. package/src/providers/handlers/asksage.test.ts +0 -103
  264. package/src/providers/handlers/asksage.ts +0 -138
  265. package/src/providers/handlers/auth.test.ts +0 -19
  266. package/src/providers/handlers/auth.ts +0 -121
  267. package/src/providers/handlers/base.test.ts +0 -230
  268. package/src/providers/handlers/base.ts +0 -310
  269. package/src/providers/handlers/bedrock-base.ts +0 -390
  270. package/src/providers/handlers/bedrock-client.ts +0 -100
  271. package/src/providers/handlers/codex.test.ts +0 -160
  272. package/src/providers/handlers/community-sdk.test.ts +0 -321
  273. package/src/providers/handlers/community-sdk.ts +0 -391
  274. package/src/providers/handlers/fetch-base.ts +0 -68
  275. package/src/providers/handlers/gemini-base.test.ts +0 -261
  276. package/src/providers/handlers/gemini-base.ts +0 -307
  277. package/src/providers/handlers/index.ts +0 -67
  278. package/src/providers/handlers/openai-base.ts +0 -341
  279. package/src/providers/handlers/openai-responses.test.ts +0 -259
  280. package/src/providers/handlers/openai-responses.ts +0 -634
  281. package/src/providers/handlers/providers.test.ts +0 -120
  282. package/src/providers/handlers/providers.ts +0 -563
  283. package/src/providers/handlers/r1-base.ts +0 -283
  284. package/src/providers/handlers/registry.ts +0 -185
  285. package/src/providers/handlers/vertex.test.ts +0 -124
  286. package/src/providers/handlers/vertex.ts +0 -302
  287. package/src/providers/index.ts +0 -534
  288. package/src/providers/public.browser.ts +0 -20
  289. package/src/providers/public.ts +0 -51
  290. package/src/providers/shared/openai-compatible.ts +0 -63
  291. package/src/providers/transform/ai-sdk-community-format.test.ts +0 -73
  292. package/src/providers/transform/ai-sdk-community-format.ts +0 -115
  293. package/src/providers/transform/anthropic-format.ts +0 -230
  294. package/src/providers/transform/content-format.ts +0 -34
  295. package/src/providers/transform/format-conversion.test.ts +0 -413
  296. package/src/providers/transform/gemini-format.ts +0 -262
  297. package/src/providers/transform/index.ts +0 -22
  298. package/src/providers/transform/openai-format.ts +0 -290
  299. package/src/providers/transform/r1-format.ts +0 -287
  300. package/src/providers/types/config.ts +0 -396
  301. package/src/providers/types/handler.ts +0 -92
  302. package/src/providers/types/index.ts +0 -120
  303. package/src/providers/types/messages.ts +0 -162
  304. package/src/providers/types/model-info.test.ts +0 -57
  305. package/src/providers/types/model-info.ts +0 -65
  306. package/src/providers/types/provider-ids.test.ts +0 -12
  307. package/src/providers/types/provider-ids.ts +0 -89
  308. package/src/providers/types/settings.test.ts +0 -49
  309. package/src/providers/types/settings.ts +0 -533
  310. package/src/providers/types/stream.ts +0 -117
  311. package/src/providers/utils/index.ts +0 -27
  312. package/src/providers/utils/retry.test.ts +0 -140
  313. package/src/providers/utils/retry.ts +0 -188
  314. package/src/providers/utils/stream-processor.test.ts +0 -232
  315. package/src/providers/utils/stream-processor.ts +0 -472
  316. package/src/providers/utils/tool-processor.test.ts +0 -235
  317. package/src/providers/utils/tool-processor.ts +0 -146
  318. package/src/sdk.ts +0 -264
  319. package/src/types.ts +0 -79
@@ -1,73 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import type { Message } from "../types/messages";
3
- import { toAiSdkMessages } from "./ai-sdk-community-format";
4
-
5
- describe("ai sdk community format conversion", () => {
6
- it("converts file content to text and serializes tool_result file blocks", () => {
7
- const messages: Message[] = [
8
- {
9
- role: "user",
10
- content: [
11
- { type: "file", path: "/repo/readme.md", content: "hello file body" },
12
- ],
13
- },
14
- {
15
- role: "assistant",
16
- content: [
17
- {
18
- type: "tool_use",
19
- id: "call_1",
20
- name: "run_commands",
21
- input: ["ls -la", "pwd"] as unknown as Record<string, unknown>,
22
- },
23
- ],
24
- },
25
- {
26
- role: "user",
27
- content: [
28
- {
29
- type: "tool_result",
30
- tool_use_id: "call_1",
31
- content: [
32
- {
33
- type: "file",
34
- path: "/repo/readme.md",
35
- content: "hello file body",
36
- },
37
- ],
38
- },
39
- ],
40
- },
41
- ];
42
-
43
- const converted = toAiSdkMessages("system", messages);
44
- expect(converted[0]).toMatchObject({ role: "system", content: "system" });
45
- expect(converted[1]).toMatchObject({
46
- role: "user",
47
- content: [
48
- {
49
- type: "text",
50
- text: '<file_content path="/repo/readme.md">\nhello file body\n</file_content>',
51
- },
52
- ],
53
- });
54
- const assistantParts = Array.isArray(converted[2]?.content)
55
- ? converted[2].content
56
- : [];
57
- expect(assistantParts[0]).toMatchObject({
58
- args: { commands: ["ls -la", "pwd"] },
59
- });
60
- expect(converted[3]).toMatchObject({
61
- role: "tool",
62
- content: [
63
- {
64
- type: "tool-result",
65
- toolCallId: "call_1",
66
- output:
67
- '<file_content path="/repo/readme.md">\nhello file body\n</file_content>',
68
- isError: false,
69
- },
70
- ],
71
- });
72
- });
73
- });
@@ -1,115 +0,0 @@
1
- import { formatFileContentBlock } from "@clinebot/shared";
2
- import type { Message } from "../types/messages";
3
- import {
4
- normalizeToolUseInput,
5
- serializeToolResultContent,
6
- } from "./content-format";
7
-
8
- export type AiSdkMessagePart = Record<string, unknown>;
9
- export type AiSdkMessage = {
10
- role: "system" | "user" | "assistant" | "tool";
11
- content: string | AiSdkMessagePart[];
12
- };
13
-
14
- export function toAiSdkMessages(
15
- systemContent: string | AiSdkMessagePart[],
16
- messages: Message[],
17
- options?: { assistantToolCallArgKey?: "args" | "input" },
18
- ): AiSdkMessage[] {
19
- const toolCallArgKey = options?.assistantToolCallArgKey ?? "args";
20
- const result: AiSdkMessage[] = [{ role: "system", content: systemContent }];
21
- const toolNamesById = new Map<string, string>();
22
-
23
- for (const message of messages) {
24
- if (typeof message.content === "string") {
25
- result.push({ role: message.role, content: message.content });
26
- continue;
27
- }
28
-
29
- if (message.role === "assistant") {
30
- const parts: AiSdkMessagePart[] = [];
31
- for (const block of message.content) {
32
- if (block.type === "text") {
33
- parts.push({ type: "text", text: block.text });
34
- continue;
35
- }
36
-
37
- if (block.type === "file") {
38
- parts.push({
39
- type: "text",
40
- text: formatFileContentBlock(block.path, block.content),
41
- });
42
- continue;
43
- }
44
-
45
- if (block.type === "tool_use") {
46
- toolNamesById.set(block.id, block.name);
47
- parts.push({
48
- type: "tool-call",
49
- toolCallId: block.id,
50
- toolName: block.name,
51
- [toolCallArgKey]: normalizeToolUseInput(block.input),
52
- });
53
- }
54
- }
55
-
56
- if (parts.length > 0) {
57
- result.push({ role: "assistant", content: parts });
58
- }
59
- continue;
60
- }
61
-
62
- const userParts: AiSdkMessagePart[] = [];
63
- for (const block of message.content) {
64
- if (block.type === "text") {
65
- userParts.push({ type: "text", text: block.text });
66
- continue;
67
- }
68
-
69
- if (block.type === "file") {
70
- userParts.push({
71
- type: "text",
72
- text: formatFileContentBlock(block.path, block.content),
73
- });
74
- continue;
75
- }
76
-
77
- if (block.type === "image") {
78
- userParts.push({
79
- type: "image",
80
- image: Buffer.from(block.data, "base64"),
81
- mediaType: block.mediaType,
82
- });
83
- continue;
84
- }
85
-
86
- if (block.type === "tool_result") {
87
- if (userParts.length > 0) {
88
- result.push({
89
- role: "user",
90
- content: userParts.splice(0, userParts.length),
91
- });
92
- }
93
-
94
- result.push({
95
- role: "tool",
96
- content: [
97
- {
98
- type: "tool-result",
99
- toolCallId: block.tool_use_id,
100
- toolName: toolNamesById.get(block.tool_use_id) ?? "tool",
101
- output: serializeToolResultContent(block.content),
102
- isError: block.is_error ?? false,
103
- },
104
- ],
105
- });
106
- }
107
- }
108
-
109
- if (userParts.length > 0) {
110
- result.push({ role: "user", content: userParts });
111
- }
112
- }
113
-
114
- return result;
115
- }
@@ -1,230 +0,0 @@
1
- /**
2
- * Anthropic Message Format Converter
3
- *
4
- * Converts our unified Message format to Anthropic's MessageParam format.
5
- */
6
-
7
- import type { Anthropic } from "@anthropic-ai/sdk";
8
- import { formatFileContentBlock } from "@clinebot/shared";
9
- import type {
10
- ContentBlock,
11
- FileContent,
12
- ImageContent,
13
- Message,
14
- RedactedThinkingContent,
15
- TextContent,
16
- ThinkingContent,
17
- ToolResultContent,
18
- ToolUseContent,
19
- } from "../types/messages";
20
- import { normalizeToolUseInput } from "./content-format";
21
-
22
- type AnthropicMessage = Anthropic.MessageParam;
23
- type AnthropicContentBlock = Anthropic.ContentBlockParam;
24
-
25
- /**
26
- * Convert messages to Anthropic format
27
- *
28
- * @param messages - Messages to convert
29
- * @param enableCaching - Whether to add cache control markers
30
- */
31
- export function convertToAnthropicMessages(
32
- messages: Message[],
33
- enableCaching = false,
34
- ): AnthropicMessage[] {
35
- const userMessageIndices = messages.reduce<number[]>(
36
- (indices, message, index) => {
37
- if (message.role === "user") {
38
- indices.push(index);
39
- }
40
- return indices;
41
- },
42
- [],
43
- );
44
- const cacheableMessageIndices = enableCaching
45
- ? new Set(userMessageIndices.slice(-2))
46
- : new Set<number>();
47
- const result: AnthropicMessage[] = [];
48
-
49
- for (const [index, message] of messages.entries()) {
50
- const converted = convertMessage(
51
- message,
52
- cacheableMessageIndices.has(index),
53
- );
54
- if (converted) {
55
- result.push(converted);
56
- }
57
- }
58
-
59
- return result;
60
- }
61
-
62
- function convertMessage(
63
- message: Message,
64
- addCacheControl: boolean,
65
- ): AnthropicMessage | null {
66
- const { role, content } = message;
67
-
68
- // Simple string content
69
- if (typeof content === "string") {
70
- const textBlock: AnthropicContentBlock = { type: "text", text: content };
71
- if (addCacheControl) {
72
- (textBlock as any).cache_control = { type: "ephemeral" };
73
- }
74
- return { role, content: [textBlock] };
75
- }
76
-
77
- // Array content - need to process blocks
78
- const blocks = convertContentBlocks(content, addCacheControl);
79
- if (blocks.length === 0) {
80
- return null;
81
- }
82
-
83
- return { role, content: blocks };
84
- }
85
-
86
- function convertContentBlocks(
87
- content: ContentBlock[],
88
- addCacheControl: boolean,
89
- ): AnthropicContentBlock[] {
90
- const blocks: AnthropicContentBlock[] = [];
91
-
92
- for (let i = 0; i < content.length; i++) {
93
- const block = content[i];
94
- const isLast = i === content.length - 1;
95
- const converted = convertContentBlock(block, addCacheControl && isLast);
96
- if (converted) {
97
- blocks.push(converted);
98
- }
99
- }
100
-
101
- return blocks;
102
- }
103
-
104
- function convertContentBlock(
105
- block: ContentBlock,
106
- addCacheControl: boolean,
107
- ): AnthropicContentBlock | null {
108
- switch (block.type) {
109
- case "text": {
110
- const textBlock = block as TextContent;
111
- const result: AnthropicContentBlock = {
112
- type: "text",
113
- text: textBlock.text,
114
- };
115
- if (addCacheControl) {
116
- (result as any).cache_control = { type: "ephemeral" };
117
- }
118
- return result;
119
- }
120
-
121
- case "file": {
122
- const fileBlock = block as FileContent;
123
- return {
124
- type: "text",
125
- text: formatFileContentBlock(fileBlock.path, fileBlock.content),
126
- };
127
- }
128
-
129
- case "image": {
130
- const imageBlock = block as ImageContent;
131
- return {
132
- type: "image",
133
- source: {
134
- type: "base64",
135
- media_type: imageBlock.mediaType as
136
- | "image/jpeg"
137
- | "image/png"
138
- | "image/gif"
139
- | "image/webp",
140
- data: imageBlock.data,
141
- },
142
- };
143
- }
144
-
145
- case "tool_use": {
146
- const toolBlock = block as ToolUseContent;
147
- return {
148
- type: "tool_use",
149
- id: toolBlock.id,
150
- name: toolBlock.name,
151
- input: normalizeToolUseInput(toolBlock.input),
152
- };
153
- }
154
-
155
- case "tool_result": {
156
- const resultBlock = block as ToolResultContent;
157
- let resultContent: Anthropic.ToolResultBlockParam["content"];
158
-
159
- if (typeof resultBlock.content === "string") {
160
- resultContent = resultBlock.content;
161
- } else {
162
- // Convert array of text/image to Anthropic format
163
- resultContent = resultBlock.content.map((item) => {
164
- if (item.type === "text") {
165
- return { type: "text" as const, text: item.text };
166
- } else if (item.type === "file") {
167
- const fileItem = item as FileContent;
168
- return {
169
- type: "text" as const,
170
- text: formatFileContentBlock(fileItem.path, fileItem.content),
171
- };
172
- } else {
173
- return {
174
- type: "image" as const,
175
- source: {
176
- type: "base64" as const,
177
- media_type: item.mediaType as
178
- | "image/jpeg"
179
- | "image/png"
180
- | "image/gif"
181
- | "image/webp",
182
- data: item.data,
183
- },
184
- };
185
- }
186
- });
187
- }
188
-
189
- return {
190
- type: "tool_result",
191
- tool_use_id: resultBlock.tool_use_id,
192
- content: resultContent,
193
- is_error: resultBlock.is_error,
194
- };
195
- }
196
-
197
- case "thinking": {
198
- const thinkingBlock = block as ThinkingContent;
199
- return {
200
- type: "thinking",
201
- thinking: thinkingBlock.thinking,
202
- signature: thinkingBlock.signature,
203
- } as any; // Anthropic SDK types may not include this yet
204
- }
205
-
206
- case "redacted_thinking": {
207
- const redactedBlock = block as RedactedThinkingContent;
208
- return {
209
- type: "redacted_thinking",
210
- data: redactedBlock.data,
211
- } as any;
212
- }
213
-
214
- default:
215
- return null;
216
- }
217
- }
218
-
219
- /**
220
- * Convert tool definitions to Anthropic format
221
- */
222
- export function convertToolsToAnthropic(
223
- tools: Array<{ name: string; description: string; inputSchema: unknown }>,
224
- ): Anthropic.Tool[] {
225
- return tools.map((tool) => ({
226
- name: tool.name,
227
- description: tool.description,
228
- input_schema: tool.inputSchema as Anthropic.Tool.InputSchema,
229
- }));
230
- }
@@ -1,34 +0,0 @@
1
- import { formatFileContentBlock } from "@clinebot/shared";
2
- import type { FileContent, ImageContent, TextContent } from "../types/messages";
3
-
4
- export function normalizeToolUseInput(
5
- input: Record<string, unknown>,
6
- ): Record<string, unknown> {
7
- if (Array.isArray(input)) {
8
- return { commands: input };
9
- }
10
- return input;
11
- }
12
-
13
- export function serializeToolResultContent(
14
- content: string | Array<TextContent | ImageContent | FileContent>,
15
- ): string {
16
- if (typeof content === "string") {
17
- return content;
18
- }
19
-
20
- const parts: string[] = [];
21
- for (const part of content) {
22
- if (part.type === "text") {
23
- parts.push(part.text);
24
- continue;
25
- }
26
- if (part.type === "file") {
27
- parts.push(formatFileContentBlock(part.path, part.content));
28
- continue;
29
- }
30
- parts.push(JSON.stringify(part));
31
- }
32
-
33
- return parts.join("\n");
34
- }