@nac3/forge-cli 1.0.29 → 1.0.31
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/bin/yf.d.ts.map +1 -1
- package/dist/bin/yf.js +5 -0
- package/dist/bin/yf.js.map +1 -1
- package/dist/chat/claude.d.ts +13 -0
- package/dist/chat/claude.d.ts.map +1 -1
- package/dist/chat/claude.js +18 -5
- package/dist/chat/claude.js.map +1 -1
- package/dist/chat/claude_cli.d.ts.map +1 -1
- package/dist/chat/claude_cli.js +10 -0
- package/dist/chat/claude_cli.js.map +1 -1
- package/dist/chat/panel.d.ts.map +1 -1
- package/dist/chat/panel.js +111 -10
- package/dist/chat/panel.js.map +1 -1
- package/dist/chat/server.d.ts.map +1 -1
- package/dist/chat/server.js +35 -2
- package/dist/chat/server.js.map +1 -1
- package/dist/commands/federation.d.ts +17 -0
- package/dist/commands/federation.d.ts.map +1 -0
- package/dist/commands/federation.js +145 -0
- package/dist/commands/federation.js.map +1 -0
- package/dist/core/brain_capabilities.d.ts +64 -0
- package/dist/core/brain_capabilities.d.ts.map +1 -0
- package/dist/core/brain_capabilities.js +119 -0
- package/dist/core/brain_capabilities.js.map +1 -0
- package/dist/core/brain_config.d.ts +1 -1
- package/dist/core/brain_config.d.ts.map +1 -1
- package/dist/core/brain_config.js +7 -0
- package/dist/core/brain_config.js.map +1 -1
- package/dist/core/cost_router.d.ts +6 -0
- package/dist/core/cost_router.d.ts.map +1 -1
- package/dist/core/cost_router.js +122 -8
- package/dist/core/cost_router.js.map +1 -1
- package/dist/core/federation_config.d.ts +17 -0
- package/dist/core/federation_config.d.ts.map +1 -0
- package/dist/core/federation_config.js +77 -0
- package/dist/core/federation_config.js.map +1 -0
- package/dist/core/provider_keys.d.ts +1 -1
- package/dist/core/provider_keys.d.ts.map +1 -1
- package/dist/core/provider_keys.js +3 -0
- package/dist/core/provider_keys.js.map +1 -1
- package/dist/core/provider_models.d.ts.map +1 -1
- package/dist/core/provider_models.js +10 -0
- package/dist/core/provider_models.js.map +1 -1
- package/dist/llm/federation_client.d.ts +66 -0
- package/dist/llm/federation_client.d.ts.map +1 -0
- package/dist/llm/federation_client.js +166 -0
- package/dist/llm/federation_client.js.map +1 -0
- package/dist/llm/federation_host.d.ts +16 -0
- package/dist/llm/federation_host.d.ts.map +1 -0
- package/dist/llm/federation_host.js +132 -0
- package/dist/llm/federation_host.js.map +1 -0
- package/dist/llm/gemini_client.d.ts.map +1 -1
- package/dist/llm/gemini_client.js +15 -6
- package/dist/llm/gemini_client.js.map +1 -1
- package/dist/llm/multi_provider_client.d.ts.map +1 -1
- package/dist/llm/multi_provider_client.js +27 -0
- package/dist/llm/multi_provider_client.js.map +1 -1
- package/dist/llm/openai_client.d.ts +4 -0
- package/dist/llm/openai_client.d.ts.map +1 -1
- package/dist/llm/openai_client.js +18 -6
- package/dist/llm/openai_client.js.map +1 -1
- package/dist/llm/single_step.d.ts +63 -0
- package/dist/llm/single_step.d.ts.map +1 -0
- package/dist/llm/single_step.js +171 -0
- package/dist/llm/single_step.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { signBearer } from '../license/hito4_client.js';
|
|
2
|
+
import { readFederationConfig, getFederationKey } from '../core/federation_config.js';
|
|
3
|
+
export class FederationError extends Error {
|
|
4
|
+
status;
|
|
5
|
+
constructor(message, status = 0) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = 'FederationError';
|
|
8
|
+
this.status = status;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
async function resolveCreds(opts) {
|
|
12
|
+
if (opts.baseUrl && opts.fedHandle && opts.fedKey) {
|
|
13
|
+
return { baseUrl: opts.baseUrl, fedHandle: opts.fedHandle, fedKey: opts.fedKey };
|
|
14
|
+
}
|
|
15
|
+
const cfg = await readFederationConfig();
|
|
16
|
+
if (!cfg || !cfg.active) {
|
|
17
|
+
throw new FederationError('not joined to a parent. Run `yf federation join <token>`.', 400);
|
|
18
|
+
}
|
|
19
|
+
const key = await getFederationKey();
|
|
20
|
+
if (!key)
|
|
21
|
+
throw new FederationError('federation key missing from vault. Re-run `yf federation join`.', 400);
|
|
22
|
+
return { baseUrl: cfg.base_url.replace(/\/+$/, ''), fedHandle: cfg.fed_handle, fedKey: key };
|
|
23
|
+
}
|
|
24
|
+
export class FederationChildBrainClient {
|
|
25
|
+
tier;
|
|
26
|
+
fetchImpl;
|
|
27
|
+
opts;
|
|
28
|
+
constructor(opts) {
|
|
29
|
+
this.tier = opts.tier;
|
|
30
|
+
this.fetchImpl = opts.fetchImpl ?? fetch;
|
|
31
|
+
this.opts = opts;
|
|
32
|
+
}
|
|
33
|
+
async chat(req) {
|
|
34
|
+
if (req.tools && !req.runTool) {
|
|
35
|
+
throw new Error('FederationChatRequest.tools requires a runTool callback');
|
|
36
|
+
}
|
|
37
|
+
const { readLimitsConfig, classifyVerbFamily, getMaxToolRoundsForFamily } = await import('../core/limits_config.js');
|
|
38
|
+
const limits = await readLimitsConfig();
|
|
39
|
+
const callerSpecifiedCap = req.maxToolRounds !== undefined;
|
|
40
|
+
const autonomousMode = limits.danger_zone && limits.danger_zone.auto_approve_all === true;
|
|
41
|
+
const baseCap = autonomousMode ? limits.max_tool_rounds.autonomous : limits.max_tool_rounds.default;
|
|
42
|
+
let maxRounds = req.maxToolRounds ?? baseCap;
|
|
43
|
+
let familyResolved = null;
|
|
44
|
+
const maxTokens = req.maxTokens ?? 1024;
|
|
45
|
+
const { baseUrl, fedHandle, fedKey } = await resolveCreds(this.opts);
|
|
46
|
+
const pollIntervalMs = this.opts.pollIntervalMs ?? 800;
|
|
47
|
+
const pollTimeoutMs = this.opts.pollTimeoutMs ?? 180_000;
|
|
48
|
+
const messages = req.messages.map((m) => ({ role: m.role, content: m.content }));
|
|
49
|
+
const tools = (req.tools ?? []).map((t) => ({
|
|
50
|
+
name: t.name, description: t.description, input_schema: t.input_schema,
|
|
51
|
+
}));
|
|
52
|
+
let totalIn = 0;
|
|
53
|
+
let totalOut = 0;
|
|
54
|
+
let serverModel = '';
|
|
55
|
+
const toolRounds = [];
|
|
56
|
+
for (let round = 0; round < maxRounds; round++) {
|
|
57
|
+
const request = { messages, tier: this.tier, max_tokens: maxTokens };
|
|
58
|
+
if (req.system)
|
|
59
|
+
request.system = req.system;
|
|
60
|
+
if (req.model)
|
|
61
|
+
request.model = req.model;
|
|
62
|
+
if (tools.length > 0)
|
|
63
|
+
request.tools = tools;
|
|
64
|
+
const json = await this.runRemoteStep(baseUrl, fedHandle, fedKey, request, pollIntervalMs, pollTimeoutMs);
|
|
65
|
+
totalIn += json.tokens_in ?? 0;
|
|
66
|
+
totalOut += json.tokens_out ?? 0;
|
|
67
|
+
serverModel = json.model ?? serverModel;
|
|
68
|
+
const stop = json.stop_reason ?? 'unknown';
|
|
69
|
+
const callsThisRound = json.tool_calls ?? [];
|
|
70
|
+
if (callsThisRound.length === 0 || stop !== 'tool_use') {
|
|
71
|
+
return { text: json.text ?? '', tokensIn: totalIn, tokensOut: totalOut, model: serverModel, toolRounds };
|
|
72
|
+
}
|
|
73
|
+
if (familyResolved === null && callsThisRound.length > 0) {
|
|
74
|
+
const first = callsThisRound[0];
|
|
75
|
+
if (first) {
|
|
76
|
+
const firstVerb = first.input.verb_id || first.name || '';
|
|
77
|
+
const fam = classifyVerbFamily(firstVerb);
|
|
78
|
+
familyResolved = fam;
|
|
79
|
+
if (!callerSpecifiedCap) {
|
|
80
|
+
const famCap = getMaxToolRoundsForFamily(limits.max_tool_rounds, fam);
|
|
81
|
+
if (famCap > maxRounds)
|
|
82
|
+
maxRounds = famCap;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const assistantContent = [];
|
|
87
|
+
if (json.text && json.text.length > 0)
|
|
88
|
+
assistantContent.push({ type: 'text', text: json.text });
|
|
89
|
+
for (const tc of callsThisRound) {
|
|
90
|
+
assistantContent.push({ type: 'tool_use', id: tc.id, name: tc.name, input: tc.input });
|
|
91
|
+
}
|
|
92
|
+
messages.push({ role: 'assistant', content: assistantContent });
|
|
93
|
+
/* Execute each tool LOCALLY (the whole point: files stay on the child). */
|
|
94
|
+
const userContent = [];
|
|
95
|
+
for (const tc of callsThisRound) {
|
|
96
|
+
let result;
|
|
97
|
+
let isError = false;
|
|
98
|
+
try {
|
|
99
|
+
const r2 = await req.runTool(tc.name, tc.input);
|
|
100
|
+
result = r2.result;
|
|
101
|
+
isError = r2.is_error === true;
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
result = { error: err instanceof Error ? err.message : String(err) };
|
|
105
|
+
isError = true;
|
|
106
|
+
}
|
|
107
|
+
let resultStr;
|
|
108
|
+
try {
|
|
109
|
+
resultStr = typeof result === 'string' ? result : JSON.stringify(result);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
resultStr = String(result);
|
|
113
|
+
}
|
|
114
|
+
if (resultStr.length > 200_000)
|
|
115
|
+
resultStr = JSON.stringify({ _truncated: true, _bytes: resultStr.length });
|
|
116
|
+
const display = typeof result === 'object' && result !== null && 'display' in result
|
|
117
|
+
? String(result.display) : undefined;
|
|
118
|
+
toolRounds.push({
|
|
119
|
+
tool: tc.name, tool_use_id: tc.id, input: tc.input,
|
|
120
|
+
...(display ? { display } : {}), ...(isError ? { is_error: true } : {}), result,
|
|
121
|
+
});
|
|
122
|
+
userContent.push({
|
|
123
|
+
type: 'tool_result', tool_use_id: tc.id, content: resultStr,
|
|
124
|
+
...(isError ? { is_error: true } : {}),
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
messages.push({ role: 'user', content: userContent });
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
text: '[Alcance el limite de rondas (' + maxRounds + '/' + maxRounds +
|
|
131
|
+
') via el brain federado. Decime "continua" para seguir.]',
|
|
132
|
+
tokensIn: totalIn, tokensOut: totalOut, model: serverModel, toolRounds,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/** Submit one inference job + poll until the parent fills the result. */
|
|
136
|
+
async runRemoteStep(baseUrl, fedHandle, fedKey, request, pollIntervalMs, pollTimeoutMs) {
|
|
137
|
+
const headers = () => ({
|
|
138
|
+
'authorization': 'Bearer ' + signBearer(fedKey, fedHandle),
|
|
139
|
+
'x-yf-fed-handle': fedHandle,
|
|
140
|
+
'content-type': 'application/json',
|
|
141
|
+
});
|
|
142
|
+
const sub = await this.fetchImpl(baseUrl + '/v1/federation/submit', {
|
|
143
|
+
method: 'POST', headers: headers(), body: JSON.stringify({ request }),
|
|
144
|
+
});
|
|
145
|
+
const subJson = await sub.json().catch(() => ({}));
|
|
146
|
+
if (!sub.ok || !subJson.ok || !subJson.job_id) {
|
|
147
|
+
throw new FederationError(subJson.error || ('federation submit HTTP ' + sub.status), sub.status);
|
|
148
|
+
}
|
|
149
|
+
const jobId = subJson.job_id;
|
|
150
|
+
const deadline = Date.now() + pollTimeoutMs;
|
|
151
|
+
for (;;) {
|
|
152
|
+
await new Promise((r) => setTimeout(r, pollIntervalMs));
|
|
153
|
+
const res = await this.fetchImpl(baseUrl + '/v1/federation/result?job_id=' + encodeURIComponent(jobId), { method: 'GET', headers: headers() });
|
|
154
|
+
const j = await res.json().catch(() => ({}));
|
|
155
|
+
if (!res.ok || !j.ok) {
|
|
156
|
+
throw new FederationError(j.error || ('federation result HTTP ' + res.status), res.status);
|
|
157
|
+
}
|
|
158
|
+
if (j.ready && j.result)
|
|
159
|
+
return j.result;
|
|
160
|
+
if (Date.now() > deadline) {
|
|
161
|
+
throw new FederationError('federation parent did not respond within ' + Math.round(pollTimeoutMs / 1000) + 's', 504);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=federation_client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"federation_client.js","sourceRoot":"","sources":["../../src/llm/federation_client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface FederationHostOptions {
|
|
2
|
+
fetchImpl?: typeof fetch;
|
|
3
|
+
baseUrl?: string;
|
|
4
|
+
intervalMs?: number;
|
|
5
|
+
/** Process one poll cycle then return (tests / one-shot). */
|
|
6
|
+
once?: boolean;
|
|
7
|
+
signal?: AbortSignal;
|
|
8
|
+
/** Progress sink (default: console.log). */
|
|
9
|
+
log?: (msg: string) => void;
|
|
10
|
+
}
|
|
11
|
+
export declare function resolveParentAuth(): Promise<{
|
|
12
|
+
secret: string;
|
|
13
|
+
handle: string;
|
|
14
|
+
} | null>;
|
|
15
|
+
export declare function runFederationHost(opts?: FederationHostOptions): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=federation_host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"federation_host.d.ts","sourceRoot":"","sources":["../../src/llm/federation_host.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,4CAA4C;IAC5C,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAeD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAiB5F;AAyCD,wBAAsB,iBAAiB,CAAC,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAwCvF"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Federation host -- the PARENT side loop (2026-06-20).
|
|
3
|
+
*
|
|
4
|
+
* Polls the broker for inference jobs addressed to this handle, runs ONE model
|
|
5
|
+
* step per job with the parent's configured brain (no tool execution -- the
|
|
6
|
+
* child runs tools on its own disk), and posts the result back. This is what
|
|
7
|
+
* makes `yf federation host` answer a joined child's turns.
|
|
8
|
+
*
|
|
9
|
+
* Auth: the parent signs with its own per-handle key (license.json handle +
|
|
10
|
+
* the vault signing secret), same as the managed client.
|
|
11
|
+
*
|
|
12
|
+
* ASCII-only.
|
|
13
|
+
*/
|
|
14
|
+
import { promises as fs } from 'node:fs';
|
|
15
|
+
import path from 'node:path';
|
|
16
|
+
import os from 'node:os';
|
|
17
|
+
import { HITO4_BASE_URL, signBearer } from '../license/hito4_client.js';
|
|
18
|
+
import { Vault } from '../vault/store.js';
|
|
19
|
+
import { configDir } from '../license/index.js';
|
|
20
|
+
import { readBrainConfig, vaultSlotForProvider } from '../core/brain_config.js';
|
|
21
|
+
import { getKey } from '../core/provider_keys.js';
|
|
22
|
+
import { singleStep } from './single_step.js';
|
|
23
|
+
export async function resolveParentAuth() {
|
|
24
|
+
let handle = null;
|
|
25
|
+
try {
|
|
26
|
+
const home = process.env.HOME || process.env.USERPROFILE || os.homedir();
|
|
27
|
+
const base = process.env.YF_CONFIG_DIR || path.join(home, '.yujin-forge');
|
|
28
|
+
const raw = await fs.readFile(path.join(base, 'license.json'), 'utf-8');
|
|
29
|
+
const j = JSON.parse(raw);
|
|
30
|
+
if (typeof j.user_handle === 'string' && j.user_handle)
|
|
31
|
+
handle = j.user_handle;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
handle = null;
|
|
35
|
+
}
|
|
36
|
+
if (!handle)
|
|
37
|
+
return null;
|
|
38
|
+
try {
|
|
39
|
+
const { resolveSigningSecret } = await import('../license/handle_key.js');
|
|
40
|
+
const vault = await Vault.open({ configDir: configDir() });
|
|
41
|
+
const resolved = await resolveSigningSecret(vault, handle);
|
|
42
|
+
if (resolved)
|
|
43
|
+
return { secret: resolved.secret, handle };
|
|
44
|
+
}
|
|
45
|
+
catch { /* */ }
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
/** Run one inference step for a job with the parent's configured brain. */
|
|
49
|
+
async function answerJob(job, fetchImpl) {
|
|
50
|
+
const tier = job.request.tier === 'eco' ? 'eco' : 'frontier';
|
|
51
|
+
const cfg = await readBrainConfig();
|
|
52
|
+
const binding = cfg[tier];
|
|
53
|
+
const provider = binding.provider;
|
|
54
|
+
const model = job.request.model || binding.model;
|
|
55
|
+
if (provider === 'federation' || provider === 'yujin_managed') {
|
|
56
|
+
return errorResult(model, 'parent brain provider "' + provider + '" cannot host federation (configure a direct API brain)');
|
|
57
|
+
}
|
|
58
|
+
let apiKey = null;
|
|
59
|
+
try {
|
|
60
|
+
apiKey = await getKey(vaultSlotForProvider(provider));
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
apiKey = null;
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
const r = await singleStep({
|
|
67
|
+
provider, model, apiKey,
|
|
68
|
+
messages: job.request.messages ?? [],
|
|
69
|
+
system: job.request.system,
|
|
70
|
+
tools: job.request.tools,
|
|
71
|
+
maxTokens: job.request.max_tokens,
|
|
72
|
+
fetchImpl,
|
|
73
|
+
});
|
|
74
|
+
return {
|
|
75
|
+
text: r.text, tool_calls: r.tool_calls, stop_reason: r.stop_reason,
|
|
76
|
+
tokens_in: r.tokens_in, tokens_out: r.tokens_out, model: r.model,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
return errorResult(model, err instanceof Error ? err.message : String(err));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function errorResult(model, msg) {
|
|
84
|
+
return {
|
|
85
|
+
text: '[federation parent error: ' + msg + ']',
|
|
86
|
+
tool_calls: [], stop_reason: 'end_turn', tokens_in: 0, tokens_out: 0, model,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
export async function runFederationHost(opts = {}) {
|
|
90
|
+
const fetchImpl = opts.fetchImpl ?? fetch;
|
|
91
|
+
const baseUrl = (opts.baseUrl ?? HITO4_BASE_URL).replace(/\/+$/, '');
|
|
92
|
+
const intervalMs = opts.intervalMs ?? 1500;
|
|
93
|
+
const log = opts.log ?? ((m) => console.log(m));
|
|
94
|
+
const auth = await resolveParentAuth();
|
|
95
|
+
if (!auth) {
|
|
96
|
+
throw new Error('federation host needs a provisioned handle (license.json user_handle + vault signing key).');
|
|
97
|
+
}
|
|
98
|
+
const headers = () => ({
|
|
99
|
+
'authorization': 'Bearer ' + signBearer(auth.secret, auth.handle),
|
|
100
|
+
'x-yf-user-handle': auth.handle,
|
|
101
|
+
'content-type': 'application/json',
|
|
102
|
+
});
|
|
103
|
+
log('Hosting federation as ' + auth.handle + ' (lending your brain). Ctrl+C para parar.');
|
|
104
|
+
for (;;) {
|
|
105
|
+
if (opts.signal?.aborted)
|
|
106
|
+
return;
|
|
107
|
+
let jobs = [];
|
|
108
|
+
try {
|
|
109
|
+
const r = await fetchImpl(baseUrl + '/v1/federation/jobs', { method: 'GET', headers: headers() });
|
|
110
|
+
const j = await r.json().catch(() => ({}));
|
|
111
|
+
if (j.ok && Array.isArray(j.jobs))
|
|
112
|
+
jobs = j.jobs;
|
|
113
|
+
}
|
|
114
|
+
catch { /* transient -- retry next cycle */ }
|
|
115
|
+
for (const job of jobs) {
|
|
116
|
+
if (opts.signal?.aborted)
|
|
117
|
+
return;
|
|
118
|
+
log(' job ' + job.job_id.slice(0, 8) + ' (' + (job.request.tier || 'frontier') + ') ...');
|
|
119
|
+
const result = await answerJob(job, fetchImpl);
|
|
120
|
+
try {
|
|
121
|
+
await fetchImpl(baseUrl + '/v1/federation/result', {
|
|
122
|
+
method: 'POST', headers: headers(), body: JSON.stringify({ job_id: job.job_id, result }),
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
catch { /* the child will retry / time out */ }
|
|
126
|
+
}
|
|
127
|
+
if (opts.once)
|
|
128
|
+
return;
|
|
129
|
+
await new Promise((r) => setTimeout(r, intervalMs));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=federation_host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"federation_host.js","sourceRoot":"","sources":["../../src/llm/federation_host.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini_client.d.ts","sourceRoot":"","sources":["../../src/llm/gemini_client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAMvD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;QAClE,MAAM,EAAE,OAAO,CAAC;QAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC,CAAC;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;
|
|
1
|
+
{"version":3,"file":"gemini_client.d.ts","sourceRoot":"","sources":["../../src/llm/gemini_client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAMvD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;QAClE,MAAM,EAAE,OAAO,CAAC;QAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC,CAAC;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AA+BD,qBAAa,cAAe,SAAQ,KAAK;IACvC,MAAM,EAAE,MAAM,CAAC;gBACH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAK5C;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,YAAY,CAAS;gBAEjB,IAAI,EAAE,mBAAmB;IAS/B,IAAI,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA4LhE"}
|
|
@@ -37,12 +37,21 @@ export class GeminiClient {
|
|
|
37
37
|
let maxRounds = req.maxToolRounds ?? baseCap;
|
|
38
38
|
let familyResolved = null;
|
|
39
39
|
/* Translate the caller's ChatMessage[] into Gemini contents.
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
40
|
+
* assistant -> model. Front 1 (multimodality) -- user turns may
|
|
41
|
+
* carry image attachments, folded into inlineData parts (images
|
|
42
|
+
* first, then text). */
|
|
43
|
+
const contents = req.messages.map((m) => {
|
|
44
|
+
const role = m.role === 'assistant' ? 'model' : 'user';
|
|
45
|
+
if (m.role === 'user' && m.attachments && m.attachments.length > 0) {
|
|
46
|
+
const parts = m.attachments.map((a) => ({
|
|
47
|
+
inlineData: { mimeType: a.media_type, data: a.data },
|
|
48
|
+
}));
|
|
49
|
+
if (m.content && m.content.length > 0)
|
|
50
|
+
parts.push({ text: m.content });
|
|
51
|
+
return { role, parts };
|
|
52
|
+
}
|
|
53
|
+
return { role, parts: [{ text: m.content }] };
|
|
54
|
+
});
|
|
46
55
|
/* Translate Anthropic-shaped ToolSpec[] into Gemini
|
|
47
56
|
* functionDeclarations. The input_schema is JSON Schema in
|
|
48
57
|
* both, so the shape is compatible. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini_client.js","sourceRoot":"","sources":["../../src/llm/gemini_client.ts"],"names":[],"mappings":"AAwCA,MAAM,WAAW,GAAG,0DAA0D,CAAC;AAkC/E,MAAM,oBAAoB,GAAG,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"gemini_client.js","sourceRoot":"","sources":["../../src/llm/gemini_client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi_provider_client.d.ts","sourceRoot":"","sources":["../../src/llm/multi_provider_client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"multi_provider_client.d.ts","sourceRoot":"","sources":["../../src/llm/multi_provider_client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAYjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;QAClE,MAAM,EAAE,OAAO,CAAC;QAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC,CAAC;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB;4DACwD;IACxD,KAAK,EAAE,cAAc,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CAC7D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,cAAc,GAAG,iBAAiB,GAAG,IAAI,CAwF/E"}
|
|
@@ -7,6 +7,7 @@ import { MistralClient } from './mistral_client.js';
|
|
|
7
7
|
import { CohereClient } from './cohere_client.js';
|
|
8
8
|
import { OllamaClient } from './ollama_client.js';
|
|
9
9
|
import { ManagedBrainClient } from './managed_client.js';
|
|
10
|
+
import { FederationChildBrainClient } from './federation_client.js';
|
|
10
11
|
import { recordCostEvent } from '../core/cost_meter.js';
|
|
11
12
|
/**
|
|
12
13
|
* Returns a client that talks to the configured provider for the
|
|
@@ -70,6 +71,26 @@ export function makeUnifiedClient(sel) {
|
|
|
70
71
|
const c = new CohereClient({ apiKey: sel.api_key, defaultModel: sel.model });
|
|
71
72
|
return wrap(c, sel);
|
|
72
73
|
}
|
|
74
|
+
if (sel.provider === 'qwen') {
|
|
75
|
+
/* F4 -- Alibaba Qwen via DashScope (OpenAI-compatible). */
|
|
76
|
+
if (!sel.api_key)
|
|
77
|
+
return null;
|
|
78
|
+
const q = new OpenAIClient({
|
|
79
|
+
apiKey: sel.api_key, defaultModel: sel.model,
|
|
80
|
+
baseUrl: 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions',
|
|
81
|
+
});
|
|
82
|
+
return wrap(q, sel);
|
|
83
|
+
}
|
|
84
|
+
if (sel.provider === 'zai') {
|
|
85
|
+
/* F4 -- Zhipu GLM via the z.ai OpenAI-compatible endpoint. */
|
|
86
|
+
if (!sel.api_key)
|
|
87
|
+
return null;
|
|
88
|
+
const z = new OpenAIClient({
|
|
89
|
+
apiKey: sel.api_key, defaultModel: sel.model,
|
|
90
|
+
baseUrl: 'https://api.z.ai/api/paas/v4/chat/completions',
|
|
91
|
+
});
|
|
92
|
+
return wrap(z, sel);
|
|
93
|
+
}
|
|
73
94
|
if (sel.provider === 'ollama') {
|
|
74
95
|
/* PND-109 -- local open-weight brain. Keyless: api_key stays null;
|
|
75
96
|
* the base URL (default localhost:11434) is the only config. */
|
|
@@ -85,6 +106,12 @@ export function makeUnifiedClient(sel) {
|
|
|
85
106
|
});
|
|
86
107
|
return wrap(managed, sel);
|
|
87
108
|
}
|
|
109
|
+
if (sel.provider === 'federation') {
|
|
110
|
+
/* F4 -- route inference to the remote parent. Credentials come from
|
|
111
|
+
* federation.json + the vault (read inside the client), not sel. */
|
|
112
|
+
const fed = new FederationChildBrainClient({ tier: sel.tier });
|
|
113
|
+
return wrap(fed, sel);
|
|
114
|
+
}
|
|
88
115
|
return null;
|
|
89
116
|
}
|
|
90
117
|
function wrap(underlying, sel) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi_provider_client.js","sourceRoot":"","sources":["../../src/llm/multi_provider_client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"multi_provider_client.js","sourceRoot":"","sources":["../../src/llm/multi_provider_client.ts"],"names":[],"mappings":"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"}
|
|
@@ -62,6 +62,9 @@ export interface OpenAIClientOptions {
|
|
|
62
62
|
apiKey: string;
|
|
63
63
|
defaultModel?: string;
|
|
64
64
|
fetchImpl?: typeof fetch;
|
|
65
|
+
/** Full chat/completions URL. Defaults to OpenAI; override for any
|
|
66
|
+
* OpenAI-compatible provider (Qwen/DashScope, z.ai GLM, etc). */
|
|
67
|
+
baseUrl?: string;
|
|
65
68
|
}
|
|
66
69
|
export declare class OpenAIApiError extends Error {
|
|
67
70
|
status: number;
|
|
@@ -71,6 +74,7 @@ export declare class OpenAIClient {
|
|
|
71
74
|
private apiKey;
|
|
72
75
|
private fetchImpl;
|
|
73
76
|
private defaultModel;
|
|
77
|
+
private baseUrl;
|
|
74
78
|
constructor(opts: OpenAIClientOptions);
|
|
75
79
|
chat(req: OpenAIChatRequest): Promise<OpenAIChatResponse>;
|
|
76
80
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai_client.d.ts","sourceRoot":"","sources":["../../src/llm/openai_client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAMjD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;QAClE,MAAM,EAAE,OAAO,CAAC;QAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC,CAAC;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"openai_client.d.ts","sourceRoot":"","sources":["../../src/llm/openai_client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAMjD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;QAClE,MAAM,EAAE,OAAO,CAAC;QAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC,CAAC;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB;sEACkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA0CD,qBAAa,cAAe,SAAQ,KAAK;IACvC,MAAM,EAAE,MAAM,CAAC;gBACH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAK5C;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAS;gBAEZ,IAAI,EAAE,mBAAmB;IAU/B,IAAI,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA2LhE"}
|
|
@@ -12,6 +12,7 @@ export class OpenAIClient {
|
|
|
12
12
|
apiKey;
|
|
13
13
|
fetchImpl;
|
|
14
14
|
defaultModel;
|
|
15
|
+
baseUrl;
|
|
15
16
|
constructor(opts) {
|
|
16
17
|
if (!opts.apiKey || opts.apiKey.trim() === '') {
|
|
17
18
|
throw new Error('OpenAIClient: apiKey required');
|
|
@@ -19,6 +20,7 @@ export class OpenAIClient {
|
|
|
19
20
|
this.apiKey = opts.apiKey.trim();
|
|
20
21
|
this.fetchImpl = opts.fetchImpl ?? fetch;
|
|
21
22
|
this.defaultModel = opts.defaultModel ?? DEFAULT_OPENAI_MODEL;
|
|
23
|
+
this.baseUrl = opts.baseUrl ?? OPENAI_BASE;
|
|
22
24
|
}
|
|
23
25
|
async chat(req) {
|
|
24
26
|
if (req.tools && !req.runTool) {
|
|
@@ -44,10 +46,20 @@ export class OpenAIClient {
|
|
|
44
46
|
messages.push({ role: 'system', content: req.system });
|
|
45
47
|
}
|
|
46
48
|
for (const m of req.messages) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
/* Front 1 -- fold image attachments on a user turn into
|
|
50
|
+
* content parts (text first, then image_url data URLs). */
|
|
51
|
+
if (m.role === 'user' && m.attachments && m.attachments.length > 0) {
|
|
52
|
+
const parts = [];
|
|
53
|
+
if (m.content && m.content.length > 0)
|
|
54
|
+
parts.push({ type: 'text', text: m.content });
|
|
55
|
+
for (const a of m.attachments) {
|
|
56
|
+
parts.push({ type: 'image_url', image_url: { url: 'data:' + a.media_type + ';base64,' + a.data } });
|
|
57
|
+
}
|
|
58
|
+
messages.push({ role: m.role, content: parts });
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
messages.push({ role: m.role, content: m.content });
|
|
62
|
+
}
|
|
51
63
|
}
|
|
52
64
|
/* Translate ToolSpec[] into OpenAI's function-calling shape.
|
|
53
65
|
* input_schema is JSON Schema in both. */
|
|
@@ -74,7 +86,7 @@ export class OpenAIClient {
|
|
|
74
86
|
body.tools = tools;
|
|
75
87
|
body.tool_choice = 'auto';
|
|
76
88
|
}
|
|
77
|
-
const res = await this.fetchImpl(
|
|
89
|
+
const res = await this.fetchImpl(this.baseUrl, {
|
|
78
90
|
method: 'POST',
|
|
79
91
|
headers: {
|
|
80
92
|
'content-type': 'application/json',
|
|
@@ -101,7 +113,7 @@ export class OpenAIClient {
|
|
|
101
113
|
/* No tool calls -> we're done. Return the text. */
|
|
102
114
|
if (!aMessage.tool_calls || aMessage.tool_calls.length === 0 || finishReason !== 'tool_calls') {
|
|
103
115
|
return {
|
|
104
|
-
text: aMessage.content
|
|
116
|
+
text: typeof aMessage.content === 'string' ? aMessage.content : '',
|
|
105
117
|
tokensIn: totalIn,
|
|
106
118
|
tokensOut: totalOut,
|
|
107
119
|
model: serverModel,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai_client.js","sourceRoot":"","sources":["../../src/llm/openai_client.ts"],"names":[],"mappings":"AA0CA,MAAM,WAAW,GAAG,4CAA4C,CAAC;AACjE,MAAM,oBAAoB,GAAG,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"openai_client.js","sourceRoot":"","sources":["../../src/llm/openai_client.ts"],"names":[],"mappings":"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"}
|