@chatcops/core 0.3.1 → 0.4.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 (40) hide show
  1. package/dist/conversation/manager.d.ts.map +1 -1
  2. package/dist/conversation/manager.js +5 -1
  3. package/dist/conversation/manager.js.map +1 -1
  4. package/dist/i18n/de.js +4 -4
  5. package/dist/i18n/de.js.map +1 -1
  6. package/dist/i18n/es.js +5 -5
  7. package/dist/i18n/es.js.map +1 -1
  8. package/dist/i18n/fr.js +3 -3
  9. package/dist/i18n/hi.js +11 -11
  10. package/dist/i18n/hi.js.map +1 -1
  11. package/dist/index.d.ts +3 -3
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +1 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/providers/base.d.ts +20 -2
  16. package/dist/providers/base.d.ts.map +1 -1
  17. package/dist/providers/base.js +48 -25
  18. package/dist/providers/base.js.map +1 -1
  19. package/dist/providers/claude.d.ts +17 -0
  20. package/dist/providers/claude.d.ts.map +1 -1
  21. package/dist/providers/claude.js +127 -77
  22. package/dist/providers/claude.js.map +1 -1
  23. package/dist/providers/gemini.d.ts +6 -1
  24. package/dist/providers/gemini.d.ts.map +1 -1
  25. package/dist/providers/gemini.js +101 -75
  26. package/dist/providers/gemini.js.map +1 -1
  27. package/dist/providers/index.d.ts +2 -2
  28. package/dist/providers/index.d.ts.map +1 -1
  29. package/dist/providers/index.js +1 -1
  30. package/dist/providers/index.js.map +1 -1
  31. package/dist/providers/openai.d.ts +13 -0
  32. package/dist/providers/openai.d.ts.map +1 -1
  33. package/dist/providers/openai.js +79 -70
  34. package/dist/providers/openai.js.map +1 -1
  35. package/dist/tools/lead-capture.d.ts.map +1 -1
  36. package/dist/tools/lead-capture.js +2 -1
  37. package/dist/tools/lead-capture.js.map +1 -1
  38. package/dist/types.d.ts +32 -0
  39. package/dist/types.d.ts.map +1 -1
  40. package/package.json +4 -4
@@ -1,57 +1,136 @@
1
1
  import Anthropic from '@anthropic-ai/sdk';
2
- import { toProviderMessages, toClaudeTools } from './base.js';
2
+ import { DEFAULT_MAX_TOKENS, normalizeHistory, toClaudeTools, warnOnce } from './base.js';
3
3
  import { MAX_TOOL_ROUNDS, executeToolCall, serializeToolResult, } from './tool-execution.js';
4
- const DEFAULT_MODEL = 'claude-haiku-4-5-20251001';
4
+ const DEFAULT_MODEL = 'claude-haiku-5-5';
5
+ const DEFAULT_EFFORT = 'low';
6
+ /** Reads family and version from ids like `claude-haiku-5-5` or `claude-haiku-4-5-20251001`. */
7
+ export function parseClaudeModel(model) {
8
+ const match = model.match(/claude-(opus|sonnet|haiku|fable|mythos)-(\d+)(?:-(\d{1,2})(?!\d))?/);
9
+ if (!match)
10
+ return null;
11
+ return { family: match[1], major: Number(match[2]), minor: Number(match[3] ?? 0) };
12
+ }
13
+ /** `output_config.effort` exists on Opus 4.5 and on every model from 4.6 on. */
14
+ export function claudeSupportsEffort(model) {
15
+ const version = parseClaudeModel(model);
16
+ if (!version)
17
+ return false;
18
+ if (version.family === 'fable' || version.family === 'mythos')
19
+ return true;
20
+ if (version.major >= 5)
21
+ return true;
22
+ if (version.major === 4 && version.minor >= 6)
23
+ return true;
24
+ return version.family === 'opus' && version.major === 4 && version.minor === 5;
25
+ }
26
+ /** Fable, Mythos, every 5.x model and Opus 4.7+ reject non-default `temperature`. */
27
+ export function claudeRejectsTemperature(model) {
28
+ const version = parseClaudeModel(model);
29
+ if (!version)
30
+ return false;
31
+ if (version.family === 'fable' || version.family === 'mythos')
32
+ return true;
33
+ if (version.major >= 5)
34
+ return true;
35
+ return version.family === 'opus' && version.major === 4 && version.minor >= 7;
36
+ }
5
37
  function toClaudeMessages(params) {
6
- return toProviderMessages(params.messages).map((message) => ({
38
+ return normalizeHistory(params.messages).map((message) => ({
7
39
  role: message.role,
8
40
  content: message.content,
9
41
  }));
10
42
  }
43
+ /**
44
+ * Sends the assistant turn back for the next tool round. Thinking blocks must
45
+ * go back unchanged (including the signature), or the API rejects the request.
46
+ */
11
47
  function toAssistantContentBlocks(content) {
12
48
  const blocks = [];
13
49
  for (const block of content) {
14
- if (block.type === 'text') {
15
- blocks.push({ type: 'text', text: block.text });
16
- continue;
17
- }
18
- if (block.type === 'tool_use') {
19
- blocks.push({
20
- type: 'tool_use',
21
- id: block.id,
22
- name: block.name,
23
- input: block.input,
24
- });
50
+ switch (block.type) {
51
+ case 'text':
52
+ blocks.push({ type: 'text', text: block.text });
53
+ break;
54
+ case 'thinking':
55
+ blocks.push({ type: 'thinking', thinking: block.thinking, signature: block.signature });
56
+ break;
57
+ case 'redacted_thinking':
58
+ blocks.push({ type: 'redacted_thinking', data: block.data });
59
+ break;
60
+ case 'tool_use':
61
+ blocks.push({ type: 'tool_use', id: block.id, name: block.name, input: block.input });
62
+ break;
63
+ default:
64
+ break;
25
65
  }
26
66
  }
27
67
  return blocks;
28
68
  }
69
+ function textOf(content) {
70
+ return content
71
+ .filter((block) => block.type === 'text')
72
+ .map((block) => block.text)
73
+ .join('');
74
+ }
29
75
  export class ClaudeProvider {
30
76
  name = 'claude';
31
77
  client;
32
78
  model;
79
+ effort;
33
80
  constructor(config) {
34
- this.client = new Anthropic({ apiKey: config.apiKey });
81
+ this.client = new Anthropic({
82
+ apiKey: config.apiKey,
83
+ ...(config.baseURL ? { baseURL: config.baseURL } : {}),
84
+ });
35
85
  this.model = config.model ?? DEFAULT_MODEL;
86
+ if (claudeSupportsEffort(this.model)) {
87
+ this.effort = config.effort ?? DEFAULT_EFFORT;
88
+ }
89
+ else if (config.effort) {
90
+ warnOnce(`claude-effort-${this.model}`, `${this.model} has no effort setting, so \`effort\` is ignored.`);
91
+ }
92
+ }
93
+ request(params, messages) {
94
+ let temperature = params.temperature;
95
+ if (temperature != null && claudeRejectsTemperature(this.model)) {
96
+ warnOnce(`claude-temperature-${this.model}`, `${this.model} doesn't accept \`temperature\`, so it is not sent. Use \`effort\` to trade speed for depth.`);
97
+ temperature = undefined;
98
+ }
99
+ return {
100
+ model: this.model,
101
+ max_tokens: params.maxTokens ?? DEFAULT_MAX_TOKENS,
102
+ system: params.systemPrompt,
103
+ messages,
104
+ ...(params.tools?.length ? { tools: toClaudeTools(params.tools) } : {}),
105
+ ...(temperature != null ? { temperature } : {}),
106
+ ...(this.effort ? { output_config: { effort: this.effort } } : {}),
107
+ };
108
+ }
109
+ /** Throws on stop reasons that mean the reply can't be used. */
110
+ checkStopReason(message) {
111
+ if (message.stop_reason === 'refusal') {
112
+ throw new Error('Claude declined to answer this request (stop_reason: refusal).');
113
+ }
114
+ if (message.stop_reason === 'model_context_window_exceeded') {
115
+ throw new Error('The conversation is longer than the model context window.');
116
+ }
117
+ if (message.stop_reason === 'max_tokens') {
118
+ console.warn(`[chatcops] Claude reply cut off at max_tokens (${message.usage.output_tokens} tokens). Raise \`maxTokens\` if this keeps happening.`);
119
+ }
36
120
  }
37
121
  async *chat(params) {
38
122
  const messages = toClaudeMessages(params);
39
123
  let toolRounds = 0;
40
124
  while (true) {
41
- const stream = this.client.messages.stream({
42
- model: this.model,
43
- max_tokens: params.maxTokens ?? 1024,
44
- system: params.systemPrompt,
45
- messages,
46
- ...(params.tools?.length ? { tools: toClaudeTools(params.tools) } : {}),
47
- ...(params.temperature != null ? { temperature: params.temperature } : {}),
48
- });
125
+ params.signal?.throwIfAborted();
126
+ const stream = this.client.messages.stream(this.request(params, messages), { signal: params.signal });
49
127
  for await (const event of stream) {
50
128
  if (event.type === 'content_block_delta' && event.delta.type === 'text_delta') {
51
129
  yield event.delta.text;
52
130
  }
53
131
  }
54
132
  const message = await stream.finalMessage();
133
+ this.checkStopReason(message);
55
134
  const toolUses = message.content.filter((block) => block.type === 'tool_use');
56
135
  if (message.stop_reason !== 'tool_use' || toolUses.length === 0) {
57
136
  return;
@@ -60,74 +139,45 @@ export class ClaudeProvider {
60
139
  throw new Error(`Exceeded maximum tool rounds (${MAX_TOOL_ROUNDS}).`);
61
140
  }
62
141
  toolRounds += 1;
63
- messages.push({
64
- role: 'assistant',
65
- content: toAssistantContentBlocks(message.content),
66
- });
67
- const toolResults = await Promise.all(toolUses.map(async (toolUse) => {
68
- const result = await executeToolCall(params, {
69
- id: toolUse.id,
70
- name: toolUse.name,
71
- input: toolUse.input,
72
- });
73
- return {
74
- type: 'tool_result',
75
- tool_use_id: toolUse.id,
76
- content: JSON.stringify(serializeToolResult(result)),
77
- is_error: !result.success,
78
- };
79
- }));
80
- messages.push({
81
- role: 'user',
82
- content: toolResults,
83
- });
142
+ messages.push({ role: 'assistant', content: toAssistantContentBlocks(message.content) });
143
+ messages.push({ role: 'user', content: await this.runTools(params, toolUses) });
84
144
  }
85
145
  }
86
146
  async chatSync(params) {
87
147
  const messages = toClaudeMessages(params);
88
148
  let toolRounds = 0;
149
+ let text = '';
89
150
  while (true) {
90
- const response = await this.client.messages.create({
91
- model: this.model,
92
- max_tokens: params.maxTokens ?? 1024,
93
- system: params.systemPrompt,
94
- messages,
95
- ...(params.tools?.length ? { tools: toClaudeTools(params.tools) } : {}),
96
- ...(params.temperature != null ? { temperature: params.temperature } : {}),
97
- });
151
+ params.signal?.throwIfAborted();
152
+ const response = await this.client.messages.create(this.request(params, messages), { signal: params.signal });
153
+ this.checkStopReason(response);
154
+ text += textOf(response.content);
98
155
  const toolUses = response.content.filter((block) => block.type === 'tool_use');
99
156
  if (response.stop_reason !== 'tool_use' || toolUses.length === 0) {
100
- return response.content
101
- .filter((block) => block.type === 'text')
102
- .map((block) => block.text)
103
- .join('');
157
+ return text;
104
158
  }
105
159
  if (toolRounds >= MAX_TOOL_ROUNDS) {
106
160
  throw new Error(`Exceeded maximum tool rounds (${MAX_TOOL_ROUNDS}).`);
107
161
  }
108
162
  toolRounds += 1;
109
- messages.push({
110
- role: 'assistant',
111
- content: toAssistantContentBlocks(response.content),
112
- });
113
- const toolResults = await Promise.all(toolUses.map(async (toolUse) => {
114
- const result = await executeToolCall(params, {
115
- id: toolUse.id,
116
- name: toolUse.name,
117
- input: toolUse.input,
118
- });
119
- return {
120
- type: 'tool_result',
121
- tool_use_id: toolUse.id,
122
- content: JSON.stringify(serializeToolResult(result)),
123
- is_error: !result.success,
124
- };
125
- }));
126
- messages.push({
127
- role: 'user',
128
- content: toolResults,
129
- });
163
+ messages.push({ role: 'assistant', content: toAssistantContentBlocks(response.content) });
164
+ messages.push({ role: 'user', content: await this.runTools(params, toolUses) });
130
165
  }
131
166
  }
167
+ async runTools(params, toolUses) {
168
+ return Promise.all(toolUses.map(async (toolUse) => {
169
+ const result = await executeToolCall(params, {
170
+ id: toolUse.id,
171
+ name: toolUse.name,
172
+ input: toolUse.input,
173
+ });
174
+ return {
175
+ type: 'tool_result',
176
+ tool_use_id: toolUse.id,
177
+ content: JSON.stringify(serializeToolResult(result)),
178
+ is_error: !result.success,
179
+ };
180
+ }));
181
+ }
132
182
  }
133
183
  //# sourceMappingURL=claude.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/providers/claude.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/providers/claude.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,16 @@
1
1
  import type { ProviderConfig, ProviderChatParams } from '../types.js';
2
2
  import type { AIProvider } from './base.js';
3
+ /** `thinkingLevel` is a Gemini 3 setting; older models use a token budget instead. */
4
+ export declare function geminiSupportsThinkingLevel(model: string): boolean;
3
5
  export declare class GeminiProvider implements AIProvider {
4
6
  name: string;
5
- private genAI;
7
+ private ai;
6
8
  private model;
9
+ private effort;
7
10
  constructor(config: ProviderConfig);
11
+ private config;
8
12
  chat(params: ProviderChatParams): AsyncGenerator<string>;
9
13
  chatSync(params: ProviderChatParams): Promise<string>;
14
+ private runTools;
10
15
  }
11
16
  //# sourceMappingURL=gemini.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/providers/gemini.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAkC5C,qBAAa,cAAe,YAAW,UAAU;IAC/C,IAAI,SAAY;IAChB,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,cAAc;IAK3B,IAAI,CAAC,MAAM,EAAE,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAAC;IAwDzD,QAAQ,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;CAgD5D"}
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/providers/gemini.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAkB,MAAM,aAAa,CAAC;AACtF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAyB5C,sFAAsF;AACtF,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAGlE;AAgCD,qBAAa,cAAe,YAAW,UAAU;IAC/C,IAAI,SAAY;IAChB,OAAO,CAAC,EAAE,CAAc;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,EAAE,cAAc;IASlC,OAAO,CAAC,MAAM;IAaP,IAAI,CAAC,MAAM,EAAE,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAAC;IA0CzD,QAAQ,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;YA8B7C,QAAQ;CAiBvB"}
@@ -1,60 +1,98 @@
1
- import { GoogleGenerativeAI } from '@google/generative-ai';
2
- import { toProviderMessages, toGeminiTools } from './base.js';
1
+ import { GoogleGenAI, ThinkingLevel, } from '@google/genai';
2
+ import { DEFAULT_MAX_TOKENS, normalizeHistory, toGeminiTools } from './base.js';
3
3
  import { MAX_TOOL_ROUNDS, executeToolCall, serializeToolResult, } from './tool-execution.js';
4
- const DEFAULT_MODEL = 'gemini-2.0-flash';
4
+ const DEFAULT_MODEL = 'gemini-3.5-flash-lite';
5
+ const DEFAULT_EFFORT = 'low';
5
6
  let toolCallSequence = 0;
6
7
  function createToolCallId() {
7
8
  toolCallSequence += 1;
8
9
  return `gemini_tool_call_${toolCallSequence}`;
9
10
  }
10
- function toGeminiHistory(params) {
11
- return toProviderMessages(params.messages)
12
- .slice(0, -1)
13
- .map((message) => ({
11
+ const THINKING_LEVELS = {
12
+ low: ThinkingLevel.LOW,
13
+ medium: ThinkingLevel.MEDIUM,
14
+ high: ThinkingLevel.HIGH,
15
+ xhigh: ThinkingLevel.HIGH,
16
+ max: ThinkingLevel.HIGH,
17
+ };
18
+ /** `thinkingLevel` is a Gemini 3 setting; older models use a token budget instead. */
19
+ export function geminiSupportsThinkingLevel(model) {
20
+ const major = Number(model.match(/gemini-(\d+)/)?.[1] ?? 0);
21
+ return major >= 3;
22
+ }
23
+ /**
24
+ * Builds the full request history. The API is stateless, so every round sends
25
+ * the whole conversation: normalized stored messages, then any model turns
26
+ * and tool results from earlier rounds of this reply.
27
+ */
28
+ function toGeminiContents(params) {
29
+ const contents = normalizeHistory(params.messages).map((message) => ({
14
30
  role: message.role === 'assistant' ? 'model' : 'user',
15
31
  parts: [{ text: message.content }],
16
32
  }));
17
- }
18
- function getLastMessage(params) {
19
- const lastMessage = toProviderMessages(params.messages).at(-1)?.content ?? '';
20
- if (!lastMessage) {
21
- throw new Error('Cannot send empty message');
33
+ if (contents.length === 0) {
34
+ throw new Error('Cannot send a request with no user message.');
22
35
  }
23
- return lastMessage;
36
+ return contents;
37
+ }
38
+ /** Text parts only, without thought summaries. */
39
+ function visibleText(parts) {
40
+ return parts
41
+ .filter((part) => typeof part.text === 'string' && !part.thought)
42
+ .map((part) => part.text)
43
+ .join('');
44
+ }
45
+ function partsOf(response) {
46
+ return response.candidates?.[0]?.content?.parts ?? [];
24
47
  }
25
48
  export class GeminiProvider {
26
49
  name = 'gemini';
27
- genAI;
50
+ ai;
28
51
  model;
52
+ effort;
29
53
  constructor(config) {
30
- this.genAI = new GoogleGenerativeAI(config.apiKey);
54
+ this.ai = new GoogleGenAI({
55
+ apiKey: config.apiKey,
56
+ ...(config.baseURL ? { httpOptions: { baseUrl: config.baseURL } } : {}),
57
+ });
31
58
  this.model = config.model ?? DEFAULT_MODEL;
59
+ this.effort = config.effort ?? DEFAULT_EFFORT;
32
60
  }
33
- async *chat(params) {
34
- const model = this.genAI.getGenerativeModel({
35
- model: this.model,
61
+ config(params) {
62
+ return {
36
63
  systemInstruction: params.systemPrompt,
64
+ maxOutputTokens: params.maxTokens ?? DEFAULT_MAX_TOKENS,
65
+ ...(params.temperature != null ? { temperature: params.temperature } : {}),
37
66
  ...(params.tools?.length ? { tools: toGeminiTools(params.tools) } : {}),
38
- });
39
- const chat = model.startChat({
40
- history: toGeminiHistory(params),
41
- generationConfig: {
42
- maxOutputTokens: params.maxTokens ?? 1024,
43
- ...(params.temperature != null ? { temperature: params.temperature } : {}),
44
- },
45
- });
67
+ ...(geminiSupportsThinkingLevel(this.model)
68
+ ? { thinkingConfig: { thinkingLevel: THINKING_LEVELS[this.effort] } }
69
+ : {}),
70
+ ...(params.signal ? { abortSignal: params.signal } : {}),
71
+ };
72
+ }
73
+ async *chat(params) {
74
+ const contents = toGeminiContents(params);
75
+ const config = this.config(params);
46
76
  let toolRounds = 0;
47
- let request = getLastMessage(params);
48
77
  while (true) {
49
- const result = await chat.sendMessageStream(request);
50
- for await (const chunk of result.stream) {
51
- const text = chunk.text();
78
+ params.signal?.throwIfAborted();
79
+ const stream = await this.ai.models.generateContentStream({ model: this.model, contents, config });
80
+ // Keep every part the model sent (function calls carry thought signatures
81
+ // that Gemini 3 needs back on the next round).
82
+ const modelParts = [];
83
+ const functionCalls = [];
84
+ for await (const chunk of stream) {
85
+ const parts = partsOf(chunk);
86
+ modelParts.push(...parts);
87
+ const text = visibleText(parts);
52
88
  if (text) {
53
89
  yield text;
54
90
  }
91
+ for (const part of parts) {
92
+ if (part.functionCall)
93
+ functionCalls.push(part.functionCall);
94
+ }
55
95
  }
56
- const response = await result.response;
57
- const functionCalls = response.functionCalls() ?? [];
58
96
  if (functionCalls.length === 0) {
59
97
  return;
60
98
  }
@@ -62,61 +100,49 @@ export class GeminiProvider {
62
100
  throw new Error(`Exceeded maximum tool rounds (${MAX_TOOL_ROUNDS}).`);
63
101
  }
64
102
  toolRounds += 1;
65
- request = await Promise.all(functionCalls.map(async (call) => {
66
- const result = await executeToolCall(params, {
67
- id: createToolCallId(),
68
- name: call.name,
69
- input: call.args,
70
- });
71
- return {
72
- functionResponse: {
73
- name: call.name,
74
- response: serializeToolResult(result),
75
- },
76
- };
77
- }));
103
+ contents.push({ role: 'model', parts: modelParts });
104
+ contents.push({ role: 'user', parts: await this.runTools(params, functionCalls) });
78
105
  }
79
106
  }
80
107
  async chatSync(params) {
81
- const model = this.genAI.getGenerativeModel({
82
- model: this.model,
83
- systemInstruction: params.systemPrompt,
84
- ...(params.tools?.length ? { tools: toGeminiTools(params.tools) } : {}),
85
- });
86
- const chat = model.startChat({
87
- history: toGeminiHistory(params),
88
- generationConfig: {
89
- maxOutputTokens: params.maxTokens ?? 1024,
90
- ...(params.temperature != null ? { temperature: params.temperature } : {}),
91
- },
92
- });
108
+ const contents = toGeminiContents(params);
109
+ const config = this.config(params);
93
110
  let toolRounds = 0;
94
- let request = getLastMessage(params);
111
+ let text = '';
95
112
  while (true) {
96
- const result = await chat.sendMessage(request);
97
- const response = result.response;
98
- const functionCalls = response.functionCalls() ?? [];
113
+ params.signal?.throwIfAborted();
114
+ const response = await this.ai.models.generateContent({ model: this.model, contents, config });
115
+ const parts = partsOf(response);
116
+ text += visibleText(parts);
117
+ const functionCalls = parts
118
+ .map((part) => part.functionCall)
119
+ .filter((call) => call !== undefined);
99
120
  if (functionCalls.length === 0) {
100
- return response.text();
121
+ return text;
101
122
  }
102
123
  if (toolRounds >= MAX_TOOL_ROUNDS) {
103
124
  throw new Error(`Exceeded maximum tool rounds (${MAX_TOOL_ROUNDS}).`);
104
125
  }
105
126
  toolRounds += 1;
106
- request = await Promise.all(functionCalls.map(async (call) => {
107
- const toolResult = await executeToolCall(params, {
108
- id: createToolCallId(),
109
- name: call.name,
110
- input: call.args,
111
- });
112
- return {
113
- functionResponse: {
114
- name: call.name,
115
- response: serializeToolResult(toolResult),
116
- },
117
- };
118
- }));
127
+ contents.push({ role: 'model', parts });
128
+ contents.push({ role: 'user', parts: await this.runTools(params, functionCalls) });
119
129
  }
120
130
  }
131
+ async runTools(params, calls) {
132
+ return Promise.all(calls.map(async (call) => {
133
+ const name = call.name ?? '';
134
+ const id = call.id ?? createToolCallId();
135
+ const result = name
136
+ ? await executeToolCall(params, { id, name, input: call.args ?? {} })
137
+ : { success: false, message: 'The model sent a function call without a name.' };
138
+ return {
139
+ functionResponse: {
140
+ ...(call.id ? { id: call.id } : {}),
141
+ name,
142
+ response: serializeToolResult(result),
143
+ },
144
+ };
145
+ }));
146
+ }
121
147
  }
122
148
  //# sourceMappingURL=gemini.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/providers/gemini.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/providers/gemini.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- export type { AIProvider } from './base.js';
2
- export { createProvider, toProviderMessages, toClaudeTools, toOpenAITools, toGeminiTools } from './base.js';
1
+ export type { AIProvider, NormalizedMessage } from './base.js';
2
+ export { createProvider, normalizeHistory, toProviderMessages, toClaudeTools, toOpenAITools, toGeminiTools, DEFAULT_MAX_TOKENS, } from './base.js';
3
3
  export { ClaudeProvider } from './claude.js';
4
4
  export { OpenAIProvider } from './openai.js';
5
5
  export { GeminiProvider } from './gemini.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC5G,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,aAAa,EACb,kBAAkB,GACnB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -1,4 +1,4 @@
1
- export { createProvider, toProviderMessages, toClaudeTools, toOpenAITools, toGeminiTools } from './base.js';
1
+ export { createProvider, normalizeHistory, toProviderMessages, toClaudeTools, toOpenAITools, toGeminiTools, DEFAULT_MAX_TOKENS, } from './base.js';
2
2
  export { ClaudeProvider } from './claude.js';
3
3
  export { OpenAIProvider } from './openai.js';
4
4
  export { GeminiProvider } from './gemini.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC5G,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,aAAa,EACb,kBAAkB,GACnB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -1,11 +1,24 @@
1
1
  import type { ProviderConfig, ProviderChatParams } from '../types.js';
2
2
  import type { AIProvider } from './base.js';
3
+ /**
4
+ * OpenAI reasoning models (o-series, GPT-5 and later) take `reasoning_effort`
5
+ * and reject a non-default `temperature`. Models behind a custom `baseURL`
6
+ * are treated as regular chat models.
7
+ */
8
+ export declare function isOpenAIReasoningModel(model: string, baseURL?: string): boolean;
3
9
  export declare class OpenAIProvider implements AIProvider {
4
10
  name: string;
5
11
  private client;
6
12
  private model;
13
+ private reasoning;
14
+ private effort;
15
+ private maxTokensParam;
7
16
  constructor(config: ProviderConfig);
17
+ private request;
18
+ private toMessages;
8
19
  chat(params: ProviderChatParams): AsyncGenerator<string>;
9
20
  chatSync(params: ProviderChatParams): Promise<string>;
21
+ /** Runs tool calls in parallel and returns the tool messages in call order. */
22
+ private runTools;
10
23
  }
11
24
  //# sourceMappingURL=openai.d.ts.map