@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.
Files changed (162) hide show
  1. package/dist/agent/chat.d.ts +13 -0
  2. package/dist/agent/chat.d.ts.map +1 -0
  3. package/dist/agent/chat.js +42 -0
  4. package/dist/agent/chat.js.map +1 -0
  5. package/dist/agent/errors.d.ts +14 -0
  6. package/dist/agent/errors.d.ts.map +1 -0
  7. package/dist/agent/errors.js +24 -0
  8. package/dist/agent/errors.js.map +1 -0
  9. package/dist/agent/index.d.ts +5 -0
  10. package/dist/agent/index.d.ts.map +1 -0
  11. package/dist/agent/index.js +5 -0
  12. package/dist/agent/index.js.map +1 -0
  13. package/dist/agent/run-turn.d.ts +68 -0
  14. package/dist/agent/run-turn.d.ts.map +1 -0
  15. package/dist/agent/run-turn.js +344 -0
  16. package/dist/agent/run-turn.js.map +1 -0
  17. package/dist/agent/tool-registry.d.ts +28 -0
  18. package/dist/agent/tool-registry.d.ts.map +1 -0
  19. package/dist/agent/tool-registry.js +69 -0
  20. package/dist/agent/tool-registry.js.map +1 -0
  21. package/dist/analytics/index.d.ts +1 -0
  22. package/dist/analytics/index.d.ts.map +1 -1
  23. package/dist/analytics/index.js +1 -0
  24. package/dist/analytics/index.js.map +1 -1
  25. package/dist/analytics/sink.d.ts +24 -0
  26. package/dist/analytics/sink.d.ts.map +1 -0
  27. package/dist/analytics/sink.js +106 -0
  28. package/dist/analytics/sink.js.map +1 -0
  29. package/dist/conversation/index.d.ts +1 -0
  30. package/dist/conversation/index.d.ts.map +1 -1
  31. package/dist/conversation/index.js.map +1 -1
  32. package/dist/conversation/manager.d.ts +62 -6
  33. package/dist/conversation/manager.d.ts.map +1 -1
  34. package/dist/conversation/manager.js +109 -30
  35. package/dist/conversation/manager.js.map +1 -1
  36. package/dist/conversation/store.d.ts +6 -5
  37. package/dist/conversation/store.d.ts.map +1 -1
  38. package/dist/conversation/store.js +4 -0
  39. package/dist/conversation/store.js.map +1 -1
  40. package/dist/index.d.ts +18 -4
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +14 -2
  43. package/dist/index.js.map +1 -1
  44. package/dist/limits/budget.d.ts +84 -0
  45. package/dist/limits/budget.d.ts.map +1 -0
  46. package/dist/limits/budget.js +114 -0
  47. package/dist/limits/budget.js.map +1 -0
  48. package/dist/limits/rate-limit.d.ts +53 -0
  49. package/dist/limits/rate-limit.d.ts.map +1 -0
  50. package/dist/limits/rate-limit.js +68 -0
  51. package/dist/limits/rate-limit.js.map +1 -0
  52. package/dist/parts.d.ts +9 -0
  53. package/dist/parts.d.ts.map +1 -0
  54. package/dist/parts.js +17 -0
  55. package/dist/parts.js.map +1 -0
  56. package/dist/protocol/ai-sdk.d.ts +27 -0
  57. package/dist/protocol/ai-sdk.d.ts.map +1 -0
  58. package/dist/protocol/ai-sdk.js +127 -0
  59. package/dist/protocol/ai-sdk.js.map +1 -0
  60. package/dist/protocol/errors.d.ts +10 -0
  61. package/dist/protocol/errors.d.ts.map +1 -0
  62. package/dist/protocol/errors.js +42 -0
  63. package/dist/protocol/errors.js.map +1 -0
  64. package/dist/protocol/index.d.ts +9 -0
  65. package/dist/protocol/index.d.ts.map +1 -0
  66. package/dist/protocol/index.js +6 -0
  67. package/dist/protocol/index.js.map +1 -0
  68. package/dist/protocol/legacy.d.ts +18 -0
  69. package/dist/protocol/legacy.d.ts.map +1 -0
  70. package/dist/protocol/legacy.js +41 -0
  71. package/dist/protocol/legacy.js.map +1 -0
  72. package/dist/protocol/sse.d.ts +10 -0
  73. package/dist/protocol/sse.d.ts.map +1 -0
  74. package/dist/protocol/sse.js +15 -0
  75. package/dist/protocol/sse.js.map +1 -0
  76. package/dist/protocol/v1.d.ts +140 -0
  77. package/dist/protocol/v1.d.ts.map +1 -0
  78. package/dist/protocol/v1.js +15 -0
  79. package/dist/protocol/v1.js.map +1 -0
  80. package/dist/providers/base.d.ts +17 -15
  81. package/dist/providers/base.d.ts.map +1 -1
  82. package/dist/providers/base.js +43 -31
  83. package/dist/providers/base.js.map +1 -1
  84. package/dist/providers/claude.d.ts +40 -2
  85. package/dist/providers/claude.d.ts.map +1 -1
  86. package/dist/providers/claude.js +250 -113
  87. package/dist/providers/claude.js.map +1 -1
  88. package/dist/providers/gemini.d.ts +23 -3
  89. package/dist/providers/gemini.d.ts.map +1 -1
  90. package/dist/providers/gemini.js +245 -102
  91. package/dist/providers/gemini.js.map +1 -1
  92. package/dist/providers/history.d.ts +52 -0
  93. package/dist/providers/history.d.ts.map +1 -0
  94. package/dist/providers/history.js +212 -0
  95. package/dist/providers/history.js.map +1 -0
  96. package/dist/providers/index.d.ts +5 -5
  97. package/dist/providers/index.d.ts.map +1 -1
  98. package/dist/providers/index.js +5 -4
  99. package/dist/providers/index.js.map +1 -1
  100. package/dist/providers/openai.d.ts +37 -3
  101. package/dist/providers/openai.d.ts.map +1 -1
  102. package/dist/providers/openai.js +246 -140
  103. package/dist/providers/openai.js.map +1 -1
  104. package/dist/providers/registry.d.ts +7 -0
  105. package/dist/providers/registry.d.ts.map +1 -0
  106. package/dist/providers/registry.js +12 -0
  107. package/dist/providers/registry.js.map +1 -0
  108. package/dist/providers/schema.d.ts +16 -0
  109. package/dist/providers/schema.d.ts.map +1 -0
  110. package/dist/providers/schema.js +80 -0
  111. package/dist/providers/schema.js.map +1 -0
  112. package/dist/providers/tool-execution.d.ts +10 -0
  113. package/dist/providers/tool-execution.d.ts.map +1 -1
  114. package/dist/providers/tool-execution.js +38 -12
  115. package/dist/providers/tool-execution.js.map +1 -1
  116. package/dist/providers/types.d.ts +71 -0
  117. package/dist/providers/types.d.ts.map +1 -0
  118. package/dist/providers/types.js +2 -0
  119. package/dist/providers/types.js.map +1 -0
  120. package/dist/storage/adapt.d.ts +15 -0
  121. package/dist/storage/adapt.d.ts.map +1 -0
  122. package/dist/storage/adapt.js +83 -0
  123. package/dist/storage/adapt.js.map +1 -0
  124. package/dist/storage/errors.d.ts +18 -0
  125. package/dist/storage/errors.d.ts.map +1 -0
  126. package/dist/storage/errors.js +28 -0
  127. package/dist/storage/errors.js.map +1 -0
  128. package/dist/storage/index.d.ts +5 -0
  129. package/dist/storage/index.d.ts.map +1 -0
  130. package/dist/storage/index.js +4 -0
  131. package/dist/storage/index.js.map +1 -0
  132. package/dist/storage/memory.d.ts +24 -0
  133. package/dist/storage/memory.d.ts.map +1 -0
  134. package/dist/storage/memory.js +265 -0
  135. package/dist/storage/memory.js.map +1 -0
  136. package/dist/storage/types.d.ts +118 -0
  137. package/dist/storage/types.d.ts.map +1 -0
  138. package/dist/storage/types.js +2 -0
  139. package/dist/storage/types.js.map +1 -0
  140. package/dist/testing/conformance.d.ts +29 -0
  141. package/dist/testing/conformance.d.ts.map +1 -0
  142. package/dist/testing/conformance.js +335 -0
  143. package/dist/testing/conformance.js.map +1 -0
  144. package/dist/testing/index.d.ts +3 -0
  145. package/dist/testing/index.d.ts.map +1 -0
  146. package/dist/testing/index.js +5 -0
  147. package/dist/testing/index.js.map +1 -0
  148. package/dist/testing/provider.d.ts +45 -0
  149. package/dist/testing/provider.d.ts.map +1 -0
  150. package/dist/testing/provider.js +82 -0
  151. package/dist/testing/provider.js.map +1 -0
  152. package/dist/tools/base.d.ts +14 -4
  153. package/dist/tools/base.d.ts.map +1 -1
  154. package/dist/tools/base.js +4 -2
  155. package/dist/tools/base.js.map +1 -1
  156. package/dist/tools/lead-capture.d.ts +3 -1
  157. package/dist/tools/lead-capture.d.ts.map +1 -1
  158. package/dist/tools/lead-capture.js +6 -1
  159. package/dist/tools/lead-capture.js.map +1 -1
  160. package/dist/types.d.ts +168 -4
  161. package/dist/types.d.ts.map +1 -1
  162. package/package.json +53 -5
@@ -1,160 +1,266 @@
1
1
  import OpenAI from 'openai';
2
- import { toProviderMessages, toOpenAITools } from './base.js';
3
- import { MAX_TOOL_ROUNDS, executeToolCall, parseToolInput, serializeToolResult, toToolFailure, } from './tool-execution.js';
4
- const DEFAULT_MODEL = 'gpt-4o-mini';
5
- let toolCallSequence = 0;
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
- toolCallSequence += 1;
8
- return `tool_call_${toolCallSequence}`;
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 = 'openai';
109
+ name;
12
110
  client;
13
111
  model;
14
- constructor(config) {
15
- this.client = new OpenAI({ apiKey: config.apiKey });
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
- async *chat(params) {
19
- const messages = [
20
- { role: 'system', content: params.systemPrompt },
21
- ...toProviderMessages(params.messages).map((message) => ({
22
- role: message.role,
23
- content: message.content,
24
- })),
25
- ];
26
- let toolRounds = 0;
27
- while (true) {
28
- const stream = await this.client.chat.completions.create({
29
- model: this.model,
30
- messages,
31
- stream: true,
32
- max_tokens: params.maxTokens ?? 1024,
33
- ...(params.tools?.length ? { tools: toOpenAITools(params.tools) } : {}),
34
- ...(params.temperature != null ? { temperature: params.temperature } : {}),
35
- });
36
- let finishReason = null;
37
- let assistantText = '';
38
- const toolCalls = new Map();
39
- for await (const chunk of stream) {
40
- const choice = chunk.choices[0];
41
- if (!choice)
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
- const completedToolCalls = Array.from(toolCalls.entries())
71
- .sort(([left], [right]) => left - right)
72
- .map(([, toolCall]) => toolCall);
73
- if (finishReason !== 'tool_calls' || completedToolCalls.length === 0) {
74
- return;
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
- if (toolRounds >= MAX_TOOL_ROUNDS) {
77
- throw new Error(`Exceeded maximum tool rounds (${MAX_TOOL_ROUNDS}).`);
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
- toolRounds += 1;
80
- messages.push({
81
- role: 'assistant',
82
- content: assistantText || null,
83
- tool_calls: completedToolCalls,
84
- });
85
- for (const toolCall of completedToolCalls) {
86
- const result = await (async () => {
87
- try {
88
- return await executeToolCall(params, {
89
- id: toolCall.id,
90
- name: toolCall.function.name,
91
- input: parseToolInput(toolCall.function.arguments),
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
- async chatSync(params) {
107
- const messages = [
108
- { role: 'system', content: params.systemPrompt },
109
- ...toProviderMessages(params.messages).map((message) => ({
110
- role: message.role,
111
- content: message.content,
112
- })),
113
- ];
114
- let toolRounds = 0;
115
- while (true) {
116
- const response = await this.client.chat.completions.create({
117
- model: this.model,
118
- messages,
119
- max_tokens: params.maxTokens ?? 1024,
120
- ...(params.tools?.length ? { tools: toOpenAITools(params.tools) } : {}),
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
- if (toolRounds >= MAX_TOOL_ROUNDS) {
130
- throw new Error(`Exceeded maximum tool rounds (${MAX_TOOL_ROUNDS}).`);
232
+ catch (error) {
233
+ inputError = error instanceof Error ? error.message : 'Tool arguments must be valid JSON.';
131
234
  }
132
- toolRounds += 1;
133
- messages.push({
134
- role: 'assistant',
135
- content: assistantMessage.content,
136
- tool_calls: toolCalls,
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
- for (const toolCall of toolCalls) {
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,CA+BrB"}
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"}