@sashabogi/foundation 0.1.6 → 0.1.7
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/cli/setup-wizard.d.ts +30 -0
- package/dist/cli/setup-wizard.d.ts.map +1 -0
- package/dist/cli/setup-wizard.js +1645 -0
- package/dist/cli/setup-wizard.js.map +1 -0
- package/dist/cli/test-connection.d.ts +76 -0
- package/dist/cli/test-connection.d.ts.map +1 -0
- package/dist/cli/test-connection.js +697 -0
- package/dist/cli/test-connection.js.map +1 -0
- package/dist/cli.d.ts +3 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +47 -4
- package/dist/cli.js.map +1 -1
- package/dist/providers/anthropic.d.ts +178 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +514 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/base.d.ts +154 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +227 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/deepseek.d.ts +23 -0
- package/dist/providers/deepseek.d.ts.map +1 -0
- package/dist/providers/deepseek.js +31 -0
- package/dist/providers/deepseek.js.map +1 -0
- package/dist/providers/fireworks.d.ts +23 -0
- package/dist/providers/fireworks.d.ts.map +1 -0
- package/dist/providers/fireworks.js +31 -0
- package/dist/providers/fireworks.js.map +1 -0
- package/dist/providers/gemini.d.ts +85 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +414 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/groq.d.ts +23 -0
- package/dist/providers/groq.d.ts.map +1 -0
- package/dist/providers/groq.js +31 -0
- package/dist/providers/groq.js.map +1 -0
- package/dist/providers/index.d.ts +23 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +27 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/kimi-code.d.ts +32 -0
- package/dist/providers/kimi-code.d.ts.map +1 -0
- package/dist/providers/kimi-code.js +46 -0
- package/dist/providers/kimi-code.js.map +1 -0
- package/dist/providers/kimi.d.ts +19 -0
- package/dist/providers/kimi.d.ts.map +1 -0
- package/dist/providers/kimi.js +27 -0
- package/dist/providers/kimi.js.map +1 -0
- package/dist/providers/manager.d.ts +144 -0
- package/dist/providers/manager.d.ts.map +1 -0
- package/dist/providers/manager.js +279 -0
- package/dist/providers/manager.js.map +1 -0
- package/dist/providers/ollama.d.ts +83 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +450 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai.d.ts +91 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +445 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/openrouter.d.ts +23 -0
- package/dist/providers/openrouter.d.ts.map +1 -0
- package/dist/providers/openrouter.js +31 -0
- package/dist/providers/openrouter.js.map +1 -0
- package/dist/providers/perplexity.d.ts +34 -0
- package/dist/providers/perplexity.d.ts.map +1 -0
- package/dist/providers/perplexity.js +58 -0
- package/dist/providers/perplexity.js.map +1 -0
- package/dist/providers/together.d.ts +23 -0
- package/dist/providers/together.d.ts.map +1 -0
- package/dist/providers/together.js +31 -0
- package/dist/providers/together.js.map +1 -0
- package/dist/providers/types.d.ts +229 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +73 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/providers/zai.d.ts +19 -0
- package/dist/providers/zai.d.ts.map +1 -0
- package/dist/providers/zai.js +27 -0
- package/dist/providers/zai.js.map +1 -0
- package/dist/services/provider.service.d.ts +28 -0
- package/dist/services/provider.service.d.ts.map +1 -1
- package/dist/services/provider.service.js +137 -13
- package/dist/services/provider.service.js.map +1 -1
- package/dist/tools/demerzel/engine.d.ts +67 -0
- package/dist/tools/demerzel/engine.d.ts.map +1 -0
- package/dist/tools/demerzel/engine.js +401 -0
- package/dist/tools/demerzel/engine.js.map +1 -0
- package/dist/tools/demerzel/enhanced-snapshot.d.ts +67 -0
- package/dist/tools/demerzel/enhanced-snapshot.d.ts.map +1 -0
- package/dist/tools/demerzel/enhanced-snapshot.js +481 -0
- package/dist/tools/demerzel/enhanced-snapshot.js.map +1 -0
- package/dist/tools/demerzel/index.d.ts +11 -0
- package/dist/tools/demerzel/index.d.ts.map +1 -1
- package/dist/tools/demerzel/index.js +656 -85
- package/dist/tools/demerzel/index.js.map +1 -1
- package/dist/tools/demerzel/prompts.d.ts +26 -0
- package/dist/tools/demerzel/prompts.d.ts.map +1 -0
- package/dist/tools/demerzel/prompts.js +181 -0
- package/dist/tools/demerzel/prompts.js.map +1 -0
- package/dist/tools/demerzel/semantic-search.d.ts +54 -0
- package/dist/tools/demerzel/semantic-search.d.ts.map +1 -0
- package/dist/tools/demerzel/semantic-search.js +205 -0
- package/dist/tools/demerzel/semantic-search.js.map +1 -0
- package/dist/tools/demerzel/snapshot.d.ts +30 -0
- package/dist/tools/demerzel/snapshot.d.ts.map +1 -0
- package/dist/tools/demerzel/snapshot.js +169 -0
- package/dist/tools/demerzel/snapshot.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Provider Implementation
|
|
3
|
+
*
|
|
4
|
+
* Implements the Provider interface for OpenAI's Chat Completions API.
|
|
5
|
+
* Handles message format translation between Foundation's internal format
|
|
6
|
+
* (which uses Anthropic-style messages) and OpenAI's format.
|
|
7
|
+
*
|
|
8
|
+
* Key differences from Anthropic format:
|
|
9
|
+
* - System prompt goes in messages array as role: "system"
|
|
10
|
+
* - Tool schemas use "parameters" instead of "input_schema"
|
|
11
|
+
* - Tool calls are in a separate "tool_calls" array, not content blocks
|
|
12
|
+
* - Tool results use role: "tool" messages, not tool_result content blocks
|
|
13
|
+
*/
|
|
14
|
+
import { BaseProvider } from './base.js';
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// OpenAI Provider Implementation
|
|
17
|
+
// ============================================================================
|
|
18
|
+
/**
|
|
19
|
+
* OpenAI provider adapter.
|
|
20
|
+
*
|
|
21
|
+
* Translates between Foundation's internal message format and OpenAI's
|
|
22
|
+
* Chat Completions API format. Supports both streaming and non-streaming
|
|
23
|
+
* completion requests.
|
|
24
|
+
*/
|
|
25
|
+
export class OpenAIProvider extends BaseProvider {
|
|
26
|
+
name = 'openai';
|
|
27
|
+
static DEFAULT_BASE_URL = 'https://api.openai.com/v1';
|
|
28
|
+
constructor(config) {
|
|
29
|
+
super(config);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Build headers for OpenAI API requests.
|
|
33
|
+
* Adds organization header if configured.
|
|
34
|
+
*/
|
|
35
|
+
buildHeaders() {
|
|
36
|
+
const headers = super.buildHeaders();
|
|
37
|
+
// Add organization header if configured
|
|
38
|
+
if (this.config.organization) {
|
|
39
|
+
headers['OpenAI-Organization'] = this.config.organization;
|
|
40
|
+
}
|
|
41
|
+
return headers;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Execute a completion request and return the full response.
|
|
45
|
+
*/
|
|
46
|
+
async complete(request) {
|
|
47
|
+
const url = `${this.getBaseUrl(OpenAIProvider.DEFAULT_BASE_URL)}/chat/completions`;
|
|
48
|
+
const openAIRequest = this.translateRequest(request);
|
|
49
|
+
const response = await this.makeRequest({
|
|
50
|
+
method: 'POST',
|
|
51
|
+
url,
|
|
52
|
+
headers: this.buildHeaders(),
|
|
53
|
+
body: openAIRequest,
|
|
54
|
+
timeoutMs: request.timeout_ms ?? this.defaultTimeoutMs,
|
|
55
|
+
});
|
|
56
|
+
return this.translateResponse(response);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Execute a streaming completion request.
|
|
60
|
+
*/
|
|
61
|
+
async *completeStream(request) {
|
|
62
|
+
const url = `${this.getBaseUrl(OpenAIProvider.DEFAULT_BASE_URL)}/chat/completions`;
|
|
63
|
+
const openAIRequest = this.translateRequest({ ...request, stream: true });
|
|
64
|
+
const response = await this.makeStreamingRequest({
|
|
65
|
+
method: 'POST',
|
|
66
|
+
url,
|
|
67
|
+
headers: this.buildHeaders(),
|
|
68
|
+
body: openAIRequest,
|
|
69
|
+
timeoutMs: request.timeout_ms ?? this.defaultTimeoutMs,
|
|
70
|
+
stream: true,
|
|
71
|
+
});
|
|
72
|
+
if (!response.body) {
|
|
73
|
+
throw new Error('No response body for streaming request');
|
|
74
|
+
}
|
|
75
|
+
// Track tool calls being built across chunks
|
|
76
|
+
const toolCallsInProgress = new Map();
|
|
77
|
+
let hasStartedContent = false;
|
|
78
|
+
const reader = response.body.getReader();
|
|
79
|
+
const decoder = new TextDecoder();
|
|
80
|
+
let buffer = '';
|
|
81
|
+
try {
|
|
82
|
+
while (true) {
|
|
83
|
+
const { done, value } = await reader.read();
|
|
84
|
+
if (done) {
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
buffer += decoder.decode(value, { stream: true });
|
|
88
|
+
// Process complete SSE events
|
|
89
|
+
const lines = buffer.split('\n');
|
|
90
|
+
buffer = lines.pop() || '';
|
|
91
|
+
for (const line of lines) {
|
|
92
|
+
const trimmed = line.trim();
|
|
93
|
+
if (!trimmed || trimmed === 'data: [DONE]') {
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (trimmed.startsWith('data: ')) {
|
|
97
|
+
const jsonStr = trimmed.slice(6);
|
|
98
|
+
try {
|
|
99
|
+
const chunk = JSON.parse(jsonStr);
|
|
100
|
+
const chunks = this.translateStreamChunk(chunk, toolCallsInProgress, hasStartedContent);
|
|
101
|
+
for (const streamChunk of chunks) {
|
|
102
|
+
// Track state for content block management
|
|
103
|
+
if (streamChunk.type === 'content_block_start' &&
|
|
104
|
+
streamChunk.content_block?.type === 'text') {
|
|
105
|
+
hasStartedContent = true;
|
|
106
|
+
}
|
|
107
|
+
yield streamChunk;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// Skip malformed JSON chunks
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
reader.releaseLock();
|
|
119
|
+
}
|
|
120
|
+
// Emit message_stop at the end
|
|
121
|
+
yield { type: 'message_stop' };
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Check if the provider is available and configured correctly.
|
|
125
|
+
*/
|
|
126
|
+
async healthCheck() {
|
|
127
|
+
const url = `${this.getBaseUrl(OpenAIProvider.DEFAULT_BASE_URL)}/models`;
|
|
128
|
+
await this.makeRequest({
|
|
129
|
+
method: 'GET',
|
|
130
|
+
url,
|
|
131
|
+
headers: this.buildHeaders(),
|
|
132
|
+
timeoutMs: 10000,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
// ==========================================================================
|
|
136
|
+
// Translation Methods
|
|
137
|
+
// ==========================================================================
|
|
138
|
+
/**
|
|
139
|
+
* Translate Foundation request to OpenAI format.
|
|
140
|
+
*
|
|
141
|
+
* Note: Newer OpenAI models (gpt-4o, gpt-4-turbo, o1, etc.) require
|
|
142
|
+
* max_completion_tokens instead of max_tokens. We detect model type
|
|
143
|
+
* and use the appropriate parameter.
|
|
144
|
+
*/
|
|
145
|
+
translateRequest(request) {
|
|
146
|
+
const messages = this.translateMessages(request.messages);
|
|
147
|
+
const tools = request.tools ? this.translateTools(request.tools) : undefined;
|
|
148
|
+
// Newer models require max_completion_tokens instead of max_tokens
|
|
149
|
+
const usesNewTokenParam = this.modelRequiresMaxCompletionTokens(request.model);
|
|
150
|
+
const result = {
|
|
151
|
+
model: request.model,
|
|
152
|
+
messages,
|
|
153
|
+
temperature: request.temperature,
|
|
154
|
+
tools: tools && tools.length > 0 ? tools : undefined,
|
|
155
|
+
stream: request.stream,
|
|
156
|
+
};
|
|
157
|
+
// Add the appropriate token limit parameter
|
|
158
|
+
if (request.max_tokens !== undefined) {
|
|
159
|
+
if (usesNewTokenParam) {
|
|
160
|
+
result.max_completion_tokens = request.max_tokens;
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
result.max_tokens = request.max_tokens;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return result;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Check if we're using the actual OpenAI API (not a compatible third-party API).
|
|
170
|
+
* Third-party OpenAI-compatible APIs (Z.AI, DeepSeek, local LLMs, etc.) typically
|
|
171
|
+
* use the standard max_tokens parameter, not max_completion_tokens.
|
|
172
|
+
*/
|
|
173
|
+
isActualOpenAIAPI() {
|
|
174
|
+
const baseUrl = this.getBaseUrl(OpenAIProvider.DEFAULT_BASE_URL);
|
|
175
|
+
// Check if the base URL is OpenAI's official API
|
|
176
|
+
return baseUrl.startsWith('https://api.openai.com');
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Check if a model requires max_completion_tokens instead of max_tokens.
|
|
180
|
+
* Newer OpenAI models (gpt-4o, gpt-4-turbo, gpt-5.x, o1, o3, etc.) use the new parameter.
|
|
181
|
+
*
|
|
182
|
+
* IMPORTANT: This only applies to the actual OpenAI API. Third-party OpenAI-compatible
|
|
183
|
+
* APIs (Z.AI, DeepSeek, Ollama, etc.) use the standard max_tokens parameter.
|
|
184
|
+
*/
|
|
185
|
+
modelRequiresMaxCompletionTokens(model) {
|
|
186
|
+
// If we're not talking to the actual OpenAI API, always use max_tokens
|
|
187
|
+
if (!this.isActualOpenAIAPI()) {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
const lowerModel = model.toLowerCase();
|
|
191
|
+
// Legacy models that use max_tokens (the old parameter)
|
|
192
|
+
const legacyModels = [
|
|
193
|
+
'gpt-3.5',
|
|
194
|
+
'gpt-4-0314',
|
|
195
|
+
'gpt-4-0613',
|
|
196
|
+
'gpt-4-32k',
|
|
197
|
+
];
|
|
198
|
+
// If it's a known legacy model, use old parameter
|
|
199
|
+
if (legacyModels.some(m => lowerModel.includes(m))) {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
// For all other models (gpt-4o, gpt-4-turbo, gpt-5.x, o1, o3, etc.), use new parameter
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Translate messages from Foundation format to OpenAI format.
|
|
207
|
+
*
|
|
208
|
+
* Key translations:
|
|
209
|
+
* - Content blocks are flattened to strings
|
|
210
|
+
* - tool_use blocks become tool_calls array on assistant messages
|
|
211
|
+
* - tool_result blocks become separate role: "tool" messages
|
|
212
|
+
*/
|
|
213
|
+
translateMessages(messages) {
|
|
214
|
+
const openAIMessages = [];
|
|
215
|
+
for (const message of messages) {
|
|
216
|
+
if (typeof message.content === 'string') {
|
|
217
|
+
// Simple string content
|
|
218
|
+
openAIMessages.push({
|
|
219
|
+
role: message.role,
|
|
220
|
+
content: message.content,
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
// Content blocks - need to process differently based on type
|
|
225
|
+
const textParts = [];
|
|
226
|
+
const toolCalls = [];
|
|
227
|
+
const toolResults = [];
|
|
228
|
+
for (const block of message.content) {
|
|
229
|
+
switch (block.type) {
|
|
230
|
+
case 'text':
|
|
231
|
+
if (block.text) {
|
|
232
|
+
textParts.push(block.text);
|
|
233
|
+
}
|
|
234
|
+
break;
|
|
235
|
+
case 'tool_use':
|
|
236
|
+
if (block.id && block.name) {
|
|
237
|
+
toolCalls.push({
|
|
238
|
+
id: block.id,
|
|
239
|
+
type: 'function',
|
|
240
|
+
function: {
|
|
241
|
+
name: block.name,
|
|
242
|
+
arguments: JSON.stringify(block.input || {}),
|
|
243
|
+
},
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
break;
|
|
247
|
+
case 'tool_result':
|
|
248
|
+
if (block.tool_use_id && block.content) {
|
|
249
|
+
toolResults.push({
|
|
250
|
+
tool_call_id: block.tool_use_id,
|
|
251
|
+
content: block.content,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
break;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
// Handle assistant messages with tool calls
|
|
258
|
+
if (message.role === 'assistant') {
|
|
259
|
+
const assistantMessage = {
|
|
260
|
+
role: 'assistant',
|
|
261
|
+
content: textParts.length > 0 ? textParts.join('\n') : null,
|
|
262
|
+
};
|
|
263
|
+
if (toolCalls.length > 0) {
|
|
264
|
+
assistantMessage.tool_calls = toolCalls;
|
|
265
|
+
}
|
|
266
|
+
openAIMessages.push(assistantMessage);
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
// User messages
|
|
270
|
+
if (textParts.length > 0) {
|
|
271
|
+
openAIMessages.push({
|
|
272
|
+
role: 'user',
|
|
273
|
+
content: textParts.join('\n'),
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
// Add tool results as separate messages
|
|
277
|
+
for (const result of toolResults) {
|
|
278
|
+
openAIMessages.push({
|
|
279
|
+
role: 'tool',
|
|
280
|
+
content: result.content,
|
|
281
|
+
tool_call_id: result.tool_call_id,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return openAIMessages;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Translate tools from Foundation format to OpenAI format.
|
|
291
|
+
*/
|
|
292
|
+
translateTools(tools) {
|
|
293
|
+
return tools.map((tool) => ({
|
|
294
|
+
type: 'function',
|
|
295
|
+
function: {
|
|
296
|
+
name: tool.name,
|
|
297
|
+
description: tool.description,
|
|
298
|
+
parameters: tool.input_schema,
|
|
299
|
+
},
|
|
300
|
+
}));
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Translate OpenAI response to Foundation format.
|
|
304
|
+
*/
|
|
305
|
+
translateResponse(response) {
|
|
306
|
+
const choice = response.choices[0];
|
|
307
|
+
if (!choice) {
|
|
308
|
+
throw new Error('No choices in OpenAI response');
|
|
309
|
+
}
|
|
310
|
+
const content = [];
|
|
311
|
+
// Add text content if present
|
|
312
|
+
if (choice.message.content) {
|
|
313
|
+
content.push({
|
|
314
|
+
type: 'text',
|
|
315
|
+
text: choice.message.content,
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
// Add tool calls if present
|
|
319
|
+
if (choice.message.tool_calls) {
|
|
320
|
+
for (const toolCall of choice.message.tool_calls) {
|
|
321
|
+
content.push({
|
|
322
|
+
type: 'tool_use',
|
|
323
|
+
id: toolCall.id,
|
|
324
|
+
name: toolCall.function.name,
|
|
325
|
+
input: JSON.parse(toolCall.function.arguments),
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
// Map finish_reason to stop_reason
|
|
330
|
+
let stopReason = 'end_turn';
|
|
331
|
+
switch (choice.finish_reason) {
|
|
332
|
+
case 'stop':
|
|
333
|
+
stopReason = 'end_turn';
|
|
334
|
+
break;
|
|
335
|
+
case 'length':
|
|
336
|
+
stopReason = 'max_tokens';
|
|
337
|
+
break;
|
|
338
|
+
case 'tool_calls':
|
|
339
|
+
stopReason = 'tool_use';
|
|
340
|
+
break;
|
|
341
|
+
case 'content_filter':
|
|
342
|
+
stopReason = 'content_filter';
|
|
343
|
+
break;
|
|
344
|
+
}
|
|
345
|
+
const result = {
|
|
346
|
+
id: response.id,
|
|
347
|
+
content,
|
|
348
|
+
model: response.model,
|
|
349
|
+
stop_reason: stopReason,
|
|
350
|
+
};
|
|
351
|
+
if (response.usage) {
|
|
352
|
+
result.usage = {
|
|
353
|
+
input_tokens: response.usage.prompt_tokens,
|
|
354
|
+
output_tokens: response.usage.completion_tokens,
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
return result;
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Translate OpenAI streaming chunk to Foundation StreamChunk format.
|
|
361
|
+
*
|
|
362
|
+
* OpenAI streams deltas that need to be accumulated for tool calls.
|
|
363
|
+
* Text content can be yielded immediately.
|
|
364
|
+
*/
|
|
365
|
+
translateStreamChunk(chunk, toolCallsInProgress, hasStartedContent) {
|
|
366
|
+
const chunks = [];
|
|
367
|
+
const choice = chunk.choices[0];
|
|
368
|
+
if (!choice) {
|
|
369
|
+
return chunks;
|
|
370
|
+
}
|
|
371
|
+
const delta = choice.delta;
|
|
372
|
+
// Handle text content
|
|
373
|
+
if (delta.content !== undefined && delta.content !== null) {
|
|
374
|
+
// Emit content_block_start if this is the first content
|
|
375
|
+
if (!hasStartedContent) {
|
|
376
|
+
chunks.push({
|
|
377
|
+
type: 'content_block_start',
|
|
378
|
+
index: 0,
|
|
379
|
+
content_block: {
|
|
380
|
+
type: 'text',
|
|
381
|
+
text: '',
|
|
382
|
+
},
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
// Emit content delta
|
|
386
|
+
chunks.push({
|
|
387
|
+
type: 'content_block_delta',
|
|
388
|
+
index: 0,
|
|
389
|
+
delta: {
|
|
390
|
+
type: 'text_delta',
|
|
391
|
+
text: delta.content,
|
|
392
|
+
},
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
// Handle tool calls
|
|
396
|
+
if (delta.tool_calls) {
|
|
397
|
+
for (const toolCallDelta of delta.tool_calls) {
|
|
398
|
+
const index = toolCallDelta.index;
|
|
399
|
+
// Initialize tool call tracking if new
|
|
400
|
+
if (!toolCallsInProgress.has(index)) {
|
|
401
|
+
toolCallsInProgress.set(index, {
|
|
402
|
+
id: toolCallDelta.id || '',
|
|
403
|
+
name: toolCallDelta.function?.name || '',
|
|
404
|
+
arguments: '',
|
|
405
|
+
});
|
|
406
|
+
// Emit content_block_start for tool use
|
|
407
|
+
if (toolCallDelta.id && toolCallDelta.function?.name) {
|
|
408
|
+
chunks.push({
|
|
409
|
+
type: 'content_block_start',
|
|
410
|
+
index: index + 1, // Offset by 1 since text is at index 0
|
|
411
|
+
content_block: {
|
|
412
|
+
type: 'tool_use',
|
|
413
|
+
id: toolCallDelta.id,
|
|
414
|
+
name: toolCallDelta.function.name,
|
|
415
|
+
input: {},
|
|
416
|
+
},
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
// Update tool call data
|
|
421
|
+
const toolCall = toolCallsInProgress.get(index);
|
|
422
|
+
if (toolCallDelta.id) {
|
|
423
|
+
toolCall.id = toolCallDelta.id;
|
|
424
|
+
}
|
|
425
|
+
if (toolCallDelta.function?.name) {
|
|
426
|
+
toolCall.name = toolCallDelta.function.name;
|
|
427
|
+
}
|
|
428
|
+
if (toolCallDelta.function?.arguments) {
|
|
429
|
+
toolCall.arguments += toolCallDelta.function.arguments;
|
|
430
|
+
// Emit delta for argument chunks
|
|
431
|
+
chunks.push({
|
|
432
|
+
type: 'content_block_delta',
|
|
433
|
+
index: index + 1,
|
|
434
|
+
delta: {
|
|
435
|
+
type: 'input_json_delta',
|
|
436
|
+
text: toolCallDelta.function.arguments,
|
|
437
|
+
},
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
return chunks;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenRouter Provider Implementation
|
|
3
|
+
*
|
|
4
|
+
* OpenRouter provides a unified gateway to 300+ AI models via a single API.
|
|
5
|
+
* It uses an OpenAI-compatible API format.
|
|
6
|
+
* This provider extends OpenAIProvider with the correct name identifier.
|
|
7
|
+
*/
|
|
8
|
+
import { OpenAIProvider } from './openai.js';
|
|
9
|
+
import type { ProviderConfig } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* OpenRouter API provider adapter.
|
|
12
|
+
*
|
|
13
|
+
* Uses OpenAI-compatible API format with OpenRouter endpoints.
|
|
14
|
+
* Provides access to 300+ models via a single API.
|
|
15
|
+
*
|
|
16
|
+
* Default base URL: https://openrouter.ai/api/v1
|
|
17
|
+
* Default model: openrouter/auto (automatically selects best model)
|
|
18
|
+
*/
|
|
19
|
+
export declare class OpenRouterProvider extends OpenAIProvider {
|
|
20
|
+
readonly name = "openrouter";
|
|
21
|
+
constructor(config: ProviderConfig);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=openrouter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openrouter.d.ts","sourceRoot":"","sources":["../../src/providers/openrouter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKjD;;;;;;;;GAQG;AACH,qBAAa,kBAAmB,SAAQ,cAAc;IACpD,SAAyB,IAAI,gBAAgB;gBAEjC,MAAM,EAAE,cAAc;CAQnC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenRouter Provider Implementation
|
|
3
|
+
*
|
|
4
|
+
* OpenRouter provides a unified gateway to 300+ AI models via a single API.
|
|
5
|
+
* It uses an OpenAI-compatible API format.
|
|
6
|
+
* This provider extends OpenAIProvider with the correct name identifier.
|
|
7
|
+
*/
|
|
8
|
+
import { OpenAIProvider } from './openai.js';
|
|
9
|
+
// Default base URL for OpenRouter API
|
|
10
|
+
const OPENROUTER_BASE_URL = 'https://openrouter.ai/api/v1';
|
|
11
|
+
/**
|
|
12
|
+
* OpenRouter API provider adapter.
|
|
13
|
+
*
|
|
14
|
+
* Uses OpenAI-compatible API format with OpenRouter endpoints.
|
|
15
|
+
* Provides access to 300+ models via a single API.
|
|
16
|
+
*
|
|
17
|
+
* Default base URL: https://openrouter.ai/api/v1
|
|
18
|
+
* Default model: openrouter/auto (automatically selects best model)
|
|
19
|
+
*/
|
|
20
|
+
export class OpenRouterProvider extends OpenAIProvider {
|
|
21
|
+
name = 'openrouter';
|
|
22
|
+
constructor(config) {
|
|
23
|
+
// Ensure base_url defaults to OpenRouter endpoint if not specified
|
|
24
|
+
const configWithDefaults = {
|
|
25
|
+
...config,
|
|
26
|
+
base_url: config.base_url ?? OPENROUTER_BASE_URL,
|
|
27
|
+
};
|
|
28
|
+
super(configWithDefaults);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=openrouter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../src/providers/openrouter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,sCAAsC;AACtC,MAAM,mBAAmB,GAAG,8BAA8B,CAAC;AAE3D;;;;;;;;GAQG;AACH,MAAM,OAAO,kBAAmB,SAAQ,cAAc;IAC3B,IAAI,GAAG,YAAY,CAAC;IAE7C,YAAY,MAAsB;QAChC,mEAAmE;QACnE,MAAM,kBAAkB,GAAmB;YACzC,GAAG,MAAM;YACT,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,mBAAmB;SACjD,CAAC;QACF,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC5B,CAAC;CACF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Perplexity Provider Implementation
|
|
3
|
+
*
|
|
4
|
+
* Perplexity uses an OpenAI-compatible API format.
|
|
5
|
+
* This provider extends OpenAIProvider with the correct name identifier.
|
|
6
|
+
*
|
|
7
|
+
* NOTE: Perplexity does NOT have a /models endpoint, so health check uses chat completion.
|
|
8
|
+
*/
|
|
9
|
+
import { OpenAIProvider } from './openai.js';
|
|
10
|
+
import type { ProviderConfig } from './types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Perplexity API provider adapter.
|
|
13
|
+
*
|
|
14
|
+
* Uses OpenAI-compatible API format with Perplexity endpoints.
|
|
15
|
+
* Provides web search grounded responses with citations.
|
|
16
|
+
*
|
|
17
|
+
* Default base URL: https://api.perplexity.ai
|
|
18
|
+
* Available models: sonar-deep-research, sonar-reasoning-pro, sonar-reasoning, sonar-pro, sonar, r1-1776
|
|
19
|
+
*/
|
|
20
|
+
export declare class PerplexityProvider extends OpenAIProvider {
|
|
21
|
+
readonly name = "perplexity";
|
|
22
|
+
constructor(config: ProviderConfig);
|
|
23
|
+
/**
|
|
24
|
+
* Check if the provider is available and configured correctly.
|
|
25
|
+
* Perplexity does NOT have a /models endpoint, so we use a minimal chat completion test.
|
|
26
|
+
*/
|
|
27
|
+
healthCheck(): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Get the base URL for API requests.
|
|
30
|
+
* Exposed as protected method for use in healthCheck.
|
|
31
|
+
*/
|
|
32
|
+
protected getBaseUrl(defaultUrl: string): string;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=perplexity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perplexity.d.ts","sourceRoot":"","sources":["../../src/providers/perplexity.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKjD;;;;;;;;GAQG;AACH,qBAAa,kBAAmB,SAAQ,cAAc;IACpD,SAAyB,IAAI,gBAAgB;gBAEjC,MAAM,EAAE,cAAc;IASlC;;;OAGG;IACmB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBlD;;;OAGG;cACgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;CAG1D"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Perplexity Provider Implementation
|
|
3
|
+
*
|
|
4
|
+
* Perplexity uses an OpenAI-compatible API format.
|
|
5
|
+
* This provider extends OpenAIProvider with the correct name identifier.
|
|
6
|
+
*
|
|
7
|
+
* NOTE: Perplexity does NOT have a /models endpoint, so health check uses chat completion.
|
|
8
|
+
*/
|
|
9
|
+
import { OpenAIProvider } from './openai.js';
|
|
10
|
+
// Default base URL for Perplexity API
|
|
11
|
+
const PERPLEXITY_BASE_URL = 'https://api.perplexity.ai';
|
|
12
|
+
/**
|
|
13
|
+
* Perplexity API provider adapter.
|
|
14
|
+
*
|
|
15
|
+
* Uses OpenAI-compatible API format with Perplexity endpoints.
|
|
16
|
+
* Provides web search grounded responses with citations.
|
|
17
|
+
*
|
|
18
|
+
* Default base URL: https://api.perplexity.ai
|
|
19
|
+
* Available models: sonar-deep-research, sonar-reasoning-pro, sonar-reasoning, sonar-pro, sonar, r1-1776
|
|
20
|
+
*/
|
|
21
|
+
export class PerplexityProvider extends OpenAIProvider {
|
|
22
|
+
name = 'perplexity';
|
|
23
|
+
constructor(config) {
|
|
24
|
+
// Ensure base_url defaults to Perplexity endpoint if not specified
|
|
25
|
+
const configWithDefaults = {
|
|
26
|
+
...config,
|
|
27
|
+
base_url: config.base_url ?? PERPLEXITY_BASE_URL,
|
|
28
|
+
};
|
|
29
|
+
super(configWithDefaults);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Check if the provider is available and configured correctly.
|
|
33
|
+
* Perplexity does NOT have a /models endpoint, so we use a minimal chat completion test.
|
|
34
|
+
*/
|
|
35
|
+
async healthCheck() {
|
|
36
|
+
// Use a minimal chat completion to test the connection
|
|
37
|
+
const url = `${this.getBaseUrl(PERPLEXITY_BASE_URL)}/chat/completions`;
|
|
38
|
+
await this.makeRequest({
|
|
39
|
+
method: 'POST',
|
|
40
|
+
url,
|
|
41
|
+
headers: this.buildHeaders(),
|
|
42
|
+
body: {
|
|
43
|
+
model: 'sonar',
|
|
44
|
+
messages: [{ role: 'user', content: 'Hi' }],
|
|
45
|
+
max_tokens: 1,
|
|
46
|
+
},
|
|
47
|
+
timeoutMs: 15000,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get the base URL for API requests.
|
|
52
|
+
* Exposed as protected method for use in healthCheck.
|
|
53
|
+
*/
|
|
54
|
+
getBaseUrl(defaultUrl) {
|
|
55
|
+
return this.config.base_url || defaultUrl;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=perplexity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perplexity.js","sourceRoot":"","sources":["../../src/providers/perplexity.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,sCAAsC;AACtC,MAAM,mBAAmB,GAAG,2BAA2B,CAAC;AAExD;;;;;;;;GAQG;AACH,MAAM,OAAO,kBAAmB,SAAQ,cAAc;IAC3B,IAAI,GAAG,YAAY,CAAC;IAE7C,YAAY,MAAsB;QAChC,mEAAmE;QACnE,MAAM,kBAAkB,GAAmB;YACzC,GAAG,MAAM;YACT,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,mBAAmB;SACjD,CAAC;QACF,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACa,KAAK,CAAC,WAAW;QAC/B,uDAAuD;QACvD,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,mBAAmB,CAAC;QAEvE,MAAM,IAAI,CAAC,WAAW,CAAiB;YACrC,MAAM,EAAE,MAAM;YACd,GAAG;YACH,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE;YAC5B,IAAI,EAAE;gBACJ,KAAK,EAAE,OAAO;gBACd,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;gBAC3C,UAAU,EAAE,CAAC;aACd;YACD,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACgB,UAAU,CAAC,UAAkB;QAC9C,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,UAAU,CAAC;IAC5C,CAAC;CACF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Together AI Provider Implementation
|
|
3
|
+
*
|
|
4
|
+
* Together AI provides access to 200+ open models with sub-100ms latency.
|
|
5
|
+
* It uses an OpenAI-compatible API format.
|
|
6
|
+
* This provider extends OpenAIProvider with the correct name identifier.
|
|
7
|
+
*/
|
|
8
|
+
import { OpenAIProvider } from './openai.js';
|
|
9
|
+
import type { ProviderConfig } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Together AI API provider adapter.
|
|
12
|
+
*
|
|
13
|
+
* Uses OpenAI-compatible API format with Together AI endpoints.
|
|
14
|
+
* Provides access to 200+ open models with sub-100ms latency.
|
|
15
|
+
*
|
|
16
|
+
* Default base URL: https://api.together.xyz/v1
|
|
17
|
+
* Available models: meta-llama/Llama-3.3-70B-Instruct-Turbo, deepseek-ai/DeepSeek-V3, Qwen/Qwen2.5-72B-Instruct-Turbo
|
|
18
|
+
*/
|
|
19
|
+
export declare class TogetherProvider extends OpenAIProvider {
|
|
20
|
+
readonly name = "together";
|
|
21
|
+
constructor(config: ProviderConfig);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=together.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"together.d.ts","sourceRoot":"","sources":["../../src/providers/together.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKjD;;;;;;;;GAQG;AACH,qBAAa,gBAAiB,SAAQ,cAAc;IAClD,SAAyB,IAAI,cAAc;gBAE/B,MAAM,EAAE,cAAc;CAQnC"}
|