@chatcops/core 0.3.2 → 0.5.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/agent/chat.d.ts +13 -0
- package/dist/agent/chat.d.ts.map +1 -0
- package/dist/agent/chat.js +42 -0
- package/dist/agent/chat.js.map +1 -0
- package/dist/agent/errors.d.ts +14 -0
- package/dist/agent/errors.d.ts.map +1 -0
- package/dist/agent/errors.js +24 -0
- package/dist/agent/errors.js.map +1 -0
- package/dist/agent/index.d.ts +5 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +5 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/run-turn.d.ts +68 -0
- package/dist/agent/run-turn.d.ts.map +1 -0
- package/dist/agent/run-turn.js +344 -0
- package/dist/agent/run-turn.js.map +1 -0
- package/dist/agent/tool-registry.d.ts +28 -0
- package/dist/agent/tool-registry.d.ts.map +1 -0
- package/dist/agent/tool-registry.js +69 -0
- package/dist/agent/tool-registry.js.map +1 -0
- package/dist/analytics/index.d.ts +1 -0
- package/dist/analytics/index.d.ts.map +1 -1
- package/dist/analytics/index.js +1 -0
- package/dist/analytics/index.js.map +1 -1
- package/dist/analytics/sink.d.ts +24 -0
- package/dist/analytics/sink.d.ts.map +1 -0
- package/dist/analytics/sink.js +106 -0
- package/dist/analytics/sink.js.map +1 -0
- package/dist/conversation/index.d.ts +1 -0
- package/dist/conversation/index.d.ts.map +1 -1
- package/dist/conversation/index.js.map +1 -1
- package/dist/conversation/manager.d.ts +62 -6
- package/dist/conversation/manager.d.ts.map +1 -1
- package/dist/conversation/manager.js +109 -30
- package/dist/conversation/manager.js.map +1 -1
- package/dist/conversation/store.d.ts +6 -5
- package/dist/conversation/store.d.ts.map +1 -1
- package/dist/conversation/store.js +4 -0
- package/dist/conversation/store.js.map +1 -1
- package/dist/index.d.ts +18 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -2
- package/dist/index.js.map +1 -1
- package/dist/limits/budget.d.ts +84 -0
- package/dist/limits/budget.d.ts.map +1 -0
- package/dist/limits/budget.js +114 -0
- package/dist/limits/budget.js.map +1 -0
- package/dist/limits/rate-limit.d.ts +53 -0
- package/dist/limits/rate-limit.d.ts.map +1 -0
- package/dist/limits/rate-limit.js +68 -0
- package/dist/limits/rate-limit.js.map +1 -0
- package/dist/parts.d.ts +9 -0
- package/dist/parts.d.ts.map +1 -0
- package/dist/parts.js +17 -0
- package/dist/parts.js.map +1 -0
- package/dist/protocol/ai-sdk.d.ts +27 -0
- package/dist/protocol/ai-sdk.d.ts.map +1 -0
- package/dist/protocol/ai-sdk.js +127 -0
- package/dist/protocol/ai-sdk.js.map +1 -0
- package/dist/protocol/errors.d.ts +10 -0
- package/dist/protocol/errors.d.ts.map +1 -0
- package/dist/protocol/errors.js +42 -0
- package/dist/protocol/errors.js.map +1 -0
- package/dist/protocol/index.d.ts +9 -0
- package/dist/protocol/index.d.ts.map +1 -0
- package/dist/protocol/index.js +6 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/protocol/legacy.d.ts +18 -0
- package/dist/protocol/legacy.d.ts.map +1 -0
- package/dist/protocol/legacy.js +41 -0
- package/dist/protocol/legacy.js.map +1 -0
- package/dist/protocol/sse.d.ts +10 -0
- package/dist/protocol/sse.d.ts.map +1 -0
- package/dist/protocol/sse.js +15 -0
- package/dist/protocol/sse.js.map +1 -0
- package/dist/protocol/v1.d.ts +140 -0
- package/dist/protocol/v1.d.ts.map +1 -0
- package/dist/protocol/v1.js +15 -0
- package/dist/protocol/v1.js.map +1 -0
- package/dist/providers/base.d.ts +17 -15
- package/dist/providers/base.d.ts.map +1 -1
- package/dist/providers/base.js +43 -31
- package/dist/providers/base.js.map +1 -1
- package/dist/providers/claude.d.ts +40 -2
- package/dist/providers/claude.d.ts.map +1 -1
- package/dist/providers/claude.js +250 -113
- package/dist/providers/claude.js.map +1 -1
- package/dist/providers/gemini.d.ts +23 -3
- package/dist/providers/gemini.d.ts.map +1 -1
- package/dist/providers/gemini.js +245 -102
- package/dist/providers/gemini.js.map +1 -1
- package/dist/providers/history.d.ts +52 -0
- package/dist/providers/history.d.ts.map +1 -0
- package/dist/providers/history.js +212 -0
- package/dist/providers/history.js.map +1 -0
- package/dist/providers/index.d.ts +5 -5
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +5 -4
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openai.d.ts +37 -3
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +246 -140
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/registry.d.ts +7 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +12 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/schema.d.ts +16 -0
- package/dist/providers/schema.d.ts.map +1 -0
- package/dist/providers/schema.js +80 -0
- package/dist/providers/schema.js.map +1 -0
- package/dist/providers/tool-execution.d.ts +10 -0
- package/dist/providers/tool-execution.d.ts.map +1 -1
- package/dist/providers/tool-execution.js +38 -12
- package/dist/providers/tool-execution.js.map +1 -1
- package/dist/providers/types.d.ts +71 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/storage/adapt.d.ts +15 -0
- package/dist/storage/adapt.d.ts.map +1 -0
- package/dist/storage/adapt.js +83 -0
- package/dist/storage/adapt.js.map +1 -0
- package/dist/storage/errors.d.ts +18 -0
- package/dist/storage/errors.d.ts.map +1 -0
- package/dist/storage/errors.js +28 -0
- package/dist/storage/errors.js.map +1 -0
- package/dist/storage/index.d.ts +5 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +4 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/memory.d.ts +24 -0
- package/dist/storage/memory.d.ts.map +1 -0
- package/dist/storage/memory.js +265 -0
- package/dist/storage/memory.js.map +1 -0
- package/dist/storage/types.d.ts +118 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +2 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/testing/conformance.d.ts +29 -0
- package/dist/testing/conformance.d.ts.map +1 -0
- package/dist/testing/conformance.js +335 -0
- package/dist/testing/conformance.js.map +1 -0
- package/dist/testing/index.d.ts +3 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +5 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/provider.d.ts +45 -0
- package/dist/testing/provider.d.ts.map +1 -0
- package/dist/testing/provider.js +82 -0
- package/dist/testing/provider.js.map +1 -0
- package/dist/tools/base.d.ts +14 -4
- package/dist/tools/base.d.ts.map +1 -1
- package/dist/tools/base.js +4 -2
- package/dist/tools/base.js.map +1 -1
- package/dist/tools/lead-capture.d.ts +3 -1
- package/dist/tools/lead-capture.d.ts.map +1 -1
- package/dist/tools/lead-capture.js +6 -1
- package/dist/tools/lead-capture.js.map +1 -1
- package/dist/types.d.ts +168 -4
- package/dist/types.d.ts.map +1 -1
- package/package.json +53 -5
package/dist/providers/openai.js
CHANGED
|
@@ -1,160 +1,266 @@
|
|
|
1
1
|
import OpenAI from 'openai';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
import { chatSyncViaTurn, chatViaTurn } from '../agent/chat.js';
|
|
3
|
+
import { joinSystem } from '../agent/run-turn.js';
|
|
4
|
+
import { DEFAULT_MAX_TOKENS, toOpenAITools, warnOnce } from './base.js';
|
|
5
|
+
import { normalizeTurns } from './history.js';
|
|
6
|
+
import { parseToolInput } from './tool-execution.js';
|
|
7
|
+
const DEFAULT_MODEL = 'gpt-5-mini';
|
|
8
|
+
const DEFAULT_EFFORT = 'low';
|
|
6
9
|
function createToolCallId() {
|
|
7
|
-
|
|
8
|
-
|
|
10
|
+
return `call_${crypto.randomUUID()}`;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* OpenAI reasoning models (o-series, GPT-5 and later) take `reasoning_effort`
|
|
14
|
+
* and reject a non-default `temperature`. Models behind a custom `baseURL`
|
|
15
|
+
* are treated as regular chat models.
|
|
16
|
+
*/
|
|
17
|
+
export function isOpenAIReasoningModel(model, baseURL) {
|
|
18
|
+
if (baseURL)
|
|
19
|
+
return false;
|
|
20
|
+
return /^(o\d|gpt-5|gpt-6)/.test(model) && !model.includes('chat-latest');
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Stored history as OpenAI chat messages: the system prompt first, then for
|
|
24
|
+
* each step an assistant message with its `tool_calls`, followed by one
|
|
25
|
+
* `tool` message per result in call order. Reasoning isn't sent back; the
|
|
26
|
+
* chat completions API has no field for it.
|
|
27
|
+
*/
|
|
28
|
+
export function toOpenAIStepMessages(systemPrompt, messages) {
|
|
29
|
+
const out = [{ role: 'system', content: systemPrompt }];
|
|
30
|
+
for (const turn of normalizeTurns(messages)) {
|
|
31
|
+
if (turn.role === 'user') {
|
|
32
|
+
for (const part of turn.parts) {
|
|
33
|
+
if (part.type === 'tool-result')
|
|
34
|
+
out.push(toToolMessage(part));
|
|
35
|
+
}
|
|
36
|
+
const text = turn.parts.flatMap((part) => (part.type === 'text' ? [part.text] : [])).join('\n\n');
|
|
37
|
+
if (text)
|
|
38
|
+
out.push({ role: 'user', content: text });
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
let text = '';
|
|
42
|
+
let calls = [];
|
|
43
|
+
const flush = () => {
|
|
44
|
+
if (text || calls.length) {
|
|
45
|
+
out.push({ role: 'assistant', content: text || null, ...(calls.length ? { tool_calls: calls } : {}) });
|
|
46
|
+
}
|
|
47
|
+
text = '';
|
|
48
|
+
calls = [];
|
|
49
|
+
};
|
|
50
|
+
for (const part of turn.parts) {
|
|
51
|
+
if (part.type === 'tool-result') {
|
|
52
|
+
flush();
|
|
53
|
+
out.push(toToolMessage(part));
|
|
54
|
+
}
|
|
55
|
+
else if (part.type === 'text') {
|
|
56
|
+
text += part.text;
|
|
57
|
+
}
|
|
58
|
+
else if (part.type === 'tool-call') {
|
|
59
|
+
calls.push({
|
|
60
|
+
id: part.toolCallId,
|
|
61
|
+
type: 'function',
|
|
62
|
+
function: {
|
|
63
|
+
name: part.toolName,
|
|
64
|
+
arguments: typeof part.input === 'string' ? part.input : JSON.stringify(part.input ?? {}),
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
flush();
|
|
70
|
+
}
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
function toToolMessage(part) {
|
|
74
|
+
return {
|
|
75
|
+
role: 'tool',
|
|
76
|
+
tool_call_id: part.toolCallId,
|
|
77
|
+
content: JSON.stringify(part.output ?? { success: false, message: part.error }),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Some OpenAI-compatible servers (Ollama among them) end a tool step with
|
|
82
|
+
* `stop` instead of `tool_calls`, so any finished step with calls counts.
|
|
83
|
+
*/
|
|
84
|
+
function finishReason(reason, hasToolCalls, refused) {
|
|
85
|
+
if (refused)
|
|
86
|
+
return 'refusal';
|
|
87
|
+
if (reason === 'length')
|
|
88
|
+
return 'length';
|
|
89
|
+
if (reason === 'content_filter')
|
|
90
|
+
return 'content-filter';
|
|
91
|
+
if (hasToolCalls)
|
|
92
|
+
return 'tool-calls';
|
|
93
|
+
return 'stop';
|
|
94
|
+
}
|
|
95
|
+
function toUsage(usage) {
|
|
96
|
+
const cached = usage?.prompt_tokens_details?.cached_tokens ?? 0;
|
|
97
|
+
return {
|
|
98
|
+
inputTokens: usage?.prompt_tokens ?? 0,
|
|
99
|
+
outputTokens: usage?.completion_tokens ?? 0,
|
|
100
|
+
...(cached ? { cacheReadTokens: cached } : {}),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
function rejectsStreamOptions(error) {
|
|
104
|
+
const status = error?.status;
|
|
105
|
+
const message = error instanceof Error ? error.message : '';
|
|
106
|
+
return status === 400 && /stream_options|include_usage/.test(message);
|
|
9
107
|
}
|
|
10
108
|
export class OpenAIProvider {
|
|
11
|
-
name
|
|
109
|
+
name;
|
|
12
110
|
client;
|
|
13
111
|
model;
|
|
14
|
-
|
|
15
|
-
|
|
112
|
+
reasoning;
|
|
113
|
+
effort;
|
|
114
|
+
maxTokensParam;
|
|
115
|
+
supportsTools;
|
|
116
|
+
/** Set once a server rejects `stream_options`; usage isn't asked for after that. */
|
|
117
|
+
streamUsage = true;
|
|
118
|
+
constructor(config, options = {}) {
|
|
119
|
+
this.name = options.compatible ? 'openai-compatible' : 'openai';
|
|
120
|
+
if (options.compatible) {
|
|
121
|
+
if (!config.baseURL?.trim())
|
|
122
|
+
throw new Error('openai-compatible requires baseURL');
|
|
123
|
+
if (!config.model?.trim())
|
|
124
|
+
throw new Error('openai-compatible requires model');
|
|
125
|
+
}
|
|
126
|
+
else if (!config.apiKey?.trim()) {
|
|
127
|
+
throw new Error('openai requires apiKey');
|
|
128
|
+
}
|
|
129
|
+
this.client = new OpenAI({
|
|
130
|
+
apiKey: config.apiKey || 'chatcops-local',
|
|
131
|
+
...(config.baseURL ? { baseURL: config.baseURL } : {}),
|
|
132
|
+
...(config.headers ? { defaultHeaders: config.headers } : {}),
|
|
133
|
+
...(config.organization ? { organization: config.organization } : {}),
|
|
134
|
+
...(config.fetch ? { fetch: config.fetch } : {}),
|
|
135
|
+
});
|
|
16
136
|
this.model = config.model ?? DEFAULT_MODEL;
|
|
137
|
+
this.reasoning = isOpenAIReasoningModel(this.model, config.baseURL);
|
|
138
|
+
this.effort = config.effort ?? DEFAULT_EFFORT;
|
|
139
|
+
this.maxTokensParam = config.maxTokensParam ?? (options.compatible ? 'max_tokens' : 'max_completion_tokens');
|
|
140
|
+
this.supportsTools = config.supportsTools ?? true;
|
|
17
141
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
{
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
continue;
|
|
43
|
-
finishReason = choice.finish_reason ?? finishReason;
|
|
44
|
-
const deltaText = choice.delta?.content;
|
|
45
|
-
if (deltaText) {
|
|
46
|
-
assistantText += deltaText;
|
|
47
|
-
yield deltaText;
|
|
48
|
-
}
|
|
49
|
-
for (const toolCallDelta of choice.delta?.tool_calls ?? []) {
|
|
50
|
-
const existing = toolCalls.get(toolCallDelta.index) ?? {
|
|
51
|
-
id: toolCallDelta.id ?? createToolCallId(),
|
|
52
|
-
type: 'function',
|
|
53
|
-
function: {
|
|
54
|
-
name: '',
|
|
55
|
-
arguments: '',
|
|
56
|
-
},
|
|
57
|
-
};
|
|
58
|
-
if (toolCallDelta.id) {
|
|
59
|
-
existing.id = toolCallDelta.id;
|
|
60
|
-
}
|
|
61
|
-
if (toolCallDelta.function?.name) {
|
|
62
|
-
existing.function.name = toolCallDelta.function.name;
|
|
63
|
-
}
|
|
64
|
-
if (toolCallDelta.function?.arguments) {
|
|
65
|
-
existing.function.arguments += toolCallDelta.function.arguments;
|
|
66
|
-
}
|
|
67
|
-
toolCalls.set(toolCallDelta.index, existing);
|
|
68
|
-
}
|
|
142
|
+
request(params, messages) {
|
|
143
|
+
if (!this.supportsTools && params.tools?.length) {
|
|
144
|
+
warnOnce(`${this.name}-tools-${this.model}`, `${this.name} model ${this.model} has supportsTools: false, so configured tools are not sent.`);
|
|
145
|
+
}
|
|
146
|
+
let temperature = params.temperature;
|
|
147
|
+
if (temperature != null && this.reasoning) {
|
|
148
|
+
warnOnce(`openai-temperature-${this.model}`, `${this.model} doesn't accept \`temperature\`, so it is not sent. Use \`effort\` to trade speed for depth.`);
|
|
149
|
+
temperature = undefined;
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
model: this.model,
|
|
153
|
+
messages,
|
|
154
|
+
[this.maxTokensParam]: params.maxTokens ?? DEFAULT_MAX_TOKENS,
|
|
155
|
+
...(this.supportsTools && params.tools?.length ? { tools: toOpenAITools(params.tools) } : {}),
|
|
156
|
+
...(temperature != null ? { temperature } : {}),
|
|
157
|
+
...(this.reasoning ? { reasoning_effort: this.effort } : {}),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
async openStream(params) {
|
|
161
|
+
const system = joinSystem(params.systemPrompt, params.systemContext);
|
|
162
|
+
const body = { ...this.request(params, toOpenAIStepMessages(system, params.messages)), stream: true };
|
|
163
|
+
if (this.streamUsage) {
|
|
164
|
+
try {
|
|
165
|
+
return await this.client.chat.completions.create({ ...body, stream_options: { include_usage: true } }, { signal: params.signal });
|
|
69
166
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
167
|
+
catch (error) {
|
|
168
|
+
if (!rejectsStreamOptions(error))
|
|
169
|
+
throw error;
|
|
170
|
+
this.streamUsage = false;
|
|
171
|
+
warnOnce(`openai-stream-options-${this.model}`, "The server doesn't accept `stream_options`, so token usage isn't reported for this provider.");
|
|
75
172
|
}
|
|
76
|
-
|
|
77
|
-
|
|
173
|
+
}
|
|
174
|
+
return this.client.chat.completions.create(body, { signal: params.signal });
|
|
175
|
+
}
|
|
176
|
+
/** One model request: streams text, then reports tool calls, usage and why it stopped. */
|
|
177
|
+
async *step(params) {
|
|
178
|
+
params.signal?.throwIfAborted();
|
|
179
|
+
const stream = await this.openStream(params);
|
|
180
|
+
let reason = null;
|
|
181
|
+
let usage;
|
|
182
|
+
let text = '';
|
|
183
|
+
let refusal = '';
|
|
184
|
+
const calls = new Map();
|
|
185
|
+
for await (const chunk of stream) {
|
|
186
|
+
// With include_usage, the last chunk carries usage and no choices.
|
|
187
|
+
if (chunk.usage)
|
|
188
|
+
usage = chunk.usage;
|
|
189
|
+
const choice = chunk.choices[0];
|
|
190
|
+
if (!choice)
|
|
191
|
+
continue;
|
|
192
|
+
reason = choice.finish_reason ?? reason;
|
|
193
|
+
const delta = choice.delta;
|
|
194
|
+
if (delta?.content) {
|
|
195
|
+
text += delta.content;
|
|
196
|
+
yield { type: 'text-delta', delta: delta.content };
|
|
78
197
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
catch (error) {
|
|
95
|
-
return toToolFailure(error);
|
|
96
|
-
}
|
|
97
|
-
})();
|
|
98
|
-
messages.push({
|
|
99
|
-
role: 'tool',
|
|
100
|
-
tool_call_id: toolCall.id,
|
|
101
|
-
content: JSON.stringify(serializeToolResult(result)),
|
|
102
|
-
});
|
|
198
|
+
if (delta?.refusal)
|
|
199
|
+
refusal += delta.refusal;
|
|
200
|
+
for (const callDelta of delta?.tool_calls ?? []) {
|
|
201
|
+
if (callDelta.type && callDelta.type !== 'function')
|
|
202
|
+
continue;
|
|
203
|
+
const call = calls.get(callDelta.index) ?? { id: '', synthetic: true, name: '', arguments: '' };
|
|
204
|
+
if (callDelta.id) {
|
|
205
|
+
call.id = callDelta.id;
|
|
206
|
+
call.synthetic = false;
|
|
207
|
+
}
|
|
208
|
+
if (callDelta.function?.name)
|
|
209
|
+
call.name = callDelta.function.name;
|
|
210
|
+
if (callDelta.function?.arguments)
|
|
211
|
+
call.arguments += callDelta.function.arguments;
|
|
212
|
+
calls.set(callDelta.index, call);
|
|
103
213
|
}
|
|
104
214
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
})
|
|
113
|
-
];
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
const
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
...(params.temperature != null ? { temperature: params.temperature } : {}),
|
|
122
|
-
});
|
|
123
|
-
const choice = response.choices[0];
|
|
124
|
-
const assistantMessage = choice?.message;
|
|
125
|
-
const toolCalls = assistantMessage?.tool_calls ?? [];
|
|
126
|
-
if (choice?.finish_reason !== 'tool_calls' || toolCalls.length === 0) {
|
|
127
|
-
return assistantMessage?.content ?? '';
|
|
215
|
+
// The SDK ends the stream quietly when it's aborted, so check here, or a
|
|
216
|
+
// cancelled reply would look like a finished empty one.
|
|
217
|
+
params.signal?.throwIfAborted();
|
|
218
|
+
const parts = [];
|
|
219
|
+
if (text)
|
|
220
|
+
parts.push({ type: 'text', text });
|
|
221
|
+
if (refusal)
|
|
222
|
+
parts.push({ type: 'text', text: refusal });
|
|
223
|
+
const ordered = [...calls.entries()].sort(([a], [b]) => a - b).map(([, call]) => call);
|
|
224
|
+
const events = [];
|
|
225
|
+
for (const call of ordered) {
|
|
226
|
+
const id = call.synthetic ? createToolCallId() : call.id;
|
|
227
|
+
let input = {};
|
|
228
|
+
let inputError;
|
|
229
|
+
try {
|
|
230
|
+
input = parseToolInput(call.arguments);
|
|
128
231
|
}
|
|
129
|
-
|
|
130
|
-
|
|
232
|
+
catch (error) {
|
|
233
|
+
inputError = error instanceof Error ? error.message : 'Tool arguments must be valid JSON.';
|
|
131
234
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
235
|
+
parts.push({
|
|
236
|
+
type: 'tool-call',
|
|
237
|
+
toolCallId: id,
|
|
238
|
+
toolName: call.name,
|
|
239
|
+
// Keep what the model sent when it isn't JSON, so it can see its mistake.
|
|
240
|
+
input: inputError ? call.arguments : input,
|
|
241
|
+
executor: 'server',
|
|
242
|
+
state: inputError ? 'error' : 'pending',
|
|
137
243
|
});
|
|
138
|
-
|
|
139
|
-
const result = await (async () => {
|
|
140
|
-
try {
|
|
141
|
-
return await executeToolCall(params, {
|
|
142
|
-
id: toolCall.id,
|
|
143
|
-
name: toolCall.function.name,
|
|
144
|
-
input: parseToolInput(toolCall.function.arguments),
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
catch (error) {
|
|
148
|
-
return toToolFailure(error);
|
|
149
|
-
}
|
|
150
|
-
})();
|
|
151
|
-
messages.push({
|
|
152
|
-
role: 'tool',
|
|
153
|
-
tool_call_id: toolCall.id,
|
|
154
|
-
content: JSON.stringify(serializeToolResult(result)),
|
|
155
|
-
});
|
|
156
|
-
}
|
|
244
|
+
events.push({ type: 'tool-call', call: { id, name: call.name, input }, ...(inputError ? { inputError } : {}) });
|
|
157
245
|
}
|
|
246
|
+
yield* events;
|
|
247
|
+
yield {
|
|
248
|
+
type: 'finish',
|
|
249
|
+
reason: finishReason(reason, ordered.length > 0, refusal !== ''),
|
|
250
|
+
usage: toUsage(usage),
|
|
251
|
+
parts,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* A turn with tools run through `params.toolExecutor`, as text.
|
|
256
|
+
* @deprecated Use `runTurn()`, which also returns the reply's parts, status and usage.
|
|
257
|
+
*/
|
|
258
|
+
chat(params) {
|
|
259
|
+
return chatViaTurn(this, params);
|
|
260
|
+
}
|
|
261
|
+
/** @deprecated Use `runTurn()`. */
|
|
262
|
+
chatSync(params) {
|
|
263
|
+
return chatSyncViaTurn(this, params);
|
|
158
264
|
}
|
|
159
265
|
}
|
|
160
266
|
//# sourceMappingURL=openai.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ProviderConfig } from '../types.js';
|
|
2
|
+
import type { AIProvider } from './types.js';
|
|
3
|
+
export type ProviderFactory = (config: ProviderConfig) => AIProvider | Promise<AIProvider>;
|
|
4
|
+
/** Register a custom provider. Re-registering replaces its factory for hot reload. */
|
|
5
|
+
export declare function registerProvider(type: string, factory: ProviderFactory): void;
|
|
6
|
+
export declare function getProviderFactory(type: string): ProviderFactory | undefined;
|
|
7
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,cAAc,KAAK,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAK3F,sFAAsF;AACtF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI,CAG7E;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAE5E"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const builtins = new Set(['claude', 'openai', 'gemini', 'openai-compatible']);
|
|
2
|
+
const factories = new Map();
|
|
3
|
+
/** Register a custom provider. Re-registering replaces its factory for hot reload. */
|
|
4
|
+
export function registerProvider(type, factory) {
|
|
5
|
+
if (builtins.has(type))
|
|
6
|
+
throw new Error(`Cannot register reserved provider type: ${type}`);
|
|
7
|
+
factories.set(type, factory);
|
|
8
|
+
}
|
|
9
|
+
export function getProviderFactory(type) {
|
|
10
|
+
return factories.get(type);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AAKA,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC;AAC9E,MAAM,SAAS,GAAG,IAAI,GAAG,EAA2B,CAAC;AAErD,sFAAsF;AACtF,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,OAAwB;IACrE,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,IAAI,EAAE,CAAC,CAAC;IAC3F,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { JSONSchema, ToolDefinition, ToolParameter } from '../types.js';
|
|
2
|
+
/** The 0.4 flat parameter form as a JSON Schema object. */
|
|
3
|
+
export declare function legacyParametersToSchema(parameters: Record<string, ToolParameter>, required?: string[]): JSONSchema;
|
|
4
|
+
/** The JSON Schema sent to providers for this tool's input. */
|
|
5
|
+
export declare function toolInputSchema(tool: ToolDefinition): JSONSchema;
|
|
6
|
+
export declare class ToolDefinitionError extends Error {
|
|
7
|
+
readonly problems: string[];
|
|
8
|
+
constructor(problems: string[]);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Checks tool definitions before any request, so a mistake fails at startup
|
|
12
|
+
* with a clear message instead of as a provider error on the first message.
|
|
13
|
+
* Throws a `ToolDefinitionError` listing every problem.
|
|
14
|
+
*/
|
|
15
|
+
export declare function validateTools(tools: readonly ToolDefinition[]): void;
|
|
16
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/providers/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAQ7E,2DAA2D;AAC3D,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,EACzC,QAAQ,GAAE,MAAM,EAAO,GACtB,UAAU,CAUZ;AAED,+DAA+D;AAC/D,wBAAgB,eAAe,CAAC,IAAI,EAAE,cAAc,GAAG,UAAU,CAGhE;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE;gBAAlB,QAAQ,EAAE,MAAM,EAAE;CAIxC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,GAAG,IAAI,CA6CpE"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Names every provider accepts: Claude and OpenAI allow letters, digits, `_`
|
|
3
|
+
* and `-` up to 64 characters, and Gemini also wants a letter or `_` first.
|
|
4
|
+
*/
|
|
5
|
+
const TOOL_NAME = /^[a-zA-Z_][a-zA-Z0-9_-]{0,63}$/;
|
|
6
|
+
/** The 0.4 flat parameter form as a JSON Schema object. */
|
|
7
|
+
export function legacyParametersToSchema(parameters, required = []) {
|
|
8
|
+
const properties = {};
|
|
9
|
+
for (const [key, parameter] of Object.entries(parameters)) {
|
|
10
|
+
properties[key] = {
|
|
11
|
+
type: parameter.type,
|
|
12
|
+
description: parameter.description,
|
|
13
|
+
...(parameter.enum ? { enum: parameter.enum } : {}),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
return { type: 'object', properties, required };
|
|
17
|
+
}
|
|
18
|
+
/** The JSON Schema sent to providers for this tool's input. */
|
|
19
|
+
export function toolInputSchema(tool) {
|
|
20
|
+
if (tool.inputSchema)
|
|
21
|
+
return tool.inputSchema;
|
|
22
|
+
return legacyParametersToSchema(tool.parameters ?? {}, tool.required ?? []);
|
|
23
|
+
}
|
|
24
|
+
export class ToolDefinitionError extends Error {
|
|
25
|
+
problems;
|
|
26
|
+
constructor(problems) {
|
|
27
|
+
super(`Invalid tool definitions:\n${problems.map((p) => ` - ${p}`).join('\n')}`);
|
|
28
|
+
this.problems = problems;
|
|
29
|
+
this.name = 'ToolDefinitionError';
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Checks tool definitions before any request, so a mistake fails at startup
|
|
34
|
+
* with a clear message instead of as a provider error on the first message.
|
|
35
|
+
* Throws a `ToolDefinitionError` listing every problem.
|
|
36
|
+
*/
|
|
37
|
+
export function validateTools(tools) {
|
|
38
|
+
const problems = [];
|
|
39
|
+
const seen = new Set();
|
|
40
|
+
tools.forEach((tool, index) => {
|
|
41
|
+
const label = typeof tool?.name === 'string' && tool.name ? `"${tool.name}"` : `#${index}`;
|
|
42
|
+
if (typeof tool?.name !== 'string' || !TOOL_NAME.test(tool.name)) {
|
|
43
|
+
problems.push(`tool ${label}: the name must start with a letter or _, and use only letters, digits, _ and - (64 at most)`);
|
|
44
|
+
}
|
|
45
|
+
else if (seen.has(tool.name)) {
|
|
46
|
+
problems.push(`tool ${label}: another tool has the same name`);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
seen.add(tool.name);
|
|
50
|
+
}
|
|
51
|
+
if (typeof tool?.description !== 'string') {
|
|
52
|
+
problems.push(`tool ${label}: description must be a string`);
|
|
53
|
+
}
|
|
54
|
+
if (tool?.inputSchema && tool.parameters) {
|
|
55
|
+
problems.push(`tool ${label}: set inputSchema or parameters, not both`);
|
|
56
|
+
}
|
|
57
|
+
if (tool?.inputSchema) {
|
|
58
|
+
const schema = tool.inputSchema;
|
|
59
|
+
if (typeof schema !== 'object' || schema === null || Array.isArray(schema) || schema.type !== 'object') {
|
|
60
|
+
problems.push(`tool ${label}: inputSchema must be a JSON Schema with type: 'object' at the root`);
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
JSON.stringify(schema);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
problems.push(`tool ${label}: inputSchema must be plain JSON (no cycles or functions)`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else if (tool?.parameters) {
|
|
70
|
+
for (const key of tool.required ?? []) {
|
|
71
|
+
if (!(key in tool.parameters)) {
|
|
72
|
+
problems.push(`tool ${label}: required lists "${key}", which isn't in parameters`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
if (problems.length > 0)
|
|
78
|
+
throw new ToolDefinitionError(problems);
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/providers/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,5 +4,15 @@ export declare const DEFAULT_TOOL_TIMEOUT_MS = 30000;
|
|
|
4
4
|
export declare function parseToolInput(rawInput: string): Record<string, unknown>;
|
|
5
5
|
export declare function serializeToolResult(result: ToolResult): Record<string, unknown>;
|
|
6
6
|
export declare function toToolFailure(error: unknown): ToolResult;
|
|
7
|
+
/**
|
|
8
|
+
* Runs a tool with a timeout. The tool gets a signal that aborts when the
|
|
9
|
+
* timeout passes or when `signal` aborts (the visitor left), and the result
|
|
10
|
+
* comes back as a failure right away in both cases, so a tool that ignores
|
|
11
|
+
* its signal can't hold up the reply.
|
|
12
|
+
*/
|
|
13
|
+
export declare function runToolWithTimeout(run: (signal: AbortSignal) => Promise<ToolResult>, options?: {
|
|
14
|
+
timeoutMs?: number;
|
|
15
|
+
signal?: AbortSignal;
|
|
16
|
+
}): Promise<ToolResult>;
|
|
7
17
|
export declare function executeToolCall(params: ProviderChatParams, call: ProviderToolCall): Promise<ToolResult>;
|
|
8
18
|
//# sourceMappingURL=tool-execution.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-execution.d.ts","sourceRoot":"","sources":["../../src/providers/tool-execution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEpF,eAAO,MAAM,eAAe,IAAI,CAAC;AACjC,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAE9C,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAexE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAM/E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAKxD;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,kBAAkB,EAC1B,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"tool-execution.d.ts","sourceRoot":"","sources":["../../src/providers/tool-execution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEpF,eAAO,MAAM,eAAe,IAAI,CAAC;AACjC,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAE9C,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAexE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAM/E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAKxD;AAOD;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,UAAU,CAAC,EACjD,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GACzD,OAAO,CAAC,UAAU,CAAC,CAgCrB;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,kBAAkB,EAC1B,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,UAAU,CAAC,CAUrB"}
|