@jxburros/ai-nugget 0.4.1 → 0.7.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 +158 -382
- package/UPGRADING.md +182 -0
- package/dist/adapters/engines/anthropic.d.ts +7 -1
- package/dist/adapters/engines/anthropic.js +82 -37
- package/dist/adapters/engines/base.d.ts +29 -2
- package/dist/adapters/engines/base.js +52 -8
- package/dist/adapters/engines/google.d.ts +7 -1
- package/dist/adapters/engines/google.js +80 -29
- package/dist/adapters/engines/ollama.d.ts +2 -1
- package/dist/adapters/engines/ollama.js +57 -15
- package/dist/adapters/engines/openaiChat.d.ts +8 -1
- package/dist/adapters/engines/openaiChat.js +109 -29
- package/dist/adapters/profiles.d.ts +21 -1
- package/dist/adapters/profiles.js +12 -2
- package/dist/agent/loop.d.ts +45 -1
- package/dist/agent/loop.js +117 -12
- package/dist/cjs/adapters/engines/anthropic.js +326 -0
- package/dist/cjs/adapters/engines/base.js +147 -0
- package/dist/cjs/adapters/engines/google.js +291 -0
- package/dist/cjs/adapters/engines/ollama.js +205 -0
- package/dist/cjs/adapters/engines/openaiChat.js +312 -0
- package/dist/cjs/adapters/index.js +22 -0
- package/dist/cjs/adapters/profiles.js +125 -0
- package/dist/cjs/agent/index.js +18 -0
- package/dist/cjs/agent/loop.js +373 -0
- package/dist/cjs/agent/tools.js +51 -0
- package/dist/cjs/connect.js +27 -0
- package/dist/cjs/errors.js +110 -0
- package/dist/cjs/handler.js +586 -0
- package/dist/cjs/index.js +28 -0
- package/dist/cjs/json.js +121 -0
- package/dist/cjs/keys.js +81 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/policy.js +42 -0
- package/dist/cjs/reasoning.js +159 -0
- package/dist/cjs/redact.js +78 -0
- package/dist/cjs/tokens.js +22 -0
- package/dist/cjs/transport.js +172 -0
- package/dist/cjs/types.js +6 -0
- package/dist/cjs/util.js +126 -0
- package/dist/errors.js +25 -1
- package/dist/handler.d.ts +67 -1
- package/dist/handler.js +266 -61
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/reasoning.d.ts +45 -0
- package/dist/reasoning.js +154 -0
- package/dist/redact.d.ts +18 -0
- package/dist/redact.js +29 -1
- package/dist/transport.d.ts +3 -1
- package/dist/transport.js +21 -1
- package/dist/types.d.ts +112 -2
- package/dist/util.d.ts +22 -0
- package/dist/util.js +59 -0
- package/nugget/VERSION.txt +2 -2
- package/nugget/dist/adapters/engines/anthropic.d.ts +14 -0
- package/nugget/dist/adapters/engines/anthropic.d.ts.map +1 -0
- package/nugget/dist/adapters/engines/anthropic.js +323 -0
- package/nugget/dist/adapters/engines/anthropic.js.map +1 -0
- package/nugget/dist/adapters/engines/base.d.ts +50 -0
- package/nugget/dist/adapters/engines/base.d.ts.map +1 -0
- package/nugget/dist/adapters/engines/base.js +137 -0
- package/nugget/dist/adapters/engines/base.js.map +1 -0
- package/nugget/dist/adapters/engines/google.d.ts +24 -0
- package/nugget/dist/adapters/engines/google.d.ts.map +1 -0
- package/nugget/dist/adapters/engines/google.js +288 -0
- package/nugget/dist/adapters/engines/google.js.map +1 -0
- package/nugget/dist/adapters/engines/ollama.d.ts +11 -0
- package/nugget/dist/adapters/engines/ollama.d.ts.map +1 -0
- package/nugget/dist/adapters/engines/ollama.js +202 -0
- package/nugget/dist/adapters/engines/ollama.js.map +1 -0
- package/nugget/dist/adapters/engines/openaiChat.d.ts +22 -0
- package/nugget/dist/adapters/engines/openaiChat.d.ts.map +1 -0
- package/nugget/dist/adapters/engines/openaiChat.js +308 -0
- package/nugget/dist/adapters/engines/openaiChat.js.map +1 -0
- package/nugget/dist/adapters/index.d.ts +5 -0
- package/nugget/dist/adapters/index.d.ts.map +1 -0
- package/nugget/dist/adapters/index.js +17 -0
- package/nugget/dist/adapters/index.js.map +1 -0
- package/nugget/dist/adapters/profiles.d.ts +62 -0
- package/nugget/dist/adapters/profiles.d.ts.map +1 -0
- package/nugget/dist/adapters/profiles.js +121 -0
- package/nugget/dist/adapters/profiles.js.map +1 -0
- package/nugget/dist/agent/index.d.ts +3 -0
- package/nugget/dist/agent/index.d.ts.map +1 -0
- package/nugget/dist/agent/index.js +3 -0
- package/nugget/dist/agent/index.js.map +1 -0
- package/nugget/dist/agent/loop.d.ts +114 -0
- package/nugget/dist/agent/loop.d.ts.map +1 -0
- package/nugget/dist/agent/loop.js +371 -0
- package/nugget/dist/agent/loop.js.map +1 -0
- package/nugget/dist/agent/tools.d.ts +29 -0
- package/nugget/dist/agent/tools.d.ts.map +1 -0
- package/nugget/dist/agent/tools.js +48 -0
- package/nugget/dist/agent/tools.js.map +1 -0
- package/nugget/dist/cjs/adapters/engines/anthropic.js +326 -0
- package/nugget/dist/cjs/adapters/engines/base.js +147 -0
- package/nugget/dist/cjs/adapters/engines/google.js +291 -0
- package/nugget/dist/cjs/adapters/engines/ollama.js +205 -0
- package/nugget/dist/cjs/adapters/engines/openaiChat.js +312 -0
- package/nugget/dist/cjs/adapters/index.js +22 -0
- package/nugget/dist/cjs/adapters/profiles.js +125 -0
- package/nugget/dist/cjs/agent/index.js +18 -0
- package/nugget/dist/cjs/agent/loop.js +373 -0
- package/nugget/dist/cjs/agent/tools.js +51 -0
- package/nugget/dist/cjs/connect.js +27 -0
- package/nugget/dist/cjs/errors.js +110 -0
- package/nugget/dist/cjs/handler.js +586 -0
- package/nugget/dist/cjs/index.js +28 -0
- package/nugget/dist/cjs/json.js +121 -0
- package/nugget/dist/cjs/keys.js +81 -0
- package/nugget/dist/cjs/package.json +3 -0
- package/nugget/dist/cjs/policy.js +42 -0
- package/nugget/dist/cjs/reasoning.js +159 -0
- package/nugget/dist/cjs/redact.js +78 -0
- package/nugget/dist/cjs/tokens.js +22 -0
- package/nugget/dist/cjs/transport.js +172 -0
- package/nugget/dist/cjs/types.js +6 -0
- package/nugget/dist/cjs/util.js +126 -0
- package/nugget/dist/connect.d.ts +31 -0
- package/nugget/dist/connect.d.ts.map +1 -0
- package/nugget/dist/connect.js +25 -0
- package/nugget/dist/connect.js.map +1 -0
- package/nugget/dist/errors.d.ts +22 -0
- package/nugget/dist/errors.d.ts.map +1 -0
- package/nugget/dist/errors.js +104 -0
- package/nugget/dist/errors.js.map +1 -0
- package/nugget/dist/handler.d.ts +114 -0
- package/nugget/dist/handler.d.ts.map +1 -0
- package/nugget/dist/handler.js +582 -0
- package/nugget/dist/handler.js.map +1 -0
- package/nugget/dist/index.d.ts +13 -0
- package/nugget/dist/index.d.ts.map +1 -0
- package/nugget/dist/index.js +13 -0
- package/nugget/dist/index.js.map +1 -0
- package/nugget/dist/json.d.ts +7 -0
- package/nugget/dist/json.d.ts.map +1 -0
- package/nugget/dist/json.js +114 -0
- package/nugget/dist/json.js.map +1 -0
- package/nugget/dist/keys.d.ts +7 -0
- package/nugget/dist/keys.d.ts.map +1 -0
- package/nugget/dist/keys.js +75 -0
- package/nugget/dist/keys.js.map +1 -0
- package/nugget/dist/policy.d.ts +6 -0
- package/nugget/dist/policy.d.ts.map +1 -0
- package/nugget/dist/policy.js +37 -0
- package/nugget/dist/policy.js.map +1 -0
- package/nugget/dist/reasoning.d.ts +45 -0
- package/nugget/dist/reasoning.d.ts.map +1 -0
- package/nugget/dist/reasoning.js +154 -0
- package/nugget/dist/reasoning.js.map +1 -0
- package/nugget/dist/redact.d.ts +26 -0
- package/nugget/dist/redact.d.ts.map +1 -0
- package/nugget/dist/redact.js +74 -0
- package/nugget/dist/redact.js.map +1 -0
- package/nugget/dist/tokens.d.ts +5 -0
- package/nugget/dist/tokens.d.ts.map +1 -0
- package/nugget/dist/tokens.js +18 -0
- package/nugget/dist/tokens.js.map +1 -0
- package/nugget/dist/transport.d.ts +30 -0
- package/nugget/dist/transport.d.ts.map +1 -0
- package/nugget/dist/transport.js +165 -0
- package/nugget/dist/transport.js.map +1 -0
- package/nugget/dist/types.d.ts +301 -0
- package/nugget/dist/types.d.ts.map +1 -0
- package/nugget/dist/types.js +4 -0
- package/nugget/dist/types.js.map +1 -0
- package/nugget/dist/util.d.ts +31 -0
- package/nugget/dist/util.d.ts.map +1 -0
- package/nugget/dist/util.js +114 -0
- package/nugget/dist/util.js.map +1 -0
- package/nugget/src/adapters/engines/anthropic.ts +78 -37
- package/nugget/src/adapters/engines/base.ts +50 -7
- package/nugget/src/adapters/engines/google.ts +79 -29
- package/nugget/src/adapters/engines/ollama.ts +56 -17
- package/nugget/src/adapters/engines/openaiChat.ts +104 -30
- package/nugget/src/adapters/profiles.ts +53 -3
- package/nugget/src/agent/loop.ts +156 -13
- package/nugget/src/errors.ts +25 -1
- package/nugget/src/handler.ts +308 -59
- package/nugget/src/index.ts +1 -0
- package/nugget/src/reasoning.ts +174 -0
- package/nugget/src/redact.ts +32 -1
- package/nugget/src/transport.ts +20 -1
- package/nugget/src/types.ts +113 -1
- package/nugget/src/util.ts +64 -0
- package/package.json +18 -5
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
import { AIError } from '../../errors.js';
|
|
2
|
+
import { estimatedUsage } from '../../tokens.js';
|
|
3
|
+
import { fetchJson, postResponse, sseLines } from '../../transport.js';
|
|
4
|
+
import { applyProviderOptions, asNumber, asRecord, asString, joinUrl, textFromMessages } from '../../util.js';
|
|
5
|
+
import { DEFAULT_TIMEOUT_MS, health, listOpenModels, parseArgs, randomId, safeParse, streamAnomaly, streamError, streamTimeout } from './base.js';
|
|
6
|
+
export class OpenAIChatAdapter {
|
|
7
|
+
profile;
|
|
8
|
+
provider;
|
|
9
|
+
constructor(provider, profile) {
|
|
10
|
+
this.profile = profile;
|
|
11
|
+
this.provider = provider;
|
|
12
|
+
}
|
|
13
|
+
async chat(conn, req) {
|
|
14
|
+
let final;
|
|
15
|
+
for await (const event of this.stream(conn, req)) {
|
|
16
|
+
if (event.type === 'done')
|
|
17
|
+
final = event.result;
|
|
18
|
+
if (event.type === 'error')
|
|
19
|
+
throw event.error;
|
|
20
|
+
}
|
|
21
|
+
if (!final)
|
|
22
|
+
throw new AIError('Provider stream ended without a result', { kind: 'invalid_response', provider: conn.provider });
|
|
23
|
+
return final;
|
|
24
|
+
}
|
|
25
|
+
async *stream(conn, req) {
|
|
26
|
+
const started = Date.now();
|
|
27
|
+
let firstTokenMs = null;
|
|
28
|
+
let text = '';
|
|
29
|
+
let toolCalls = [];
|
|
30
|
+
let inputTokens;
|
|
31
|
+
let outputTokens;
|
|
32
|
+
let finish;
|
|
33
|
+
let sawTerminal = false;
|
|
34
|
+
const timeout = streamTimeout(conn, req.signal);
|
|
35
|
+
yield { type: 'start', callId: '', provider: conn.provider, model: req.model };
|
|
36
|
+
try {
|
|
37
|
+
let res;
|
|
38
|
+
try {
|
|
39
|
+
res = await postResponse(urlFor(conn, this.profile, req), openAiBody(req, this.profile), conn.headers, timeout.signal, conn.provider);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
// OpenAI's `/chat/completions` refuses function tools on a reasoning model
|
|
43
|
+
// unless `reasoning_effort` is `'none'` ("Function tools with reasoning_effort
|
|
44
|
+
// are not supported … use /v1/responses or set reasoning_effort to 'none'").
|
|
45
|
+
// The nugget never sets `reasoning_effort` itself, so the provider default
|
|
46
|
+
// applies and every tool-using turn 400s. Rather than make each app learn
|
|
47
|
+
// this the hard way, retry the one request once with the effort disabled
|
|
48
|
+
// and say so on the stream. Reactive on purpose: sending
|
|
49
|
+
// `reasoning_effort` up front would 400 on non-reasoning models instead.
|
|
50
|
+
// A caller-requested effort is overridden too — the alternative is a hard
|
|
51
|
+
// 400 with no tool call at all — and the context event says so.
|
|
52
|
+
if (!shouldRetryWithoutReasoningEffort(error, req))
|
|
53
|
+
throw error;
|
|
54
|
+
yield {
|
|
55
|
+
type: 'context',
|
|
56
|
+
kind: 'reasoning_effort_disabled_for_tools',
|
|
57
|
+
data: {
|
|
58
|
+
reason: 'provider rejected function tools with reasoning_effort; retried with reasoning_effort: none',
|
|
59
|
+
requested: req.providerOptions?.reasoning_effort ?? req.reasoningEffort ?? null,
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
const retryReq = { ...req, providerOptions: { ...req.providerOptions, reasoning_effort: 'none' } };
|
|
63
|
+
res = await postResponse(urlFor(conn, this.profile, retryReq), openAiBody(retryReq, this.profile), conn.headers, timeout.signal, conn.provider);
|
|
64
|
+
}
|
|
65
|
+
const contentType = res.headers.get('content-type') ?? '';
|
|
66
|
+
if (!contentType.includes('text/event-stream')) {
|
|
67
|
+
// Server ignored stream:true (or is a buffered gateway) — recover the whole body.
|
|
68
|
+
const rawText = await res.text().catch(() => '');
|
|
69
|
+
const raw = safeParse(rawText) ?? { text: rawText };
|
|
70
|
+
const parsed = parseOpenAiResponse(raw);
|
|
71
|
+
text = parsed.text;
|
|
72
|
+
toolCalls = parsed.toolCalls;
|
|
73
|
+
inputTokens = parsed.inputTokens;
|
|
74
|
+
outputTokens = parsed.outputTokens;
|
|
75
|
+
finish = parsed.finish;
|
|
76
|
+
sawTerminal = true;
|
|
77
|
+
if (parsed.reasoning)
|
|
78
|
+
yield { type: 'reasoning', text: parsed.reasoning };
|
|
79
|
+
if (text)
|
|
80
|
+
yield { type: 'delta', text };
|
|
81
|
+
for (const call of toolCalls)
|
|
82
|
+
yield { type: 'tool_call', call };
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
const partialTools = new Map();
|
|
86
|
+
for await (const line of sseLines(res)) {
|
|
87
|
+
timeout.bump();
|
|
88
|
+
const chunk = safeParse(line);
|
|
89
|
+
const record = asRecord(chunk);
|
|
90
|
+
if (!record)
|
|
91
|
+
continue;
|
|
92
|
+
const usage = asRecord(record.usage);
|
|
93
|
+
inputTokens = asNumber(usage?.prompt_tokens) ?? inputTokens;
|
|
94
|
+
outputTokens = asNumber(usage?.completion_tokens) ?? outputTokens;
|
|
95
|
+
const choices = Array.isArray(record.choices) ? record.choices : [];
|
|
96
|
+
const choice = asRecord(choices[0]);
|
|
97
|
+
finish = asString(choice?.finish_reason) ?? finish;
|
|
98
|
+
if (choice?.finish_reason)
|
|
99
|
+
sawTerminal = true;
|
|
100
|
+
const delta = asRecord(choice?.delta);
|
|
101
|
+
// Reasoning tokens (DeepSeek `reasoning_content`, others `reasoning`)
|
|
102
|
+
// ride their own channel so they don't contaminate the answer text.
|
|
103
|
+
const reasoning = asString(delta?.reasoning_content) ?? asString(delta?.reasoning);
|
|
104
|
+
if (reasoning)
|
|
105
|
+
yield { type: 'reasoning', text: reasoning };
|
|
106
|
+
const piece = asString(delta?.content);
|
|
107
|
+
if (piece) {
|
|
108
|
+
if (firstTokenMs === null)
|
|
109
|
+
firstTokenMs = Date.now() - started;
|
|
110
|
+
text += piece;
|
|
111
|
+
yield { type: 'delta', text: piece };
|
|
112
|
+
}
|
|
113
|
+
const calls = Array.isArray(delta?.tool_calls) ? delta.tool_calls : [];
|
|
114
|
+
for (const callValue of calls) {
|
|
115
|
+
const call = asRecord(callValue);
|
|
116
|
+
const index = asNumber(call?.index) ?? 0;
|
|
117
|
+
const current = partialTools.get(index) ?? { raw: '' };
|
|
118
|
+
current.id = asString(call?.id) ?? current.id;
|
|
119
|
+
const fn = asRecord(call?.function);
|
|
120
|
+
current.name = asString(fn?.name) ?? current.name;
|
|
121
|
+
current.raw += asString(fn?.arguments) ?? '';
|
|
122
|
+
partialTools.set(index, current);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
toolCalls = [...partialTools.values()].filter((call) => call.name).map((call) => ({
|
|
126
|
+
id: call.id ?? randomId(),
|
|
127
|
+
name: call.name,
|
|
128
|
+
raw: call.raw,
|
|
129
|
+
arguments: parseArgs(call.raw),
|
|
130
|
+
}));
|
|
131
|
+
for (const call of toolCalls)
|
|
132
|
+
yield { type: 'tool_call', call };
|
|
133
|
+
}
|
|
134
|
+
if (!sawTerminal)
|
|
135
|
+
yield streamAnomaly('stream ended without a finish_reason');
|
|
136
|
+
const result = makeResult(conn, req, text, toolCalls, finish, started, firstTokenMs, inputTokens, outputTokens);
|
|
137
|
+
yield { type: 'done', result };
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
throw streamError(error, timeout, conn.provider);
|
|
141
|
+
}
|
|
142
|
+
finally {
|
|
143
|
+
timeout.done();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
listModels(conn) {
|
|
147
|
+
return listOpenModels(conn, this.profile);
|
|
148
|
+
}
|
|
149
|
+
health(conn) {
|
|
150
|
+
return health(conn, this.profile);
|
|
151
|
+
}
|
|
152
|
+
async embed(conn, req) {
|
|
153
|
+
const inputs = Array.isArray(req.input) ? req.input : [req.input];
|
|
154
|
+
const { data } = await fetchJson(joinUrl(conn.baseUrl, '/embeddings'), {
|
|
155
|
+
method: 'POST',
|
|
156
|
+
headers: { 'content-type': 'application/json', ...conn.headers },
|
|
157
|
+
body: JSON.stringify(applyProviderOptions({ model: req.model, input: inputs }, req.providerOptions)),
|
|
158
|
+
timeoutMs: conn.timeoutMs ?? DEFAULT_TIMEOUT_MS,
|
|
159
|
+
provider: conn.provider,
|
|
160
|
+
});
|
|
161
|
+
const record = asRecord(data);
|
|
162
|
+
const rows = Array.isArray(record?.data) ? record.data : [];
|
|
163
|
+
// Order by the `index` each row reports, falling back to array order.
|
|
164
|
+
const byIndex = rows
|
|
165
|
+
.map((row, i) => ({ index: asNumber(asRecord(row)?.index) ?? i, embedding: asEmbedding(asRecord(row)?.embedding) }))
|
|
166
|
+
.sort((a, b) => a.index - b.index);
|
|
167
|
+
const usage = asRecord(record?.usage);
|
|
168
|
+
const inputTokens = asNumber(usage?.prompt_tokens);
|
|
169
|
+
return {
|
|
170
|
+
embeddings: byIndex.map((row) => row.embedding),
|
|
171
|
+
model: req.model,
|
|
172
|
+
usage: { inputTokens, outputTokens: 0, estimated: inputTokens === undefined },
|
|
173
|
+
source: { provider: conn.provider, connectionId: conn.id, baseUrl: conn.baseUrl },
|
|
174
|
+
raw: data,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
function asEmbedding(value) {
|
|
179
|
+
return Array.isArray(value) ? value.filter((n) => typeof n === 'number') : [];
|
|
180
|
+
}
|
|
181
|
+
function openAiBody(req, profile) {
|
|
182
|
+
const body = {
|
|
183
|
+
model: req.model,
|
|
184
|
+
messages: req.messages.map(toOpenAiMessage),
|
|
185
|
+
temperature: req.temperature,
|
|
186
|
+
top_p: req.topP,
|
|
187
|
+
stop: req.stopSequences,
|
|
188
|
+
response_format: responseFormatFor(req, profile),
|
|
189
|
+
tools: req.tools?.map((tool) => ({ type: 'function', function: tool })),
|
|
190
|
+
tool_choice: typeof req.toolChoice === 'object' ? { type: 'function', function: { name: req.toolChoice.name } } : req.toolChoice,
|
|
191
|
+
stream: true,
|
|
192
|
+
// Many OpenAI-compatible local servers (llama.cpp, LM Studio, vLLM) choke
|
|
193
|
+
// on or ignore stream_options — only send it where the profile confirms
|
|
194
|
+
// the server understands it.
|
|
195
|
+
stream_options: profile.quirks?.supportsUsageInStream ? { include_usage: true } : undefined,
|
|
196
|
+
};
|
|
197
|
+
if (req.maxTokens !== undefined)
|
|
198
|
+
body[profile.quirks?.maxTokensParam ?? 'max_tokens'] = req.maxTokens;
|
|
199
|
+
// First-class reasoning effort → OpenAI's `reasoning_effort`. Only sent when
|
|
200
|
+
// asked for: non-reasoning models reject the parameter outright.
|
|
201
|
+
if (req.reasoningEffort !== undefined)
|
|
202
|
+
body.reasoning_effort = req.reasoningEffort;
|
|
203
|
+
// providerOptions carries OpenAI-native fields the nugget doesn't model
|
|
204
|
+
// (`reasoning_effort`, `parallel_tool_calls`, `seed`, `logprobs`, …). `apiVersion`
|
|
205
|
+
// is consumed by urlFor for Azure and stripped here so it never hits the body.
|
|
206
|
+
const { apiVersion, ...passthrough } = req.providerOptions ?? {};
|
|
207
|
+
void apiVersion;
|
|
208
|
+
return applyProviderOptions(body, Object.keys(passthrough).length ? passthrough : undefined);
|
|
209
|
+
}
|
|
210
|
+
function responseFormatFor(req, profile) {
|
|
211
|
+
if (req.responseFormat?.type !== 'json')
|
|
212
|
+
return undefined;
|
|
213
|
+
if (req.responseFormat.schema && profile.quirks?.supportsJsonSchema) {
|
|
214
|
+
return { type: 'json_schema', json_schema: { name: 'response', schema: req.responseFormat.schema } };
|
|
215
|
+
}
|
|
216
|
+
return { type: 'json_object' };
|
|
217
|
+
}
|
|
218
|
+
function toOpenAiMessage(message) {
|
|
219
|
+
return {
|
|
220
|
+
role: message.role,
|
|
221
|
+
content: typeof message.content === 'string'
|
|
222
|
+
? message.content
|
|
223
|
+
: message.content.map((part) => part.type === 'image'
|
|
224
|
+
? { type: 'image_url', image_url: { url: `data:${part.mimeType ?? 'image/png'};base64,${part.imageBase64 ?? ''}` } }
|
|
225
|
+
: { type: 'text', text: part.text ?? '' }),
|
|
226
|
+
name: message.role === 'tool' ? message.name : undefined,
|
|
227
|
+
tool_call_id: message.toolCallId,
|
|
228
|
+
tool_calls: message.toolCalls?.map((call) => ({ id: call.id, type: 'function', function: { name: call.name, arguments: call.raw ?? JSON.stringify(call.arguments) } })),
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
function urlFor(conn, profile, req) {
|
|
232
|
+
if (profile.quirks?.urlTemplate) {
|
|
233
|
+
// `{apiVersion}` (Azure) is filled from a per-call override, then the
|
|
234
|
+
// profile default — so a retired Azure api-version is fixable without a
|
|
235
|
+
// library release: pass `providerOptions: { apiVersion: '2025-01-01-preview' }`.
|
|
236
|
+
const apiVersion = asString(req.providerOptions?.apiVersion) ?? profile.quirks.apiVersion ?? '';
|
|
237
|
+
return profile.quirks.urlTemplate
|
|
238
|
+
.replace('{baseUrl}', conn.baseUrl)
|
|
239
|
+
.replace('{model}', encodeURIComponent(req.model))
|
|
240
|
+
.replace('{apiVersion}', apiVersion);
|
|
241
|
+
}
|
|
242
|
+
return joinUrl(conn.baseUrl, '/chat/completions');
|
|
243
|
+
}
|
|
244
|
+
function parseOpenAiResponse(raw) {
|
|
245
|
+
const record = asRecord(raw);
|
|
246
|
+
const usage = asRecord(record?.usage);
|
|
247
|
+
const choice = asRecord(Array.isArray(record?.choices) ? record.choices[0] : undefined);
|
|
248
|
+
const message = asRecord(choice?.message);
|
|
249
|
+
const text = asString(message?.content) ?? asString(record?.text) ?? '';
|
|
250
|
+
const reasoning = asString(message?.reasoning_content) ?? asString(message?.reasoning);
|
|
251
|
+
const calls = Array.isArray(message?.tool_calls) ? message.tool_calls : [];
|
|
252
|
+
return {
|
|
253
|
+
text,
|
|
254
|
+
reasoning,
|
|
255
|
+
finish: asString(choice?.finish_reason),
|
|
256
|
+
toolCalls: calls.map((value) => {
|
|
257
|
+
const call = asRecord(value);
|
|
258
|
+
const fn = asRecord(call?.function);
|
|
259
|
+
const rawArgs = asString(fn?.arguments) ?? '{}';
|
|
260
|
+
return { id: asString(call?.id) ?? randomId(), name: asString(fn?.name) ?? 'unknown', raw: rawArgs, arguments: parseArgs(rawArgs) };
|
|
261
|
+
}),
|
|
262
|
+
inputTokens: asNumber(usage?.prompt_tokens),
|
|
263
|
+
outputTokens: asNumber(usage?.completion_tokens),
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
function makeResult(conn, req, text, toolCalls, finish, started, firstTokenMs, inputTokens, outputTokens) {
|
|
267
|
+
const usage = inputTokens !== undefined || outputTokens !== undefined
|
|
268
|
+
? { inputTokens, outputTokens, estimated: false }
|
|
269
|
+
: estimatedUsage(textFromMessages(req.messages), text);
|
|
270
|
+
return {
|
|
271
|
+
text,
|
|
272
|
+
toolCalls: toolCalls.length ? toolCalls : undefined,
|
|
273
|
+
finishReason: mapFinish(finish, toolCalls.length > 0),
|
|
274
|
+
usage,
|
|
275
|
+
timing: { firstTokenMs, totalMs: Date.now() - started },
|
|
276
|
+
model: req.model,
|
|
277
|
+
source: { provider: conn.provider, connectionId: conn.id, baseUrl: conn.baseUrl },
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
function mapFinish(finish, hasToolCalls) {
|
|
281
|
+
if (hasToolCalls || finish === 'tool_calls' || finish === 'function_call')
|
|
282
|
+
return 'tool';
|
|
283
|
+
if (finish === 'length')
|
|
284
|
+
return 'length';
|
|
285
|
+
if (finish === 'content_filter')
|
|
286
|
+
return 'content_filter';
|
|
287
|
+
return 'stop';
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* True when a `/chat/completions` 400 is the "function tools with reasoning_effort
|
|
291
|
+
* are not supported" refusal AND the request actually carried tools AND the caller
|
|
292
|
+
* did not already pin `reasoning_effort` (in which case the choice is theirs).
|
|
293
|
+
*/
|
|
294
|
+
export function shouldRetryWithoutReasoningEffort(error, req) {
|
|
295
|
+
if (!(error instanceof AIError) || error.status !== 400)
|
|
296
|
+
return false;
|
|
297
|
+
if (!req.tools || req.tools.length === 0)
|
|
298
|
+
return false;
|
|
299
|
+
// Already `'none'` (from either knob) — the refusal is about something else.
|
|
300
|
+
const effective = req.providerOptions && 'reasoning_effort' in req.providerOptions
|
|
301
|
+
? req.providerOptions.reasoning_effort
|
|
302
|
+
: req.reasoningEffort;
|
|
303
|
+
if (effective === 'none')
|
|
304
|
+
return false;
|
|
305
|
+
const text = `${error.raw ?? ''} ${error.message}`.toLowerCase();
|
|
306
|
+
return text.includes('reasoning_effort') && text.includes('tool');
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=openaiChat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openaiChat.js","sourceRoot":"","sources":["../../../src/adapters/engines/openaiChat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ProviderAdapter } from '../types.js';
|
|
2
|
+
export declare function adapterFor(provider: string, baseUrl?: string): ProviderAdapter;
|
|
3
|
+
export { PROVIDER_PROFILES, profileFor } from './profiles.js';
|
|
4
|
+
export type { ProviderProfile, EngineName, AuthMode } from './profiles.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAOnD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe,CAM9E;AAED,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC9D,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { AnthropicAdapter } from './engines/anthropic.js';
|
|
2
|
+
import { GoogleAdapter } from './engines/google.js';
|
|
3
|
+
import { OllamaAdapter } from './engines/ollama.js';
|
|
4
|
+
import { OpenAIChatAdapter } from './engines/openaiChat.js';
|
|
5
|
+
import { profileFor } from './profiles.js';
|
|
6
|
+
export function adapterFor(provider, baseUrl) {
|
|
7
|
+
const profile = profileFor(provider, baseUrl);
|
|
8
|
+
if (profile.engine === 'anthropic')
|
|
9
|
+
return new AnthropicAdapter(provider);
|
|
10
|
+
if (profile.engine === 'google')
|
|
11
|
+
return new GoogleAdapter(provider);
|
|
12
|
+
if (profile.engine === 'ollama')
|
|
13
|
+
return new OllamaAdapter(provider);
|
|
14
|
+
return new OpenAIChatAdapter(provider, profile);
|
|
15
|
+
}
|
|
16
|
+
export { PROVIDER_PROFILES, profileFor } from './profiles.js';
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,OAAgB;IAC3D,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9C,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW;QAAE,OAAO,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC1E,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC;IACpE,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC;IACpE,OAAO,IAAI,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAClD,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export type EngineName = 'openaiChat' | 'anthropic' | 'google' | 'ollama';
|
|
2
|
+
export type AuthMode = 'bearer' | 'x-api-key' | 'x-goog-api-key' | 'api-key-header' | 'none';
|
|
3
|
+
/**
|
|
4
|
+
* Answers the capability questions apps need before choosing behavior —
|
|
5
|
+
* distinct from `quirks`, which are wire-format details an adapter consults
|
|
6
|
+
* to build a request. These are per-provider defaults, not per-model: a
|
|
7
|
+
* specific model behind a `true` profile can still lack a capability (a tiny
|
|
8
|
+
* Ollama model ignoring `tools`), and callers that know better should pass an
|
|
9
|
+
* explicit `toolMode` rather than rely on `auto`.
|
|
10
|
+
*/
|
|
11
|
+
export interface ProviderCapabilities {
|
|
12
|
+
/** Native tool/function-calling is reliable for this provider's protocol, not just model-dependent. Drives `toolMode: 'auto'` in the agent loop. */
|
|
13
|
+
nativeTools: boolean;
|
|
14
|
+
/** A provider-enforced structured-output mode exists (not just prompt-and-hope JSON). */
|
|
15
|
+
jsonMode: boolean;
|
|
16
|
+
/** Runs on localhost / user-controlled infrastructure rather than a hosted cloud API. */
|
|
17
|
+
local: boolean;
|
|
18
|
+
/** Meant to run embedded alongside the app (a local sidecar process) rather than accessed as a standalone hosted service. */
|
|
19
|
+
embeddable: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface ProviderProfile {
|
|
22
|
+
engine: EngineName;
|
|
23
|
+
defaultBaseUrl?: string;
|
|
24
|
+
auth: AuthMode;
|
|
25
|
+
defaultHeaders?: Record<string, string>;
|
|
26
|
+
capabilities: ProviderCapabilities;
|
|
27
|
+
quirks?: {
|
|
28
|
+
keyOptional?: boolean;
|
|
29
|
+
modelOptional?: boolean;
|
|
30
|
+
urlTemplate?: string;
|
|
31
|
+
supportsUsageInStream?: boolean;
|
|
32
|
+
maxTokensRequired?: boolean;
|
|
33
|
+
maxTokensParam?: 'max_tokens' | 'max_completion_tokens';
|
|
34
|
+
supportsJsonSchema?: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Default value for the `{apiVersion}` token in `urlTemplate` (Azure OpenAI).
|
|
37
|
+
* Overridable per call via `ChatRequest.providerOptions.apiVersion`, so a
|
|
38
|
+
* retired Azure api-version never requires a library release.
|
|
39
|
+
*/
|
|
40
|
+
apiVersion?: string;
|
|
41
|
+
/**
|
|
42
|
+
* Provider honors an `Idempotency-Key` request header. When set, the handler
|
|
43
|
+
* attaches one key per logical call and reuses it across retries, so a retry
|
|
44
|
+
* after a connection drops post-generation is deduped by the provider rather
|
|
45
|
+
* than billed twice. Left off unless the provider documents the header —
|
|
46
|
+
* sending an unknown header is harmless, but claiming the guarantee is not.
|
|
47
|
+
*/
|
|
48
|
+
supportsIdempotencyKey?: boolean;
|
|
49
|
+
};
|
|
50
|
+
listModelsPath?: string;
|
|
51
|
+
healthPath?: string;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The provider keys that have a profile in {@link PROVIDER_PROFILES}. Used to
|
|
55
|
+
* type `Connection.provider` so IDEs autocomplete valid names and typos are a
|
|
56
|
+
* compile error rather than a silent fall-through to `openai-compat`.
|
|
57
|
+
*/
|
|
58
|
+
export type KnownProvider = 'openai' | 'azure-openai' | 'openrouter' | 'groq' | 'deepseek' | 'mistral' | 'together' | 'fireworks' | 'cerebras' | 'moonshot' | 'cohere' | 'perplexity' | 'lmstudio' | 'llamacpp' | 'vllm' | 'ollama' | 'anthropic' | 'google' | 'openai-compat';
|
|
59
|
+
export declare const PROVIDER_PROFILES: Record<KnownProvider, ProviderProfile> & Record<string, ProviderProfile>;
|
|
60
|
+
export declare function profileFor(provider: string, baseUrl?: string): ProviderProfile;
|
|
61
|
+
export declare function applyAuth(profile: ProviderProfile, apiKey: string | null, headers: Record<string, string>): Record<string, string>;
|
|
62
|
+
//# sourceMappingURL=profiles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/adapters/profiles.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC1E,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,MAAM,CAAC;AAE7F;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAoB;IACnC,oJAAoJ;IACpJ,WAAW,EAAE,OAAO,CAAC;IACrB,yFAAyF;IACzF,QAAQ,EAAE,OAAO,CAAC;IAClB,yFAAyF;IACzF,KAAK,EAAE,OAAO,CAAC;IACf,6HAA6H;IAC7H,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,UAAU,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,QAAQ,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,YAAY,EAAE,oBAAoB,CAAC;IACnC,MAAM,CAAC,EAAE;QACP,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,qBAAqB,CAAC,EAAE,OAAO,CAAC;QAChC,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,cAAc,CAAC,EAAE,YAAY,GAAG,uBAAuB,CAAC;QACxD,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B;;;;WAIG;QACH,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB;;;;;;WAMG;QACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;KAClC,CAAC;IACF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAKD;;;;GAIG;AACH,MAAM,MAAM,aAAa,GACrB,QAAQ,GACR,cAAc,GACd,YAAY,GACZ,MAAM,GACN,UAAU,GACV,SAAS,GACT,UAAU,GACV,WAAW,GACX,UAAU,GACV,UAAU,GACV,QAAQ,GACR,YAAY,GACZ,UAAU,GACV,UAAU,GACV,MAAM,GACN,QAAQ,GACR,WAAW,GACX,QAAQ,GACR,eAAe,CAAC;AAEpB,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,aAAa,EAAE,eAAe,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAiGtG,CAAC;AAEF,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe,CAK9E;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQlI"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
const HOSTED_CLOUD = { nativeTools: true, jsonMode: true, local: false, embeddable: false };
|
|
2
|
+
const LOCAL_RUNTIME = { nativeTools: false, jsonMode: false, local: true, embeddable: true };
|
|
3
|
+
export const PROVIDER_PROFILES = {
|
|
4
|
+
openai: {
|
|
5
|
+
engine: 'openaiChat',
|
|
6
|
+
defaultBaseUrl: 'https://api.openai.com/v1',
|
|
7
|
+
auth: 'bearer',
|
|
8
|
+
listModelsPath: '/models',
|
|
9
|
+
capabilities: HOSTED_CLOUD,
|
|
10
|
+
quirks: { supportsUsageInStream: true, maxTokensParam: 'max_completion_tokens', supportsJsonSchema: true, supportsIdempotencyKey: true },
|
|
11
|
+
},
|
|
12
|
+
'azure-openai': {
|
|
13
|
+
engine: 'openaiChat',
|
|
14
|
+
auth: 'api-key-header',
|
|
15
|
+
capabilities: HOSTED_CLOUD,
|
|
16
|
+
quirks: { urlTemplate: '{baseUrl}/openai/deployments/{model}/chat/completions?api-version={apiVersion}', apiVersion: '2024-10-21', maxTokensParam: 'max_completion_tokens', supportsJsonSchema: true },
|
|
17
|
+
},
|
|
18
|
+
openrouter: {
|
|
19
|
+
engine: 'openaiChat',
|
|
20
|
+
defaultBaseUrl: 'https://openrouter.ai/api/v1',
|
|
21
|
+
auth: 'bearer',
|
|
22
|
+
defaultHeaders: { 'HTTP-Referer': 'https://github.com/jxburros/AI-Nugget', 'X-Title': 'ai-nugget' },
|
|
23
|
+
listModelsPath: '/models',
|
|
24
|
+
capabilities: HOSTED_CLOUD,
|
|
25
|
+
quirks: { supportsUsageInStream: true },
|
|
26
|
+
},
|
|
27
|
+
groq: { engine: 'openaiChat', defaultBaseUrl: 'https://api.groq.com/openai/v1', auth: 'bearer', listModelsPath: '/models', capabilities: HOSTED_CLOUD },
|
|
28
|
+
deepseek: { engine: 'openaiChat', defaultBaseUrl: 'https://api.deepseek.com/v1', auth: 'bearer', listModelsPath: '/models', capabilities: HOSTED_CLOUD },
|
|
29
|
+
mistral: { engine: 'openaiChat', defaultBaseUrl: 'https://api.mistral.ai/v1', auth: 'bearer', listModelsPath: '/models', capabilities: HOSTED_CLOUD },
|
|
30
|
+
together: { engine: 'openaiChat', defaultBaseUrl: 'https://api.together.xyz/v1', auth: 'bearer', listModelsPath: '/models', capabilities: HOSTED_CLOUD },
|
|
31
|
+
fireworks: { engine: 'openaiChat', defaultBaseUrl: 'https://api.fireworks.ai/inference/v1', auth: 'bearer', listModelsPath: '/models', capabilities: HOSTED_CLOUD },
|
|
32
|
+
cerebras: { engine: 'openaiChat', defaultBaseUrl: 'https://api.cerebras.ai/v1', auth: 'bearer', listModelsPath: '/models', capabilities: HOSTED_CLOUD },
|
|
33
|
+
moonshot: { engine: 'openaiChat', defaultBaseUrl: 'https://api.moonshot.ai/v1', auth: 'bearer', listModelsPath: '/models', capabilities: HOSTED_CLOUD },
|
|
34
|
+
// Cohere's OpenAI-compatible surface lives under /compatibility/v1.
|
|
35
|
+
cohere: { engine: 'openaiChat', defaultBaseUrl: 'https://api.cohere.ai/compatibility/v1', auth: 'bearer', listModelsPath: '/models', capabilities: HOSTED_CLOUD },
|
|
36
|
+
// Perplexity has no public model-listing endpoint, so listModels resolves empty.
|
|
37
|
+
perplexity: { engine: 'openaiChat', defaultBaseUrl: 'https://api.perplexity.ai', auth: 'bearer', capabilities: HOSTED_CLOUD },
|
|
38
|
+
lmstudio: {
|
|
39
|
+
engine: 'openaiChat',
|
|
40
|
+
defaultBaseUrl: 'http://localhost:1234/v1',
|
|
41
|
+
auth: 'none',
|
|
42
|
+
listModelsPath: '/models',
|
|
43
|
+
capabilities: LOCAL_RUNTIME,
|
|
44
|
+
quirks: { keyOptional: true },
|
|
45
|
+
},
|
|
46
|
+
llamacpp: {
|
|
47
|
+
engine: 'openaiChat',
|
|
48
|
+
defaultBaseUrl: 'http://localhost:8080/v1',
|
|
49
|
+
auth: 'none',
|
|
50
|
+
listModelsPath: '/models',
|
|
51
|
+
healthPath: '/health',
|
|
52
|
+
capabilities: LOCAL_RUNTIME,
|
|
53
|
+
quirks: { keyOptional: true, modelOptional: true },
|
|
54
|
+
},
|
|
55
|
+
vllm: {
|
|
56
|
+
engine: 'openaiChat',
|
|
57
|
+
defaultBaseUrl: 'http://localhost:8000/v1',
|
|
58
|
+
auth: 'none',
|
|
59
|
+
listModelsPath: '/models',
|
|
60
|
+
capabilities: LOCAL_RUNTIME,
|
|
61
|
+
quirks: { keyOptional: true },
|
|
62
|
+
},
|
|
63
|
+
ollama: {
|
|
64
|
+
engine: 'ollama',
|
|
65
|
+
defaultBaseUrl: 'http://localhost:11434',
|
|
66
|
+
auth: 'none',
|
|
67
|
+
listModelsPath: '/api/tags',
|
|
68
|
+
// Ollama's `format: 'json'` is engine-enforced (reliable regardless of
|
|
69
|
+
// model); its `tools` field is honored only by models trained for tool
|
|
70
|
+
// use, so nativeTools stays conservative like the other local runtimes.
|
|
71
|
+
capabilities: { ...LOCAL_RUNTIME, jsonMode: true },
|
|
72
|
+
quirks: { keyOptional: true },
|
|
73
|
+
},
|
|
74
|
+
anthropic: {
|
|
75
|
+
engine: 'anthropic',
|
|
76
|
+
defaultBaseUrl: 'https://api.anthropic.com',
|
|
77
|
+
auth: 'x-api-key',
|
|
78
|
+
defaultHeaders: { 'anthropic-version': '2023-06-01' },
|
|
79
|
+
capabilities: HOSTED_CLOUD,
|
|
80
|
+
quirks: { maxTokensRequired: true },
|
|
81
|
+
},
|
|
82
|
+
google: {
|
|
83
|
+
engine: 'google',
|
|
84
|
+
defaultBaseUrl: 'https://generativelanguage.googleapis.com',
|
|
85
|
+
auth: 'x-goog-api-key',
|
|
86
|
+
capabilities: HOSTED_CLOUD,
|
|
87
|
+
},
|
|
88
|
+
'openai-compat': {
|
|
89
|
+
engine: 'openaiChat',
|
|
90
|
+
auth: 'bearer',
|
|
91
|
+
listModelsPath: '/models',
|
|
92
|
+
// Unknown endpoint — usually pointed at a local/self-hosted server, so
|
|
93
|
+
// assume the conservative local-runtime defaults rather than the hosted-cloud ones.
|
|
94
|
+
capabilities: LOCAL_RUNTIME,
|
|
95
|
+
// Most servers reached through this escape hatch (JX Runtime and other
|
|
96
|
+
// local OpenAI-compatible runtimes) don't require a key at all; keep
|
|
97
|
+
// `auth: 'bearer'` for the ones that do (a key is only sent if provided).
|
|
98
|
+
quirks: { keyOptional: true },
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
export function profileFor(provider, baseUrl) {
|
|
102
|
+
return PROVIDER_PROFILES[provider] ?? {
|
|
103
|
+
...PROVIDER_PROFILES['openai-compat'],
|
|
104
|
+
defaultBaseUrl: baseUrl,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
export function applyAuth(profile, apiKey, headers) {
|
|
108
|
+
const next = { ...profile.defaultHeaders, ...headers };
|
|
109
|
+
if (!apiKey)
|
|
110
|
+
return next;
|
|
111
|
+
if (profile.auth === 'bearer')
|
|
112
|
+
next.authorization = `Bearer ${apiKey}`;
|
|
113
|
+
else if (profile.auth === 'x-api-key')
|
|
114
|
+
next['x-api-key'] = apiKey;
|
|
115
|
+
else if (profile.auth === 'x-goog-api-key')
|
|
116
|
+
next['x-goog-api-key'] = apiKey;
|
|
117
|
+
else if (profile.auth === 'api-key-header')
|
|
118
|
+
next['api-key'] = apiKey;
|
|
119
|
+
return next;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=profiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/adapters/profiles.ts"],"names":[],"mappings":"AAuDA,MAAM,YAAY,GAAyB,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AAClH,MAAM,aAAa,GAAyB,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AA4BnH,MAAM,CAAC,MAAM,iBAAiB,GAA6E;IACzG,MAAM,EAAE;QACN,MAAM,EAAE,YAAY;QACpB,cAAc,EAAE,2BAA2B;QAC3C,IAAI,EAAE,QAAQ;QACd,cAAc,EAAE,SAAS;QACzB,YAAY,EAAE,YAAY;QAC1B,MAAM,EAAE,EAAE,qBAAqB,EAAE,IAAI,EAAE,cAAc,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE;KACzI;IACD,cAAc,EAAE;QACd,MAAM,EAAE,YAAY;QACpB,IAAI,EAAE,gBAAgB;QACtB,YAAY,EAAE,YAAY;QAC1B,MAAM,EAAE,EAAE,WAAW,EAAE,gFAAgF,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,IAAI,EAAE;KACvM;IACD,UAAU,EAAE;QACV,MAAM,EAAE,YAAY;QACpB,cAAc,EAAE,8BAA8B;QAC9C,IAAI,EAAE,QAAQ;QACd,cAAc,EAAE,EAAE,cAAc,EAAE,uCAAuC,EAAE,SAAS,EAAE,WAAW,EAAE;QACnG,cAAc,EAAE,SAAS;QACzB,YAAY,EAAE,YAAY;QAC1B,MAAM,EAAE,EAAE,qBAAqB,EAAE,IAAI,EAAE;KACxC;IACD,IAAI,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,gCAAgC,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE;IACvJ,QAAQ,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,6BAA6B,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE;IACxJ,OAAO,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,2BAA2B,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE;IACrJ,QAAQ,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,6BAA6B,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE;IACxJ,SAAS,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,uCAAuC,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE;IACnK,QAAQ,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,4BAA4B,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE;IACvJ,QAAQ,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,4BAA4B,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE;IACvJ,oEAAoE;IACpE,MAAM,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,wCAAwC,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE;IACjK,iFAAiF;IACjF,UAAU,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,2BAA2B,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE;IAC7H,QAAQ,EAAE;QACR,MAAM,EAAE,YAAY;QACpB,cAAc,EAAE,0BAA0B;QAC1C,IAAI,EAAE,MAAM;QACZ,cAAc,EAAE,SAAS;QACzB,YAAY,EAAE,aAAa;QAC3B,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;KAC9B;IACD,QAAQ,EAAE;QACR,MAAM,EAAE,YAAY;QACpB,cAAc,EAAE,0BAA0B;QAC1C,IAAI,EAAE,MAAM;QACZ,cAAc,EAAE,SAAS;QACzB,UAAU,EAAE,SAAS;QACrB,YAAY,EAAE,aAAa;QAC3B,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;KACnD;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,YAAY;QACpB,cAAc,EAAE,0BAA0B;QAC1C,IAAI,EAAE,MAAM;QACZ,cAAc,EAAE,SAAS;QACzB,YAAY,EAAE,aAAa;QAC3B,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;KAC9B;IACD,MAAM,EAAE;QACN,MAAM,EAAE,QAAQ;QAChB,cAAc,EAAE,wBAAwB;QACxC,IAAI,EAAE,MAAM;QACZ,cAAc,EAAE,WAAW;QAC3B,uEAAuE;QACvE,uEAAuE;QACvE,wEAAwE;QACxE,YAAY,EAAE,EAAE,GAAG,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE;QAClD,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;KAC9B;IACD,SAAS,EAAE;QACT,MAAM,EAAE,WAAW;QACnB,cAAc,EAAE,2BAA2B;QAC3C,IAAI,EAAE,WAAW;QACjB,cAAc,EAAE,EAAE,mBAAmB,EAAE,YAAY,EAAE;QACrD,YAAY,EAAE,YAAY;QAC1B,MAAM,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE;KACpC;IACD,MAAM,EAAE;QACN,MAAM,EAAE,QAAQ;QAChB,cAAc,EAAE,2CAA2C;QAC3D,IAAI,EAAE,gBAAgB;QACtB,YAAY,EAAE,YAAY;KAC3B;IACD,eAAe,EAAE;QACf,MAAM,EAAE,YAAY;QACpB,IAAI,EAAE,QAAQ;QACd,cAAc,EAAE,SAAS;QACzB,uEAAuE;QACvE,oFAAoF;QACpF,YAAY,EAAE,aAAa;QAC3B,uEAAuE;QACvE,qEAAqE;QACrE,0EAA0E;QAC1E,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;KAC9B;CACF,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,OAAgB;IAC3D,OAAO,iBAAiB,CAAC,QAAQ,CAAC,IAAI;QACpC,GAAG,iBAAiB,CAAC,eAAe,CAAE;QACtC,cAAc,EAAE,OAAO;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAwB,EAAE,MAAqB,EAAE,OAA+B;IACxG,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,GAAG,OAAO,EAAE,CAAC;IACvD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ;QAAE,IAAI,CAAC,aAAa,GAAG,UAAU,MAAM,EAAE,CAAC;SAClE,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;QAAE,IAAI,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC;SAC7D,IAAI,OAAO,CAAC,IAAI,KAAK,gBAAgB;QAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAAC;SACvE,IAAI,OAAO,CAAC,IAAI,KAAK,gBAAgB;QAAE,IAAI,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC;IACrE,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC"}
|