@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.
- package/dist/conversation/manager.d.ts.map +1 -1
- package/dist/conversation/manager.js +5 -1
- package/dist/conversation/manager.js.map +1 -1
- package/dist/i18n/de.js +4 -4
- package/dist/i18n/de.js.map +1 -1
- package/dist/i18n/es.js +5 -5
- package/dist/i18n/es.js.map +1 -1
- package/dist/i18n/fr.js +3 -3
- package/dist/i18n/hi.js +11 -11
- package/dist/i18n/hi.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/providers/base.d.ts +20 -2
- package/dist/providers/base.d.ts.map +1 -1
- package/dist/providers/base.js +48 -25
- package/dist/providers/base.js.map +1 -1
- package/dist/providers/claude.d.ts +17 -0
- package/dist/providers/claude.d.ts.map +1 -1
- package/dist/providers/claude.js +127 -77
- package/dist/providers/claude.js.map +1 -1
- package/dist/providers/gemini.d.ts +6 -1
- package/dist/providers/gemini.d.ts.map +1 -1
- package/dist/providers/gemini.js +101 -75
- package/dist/providers/gemini.js.map +1 -1
- package/dist/providers/index.d.ts +2 -2
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +1 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openai.d.ts +13 -0
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +79 -70
- package/dist/providers/openai.js.map +1 -1
- package/dist/tools/lead-capture.d.ts.map +1 -1
- package/dist/tools/lead-capture.js +2 -1
- package/dist/tools/lead-capture.js.map +1 -1
- package/dist/types.d.ts +32 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -4
package/dist/providers/claude.js
CHANGED
|
@@ -1,57 +1,136 @@
|
|
|
1
1
|
import Anthropic from '@anthropic-ai/sdk';
|
|
2
|
-
import {
|
|
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
|
+
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
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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({
|
|
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
|
-
|
|
42
|
-
|
|
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
|
-
|
|
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
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
|
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
|
-
|
|
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":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAG1C,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;
|
|
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
|
|
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":"
|
|
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"}
|
package/dist/providers/gemini.js
CHANGED
|
@@ -1,60 +1,98 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
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-
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
50
|
+
ai;
|
|
28
51
|
model;
|
|
52
|
+
effort;
|
|
29
53
|
constructor(config) {
|
|
30
|
-
this.
|
|
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
|
-
|
|
34
|
-
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
66
|
-
|
|
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
|
|
82
|
-
|
|
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
|
|
111
|
+
let text = '';
|
|
95
112
|
while (true) {
|
|
96
|
-
|
|
97
|
-
const response =
|
|
98
|
-
const
|
|
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
|
|
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
|
-
|
|
107
|
-
|
|
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":"AAAA,OAAO,
|
|
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;
|
|
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"}
|
package/dist/providers/index.js
CHANGED
|
@@ -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,
|
|
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
|