@curie-agent/providers 0.2.4 → 0.2.5

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.
@@ -9,10 +9,29 @@ function effortToBudget(effort) {
9
9
  default: return undefined;
10
10
  }
11
11
  }
12
+ function effortToAdaptiveEffort(effort) {
13
+ switch (effort) {
14
+ case 'low': return 'low';
15
+ case 'medium': return 'medium';
16
+ case 'high': return 'high';
17
+ case 'max': return 'max';
18
+ case 'auto':
19
+ default: return undefined;
20
+ }
21
+ }
22
+ const ADAPTIVE_MODELS = new Set([
23
+ 'claude-opus-4-7',
24
+ 'claude-sonnet-4-6',
25
+ 'claude-opus-4-6',
26
+ ]);
27
+ function isAdaptiveModel(model) {
28
+ return ADAPTIVE_MODELS.has(model);
29
+ }
12
30
  export class AnthropicProvider {
13
31
  name = 'anthropic';
14
32
  models = [
15
33
  'claude-opus-4-7',
34
+ 'claude-opus-4-6',
16
35
  'claude-sonnet-4-6',
17
36
  'claude-haiku-4-5-20251001',
18
37
  ];
@@ -32,23 +51,38 @@ export class AnthropicProvider {
32
51
  }
33
52
  stream(args) {
34
53
  const model = args.model || this.defaultModel;
35
- const thinkingBudget = effortToBudget(args.effort);
36
- // When thinking is enabled the model reserves the budget from max_tokens,
37
- // so raise the ceiling to leave room for the actual answer.
38
- const maxTokens = args.maxTokens || (thinkingBudget ? thinkingBudget + 8192 : 8192);
54
+ const useAdaptive = isAdaptiveModel(model);
55
+ const adaptiveEffort = effortToAdaptiveEffort(args.effort);
39
56
  const messages = this.mapMessages(args.messages);
40
57
  const tools = args.tools ? this.mapTools(args.tools) : undefined;
41
58
  const streamArgs = {
42
59
  model,
43
- max_tokens: maxTokens,
60
+ max_tokens: args.maxTokens || 16384,
44
61
  system: args.system,
45
62
  messages,
46
63
  tools,
47
- // Extended thinking requires temperature = 1.
48
- temperature: thinkingBudget ? 1 : args.temperature,
49
64
  };
50
- if (thinkingBudget) {
51
- streamArgs.thinking = { type: 'enabled', budget_tokens: thinkingBudget };
65
+ if (useAdaptive) {
66
+ streamArgs.thinking = { type: 'adaptive', display: 'summarized' };
67
+ if (adaptiveEffort) {
68
+ streamArgs.output_config = { effort: adaptiveEffort };
69
+ }
70
+ streamArgs.temperature = args.temperature;
71
+ }
72
+ else if (!useAdaptive && args.effort && args.effort !== 'auto') {
73
+ // Manual budget_tokens for older models (Haiku 4.5, etc.)
74
+ const thinkingBudget = effortToBudget(args.effort);
75
+ if (thinkingBudget) {
76
+ streamArgs.max_tokens = thinkingBudget + 8192;
77
+ streamArgs.thinking = { type: 'enabled', budget_tokens: thinkingBudget };
78
+ streamArgs.temperature = 1;
79
+ }
80
+ else {
81
+ streamArgs.temperature = args.temperature;
82
+ }
83
+ }
84
+ else {
85
+ streamArgs.temperature = args.temperature;
52
86
  }
53
87
  const sdkStream = this.client.messages.stream(streamArgs);
54
88
  // keyed by content block index
@@ -94,6 +128,7 @@ export class AnthropicProvider {
94
128
  const t = thinkingBlocks.get(event.index);
95
129
  if (t)
96
130
  t.thinking += event.delta.thinking;
131
+ yield { type: 'thinking-delta', text: event.delta.thinking };
97
132
  }
98
133
  else if (event.delta.type === 'signature_delta') {
99
134
  const t = thinkingBlocks.get(event.index);
@@ -102,16 +137,8 @@ export class AnthropicProvider {
102
137
  }
103
138
  }
104
139
  if (event.type === 'content_block_stop') {
105
- const tool = toolBlocks.get(event.index);
106
- if (tool) {
107
- let input = {};
108
- try {
109
- input = JSON.parse(tool.inputStr || '{}');
110
- }
111
- catch { /* empty input */ }
112
- yield { type: 'tool-call', id: tool.id, name: tool.name, input };
113
- toolBlocks.delete(event.index);
114
- }
140
+ // Tool calls are buffered until the stream completes so the TUI
141
+ // can render them as one grouped block (matching OpenRouter).
115
142
  const thinking = thinkingBlocks.get(event.index);
116
143
  if (thinking) {
117
144
  yield { type: 'thinking-block', thinking: thinking.thinking, signature: thinking.signature };
@@ -132,6 +159,16 @@ export class AnthropicProvider {
132
159
  yield { type: 'stop', reason: 'aborted' };
133
160
  return;
134
161
  }
162
+ // Flush buffered tool calls in stream order (Map preserves insertion order).
163
+ for (const [, tool] of toolBlocks) {
164
+ let input = {};
165
+ try {
166
+ input = JSON.parse(tool.inputStr || '{}');
167
+ }
168
+ catch { /* empty input */ }
169
+ yield { type: 'tool-call', id: tool.id, name: tool.name, input };
170
+ }
171
+ toolBlocks.clear();
135
172
  try {
136
173
  const final = await sdkStream.finalMessage();
137
174
  if (final.usage) {
@@ -176,22 +213,39 @@ export class AnthropicProvider {
176
213
  }
177
214
  async complete(args) {
178
215
  const model = args.model || this.defaultModel;
179
- const thinkingBudget = effortToBudget(args.effort);
180
- const maxTokens = args.maxTokens || (thinkingBudget ? thinkingBudget + 8192 : 8192);
216
+ const useAdaptive = isAdaptiveModel(model);
217
+ const adaptiveEffort = effortToAdaptiveEffort(args.effort);
181
218
  const messages = this.mapMessages(args.messages);
182
219
  const tools = args.tools ? this.mapTools(args.tools) : undefined;
183
- const streamArgs = {
220
+ const createArgs = {
184
221
  model,
185
- max_tokens: maxTokens,
222
+ max_tokens: args.maxTokens || 16384,
186
223
  system: args.system,
187
224
  messages,
188
225
  tools,
189
- temperature: thinkingBudget ? 1 : (args.temperature ?? 0),
190
226
  };
191
- if (thinkingBudget) {
192
- streamArgs.thinking = { type: 'enabled', budget_tokens: thinkingBudget };
227
+ if (useAdaptive) {
228
+ createArgs.thinking = { type: 'adaptive', display: 'summarized' };
229
+ if (adaptiveEffort) {
230
+ createArgs.output_config = { effort: adaptiveEffort };
231
+ }
232
+ createArgs.temperature = args.temperature;
233
+ }
234
+ else if (!useAdaptive && args.effort && args.effort !== 'auto') {
235
+ const thinkingBudget = effortToBudget(args.effort);
236
+ if (thinkingBudget) {
237
+ createArgs.max_tokens = thinkingBudget + 8192;
238
+ createArgs.thinking = { type: 'enabled', budget_tokens: thinkingBudget };
239
+ createArgs.temperature = 1;
240
+ }
241
+ else {
242
+ createArgs.temperature = args.temperature ?? 0;
243
+ }
244
+ }
245
+ else {
246
+ createArgs.temperature = args.temperature ?? 0;
193
247
  }
194
- const response = await this.client.messages.create(streamArgs);
248
+ const response = await this.client.messages.create(createArgs);
195
249
  const text = response.content
196
250
  .filter((c) => c.type === 'text')
197
251
  .map(c => c.text)
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/anthropic.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/anthropic.ts"],"names":[],"mappings":"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"}
@@ -7,12 +7,15 @@ export declare class GoogleGeminiProvider implements Provider {
7
7
  readonly name = "google";
8
8
  readonly models: string[];
9
9
  readonly defaultModel = "gemini-2.0-flash";
10
- private genAI;
10
+ private apiKey;
11
11
  private baseUrl;
12
12
  constructor(apiKey?: string, baseUrl?: string);
13
13
  private isThinkingModel;
14
- private baseModelParams;
15
- private getModel;
14
+ private apiEndpoint;
15
+ /** Build the API request body, including thinkingConfig for thinking models. */
16
+ private buildRequestBody;
17
+ /** Parse the SSE stream response line by line into complete JSON chunks. */
18
+ private parseSSEStream;
16
19
  stream(args: ProviderStreamArgs): CancelableIterable<ProviderEvent>;
17
20
  check(prompt: string, args?: {
18
21
  model?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../src/google.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EAIvB,MAAM,eAAe,CAAC;AAEvB,KAAK,kBAAkB,CAAC,CAAC,IAAI;IAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAAC,MAAM,IAAI,IAAI,CAAA;CAAE,CAAC;AAa5E,qBAAa,oBAAqB,YAAW,QAAQ;IACnD,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,MAAM,WAKb;IACF,QAAQ,CAAC,YAAY,sBAAsB;IAE3C,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAa7C,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,eAAe;IAQtB,OAAO,CAAC,QAAQ;IAalB,MAAM,CAAC,IAAI,EAAE,kBAAkB,GAAG,kBAAkB,CAAC,aAAa,CAAC;IA+E5D,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QACjC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,WAAW,CAAC;KACtB,GAAG,OAAO,CAAC,MAAM,CAAC;IAYb,QAAQ,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAwE3E,OAAO,CAAC,sBAAsB;IAQ9B;;;;;OAKG;IAEH,OAAO,CAAC,gBAAgB;IA8BxB,OAAO,CAAC,WAAW;CA+DpB"}
1
+ {"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../src/google.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EAIvB,MAAM,eAAe,CAAC;AAEvB,KAAK,kBAAkB,CAAC,CAAC,IAAI;IAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAAC,MAAM,IAAI,IAAI,CAAA;CAAE,CAAC;AAmC5E,qBAAa,oBAAqB,YAAW,QAAQ;IACnD,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,MAAM,WAKb;IACF,QAAQ,CAAC,YAAY,sBAAsB;IAE3C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAa7C,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,WAAW;IASnB,gFAAgF;IAChF,OAAO,CAAC,gBAAgB;IA6BxB,4EAA4E;YAC7D,cAAc;IA0D9B,MAAM,CAAC,IAAI,EAAE,kBAAkB,GAAG,kBAAkB,CAAC,aAAa,CAAC;IAkH5D,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QACjC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,WAAW,CAAC;KACtB,GAAG,OAAO,CAAC,MAAM,CAAC;IA2Bb,QAAQ,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAwF3E,OAAO,CAAC,sBAAsB;IAQ9B;;;;;OAKG;IAEH,OAAO,CAAC,gBAAgB;IA8BxB,OAAO,CAAC,WAAW;CAsEpB"}
@@ -1,13 +1,29 @@
1
- import { GoogleGenerativeAI } from '@google/generative-ai';
2
1
  let _callId = 0;
3
2
  function nextCallId() {
4
3
  return `call_${++_callId}`;
5
4
  }
6
- /** Returns true if the model may return thought_signature fields on function call parts. */
5
+ /** Returns true if the model may return thought fields on parts. */
7
6
  function isThinkingModelName(model) {
8
7
  const m = model.toLowerCase();
9
8
  return m.startsWith('gemini-2.5') || m.startsWith('gemini-3') || m.includes('flash-latest') || m.includes('pro-latest');
10
9
  }
10
+ /**
11
+ * Map curie effort level to Gemini thinkingBudget.
12
+ * Without an explicit budget, Gemini often allocates 0 tokens for tool-call
13
+ * turns — resulting in no thought parts and no thinking-delta events.
14
+ * -1 means dynamic (model always allocates some thinking tokens).
15
+ */
16
+ function effortToThinkingBudget(effort) {
17
+ switch (effort) {
18
+ case 'low': return 1024;
19
+ case 'medium': return 4096;
20
+ case 'high': return 16000;
21
+ case 'max': return 24576;
22
+ default: return -1;
23
+ }
24
+ }
25
+ const DEFAULT_BASE_URL = 'https://generativelanguage.googleapis.com';
26
+ const DEFAULT_API_VERSION = 'v1beta';
11
27
  export class GoogleGeminiProvider {
12
28
  name = 'google';
13
29
  models = [
@@ -17,7 +33,7 @@ export class GoogleGeminiProvider {
17
33
  'gemini-2.0-flash',
18
34
  ];
19
35
  defaultModel = 'gemini-2.0-flash';
20
- genAI;
36
+ apiKey;
21
37
  baseUrl;
22
38
  constructor(apiKey, baseUrl) {
23
39
  const resolvedKey = (apiKey && apiKey.length > 0)
@@ -26,128 +42,260 @@ export class GoogleGeminiProvider {
26
42
  if (!resolvedKey) {
27
43
  throw new Error('GoogleGeminiProvider: no API key (pass explicitly or set GOOGLE_API_KEY).');
28
44
  }
29
- this.genAI = new GoogleGenerativeAI(resolvedKey);
30
- this.baseUrl = baseUrl || '';
45
+ this.apiKey = resolvedKey;
46
+ this.baseUrl = baseUrl || DEFAULT_BASE_URL;
31
47
  }
32
48
  isThinkingModel(model) {
33
49
  return isThinkingModelName(model || this.defaultModel);
34
50
  }
35
- baseModelParams() {
36
- const params = { model: this.defaultModel };
37
- if (this.baseUrl) {
38
- params['baseUrl'] = this.baseUrl;
51
+ apiEndpoint(model, task, altSse) {
52
+ const safeModel = model.startsWith('models/') ? model : `models/${model}`;
53
+ let url = `${this.baseUrl}/${DEFAULT_API_VERSION}/${safeModel}:${task}`;
54
+ if (altSse) {
55
+ url += '?alt=sse';
39
56
  }
40
- return params;
57
+ return url;
41
58
  }
42
- getModel(model, tools) {
43
- const m = model || this.defaultModel;
44
- const params = { ...this.baseModelParams(), model: m };
45
- if (this.isThinkingModel(m)) {
46
- params['enable_thoughts'] = false;
59
+ /** Build the API request body, including thinkingConfig for thinking models. */
60
+ buildRequestBody(model, contents, opts) {
61
+ const safeModel = model.startsWith('models/') ? model : `models/${model}`;
62
+ const body = { model: safeModel, contents };
63
+ if (opts?.system) {
64
+ body.systemInstruction = { role: 'system', parts: [{ text: opts.system }] };
47
65
  }
48
- if (tools && tools.length > 0) {
49
- params['tools'] = [{ functionDeclarations: tools }];
66
+ if (opts?.tools && opts.tools.length)
67
+ body.tools = opts.tools;
68
+ const generationConfig = {};
69
+ if (opts?.thinking) {
70
+ generationConfig.thinkingConfig = {
71
+ includeThoughts: true,
72
+ thinkingBudget: effortToThinkingBudget(opts.effort),
73
+ };
74
+ }
75
+ if (Object.keys(generationConfig).length) {
76
+ body.generationConfig = generationConfig;
77
+ }
78
+ return body;
79
+ }
80
+ /** Parse the SSE stream response line by line into complete JSON chunks. */
81
+ async *parseSSEStream(response) {
82
+ const reader = response.body.getReader();
83
+ const decoder = new TextDecoder();
84
+ let buffer = '';
85
+ let dataLines = [];
86
+ while (true) {
87
+ const { done, value } = await reader.read();
88
+ if (done)
89
+ break;
90
+ buffer += decoder.decode(value, { stream: true });
91
+ let nlIdx;
92
+ while ((nlIdx = buffer.indexOf('\n')) !== -1) {
93
+ const line = buffer.slice(0, nlIdx).replace(/\r$/, '');
94
+ buffer = buffer.slice(nlIdx + 1);
95
+ if (line.startsWith('data: ')) {
96
+ dataLines.push(line.slice(6));
97
+ }
98
+ else if (line.startsWith('event:')) {
99
+ // `event: default` lines are Gemini's event boundaries — yield
100
+ // accumulated data before moving to the next event.
101
+ if (dataLines.length > 0) {
102
+ for (const dl of dataLines) {
103
+ const trimmed = dl.trim();
104
+ if (!trimmed)
105
+ continue;
106
+ try {
107
+ yield JSON.parse(trimmed);
108
+ }
109
+ catch { /* skip malformed */ }
110
+ }
111
+ dataLines = [];
112
+ }
113
+ }
114
+ else if (line === '') {
115
+ if (dataLines.length > 0) {
116
+ for (const dl of dataLines) {
117
+ const trimmed = dl.trim();
118
+ if (!trimmed)
119
+ continue;
120
+ try {
121
+ yield JSON.parse(trimmed);
122
+ }
123
+ catch { /* skip malformed */ }
124
+ }
125
+ dataLines = [];
126
+ }
127
+ }
128
+ // ignore comment lines (':'), id:, retry: — skip them
129
+ }
130
+ }
131
+ if (dataLines.length > 0) {
132
+ for (const dl of dataLines) {
133
+ const trimmed = dl.trim();
134
+ if (!trimmed)
135
+ continue;
136
+ try {
137
+ yield JSON.parse(trimmed);
138
+ }
139
+ catch { /* empty */ }
140
+ }
50
141
  }
51
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
52
- return this.genAI.getGenerativeModel(params);
53
142
  }
54
143
  stream(args) {
55
144
  const model = args.model || this.defaultModel;
145
+ const thinking = this.isThinkingModel(model);
56
146
  const tools = args.tools ? this.toFunctionDeclarations(args.tools) : undefined;
57
- const genModel = this.getModel(model, tools);
58
147
  const contents = this.mapMessages(args.messages);
59
- const requestTools = args.tools ? [{ functionDeclarations: this.toFunctionDeclarations(args.tools) }] : undefined;
148
+ const requestBody = this.buildRequestBody(model, contents, {
149
+ system: args.system,
150
+ tools: tools ? [{ functionDeclarations: tools }] : undefined,
151
+ thinking,
152
+ effort: args.effort,
153
+ });
154
+ const controller = new AbortController();
155
+ if (args.signal) {
156
+ args.signal.addEventListener('abort', () => controller.abort(), { once: true });
157
+ }
158
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
159
+ const self = this;
60
160
  async function* generator() {
61
- const streamResult = await genModel.generateContentStream({
62
- contents,
63
- systemInstruction: args.system,
64
- ...(requestTools ? { tools: requestTools } : {}),
161
+ const url = self.apiEndpoint(model, 'streamGenerateContent', true);
162
+ const response = await fetch(url, {
163
+ method: 'POST',
164
+ headers: {
165
+ 'Content-Type': 'application/json',
166
+ 'x-goog-api-key': self.apiKey,
167
+ },
168
+ body: JSON.stringify(requestBody),
169
+ signal: controller.signal,
65
170
  });
66
- // Collect raw chunk parts as they stream in to preserve thoughtSignature,
67
- // which the SDK's aggregated response object drops from its typed interface.
171
+ if (!response.ok) {
172
+ const errText = await response.text();
173
+ throw new Error(`Google API error ${response.status} (${url}): ${errText}`);
174
+ }
68
175
  const rawParts = [];
69
- for await (const chunk of streamResult.stream) {
70
- if (args.signal?.aborted) {
176
+ let accumulatedThinking = '';
177
+ let totalInputTokens = 0;
178
+ let totalOutputTokens = 0;
179
+ for await (const chunk of self.parseSSEStream(response)) {
180
+ if (args.signal?.aborted || controller.signal.aborted) {
71
181
  break;
72
182
  }
73
- const text = chunk.text();
74
- if (text) {
75
- yield { type: 'text-delta', text };
76
- }
77
- // Capture raw parts from each chunk before the SDK strips unknown fields
78
- const chunkParts = chunk.candidates?.[0]?.content?.parts ?? [];
183
+ const apiChunk = chunk;
184
+ const chunkParts = apiChunk.candidates?.[0]?.content?.parts ?? [];
79
185
  for (const part of chunkParts) {
80
- rawParts.push(part);
186
+ const raw = part;
187
+ if (raw.thought === true && typeof raw.text === 'string' && raw.text) {
188
+ accumulatedThinking += raw.text;
189
+ yield { type: 'thinking-delta', text: raw.text };
190
+ }
191
+ else if (typeof raw.text === 'string' && raw.text) {
192
+ yield { type: 'text-delta', text: raw.text };
193
+ }
194
+ rawParts.push(raw);
81
195
  }
196
+ const usage = chunk.usageMetadata;
197
+ if (usage) {
198
+ totalInputTokens = Number(usage.promptTokenCount ?? totalInputTokens);
199
+ totalOutputTokens = Number(usage.candidatesTokenCount ?? totalOutputTokens);
200
+ }
201
+ }
202
+ if (accumulatedThinking) {
203
+ yield { type: 'thinking-block', thinking: accumulatedThinking, signature: '' };
82
204
  }
83
- if (args.signal?.aborted) {
205
+ if (args.signal?.aborted || controller.signal.aborted) {
84
206
  yield { type: 'stop', reason: 'aborted' };
85
207
  return;
86
208
  }
87
- try {
88
- // Prefer raw parts collected during streaming (preserves thoughtSignature).
89
- // Fall back to aggregated response parts if streaming collected nothing.
90
- const response = await streamResult.response;
91
- const aggParts = response.candidates?.[0]?.content?.parts ?? [];
92
- const parts = rawParts.length > 0 ? rawParts : aggParts;
93
- for (const p of parts) {
94
- if (p.functionCall && typeof p.functionCall === 'object') {
95
- const fc = p.functionCall;
96
- const sig = (typeof p.thoughtSignature === 'string' ? p.thoughtSignature : undefined)
97
- ?? (typeof p.thought_signature === 'string' ? p.thought_signature : undefined);
98
- yield {
99
- type: 'tool-call',
100
- id: nextCallId(),
101
- name: fc.name,
102
- input: (fc.args ?? {}),
103
- ...(sig ? { thoughtSignature: sig } : {}),
104
- };
209
+ let thoughtSignature = '';
210
+ for (const p of rawParts) {
211
+ if (p.functionCall && typeof p.functionCall === 'object') {
212
+ // Extract thoughtSignature from function call part (Gemini API quirk)
213
+ if (!thoughtSignature) {
214
+ thoughtSignature = (typeof p.thoughtSignature === 'string' ? p.thoughtSignature : undefined)
215
+ ?? (typeof p.thought_signature === 'string' ? p.thought_signature : undefined)
216
+ ?? '';
105
217
  }
218
+ const fc = p.functionCall;
219
+ yield {
220
+ type: 'tool-call',
221
+ id: nextCallId(),
222
+ name: fc.name,
223
+ input: (fc.args ?? {}),
224
+ ...(thoughtSignature ? { thoughtSignature: thoughtSignature } : {}),
225
+ };
106
226
  }
107
227
  }
108
- catch {
109
- // Response may throw if prompt was blocked
228
+ if (totalInputTokens || totalOutputTokens) {
229
+ yield { type: 'usage', inputTokens: totalInputTokens, outputTokens: totalOutputTokens };
110
230
  }
111
231
  yield { type: 'stop', reason: 'stop' };
112
232
  }
113
233
  return {
114
234
  iterable: generator(),
115
235
  cancel() {
116
- // The Google Gemini SDK doesn't expose a public cancel method.
117
- // The signal.aborted check inside the generator loop breaks on the
118
- // next iteration, but there's no way to synchronously abort.
236
+ controller.abort();
119
237
  },
120
238
  };
121
239
  }
122
240
  async check(prompt, args) {
123
241
  const model = args?.model || this.defaultModel;
124
- const genModel = this.getModel(model);
125
- const response = await genModel.generateContent({
126
- contents: [{ role: 'user', parts: [{ text: prompt }] }],
127
- systemInstruction: args?.system,
242
+ const requestBody = this.buildRequestBody(model, [{ role: 'user', parts: [{ text: prompt }] }], {
243
+ system: args?.system,
128
244
  });
129
- return response.response.text().trim().slice(0, 256);
245
+ const response = await fetch(this.apiEndpoint(model, 'generateContent'), {
246
+ method: 'POST',
247
+ headers: {
248
+ 'Content-Type': 'application/json',
249
+ 'x-goog-api-key': this.apiKey,
250
+ },
251
+ body: JSON.stringify(requestBody),
252
+ signal: args?.signal,
253
+ });
254
+ if (!response.ok) {
255
+ const errText = await response.text();
256
+ throw new Error(`Google API error ${response.status}: ${errText}`);
257
+ }
258
+ const json = await response.json();
259
+ const parts = (json.candidates?.[0]?.content?.parts ?? []);
260
+ const text = parts.map((p) => p.text).filter(Boolean).join('');
261
+ return text.trim().slice(0, 256);
130
262
  }
131
263
  async complete(args) {
132
264
  const model = args.model || this.defaultModel;
133
- const tools = args.tools ? this.toFunctionDeclarations(args.tools) : undefined;
134
- const genModel = this.getModel(model, tools);
265
+ const thinking = this.isThinkingModel(model);
135
266
  let contents = this.mapMessages(args.messages);
136
267
  const allText = [];
137
268
  let stopReason = 'stop';
138
269
  let toolCalls;
139
270
  for (let turn = 0; turn < 16; turn++) {
140
- const requestTools = args.tools ? [{ functionDeclarations: this.toFunctionDeclarations(args.tools) }] : undefined;
141
- const response = await genModel.generateContent({
142
- contents,
143
- systemInstruction: args.system,
144
- ...(requestTools ? { tools: requestTools } : {}),
271
+ const tools = args.tools ? this.toFunctionDeclarations(args.tools) : undefined;
272
+ const requestBody = this.buildRequestBody(model, contents, {
273
+ system: args.system,
274
+ tools: tools ? [{ functionDeclarations: tools }] : undefined,
275
+ thinking,
276
+ effort: args.effort,
277
+ });
278
+ const response = await fetch(this.apiEndpoint(model, 'generateContent'), {
279
+ method: 'POST',
280
+ headers: {
281
+ 'Content-Type': 'application/json',
282
+ 'x-goog-api-key': this.apiKey,
283
+ },
284
+ body: JSON.stringify(requestBody),
285
+ signal: args.signal,
145
286
  });
146
- const text = response.response.text().trim();
147
- if (text)
148
- allText.push(text);
149
- // Use raw parts to preserve thought_signature for thinking models.
150
- const rawParts = response.response.candidates?.[0]?.content?.parts ?? [];
287
+ if (!response.ok) {
288
+ const errText = await response.text();
289
+ throw new Error(`Google API error ${response.status}: ${errText}`);
290
+ }
291
+ const json = await response.json();
292
+ const rawParts = (json.candidates?.[0]?.content?.parts ?? []);
293
+ // Collect text (non-thought) parts
294
+ for (const part of rawParts) {
295
+ if (part.thought !== true && typeof part.text === 'string' && part.text) {
296
+ allText.push(part.text);
297
+ }
298
+ }
151
299
  const fcParts = rawParts.filter((p) => p.functionCall);
152
300
  if (fcParts.length === 0) {
153
301
  stopReason = 'stop';
@@ -158,8 +306,6 @@ export class GoogleGeminiProvider {
158
306
  return { id: nextCallId(), name: fc.name, input: (fc.args ?? {}) };
159
307
  });
160
308
  stopReason = 'tool_use';
161
- // Build follow-up content echoing thoughtSignature back for thinking models.
162
- // thoughtSignature is a top-level Part field (camelCase in JS SDK).
163
309
  contents.push({
164
310
  role: 'model',
165
311
  parts: fcParts.map((p) => {
@@ -180,7 +326,7 @@ export class GoogleGeminiProvider {
180
326
  parts: [{
181
327
  functionResponse: {
182
328
  name: fc.name,
183
- response: { result: fc.args },
329
+ response: { output: fc.args },
184
330
  },
185
331
  }],
186
332
  });
@@ -257,6 +403,14 @@ export class GoogleGeminiProvider {
257
403
  if (c.type === 'text') {
258
404
  parts.push({ text: c.text });
259
405
  }
406
+ else if (c.type === 'thinking') {
407
+ // Thinking blocks from turn loop are sent as regular text (Gemini
408
+ // uses accumulated text approach; thinking blocks are internal).
409
+ const tc = c;
410
+ if (tc.thinking) {
411
+ parts.push({ text: tc.thinking });
412
+ }
413
+ }
260
414
  else if (c.type === 'tool-use') {
261
415
  // thoughtSignature is a top-level Part field (camelCase in JS SDK)
262
416
  const fcPart = {