@alexnetrebskii/hive-agent 2.40.0 → 2.42.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/README.md +17 -1
- package/dist/providers/llm/openai.d.ts +46 -1
- package/dist/providers/llm/openai.d.ts.map +1 -1
- package/dist/providers/llm/openai.js +159 -21
- package/dist/providers/llm/openai.js.map +1 -1
- package/dist/providers/llm/openai.test.d.ts +2 -0
- package/dist/providers/llm/openai.test.d.ts.map +1 -0
- package/dist/providers/llm/openai.test.js +507 -0
- package/dist/providers/llm/openai.test.js.map +1 -0
- package/dist/tools/tasks.d.ts.map +1 -1
- package/dist/tools/tasks.js +46 -8
- package/dist/tools/tasks.js.map +1 -1
- package/dist/trace/pricing.d.ts.map +1 -1
- package/dist/trace/pricing.js +9 -0
- package/dist/trace/pricing.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -56,7 +56,7 @@ Tuplet gives you exactly that. A powerful, multi-agent framework you plug into y
|
|
|
56
56
|
### Multi-Provider
|
|
57
57
|
|
|
58
58
|
- **Claude** (Anthropic) — First-class support with caching and extended thinking
|
|
59
|
-
- **OpenAI** — GPT-4o and other models
|
|
59
|
+
- **OpenAI** — GPT-4o and other models, plus one-call presets for OpenAI-compatible vendors (Groq, Together, Fireworks, DeepSeek, xAI, Ollama)
|
|
60
60
|
- **OpenRouter** — Access to 100+ models via [openrouter.ai](https://openrouter.ai), with optimized prompts so non-Claude models use built-in tools effectively
|
|
61
61
|
- **Custom providers** — Implement the `LLMProvider` interface to use any AI model
|
|
62
62
|
|
|
@@ -124,6 +124,22 @@ const result = await agent.run('Hello!')
|
|
|
124
124
|
console.log(result.response)
|
|
125
125
|
```
|
|
126
126
|
|
|
127
|
+
### Using OpenAI-compatible providers
|
|
128
|
+
|
|
129
|
+
`OpenAIProvider` works with OpenAI directly and with any OpenAI-compatible vendor — Groq, Together, Fireworks, DeepSeek, xAI — via static presets that fill in `baseURL`, the env-var fallback, and a default model:
|
|
130
|
+
|
|
131
|
+
```typescript
|
|
132
|
+
import { Tuplet, OpenAIProvider } from 'tuplet'
|
|
133
|
+
|
|
134
|
+
const agent = new Tuplet({
|
|
135
|
+
role: 'a helpful assistant',
|
|
136
|
+
tools: [myTool],
|
|
137
|
+
llm: OpenAIProvider.groq({ model: 'llama-3.3-70b-versatile' }) // reads GROQ_API_KEY
|
|
138
|
+
})
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
For other compatible vendors pass `baseURL` and `vendor` directly. See [Providers](./docs/providers.md) for the full list.
|
|
142
|
+
|
|
127
143
|
## Examples
|
|
128
144
|
|
|
129
145
|
- [**Coder**](https://github.com/anetrebskii/tuplet/tree/main/examples/coder) — AI software developer that creates projects from scratch using built-in shell, workspace, planning, and task tracking. Zero custom tools.
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* OpenAI LLM Provider
|
|
3
3
|
*
|
|
4
|
-
* Implementation of LLMProvider for OpenAI's API
|
|
4
|
+
* Implementation of LLMProvider for OpenAI's chat-completions API and any
|
|
5
|
+
* OpenAI-compatible vendor (Groq, Together, Fireworks, DeepSeek, xAI, etc.).
|
|
6
|
+
* Vendor presets at the bottom of the file fill in the right `baseURL`,
|
|
7
|
+
* env-var fallback, and `vendor` namespace for cost / trace attribution.
|
|
5
8
|
*/
|
|
6
9
|
import type { LLMProvider, LLMResponse, LLMOptions, Message, ToolSchema } from '../../types.js';
|
|
7
10
|
export interface OpenAIProviderConfig {
|
|
@@ -9,6 +12,23 @@ export interface OpenAIProviderConfig {
|
|
|
9
12
|
model?: string;
|
|
10
13
|
maxTokens?: number;
|
|
11
14
|
baseURL?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Namespace returned by `getModelId()` (e.g. `groq`, `deepseek`, `xai`).
|
|
17
|
+
* Default `openai`. Cost-pricing tables and trace events key off this.
|
|
18
|
+
*/
|
|
19
|
+
vendor?: string;
|
|
20
|
+
/**
|
|
21
|
+
* Strip reasoning-channel artifacts (`<|channel|>` markers, leading
|
|
22
|
+
* `thought\n` / `analysis\n` preambles) from `text` content blocks.
|
|
23
|
+
* Default `true`. Set to `false` to render the reasoning stream yourself.
|
|
24
|
+
*/
|
|
25
|
+
stripReasoning?: boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Extra headers merged into every request — for vendors that require a
|
|
28
|
+
* custom header (e.g. Anthropic-style versioning, Together's
|
|
29
|
+
* `HTTP-Referer`, etc.).
|
|
30
|
+
*/
|
|
31
|
+
defaultHeaders?: Record<string, string>;
|
|
12
32
|
}
|
|
13
33
|
export declare class OpenAIProvider implements LLMProvider {
|
|
14
34
|
readonly supportsNativeTools = true;
|
|
@@ -16,6 +36,9 @@ export declare class OpenAIProvider implements LLMProvider {
|
|
|
16
36
|
private model;
|
|
17
37
|
private maxTokens;
|
|
18
38
|
private baseURL;
|
|
39
|
+
private vendor;
|
|
40
|
+
private stripReasoning;
|
|
41
|
+
private defaultHeaders;
|
|
19
42
|
constructor(config?: OpenAIProviderConfig);
|
|
20
43
|
chat(systemPrompt: string, messages: Message[], tools: ToolSchema[], options?: LLMOptions): Promise<LLMResponse>;
|
|
21
44
|
private convertMessages;
|
|
@@ -23,5 +46,27 @@ export declare class OpenAIProvider implements LLMProvider {
|
|
|
23
46
|
private convertTools;
|
|
24
47
|
private convertResponse;
|
|
25
48
|
getModelId(): string;
|
|
49
|
+
static groq(config?: OpenAIProviderConfig): OpenAIProvider;
|
|
50
|
+
static together(config?: OpenAIProviderConfig): OpenAIProvider;
|
|
51
|
+
static fireworks(config?: OpenAIProviderConfig): OpenAIProvider;
|
|
52
|
+
static deepseek(config?: OpenAIProviderConfig): OpenAIProvider;
|
|
53
|
+
static xai(config?: OpenAIProviderConfig): OpenAIProvider;
|
|
54
|
+
/**
|
|
55
|
+
* Google Gemini exposes an OpenAI-compatible endpoint. Model names match the
|
|
56
|
+
* `google:` cost-pricing keys (`gemini-2.5-flash`, `gemini-2.5-pro`, ...).
|
|
57
|
+
*/
|
|
58
|
+
static google(config?: OpenAIProviderConfig): OpenAIProvider;
|
|
59
|
+
/**
|
|
60
|
+
* Ollama exposes an OpenAI-compatible endpoint at `<host>/v1/chat/completions`.
|
|
61
|
+
* Auth is unused — Ollama ignores the bearer token but the OpenAI client
|
|
62
|
+
* requires a non-empty Authorization header, so we stub one.
|
|
63
|
+
*
|
|
64
|
+
* `OLLAMA_HOST` (Ollama's standard env var) is honored and gets `/v1`
|
|
65
|
+
* appended. `model` is required — Ollama users pick whatever they pulled
|
|
66
|
+
* (`llama3.2`, `qwen2.5`, `gpt-oss:20b`, ...) and there's no universal default.
|
|
67
|
+
*/
|
|
68
|
+
static ollama(config: OpenAIProviderConfig & {
|
|
69
|
+
model: string;
|
|
70
|
+
}): OpenAIProvider;
|
|
26
71
|
}
|
|
27
72
|
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/providers/llm/openai.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/providers/llm/openai.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,UAAU,EACV,OAAO,EACP,UAAU,EAIX,MAAM,gBAAgB,CAAA;AAIvB,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACxC;AAgDD,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,mBAAmB,QAAO;IACnC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,cAAc,CAAwB;gBAElC,MAAM,GAAE,oBAAyB;IAcvC,IAAI,CACR,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,UAAU,EAAE,EACnB,OAAO,GAAE,UAAe,GACvB,OAAO,CAAC,WAAW,CAAC;IAmEvB,OAAO,CAAC,eAAe;IAoBvB,OAAO,CAAC,4BAA4B;IA8DpC,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,eAAe;IA0DvB,UAAU,IAAI,MAAM;IAQpB,MAAM,CAAC,IAAI,CAAC,MAAM,GAAE,oBAAyB,GAAG,cAAc;IAU9D,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAE,oBAAyB,GAAG,cAAc;IAUlE,MAAM,CAAC,SAAS,CAAC,MAAM,GAAE,oBAAyB,GAAG,cAAc;IAUnE,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAE,oBAAyB,GAAG,cAAc;IAUlE,MAAM,CAAC,GAAG,CAAC,MAAM,GAAE,oBAAyB,GAAG,cAAc;IAU7D;;;OAGG;IACH,MAAM,CAAC,MAAM,CAAC,MAAM,GAAE,oBAAyB,GAAG,cAAc;IAUhE;;;;;;;;OAQG;IACH,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,cAAc;CAQhF"}
|
|
@@ -1,21 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* OpenAI LLM Provider
|
|
3
3
|
*
|
|
4
|
-
* Implementation of LLMProvider for OpenAI's API
|
|
4
|
+
* Implementation of LLMProvider for OpenAI's chat-completions API and any
|
|
5
|
+
* OpenAI-compatible vendor (Groq, Together, Fireworks, DeepSeek, xAI, etc.).
|
|
6
|
+
* Vendor presets at the bottom of the file fill in the right `baseURL`,
|
|
7
|
+
* env-var fallback, and `vendor` namespace for cost / trace attribution.
|
|
5
8
|
*/
|
|
9
|
+
import { defaultSanitize } from '../../sanitize.js';
|
|
6
10
|
export class OpenAIProvider {
|
|
7
11
|
supportsNativeTools = true;
|
|
8
12
|
apiKey;
|
|
9
13
|
model;
|
|
10
14
|
maxTokens;
|
|
11
15
|
baseURL;
|
|
16
|
+
vendor;
|
|
17
|
+
stripReasoning;
|
|
18
|
+
defaultHeaders;
|
|
12
19
|
constructor(config = {}) {
|
|
13
20
|
this.apiKey = config.apiKey || process.env.OPENAI_API_KEY || '';
|
|
14
21
|
this.model = config.model || 'gpt-4o';
|
|
15
22
|
this.maxTokens = config.maxTokens || 4096;
|
|
16
23
|
this.baseURL = config.baseURL || 'https://api.openai.com/v1';
|
|
24
|
+
this.vendor = config.vendor || 'openai';
|
|
25
|
+
this.stripReasoning = config.stripReasoning !== false;
|
|
26
|
+
this.defaultHeaders = config.defaultHeaders ?? {};
|
|
17
27
|
if (!this.apiKey) {
|
|
18
|
-
throw new Error(
|
|
28
|
+
throw new Error(`${this.vendor} API key is required`);
|
|
19
29
|
}
|
|
20
30
|
}
|
|
21
31
|
async chat(systemPrompt, messages, tools, options = {}) {
|
|
@@ -29,19 +39,39 @@ export class OpenAIProvider {
|
|
|
29
39
|
if (openaiTools.length > 0) {
|
|
30
40
|
requestBody.tools = openaiTools;
|
|
31
41
|
}
|
|
42
|
+
if (options.temperature !== undefined) {
|
|
43
|
+
requestBody.temperature = options.temperature;
|
|
44
|
+
}
|
|
45
|
+
if (options.topP !== undefined) {
|
|
46
|
+
requestBody.top_p = options.topP;
|
|
47
|
+
}
|
|
48
|
+
if (options.stopSequences && options.stopSequences.length > 0) {
|
|
49
|
+
requestBody.stop = options.stopSequences;
|
|
50
|
+
}
|
|
32
51
|
const response = await fetch(`${this.baseURL}/chat/completions`, {
|
|
33
52
|
method: 'POST',
|
|
34
53
|
headers: {
|
|
35
54
|
'Content-Type': 'application/json',
|
|
36
|
-
'Authorization': `Bearer ${this.apiKey}
|
|
55
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
56
|
+
...this.defaultHeaders
|
|
37
57
|
},
|
|
38
58
|
body: JSON.stringify(requestBody)
|
|
39
59
|
});
|
|
60
|
+
const rawBody = await response.text();
|
|
61
|
+
const data = safeParseJson(rawBody);
|
|
40
62
|
if (!response.ok) {
|
|
41
|
-
const
|
|
42
|
-
throw new Error(
|
|
63
|
+
const upstream = data?.error?.message || response.statusText;
|
|
64
|
+
throw new Error(`${this.vendor} API error (HTTP ${response.status}): ${upstream}`);
|
|
65
|
+
}
|
|
66
|
+
if (!data) {
|
|
67
|
+
throw new Error(`${this.vendor} API error: response was not valid JSON — body: ${truncate(rawBody, 500)}`);
|
|
68
|
+
}
|
|
69
|
+
if (data.error) {
|
|
70
|
+
throw new Error(`${this.vendor} API error: ${data.error.message || 'provider returned an error'}`);
|
|
71
|
+
}
|
|
72
|
+
if (!data.choices?.[0]?.message) {
|
|
73
|
+
throw new Error(`${this.vendor} API error: empty response (no choices returned) — body: ${truncate(rawBody, 500)}`);
|
|
43
74
|
}
|
|
44
|
-
const data = await response.json();
|
|
45
75
|
return this.convertResponse(data);
|
|
46
76
|
}
|
|
47
77
|
convertMessages(systemPrompt, messages) {
|
|
@@ -56,7 +86,6 @@ export class OpenAIProvider {
|
|
|
56
86
|
});
|
|
57
87
|
}
|
|
58
88
|
else {
|
|
59
|
-
// Handle content blocks
|
|
60
89
|
const converted = this.convertContentBlocksToOpenAI(msg.content, msg.role);
|
|
61
90
|
result.push(...converted);
|
|
62
91
|
}
|
|
@@ -65,10 +94,8 @@ export class OpenAIProvider {
|
|
|
65
94
|
}
|
|
66
95
|
convertContentBlocksToOpenAI(blocks, role) {
|
|
67
96
|
const messages = [];
|
|
68
|
-
// Separate tool results from other content
|
|
69
97
|
const toolResults = blocks.filter(b => b.type === 'tool_result');
|
|
70
98
|
const otherBlocks = blocks.filter(b => b.type !== 'tool_result');
|
|
71
|
-
// Handle assistant messages with tool_use
|
|
72
99
|
if (role === 'assistant') {
|
|
73
100
|
const toolUseBlocks = otherBlocks.filter(b => b.type === 'tool_use');
|
|
74
101
|
const textBlocks = otherBlocks.filter(b => b.type === 'text');
|
|
@@ -98,7 +125,6 @@ export class OpenAIProvider {
|
|
|
98
125
|
});
|
|
99
126
|
}
|
|
100
127
|
}
|
|
101
|
-
// Handle tool results (these become separate 'tool' role messages)
|
|
102
128
|
for (const tr of toolResults) {
|
|
103
129
|
const toolResult = tr;
|
|
104
130
|
messages.push({
|
|
@@ -107,7 +133,6 @@ export class OpenAIProvider {
|
|
|
107
133
|
tool_call_id: toolResult.tool_use_id
|
|
108
134
|
});
|
|
109
135
|
}
|
|
110
|
-
// Handle user text messages
|
|
111
136
|
if (role === 'user' && toolResults.length === 0) {
|
|
112
137
|
const textBlocks = otherBlocks.filter(b => b.type === 'text');
|
|
113
138
|
const textContent = textBlocks.map(b => b.text).join('\n');
|
|
@@ -133,14 +158,14 @@ export class OpenAIProvider {
|
|
|
133
158
|
convertResponse(response) {
|
|
134
159
|
const choice = response.choices[0];
|
|
135
160
|
const content = [];
|
|
136
|
-
// Add text content if present
|
|
137
161
|
if (choice.message.content) {
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
162
|
+
const cleaned = this.stripReasoning
|
|
163
|
+
? defaultSanitize(choice.message.content)
|
|
164
|
+
: choice.message.content;
|
|
165
|
+
if (cleaned.length > 0) {
|
|
166
|
+
content.push({ type: 'text', text: cleaned });
|
|
167
|
+
}
|
|
142
168
|
}
|
|
143
|
-
// Convert tool calls
|
|
144
169
|
if (choice.message.tool_calls) {
|
|
145
170
|
for (const toolCall of choice.message.tool_calls) {
|
|
146
171
|
content.push({
|
|
@@ -151,7 +176,6 @@ export class OpenAIProvider {
|
|
|
151
176
|
});
|
|
152
177
|
}
|
|
153
178
|
}
|
|
154
|
-
// Determine stop reason
|
|
155
179
|
let stopReason = 'end_turn';
|
|
156
180
|
if (choice.finish_reason === 'tool_calls') {
|
|
157
181
|
stopReason = 'tool_use';
|
|
@@ -159,17 +183,131 @@ export class OpenAIProvider {
|
|
|
159
183
|
else if (choice.finish_reason === 'length') {
|
|
160
184
|
stopReason = 'max_tokens';
|
|
161
185
|
}
|
|
186
|
+
const details = response.usage.prompt_tokens_details;
|
|
187
|
+
const cachedRead = details?.cached_tokens || 0;
|
|
188
|
+
const cacheWrite = details?.cache_write_tokens || 0;
|
|
189
|
+
let cacheUsage;
|
|
190
|
+
if (cachedRead || cacheWrite) {
|
|
191
|
+
cacheUsage = {
|
|
192
|
+
cacheReadInputTokens: cachedRead,
|
|
193
|
+
cacheCreationInputTokens: cacheWrite
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
// Match OpenRouter's convention: inputTokens excludes cached tokens, so
|
|
197
|
+
// cost calculation prices cache reads at the cache-read rate instead of
|
|
198
|
+
// double-counting them at the regular input rate.
|
|
199
|
+
const inputTokens = response.usage.prompt_tokens - cachedRead - cacheWrite;
|
|
162
200
|
return {
|
|
163
201
|
content,
|
|
164
202
|
stopReason,
|
|
165
203
|
usage: {
|
|
166
|
-
inputTokens
|
|
204
|
+
inputTokens,
|
|
167
205
|
outputTokens: response.usage.completion_tokens
|
|
168
|
-
}
|
|
206
|
+
},
|
|
207
|
+
cacheUsage
|
|
169
208
|
};
|
|
170
209
|
}
|
|
171
210
|
getModelId() {
|
|
172
|
-
return
|
|
211
|
+
return `${this.vendor}:${this.model}`;
|
|
212
|
+
}
|
|
213
|
+
// ---------- Vendor presets ----------------------------------------------
|
|
214
|
+
// Thin factories that fill in baseURL + vendor namespace + env-var fallback
|
|
215
|
+
// so callers don't have to hand-type the right URL for each compatible vendor.
|
|
216
|
+
static groq(config = {}) {
|
|
217
|
+
return new OpenAIProvider({
|
|
218
|
+
...config,
|
|
219
|
+
apiKey: config.apiKey || process.env.GROQ_API_KEY,
|
|
220
|
+
baseURL: config.baseURL || 'https://api.groq.com/openai/v1',
|
|
221
|
+
vendor: config.vendor || 'groq',
|
|
222
|
+
model: config.model || 'llama-3.3-70b-versatile'
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
static together(config = {}) {
|
|
226
|
+
return new OpenAIProvider({
|
|
227
|
+
...config,
|
|
228
|
+
apiKey: config.apiKey || process.env.TOGETHER_API_KEY,
|
|
229
|
+
baseURL: config.baseURL || 'https://api.together.xyz/v1',
|
|
230
|
+
vendor: config.vendor || 'together',
|
|
231
|
+
model: config.model || 'meta-llama/Llama-3.3-70B-Instruct-Turbo'
|
|
232
|
+
});
|
|
173
233
|
}
|
|
234
|
+
static fireworks(config = {}) {
|
|
235
|
+
return new OpenAIProvider({
|
|
236
|
+
...config,
|
|
237
|
+
apiKey: config.apiKey || process.env.FIREWORKS_API_KEY,
|
|
238
|
+
baseURL: config.baseURL || 'https://api.fireworks.ai/inference/v1',
|
|
239
|
+
vendor: config.vendor || 'fireworks',
|
|
240
|
+
model: config.model || 'accounts/fireworks/models/llama-v3p3-70b-instruct'
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
static deepseek(config = {}) {
|
|
244
|
+
return new OpenAIProvider({
|
|
245
|
+
...config,
|
|
246
|
+
apiKey: config.apiKey || process.env.DEEPSEEK_API_KEY,
|
|
247
|
+
baseURL: config.baseURL || 'https://api.deepseek.com/v1',
|
|
248
|
+
vendor: config.vendor || 'deepseek',
|
|
249
|
+
model: config.model || 'deepseek-chat'
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
static xai(config = {}) {
|
|
253
|
+
return new OpenAIProvider({
|
|
254
|
+
...config,
|
|
255
|
+
apiKey: config.apiKey || process.env.XAI_API_KEY,
|
|
256
|
+
baseURL: config.baseURL || 'https://api.x.ai/v1',
|
|
257
|
+
vendor: config.vendor || 'xai',
|
|
258
|
+
model: config.model || 'grok-2'
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Google Gemini exposes an OpenAI-compatible endpoint. Model names match the
|
|
263
|
+
* `google:` cost-pricing keys (`gemini-2.5-flash`, `gemini-2.5-pro`, ...).
|
|
264
|
+
*/
|
|
265
|
+
static google(config = {}) {
|
|
266
|
+
return new OpenAIProvider({
|
|
267
|
+
...config,
|
|
268
|
+
apiKey: config.apiKey || process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY,
|
|
269
|
+
baseURL: config.baseURL || 'https://generativelanguage.googleapis.com/v1beta/openai',
|
|
270
|
+
vendor: config.vendor || 'google',
|
|
271
|
+
model: config.model || 'gemini-2.5-flash'
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Ollama exposes an OpenAI-compatible endpoint at `<host>/v1/chat/completions`.
|
|
276
|
+
* Auth is unused — Ollama ignores the bearer token but the OpenAI client
|
|
277
|
+
* requires a non-empty Authorization header, so we stub one.
|
|
278
|
+
*
|
|
279
|
+
* `OLLAMA_HOST` (Ollama's standard env var) is honored and gets `/v1`
|
|
280
|
+
* appended. `model` is required — Ollama users pick whatever they pulled
|
|
281
|
+
* (`llama3.2`, `qwen2.5`, `gpt-oss:20b`, ...) and there's no universal default.
|
|
282
|
+
*/
|
|
283
|
+
static ollama(config) {
|
|
284
|
+
return new OpenAIProvider({
|
|
285
|
+
...config,
|
|
286
|
+
apiKey: config.apiKey || 'ollama',
|
|
287
|
+
baseURL: config.baseURL || ollamaBaseURL(),
|
|
288
|
+
vendor: config.vendor || 'ollama'
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
function ollamaBaseURL() {
|
|
293
|
+
const host = process.env.OLLAMA_HOST;
|
|
294
|
+
if (!host)
|
|
295
|
+
return 'http://localhost:11434/v1';
|
|
296
|
+
// Strip trailing slash, append /v1 unless already present.
|
|
297
|
+
const trimmed = host.replace(/\/+$/, '');
|
|
298
|
+
return trimmed.endsWith('/v1') ? trimmed : `${trimmed}/v1`;
|
|
299
|
+
}
|
|
300
|
+
function safeParseJson(text) {
|
|
301
|
+
try {
|
|
302
|
+
return JSON.parse(text);
|
|
303
|
+
}
|
|
304
|
+
catch {
|
|
305
|
+
return null;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
function truncate(s, max) {
|
|
309
|
+
if (s.length <= max)
|
|
310
|
+
return s;
|
|
311
|
+
return `${s.slice(0, max)}…(+${s.length - max} chars)`;
|
|
174
312
|
}
|
|
175
313
|
//# sourceMappingURL=openai.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/providers/llm/openai.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/providers/llm/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.test.d.ts","sourceRoot":"","sources":["../../../src/providers/llm/openai.test.ts"],"names":[],"mappings":""}
|