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.
- package/LICENSE +21 -0
- package/README.md +66 -54
- package/dist/App-JQ622M66.js +4431 -0
- package/dist/App-JQ622M66.js.map +1 -0
- package/dist/agent-store/architect.md +32 -0
- package/dist/agent-store/debugger.md +32 -0
- package/dist/agent-store/developer.md +29 -0
- package/dist/agent-store/documenter.md +30 -0
- package/dist/agent-store/researcher.md +31 -0
- package/dist/agent-store/reviewer.md +28 -0
- package/dist/agent-store/supervisor.md +37 -0
- package/dist/agent-store/tester.md +30 -0
- package/dist/api-key-fallback-RJLPM3KH.js +11 -0
- package/dist/{api-key-fallback-YQQBOQIL.js.map → api-key-fallback-RJLPM3KH.js.map} +1 -1
- package/dist/auth-status-JQJOKUPF.js +13 -0
- package/dist/auth-status-JQJOKUPF.js.map +1 -0
- package/dist/{chunk-RWCNNAL7.js → chunk-2KMA5RBC.js} +25 -48
- package/dist/chunk-2KMA5RBC.js.map +1 -0
- package/dist/{chunk-CYQNBB25.js → chunk-2Y7TR6BS.js} +28 -5
- package/dist/chunk-2Y7TR6BS.js.map +1 -0
- package/dist/{chunk-DAHGLHNR.js → chunk-2ZYK5IJG.js} +6 -141
- package/dist/chunk-2ZYK5IJG.js.map +1 -0
- package/dist/chunk-36RXCZOV.js +88 -0
- package/dist/chunk-36RXCZOV.js.map +1 -0
- package/dist/{chunk-DMBPX3RG.js → chunk-7EBLXPL4.js} +9 -9
- package/dist/{chunk-DMBPX3RG.js.map → chunk-7EBLXPL4.js.map} +1 -1
- package/dist/chunk-BIMQL4AG.js +186 -0
- package/dist/chunk-BIMQL4AG.js.map +1 -0
- package/dist/{chunk-NBR3GHMT.js → chunk-D275MCIH.js} +39 -7
- package/dist/chunk-D275MCIH.js.map +1 -0
- package/dist/{chunk-Y5XVD2CD.js → chunk-FFS4T7BZ.js} +109 -82
- package/dist/chunk-FFS4T7BZ.js.map +1 -0
- package/dist/{chunk-CARHU3DO.js → chunk-GXAJGP2T.js} +64 -16
- package/dist/chunk-GXAJGP2T.js.map +1 -0
- package/dist/{chunk-I5PZ4JTS.js → chunk-HESQLCLU.js} +4 -4
- package/dist/{chunk-I5PZ4JTS.js.map → chunk-HESQLCLU.js.map} +1 -1
- package/dist/{chunk-JAXXTYID.js → chunk-IR5HLBMH.js} +2 -2
- package/dist/{chunk-JAXXTYID.js.map → chunk-IR5HLBMH.js.map} +1 -1
- package/dist/{chunk-MFBHNWGV.js → chunk-K2FCMRXH.js} +11 -19
- package/dist/chunk-K2FCMRXH.js.map +1 -0
- package/dist/{chunk-H66O5Z2V.js → chunk-KIC7UI5U.js} +41 -6
- package/dist/chunk-KIC7UI5U.js.map +1 -0
- package/dist/{chunk-MXZSI3AY.js → chunk-KMOAJRDE.js} +42 -10
- package/dist/chunk-KMOAJRDE.js.map +1 -0
- package/dist/chunk-LQBALETG.js +71 -0
- package/dist/chunk-LQBALETG.js.map +1 -0
- package/dist/chunk-M3FPQSRU.js +12 -0
- package/dist/chunk-M3FPQSRU.js.map +1 -0
- package/dist/chunk-NQEUK763.js +26 -0
- package/dist/chunk-NQEUK763.js.map +1 -0
- package/dist/chunk-OPWAFS6Y.js +38 -0
- package/dist/chunk-OPWAFS6Y.js.map +1 -0
- package/dist/{chunk-6PDJ45T4.js → chunk-PS4WEFW6.js} +50 -25
- package/dist/chunk-PS4WEFW6.js.map +1 -0
- package/dist/{chunk-HMJRPNPZ.js → chunk-QK7TKNHV.js} +93 -21
- package/dist/chunk-QK7TKNHV.js.map +1 -0
- package/dist/{chunk-LSOYPSAT.js → chunk-RADJSEG5.js} +4 -4
- package/dist/chunk-RADJSEG5.js.map +1 -0
- package/dist/{chunk-4IJD72YB.js → chunk-SNWPI6XJ.js} +7 -7
- package/dist/chunk-SNWPI6XJ.js.map +1 -0
- package/dist/{chunk-TEVZS4FA.js → chunk-UM7MSLOV.js} +16 -9
- package/dist/chunk-UM7MSLOV.js.map +1 -0
- package/dist/chunk-VNZ3YTQD.js +232 -0
- package/dist/chunk-VNZ3YTQD.js.map +1 -0
- package/dist/{chunk-IYW62KKR.js → chunk-WXIN65UG.js} +66 -23
- package/dist/chunk-WXIN65UG.js.map +1 -0
- package/dist/chunk-XEXWX7C7.js +241 -0
- package/dist/chunk-XEXWX7C7.js.map +1 -0
- package/dist/{chunk-CGEV3ARR.js → chunk-YCCYXDW7.js} +3 -3
- package/dist/chunk-YCCYXDW7.js.map +1 -0
- package/dist/chunk-YPQ2MLAV.js +140 -0
- package/dist/chunk-YPQ2MLAV.js.map +1 -0
- package/dist/chunk-ZCOVMVK4.js +26 -0
- package/dist/chunk-ZCOVMVK4.js.map +1 -0
- package/dist/{claude-login-5WELXPKT.js → claude-login-AIFIWTYF.js} +9 -9
- package/dist/{claude-login-5WELXPKT.js.map → claude-login-AIFIWTYF.js.map} +1 -1
- package/dist/cli.js +370 -171
- package/dist/cli.js.map +1 -1
- package/dist/{codex-login-GZIFXUWD.js → codex-login-LW5X7GAM.js} +10 -10
- package/dist/codex-login-LW5X7GAM.js.map +1 -0
- package/dist/config-store-NF56VHFU.js +7 -0
- package/dist/{config-store-W6FBCQAQ.js.map → config-store-NF56VHFU.js.map} +1 -1
- package/dist/conversation-store-7GRDQZD2.js +4 -0
- package/dist/conversation-store-7GRDQZD2.js.map +1 -0
- package/dist/detect-providers-QICJ5U3R.js +4 -0
- package/dist/detect-providers-QICJ5U3R.js.map +1 -0
- package/dist/executor-FTABX2AW.js +4 -0
- package/dist/{executor-6RIKIGXK.js.map → executor-FTABX2AW.js.map} +1 -1
- package/dist/first-run-ADROZVYF.js +230 -0
- package/dist/first-run-ADROZVYF.js.map +1 -0
- package/dist/{gemini-login-AZGL3CE7.js → gemini-login-TST454MX.js} +9 -9
- package/dist/{gemini-login-AZGL3CE7.js.map → gemini-login-TST454MX.js.map} +1 -1
- package/dist/index.d.ts +46 -70
- package/dist/index.js +79 -468
- package/dist/index.js.map +1 -1
- package/dist/input-history-BEICE7PT.js +57 -0
- package/dist/input-history-BEICE7PT.js.map +1 -0
- package/dist/kimi-adapter-7FYOAKOI.js +6 -0
- package/dist/{kimi-adapter-JN4HFFHU.js.map → kimi-adapter-7FYOAKOI.js.map} +1 -1
- package/dist/{kimi-login-6LUWB7P6.js → kimi-login-3IGVOBJI.js} +9 -9
- package/dist/{kimi-login-6LUWB7P6.js.map → kimi-login-3IGVOBJI.js.map} +1 -1
- package/dist/logger-KGHUQ4VE.js +3 -0
- package/dist/logger-KGHUQ4VE.js.map +1 -0
- package/dist/model-discovery-AAJDHRFO.js +6 -0
- package/dist/model-discovery-AAJDHRFO.js.map +1 -0
- package/dist/native-cli-adapters-CLONTZOA.js +8 -0
- package/dist/{native-cli-adapters-OLW3XX57.js.map → native-cli-adapters-CLONTZOA.js.map} +1 -1
- package/dist/ollama-adapter-2N5OQIEV.js +5 -0
- package/dist/{ollama-adapter-OJQ3FKWK.js.map → ollama-adapter-2N5OQIEV.js.map} +1 -1
- package/dist/pathResolver-UVAB2FCW.js +3 -0
- package/dist/pathResolver-UVAB2FCW.js.map +1 -0
- package/dist/profile-loader-EMLV4J7S.js +162 -0
- package/dist/profile-loader-EMLV4J7S.js.map +1 -0
- package/dist/registry-LRURZVUL.js +5 -0
- package/dist/{registry-AZ2LOHHJ.js.map → registry-LRURZVUL.js.map} +1 -1
- package/dist/registry-MVNSXCEF.js +6 -0
- package/dist/{registry-H7B3AHPQ.js.map → registry-MVNSXCEF.js.map} +1 -1
- package/dist/server-manager-THGZBBZB.js +5 -0
- package/dist/{server-manager-PTGBHCLS.js.map → server-manager-THGZBBZB.js.map} +1 -1
- package/dist/session-manager-X3DXT53M.js +12 -0
- package/dist/{session-manager-XOMDMC77.js.map → session-manager-X3DXT53M.js.map} +1 -1
- package/dist/skills/built-in/code-review/SKILL.md +85 -0
- package/dist/skills/built-in/commit/SKILL.md +83 -0
- package/dist/skills/built-in/debug/SKILL.md +119 -0
- package/dist/skills/built-in/plan/SKILL.md +123 -0
- package/dist/skills/built-in/refactor/SKILL.md +132 -0
- package/dist/skills/built-in/test/SKILL.md +128 -0
- package/dist/sqlite-store-7OECRTXM.js +5 -0
- package/dist/sqlite-store-7OECRTXM.js.map +1 -0
- package/dist/team-manager-2VSMALAA.js +11 -0
- package/dist/{team-manager-HC4XGCFY.js.map → team-manager-2VSMALAA.js.map} +1 -1
- package/dist/team-state-HZNVMQHT.js +3 -0
- package/dist/team-state-HZNVMQHT.js.map +1 -0
- package/dist/tmux-manager-57QCUVHU.js +6 -0
- package/dist/{tmux-manager-GPYZ3WQH.js.map → tmux-manager-57QCUVHU.js.map} +1 -1
- package/dist/tools-KWFSYT56.js +6 -0
- package/dist/{tools-TSMXMHIF.js.map → tools-KWFSYT56.js.map} +1 -1
- package/package.json +11 -11
- package/dist/App-FKRSMFMB.js +0 -2789
- package/dist/App-FKRSMFMB.js.map +0 -1
- package/dist/api-key-fallback-YQQBOQIL.js +0 -11
- package/dist/chunk-4IJD72YB.js.map +0 -1
- package/dist/chunk-6PDJ45T4.js.map +0 -1
- package/dist/chunk-CARHU3DO.js.map +0 -1
- package/dist/chunk-CGEV3ARR.js.map +0 -1
- package/dist/chunk-CS5X3BWX.js +0 -27
- package/dist/chunk-CS5X3BWX.js.map +0 -1
- package/dist/chunk-CYQNBB25.js.map +0 -1
- package/dist/chunk-DAHGLHNR.js.map +0 -1
- package/dist/chunk-H66O5Z2V.js.map +0 -1
- package/dist/chunk-HMJRPNPZ.js.map +0 -1
- package/dist/chunk-IYW62KKR.js.map +0 -1
- package/dist/chunk-LSOYPSAT.js.map +0 -1
- package/dist/chunk-MFBHNWGV.js.map +0 -1
- package/dist/chunk-MXZSI3AY.js.map +0 -1
- package/dist/chunk-NBR3GHMT.js.map +0 -1
- package/dist/chunk-RWCNNAL7.js.map +0 -1
- package/dist/chunk-TEVZS4FA.js.map +0 -1
- package/dist/chunk-UY2SYSEZ.js +0 -211
- package/dist/chunk-UY2SYSEZ.js.map +0 -1
- package/dist/chunk-WAHVZH7V.js +0 -260
- package/dist/chunk-WAHVZH7V.js.map +0 -1
- package/dist/chunk-WPP3PEDE.js +0 -234
- package/dist/chunk-WPP3PEDE.js.map +0 -1
- package/dist/chunk-Y5XVD2CD.js.map +0 -1
- package/dist/claude-adapter-QMLFMSP3.js +0 -6
- package/dist/claude-adapter-QMLFMSP3.js.map +0 -1
- package/dist/codex-login-GZIFXUWD.js.map +0 -1
- package/dist/config-store-W6FBCQAQ.js +0 -6
- package/dist/executor-6RIKIGXK.js +0 -4
- package/dist/gemini-adapter-6JIHZ7WI.js +0 -6
- package/dist/gemini-adapter-6JIHZ7WI.js.map +0 -1
- package/dist/kimi-adapter-JN4HFFHU.js +0 -6
- package/dist/native-cli-adapters-OLW3XX57.js +0 -6
- package/dist/ollama-adapter-OJQ3FKWK.js +0 -6
- package/dist/openai-adapter-XU46EN7B.js +0 -6
- package/dist/openai-adapter-XU46EN7B.js.map +0 -1
- package/dist/registry-AZ2LOHHJ.js +0 -6
- package/dist/registry-H7B3AHPQ.js +0 -5
- package/dist/server-manager-PTGBHCLS.js +0 -5
- package/dist/session-manager-XOMDMC77.js +0 -12
- package/dist/team-manager-HC4XGCFY.js +0 -11
- package/dist/tmux-manager-GPYZ3WQH.js +0 -6
- package/dist/tools-TSMXMHIF.js +0 -6
package/dist/chunk-UY2SYSEZ.js
DELETED
|
@@ -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":"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","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"]}
|
package/dist/chunk-WAHVZH7V.js
DELETED
|
@@ -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"]}
|