noumen 0.6.0 → 0.8.0

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 (137) hide show
  1. package/README.md +237 -93
  2. package/dist/a2a/index.d.ts +5 -7
  3. package/dist/a2a/index.js +3 -4
  4. package/dist/a2a/index.js.map +1 -1
  5. package/dist/acp/index.d.ts +5 -7
  6. package/dist/acp/index.js +0 -1
  7. package/dist/acp/index.js.map +1 -1
  8. package/dist/{agent-DWE4_P5X.d.ts → agent-D0gl-qYi.d.ts} +89 -34
  9. package/dist/{chunk-6MMYCGJQ.js → chunk-5HY4IYNT.js} +1529 -2321
  10. package/dist/chunk-5HY4IYNT.js.map +1 -0
  11. package/dist/chunk-BC5BLWBC.js +21 -0
  12. package/dist/chunk-BC5BLWBC.js.map +1 -0
  13. package/dist/{chunk-XZN4QZLK.js → chunk-CX4BL6PC.js} +25 -15
  14. package/dist/chunk-CX4BL6PC.js.map +1 -0
  15. package/dist/{chunk-5GEX6ZSB.js → chunk-HQISH4D7.js} +60 -1
  16. package/dist/chunk-HQISH4D7.js.map +1 -0
  17. package/dist/{chunk-Y45R3PQL.js → chunk-NUCJXOUV.js} +32 -18
  18. package/dist/{chunk-Y45R3PQL.js.map → chunk-NUCJXOUV.js.map} +1 -1
  19. package/dist/chunk-OPFFLQZL.js +40 -0
  20. package/dist/chunk-OPFFLQZL.js.map +1 -0
  21. package/dist/chunk-PDEAJ272.js +660 -0
  22. package/dist/chunk-PDEAJ272.js.map +1 -0
  23. package/dist/chunk-PKHLGGEC.js +115 -0
  24. package/dist/chunk-PKHLGGEC.js.map +1 -0
  25. package/dist/chunk-XQTNXRE7.js +176 -0
  26. package/dist/chunk-XQTNXRE7.js.map +1 -0
  27. package/dist/chunk-XZPAA5TO.js +817 -0
  28. package/dist/chunk-XZPAA5TO.js.map +1 -0
  29. package/dist/cli/index.js +77 -42
  30. package/dist/cli/index.js.map +1 -1
  31. package/dist/client/index.d.ts +1 -2
  32. package/dist/client/index.js +0 -2
  33. package/dist/client/index.js.map +1 -1
  34. package/dist/client-JJFLE6RT.js +9 -0
  35. package/dist/{computer-BPdxSo6X.d.ts → computer-DzMR92tK.d.ts} +1 -1
  36. package/dist/docker.d.ts +2 -2
  37. package/dist/docker.js +0 -1
  38. package/dist/docker.js.map +1 -1
  39. package/dist/e2b.d.ts +2 -2
  40. package/dist/e2b.js +0 -1
  41. package/dist/e2b.js.map +1 -1
  42. package/dist/freestyle.d.ts +2 -2
  43. package/dist/freestyle.js +0 -1
  44. package/dist/freestyle.js.map +1 -1
  45. package/dist/{headless-FFU2DESQ.js → headless-25DU4MJQ.js} +1 -3
  46. package/dist/{headless-FFU2DESQ.js.map → headless-25DU4MJQ.js.map} +1 -1
  47. package/dist/{history-snip-64GYP4ZL.js → history-snip-HAWNAYKY.js} +1 -2
  48. package/dist/index.d.ts +351 -72
  49. package/dist/index.js +54 -55
  50. package/dist/jsonrpc/index.js +0 -1
  51. package/dist/local.d.ts +168 -0
  52. package/dist/local.js +40 -0
  53. package/dist/local.js.map +1 -0
  54. package/dist/lsp/index.d.ts +4 -5
  55. package/dist/lsp/index.js +0 -1
  56. package/dist/{lsp-PS3BWIHC.js → lsp-3APWNKB2.js} +1 -2
  57. package/dist/{manager-DLXK63XC.js → manager-Z5EQ7YYV.js} +1 -2
  58. package/dist/mcp/index.d.ts +16 -8
  59. package/dist/mcp/index.js +5 -6
  60. package/dist/mcp/index.js.map +1 -1
  61. package/dist/{mcp-auth-AEI2R4ZC.js → mcp-auth-NOIQPF7W.js} +1 -2
  62. package/dist/{provider-factory-TUHU3DIG.js → provider-factory-KNBSHXJ6.js} +3 -3
  63. package/dist/{render-GRN4ZSSW.js → render-4VEODRK7.js} +1 -2
  64. package/dist/{resolve-6KUZNEYW.js → resolve-AGQZFMKD.js} +3 -3
  65. package/dist/sandbox-DAqQo0Tj.d.ts +49 -0
  66. package/dist/sandbox-index-ODNREIFA.js +32 -0
  67. package/dist/sandbox-index-ODNREIFA.js.map +1 -0
  68. package/dist/server/index.d.ts +18 -7
  69. package/dist/server/index.js +9 -5
  70. package/dist/server/index.js.map +1 -1
  71. package/dist/{server-BzNGKTP6.d.ts → server-DFXdlqyX.d.ts} +1 -1
  72. package/dist/{spinner-OJNR6NFO.js → spinner-72JEISPK.js} +1 -2
  73. package/dist/sprites.d.ts +2 -2
  74. package/dist/sprites.js +0 -1
  75. package/dist/sprites.js.map +1 -1
  76. package/dist/ssh.d.ts +2 -2
  77. package/dist/ssh.js +0 -1
  78. package/dist/ssh.js.map +1 -1
  79. package/dist/{types-DhXwOQwD.d.ts → types-BX4ALqoN.d.ts} +76 -4
  80. package/dist/{types-kiGBF35b.d.ts → types-DLZNyF5t.d.ts} +125 -1
  81. package/dist/unsandboxed.d.ts +59 -0
  82. package/dist/unsandboxed.js +32 -0
  83. package/dist/unsandboxed.js.map +1 -0
  84. package/dist/{uuid-RVN2T26F.js → uuid-CVTNAPEB.js} +1 -2
  85. package/dist/{zod-7YXKWYMC.js → zod-VKURGPRT.js} +1 -2
  86. package/package.json +35 -50
  87. package/dist/cache-BlBwXXPS.d.ts +0 -38
  88. package/dist/chunk-5GEX6ZSB.js.map +0 -1
  89. package/dist/chunk-6MMYCGJQ.js.map +0 -1
  90. package/dist/chunk-7IQCQI2G.js +0 -94
  91. package/dist/chunk-7IQCQI2G.js.map +0 -1
  92. package/dist/chunk-CCM2AXZG.js +0 -16
  93. package/dist/chunk-CCM2AXZG.js.map +0 -1
  94. package/dist/chunk-DGUM43GV.js +0 -11
  95. package/dist/chunk-HEQQQGK5.js +0 -131
  96. package/dist/chunk-HEQQQGK5.js.map +0 -1
  97. package/dist/chunk-I3JTUFPK.js +0 -171
  98. package/dist/chunk-I3JTUFPK.js.map +0 -1
  99. package/dist/chunk-XZN4QZLK.js.map +0 -1
  100. package/dist/chunk-ZXSDKBYB.js +0 -474
  101. package/dist/chunk-ZXSDKBYB.js.map +0 -1
  102. package/dist/client-CRRO2376.js +0 -10
  103. package/dist/providers/anthropic.d.ts +0 -19
  104. package/dist/providers/anthropic.js +0 -36
  105. package/dist/providers/anthropic.js.map +0 -1
  106. package/dist/providers/bedrock.d.ts +0 -39
  107. package/dist/providers/bedrock.js +0 -56
  108. package/dist/providers/bedrock.js.map +0 -1
  109. package/dist/providers/gemini.d.ts +0 -17
  110. package/dist/providers/gemini.js +0 -262
  111. package/dist/providers/gemini.js.map +0 -1
  112. package/dist/providers/ollama.d.ts +0 -13
  113. package/dist/providers/ollama.js +0 -20
  114. package/dist/providers/ollama.js.map +0 -1
  115. package/dist/providers/openai.d.ts +0 -21
  116. package/dist/providers/openai.js +0 -9
  117. package/dist/providers/openrouter.d.ts +0 -16
  118. package/dist/providers/openrouter.js +0 -24
  119. package/dist/providers/openrouter.js.map +0 -1
  120. package/dist/providers/vertex.d.ts +0 -42
  121. package/dist/providers/vertex.js +0 -68
  122. package/dist/providers/vertex.js.map +0 -1
  123. package/dist/sandbox-9qeMTNrD.d.ts +0 -126
  124. package/dist/types-CD0rUKKT.d.ts +0 -109
  125. package/dist/uuid-RVN2T26F.js.map +0 -1
  126. package/dist/zod-7YXKWYMC.js.map +0 -1
  127. /package/dist/{chunk-DGUM43GV.js.map → client-JJFLE6RT.js.map} +0 -0
  128. /package/dist/{client-CRRO2376.js.map → history-snip-HAWNAYKY.js.map} +0 -0
  129. /package/dist/{history-snip-64GYP4ZL.js.map → lsp-3APWNKB2.js.map} +0 -0
  130. /package/dist/{lsp-PS3BWIHC.js.map → manager-Z5EQ7YYV.js.map} +0 -0
  131. /package/dist/{manager-DLXK63XC.js.map → mcp-auth-NOIQPF7W.js.map} +0 -0
  132. /package/dist/{mcp-auth-AEI2R4ZC.js.map → provider-factory-KNBSHXJ6.js.map} +0 -0
  133. /package/dist/{provider-factory-TUHU3DIG.js.map → render-4VEODRK7.js.map} +0 -0
  134. /package/dist/{providers/openai.js.map → resolve-AGQZFMKD.js.map} +0 -0
  135. /package/dist/{render-GRN4ZSSW.js.map → spinner-72JEISPK.js.map} +0 -0
  136. /package/dist/{resolve-6KUZNEYW.js.map → uuid-CVTNAPEB.js.map} +0 -0
  137. /package/dist/{spinner-OJNR6NFO.js.map → zod-VKURGPRT.js.map} +0 -0
@@ -1,56 +0,0 @@
1
- import {
2
- streamAnthropicChat
3
- } from "../chunk-ZXSDKBYB.js";
4
- import "../chunk-HEQQQGK5.js";
5
- import "../chunk-CCM2AXZG.js";
6
- import {
7
- __require
8
- } from "../chunk-DGUM43GV.js";
9
-
10
- // src/providers/bedrock.ts
11
- var BedrockAnthropicProvider = class {
12
- client;
13
- defaultModel;
14
- cacheConfig;
15
- constructor(opts) {
16
- if (opts.client) {
17
- this.client = opts.client;
18
- } else {
19
- let AnthropicBedrock;
20
- try {
21
- AnthropicBedrock = __require("@anthropic-ai/bedrock-sdk").AnthropicBedrock;
22
- } catch {
23
- throw new Error(
24
- "BedrockAnthropicProvider requires @anthropic-ai/bedrock-sdk. Install it with: pnpm add @anthropic-ai/bedrock-sdk"
25
- );
26
- }
27
- const args = {
28
- awsRegion: opts.region ?? "us-east-1",
29
- maxRetries: 0
30
- };
31
- if (opts.baseURL) args.baseURL = opts.baseURL;
32
- if (opts.credentials) {
33
- args.awsAccessKey = opts.credentials.accessKeyId;
34
- args.awsSecretKey = opts.credentials.secretAccessKey;
35
- if (opts.credentials.sessionToken) {
36
- args.awsSessionToken = opts.credentials.sessionToken;
37
- }
38
- }
39
- this.client = new AnthropicBedrock(args);
40
- }
41
- this.defaultModel = opts.model ?? "us.anthropic.claude-opus-4.6-v1:0";
42
- this.cacheConfig = opts.cacheControl;
43
- }
44
- async *chat(params) {
45
- yield* streamAnthropicChat(
46
- this.client,
47
- params,
48
- this.defaultModel,
49
- this.cacheConfig
50
- );
51
- }
52
- };
53
- export {
54
- BedrockAnthropicProvider
55
- };
56
- //# sourceMappingURL=bedrock.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/providers/bedrock.ts"],"sourcesContent":["import type {\n AIProvider,\n ChatParams,\n ChatStreamChunk,\n} from \"./types.js\";\nimport type { CacheControlConfig } from \"./cache.js\";\nimport { streamAnthropicChat, type AnthropicStreamClient } from \"./anthropic-shared.js\";\n\nexport interface BedrockAnthropicProviderOptions {\n /** AWS region (default: us-east-1). */\n region?: string;\n /** Explicit AWS credentials. If omitted, the SDK uses the default credential chain. */\n credentials?: {\n accessKeyId: string;\n secretAccessKey: string;\n sessionToken?: string;\n };\n /** Model ID in Bedrock format (default: us.anthropic.claude-opus-4.6-v1:0). */\n model?: string;\n /** Custom base URL for a Bedrock-compatible endpoint. */\n baseURL?: string;\n /** Cache control config (same as AnthropicProvider). */\n cacheControl?: CacheControlConfig;\n /**\n * Pre-constructed AnthropicBedrock client. When provided, all other\n * connection options are ignored. Useful for testing or advanced setups.\n */\n client?: unknown;\n}\n\n/**\n * Anthropic provider routed through AWS Bedrock.\n *\n * Requires `@anthropic-ai/bedrock-sdk` as an optional peer dependency.\n * Install it with: `pnpm add @anthropic-ai/bedrock-sdk`\n */\nexport class BedrockAnthropicProvider implements AIProvider {\n private client: AnthropicStreamClient;\n readonly defaultModel: string;\n private cacheConfig: CacheControlConfig | undefined;\n\n constructor(opts: BedrockAnthropicProviderOptions) {\n if (opts.client) {\n this.client = opts.client as AnthropicStreamClient;\n } else {\n let AnthropicBedrock: new (args: Record<string, unknown>) => unknown;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n AnthropicBedrock = require(\"@anthropic-ai/bedrock-sdk\").AnthropicBedrock;\n } catch {\n throw new Error(\n \"BedrockAnthropicProvider requires @anthropic-ai/bedrock-sdk. \" +\n \"Install it with: pnpm add @anthropic-ai/bedrock-sdk\",\n );\n }\n\n const args: Record<string, unknown> = {\n awsRegion: opts.region ?? \"us-east-1\",\n maxRetries: 0,\n };\n if (opts.baseURL) args.baseURL = opts.baseURL;\n if (opts.credentials) {\n args.awsAccessKey = opts.credentials.accessKeyId;\n args.awsSecretKey = opts.credentials.secretAccessKey;\n if (opts.credentials.sessionToken) {\n args.awsSessionToken = opts.credentials.sessionToken;\n }\n }\n\n this.client = new AnthropicBedrock(args) as unknown as AnthropicStreamClient;\n }\n\n this.defaultModel =\n opts.model ?? \"us.anthropic.claude-opus-4.6-v1:0\";\n this.cacheConfig = opts.cacheControl;\n }\n\n async *chat(params: ChatParams): AsyncIterable<ChatStreamChunk> {\n yield* streamAnthropicChat(\n this.client,\n params,\n this.defaultModel,\n this.cacheConfig,\n );\n }\n}\n"],"mappings":";;;;;;;;;;AAoCO,IAAM,2BAAN,MAAqD;AAAA,EAClD;AAAA,EACC;AAAA,EACD;AAAA,EAER,YAAY,MAAuC;AACjD,QAAI,KAAK,QAAQ;AACf,WAAK,SAAS,KAAK;AAAA,IACrB,OAAO;AACL,UAAI;AACJ,UAAI;AAEF,2BAAmB,UAAQ,2BAA2B,EAAE;AAAA,MAC1D,QAAQ;AACN,cAAM,IAAI;AAAA,UACR;AAAA,QAEF;AAAA,MACF;AAEA,YAAM,OAAgC;AAAA,QACpC,WAAW,KAAK,UAAU;AAAA,QAC1B,YAAY;AAAA,MACd;AACA,UAAI,KAAK,QAAS,MAAK,UAAU,KAAK;AACtC,UAAI,KAAK,aAAa;AACpB,aAAK,eAAe,KAAK,YAAY;AACrC,aAAK,eAAe,KAAK,YAAY;AACrC,YAAI,KAAK,YAAY,cAAc;AACjC,eAAK,kBAAkB,KAAK,YAAY;AAAA,QAC1C;AAAA,MACF;AAEA,WAAK,SAAS,IAAI,iBAAiB,IAAI;AAAA,IACzC;AAEA,SAAK,eACH,KAAK,SAAS;AAChB,SAAK,cAAc,KAAK;AAAA,EAC1B;AAAA,EAEA,OAAO,KAAK,QAAoD;AAC9D,WAAO;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,EACF;AACF;","names":[]}
@@ -1,17 +0,0 @@
1
- import { A as AIProvider, C as ChatParams, a as ChatStreamChunk } from '../types-kiGBF35b.js';
2
-
3
- interface GeminiProviderOptions {
4
- apiKey: string;
5
- model?: string;
6
- baseURL?: string;
7
- }
8
- declare class GeminiProvider implements AIProvider {
9
- private client;
10
- readonly defaultModel: string;
11
- constructor(opts: GeminiProviderOptions);
12
- chat(params: ChatParams): AsyncIterable<ChatStreamChunk>;
13
- private static contentPartsToGemini;
14
- private convertMessages;
15
- }
16
-
17
- export { GeminiProvider, type GeminiProviderOptions };
@@ -1,262 +0,0 @@
1
- import {
2
- ChatStreamError
3
- } from "../chunk-CCM2AXZG.js";
4
- import "../chunk-DGUM43GV.js";
5
-
6
- // src/providers/gemini.ts
7
- import { GoogleGenAI } from "@google/genai";
8
- var GeminiProvider = class _GeminiProvider {
9
- client;
10
- defaultModel;
11
- constructor(opts) {
12
- const clientOpts = { apiKey: opts.apiKey };
13
- if (opts.baseURL) clientOpts.httpOptions = { baseUrl: opts.baseURL };
14
- this.client = new GoogleGenAI(clientOpts);
15
- this.defaultModel = opts.model ?? "gemini-2.5-flash";
16
- }
17
- async *chat(params) {
18
- const { contents, systemInstruction } = this.convertMessages(
19
- params.system,
20
- params.messages
21
- );
22
- const tools = params.tools?.length ? [
23
- {
24
- functionDeclarations: params.tools.map((t) => ({
25
- name: t.function.name,
26
- description: t.function.description,
27
- parameters: t.function.parameters
28
- }))
29
- }
30
- ] : void 0;
31
- const thinkingEnabled = params.thinking?.type === "enabled" && params.thinking.budgetTokens > 0;
32
- const thinkingBudget = thinkingEnabled ? params.thinking.budgetTokens : 0;
33
- const config = {
34
- systemInstruction: systemInstruction || void 0,
35
- maxOutputTokens: params.max_tokens,
36
- temperature: params.temperature,
37
- tools
38
- };
39
- if (thinkingEnabled) {
40
- config.thinkingConfig = { thinkingBudget };
41
- }
42
- if (params.outputFormat?.type === "json_schema") {
43
- config.responseSchema = params.outputFormat.schema;
44
- config.responseMimeType = "application/json";
45
- } else if (params.outputFormat?.type === "json_object") {
46
- config.responseMimeType = "application/json";
47
- }
48
- if (params.signal) {
49
- config.httpOptions = {
50
- ...config.httpOptions ?? {},
51
- signal: params.signal
52
- };
53
- }
54
- try {
55
- const stream = await this.client.models.generateContentStream({
56
- model: params.model ?? this.defaultModel,
57
- contents,
58
- config
59
- });
60
- let chunkIndex = 0;
61
- let toolCallIndex = 0;
62
- let responseHasToolCalls = false;
63
- let finishReasonSeen = false;
64
- let lastUsage;
65
- for await (const chunk of stream) {
66
- const chunkId = `gemini-${chunkIndex++}`;
67
- const model = params.model ?? this.defaultModel;
68
- const meta = chunk.usageMetadata;
69
- if (meta) {
70
- const prompt = meta.promptTokenCount ?? 0;
71
- const completion = meta.candidatesTokenCount ?? 0;
72
- lastUsage = {
73
- prompt_tokens: prompt,
74
- completion_tokens: completion,
75
- total_tokens: meta.totalTokenCount ?? prompt + completion,
76
- thinking_tokens: meta.thoughtsTokenCount || void 0
77
- };
78
- }
79
- const candidates = chunk.candidates;
80
- if (!candidates || candidates.length === 0) continue;
81
- const parts = candidates[0].content?.parts;
82
- if (parts) {
83
- for (const part of parts) {
84
- if (part.thought && part.text !== void 0 && part.text !== null) {
85
- yield {
86
- id: chunkId,
87
- model,
88
- choices: [
89
- {
90
- index: 0,
91
- delta: { thinking_content: part.text },
92
- finish_reason: null
93
- }
94
- ]
95
- };
96
- continue;
97
- }
98
- if (part.text !== void 0 && part.text !== null) {
99
- yield {
100
- id: chunkId,
101
- model,
102
- choices: [
103
- {
104
- index: 0,
105
- delta: { content: part.text },
106
- finish_reason: null
107
- }
108
- ]
109
- };
110
- }
111
- if (part.functionCall) {
112
- const fc = part.functionCall;
113
- const tcId = `gemini-tc-${toolCallIndex}`;
114
- const idx = toolCallIndex++;
115
- responseHasToolCalls = true;
116
- yield {
117
- id: chunkId,
118
- model,
119
- choices: [
120
- {
121
- index: 0,
122
- delta: {
123
- tool_calls: [
124
- {
125
- index: idx,
126
- id: tcId,
127
- type: "function",
128
- function: {
129
- name: fc.name,
130
- arguments: JSON.stringify(fc.args ?? {})
131
- }
132
- }
133
- ]
134
- },
135
- finish_reason: null
136
- }
137
- ]
138
- };
139
- }
140
- }
141
- }
142
- const finishReason = candidates[0].finishReason;
143
- if (finishReason && finishReason !== "FINISH_REASON_UNSPECIFIED") {
144
- let mapped;
145
- if (finishReason === "STOP") {
146
- mapped = responseHasToolCalls ? "tool_calls" : "stop";
147
- } else if (finishReason === "MAX_TOKENS") {
148
- mapped = "length";
149
- } else if (finishReason === "SAFETY" || finishReason === "RECITATION" || finishReason === "BLOCKLIST" || finishReason === "PROHIBITED_CONTENT" || finishReason === "SPII" || finishReason === "MALFORMED_FUNCTION_CALL") {
150
- mapped = "content_filter";
151
- } else {
152
- mapped = "stop";
153
- }
154
- finishReasonSeen = true;
155
- yield {
156
- id: chunkId,
157
- model,
158
- choices: [{ index: 0, delta: {}, finish_reason: mapped }],
159
- usage: lastUsage
160
- };
161
- }
162
- }
163
- if (!finishReasonSeen && chunkIndex > 0) {
164
- throw new ChatStreamError("Gemini stream ended without finish reason", {
165
- cause: new Error("incomplete_stream")
166
- });
167
- }
168
- } catch (err) {
169
- if (err instanceof ChatStreamError) throw err;
170
- const apiErr = err;
171
- const status = apiErr.status ?? apiErr.statusCode ?? apiErr.code;
172
- throw new ChatStreamError(
173
- err instanceof Error ? err.message : String(err),
174
- {
175
- status: typeof status === "number" ? status : void 0,
176
- cause: err
177
- }
178
- );
179
- }
180
- }
181
- static contentPartsToGemini(parts) {
182
- return parts.map((part) => {
183
- if (part.type === "text") {
184
- return { text: part.text };
185
- }
186
- if (part.type === "image") {
187
- return { inlineData: { mimeType: part.media_type, data: part.data } };
188
- }
189
- return { text: `[image: ${part.url}]` };
190
- });
191
- }
192
- convertMessages(systemPrompt, messages) {
193
- const contents = [];
194
- const toolCallIdToName = /* @__PURE__ */ new Map();
195
- for (const msg of messages) {
196
- if (msg.role === "assistant" && msg.tool_calls) {
197
- for (const tc of msg.tool_calls) {
198
- toolCallIdToName.set(tc.id, tc.function.name);
199
- }
200
- }
201
- }
202
- let pendingFunctionResponses = [];
203
- for (const msg of messages) {
204
- if (msg.role === "system") {
205
- continue;
206
- }
207
- if (msg.role === "user") {
208
- if (pendingFunctionResponses.length > 0) {
209
- contents.push({ role: "user", parts: pendingFunctionResponses });
210
- pendingFunctionResponses = [];
211
- }
212
- if (Array.isArray(msg.content)) {
213
- const parts = _GeminiProvider.contentPartsToGemini(msg.content);
214
- contents.push({ role: "user", parts });
215
- } else {
216
- contents.push({ role: "user", parts: [{ text: msg.content }] });
217
- }
218
- } else if (msg.role === "assistant") {
219
- const parts = [];
220
- if (msg.thinking_content) {
221
- parts.push({ text: msg.thinking_content, thought: true });
222
- }
223
- if (msg.content) {
224
- parts.push({ text: msg.content });
225
- }
226
- if (msg.tool_calls) {
227
- for (const tc of msg.tool_calls) {
228
- let args = {};
229
- try {
230
- args = JSON.parse(tc.function.arguments);
231
- } catch {
232
- }
233
- parts.push({
234
- functionCall: { name: tc.function.name, args }
235
- });
236
- }
237
- }
238
- if (parts.length === 0) {
239
- parts.push({ text: "" });
240
- }
241
- contents.push({ role: "model", parts });
242
- } else if (msg.role === "tool") {
243
- const fnName = toolCallIdToName.get(msg.tool_call_id) ?? msg.tool_call_id;
244
- const resultValue = Array.isArray(msg.content) ? msg.content.filter((p) => p.type === "text").map((p) => p.text).join("") : msg.content;
245
- pendingFunctionResponses.push({
246
- functionResponse: {
247
- name: fnName,
248
- response: { result: resultValue }
249
- }
250
- });
251
- }
252
- }
253
- if (pendingFunctionResponses.length > 0) {
254
- contents.push({ role: "user", parts: pendingFunctionResponses });
255
- }
256
- return { contents, systemInstruction: systemPrompt };
257
- }
258
- };
259
- export {
260
- GeminiProvider
261
- };
262
- //# sourceMappingURL=gemini.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/providers/gemini.ts"],"sourcesContent":["import { GoogleGenAI } from \"@google/genai\";\nimport type {\n AIProvider,\n ChatParams,\n ChatStreamChunk,\n} from \"./types.js\";\nimport { ChatStreamError } from \"./types.js\";\nimport type { ChatMessage, ContentPart } from \"../session/types.js\";\n\nexport interface GeminiProviderOptions {\n apiKey: string;\n model?: string;\n baseURL?: string;\n}\n\ninterface GeminiContent {\n role: \"user\" | \"model\";\n parts: GeminiPart[];\n}\n\ninterface GeminiPart {\n text?: string;\n thought?: boolean;\n inlineData?: { mimeType: string; data: string };\n functionCall?: { name: string; args: Record<string, unknown> };\n functionResponse?: {\n name: string;\n response: { result: unknown };\n };\n}\n\nexport class GeminiProvider implements AIProvider {\n private client: GoogleGenAI;\n readonly defaultModel: string;\n\n constructor(opts: GeminiProviderOptions) {\n const clientOpts: Record<string, unknown> = { apiKey: opts.apiKey };\n if (opts.baseURL) clientOpts.httpOptions = { baseUrl: opts.baseURL };\n this.client = new GoogleGenAI(clientOpts as ConstructorParameters<typeof GoogleGenAI>[0]);\n this.defaultModel = opts.model ?? \"gemini-2.5-flash\";\n }\n\n async *chat(params: ChatParams): AsyncIterable<ChatStreamChunk> {\n const { contents, systemInstruction } = this.convertMessages(\n params.system,\n params.messages,\n );\n\n const tools = params.tools?.length\n ? [\n {\n functionDeclarations: params.tools.map((t) => ({\n name: t.function.name,\n description: t.function.description,\n parameters: t.function.parameters as Record<string, unknown>,\n })),\n },\n ]\n : undefined;\n\n const thinkingEnabled =\n params.thinking?.type === \"enabled\" &&\n (params.thinking as { budgetTokens: number }).budgetTokens > 0;\n const thinkingBudget = thinkingEnabled\n ? (params.thinking as { type: \"enabled\"; budgetTokens: number }).budgetTokens\n : 0;\n\n const config: Record<string, unknown> = {\n systemInstruction: systemInstruction || undefined,\n maxOutputTokens: params.max_tokens,\n temperature: params.temperature,\n tools,\n };\n\n if (thinkingEnabled) {\n config.thinkingConfig = { thinkingBudget: thinkingBudget };\n }\n\n if (params.outputFormat?.type === \"json_schema\") {\n config.responseSchema = params.outputFormat.schema;\n config.responseMimeType = \"application/json\";\n } else if (params.outputFormat?.type === \"json_object\") {\n config.responseMimeType = \"application/json\";\n }\n\n if (params.signal) {\n (config as Record<string, unknown>).httpOptions = {\n ...((config as Record<string, unknown>).httpOptions as Record<string, unknown> ?? {}),\n signal: params.signal,\n };\n }\n\n try {\n const stream = await this.client.models.generateContentStream({\n model: params.model ?? this.defaultModel,\n contents,\n config,\n });\n\n let chunkIndex = 0;\n let toolCallIndex = 0;\n let responseHasToolCalls = false;\n let finishReasonSeen = false;\n let lastUsage: ChatStreamChunk[\"usage\"] | undefined;\n\n for await (const chunk of stream) {\n const chunkId = `gemini-${chunkIndex++}`;\n const model = params.model ?? this.defaultModel;\n\n const meta = chunk.usageMetadata as\n | { promptTokenCount?: number; candidatesTokenCount?: number; totalTokenCount?: number; thoughtsTokenCount?: number }\n | undefined;\n if (meta) {\n const prompt = meta.promptTokenCount ?? 0;\n const completion = meta.candidatesTokenCount ?? 0;\n lastUsage = {\n prompt_tokens: prompt,\n completion_tokens: completion,\n total_tokens: meta.totalTokenCount ?? (prompt + completion),\n thinking_tokens: meta.thoughtsTokenCount || undefined,\n };\n }\n\n const candidates = chunk.candidates;\n if (!candidates || candidates.length === 0) continue;\n\n const parts = candidates[0].content?.parts as GeminiPart[] | undefined;\n\n if (parts) {\n for (const part of parts) {\n if (part.thought && part.text !== undefined && part.text !== null) {\n yield {\n id: chunkId,\n model,\n choices: [\n {\n index: 0,\n delta: { thinking_content: part.text },\n finish_reason: null,\n },\n ],\n };\n continue;\n }\n\n if (part.text !== undefined && part.text !== null) {\n yield {\n id: chunkId,\n model,\n choices: [\n {\n index: 0,\n delta: { content: part.text },\n finish_reason: null,\n },\n ],\n };\n }\n\n if (part.functionCall) {\n const fc = part.functionCall;\n const tcId = `gemini-tc-${toolCallIndex}`;\n const idx = toolCallIndex++;\n responseHasToolCalls = true;\n\n yield {\n id: chunkId,\n model,\n choices: [\n {\n index: 0,\n delta: {\n tool_calls: [\n {\n index: idx,\n id: tcId,\n type: \"function\" as const,\n function: {\n name: fc.name,\n arguments: JSON.stringify(fc.args ?? {}),\n },\n },\n ],\n },\n finish_reason: null,\n },\n ],\n };\n }\n }\n }\n\n const finishReason = candidates[0].finishReason;\n if (finishReason && finishReason !== \"FINISH_REASON_UNSPECIFIED\") {\n let mapped: string;\n if (finishReason === \"STOP\") {\n mapped = responseHasToolCalls ? \"tool_calls\" : \"stop\";\n } else if (finishReason === \"MAX_TOKENS\") {\n mapped = \"length\";\n } else if (\n finishReason === \"SAFETY\" || finishReason === \"RECITATION\" ||\n finishReason === \"BLOCKLIST\" || finishReason === \"PROHIBITED_CONTENT\" ||\n finishReason === \"SPII\" || finishReason === \"MALFORMED_FUNCTION_CALL\"\n ) {\n mapped = \"content_filter\";\n } else {\n mapped = \"stop\";\n }\n\n finishReasonSeen = true;\n yield {\n id: chunkId,\n model,\n choices: [{ index: 0, delta: {}, finish_reason: mapped }],\n usage: lastUsage,\n };\n }\n }\n\n if (!finishReasonSeen && chunkIndex > 0) {\n throw new ChatStreamError(\"Gemini stream ended without finish reason\", {\n cause: new Error(\"incomplete_stream\"),\n });\n }\n } catch (err: unknown) {\n if (err instanceof ChatStreamError) throw err;\n const apiErr = err as { status?: number; statusCode?: number; code?: number };\n const status = apiErr.status ?? apiErr.statusCode ?? apiErr.code;\n throw new ChatStreamError(\n err instanceof Error ? err.message : String(err),\n {\n status: typeof status === \"number\" ? status : undefined,\n cause: err,\n },\n );\n }\n }\n\n private static contentPartsToGemini(parts: ContentPart[]): GeminiPart[] {\n return parts.map((part) => {\n if (part.type === \"text\") {\n return { text: part.text };\n }\n if (part.type === \"image\") {\n return { inlineData: { mimeType: part.media_type, data: part.data } };\n }\n // image_url — Gemini doesn't natively support URL references as inlineData;\n // pass it as text with the URL. Consumers should prefer base64 ImageContent.\n return { text: `[image: ${part.url}]` };\n });\n }\n\n private convertMessages(\n systemPrompt: string | undefined,\n messages: ChatMessage[],\n ): { contents: GeminiContent[]; systemInstruction: string | undefined } {\n const contents: GeminiContent[] = [];\n\n const toolCallIdToName = new Map<string, string>();\n for (const msg of messages) {\n if (msg.role === \"assistant\" && msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n toolCallIdToName.set(tc.id, tc.function.name);\n }\n }\n }\n\n let pendingFunctionResponses: GeminiPart[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n continue;\n }\n\n if (msg.role === \"user\") {\n if (pendingFunctionResponses.length > 0) {\n contents.push({ role: \"user\", parts: pendingFunctionResponses });\n pendingFunctionResponses = [];\n }\n if (Array.isArray(msg.content)) {\n const parts = GeminiProvider.contentPartsToGemini(msg.content as ContentPart[]);\n contents.push({ role: \"user\", parts });\n } else {\n contents.push({ role: \"user\", parts: [{ text: msg.content as string }] });\n }\n } else if (msg.role === \"assistant\") {\n const parts: GeminiPart[] = [];\n if (msg.thinking_content) {\n parts.push({ text: msg.thinking_content, thought: true });\n }\n if (msg.content) {\n parts.push({ text: msg.content });\n }\n if (msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.function.arguments);\n } catch {\n // malformed\n }\n parts.push({\n functionCall: { name: tc.function.name, args },\n });\n }\n }\n if (parts.length === 0) {\n parts.push({ text: \"\" });\n }\n contents.push({ role: \"model\", parts });\n } else if (msg.role === \"tool\") {\n const fnName =\n toolCallIdToName.get(msg.tool_call_id) ?? msg.tool_call_id;\n const resultValue = Array.isArray(msg.content)\n ? (msg.content as ContentPart[])\n .filter((p): p is Extract<ContentPart, { type: \"text\" }> => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\")\n : msg.content;\n pendingFunctionResponses.push({\n functionResponse: {\n name: fnName,\n response: { result: resultValue },\n },\n });\n }\n }\n\n if (pendingFunctionResponses.length > 0) {\n contents.push({ role: \"user\", parts: pendingFunctionResponses });\n }\n\n return { contents, systemInstruction: systemPrompt };\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,13 +0,0 @@
1
- import { OpenAIProvider } from './openai.js';
2
- import '../types-kiGBF35b.js';
3
-
4
- interface OllamaProviderOptions {
5
- /** Ollama server URL. Defaults to http://localhost:11434/v1. */
6
- baseURL?: string;
7
- model?: string;
8
- }
9
- declare class OllamaProvider extends OpenAIProvider {
10
- constructor(opts?: OllamaProviderOptions);
11
- }
12
-
13
- export { OllamaProvider, type OllamaProviderOptions };
@@ -1,20 +0,0 @@
1
- import {
2
- OpenAIProvider
3
- } from "../chunk-I3JTUFPK.js";
4
- import "../chunk-CCM2AXZG.js";
5
- import "../chunk-DGUM43GV.js";
6
-
7
- // src/providers/ollama.ts
8
- var OllamaProvider = class extends OpenAIProvider {
9
- constructor(opts = {}) {
10
- super({
11
- baseURL: opts.baseURL ?? "http://localhost:11434/v1",
12
- model: opts.model ?? "qwen2.5-coder:32b",
13
- compatMode: true
14
- });
15
- }
16
- };
17
- export {
18
- OllamaProvider
19
- };
20
- //# sourceMappingURL=ollama.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/providers/ollama.ts"],"sourcesContent":["import { OpenAIProvider } from \"./openai.js\";\n\nexport interface OllamaProviderOptions {\n /** Ollama server URL. Defaults to http://localhost:11434/v1. */\n baseURL?: string;\n model?: string;\n}\n\nexport class OllamaProvider extends OpenAIProvider {\n constructor(opts: OllamaProviderOptions = {}) {\n super({\n baseURL: opts.baseURL ?? \"http://localhost:11434/v1\",\n model: opts.model ?? \"qwen2.5-coder:32b\",\n compatMode: true,\n });\n }\n}\n"],"mappings":";;;;;;;AAQO,IAAM,iBAAN,cAA6B,eAAe;AAAA,EACjD,YAAY,OAA8B,CAAC,GAAG;AAC5C,UAAM;AAAA,MACJ,SAAS,KAAK,WAAW;AAAA,MACzB,OAAO,KAAK,SAAS;AAAA,MACrB,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AACF;","names":[]}
@@ -1,21 +0,0 @@
1
- import { A as AIProvider, C as ChatParams, a as ChatStreamChunk } from '../types-kiGBF35b.js';
2
-
3
- interface OpenAIProviderOptions {
4
- apiKey?: string;
5
- baseURL?: string;
6
- model?: string;
7
- defaultHeaders?: Record<string, string | undefined>;
8
- /** When true, omits `stream_options` that some OpenAI-compatible endpoints don't support. */
9
- compatMode?: boolean;
10
- }
11
- declare class OpenAIProvider implements AIProvider {
12
- private client;
13
- readonly defaultModel: string;
14
- protected compatMode: boolean;
15
- constructor(opts: OpenAIProviderOptions);
16
- chat(params: ChatParams): AsyncIterable<ChatStreamChunk>;
17
- private static contentPartsToOpenAI;
18
- private buildMessages;
19
- }
20
-
21
- export { OpenAIProvider, type OpenAIProviderOptions };
@@ -1,9 +0,0 @@
1
- import {
2
- OpenAIProvider
3
- } from "../chunk-I3JTUFPK.js";
4
- import "../chunk-CCM2AXZG.js";
5
- import "../chunk-DGUM43GV.js";
6
- export {
7
- OpenAIProvider
8
- };
9
- //# sourceMappingURL=openai.js.map
@@ -1,16 +0,0 @@
1
- import { OpenAIProvider } from './openai.js';
2
- import '../types-kiGBF35b.js';
3
-
4
- interface OpenRouterProviderOptions {
5
- apiKey: string;
6
- model?: string;
7
- /** Displayed on openrouter.ai rankings. Sent as the `X-Title` header. */
8
- appName?: string;
9
- /** Used for openrouter.ai rankings. Sent as the `HTTP-Referer` header. */
10
- appUrl?: string;
11
- }
12
- declare class OpenRouterProvider extends OpenAIProvider {
13
- constructor(opts: OpenRouterProviderOptions);
14
- }
15
-
16
- export { OpenRouterProvider, type OpenRouterProviderOptions };
@@ -1,24 +0,0 @@
1
- import {
2
- OpenAIProvider
3
- } from "../chunk-I3JTUFPK.js";
4
- import "../chunk-CCM2AXZG.js";
5
- import "../chunk-DGUM43GV.js";
6
-
7
- // src/providers/openrouter.ts
8
- var OpenRouterProvider = class extends OpenAIProvider {
9
- constructor(opts) {
10
- super({
11
- apiKey: opts.apiKey,
12
- baseURL: "https://openrouter.ai/api/v1",
13
- model: opts.model ?? "anthropic/claude-opus-4.6",
14
- defaultHeaders: {
15
- ...opts.appName ? { "X-Title": opts.appName } : {},
16
- ...opts.appUrl ? { "HTTP-Referer": opts.appUrl } : {}
17
- }
18
- });
19
- }
20
- };
21
- export {
22
- OpenRouterProvider
23
- };
24
- //# sourceMappingURL=openrouter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/providers/openrouter.ts"],"sourcesContent":["import { OpenAIProvider } from \"./openai.js\";\n\nexport interface OpenRouterProviderOptions {\n apiKey: string;\n model?: string;\n /** Displayed on openrouter.ai rankings. Sent as the `X-Title` header. */\n appName?: string;\n /** Used for openrouter.ai rankings. Sent as the `HTTP-Referer` header. */\n appUrl?: string;\n}\n\nexport class OpenRouterProvider extends OpenAIProvider {\n constructor(opts: OpenRouterProviderOptions) {\n super({\n apiKey: opts.apiKey,\n baseURL: \"https://openrouter.ai/api/v1\",\n model: opts.model ?? \"anthropic/claude-opus-4.6\",\n defaultHeaders: {\n ...(opts.appName ? { \"X-Title\": opts.appName } : {}),\n ...(opts.appUrl ? { \"HTTP-Referer\": opts.appUrl } : {}),\n },\n });\n }\n}\n"],"mappings":";;;;;;;AAWO,IAAM,qBAAN,cAAiC,eAAe;AAAA,EACrD,YAAY,MAAiC;AAC3C,UAAM;AAAA,MACJ,QAAQ,KAAK;AAAA,MACb,SAAS;AAAA,MACT,OAAO,KAAK,SAAS;AAAA,MACrB,gBAAgB;AAAA,QACd,GAAI,KAAK,UAAU,EAAE,WAAW,KAAK,QAAQ,IAAI,CAAC;AAAA,QAClD,GAAI,KAAK,SAAS,EAAE,gBAAgB,KAAK,OAAO,IAAI,CAAC;AAAA,MACvD;AAAA,IACF,CAAC;AAAA,EACH;AACF;","names":[]}
@@ -1,42 +0,0 @@
1
- import { A as AIProvider, C as ChatParams, a as ChatStreamChunk } from '../types-kiGBF35b.js';
2
- import { C as CacheControlConfig } from '../cache-BlBwXXPS.js';
3
-
4
- interface VertexAnthropicProviderOptions {
5
- /** GCP project ID. If omitted, inferred from application default credentials. */
6
- projectId?: string;
7
- /** GCP region (default: us-east5). */
8
- region?: string;
9
- /**
10
- * A `GoogleAuth` instance or any object with a compatible `getClient()` method.
11
- * If omitted, the provider creates one using application default credentials.
12
- * Requires `google-auth-library` as a peer dependency.
13
- */
14
- googleAuth?: unknown;
15
- /** Model ID in Vertex format (default: claude-opus-4.6). */
16
- model?: string;
17
- /** Cache control config (same as AnthropicProvider). */
18
- cacheControl?: CacheControlConfig;
19
- /** Custom base URL for the Vertex API endpoint. */
20
- baseURL?: string;
21
- /**
22
- * Pre-constructed AnthropicVertex client. When provided, all other
23
- * connection options are ignored. Useful for testing or advanced setups.
24
- */
25
- client?: unknown;
26
- }
27
- /**
28
- * Anthropic provider routed through Google Cloud Vertex AI.
29
- *
30
- * Requires `@anthropic-ai/vertex-sdk` as an optional peer dependency.
31
- * If `googleAuth` is not provided, also requires `google-auth-library`.
32
- * Install with: `pnpm add @anthropic-ai/vertex-sdk google-auth-library`
33
- */
34
- declare class VertexAnthropicProvider implements AIProvider {
35
- private client;
36
- readonly defaultModel: string;
37
- private cacheConfig;
38
- constructor(opts: VertexAnthropicProviderOptions);
39
- chat(params: ChatParams): AsyncIterable<ChatStreamChunk>;
40
- }
41
-
42
- export { VertexAnthropicProvider, type VertexAnthropicProviderOptions };
@@ -1,68 +0,0 @@
1
- import {
2
- DEFAULT_ANTHROPIC_MODEL,
3
- streamAnthropicChat
4
- } from "../chunk-ZXSDKBYB.js";
5
- import "../chunk-HEQQQGK5.js";
6
- import "../chunk-CCM2AXZG.js";
7
- import {
8
- __require
9
- } from "../chunk-DGUM43GV.js";
10
-
11
- // src/providers/vertex.ts
12
- var VertexAnthropicProvider = class {
13
- client;
14
- defaultModel;
15
- cacheConfig;
16
- constructor(opts) {
17
- if (opts.client) {
18
- this.client = opts.client;
19
- } else {
20
- let AnthropicVertex;
21
- try {
22
- AnthropicVertex = __require("@anthropic-ai/vertex-sdk").AnthropicVertex;
23
- } catch {
24
- throw new Error(
25
- "VertexAnthropicProvider requires @anthropic-ai/vertex-sdk. Install it with: pnpm add @anthropic-ai/vertex-sdk"
26
- );
27
- }
28
- let googleAuth = opts.googleAuth;
29
- if (!googleAuth) {
30
- let GoogleAuth;
31
- try {
32
- GoogleAuth = __require("google-auth-library").GoogleAuth;
33
- } catch {
34
- throw new Error(
35
- "VertexAnthropicProvider requires google-auth-library when googleAuth is not provided. Install it with: pnpm add google-auth-library"
36
- );
37
- }
38
- const authArgs = {
39
- scopes: ["https://www.googleapis.com/auth/cloud-platform"]
40
- };
41
- if (opts.projectId) authArgs.projectId = opts.projectId;
42
- googleAuth = new GoogleAuth(authArgs);
43
- }
44
- const args = {
45
- region: opts.region ?? "us-east5",
46
- googleAuth,
47
- maxRetries: 0
48
- };
49
- if (opts.projectId) args.projectId = opts.projectId;
50
- if (opts.baseURL) args.baseURL = opts.baseURL;
51
- this.client = new AnthropicVertex(args);
52
- }
53
- this.defaultModel = opts.model ?? DEFAULT_ANTHROPIC_MODEL;
54
- this.cacheConfig = opts.cacheControl;
55
- }
56
- async *chat(params) {
57
- yield* streamAnthropicChat(
58
- this.client,
59
- params,
60
- this.defaultModel,
61
- this.cacheConfig
62
- );
63
- }
64
- };
65
- export {
66
- VertexAnthropicProvider
67
- };
68
- //# sourceMappingURL=vertex.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/providers/vertex.ts"],"sourcesContent":["import type {\n AIProvider,\n ChatParams,\n ChatStreamChunk,\n} from \"./types.js\";\nimport type { CacheControlConfig } from \"./cache.js\";\nimport {\n streamAnthropicChat,\n type AnthropicStreamClient,\n DEFAULT_ANTHROPIC_MODEL,\n} from \"./anthropic-shared.js\";\n\nexport interface VertexAnthropicProviderOptions {\n /** GCP project ID. If omitted, inferred from application default credentials. */\n projectId?: string;\n /** GCP region (default: us-east5). */\n region?: string;\n /**\n * A `GoogleAuth` instance or any object with a compatible `getClient()` method.\n * If omitted, the provider creates one using application default credentials.\n * Requires `google-auth-library` as a peer dependency.\n */\n googleAuth?: unknown;\n /** Model ID in Vertex format (default: claude-opus-4.6). */\n model?: string;\n /** Cache control config (same as AnthropicProvider). */\n cacheControl?: CacheControlConfig;\n /** Custom base URL for the Vertex API endpoint. */\n baseURL?: string;\n /**\n * Pre-constructed AnthropicVertex client. When provided, all other\n * connection options are ignored. Useful for testing or advanced setups.\n */\n client?: unknown;\n}\n\n/**\n * Anthropic provider routed through Google Cloud Vertex AI.\n *\n * Requires `@anthropic-ai/vertex-sdk` as an optional peer dependency.\n * If `googleAuth` is not provided, also requires `google-auth-library`.\n * Install with: `pnpm add @anthropic-ai/vertex-sdk google-auth-library`\n */\nexport class VertexAnthropicProvider implements AIProvider {\n private client: AnthropicStreamClient;\n readonly defaultModel: string;\n private cacheConfig: CacheControlConfig | undefined;\n\n constructor(opts: VertexAnthropicProviderOptions) {\n if (opts.client) {\n this.client = opts.client as AnthropicStreamClient;\n } else {\n let AnthropicVertex: new (args: Record<string, unknown>) => unknown;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n AnthropicVertex = require(\"@anthropic-ai/vertex-sdk\").AnthropicVertex;\n } catch {\n throw new Error(\n \"VertexAnthropicProvider requires @anthropic-ai/vertex-sdk. \" +\n \"Install it with: pnpm add @anthropic-ai/vertex-sdk\",\n );\n }\n\n let googleAuth = opts.googleAuth;\n if (!googleAuth) {\n let GoogleAuth: new (args: Record<string, unknown>) => unknown;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n GoogleAuth = require(\"google-auth-library\").GoogleAuth;\n } catch {\n throw new Error(\n \"VertexAnthropicProvider requires google-auth-library when googleAuth is not provided. \" +\n \"Install it with: pnpm add google-auth-library\",\n );\n }\n const authArgs: Record<string, unknown> = {\n scopes: [\"https://www.googleapis.com/auth/cloud-platform\"],\n };\n if (opts.projectId) authArgs.projectId = opts.projectId;\n googleAuth = new GoogleAuth(authArgs);\n }\n\n const args: Record<string, unknown> = {\n region: opts.region ?? \"us-east5\",\n googleAuth,\n maxRetries: 0,\n };\n if (opts.projectId) args.projectId = opts.projectId;\n if (opts.baseURL) args.baseURL = opts.baseURL;\n\n this.client = new AnthropicVertex(args) as unknown as AnthropicStreamClient;\n }\n\n this.defaultModel = opts.model ?? DEFAULT_ANTHROPIC_MODEL;\n this.cacheConfig = opts.cacheControl;\n }\n\n async *chat(params: ChatParams): AsyncIterable<ChatStreamChunk> {\n yield* streamAnthropicChat(\n this.client,\n params,\n this.defaultModel,\n this.cacheConfig,\n );\n }\n}\n"],"mappings":";;;;;;;;;;;AA2CO,IAAM,0BAAN,MAAoD;AAAA,EACjD;AAAA,EACC;AAAA,EACD;AAAA,EAER,YAAY,MAAsC;AAChD,QAAI,KAAK,QAAQ;AACf,WAAK,SAAS,KAAK;AAAA,IACrB,OAAO;AACL,UAAI;AACJ,UAAI;AAEF,0BAAkB,UAAQ,0BAA0B,EAAE;AAAA,MACxD,QAAQ;AACN,cAAM,IAAI;AAAA,UACR;AAAA,QAEF;AAAA,MACF;AAEA,UAAI,aAAa,KAAK;AACtB,UAAI,CAAC,YAAY;AACf,YAAI;AACJ,YAAI;AAEF,uBAAa,UAAQ,qBAAqB,EAAE;AAAA,QAC9C,QAAQ;AACN,gBAAM,IAAI;AAAA,YACR;AAAA,UAEF;AAAA,QACF;AACA,cAAM,WAAoC;AAAA,UACxC,QAAQ,CAAC,gDAAgD;AAAA,QAC3D;AACA,YAAI,KAAK,UAAW,UAAS,YAAY,KAAK;AAC9C,qBAAa,IAAI,WAAW,QAAQ;AAAA,MACtC;AAEA,YAAM,OAAgC;AAAA,QACpC,QAAQ,KAAK,UAAU;AAAA,QACvB;AAAA,QACA,YAAY;AAAA,MACd;AACA,UAAI,KAAK,UAAW,MAAK,YAAY,KAAK;AAC1C,UAAI,KAAK,QAAS,MAAK,UAAU,KAAK;AAEtC,WAAK,SAAS,IAAI,gBAAgB,IAAI;AAAA,IACxC;AAEA,SAAK,eAAe,KAAK,SAAS;AAClC,SAAK,cAAc,KAAK;AAAA,EAC1B;AAAA,EAEA,OAAO,KAAK,QAAoD;AAC9D,WAAO;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,EACF;AACF;","names":[]}