@boxiaolanya2008/pi-ai 0.60.4

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 (164) hide show
  1. package/README.md +1198 -0
  2. package/bedrock-provider.d.ts +1 -0
  3. package/bedrock-provider.js +1 -0
  4. package/dist/api-registry.d.ts +20 -0
  5. package/dist/api-registry.d.ts.map +1 -0
  6. package/dist/api-registry.js +44 -0
  7. package/dist/api-registry.js.map +1 -0
  8. package/dist/bedrock-provider.d.ts +5 -0
  9. package/dist/bedrock-provider.d.ts.map +1 -0
  10. package/dist/bedrock-provider.js +6 -0
  11. package/dist/bedrock-provider.js.map +1 -0
  12. package/dist/cli.d.ts +3 -0
  13. package/dist/cli.d.ts.map +1 -0
  14. package/dist/cli.js +113 -0
  15. package/dist/cli.js.map +1 -0
  16. package/dist/env-api-keys.d.ts +4 -0
  17. package/dist/env-api-keys.d.ts.map +1 -0
  18. package/dist/env-api-keys.js +85 -0
  19. package/dist/env-api-keys.js.map +1 -0
  20. package/dist/index.d.ts +23 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +21 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/models.d.ts +22 -0
  25. package/dist/models.d.ts.map +1 -0
  26. package/dist/models.generated.d.ts +4 -0
  27. package/dist/models.generated.d.ts.map +1 -0
  28. package/dist/models.generated.js +11 -0
  29. package/dist/models.generated.js.map +1 -0
  30. package/dist/models.js +50 -0
  31. package/dist/models.js.map +1 -0
  32. package/dist/oauth.d.ts +2 -0
  33. package/dist/oauth.d.ts.map +1 -0
  34. package/dist/oauth.js +2 -0
  35. package/dist/oauth.js.map +1 -0
  36. package/dist/providers/amazon-bedrock.d.ts +15 -0
  37. package/dist/providers/amazon-bedrock.d.ts.map +1 -0
  38. package/dist/providers/amazon-bedrock.js +552 -0
  39. package/dist/providers/amazon-bedrock.js.map +1 -0
  40. package/dist/providers/anthropic.d.ts +15 -0
  41. package/dist/providers/anthropic.d.ts.map +1 -0
  42. package/dist/providers/anthropic.js +677 -0
  43. package/dist/providers/anthropic.js.map +1 -0
  44. package/dist/providers/azure-openai-responses.d.ts +12 -0
  45. package/dist/providers/azure-openai-responses.d.ts.map +1 -0
  46. package/dist/providers/azure-openai-responses.js +181 -0
  47. package/dist/providers/azure-openai-responses.js.map +1 -0
  48. package/dist/providers/github-copilot-headers.d.ts +8 -0
  49. package/dist/providers/github-copilot-headers.d.ts.map +1 -0
  50. package/dist/providers/github-copilot-headers.js +26 -0
  51. package/dist/providers/github-copilot-headers.js.map +1 -0
  52. package/dist/providers/google-gemini-cli.d.ts +15 -0
  53. package/dist/providers/google-gemini-cli.d.ts.map +1 -0
  54. package/dist/providers/google-gemini-cli.js +43 -0
  55. package/dist/providers/google-gemini-cli.js.map +1 -0
  56. package/dist/providers/google-shared.d.ts +15 -0
  57. package/dist/providers/google-shared.d.ts.map +1 -0
  58. package/dist/providers/google-shared.js +226 -0
  59. package/dist/providers/google-shared.js.map +1 -0
  60. package/dist/providers/google-vertex.d.ts +15 -0
  61. package/dist/providers/google-vertex.d.ts.map +1 -0
  62. package/dist/providers/google-vertex.js +372 -0
  63. package/dist/providers/google-vertex.js.map +1 -0
  64. package/dist/providers/google.d.ts +13 -0
  65. package/dist/providers/google.d.ts.map +1 -0
  66. package/dist/providers/google.js +351 -0
  67. package/dist/providers/google.js.map +1 -0
  68. package/dist/providers/mistral.d.ts +13 -0
  69. package/dist/providers/mistral.d.ts.map +1 -0
  70. package/dist/providers/mistral.js +489 -0
  71. package/dist/providers/mistral.js.map +1 -0
  72. package/dist/providers/openai-codex-responses.d.ts +9 -0
  73. package/dist/providers/openai-codex-responses.d.ts.map +1 -0
  74. package/dist/providers/openai-codex-responses.js +672 -0
  75. package/dist/providers/openai-codex-responses.js.map +1 -0
  76. package/dist/providers/openai-completions.d.ts +15 -0
  77. package/dist/providers/openai-completions.d.ts.map +1 -0
  78. package/dist/providers/openai-completions.js +651 -0
  79. package/dist/providers/openai-completions.js.map +1 -0
  80. package/dist/providers/openai-responses-shared.d.ts +17 -0
  81. package/dist/providers/openai-responses-shared.d.ts.map +1 -0
  82. package/dist/providers/openai-responses-shared.js +420 -0
  83. package/dist/providers/openai-responses-shared.js.map +1 -0
  84. package/dist/providers/openai-responses.d.ts +10 -0
  85. package/dist/providers/openai-responses.d.ts.map +1 -0
  86. package/dist/providers/openai-responses.js +186 -0
  87. package/dist/providers/openai-responses.js.map +1 -0
  88. package/dist/providers/register-builtins.d.ts +11 -0
  89. package/dist/providers/register-builtins.d.ts.map +1 -0
  90. package/dist/providers/register-builtins.js +138 -0
  91. package/dist/providers/register-builtins.js.map +1 -0
  92. package/dist/providers/simple-options.d.ts +8 -0
  93. package/dist/providers/simple-options.d.ts.map +1 -0
  94. package/dist/providers/simple-options.js +35 -0
  95. package/dist/providers/simple-options.js.map +1 -0
  96. package/dist/providers/transform-messages.d.ts +3 -0
  97. package/dist/providers/transform-messages.d.ts.map +1 -0
  98. package/dist/providers/transform-messages.js +130 -0
  99. package/dist/providers/transform-messages.js.map +1 -0
  100. package/dist/stream.d.ts +8 -0
  101. package/dist/stream.d.ts.map +1 -0
  102. package/dist/stream.js +27 -0
  103. package/dist/stream.js.map +1 -0
  104. package/dist/types.d.ts +213 -0
  105. package/dist/types.d.ts.map +1 -0
  106. package/dist/types.js +2 -0
  107. package/dist/types.js.map +1 -0
  108. package/dist/utils/event-stream.d.ts +20 -0
  109. package/dist/utils/event-stream.d.ts.map +1 -0
  110. package/dist/utils/event-stream.js +77 -0
  111. package/dist/utils/event-stream.js.map +1 -0
  112. package/dist/utils/hash.d.ts +2 -0
  113. package/dist/utils/hash.d.ts.map +1 -0
  114. package/dist/utils/hash.js +13 -0
  115. package/dist/utils/hash.js.map +1 -0
  116. package/dist/utils/json-parse.d.ts +2 -0
  117. package/dist/utils/json-parse.d.ts.map +1 -0
  118. package/dist/utils/json-parse.js +19 -0
  119. package/dist/utils/json-parse.js.map +1 -0
  120. package/dist/utils/oauth/anthropic.d.ts +4 -0
  121. package/dist/utils/oauth/anthropic.d.ts.map +1 -0
  122. package/dist/utils/oauth/anthropic.js +61 -0
  123. package/dist/utils/oauth/anthropic.js.map +1 -0
  124. package/dist/utils/oauth/github-copilot.d.ts +16 -0
  125. package/dist/utils/oauth/github-copilot.d.ts.map +1 -0
  126. package/dist/utils/oauth/github-copilot.js +247 -0
  127. package/dist/utils/oauth/github-copilot.js.map +1 -0
  128. package/dist/utils/oauth/google-antigravity.d.ts +7 -0
  129. package/dist/utils/oauth/google-antigravity.d.ts.map +1 -0
  130. package/dist/utils/oauth/google-antigravity.js +55 -0
  131. package/dist/utils/oauth/google-antigravity.js.map +1 -0
  132. package/dist/utils/oauth/index.d.ts +18 -0
  133. package/dist/utils/oauth/index.d.ts.map +1 -0
  134. package/dist/utils/oauth/index.js +72 -0
  135. package/dist/utils/oauth/index.js.map +1 -0
  136. package/dist/utils/oauth/openai-codex.d.ts +14 -0
  137. package/dist/utils/oauth/openai-codex.d.ts.map +1 -0
  138. package/dist/utils/oauth/openai-codex.js +348 -0
  139. package/dist/utils/oauth/openai-codex.js.map +1 -0
  140. package/dist/utils/oauth/pkce.d.ts +5 -0
  141. package/dist/utils/oauth/pkce.d.ts.map +1 -0
  142. package/dist/utils/oauth/pkce.js +18 -0
  143. package/dist/utils/oauth/pkce.js.map +1 -0
  144. package/dist/utils/oauth/types.d.ts +40 -0
  145. package/dist/utils/oauth/types.d.ts.map +1 -0
  146. package/dist/utils/oauth/types.js +2 -0
  147. package/dist/utils/oauth/types.js.map +1 -0
  148. package/dist/utils/overflow.d.ts +4 -0
  149. package/dist/utils/overflow.d.ts.map +1 -0
  150. package/dist/utils/overflow.js +40 -0
  151. package/dist/utils/overflow.js.map +1 -0
  152. package/dist/utils/sanitize-unicode.d.ts +2 -0
  153. package/dist/utils/sanitize-unicode.d.ts.map +1 -0
  154. package/dist/utils/sanitize-unicode.js +4 -0
  155. package/dist/utils/sanitize-unicode.js.map +1 -0
  156. package/dist/utils/typebox-helpers.d.ts +6 -0
  157. package/dist/utils/typebox-helpers.d.ts.map +1 -0
  158. package/dist/utils/typebox-helpers.js +10 -0
  159. package/dist/utils/typebox-helpers.js.map +1 -0
  160. package/dist/utils/validation.d.ts +4 -0
  161. package/dist/utils/validation.d.ts.map +1 -0
  162. package/dist/utils/validation.js +45 -0
  163. package/dist/utils/validation.js.map +1 -0
  164. package/package.json +80 -0
@@ -0,0 +1,677 @@
1
+ import Anthropic from "@anthropic-ai/sdk";
2
+ import { getEnvApiKey } from "../env-api-keys.js";
3
+ import { calculateCost } from "../models.js";
4
+ import { AssistantMessageEventStream } from "../utils/event-stream.js";
5
+ import { parseStreamingJson } from "../utils/json-parse.js";
6
+ import { sanitizeSurrogates } from "../utils/sanitize-unicode.js";
7
+ import { buildCopilotDynamicHeaders, hasCopilotVisionInput } from "./github-copilot-headers.js";
8
+ import { adjustMaxTokensForThinking, buildBaseOptions } from "./simple-options.js";
9
+ import { transformMessages } from "./transform-messages.js";
10
+ function resolveCacheRetention(cacheRetention) {
11
+ if (cacheRetention) {
12
+ return cacheRetention;
13
+ }
14
+ if (typeof process !== "undefined" && process.env.PI_CACHE_RETENTION === "long") {
15
+ return "long";
16
+ }
17
+ return "short";
18
+ }
19
+ function getCacheControl(baseUrl, cacheRetention) {
20
+ const retention = resolveCacheRetention(cacheRetention);
21
+ if (retention === "none") {
22
+ return { retention };
23
+ }
24
+ const ttl = retention === "long" && baseUrl.includes("api.anthropic.com") ? "1h" : undefined;
25
+ return {
26
+ retention,
27
+ cacheControl: { type: "ephemeral", ...(ttl && { ttl }) },
28
+ };
29
+ }
30
+ const claudeCodeVersion = "2.1.62";
31
+ const claudeCodeTools = [
32
+ "Read",
33
+ "Write",
34
+ "Edit",
35
+ "Bash",
36
+ "Grep",
37
+ "Glob",
38
+ "AskUserQuestion",
39
+ "EnterPlanMode",
40
+ "ExitPlanMode",
41
+ "KillShell",
42
+ "NotebookEdit",
43
+ "Skill",
44
+ "Task",
45
+ "TaskOutput",
46
+ "TodoWrite",
47
+ "WebFetch",
48
+ "WebSearch",
49
+ ];
50
+ const ccToolLookup = new Map(claudeCodeTools.map((t) => [t.toLowerCase(), t]));
51
+ const toClaudeCodeName = (name) => ccToolLookup.get(name.toLowerCase()) ?? name;
52
+ const fromClaudeCodeName = (name, tools) => {
53
+ if (tools && tools.length > 0) {
54
+ const lowerName = name.toLowerCase();
55
+ const matchedTool = tools.find((tool) => tool.name.toLowerCase() === lowerName);
56
+ if (matchedTool)
57
+ return matchedTool.name;
58
+ }
59
+ return name;
60
+ };
61
+ function convertContentBlocks(content) {
62
+ const hasImages = content.some((c) => c.type === "image");
63
+ if (!hasImages) {
64
+ return sanitizeSurrogates(content.map((c) => c.text).join("\n"));
65
+ }
66
+ const blocks = content.map((block) => {
67
+ if (block.type === "text") {
68
+ return {
69
+ type: "text",
70
+ text: sanitizeSurrogates(block.text),
71
+ };
72
+ }
73
+ return {
74
+ type: "image",
75
+ source: {
76
+ type: "base64",
77
+ media_type: block.mimeType,
78
+ data: block.data,
79
+ },
80
+ };
81
+ });
82
+ const hasText = blocks.some((b) => b.type === "text");
83
+ if (!hasText) {
84
+ blocks.unshift({
85
+ type: "text",
86
+ text: "(see attached image)",
87
+ });
88
+ }
89
+ return blocks;
90
+ }
91
+ function mergeHeaders(...headerSources) {
92
+ const merged = {};
93
+ for (const headers of headerSources) {
94
+ if (headers) {
95
+ Object.assign(merged, headers);
96
+ }
97
+ }
98
+ return merged;
99
+ }
100
+ export const streamAnthropic = (model, context, options) => {
101
+ const stream = new AssistantMessageEventStream();
102
+ (async () => {
103
+ const output = {
104
+ role: "assistant",
105
+ content: [],
106
+ api: model.api,
107
+ provider: model.provider,
108
+ model: model.id,
109
+ usage: {
110
+ input: 0,
111
+ output: 0,
112
+ cacheRead: 0,
113
+ cacheWrite: 0,
114
+ totalTokens: 0,
115
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
116
+ },
117
+ stopReason: "stop",
118
+ timestamp: Date.now(),
119
+ };
120
+ try {
121
+ const apiKey = options?.apiKey ?? getEnvApiKey(model.provider) ?? "";
122
+ let copilotDynamicHeaders;
123
+ if (model.provider === "github-copilot") {
124
+ const hasImages = hasCopilotVisionInput(context.messages);
125
+ copilotDynamicHeaders = buildCopilotDynamicHeaders({
126
+ messages: context.messages,
127
+ hasImages,
128
+ });
129
+ }
130
+ const { client, isOAuthToken } = createClient(model, apiKey, options?.interleavedThinking ?? true, options?.headers, copilotDynamicHeaders);
131
+ let params = buildParams(model, context, isOAuthToken, options);
132
+ const nextParams = await options?.onPayload?.(params, model);
133
+ if (nextParams !== undefined) {
134
+ params = nextParams;
135
+ }
136
+ const anthropicStream = client.messages.stream({ ...params, stream: true }, { signal: options?.signal });
137
+ stream.push({ type: "start", partial: output });
138
+ const blocks = output.content;
139
+ for await (const event of anthropicStream) {
140
+ if (event.type === "message_start") {
141
+ output.usage.input = event.message.usage.input_tokens || 0;
142
+ output.usage.output = event.message.usage.output_tokens || 0;
143
+ output.usage.cacheRead = event.message.usage.cache_read_input_tokens || 0;
144
+ output.usage.cacheWrite = event.message.usage.cache_creation_input_tokens || 0;
145
+ output.usage.totalTokens =
146
+ output.usage.input + output.usage.output + output.usage.cacheRead + output.usage.cacheWrite;
147
+ calculateCost(model, output.usage);
148
+ }
149
+ else if (event.type === "content_block_start") {
150
+ if (event.content_block.type === "text") {
151
+ const block = {
152
+ type: "text",
153
+ text: "",
154
+ index: event.index,
155
+ };
156
+ output.content.push(block);
157
+ stream.push({ type: "text_start", contentIndex: output.content.length - 1, partial: output });
158
+ }
159
+ else if (event.content_block.type === "thinking") {
160
+ const block = {
161
+ type: "thinking",
162
+ thinking: "",
163
+ thinkingSignature: "",
164
+ index: event.index,
165
+ };
166
+ output.content.push(block);
167
+ stream.push({ type: "thinking_start", contentIndex: output.content.length - 1, partial: output });
168
+ }
169
+ else if (event.content_block.type === "redacted_thinking") {
170
+ const block = {
171
+ type: "thinking",
172
+ thinking: "[Reasoning redacted]",
173
+ thinkingSignature: event.content_block.data,
174
+ redacted: true,
175
+ index: event.index,
176
+ };
177
+ output.content.push(block);
178
+ stream.push({ type: "thinking_start", contentIndex: output.content.length - 1, partial: output });
179
+ }
180
+ else if (event.content_block.type === "tool_use") {
181
+ const block = {
182
+ type: "toolCall",
183
+ id: event.content_block.id,
184
+ name: isOAuthToken
185
+ ? fromClaudeCodeName(event.content_block.name, context.tools)
186
+ : event.content_block.name,
187
+ arguments: event.content_block.input ?? {},
188
+ partialJson: "",
189
+ index: event.index,
190
+ };
191
+ output.content.push(block);
192
+ stream.push({ type: "toolcall_start", contentIndex: output.content.length - 1, partial: output });
193
+ }
194
+ }
195
+ else if (event.type === "content_block_delta") {
196
+ if (event.delta.type === "text_delta") {
197
+ const index = blocks.findIndex((b) => b.index === event.index);
198
+ const block = blocks[index];
199
+ if (block && block.type === "text") {
200
+ block.text += event.delta.text;
201
+ stream.push({
202
+ type: "text_delta",
203
+ contentIndex: index,
204
+ delta: event.delta.text,
205
+ partial: output,
206
+ });
207
+ }
208
+ }
209
+ else if (event.delta.type === "thinking_delta") {
210
+ const index = blocks.findIndex((b) => b.index === event.index);
211
+ const block = blocks[index];
212
+ if (block && block.type === "thinking") {
213
+ block.thinking += event.delta.thinking;
214
+ stream.push({
215
+ type: "thinking_delta",
216
+ contentIndex: index,
217
+ delta: event.delta.thinking,
218
+ partial: output,
219
+ });
220
+ }
221
+ }
222
+ else if (event.delta.type === "input_json_delta") {
223
+ const index = blocks.findIndex((b) => b.index === event.index);
224
+ const block = blocks[index];
225
+ if (block && block.type === "toolCall") {
226
+ block.partialJson += event.delta.partial_json;
227
+ block.arguments = parseStreamingJson(block.partialJson);
228
+ stream.push({
229
+ type: "toolcall_delta",
230
+ contentIndex: index,
231
+ delta: event.delta.partial_json,
232
+ partial: output,
233
+ });
234
+ }
235
+ }
236
+ else if (event.delta.type === "signature_delta") {
237
+ const index = blocks.findIndex((b) => b.index === event.index);
238
+ const block = blocks[index];
239
+ if (block && block.type === "thinking") {
240
+ block.thinkingSignature = block.thinkingSignature || "";
241
+ block.thinkingSignature += event.delta.signature;
242
+ }
243
+ }
244
+ }
245
+ else if (event.type === "content_block_stop") {
246
+ const index = blocks.findIndex((b) => b.index === event.index);
247
+ const block = blocks[index];
248
+ if (block) {
249
+ delete block.index;
250
+ if (block.type === "text") {
251
+ stream.push({
252
+ type: "text_end",
253
+ contentIndex: index,
254
+ content: block.text,
255
+ partial: output,
256
+ });
257
+ }
258
+ else if (block.type === "thinking") {
259
+ stream.push({
260
+ type: "thinking_end",
261
+ contentIndex: index,
262
+ content: block.thinking,
263
+ partial: output,
264
+ });
265
+ }
266
+ else if (block.type === "toolCall") {
267
+ block.arguments = parseStreamingJson(block.partialJson);
268
+ delete block.partialJson;
269
+ stream.push({
270
+ type: "toolcall_end",
271
+ contentIndex: index,
272
+ toolCall: block,
273
+ partial: output,
274
+ });
275
+ }
276
+ }
277
+ }
278
+ else if (event.type === "message_delta") {
279
+ if (event.delta.stop_reason) {
280
+ output.stopReason = mapStopReason(event.delta.stop_reason);
281
+ }
282
+ if (event.usage.input_tokens != null) {
283
+ output.usage.input = event.usage.input_tokens;
284
+ }
285
+ if (event.usage.output_tokens != null) {
286
+ output.usage.output = event.usage.output_tokens;
287
+ }
288
+ if (event.usage.cache_read_input_tokens != null) {
289
+ output.usage.cacheRead = event.usage.cache_read_input_tokens;
290
+ }
291
+ if (event.usage.cache_creation_input_tokens != null) {
292
+ output.usage.cacheWrite = event.usage.cache_creation_input_tokens;
293
+ }
294
+ output.usage.totalTokens =
295
+ output.usage.input + output.usage.output + output.usage.cacheRead + output.usage.cacheWrite;
296
+ calculateCost(model, output.usage);
297
+ }
298
+ }
299
+ if (options?.signal?.aborted) {
300
+ throw new Error("Request was aborted");
301
+ }
302
+ if (output.stopReason === "aborted" || output.stopReason === "error") {
303
+ throw new Error("An unknown error occurred");
304
+ }
305
+ stream.push({ type: "done", reason: output.stopReason, message: output });
306
+ stream.end();
307
+ }
308
+ catch (error) {
309
+ for (const block of output.content)
310
+ delete block.index;
311
+ output.stopReason = options?.signal?.aborted ? "aborted" : "error";
312
+ output.errorMessage = error instanceof Error ? error.message : JSON.stringify(error);
313
+ stream.push({ type: "error", reason: output.stopReason, error: output });
314
+ stream.end();
315
+ }
316
+ })();
317
+ return stream;
318
+ };
319
+ function supportsAdaptiveThinking(modelId) {
320
+ return (modelId.includes("opus-4-6") ||
321
+ modelId.includes("opus-4.6") ||
322
+ modelId.includes("sonnet-4-6") ||
323
+ modelId.includes("sonnet-4.6"));
324
+ }
325
+ function mapThinkingLevelToEffort(level, modelId) {
326
+ switch (level) {
327
+ case "minimal":
328
+ return "low";
329
+ case "low":
330
+ return "low";
331
+ case "medium":
332
+ return "medium";
333
+ case "high":
334
+ return "high";
335
+ case "xhigh":
336
+ return modelId.includes("opus-4-6") || modelId.includes("opus-4.6") ? "max" : "high";
337
+ default:
338
+ return "high";
339
+ }
340
+ }
341
+ export const streamSimpleAnthropic = (model, context, options) => {
342
+ const apiKey = options?.apiKey || getEnvApiKey(model.provider);
343
+ if (!apiKey) {
344
+ throw new Error(`No API key for provider: ${model.provider}`);
345
+ }
346
+ const base = buildBaseOptions(model, options, apiKey);
347
+ if (!options?.reasoning) {
348
+ return streamAnthropic(model, context, { ...base, thinkingEnabled: false });
349
+ }
350
+ if (supportsAdaptiveThinking(model.id)) {
351
+ const effort = mapThinkingLevelToEffort(options.reasoning, model.id);
352
+ return streamAnthropic(model, context, {
353
+ ...base,
354
+ thinkingEnabled: true,
355
+ effort,
356
+ });
357
+ }
358
+ const adjusted = adjustMaxTokensForThinking(base.maxTokens || 0, model.maxTokens, options.reasoning, options.thinkingBudgets);
359
+ return streamAnthropic(model, context, {
360
+ ...base,
361
+ maxTokens: adjusted.maxTokens,
362
+ thinkingEnabled: true,
363
+ thinkingBudgetTokens: adjusted.thinkingBudget,
364
+ });
365
+ };
366
+ function isOAuthToken(apiKey) {
367
+ return apiKey.includes("sk-ant-oat");
368
+ }
369
+ function createClient(model, apiKey, interleavedThinking, optionsHeaders, dynamicHeaders) {
370
+ const needsInterleavedBeta = interleavedThinking && !supportsAdaptiveThinking(model.id);
371
+ if (model.provider === "github-copilot") {
372
+ const betaFeatures = [];
373
+ if (needsInterleavedBeta) {
374
+ betaFeatures.push("interleaved-thinking-2025-05-14");
375
+ }
376
+ const client = new Anthropic({
377
+ apiKey: null,
378
+ authToken: apiKey,
379
+ baseURL: model.baseUrl,
380
+ dangerouslyAllowBrowser: true,
381
+ defaultHeaders: mergeHeaders({
382
+ accept: "application/json",
383
+ "anthropic-dangerous-direct-browser-access": "true",
384
+ ...(betaFeatures.length > 0 ? { "anthropic-beta": betaFeatures.join(",") } : {}),
385
+ }, model.headers, dynamicHeaders, optionsHeaders),
386
+ });
387
+ return { client, isOAuthToken: false };
388
+ }
389
+ const betaFeatures = ["fine-grained-tool-streaming-2025-05-14"];
390
+ if (needsInterleavedBeta) {
391
+ betaFeatures.push("interleaved-thinking-2025-05-14");
392
+ }
393
+ if (isOAuthToken(apiKey)) {
394
+ const client = new Anthropic({
395
+ apiKey: null,
396
+ authToken: apiKey,
397
+ baseURL: model.baseUrl,
398
+ dangerouslyAllowBrowser: true,
399
+ defaultHeaders: mergeHeaders({
400
+ accept: "application/json",
401
+ "anthropic-dangerous-direct-browser-access": "true",
402
+ "anthropic-beta": `claude-code-20250219,oauth-2025-04-20,${betaFeatures.join(",")}`,
403
+ "user-agent": `claude-cli/${claudeCodeVersion}`,
404
+ "x-app": "cli",
405
+ }, model.headers, optionsHeaders),
406
+ });
407
+ return { client, isOAuthToken: true };
408
+ }
409
+ const client = new Anthropic({
410
+ apiKey,
411
+ baseURL: model.baseUrl,
412
+ dangerouslyAllowBrowser: true,
413
+ defaultHeaders: mergeHeaders({
414
+ accept: "application/json",
415
+ "anthropic-dangerous-direct-browser-access": "true",
416
+ "anthropic-beta": betaFeatures.join(","),
417
+ }, model.headers, optionsHeaders),
418
+ });
419
+ return { client, isOAuthToken: false };
420
+ }
421
+ function buildParams(model, context, isOAuthToken, options) {
422
+ const { cacheControl } = getCacheControl(model.baseUrl, options?.cacheRetention);
423
+ const params = {
424
+ model: model.id,
425
+ messages: convertMessages(context.messages, model, isOAuthToken, cacheControl),
426
+ max_tokens: options?.maxTokens || (model.maxTokens / 3) | 0,
427
+ stream: true,
428
+ };
429
+ if (isOAuthToken) {
430
+ params.system = [
431
+ {
432
+ type: "text",
433
+ text: "You are Claude Code, Anthropic's official CLI for Claude.",
434
+ ...(cacheControl ? { cache_control: cacheControl } : {}),
435
+ },
436
+ ];
437
+ if (context.systemPrompt) {
438
+ params.system.push({
439
+ type: "text",
440
+ text: sanitizeSurrogates(context.systemPrompt),
441
+ ...(cacheControl ? { cache_control: cacheControl } : {}),
442
+ });
443
+ }
444
+ }
445
+ else if (context.systemPrompt) {
446
+ params.system = [
447
+ {
448
+ type: "text",
449
+ text: sanitizeSurrogates(context.systemPrompt),
450
+ ...(cacheControl ? { cache_control: cacheControl } : {}),
451
+ },
452
+ ];
453
+ }
454
+ if (options?.temperature !== undefined && !options?.thinkingEnabled) {
455
+ params.temperature = options.temperature;
456
+ }
457
+ if (context.tools) {
458
+ params.tools = convertTools(context.tools, isOAuthToken);
459
+ }
460
+ if (options?.thinkingEnabled && model.reasoning) {
461
+ if (supportsAdaptiveThinking(model.id)) {
462
+ params.thinking = { type: "adaptive" };
463
+ if (options.effort) {
464
+ params.output_config = { effort: options.effort };
465
+ }
466
+ }
467
+ else {
468
+ params.thinking = {
469
+ type: "enabled",
470
+ budget_tokens: options.thinkingBudgetTokens || 1024,
471
+ };
472
+ }
473
+ }
474
+ if (options?.metadata) {
475
+ const userId = options.metadata.user_id;
476
+ if (typeof userId === "string") {
477
+ params.metadata = { user_id: userId };
478
+ }
479
+ }
480
+ if (options?.toolChoice) {
481
+ if (typeof options.toolChoice === "string") {
482
+ params.tool_choice = { type: options.toolChoice };
483
+ }
484
+ else {
485
+ params.tool_choice = options.toolChoice;
486
+ }
487
+ }
488
+ return params;
489
+ }
490
+ function normalizeToolCallId(id) {
491
+ return id.replace(/[^a-zA-Z0-9_-]/g, "_").slice(0, 64);
492
+ }
493
+ function convertMessages(messages, model, isOAuthToken, cacheControl) {
494
+ const params = [];
495
+ const transformedMessages = transformMessages(messages, model, normalizeToolCallId);
496
+ for (let i = 0; i < transformedMessages.length; i++) {
497
+ const msg = transformedMessages[i];
498
+ if (msg.role === "user") {
499
+ if (typeof msg.content === "string") {
500
+ if (msg.content.trim().length > 0) {
501
+ params.push({
502
+ role: "user",
503
+ content: sanitizeSurrogates(msg.content),
504
+ });
505
+ }
506
+ }
507
+ else {
508
+ const blocks = msg.content.map((item) => {
509
+ if (item.type === "text") {
510
+ return {
511
+ type: "text",
512
+ text: sanitizeSurrogates(item.text),
513
+ };
514
+ }
515
+ else {
516
+ return {
517
+ type: "image",
518
+ source: {
519
+ type: "base64",
520
+ media_type: item.mimeType,
521
+ data: item.data,
522
+ },
523
+ };
524
+ }
525
+ });
526
+ let filteredBlocks = !model?.input.includes("image") ? blocks.filter((b) => b.type !== "image") : blocks;
527
+ filteredBlocks = filteredBlocks.filter((b) => {
528
+ if (b.type === "text") {
529
+ return b.text.trim().length > 0;
530
+ }
531
+ return true;
532
+ });
533
+ if (filteredBlocks.length === 0)
534
+ continue;
535
+ params.push({
536
+ role: "user",
537
+ content: filteredBlocks,
538
+ });
539
+ }
540
+ }
541
+ else if (msg.role === "assistant") {
542
+ const blocks = [];
543
+ for (const block of msg.content) {
544
+ if (block.type === "text") {
545
+ if (block.text.trim().length === 0)
546
+ continue;
547
+ blocks.push({
548
+ type: "text",
549
+ text: sanitizeSurrogates(block.text),
550
+ });
551
+ }
552
+ else if (block.type === "thinking") {
553
+ if (block.redacted) {
554
+ blocks.push({
555
+ type: "redacted_thinking",
556
+ data: block.thinkingSignature,
557
+ });
558
+ continue;
559
+ }
560
+ if (block.thinking.trim().length === 0)
561
+ continue;
562
+ if (!block.thinkingSignature || block.thinkingSignature.trim().length === 0) {
563
+ blocks.push({
564
+ type: "text",
565
+ text: sanitizeSurrogates(block.thinking),
566
+ });
567
+ }
568
+ else {
569
+ blocks.push({
570
+ type: "thinking",
571
+ thinking: sanitizeSurrogates(block.thinking),
572
+ signature: block.thinkingSignature,
573
+ });
574
+ }
575
+ }
576
+ else if (block.type === "toolCall") {
577
+ blocks.push({
578
+ type: "tool_use",
579
+ id: block.id,
580
+ name: isOAuthToken ? toClaudeCodeName(block.name) : block.name,
581
+ input: block.arguments ?? {},
582
+ });
583
+ }
584
+ }
585
+ if (blocks.length === 0)
586
+ continue;
587
+ params.push({
588
+ role: "assistant",
589
+ content: blocks,
590
+ });
591
+ }
592
+ else if (msg.role === "toolResult") {
593
+ const toolResults = [];
594
+ toolResults.push({
595
+ type: "tool_result",
596
+ tool_use_id: msg.toolCallId,
597
+ content: convertContentBlocks(msg.content),
598
+ is_error: msg.isError,
599
+ });
600
+ let j = i + 1;
601
+ while (j < transformedMessages.length && transformedMessages[j].role === "toolResult") {
602
+ const nextMsg = transformedMessages[j];
603
+ toolResults.push({
604
+ type: "tool_result",
605
+ tool_use_id: nextMsg.toolCallId,
606
+ content: convertContentBlocks(nextMsg.content),
607
+ is_error: nextMsg.isError,
608
+ });
609
+ j++;
610
+ }
611
+ i = j - 1;
612
+ params.push({
613
+ role: "user",
614
+ content: toolResults,
615
+ });
616
+ }
617
+ }
618
+ if (cacheControl && params.length > 0) {
619
+ const lastMessage = params[params.length - 1];
620
+ if (lastMessage.role === "user") {
621
+ if (Array.isArray(lastMessage.content)) {
622
+ const lastBlock = lastMessage.content[lastMessage.content.length - 1];
623
+ if (lastBlock &&
624
+ (lastBlock.type === "text" || lastBlock.type === "image" || lastBlock.type === "tool_result")) {
625
+ lastBlock.cache_control = cacheControl;
626
+ }
627
+ }
628
+ else if (typeof lastMessage.content === "string") {
629
+ lastMessage.content = [
630
+ {
631
+ type: "text",
632
+ text: lastMessage.content,
633
+ cache_control: cacheControl,
634
+ },
635
+ ];
636
+ }
637
+ }
638
+ }
639
+ return params;
640
+ }
641
+ function convertTools(tools, isOAuthToken) {
642
+ if (!tools)
643
+ return [];
644
+ return tools.map((tool) => {
645
+ const jsonSchema = tool.parameters;
646
+ return {
647
+ name: isOAuthToken ? toClaudeCodeName(tool.name) : tool.name,
648
+ description: tool.description,
649
+ input_schema: {
650
+ type: "object",
651
+ properties: jsonSchema.properties || {},
652
+ required: jsonSchema.required || [],
653
+ },
654
+ };
655
+ });
656
+ }
657
+ function mapStopReason(reason) {
658
+ switch (reason) {
659
+ case "end_turn":
660
+ return "stop";
661
+ case "max_tokens":
662
+ return "length";
663
+ case "tool_use":
664
+ return "toolUse";
665
+ case "refusal":
666
+ return "error";
667
+ case "pause_turn":
668
+ return "stop";
669
+ case "stop_sequence":
670
+ return "stop";
671
+ case "sensitive":
672
+ return "error";
673
+ default:
674
+ throw new Error(`Unhandled stop reason: ${reason}`);
675
+ }
676
+ }
677
+ //# sourceMappingURL=anthropic.js.map