aemeathcli 1.0.10 → 1.0.12

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 (184) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +66 -54
  3. package/dist/App-JQ622M66.js +4431 -0
  4. package/dist/App-JQ622M66.js.map +1 -0
  5. package/dist/agent-store/architect.md +32 -0
  6. package/dist/agent-store/debugger.md +32 -0
  7. package/dist/agent-store/developer.md +29 -0
  8. package/dist/agent-store/documenter.md +30 -0
  9. package/dist/agent-store/researcher.md +31 -0
  10. package/dist/agent-store/reviewer.md +28 -0
  11. package/dist/agent-store/supervisor.md +37 -0
  12. package/dist/agent-store/tester.md +30 -0
  13. package/dist/api-key-fallback-RJLPM3KH.js +11 -0
  14. package/dist/{api-key-fallback-YQQBOQIL.js.map → api-key-fallback-RJLPM3KH.js.map} +1 -1
  15. package/dist/auth-status-JQJOKUPF.js +13 -0
  16. package/dist/auth-status-JQJOKUPF.js.map +1 -0
  17. package/dist/{chunk-RWCNNAL7.js → chunk-2KMA5RBC.js} +25 -48
  18. package/dist/chunk-2KMA5RBC.js.map +1 -0
  19. package/dist/{chunk-CYQNBB25.js → chunk-2Y7TR6BS.js} +28 -5
  20. package/dist/chunk-2Y7TR6BS.js.map +1 -0
  21. package/dist/{chunk-DAHGLHNR.js → chunk-2ZYK5IJG.js} +6 -141
  22. package/dist/chunk-2ZYK5IJG.js.map +1 -0
  23. package/dist/chunk-36RXCZOV.js +88 -0
  24. package/dist/chunk-36RXCZOV.js.map +1 -0
  25. package/dist/{chunk-DMBPX3RG.js → chunk-7EBLXPL4.js} +9 -9
  26. package/dist/{chunk-DMBPX3RG.js.map → chunk-7EBLXPL4.js.map} +1 -1
  27. package/dist/chunk-BIMQL4AG.js +186 -0
  28. package/dist/chunk-BIMQL4AG.js.map +1 -0
  29. package/dist/{chunk-NBR3GHMT.js → chunk-D275MCIH.js} +39 -7
  30. package/dist/chunk-D275MCIH.js.map +1 -0
  31. package/dist/{chunk-Y5XVD2CD.js → chunk-FFS4T7BZ.js} +109 -82
  32. package/dist/chunk-FFS4T7BZ.js.map +1 -0
  33. package/dist/{chunk-CARHU3DO.js → chunk-GXAJGP2T.js} +64 -16
  34. package/dist/chunk-GXAJGP2T.js.map +1 -0
  35. package/dist/{chunk-I5PZ4JTS.js → chunk-HESQLCLU.js} +4 -4
  36. package/dist/{chunk-I5PZ4JTS.js.map → chunk-HESQLCLU.js.map} +1 -1
  37. package/dist/{chunk-JAXXTYID.js → chunk-IR5HLBMH.js} +2 -2
  38. package/dist/{chunk-JAXXTYID.js.map → chunk-IR5HLBMH.js.map} +1 -1
  39. package/dist/{chunk-MFBHNWGV.js → chunk-K2FCMRXH.js} +11 -19
  40. package/dist/chunk-K2FCMRXH.js.map +1 -0
  41. package/dist/{chunk-H66O5Z2V.js → chunk-KIC7UI5U.js} +41 -6
  42. package/dist/chunk-KIC7UI5U.js.map +1 -0
  43. package/dist/{chunk-MXZSI3AY.js → chunk-KMOAJRDE.js} +42 -10
  44. package/dist/chunk-KMOAJRDE.js.map +1 -0
  45. package/dist/chunk-LQBALETG.js +71 -0
  46. package/dist/chunk-LQBALETG.js.map +1 -0
  47. package/dist/chunk-M3FPQSRU.js +12 -0
  48. package/dist/chunk-M3FPQSRU.js.map +1 -0
  49. package/dist/chunk-NQEUK763.js +26 -0
  50. package/dist/chunk-NQEUK763.js.map +1 -0
  51. package/dist/chunk-OPWAFS6Y.js +38 -0
  52. package/dist/chunk-OPWAFS6Y.js.map +1 -0
  53. package/dist/{chunk-6PDJ45T4.js → chunk-PS4WEFW6.js} +50 -25
  54. package/dist/chunk-PS4WEFW6.js.map +1 -0
  55. package/dist/{chunk-HMJRPNPZ.js → chunk-QK7TKNHV.js} +93 -21
  56. package/dist/chunk-QK7TKNHV.js.map +1 -0
  57. package/dist/{chunk-LSOYPSAT.js → chunk-RADJSEG5.js} +4 -4
  58. package/dist/chunk-RADJSEG5.js.map +1 -0
  59. package/dist/{chunk-4IJD72YB.js → chunk-SNWPI6XJ.js} +7 -7
  60. package/dist/chunk-SNWPI6XJ.js.map +1 -0
  61. package/dist/{chunk-TEVZS4FA.js → chunk-UM7MSLOV.js} +16 -9
  62. package/dist/chunk-UM7MSLOV.js.map +1 -0
  63. package/dist/chunk-VNZ3YTQD.js +232 -0
  64. package/dist/chunk-VNZ3YTQD.js.map +1 -0
  65. package/dist/{chunk-IYW62KKR.js → chunk-WXIN65UG.js} +66 -23
  66. package/dist/chunk-WXIN65UG.js.map +1 -0
  67. package/dist/chunk-XEXWX7C7.js +241 -0
  68. package/dist/chunk-XEXWX7C7.js.map +1 -0
  69. package/dist/{chunk-CGEV3ARR.js → chunk-YCCYXDW7.js} +3 -3
  70. package/dist/chunk-YCCYXDW7.js.map +1 -0
  71. package/dist/chunk-YPQ2MLAV.js +140 -0
  72. package/dist/chunk-YPQ2MLAV.js.map +1 -0
  73. package/dist/chunk-ZCOVMVK4.js +26 -0
  74. package/dist/chunk-ZCOVMVK4.js.map +1 -0
  75. package/dist/{claude-login-5WELXPKT.js → claude-login-AIFIWTYF.js} +9 -9
  76. package/dist/{claude-login-5WELXPKT.js.map → claude-login-AIFIWTYF.js.map} +1 -1
  77. package/dist/cli.js +370 -171
  78. package/dist/cli.js.map +1 -1
  79. package/dist/{codex-login-GZIFXUWD.js → codex-login-LW5X7GAM.js} +10 -10
  80. package/dist/codex-login-LW5X7GAM.js.map +1 -0
  81. package/dist/config-store-NF56VHFU.js +7 -0
  82. package/dist/{config-store-W6FBCQAQ.js.map → config-store-NF56VHFU.js.map} +1 -1
  83. package/dist/conversation-store-7GRDQZD2.js +4 -0
  84. package/dist/conversation-store-7GRDQZD2.js.map +1 -0
  85. package/dist/detect-providers-QICJ5U3R.js +4 -0
  86. package/dist/detect-providers-QICJ5U3R.js.map +1 -0
  87. package/dist/executor-FTABX2AW.js +4 -0
  88. package/dist/{executor-6RIKIGXK.js.map → executor-FTABX2AW.js.map} +1 -1
  89. package/dist/first-run-ADROZVYF.js +230 -0
  90. package/dist/first-run-ADROZVYF.js.map +1 -0
  91. package/dist/{gemini-login-AZGL3CE7.js → gemini-login-TST454MX.js} +9 -9
  92. package/dist/{gemini-login-AZGL3CE7.js.map → gemini-login-TST454MX.js.map} +1 -1
  93. package/dist/index.d.ts +46 -70
  94. package/dist/index.js +79 -468
  95. package/dist/index.js.map +1 -1
  96. package/dist/input-history-BEICE7PT.js +57 -0
  97. package/dist/input-history-BEICE7PT.js.map +1 -0
  98. package/dist/kimi-adapter-7FYOAKOI.js +6 -0
  99. package/dist/{kimi-adapter-JN4HFFHU.js.map → kimi-adapter-7FYOAKOI.js.map} +1 -1
  100. package/dist/{kimi-login-6LUWB7P6.js → kimi-login-3IGVOBJI.js} +9 -9
  101. package/dist/{kimi-login-6LUWB7P6.js.map → kimi-login-3IGVOBJI.js.map} +1 -1
  102. package/dist/logger-KGHUQ4VE.js +3 -0
  103. package/dist/logger-KGHUQ4VE.js.map +1 -0
  104. package/dist/model-discovery-AAJDHRFO.js +6 -0
  105. package/dist/model-discovery-AAJDHRFO.js.map +1 -0
  106. package/dist/native-cli-adapters-CLONTZOA.js +8 -0
  107. package/dist/{native-cli-adapters-OLW3XX57.js.map → native-cli-adapters-CLONTZOA.js.map} +1 -1
  108. package/dist/ollama-adapter-2N5OQIEV.js +5 -0
  109. package/dist/{ollama-adapter-OJQ3FKWK.js.map → ollama-adapter-2N5OQIEV.js.map} +1 -1
  110. package/dist/pathResolver-UVAB2FCW.js +3 -0
  111. package/dist/pathResolver-UVAB2FCW.js.map +1 -0
  112. package/dist/profile-loader-EMLV4J7S.js +162 -0
  113. package/dist/profile-loader-EMLV4J7S.js.map +1 -0
  114. package/dist/registry-LRURZVUL.js +5 -0
  115. package/dist/{registry-AZ2LOHHJ.js.map → registry-LRURZVUL.js.map} +1 -1
  116. package/dist/registry-MVNSXCEF.js +6 -0
  117. package/dist/{registry-H7B3AHPQ.js.map → registry-MVNSXCEF.js.map} +1 -1
  118. package/dist/server-manager-THGZBBZB.js +5 -0
  119. package/dist/{server-manager-PTGBHCLS.js.map → server-manager-THGZBBZB.js.map} +1 -1
  120. package/dist/session-manager-X3DXT53M.js +12 -0
  121. package/dist/{session-manager-XOMDMC77.js.map → session-manager-X3DXT53M.js.map} +1 -1
  122. package/dist/skills/built-in/code-review/SKILL.md +85 -0
  123. package/dist/skills/built-in/commit/SKILL.md +83 -0
  124. package/dist/skills/built-in/debug/SKILL.md +119 -0
  125. package/dist/skills/built-in/plan/SKILL.md +123 -0
  126. package/dist/skills/built-in/refactor/SKILL.md +132 -0
  127. package/dist/skills/built-in/test/SKILL.md +128 -0
  128. package/dist/sqlite-store-7OECRTXM.js +5 -0
  129. package/dist/sqlite-store-7OECRTXM.js.map +1 -0
  130. package/dist/team-manager-2VSMALAA.js +11 -0
  131. package/dist/{team-manager-HC4XGCFY.js.map → team-manager-2VSMALAA.js.map} +1 -1
  132. package/dist/team-state-HZNVMQHT.js +3 -0
  133. package/dist/team-state-HZNVMQHT.js.map +1 -0
  134. package/dist/tmux-manager-57QCUVHU.js +6 -0
  135. package/dist/{tmux-manager-GPYZ3WQH.js.map → tmux-manager-57QCUVHU.js.map} +1 -1
  136. package/dist/tools-KWFSYT56.js +6 -0
  137. package/dist/{tools-TSMXMHIF.js.map → tools-KWFSYT56.js.map} +1 -1
  138. package/package.json +11 -11
  139. package/dist/App-FKRSMFMB.js +0 -2789
  140. package/dist/App-FKRSMFMB.js.map +0 -1
  141. package/dist/api-key-fallback-YQQBOQIL.js +0 -11
  142. package/dist/chunk-4IJD72YB.js.map +0 -1
  143. package/dist/chunk-6PDJ45T4.js.map +0 -1
  144. package/dist/chunk-CARHU3DO.js.map +0 -1
  145. package/dist/chunk-CGEV3ARR.js.map +0 -1
  146. package/dist/chunk-CS5X3BWX.js +0 -27
  147. package/dist/chunk-CS5X3BWX.js.map +0 -1
  148. package/dist/chunk-CYQNBB25.js.map +0 -1
  149. package/dist/chunk-DAHGLHNR.js.map +0 -1
  150. package/dist/chunk-H66O5Z2V.js.map +0 -1
  151. package/dist/chunk-HMJRPNPZ.js.map +0 -1
  152. package/dist/chunk-IYW62KKR.js.map +0 -1
  153. package/dist/chunk-LSOYPSAT.js.map +0 -1
  154. package/dist/chunk-MFBHNWGV.js.map +0 -1
  155. package/dist/chunk-MXZSI3AY.js.map +0 -1
  156. package/dist/chunk-NBR3GHMT.js.map +0 -1
  157. package/dist/chunk-RWCNNAL7.js.map +0 -1
  158. package/dist/chunk-TEVZS4FA.js.map +0 -1
  159. package/dist/chunk-UY2SYSEZ.js +0 -211
  160. package/dist/chunk-UY2SYSEZ.js.map +0 -1
  161. package/dist/chunk-WAHVZH7V.js +0 -260
  162. package/dist/chunk-WAHVZH7V.js.map +0 -1
  163. package/dist/chunk-WPP3PEDE.js +0 -234
  164. package/dist/chunk-WPP3PEDE.js.map +0 -1
  165. package/dist/chunk-Y5XVD2CD.js.map +0 -1
  166. package/dist/claude-adapter-QMLFMSP3.js +0 -6
  167. package/dist/claude-adapter-QMLFMSP3.js.map +0 -1
  168. package/dist/codex-login-GZIFXUWD.js.map +0 -1
  169. package/dist/config-store-W6FBCQAQ.js +0 -6
  170. package/dist/executor-6RIKIGXK.js +0 -4
  171. package/dist/gemini-adapter-6JIHZ7WI.js +0 -6
  172. package/dist/gemini-adapter-6JIHZ7WI.js.map +0 -1
  173. package/dist/kimi-adapter-JN4HFFHU.js +0 -6
  174. package/dist/native-cli-adapters-OLW3XX57.js +0 -6
  175. package/dist/ollama-adapter-OJQ3FKWK.js +0 -6
  176. package/dist/openai-adapter-XU46EN7B.js +0 -6
  177. package/dist/openai-adapter-XU46EN7B.js.map +0 -1
  178. package/dist/registry-AZ2LOHHJ.js +0 -6
  179. package/dist/registry-H7B3AHPQ.js +0 -5
  180. package/dist/server-manager-PTGBHCLS.js +0 -5
  181. package/dist/session-manager-XOMDMC77.js +0 -12
  182. package/dist/team-manager-HC4XGCFY.js +0 -11
  183. package/dist/tmux-manager-GPYZ3WQH.js +0 -6
  184. package/dist/tools-TSMXMHIF.js +0 -6
@@ -1,211 +0,0 @@
1
- import { SUPPORTED_MODELS } from './chunk-HCIHOHLX.js';
2
- import { ModelNotFoundError, AuthenticationError, RateLimitError } from './chunk-ZGOHARPV.js';
3
- import { logger } from './chunk-JAXXTYID.js';
4
- import { generateText, streamText } from 'ai';
5
- import { createGoogleGenerativeAI } from '@ai-sdk/google';
6
-
7
- var PROVIDER_NAME = "google";
8
- var GEMINI_MODELS = [
9
- "gemini-3-pro-preview",
10
- "gemini-3-flash-preview",
11
- "gemini-2.5-pro",
12
- "gemini-2.5-flash",
13
- "gemini-2.5-flash-lite"
14
- ];
15
- var CHARS_PER_TOKEN_ESTIMATE = 4;
16
- function convertTools(tools) {
17
- if (tools === void 0 || tools.length === 0) {
18
- return void 0;
19
- }
20
- const result = {};
21
- for (const tool of tools) {
22
- const properties = {};
23
- const required = [];
24
- for (const param of tool.parameters) {
25
- const prop = {
26
- type: param.type,
27
- description: param.description
28
- };
29
- if (param.enum !== void 0) {
30
- prop["enum"] = param.enum;
31
- }
32
- if (param.default !== void 0) {
33
- prop["default"] = param.default;
34
- }
35
- properties[param.name] = prop;
36
- if (param.required) {
37
- required.push(param.name);
38
- }
39
- }
40
- result[tool.name] = {
41
- description: tool.description,
42
- parameters: { type: "object", properties, required }
43
- };
44
- }
45
- return result;
46
- }
47
- function buildMessages(messages) {
48
- return messages.map((msg) => ({
49
- role: msg.role,
50
- content: msg.content
51
- }));
52
- }
53
- function computeCost(modelInfo, inputTokens, outputTokens) {
54
- return inputTokens / 1e6 * modelInfo.inputPricePerMToken + outputTokens / 1e6 * modelInfo.outputPricePerMToken;
55
- }
56
- function classifyError(error, model) {
57
- const message = error instanceof Error ? error.message : String(error);
58
- const lower = message.toLowerCase();
59
- if (lower.includes("401") || lower.includes("403") || lower.includes("unauthorized") || lower.includes("invalid api key")) {
60
- throw new AuthenticationError(PROVIDER_NAME, message);
61
- }
62
- if (lower.includes("429") || lower.includes("rate limit") || lower.includes("resource exhausted")) {
63
- const match = /(\d+)\s*s/i.exec(message);
64
- const retryMs = match?.[1] !== void 0 ? parseInt(match[1], 10) * 1e3 : 6e4;
65
- throw new RateLimitError(PROVIDER_NAME, retryMs);
66
- }
67
- if (lower.includes("model") && lower.includes("not found")) {
68
- throw new ModelNotFoundError(model);
69
- }
70
- throw error instanceof Error ? error : new Error(message);
71
- }
72
- var GeminiAdapter = class {
73
- name = PROVIDER_NAME;
74
- supportedModels = GEMINI_MODELS;
75
- google;
76
- constructor(options) {
77
- const apiKey = options?.apiKey ?? process.env["GOOGLE_API_KEY"];
78
- this.google = createGoogleGenerativeAI({
79
- ...apiKey !== void 0 ? { apiKey } : {},
80
- ...options?.baseUrl !== void 0 ? { baseURL: options.baseUrl } : {}
81
- });
82
- }
83
- async chat(request) {
84
- const modelInfo = this.getModelInfo(request.model);
85
- const messages = buildMessages(request.messages);
86
- const tools = convertTools(request.tools);
87
- try {
88
- const result = await generateText({
89
- model: this.google(request.model),
90
- messages,
91
- ...request.system !== void 0 ? { system: request.system } : {},
92
- tools,
93
- maxTokens: request.maxTokens ?? modelInfo.maxOutputTokens,
94
- ...request.temperature !== void 0 ? { temperature: request.temperature } : {}
95
- });
96
- const toolCalls = extractToolCalls(result);
97
- const inputTokens = result.usage?.promptTokens ?? 0;
98
- const outputTokens = result.usage?.completionTokens ?? 0;
99
- const usage = {
100
- inputTokens,
101
- outputTokens,
102
- totalTokens: inputTokens + outputTokens,
103
- costUsd: computeCost(modelInfo, inputTokens, outputTokens)
104
- };
105
- const responseMessage = {
106
- id: result.response?.id ?? crypto.randomUUID(),
107
- role: "assistant",
108
- content: result.text,
109
- model: request.model,
110
- provider: PROVIDER_NAME,
111
- toolCalls: toolCalls.length > 0 ? toolCalls : void 0,
112
- tokenUsage: usage,
113
- createdAt: /* @__PURE__ */ new Date()
114
- };
115
- return {
116
- id: result.response?.id ?? crypto.randomUUID(),
117
- model: request.model,
118
- provider: PROVIDER_NAME,
119
- message: responseMessage,
120
- usage,
121
- finishReason: mapFinishReason(result.finishReason)
122
- };
123
- } catch (error) {
124
- classifyError(error, request.model);
125
- }
126
- }
127
- async *stream(request) {
128
- const modelInfo = this.getModelInfo(request.model);
129
- const messages = buildMessages(request.messages);
130
- const tools = convertTools(request.tools);
131
- try {
132
- const result = streamText({
133
- model: this.google(request.model),
134
- messages,
135
- ...request.system !== void 0 ? { system: request.system } : {},
136
- tools,
137
- maxTokens: request.maxTokens ?? modelInfo.maxOutputTokens,
138
- ...request.temperature !== void 0 ? { temperature: request.temperature } : {}
139
- });
140
- for await (const part of result.fullStream) {
141
- if (part.type === "text-delta") {
142
- yield { type: "text", content: part.textDelta };
143
- } else if (part.type === "tool-call") {
144
- const toolCall = {
145
- id: part.toolCallId,
146
- name: part.toolName,
147
- arguments: part.args
148
- };
149
- yield { type: "tool_call", toolCall };
150
- } else if (part.type === "finish") {
151
- const inTok = part.usage?.promptTokens ?? 0;
152
- const outTok = part.usage?.completionTokens ?? 0;
153
- yield {
154
- type: "usage",
155
- usage: {
156
- inputTokens: inTok,
157
- outputTokens: outTok,
158
- totalTokens: inTok + outTok,
159
- costUsd: computeCost(modelInfo, inTok, outTok)
160
- }
161
- };
162
- } else if (part.type === "error") {
163
- const errMsg = part.error instanceof Error ? part.error.message : String(part.error);
164
- yield { type: "error", error: errMsg };
165
- }
166
- }
167
- yield { type: "done" };
168
- } catch (error) {
169
- const errMsg = error instanceof Error ? error.message : String(error);
170
- logger.error({ error: errMsg, model: request.model }, "Gemini stream error");
171
- yield { type: "error", error: errMsg };
172
- yield { type: "done" };
173
- }
174
- }
175
- async countTokens(text, _model) {
176
- return Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE);
177
- }
178
- getModelInfo(model) {
179
- const info = SUPPORTED_MODELS[model];
180
- if (info === void 0 || info.provider !== PROVIDER_NAME) {
181
- throw new ModelNotFoundError(model);
182
- }
183
- return info;
184
- }
185
- };
186
- function extractToolCalls(result) {
187
- if (result.toolCalls === void 0 || result.toolCalls.length === 0) {
188
- return [];
189
- }
190
- return result.toolCalls.map((tc) => ({
191
- id: tc.toolCallId,
192
- name: tc.toolName,
193
- arguments: tc.args
194
- }));
195
- }
196
- function mapFinishReason(reason) {
197
- switch (reason) {
198
- case "stop":
199
- return "stop";
200
- case "tool-calls":
201
- return "tool_calls";
202
- case "length":
203
- return "max_tokens";
204
- default:
205
- return "stop";
206
- }
207
- }
208
-
209
- export { GeminiAdapter };
210
- //# sourceMappingURL=chunk-UY2SYSEZ.js.map
211
- //# sourceMappingURL=chunk-UY2SYSEZ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/providers/gemini-adapter.ts"],"names":[],"mappings":";;;;;;AA0BA,IAAM,aAAA,GAA8B,QAAA;AAEpC,IAAM,aAAA,GAAmC;AAAA,EACvC,sBAAA;AAAA,EACA,wBAAA;AAAA,EACA,gBAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,wBAAA,GAA2B,CAAA;AAEjC,SAAS,aACP,KAAA,EAC0F;AAC1F,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAC7C,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,SAAuF,EAAC;AAC9F,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,aAAsC,EAAC;AAC7C,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,UAAA,EAAY;AACnC,MAAA,MAAM,IAAA,GAAgC;AAAA,QACpC,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,aAAa,KAAA,CAAM;AAAA,OACrB;AACA,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAW;AAC5B,QAAA,IAAA,CAAK,MAAM,IAAI,KAAA,CAAM,IAAA;AAAA,MACvB;AACA,MAAA,IAAI,KAAA,CAAM,YAAY,MAAA,EAAW;AAC/B,QAAA,IAAA,CAAK,SAAS,IAAI,KAAA,CAAM,OAAA;AAAA,MAC1B;AACA,MAAA,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AACzB,MAAA,IAAI,MAAM,QAAA,EAAU;AAClB,QAAA,QAAA,CAAS,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,MAC1B;AAAA,IACF;AACA,IAAA,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,GAAI;AAAA,MAClB,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAU,YAAY,QAAA;AAAS,KACrD;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,cACP,QAAA,EACe;AACf,EAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,IAC5B,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,SAAS,GAAA,CAAI;AAAA,GACf,CAAE,CAAA;AACJ;AAEA,SAAS,WAAA,CAAY,SAAA,EAAuB,WAAA,EAAqB,YAAA,EAA8B;AAC7F,EAAA,OACG,cAAc,GAAA,GAAa,SAAA,CAAU,mBAAA,GACrC,YAAA,GAAe,MAAa,SAAA,CAAU,oBAAA;AAE3C;AAEA,SAAS,aAAA,CAAc,OAAgB,KAAA,EAAsB;AAC3D,EAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,EAAA,MAAM,KAAA,GAAQ,QAAQ,WAAA,EAAY;AAClC,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,IAAK,MAAM,QAAA,CAAS,KAAK,CAAA,IAAK,KAAA,CAAM,SAAS,cAAc,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,iBAAiB,CAAA,EAAG;AACzH,IAAA,MAAM,IAAI,mBAAA,CAAoB,aAAA,EAAe,OAAO,CAAA;AAAA,EACtD;AACA,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,YAAY,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,oBAAoB,CAAA,EAAG;AACjG,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AACvC,IAAA,MAAM,OAAA,GAAU,KAAA,GAAQ,CAAC,CAAA,KAAM,MAAA,GAAY,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA,GAAO,GAAA;AAC3E,IAAA,MAAM,IAAI,cAAA,CAAe,aAAA,EAAe,OAAO,CAAA;AAAA,EACjD;AACA,EAAA,IAAI,MAAM,QAAA,CAAS,OAAO,KAAK,KAAA,CAAM,QAAA,CAAS,WAAW,CAAA,EAAG;AAC1D,IAAA,MAAM,IAAI,mBAAmB,KAAK,CAAA;AAAA,EACpC;AACA,EAAA,MAAM,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,MAAM,OAAO,CAAA;AAC1D;AAEO,IAAM,gBAAN,MAA8C;AAAA,EAC1C,IAAA,GAAO,aAAA;AAAA,EACP,eAAA,GAAkB,aAAA;AAAA,EACV,MAAA;AAAA,EAEjB,YAAY,OAAA,EAA4B;AACtC,IAAA,MAAM,MAAA,GAAS,OAAA,EAAS,MAAA,IAAU,OAAA,CAAQ,IAAI,gBAAgB,CAAA;AAC9D,IAAA,IAAA,CAAK,SAAS,wBAAA,CAAyB;AAAA,MACrC,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW,EAAC;AAAA,MACzC,GAAI,SAAS,OAAA,KAAY,MAAA,GAAY,EAAE,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAQ,GAAI;AAAC,KACtE,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,KAAK,OAAA,EAA+C;AACxD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA;AACjD,IAAA,MAAM,QAAA,GAAW,aAAA,CAAc,OAAA,CAAQ,QAAQ,CAAA;AAC/C,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa;AAAA,QAChC,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AAAA,QAChC,QAAA;AAAA,QACA,GAAI,QAAQ,MAAA,KAAW,KAAA,CAAA,GAAY,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO,GAAI,EAAC;AAAA,QACjE,KAAA;AAAA,QACA,SAAA,EAAW,OAAA,CAAQ,SAAA,IAAa,SAAA,CAAU,eAAA;AAAA,QAC1C,GAAI,QAAQ,WAAA,KAAgB,KAAA,CAAA,GAAY,EAAE,WAAA,EAAa,OAAA,CAAQ,WAAA,EAAY,GAAI;AAAC,OACjF,CAAA;AACD,MAAA,MAAM,SAAA,GAAY,iBAAiB,MAAM,CAAA;AACzC,MAAA,MAAM,WAAA,GAAc,MAAA,CAAO,KAAA,EAAO,YAAA,IAAgB,CAAA;AAClD,MAAA,MAAM,YAAA,GAAe,MAAA,CAAO,KAAA,EAAO,gBAAA,IAAoB,CAAA;AACvD,MAAA,MAAM,KAAA,GAAqB;AAAA,QACzB,WAAA;AAAA,QACA,YAAA;AAAA,QACA,aAAa,WAAA,GAAc,YAAA;AAAA,QAC3B,OAAA,EAAS,WAAA,CAAY,SAAA,EAAW,WAAA,EAAa,YAAY;AAAA,OAC3D;AACA,MAAA,MAAM,eAAA,GAAgC;AAAA,QACpC,EAAA,EAAI,MAAA,CAAO,QAAA,EAAU,EAAA,IAAM,OAAO,UAAA,EAAW;AAAA,QAC7C,IAAA,EAAM,WAAA;AAAA,QACN,SAAS,MAAA,CAAO,IAAA;AAAA,QAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,QAAA,EAAU,aAAA;AAAA,QACV,SAAA,EAAW,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,KAAA,CAAA;AAAA,QAC9C,UAAA,EAAY,KAAA;AAAA,QACZ,SAAA,sBAAe,IAAA;AAAK,OACtB;AACA,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,MAAA,CAAO,QAAA,EAAU,EAAA,IAAM,OAAO,UAAA,EAAW;AAAA,QAC7C,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,QAAA,EAAU,aAAA;AAAA,QACV,OAAA,EAAS,eAAA;AAAA,QACT,KAAA;AAAA,QACA,YAAA,EAAc,eAAA,CAAgB,MAAA,CAAO,YAAY;AAAA,OACnD;AAAA,IACF,SAAS,KAAA,EAAgB;AACvB,MAAA,aAAA,CAAc,KAAA,EAAO,QAAQ,KAAK,CAAA;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,OAAO,OAAO,OAAA,EAAoD;AAChE,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA;AACjD,IAAA,MAAM,QAAA,GAAW,aAAA,CAAc,OAAA,CAAQ,QAAQ,CAAA;AAC/C,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,UAAA,CAAW;AAAA,QACxB,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AAAA,QAChC,QAAA;AAAA,QACA,GAAI,QAAQ,MAAA,KAAW,KAAA,CAAA,GAAY,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO,GAAI,EAAC;AAAA,QACjE,KAAA;AAAA,QACA,SAAA,EAAW,OAAA,CAAQ,SAAA,IAAa,SAAA,CAAU,eAAA;AAAA,QAC1C,GAAI,QAAQ,WAAA,KAAgB,KAAA,CAAA,GAAY,EAAE,WAAA,EAAa,OAAA,CAAQ,WAAA,EAAY,GAAI;AAAC,OACjF,CAAA;AACD,MAAA,WAAA,MAAiB,IAAA,IAAQ,OAAO,UAAA,EAAY;AAC1C,QAAA,IAAI,IAAA,CAAK,SAAS,YAAA,EAAc;AAC9B,UAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,KAAK,SAAA,EAAU;AAAA,QAChD,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,WAAA,EAAa;AACpC,UAAA,MAAM,QAAA,GAAsB;AAAA,YAC1B,IAAI,IAAA,CAAK,UAAA;AAAA,YACT,MAAM,IAAA,CAAK,QAAA;AAAA,YACX,WAAW,IAAA,CAAK;AAAA,WAClB;AACA,UAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,QAAA,EAAS;AAAA,QACtC,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AACjC,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,EAAO,YAAA,IAAgB,CAAA;AAC1C,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,EAAO,gBAAA,IAAoB,CAAA;AAC/C,UAAA,MAAM;AAAA,YACJ,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO;AAAA,cACL,WAAA,EAAa,KAAA;AAAA,cACb,YAAA,EAAc,MAAA;AAAA,cACd,aAAa,KAAA,GAAQ,MAAA;AAAA,cACrB,OAAA,EAAS,WAAA,CAAY,SAAA,EAAW,KAAA,EAAO,MAAM;AAAA;AAC/C,WACF;AAAA,QACF,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAChC,UAAA,MAAM,MAAA,GAAS,KAAK,KAAA,YAAiB,KAAA,GAAQ,KAAK,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AACnF,UAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,MAAA,EAAO;AAAA,QACvC;AAAA,MACF;AACA,MAAA,MAAM,EAAE,MAAM,MAAA,EAAO;AAAA,IACvB,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACpE,MAAA,MAAA,CAAO,KAAA,CAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAO,OAAA,CAAQ,KAAA,IAAS,qBAAqB,CAAA;AAC3E,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,MAAA,EAAO;AACrC,MAAA,MAAM,EAAE,MAAM,MAAA,EAAO;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,CAAY,IAAA,EAAc,MAAA,EAAiC;AAC/D,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,wBAAwB,CAAA;AAAA,EACzD;AAAA,EAEA,aAAa,KAAA,EAA2B;AACtC,IAAA,MAAM,IAAA,GAAO,iBAAiB,KAAK,CAAA;AACnC,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,CAAK,QAAA,KAAa,aAAA,EAAe;AACzD,MAAA,MAAM,IAAI,mBAAmB,KAAK,CAAA;AAAA,IACpC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,iBACP,MAAA,EACa;AACb,EAAA,IAAI,OAAO,SAAA,KAAc,MAAA,IAAa,MAAA,CAAO,SAAA,CAAU,WAAW,CAAA,EAAG;AACnE,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,OAAO,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,IACnC,IAAI,EAAA,CAAG,UAAA;AAAA,IACP,MAAM,EAAA,CAAG,QAAA;AAAA,IACT,WAAW,EAAA,CAAG;AAAA,GAChB,CAAE,CAAA;AACJ;AAEA,SAAS,gBACP,MAAA,EACgD;AAChD,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,MAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,YAAA;AACH,MAAA,OAAO,YAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,YAAA;AAAA,IACT;AACE,MAAA,OAAO,MAAA;AAAA;AAEb","file":"chunk-UY2SYSEZ.js","sourcesContent":["/**\n * Gemini (Google) adapter via Vercel AI SDK per PRD section 7.1\n * Supports Gemini 2.5 Pro, Gemini 2.5 Flash\n */\n\nimport { generateText, streamText, type CoreMessage } from \"ai\";\nimport { createGoogleGenerativeAI } from \"@ai-sdk/google\";\nimport { logger } from \"../utils/logger.js\";\nimport {\n AuthenticationError,\n RateLimitError,\n ModelNotFoundError,\n} from \"../types/errors.js\";\nimport { SUPPORTED_MODELS } from \"../types/model.js\";\nimport type { IModelInfo, ProviderName } from \"../types/model.js\";\nimport type {\n IChatRequest,\n IChatResponse,\n IChatMessage,\n IStreamChunk,\n IToolCall,\n IToolDefinition,\n ITokenUsage,\n} from \"../types/message.js\";\nimport type { IModelProvider, IProviderOptions } from \"./types.js\";\n\nconst PROVIDER_NAME: ProviderName = \"google\";\n\nconst GEMINI_MODELS: readonly string[] = [\n \"gemini-3-pro-preview\",\n \"gemini-3-flash-preview\",\n \"gemini-2.5-pro\",\n \"gemini-2.5-flash\",\n \"gemini-2.5-flash-lite\",\n] as const;\n\nconst CHARS_PER_TOKEN_ESTIMATE = 4;\n\nfunction convertTools(\n tools: readonly IToolDefinition[] | undefined,\n): Record<string, { description: string; parameters: Record<string, unknown> }> | undefined {\n if (tools === undefined || tools.length === 0) {\n return undefined;\n }\n const result: Record<string, { description: string; parameters: Record<string, unknown> }> = {};\n for (const tool of tools) {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const param of tool.parameters) {\n const prop: Record<string, unknown> = {\n type: param.type,\n description: param.description,\n };\n if (param.enum !== undefined) {\n prop[\"enum\"] = param.enum;\n }\n if (param.default !== undefined) {\n prop[\"default\"] = param.default;\n }\n properties[param.name] = prop;\n if (param.required) {\n required.push(param.name);\n }\n }\n result[tool.name] = {\n description: tool.description,\n parameters: { type: \"object\", properties, required },\n };\n }\n return result;\n}\n\nfunction buildMessages(\n messages: readonly IChatMessage[],\n): CoreMessage[] {\n return messages.map((msg) => ({\n role: msg.role as \"user\" | \"assistant\" | \"system\" | \"tool\",\n content: msg.content,\n })) as CoreMessage[];\n}\n\nfunction computeCost(modelInfo: IModelInfo, inputTokens: number, outputTokens: number): number {\n return (\n (inputTokens / 1_000_000) * modelInfo.inputPricePerMToken +\n (outputTokens / 1_000_000) * modelInfo.outputPricePerMToken\n );\n}\n\nfunction classifyError(error: unknown, model: string): never {\n const message = error instanceof Error ? error.message : String(error);\n const lower = message.toLowerCase();\n if (lower.includes(\"401\") || lower.includes(\"403\") || lower.includes(\"unauthorized\") || lower.includes(\"invalid api key\")) {\n throw new AuthenticationError(PROVIDER_NAME, message);\n }\n if (lower.includes(\"429\") || lower.includes(\"rate limit\") || lower.includes(\"resource exhausted\")) {\n const match = /(\\d+)\\s*s/i.exec(message);\n const retryMs = match?.[1] !== undefined ? parseInt(match[1], 10) * 1000 : 60_000;\n throw new RateLimitError(PROVIDER_NAME, retryMs);\n }\n if (lower.includes(\"model\") && lower.includes(\"not found\")) {\n throw new ModelNotFoundError(model);\n }\n throw error instanceof Error ? error : new Error(message);\n}\n\nexport class GeminiAdapter implements IModelProvider {\n readonly name = PROVIDER_NAME;\n readonly supportedModels = GEMINI_MODELS;\n private readonly google: ReturnType<typeof createGoogleGenerativeAI>;\n\n constructor(options?: IProviderOptions) {\n const apiKey = options?.apiKey ?? process.env[\"GOOGLE_API_KEY\"];\n this.google = createGoogleGenerativeAI({\n ...(apiKey !== undefined ? { apiKey } : {}),\n ...(options?.baseUrl !== undefined ? { baseURL: options.baseUrl } : {}),\n });\n }\n\n async chat(request: IChatRequest): Promise<IChatResponse> {\n const modelInfo = this.getModelInfo(request.model);\n const messages = buildMessages(request.messages);\n const tools = convertTools(request.tools);\n try {\n const result = await generateText({\n model: this.google(request.model),\n messages,\n ...(request.system !== undefined ? { system: request.system } : {}),\n tools: tools as Record<string, never>,\n maxTokens: request.maxTokens ?? modelInfo.maxOutputTokens,\n ...(request.temperature !== undefined ? { temperature: request.temperature } : {}),\n });\n const toolCalls = extractToolCalls(result);\n const inputTokens = result.usage?.promptTokens ?? 0;\n const outputTokens = result.usage?.completionTokens ?? 0;\n const usage: ITokenUsage = {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n costUsd: computeCost(modelInfo, inputTokens, outputTokens),\n };\n const responseMessage: IChatMessage = {\n id: result.response?.id ?? crypto.randomUUID(),\n role: \"assistant\",\n content: result.text,\n model: request.model,\n provider: PROVIDER_NAME,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n tokenUsage: usage,\n createdAt: new Date(),\n };\n return {\n id: result.response?.id ?? crypto.randomUUID(),\n model: request.model,\n provider: PROVIDER_NAME,\n message: responseMessage,\n usage,\n finishReason: mapFinishReason(result.finishReason),\n };\n } catch (error: unknown) {\n classifyError(error, request.model);\n }\n }\n\n async *stream(request: IChatRequest): AsyncIterable<IStreamChunk> {\n const modelInfo = this.getModelInfo(request.model);\n const messages = buildMessages(request.messages);\n const tools = convertTools(request.tools);\n try {\n const result = streamText({\n model: this.google(request.model),\n messages,\n ...(request.system !== undefined ? { system: request.system } : {}),\n tools: tools as Record<string, never>,\n maxTokens: request.maxTokens ?? modelInfo.maxOutputTokens,\n ...(request.temperature !== undefined ? { temperature: request.temperature } : {}),\n });\n for await (const part of result.fullStream) {\n if (part.type === \"text-delta\") {\n yield { type: \"text\", content: part.textDelta };\n } else if (part.type === \"tool-call\") {\n const toolCall: IToolCall = {\n id: part.toolCallId,\n name: part.toolName,\n arguments: part.args as Record<string, unknown>,\n };\n yield { type: \"tool_call\", toolCall };\n } else if (part.type === \"finish\") {\n const inTok = part.usage?.promptTokens ?? 0;\n const outTok = part.usage?.completionTokens ?? 0;\n yield {\n type: \"usage\",\n usage: {\n inputTokens: inTok,\n outputTokens: outTok,\n totalTokens: inTok + outTok,\n costUsd: computeCost(modelInfo, inTok, outTok),\n },\n };\n } else if (part.type === \"error\") {\n const errMsg = part.error instanceof Error ? part.error.message : String(part.error);\n yield { type: \"error\", error: errMsg };\n }\n }\n yield { type: \"done\" };\n } catch (error: unknown) {\n const errMsg = error instanceof Error ? error.message : String(error);\n logger.error({ error: errMsg, model: request.model }, \"Gemini stream error\");\n yield { type: \"error\", error: errMsg };\n yield { type: \"done\" };\n }\n }\n\n async countTokens(text: string, _model: string): Promise<number> {\n return Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE);\n }\n\n getModelInfo(model: string): IModelInfo {\n const info = SUPPORTED_MODELS[model];\n if (info === undefined || info.provider !== PROVIDER_NAME) {\n throw new ModelNotFoundError(model);\n }\n return info;\n }\n}\n\nfunction extractToolCalls(\n result: { toolCalls?: ReadonlyArray<{ toolCallId: string; toolName: string; args: unknown }> },\n): IToolCall[] {\n if (result.toolCalls === undefined || result.toolCalls.length === 0) {\n return [];\n }\n return result.toolCalls.map((tc) => ({\n id: tc.toolCallId,\n name: tc.toolName,\n arguments: tc.args as Record<string, unknown>,\n }));\n}\n\nfunction mapFinishReason(\n reason: string | undefined,\n): \"stop\" | \"tool_calls\" | \"max_tokens\" | \"error\" {\n switch (reason) {\n case \"stop\":\n return \"stop\";\n case \"tool-calls\":\n return \"tool_calls\";\n case \"length\":\n return \"max_tokens\";\n default:\n return \"stop\";\n }\n}\n"]}
@@ -1,260 +0,0 @@
1
- import { SUPPORTED_MODELS } from './chunk-HCIHOHLX.js';
2
- import { ModelNotFoundError, AuthenticationError, RateLimitError } from './chunk-ZGOHARPV.js';
3
- import { logger } from './chunk-JAXXTYID.js';
4
- import { generateText, streamText } from 'ai';
5
- import { createAnthropic } from '@ai-sdk/anthropic';
6
-
7
- var PROVIDER_NAME = "anthropic";
8
- var CLAUDE_MODELS = [
9
- "claude-opus-4-6",
10
- "claude-opus-4-6-1m",
11
- "claude-sonnet-4-6",
12
- "claude-sonnet-4-6-1m",
13
- "claude-haiku-4-5"
14
- ];
15
- var CHARS_PER_TOKEN_ESTIMATE = 4;
16
- function mapRole(role) {
17
- switch (role) {
18
- case "user":
19
- return "user";
20
- case "assistant":
21
- return "assistant";
22
- case "system":
23
- return "system";
24
- case "tool":
25
- return "tool";
26
- default:
27
- return "user";
28
- }
29
- }
30
- function convertTools(tools) {
31
- if (tools === void 0 || tools.length === 0) {
32
- return void 0;
33
- }
34
- const result = {};
35
- for (const tool of tools) {
36
- const properties = {};
37
- const required = [];
38
- for (const param of tool.parameters) {
39
- const prop = {
40
- type: param.type,
41
- description: param.description
42
- };
43
- if (param.enum !== void 0) {
44
- prop["enum"] = param.enum;
45
- }
46
- if (param.default !== void 0) {
47
- prop["default"] = param.default;
48
- }
49
- properties[param.name] = prop;
50
- if (param.required) {
51
- required.push(param.name);
52
- }
53
- }
54
- result[tool.name] = {
55
- description: tool.description,
56
- parameters: {
57
- type: "object",
58
- properties,
59
- required
60
- }
61
- };
62
- }
63
- return result;
64
- }
65
- function buildMessages(messages) {
66
- return messages.map((msg) => {
67
- if (msg.role === "assistant" && msg.toolCalls !== void 0 && msg.toolCalls.length > 0) {
68
- const parts = [];
69
- if (msg.content.length > 0) {
70
- parts.push({ type: "text", text: msg.content });
71
- }
72
- for (const tc of msg.toolCalls) {
73
- parts.push({
74
- type: "tool-call",
75
- toolCallId: tc.id,
76
- toolName: tc.name,
77
- args: tc.arguments
78
- });
79
- }
80
- return { role: "assistant", content: parts };
81
- }
82
- if (msg.role === "tool" && msg.toolCalls !== void 0 && msg.toolCalls.length > 0) {
83
- const firstCall = msg.toolCalls[0];
84
- if (firstCall !== void 0) {
85
- return {
86
- role: "tool",
87
- content: [{
88
- type: "tool-result",
89
- toolCallId: firstCall.id,
90
- toolName: firstCall.name,
91
- result: msg.content
92
- }]
93
- };
94
- }
95
- }
96
- return {
97
- role: mapRole(msg.role),
98
- content: msg.content
99
- };
100
- });
101
- }
102
- function computeCost(modelInfo, inputTokens, outputTokens) {
103
- return inputTokens / 1e6 * modelInfo.inputPricePerMToken + outputTokens / 1e6 * modelInfo.outputPricePerMToken;
104
- }
105
- function classifyError(error, model) {
106
- const message = error instanceof Error ? error.message : String(error);
107
- const lower = message.toLowerCase();
108
- if (lower.includes("401") || lower.includes("unauthorized") || lower.includes("invalid api key")) {
109
- throw new AuthenticationError(PROVIDER_NAME, message);
110
- }
111
- if (lower.includes("429") || lower.includes("rate limit") || lower.includes("too many requests")) {
112
- const match = /(\d+)\s*s/i.exec(message);
113
- const retryMs = match?.[1] !== void 0 ? parseInt(match[1], 10) * 1e3 : 6e4;
114
- throw new RateLimitError(PROVIDER_NAME, retryMs);
115
- }
116
- if (lower.includes("model") && lower.includes("not found")) {
117
- throw new ModelNotFoundError(model);
118
- }
119
- throw error instanceof Error ? error : new Error(message);
120
- }
121
- var ClaudeAdapter = class {
122
- name = PROVIDER_NAME;
123
- supportedModels = CLAUDE_MODELS;
124
- anthropic;
125
- constructor(options) {
126
- const apiKey = options?.apiKey ?? process.env["ANTHROPIC_API_KEY"];
127
- this.anthropic = createAnthropic({
128
- ...apiKey !== void 0 ? { apiKey } : {},
129
- ...options?.baseUrl !== void 0 ? { baseURL: options.baseUrl } : {}
130
- });
131
- }
132
- async chat(request) {
133
- const modelInfo = this.getModelInfo(request.model);
134
- const messages = buildMessages(request.messages);
135
- const tools = convertTools(request.tools);
136
- try {
137
- const result = await generateText({
138
- model: this.anthropic(request.model),
139
- messages,
140
- ...request.system !== void 0 ? { system: request.system } : {},
141
- tools,
142
- maxTokens: request.maxTokens ?? modelInfo.maxOutputTokens,
143
- ...request.temperature !== void 0 ? { temperature: request.temperature } : {}
144
- });
145
- const toolCalls = extractToolCalls(result);
146
- const inputTokens = result.usage?.promptTokens ?? 0;
147
- const outputTokens = result.usage?.completionTokens ?? 0;
148
- const usage = {
149
- inputTokens,
150
- outputTokens,
151
- totalTokens: inputTokens + outputTokens,
152
- costUsd: computeCost(modelInfo, inputTokens, outputTokens)
153
- };
154
- const responseMessage = {
155
- id: result.response?.id ?? crypto.randomUUID(),
156
- role: "assistant",
157
- content: result.text,
158
- model: request.model,
159
- provider: PROVIDER_NAME,
160
- toolCalls: toolCalls.length > 0 ? toolCalls : void 0,
161
- tokenUsage: usage,
162
- createdAt: /* @__PURE__ */ new Date()
163
- };
164
- return {
165
- id: result.response?.id ?? crypto.randomUUID(),
166
- model: request.model,
167
- provider: PROVIDER_NAME,
168
- message: responseMessage,
169
- usage,
170
- finishReason: mapFinishReason(result.finishReason)
171
- };
172
- } catch (error) {
173
- classifyError(error, request.model);
174
- }
175
- }
176
- async *stream(request) {
177
- const modelInfo = this.getModelInfo(request.model);
178
- const messages = buildMessages(request.messages);
179
- const tools = convertTools(request.tools);
180
- try {
181
- const result = streamText({
182
- model: this.anthropic(request.model),
183
- messages,
184
- ...request.system !== void 0 ? { system: request.system } : {},
185
- tools,
186
- maxTokens: request.maxTokens ?? modelInfo.maxOutputTokens,
187
- ...request.temperature !== void 0 ? { temperature: request.temperature } : {}
188
- });
189
- for await (const part of result.fullStream) {
190
- if (part.type === "text-delta") {
191
- yield { type: "text", content: part.textDelta };
192
- } else if (part.type === "tool-call") {
193
- const toolCall = {
194
- id: part.toolCallId,
195
- name: part.toolName,
196
- arguments: part.args
197
- };
198
- yield { type: "tool_call", toolCall };
199
- } else if (part.type === "finish") {
200
- const inputTokens = part.usage?.promptTokens ?? 0;
201
- const outputTokens = part.usage?.completionTokens ?? 0;
202
- const usage = {
203
- inputTokens,
204
- outputTokens,
205
- totalTokens: inputTokens + outputTokens,
206
- costUsd: computeCost(modelInfo, inputTokens, outputTokens)
207
- };
208
- yield { type: "usage", usage };
209
- } else if (part.type === "error") {
210
- const errMsg = part.error instanceof Error ? part.error.message : String(part.error);
211
- yield { type: "error", error: errMsg };
212
- }
213
- }
214
- yield { type: "done" };
215
- } catch (error) {
216
- const errMsg = error instanceof Error ? error.message : String(error);
217
- logger.error({ error: errMsg, model: request.model }, "Claude stream error");
218
- yield { type: "error", error: errMsg };
219
- yield { type: "done" };
220
- }
221
- }
222
- async countTokens(text, _model) {
223
- return Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE);
224
- }
225
- getModelInfo(model) {
226
- const info = SUPPORTED_MODELS[model];
227
- if (info === void 0 || info.provider !== PROVIDER_NAME) {
228
- throw new ModelNotFoundError(model);
229
- }
230
- return info;
231
- }
232
- };
233
- function extractToolCalls(result) {
234
- if (result.toolCalls === void 0 || result.toolCalls.length === 0) {
235
- return [];
236
- }
237
- return result.toolCalls.map((tc) => ({
238
- id: tc.toolCallId,
239
- name: tc.toolName,
240
- arguments: tc.args
241
- }));
242
- }
243
- function mapFinishReason(reason) {
244
- switch (reason) {
245
- case "stop":
246
- case "end-turn":
247
- return "stop";
248
- case "tool-calls":
249
- return "tool_calls";
250
- case "length":
251
- case "max-tokens":
252
- return "max_tokens";
253
- default:
254
- return "stop";
255
- }
256
- }
257
-
258
- export { ClaudeAdapter };
259
- //# sourceMappingURL=chunk-WAHVZH7V.js.map
260
- //# sourceMappingURL=chunk-WAHVZH7V.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/providers/claude-adapter.ts"],"names":[],"mappings":"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","file":"chunk-WAHVZH7V.js","sourcesContent":["/**\n * Claude (Anthropic) adapter via Vercel AI SDK per PRD section 7.1\n * Supports Claude Opus 4.6, Sonnet 4.6, Haiku 4.5\n */\n\nimport { generateText, streamText, type CoreMessage } from \"ai\";\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { logger } from \"../utils/logger.js\";\nimport {\n AuthenticationError,\n RateLimitError,\n ModelNotFoundError,\n} from \"../types/errors.js\";\nimport { SUPPORTED_MODELS } from \"../types/model.js\";\nimport type { IModelInfo, ProviderName } from \"../types/model.js\";\nimport type {\n IChatRequest,\n IChatResponse,\n IChatMessage,\n IStreamChunk,\n IToolCall,\n IToolDefinition,\n ITokenUsage,\n} from \"../types/message.js\";\nimport type { IModelProvider, IProviderOptions } from \"./types.js\";\n\nconst PROVIDER_NAME: ProviderName = \"anthropic\";\n\nconst CLAUDE_MODELS: readonly string[] = [\n \"claude-opus-4-6\",\n \"claude-opus-4-6-1m\",\n \"claude-sonnet-4-6\",\n \"claude-sonnet-4-6-1m\",\n \"claude-haiku-4-5\",\n] as const;\n\nconst CHARS_PER_TOKEN_ESTIMATE = 4;\n\nfunction mapRole(role: string): \"user\" | \"assistant\" | \"system\" | \"tool\" {\n switch (role) {\n case \"user\":\n return \"user\";\n case \"assistant\":\n return \"assistant\";\n case \"system\":\n return \"system\";\n case \"tool\":\n return \"tool\";\n default:\n return \"user\";\n }\n}\n\nfunction convertTools(\n tools: readonly IToolDefinition[] | undefined,\n): Record<string, { description: string; parameters: Record<string, unknown> }> | undefined {\n if (tools === undefined || tools.length === 0) {\n return undefined;\n }\n\n const result: Record<string, { description: string; parameters: Record<string, unknown> }> = {};\n\n for (const tool of tools) {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const param of tool.parameters) {\n const prop: Record<string, unknown> = {\n type: param.type,\n description: param.description,\n };\n if (param.enum !== undefined) {\n prop[\"enum\"] = param.enum;\n }\n if (param.default !== undefined) {\n prop[\"default\"] = param.default;\n }\n properties[param.name] = prop;\n if (param.required) {\n required.push(param.name);\n }\n }\n\n result[tool.name] = {\n description: tool.description,\n parameters: {\n type: \"object\",\n properties,\n required,\n },\n };\n }\n\n return result;\n}\n\nfunction buildMessages(\n messages: readonly IChatMessage[],\n): CoreMessage[] {\n return messages.map((msg) => {\n // Assistant message with tool calls → multi-part content\n if (msg.role === \"assistant\" && msg.toolCalls !== undefined && msg.toolCalls.length > 0) {\n const parts: unknown[] = [];\n if (msg.content.length > 0) {\n parts.push({ type: \"text\", text: msg.content });\n }\n for (const tc of msg.toolCalls) {\n parts.push({\n type: \"tool-call\",\n toolCallId: tc.id,\n toolName: tc.name,\n args: tc.arguments,\n });\n }\n return { role: \"assistant\" as const, content: parts };\n }\n\n // Tool result message — toolCalls[0] carries the call metadata\n if (msg.role === \"tool\" && msg.toolCalls !== undefined && msg.toolCalls.length > 0) {\n const firstCall = msg.toolCalls[0];\n if (firstCall !== undefined) {\n return {\n role: \"tool\" as const,\n content: [{\n type: \"tool-result\" as const,\n toolCallId: firstCall.id,\n toolName: firstCall.name,\n result: msg.content,\n }],\n };\n }\n }\n\n // Standard text message\n return {\n role: mapRole(msg.role),\n content: msg.content,\n };\n }) as CoreMessage[];\n}\n\nfunction computeCost(modelInfo: IModelInfo, inputTokens: number, outputTokens: number): number {\n return (\n (inputTokens / 1_000_000) * modelInfo.inputPricePerMToken +\n (outputTokens / 1_000_000) * modelInfo.outputPricePerMToken\n );\n}\n\nfunction classifyError(error: unknown, model: string): never {\n const message = error instanceof Error ? error.message : String(error);\n const lower = message.toLowerCase();\n\n if (lower.includes(\"401\") || lower.includes(\"unauthorized\") || lower.includes(\"invalid api key\")) {\n throw new AuthenticationError(PROVIDER_NAME, message);\n }\n if (lower.includes(\"429\") || lower.includes(\"rate limit\") || lower.includes(\"too many requests\")) {\n const match = /(\\d+)\\s*s/i.exec(message);\n const retryMs = match?.[1] !== undefined ? parseInt(match[1], 10) * 1000 : 60_000;\n throw new RateLimitError(PROVIDER_NAME, retryMs);\n }\n if (lower.includes(\"model\") && lower.includes(\"not found\")) {\n throw new ModelNotFoundError(model);\n }\n\n throw error instanceof Error ? error : new Error(message);\n}\n\nexport class ClaudeAdapter implements IModelProvider {\n readonly name = PROVIDER_NAME;\n readonly supportedModels = CLAUDE_MODELS;\n\n private readonly anthropic: ReturnType<typeof createAnthropic>;\n\n constructor(options?: IProviderOptions) {\n const apiKey = options?.apiKey ?? process.env[\"ANTHROPIC_API_KEY\"];\n this.anthropic = createAnthropic({\n ...(apiKey !== undefined ? { apiKey } : {}),\n ...(options?.baseUrl !== undefined ? { baseURL: options.baseUrl } : {}),\n });\n }\n\n async chat(request: IChatRequest): Promise<IChatResponse> {\n const modelInfo = this.getModelInfo(request.model);\n const messages = buildMessages(request.messages);\n const tools = convertTools(request.tools);\n\n try {\n const result = await generateText({\n model: this.anthropic(request.model),\n messages,\n ...(request.system !== undefined ? { system: request.system } : {}),\n tools: tools as Record<string, never>,\n maxTokens: request.maxTokens ?? modelInfo.maxOutputTokens,\n ...(request.temperature !== undefined ? { temperature: request.temperature } : {}),\n });\n\n const toolCalls = extractToolCalls(result);\n const inputTokens = result.usage?.promptTokens ?? 0;\n const outputTokens = result.usage?.completionTokens ?? 0;\n\n const usage: ITokenUsage = {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n costUsd: computeCost(modelInfo, inputTokens, outputTokens),\n };\n\n const responseMessage: IChatMessage = {\n id: result.response?.id ?? crypto.randomUUID(),\n role: \"assistant\",\n content: result.text,\n model: request.model,\n provider: PROVIDER_NAME,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n tokenUsage: usage,\n createdAt: new Date(),\n };\n\n return {\n id: result.response?.id ?? crypto.randomUUID(),\n model: request.model,\n provider: PROVIDER_NAME,\n message: responseMessage,\n usage,\n finishReason: mapFinishReason(result.finishReason),\n };\n } catch (error: unknown) {\n classifyError(error, request.model);\n }\n }\n\n async *stream(request: IChatRequest): AsyncIterable<IStreamChunk> {\n const modelInfo = this.getModelInfo(request.model);\n const messages = buildMessages(request.messages);\n const tools = convertTools(request.tools);\n\n try {\n const result = streamText({\n model: this.anthropic(request.model),\n messages,\n ...(request.system !== undefined ? { system: request.system } : {}),\n tools: tools as Record<string, never>,\n maxTokens: request.maxTokens ?? modelInfo.maxOutputTokens,\n ...(request.temperature !== undefined ? { temperature: request.temperature } : {}),\n });\n\n for await (const part of result.fullStream) {\n if (part.type === \"text-delta\") {\n yield { type: \"text\", content: part.textDelta };\n } else if (part.type === \"tool-call\") {\n const toolCall: IToolCall = {\n id: part.toolCallId,\n name: part.toolName,\n arguments: part.args as Record<string, unknown>,\n };\n yield { type: \"tool_call\", toolCall };\n } else if (part.type === \"finish\") {\n const inputTokens = part.usage?.promptTokens ?? 0;\n const outputTokens = part.usage?.completionTokens ?? 0;\n const usage: ITokenUsage = {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n costUsd: computeCost(modelInfo, inputTokens, outputTokens),\n };\n yield { type: \"usage\", usage };\n } else if (part.type === \"error\") {\n const errMsg = part.error instanceof Error ? part.error.message : String(part.error);\n yield { type: \"error\", error: errMsg };\n }\n }\n\n yield { type: \"done\" };\n } catch (error: unknown) {\n const errMsg = error instanceof Error ? error.message : String(error);\n logger.error({ error: errMsg, model: request.model }, \"Claude stream error\");\n yield { type: \"error\", error: errMsg };\n yield { type: \"done\" };\n }\n }\n\n async countTokens(text: string, _model: string): Promise<number> {\n return Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE);\n }\n\n getModelInfo(model: string): IModelInfo {\n const info = SUPPORTED_MODELS[model];\n if (info === undefined || info.provider !== PROVIDER_NAME) {\n throw new ModelNotFoundError(model);\n }\n return info;\n }\n}\n\nfunction extractToolCalls(\n result: { toolCalls?: ReadonlyArray<{ toolCallId: string; toolName: string; args: unknown }> },\n): IToolCall[] {\n if (result.toolCalls === undefined || result.toolCalls.length === 0) {\n return [];\n }\n return result.toolCalls.map((tc) => ({\n id: tc.toolCallId,\n name: tc.toolName,\n arguments: tc.args as Record<string, unknown>,\n }));\n}\n\nfunction mapFinishReason(\n reason: string | undefined,\n): \"stop\" | \"tool_calls\" | \"max_tokens\" | \"error\" {\n switch (reason) {\n case \"stop\":\n case \"end-turn\":\n return \"stop\";\n case \"tool-calls\":\n return \"tool_calls\";\n case \"length\":\n case \"max-tokens\":\n return \"max_tokens\";\n default:\n return \"stop\";\n }\n}\n"]}