@clinebot/llms 0.0.18 → 0.0.21

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,229 +0,0 @@
1
- import type { ApiStream } from "../types";
2
-
3
- export type {
4
- AiSdkMessage,
5
- AiSdkMessagePart,
6
- } from "../transform/ai-sdk-community-format";
7
- export { toAiSdkMessages } from "../transform/ai-sdk-community-format";
8
-
9
- type AiSdkStreamPart = {
10
- type?: string;
11
- [key: string]: unknown;
12
- };
13
-
14
- type AiSdkUsage = {
15
- inputTokens?: unknown;
16
- outputTokens?: unknown;
17
- reasoningTokens?: unknown;
18
- thoughtsTokenCount?: unknown;
19
- cachedInputTokens?: unknown;
20
- };
21
-
22
- export type AiSdkStream = {
23
- fullStream?: AsyncIterable<AiSdkStreamPart>;
24
- textStream?: AsyncIterable<string>;
25
- text?: Promise<string> | string;
26
- usage?: Promise<Record<string, unknown>>;
27
- };
28
-
29
- type AiSdkUsageMetrics = {
30
- inputTokens: number;
31
- outputTokens: number;
32
- thoughtsTokenCount: number;
33
- cacheReadTokens: number;
34
- cacheWriteTokens?: number;
35
- };
36
-
37
- export type EmitAiSdkStreamOptions = {
38
- responseId: string;
39
- errorMessage: string;
40
- calculateCost: (
41
- inputTokens: number,
42
- outputTokens: number,
43
- cacheReadTokens: number,
44
- cacheWriteTokens?: number,
45
- ) => number | undefined;
46
- reasoningTypes?: string[];
47
- enableToolCalls?: boolean;
48
- toolCallArgsOrder?: Array<"args" | "input">;
49
- toolCallFunctionIncludeId?: boolean;
50
- enableTextFallback?: boolean;
51
- resolveUsageMetrics?: (
52
- usage: AiSdkUsage,
53
- part?: AiSdkStreamPart,
54
- ) => AiSdkUsageMetrics;
55
- };
56
-
57
- let cachedAiModule: {
58
- streamText: (input: Record<string, unknown>) => AiSdkStream;
59
- } | null = null;
60
-
61
- export type LoadAiSdkOptions = {
62
- beforeImport?: () => void;
63
- };
64
-
65
- export async function loadAiSdkModule(options?: LoadAiSdkOptions): Promise<{
66
- streamText: (input: Record<string, unknown>) => AiSdkStream;
67
- }> {
68
- if (cachedAiModule) {
69
- return cachedAiModule;
70
- }
71
- options?.beforeImport?.();
72
- cachedAiModule = (await import("ai")) as unknown as {
73
- streamText: (input: Record<string, unknown>) => AiSdkStream;
74
- };
75
- return cachedAiModule;
76
- }
77
-
78
- export function numberOrZero(value: unknown): number {
79
- return typeof value === "number" && Number.isFinite(value) ? value : 0;
80
- }
81
-
82
- function defaultResolveUsageMetrics(usage: AiSdkUsage): AiSdkUsageMetrics {
83
- return {
84
- inputTokens: numberOrZero(usage.inputTokens),
85
- outputTokens: numberOrZero(usage.outputTokens),
86
- thoughtsTokenCount: numberOrZero(
87
- usage.reasoningTokens ?? usage.thoughtsTokenCount,
88
- ),
89
- cacheReadTokens: numberOrZero(usage.cachedInputTokens),
90
- };
91
- }
92
-
93
- export async function* emitAiSdkStream(
94
- stream: AiSdkStream,
95
- options: EmitAiSdkStreamOptions,
96
- ): ApiStream {
97
- const resolveUsageMetrics =
98
- options.resolveUsageMetrics ?? defaultResolveUsageMetrics;
99
- const reasoningTypes = new Set(options.reasoningTypes ?? ["reasoning-delta"]);
100
- const toolCallArgsOrder = options.toolCallArgsOrder ?? ["args", "input"];
101
- const responseId = options.responseId;
102
-
103
- let usageEmitted = false;
104
- let textEmitted = false;
105
-
106
- if (stream.fullStream) {
107
- for await (const part of stream.fullStream) {
108
- const partType = part.type;
109
-
110
- if (partType === "text-delta") {
111
- const text =
112
- (part.textDelta as string | undefined) ??
113
- (part.text as string | undefined) ??
114
- (part.delta as string | undefined);
115
- if (text) {
116
- yield { type: "text", text, id: responseId };
117
- textEmitted = true;
118
- }
119
- continue;
120
- }
121
-
122
- if (partType && reasoningTypes.has(partType)) {
123
- const reasoning =
124
- (part.textDelta as string | undefined) ??
125
- (part.reasoning as string | undefined) ??
126
- (part.text as string | undefined);
127
- if (reasoning) {
128
- yield { type: "reasoning", reasoning, id: responseId };
129
- }
130
- continue;
131
- }
132
-
133
- if (partType === "tool-call" && options.enableToolCalls) {
134
- const toolCallId =
135
- (part.toolCallId as string | undefined) ??
136
- (part.id as string | undefined);
137
- const toolName =
138
- (part.toolName as string | undefined) ??
139
- (part.name as string | undefined);
140
- const args =
141
- toolCallArgsOrder
142
- .map((key) => part[key] as Record<string, unknown> | undefined)
143
- .find((candidate) => candidate !== undefined) ?? {};
144
-
145
- yield {
146
- type: "tool_calls",
147
- id: responseId,
148
- tool_call: {
149
- call_id: toolCallId,
150
- function: {
151
- id: options.toolCallFunctionIncludeId ? toolCallId : undefined,
152
- name: toolName,
153
- arguments: args,
154
- },
155
- },
156
- };
157
- continue;
158
- }
159
-
160
- if (partType === "error") {
161
- const message =
162
- (part.error as Error | undefined)?.message ?? options.errorMessage;
163
- throw new Error(message);
164
- }
165
-
166
- if (partType === "finish") {
167
- const usage = (part.totalUsage ?? part.usage ?? {}) as AiSdkUsage;
168
- const usageMetrics = resolveUsageMetrics(usage, part);
169
-
170
- yield {
171
- type: "usage",
172
- inputTokens: Math.max(
173
- 0,
174
- usageMetrics.inputTokens - usageMetrics.cacheReadTokens,
175
- ),
176
- outputTokens: usageMetrics.outputTokens,
177
- thoughtsTokenCount: usageMetrics.thoughtsTokenCount,
178
- cacheReadTokens: usageMetrics.cacheReadTokens,
179
- cacheWriteTokens: usageMetrics.cacheWriteTokens,
180
- totalCost: options.calculateCost(
181
- usageMetrics.inputTokens,
182
- usageMetrics.outputTokens,
183
- usageMetrics.cacheReadTokens,
184
- usageMetrics.cacheWriteTokens,
185
- ),
186
- id: responseId,
187
- };
188
- usageEmitted = true;
189
- }
190
- }
191
- } else if (stream.textStream) {
192
- for await (const text of stream.textStream) {
193
- yield { type: "text", text, id: responseId };
194
- textEmitted = true;
195
- }
196
- }
197
-
198
- if (!textEmitted && options.enableTextFallback && stream.text) {
199
- const text = await stream.text;
200
- if (typeof text === "string" && text.length > 0) {
201
- yield { type: "text", text, id: responseId };
202
- }
203
- }
204
-
205
- if (!usageEmitted && stream.usage) {
206
- const usage = (await stream.usage) as AiSdkUsage;
207
- const usageMetrics = resolveUsageMetrics(usage);
208
- yield {
209
- type: "usage",
210
- inputTokens: Math.max(
211
- 0,
212
- usageMetrics.inputTokens - usageMetrics.cacheReadTokens,
213
- ),
214
- outputTokens: usageMetrics.outputTokens,
215
- thoughtsTokenCount: usageMetrics.thoughtsTokenCount,
216
- cacheReadTokens: usageMetrics.cacheReadTokens,
217
- cacheWriteTokens: usageMetrics.cacheWriteTokens,
218
- totalCost: options.calculateCost(
219
- usageMetrics.inputTokens,
220
- usageMetrics.outputTokens,
221
- usageMetrics.cacheReadTokens,
222
- usageMetrics.cacheWriteTokens,
223
- ),
224
- id: responseId,
225
- };
226
- }
227
-
228
- yield { type: "done", success: true, id: responseId };
229
- }
@@ -1,203 +0,0 @@
1
- import { toAiSdkMessages } from "../transform/ai-sdk-community-format";
2
- import type { ApiStream, HandlerModelInfo, ProviderConfig } from "../types";
3
- import type { Message, ToolDefinition } from "../types/messages";
4
- import { retryStream } from "../utils/retry";
5
- import {
6
- type EmitAiSdkStreamOptions,
7
- emitAiSdkStream,
8
- type LoadAiSdkOptions,
9
- loadAiSdkModule,
10
- } from "./ai-sdk-community";
11
- import { BaseHandler } from "./base";
12
-
13
- type AiSdkCommunityProvider = (
14
- modelId: string,
15
- settings?: Record<string, unknown>,
16
- ) => unknown;
17
-
18
- type ProviderModule = Record<string, unknown>;
19
-
20
- const providerModuleCache = new Map<string, ProviderModule>();
21
-
22
- type CommunityProviderDefinition = {
23
- moduleName: string;
24
- createExportName: string;
25
- providerExportName: string;
26
- missingDependencyError: string;
27
- };
28
-
29
- export function resolveHandlerModel(
30
- config: ProviderConfig,
31
- defaultModelId?: string,
32
- ): HandlerModelInfo {
33
- const configuredModelId = config.modelId?.trim();
34
- const modelId =
35
- configuredModelId && configuredModelId.length > 0
36
- ? configuredModelId
37
- : (defaultModelId ?? "");
38
- const knownModels = config.knownModels ?? {};
39
- const fallbackModel = knownModels[modelId] ?? {};
40
- const modelInfo = config.modelInfo ?? fallbackModel;
41
- return { id: modelId, info: { ...modelInfo, id: modelId } };
42
- }
43
-
44
- async function loadProviderModule(moduleName: string): Promise<ProviderModule> {
45
- const cached = providerModuleCache.get(moduleName);
46
- if (cached) {
47
- return cached;
48
- }
49
- const loaded = (await import(moduleName)) as ProviderModule;
50
- providerModuleCache.set(moduleName, loaded);
51
- return loaded;
52
- }
53
-
54
- export abstract class AiSdkProviderHandler extends BaseHandler {
55
- private provider: AiSdkCommunityProvider | undefined;
56
- private providerPromise: Promise<AiSdkCommunityProvider> | undefined;
57
-
58
- protected abstract getProviderDefinition(): CommunityProviderDefinition;
59
- protected abstract getDefaultModelId(): string;
60
-
61
- protected getProviderCreateOptions(): Record<string, unknown> | undefined {
62
- return undefined;
63
- }
64
-
65
- protected async beforeLoadProviderModule(): Promise<void> {}
66
-
67
- protected getProviderModelSettings(): Record<string, unknown> | undefined {
68
- return undefined;
69
- }
70
-
71
- protected getLoadAiSdkOptions(): LoadAiSdkOptions | undefined {
72
- return undefined;
73
- }
74
-
75
- protected getStreamErrorMessage(): string {
76
- return "AI SDK stream failed";
77
- }
78
-
79
- protected getEmitStreamOptions(): Omit<
80
- EmitAiSdkStreamOptions,
81
- "responseId" | "errorMessage" | "calculateCost"
82
- > {
83
- return {};
84
- }
85
-
86
- protected getAssistantToolCallArgKey(): "args" | "input" {
87
- return "args";
88
- }
89
-
90
- protected normalizeModelId(modelId: string): string {
91
- return modelId;
92
- }
93
-
94
- protected async ensureProvider(): Promise<AiSdkCommunityProvider> {
95
- if (this.provider) {
96
- return this.provider;
97
- }
98
- if (!this.providerPromise) {
99
- this.providerPromise = (async () => {
100
- const definition = this.getProviderDefinition();
101
- await this.beforeLoadProviderModule();
102
- const module = await loadProviderModule(definition.moduleName);
103
-
104
- const createProvider = module[definition.createExportName] as
105
- | ((options?: Record<string, unknown>) => AiSdkCommunityProvider)
106
- | undefined;
107
- const provider = module[definition.providerExportName] as
108
- | AiSdkCommunityProvider
109
- | undefined;
110
-
111
- if (createProvider) {
112
- const created = createProvider(this.getProviderCreateOptions());
113
- this.provider = created;
114
- return created;
115
- }
116
-
117
- if (provider) {
118
- this.provider = provider;
119
- return provider;
120
- }
121
-
122
- throw new Error(
123
- `${definition.moduleName} did not export \`${definition.providerExportName}\` or \`${definition.createExportName}\`.`,
124
- );
125
- })();
126
- }
127
-
128
- try {
129
- return await this.providerPromise;
130
- } catch (error) {
131
- this.providerPromise = undefined;
132
- const moduleName = this.getProviderDefinition().moduleName;
133
- if (error instanceof Error && error.message.includes(moduleName)) {
134
- throw new Error(this.getProviderDefinition().missingDependencyError, {
135
- cause: error,
136
- });
137
- }
138
- throw error;
139
- }
140
- }
141
-
142
- getModel(): HandlerModelInfo {
143
- return resolveHandlerModel(this.config, this.getDefaultModelId());
144
- }
145
-
146
- getMessages(systemPrompt: string, messages: Message[]) {
147
- return toAiSdkMessages(systemPrompt, messages, {
148
- assistantToolCallArgKey: this.getAssistantToolCallArgKey(),
149
- });
150
- }
151
-
152
- async *createMessage(
153
- systemPrompt: string,
154
- messages: Message[],
155
- tools?: ToolDefinition[],
156
- ): ApiStream {
157
- yield* retryStream(() =>
158
- this.createMessageInternal(systemPrompt, messages, tools),
159
- );
160
- }
161
-
162
- private async *createMessageInternal(
163
- systemPrompt: string,
164
- messages: Message[],
165
- tools?: ToolDefinition[],
166
- ): ApiStream {
167
- void tools;
168
-
169
- const ai = await loadAiSdkModule(this.getLoadAiSdkOptions());
170
- const provider = await this.ensureProvider();
171
- const { id: modelId, info } = this.getModel();
172
- const responseId = this.createResponseId();
173
-
174
- const stream = ai.streamText({
175
- model: provider(
176
- this.normalizeModelId(modelId),
177
- this.getProviderModelSettings(),
178
- ),
179
- messages: this.getMessages(systemPrompt, messages),
180
- maxTokens: info.maxTokens ?? undefined,
181
- temperature: info.temperature ?? undefined,
182
- abortSignal: this.getAbortSignal(),
183
- });
184
-
185
- yield* emitAiSdkStream(stream, {
186
- responseId,
187
- errorMessage: this.getStreamErrorMessage(),
188
- calculateCost: (
189
- inputTokens,
190
- outputTokens,
191
- cacheReadTokens,
192
- cacheWriteTokens,
193
- ) =>
194
- this.calculateCost(
195
- inputTokens,
196
- outputTokens,
197
- cacheReadTokens,
198
- cacheWriteTokens,
199
- ),
200
- ...this.getEmitStreamOptions(),
201
- });
202
- }
203
- }
@@ -1,30 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { AnthropicHandler } from "./anthropic-base";
3
-
4
- describe("AnthropicHandler prompt cache detection", () => {
5
- it("enables prompt caching when model pricing includes cache pricing", () => {
6
- const handler = new AnthropicHandler({
7
- providerId: "anthropic",
8
- modelId: "claude-sonnet-4-6",
9
- apiKey: "test-key",
10
- modelInfo: {
11
- id: "claude-sonnet-4-6",
12
- pricing: {
13
- input: 3,
14
- output: 15,
15
- cacheRead: 0.3,
16
- cacheWrite: 3.75,
17
- },
18
- },
19
- });
20
-
21
- const messages = handler.getMessages("system", [
22
- { role: "user", content: "Tell me about this repo" },
23
- ]);
24
- const userTextBlock = messages[0]?.content?.[0] as
25
- | { cache_control?: { type: string } }
26
- | undefined;
27
-
28
- expect(userTextBlock?.cache_control).toEqual({ type: "ephemeral" });
29
- });
30
- });