infinicode 1.0.0 → 2.0.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/.opencode/plugins/home-logo-animation.tsx +120 -0
- package/.opencode/plugins/routing-mode-display.tsx +135 -0
- package/.opencode/themes/infinibot-gold.json +222 -0
- package/.opencode/tui.json +8 -0
- package/README.md +527 -75
- package/dist/ascii-video-animation.d.ts +2 -0
- package/dist/ascii-video-animation.js +243 -0
- package/dist/cli.js +195 -50
- package/dist/commands/console.d.ts +6 -0
- package/dist/commands/console.js +111 -0
- package/dist/commands/kernel-setup.d.ts +3 -0
- package/dist/commands/kernel-setup.js +303 -0
- package/dist/commands/mcp.d.ts +12 -0
- package/dist/commands/mcp.js +96 -0
- package/dist/commands/mission.d.ts +16 -0
- package/dist/commands/mission.js +301 -0
- package/dist/commands/models.d.ts +3 -1
- package/dist/commands/models.js +111 -55
- package/dist/commands/providers.d.ts +6 -0
- package/dist/commands/providers.js +95 -0
- package/dist/commands/run.d.ts +2 -1
- package/dist/commands/run.js +349 -59
- package/dist/commands/serve.d.ts +18 -0
- package/dist/commands/serve.js +127 -0
- package/dist/commands/setup.d.ts +1 -1
- package/dist/commands/setup.js +77 -44
- package/dist/commands/status.d.ts +2 -1
- package/dist/commands/status.js +46 -30
- package/dist/commands/workers.d.ts +5 -0
- package/dist/commands/workers.js +103 -0
- package/dist/kernel/autonomy/goal-loop.d.ts +49 -0
- package/dist/kernel/autonomy/goal-loop.js +113 -0
- package/dist/kernel/autonomy/index.d.ts +8 -0
- package/dist/kernel/autonomy/index.js +7 -0
- package/dist/kernel/browser/browser-controller.d.ts +57 -0
- package/dist/kernel/browser/browser-controller.js +175 -0
- package/dist/kernel/checkpoint-engine.d.ts +17 -0
- package/dist/kernel/checkpoint-engine.js +128 -0
- package/dist/kernel/command-system.d.ts +37 -0
- package/dist/kernel/command-system.js +239 -0
- package/dist/kernel/config-schema.d.ts +53 -0
- package/dist/kernel/config-schema.js +36 -0
- package/dist/kernel/event-bus.d.ts +19 -0
- package/dist/kernel/event-bus.js +65 -0
- package/dist/kernel/federation/auto-update.d.ts +36 -0
- package/dist/kernel/federation/auto-update.js +57 -0
- package/dist/kernel/federation/compute-router.d.ts +27 -0
- package/dist/kernel/federation/compute-router.js +44 -0
- package/dist/kernel/federation/config-sync.d.ts +33 -0
- package/dist/kernel/federation/config-sync.js +37 -0
- package/dist/kernel/federation/discovery.d.ts +11 -0
- package/dist/kernel/federation/discovery.js +44 -0
- package/dist/kernel/federation/event-bridge.d.ts +30 -0
- package/dist/kernel/federation/event-bridge.js +61 -0
- package/dist/kernel/federation/federation-plugin.d.ts +24 -0
- package/dist/kernel/federation/federation-plugin.js +35 -0
- package/dist/kernel/federation/federation.d.ts +126 -0
- package/dist/kernel/federation/federation.js +335 -0
- package/dist/kernel/federation/index.d.ts +31 -0
- package/dist/kernel/federation/index.js +23 -0
- package/dist/kernel/federation/moltfed-adapter.d.ts +30 -0
- package/dist/kernel/federation/moltfed-adapter.js +52 -0
- package/dist/kernel/federation/moltfed-connector.d.ts +98 -0
- package/dist/kernel/federation/moltfed-connector.js +193 -0
- package/dist/kernel/federation/node-identity.d.ts +19 -0
- package/dist/kernel/federation/node-identity.js +86 -0
- package/dist/kernel/federation/peer-mesh.d.ts +46 -0
- package/dist/kernel/federation/peer-mesh.js +117 -0
- package/dist/kernel/federation/protocol.d.ts +20 -0
- package/dist/kernel/federation/protocol.js +61 -0
- package/dist/kernel/federation/role-context.d.ts +5 -0
- package/dist/kernel/federation/role-context.js +45 -0
- package/dist/kernel/federation/telemetry.d.ts +21 -0
- package/dist/kernel/federation/telemetry.js +138 -0
- package/dist/kernel/federation/transport-http.d.ts +44 -0
- package/dist/kernel/federation/transport-http.js +207 -0
- package/dist/kernel/federation/types.d.ts +212 -0
- package/dist/kernel/federation/types.js +3 -0
- package/dist/kernel/free-providers.d.ts +28 -0
- package/dist/kernel/free-providers.js +162 -0
- package/dist/kernel/frontend-scoring.d.ts +21 -0
- package/dist/kernel/frontend-scoring.js +125 -0
- package/dist/kernel/index.d.ts +63 -0
- package/dist/kernel/index.js +45 -0
- package/dist/kernel/kernel.d.ts +75 -0
- package/dist/kernel/kernel.js +223 -0
- package/dist/kernel/logger.d.ts +18 -0
- package/dist/kernel/logger.js +26 -0
- package/dist/kernel/mcp/index.d.ts +9 -0
- package/dist/kernel/mcp/index.js +8 -0
- package/dist/kernel/mcp/mcp-server.d.ts +27 -0
- package/dist/kernel/mcp/mcp-server.js +178 -0
- package/dist/kernel/mission-engine.d.ts +42 -0
- package/dist/kernel/mission-engine.js +160 -0
- package/dist/kernel/orchestrator.d.ts +51 -0
- package/dist/kernel/orchestrator.js +226 -0
- package/dist/kernel/plugin-manager.d.ts +28 -0
- package/dist/kernel/plugin-manager.js +76 -0
- package/dist/kernel/plugins/browser-plugin.d.ts +22 -0
- package/dist/kernel/plugins/browser-plugin.js +34 -0
- package/dist/kernel/plugins/dashboard-plugin.d.ts +17 -0
- package/dist/kernel/plugins/dashboard-plugin.js +72 -0
- package/dist/kernel/plugins/discord-plugin.d.ts +11 -0
- package/dist/kernel/plugins/discord-plugin.js +35 -0
- package/dist/kernel/plugins/metrics-plugin.d.ts +33 -0
- package/dist/kernel/plugins/metrics-plugin.js +86 -0
- package/dist/kernel/plugins/search-plugin.d.ts +17 -0
- package/dist/kernel/plugins/search-plugin.js +20 -0
- package/dist/kernel/plugins/slack-plugin.d.ts +11 -0
- package/dist/kernel/plugins/slack-plugin.js +35 -0
- package/dist/kernel/plugins/telegram-plugin.d.ts +20 -0
- package/dist/kernel/plugins/telegram-plugin.js +122 -0
- package/dist/kernel/policies.d.ts +33 -0
- package/dist/kernel/policies.js +105 -0
- package/dist/kernel/provider-discovery.d.ts +41 -0
- package/dist/kernel/provider-discovery.js +179 -0
- package/dist/kernel/provider-manager.d.ts +38 -0
- package/dist/kernel/provider-manager.js +206 -0
- package/dist/kernel/provider-url.d.ts +18 -0
- package/dist/kernel/provider-url.js +45 -0
- package/dist/kernel/providers/gemini-provider.d.ts +43 -0
- package/dist/kernel/providers/gemini-provider.js +203 -0
- package/dist/kernel/providers/ollama-provider.d.ts +44 -0
- package/dist/kernel/providers/ollama-provider.js +241 -0
- package/dist/kernel/providers/openai-compatible-provider.d.ts +43 -0
- package/dist/kernel/providers/openai-compatible-provider.js +233 -0
- package/dist/kernel/recovery-manager.d.ts +38 -0
- package/dist/kernel/recovery-manager.js +156 -0
- package/dist/kernel/router.d.ts +44 -0
- package/dist/kernel/router.js +222 -0
- package/dist/kernel/sample-missions.d.ts +11 -0
- package/dist/kernel/sample-missions.js +132 -0
- package/dist/kernel/scheduler.d.ts +30 -0
- package/dist/kernel/scheduler.js +147 -0
- package/dist/kernel/sdk/harness-sdk.d.ts +37 -0
- package/dist/kernel/sdk/harness-sdk.js +48 -0
- package/dist/kernel/sdk/plugin-sdk.d.ts +27 -0
- package/dist/kernel/sdk/plugin-sdk.js +40 -0
- package/dist/kernel/search/search-controller.d.ts +32 -0
- package/dist/kernel/search/search-controller.js +141 -0
- package/dist/kernel/setup.d.ts +13 -0
- package/dist/kernel/setup.js +59 -0
- package/dist/kernel/types.d.ts +479 -0
- package/dist/kernel/types.js +7 -0
- package/dist/kernel/verification-engine.d.ts +33 -0
- package/dist/kernel/verification-engine.js +287 -0
- package/dist/kernel/worker-runtime.d.ts +66 -0
- package/dist/kernel/worker-runtime.js +261 -0
- package/dist/kernel/workers/browser-worker.d.ts +6 -0
- package/dist/kernel/workers/browser-worker.js +92 -0
- package/dist/kernel/workers/builtin-workers.d.ts +20 -0
- package/dist/kernel/workers/builtin-workers.js +120 -0
- package/dist/kernel/workers/research-worker.d.ts +5 -0
- package/dist/kernel/workers/research-worker.js +90 -0
- package/dist/prompt-ascii-video-animation.d.ts +2 -0
- package/dist/prompt-ascii-video-animation.js +243 -0
- package/package.json +43 -9
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export function definePlugin(name) {
|
|
2
|
+
const manifest = { name, version: '0.1.0' };
|
|
3
|
+
let subscriptions;
|
|
4
|
+
let onEventFn;
|
|
5
|
+
const commands = [];
|
|
6
|
+
let onRegisterFn;
|
|
7
|
+
let onDestroyFn;
|
|
8
|
+
const builder = {
|
|
9
|
+
version(v) { manifest.version = v; return this; },
|
|
10
|
+
description(d) { manifest.description = d; return this; },
|
|
11
|
+
subscribe(types, handler) {
|
|
12
|
+
subscriptions = types;
|
|
13
|
+
onEventFn = handler;
|
|
14
|
+
manifest.subscriptions = types;
|
|
15
|
+
return this;
|
|
16
|
+
},
|
|
17
|
+
command(name, description, handler) {
|
|
18
|
+
commands.push({ name, description, handler });
|
|
19
|
+
return this;
|
|
20
|
+
},
|
|
21
|
+
onRegister(fn) { onRegisterFn = fn; return this; },
|
|
22
|
+
onDestroy(fn) { onDestroyFn = fn; return this; },
|
|
23
|
+
onEvent(handler) { onEventFn = handler; return this; },
|
|
24
|
+
build() {
|
|
25
|
+
if (commands.length > 0)
|
|
26
|
+
manifest.commands = commands;
|
|
27
|
+
const plugin = { manifest };
|
|
28
|
+
if (onRegisterFn)
|
|
29
|
+
plugin.onRegister = onRegisterFn;
|
|
30
|
+
if (onDestroyFn)
|
|
31
|
+
plugin.onDestroy = onDestroyFn;
|
|
32
|
+
if (onEventFn)
|
|
33
|
+
plugin.onEvent = onEventFn;
|
|
34
|
+
if (subscriptions)
|
|
35
|
+
manifest.subscriptions = subscriptions;
|
|
36
|
+
return plugin;
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
return builder;
|
|
40
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface SearchResult {
|
|
2
|
+
title: string;
|
|
3
|
+
url: string;
|
|
4
|
+
snippet: string;
|
|
5
|
+
markdown?: string;
|
|
6
|
+
crawledAt?: number;
|
|
7
|
+
error?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface SearchOptions {
|
|
10
|
+
searxngUrl?: string;
|
|
11
|
+
/** Number of results to request from SearXNG. */
|
|
12
|
+
maxResults?: number;
|
|
13
|
+
/** Number of top results to crawl for full content. */
|
|
14
|
+
crawlTop?: number;
|
|
15
|
+
/** Per-request timeout ms. */
|
|
16
|
+
timeoutMs?: number;
|
|
17
|
+
/** Extra query params for SearXNG. */
|
|
18
|
+
searxngParams?: Record<string, string>;
|
|
19
|
+
}
|
|
20
|
+
export declare class SearchController {
|
|
21
|
+
private opts;
|
|
22
|
+
constructor(opts?: SearchOptions);
|
|
23
|
+
setOptions(opts: SearchOptions): void;
|
|
24
|
+
search(query: string): Promise<SearchResult[]>;
|
|
25
|
+
private querySearXNG;
|
|
26
|
+
private queryDuckDuckGo;
|
|
27
|
+
crawl(url: string): Promise<{
|
|
28
|
+
markdown: string;
|
|
29
|
+
text: string;
|
|
30
|
+
title: string;
|
|
31
|
+
} | null>;
|
|
32
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenKernel — Search Controller
|
|
3
|
+
*
|
|
4
|
+
* Default stack: SearXNG → Crawler → Markdown → LLM.
|
|
5
|
+
*
|
|
6
|
+
* 1. Query SearXNG /search?q=...&format=json → list of result URLs + snippets
|
|
7
|
+
* 2. Crawl each result URL (fetch HTML) → raw page
|
|
8
|
+
* 3. Convert to Markdown → readable text
|
|
9
|
+
* 4. (LLM summarization is performed by the research worker, not here)
|
|
10
|
+
*
|
|
11
|
+
* If SearXNG is not configured/unreachable, falls back to a generic
|
|
12
|
+
* DuckDuckGo HTML scrape so the research worker remains functional.
|
|
13
|
+
*/
|
|
14
|
+
import { htmlToMarkdown, stripHtml, extractTitle } from '../browser/browser-controller.js';
|
|
15
|
+
const DEFAULT_MAX = 8;
|
|
16
|
+
const DEFAULT_CRAWL_TOP = 3;
|
|
17
|
+
export class SearchController {
|
|
18
|
+
opts;
|
|
19
|
+
constructor(opts = {}) {
|
|
20
|
+
this.opts = { maxResults: DEFAULT_MAX, crawlTop: DEFAULT_CRAWL_TOP, timeoutMs: 15_000, ...opts };
|
|
21
|
+
}
|
|
22
|
+
setOptions(opts) {
|
|
23
|
+
this.opts = { ...this.opts, ...opts };
|
|
24
|
+
}
|
|
25
|
+
async search(query) {
|
|
26
|
+
const results = this.opts.searxngUrl
|
|
27
|
+
? await this.querySearXNG(query)
|
|
28
|
+
: await this.queryDuckDuckGo(query);
|
|
29
|
+
const crawlTop = Math.min(this.opts.crawlTop ?? DEFAULT_CRAWL_TOP, results.length);
|
|
30
|
+
for (let i = 0; i < crawlTop; i++) {
|
|
31
|
+
const r = results[i];
|
|
32
|
+
if (!r.url)
|
|
33
|
+
continue;
|
|
34
|
+
const crawled = await this.crawl(r.url);
|
|
35
|
+
if (crawled) {
|
|
36
|
+
r.markdown = crawled.markdown;
|
|
37
|
+
r.snippet = r.snippet || crawled.text.slice(0, 280);
|
|
38
|
+
r.crawledAt = Date.now();
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
r.error = 'crawl failed';
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return results;
|
|
45
|
+
}
|
|
46
|
+
async querySearXNG(query) {
|
|
47
|
+
const url = new URL(`${this.opts.searxngUrl}/search`);
|
|
48
|
+
url.searchParams.set('q', query);
|
|
49
|
+
url.searchParams.set('format', 'json');
|
|
50
|
+
if (this.opts.searxngParams) {
|
|
51
|
+
for (const [k, v] of Object.entries(this.opts.searxngParams)) {
|
|
52
|
+
url.searchParams.set(k, v);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
const response = await fetch(url.toString(), {
|
|
57
|
+
headers: { Accept: 'application/json', 'User-Agent': 'OpenKernel-Search/1.0' },
|
|
58
|
+
signal: AbortSignal.timeout(this.opts.timeoutMs ?? 15_000),
|
|
59
|
+
});
|
|
60
|
+
if (!response.ok)
|
|
61
|
+
throw new Error(`SearXNG HTTP ${response.status}`);
|
|
62
|
+
const data = (await response.json());
|
|
63
|
+
return (data.results ?? [])
|
|
64
|
+
.slice(0, this.opts.maxResults ?? DEFAULT_MAX)
|
|
65
|
+
.map(r => ({
|
|
66
|
+
title: r.title ?? r.url ?? '',
|
|
67
|
+
url: r.url ?? '',
|
|
68
|
+
snippet: r.content ?? '',
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
73
|
+
// fall back to DuckDuckGo
|
|
74
|
+
const ddg = await this.queryDuckDuckGo(query);
|
|
75
|
+
ddg.forEach(r => { r.error = `searxng failed (${message}); ddg fallback`; });
|
|
76
|
+
return ddg;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async queryDuckDuckGo(query) {
|
|
80
|
+
const url = `https://html.duckduckgo.com/html/?q=${encodeURIComponent(query)}`;
|
|
81
|
+
try {
|
|
82
|
+
const response = await fetch(url, {
|
|
83
|
+
headers: { 'User-Agent': 'OpenKernel-Search/1.0' },
|
|
84
|
+
signal: AbortSignal.timeout(this.opts.timeoutMs ?? 15_000),
|
|
85
|
+
});
|
|
86
|
+
if (!response.ok)
|
|
87
|
+
throw new Error(`DuckDuckGo HTTP ${response.status}`);
|
|
88
|
+
const html = await response.text();
|
|
89
|
+
return parseDuckDuckGo(html).slice(0, this.opts.maxResults ?? DEFAULT_MAX);
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
93
|
+
return [{ title: 'search failed', url: '', snippet: message, error: message }];
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async crawl(url) {
|
|
97
|
+
try {
|
|
98
|
+
const response = await fetch(url, {
|
|
99
|
+
headers: { 'User-Agent': 'OpenKernel-Crawler/1.0' },
|
|
100
|
+
signal: AbortSignal.timeout(this.opts.timeoutMs ?? 15_000),
|
|
101
|
+
});
|
|
102
|
+
if (!response.ok)
|
|
103
|
+
return null;
|
|
104
|
+
const html = await response.text();
|
|
105
|
+
return {
|
|
106
|
+
title: extractTitle(html),
|
|
107
|
+
text: stripHtml(html),
|
|
108
|
+
markdown: htmlToMarkdown(html),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function parseDuckDuckGo(html) {
|
|
117
|
+
const results = [];
|
|
118
|
+
const linkRegex = /<a[^>]+class="result__a"[^>]*href="([^"]+)"[^>]*>([^<]*)<\/a>/gi;
|
|
119
|
+
const snippetRegex = /<a[^>]+class="result__snippet"[^>]*>([\s\S]*?)<\/a>/gi;
|
|
120
|
+
const links = [...html.matchAll(linkRegex)];
|
|
121
|
+
const snippets = [...html.matchAll(snippetRegex)];
|
|
122
|
+
for (let i = 0; i < links.length; i++) {
|
|
123
|
+
const href = links[i][1] ?? '';
|
|
124
|
+
const title = stripHtml(links[i][2] ?? '');
|
|
125
|
+
const snippet = stripHtml(snippets[i]?.[1] ?? '');
|
|
126
|
+
results.push({ title, url: decodeDdgHref(href), snippet });
|
|
127
|
+
}
|
|
128
|
+
return results;
|
|
129
|
+
}
|
|
130
|
+
function decodeDdgHref(href) {
|
|
131
|
+
const match = href.match(/uddg=([^&]+)/);
|
|
132
|
+
if (match) {
|
|
133
|
+
try {
|
|
134
|
+
return decodeURIComponent(match[1]);
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return href;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return href.startsWith('//') ? `https:${href}` : href;
|
|
141
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bridge infinicode config (Conf) → OpenKernel Kernel instance.
|
|
3
|
+
* Registers the configured Ollama master + cloud providers as providers.
|
|
4
|
+
* Honors per-worker model pins by injecting them into the router.
|
|
5
|
+
*/
|
|
6
|
+
import type Conf from 'conf';
|
|
7
|
+
import { Kernel } from '../kernel/index.js';
|
|
8
|
+
import type { Logger } from '../kernel/index.js';
|
|
9
|
+
import type { InfinicodeConfig } from './config-schema.js';
|
|
10
|
+
export type { InfinicodeConfig, CloudProviderConfig, WorkerModelPref } from './config-schema.js';
|
|
11
|
+
export declare function buildKernelFromConfig(config: Conf<InfinicodeConfig>, options?: {
|
|
12
|
+
logger?: Logger;
|
|
13
|
+
}): Kernel;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Kernel, OllamaProvider, OpenAICompatibleProvider, GeminiProvider } from '../kernel/index.js';
|
|
2
|
+
import { getProviderPreset } from './free-providers.js';
|
|
3
|
+
export function buildKernelFromConfig(config, options) {
|
|
4
|
+
const masterUrl = config.get('masterUrl');
|
|
5
|
+
const tailscaleMasterUrl = config.get('tailscaleMasterUrl');
|
|
6
|
+
const defaultModel = config.get('defaultModel');
|
|
7
|
+
const ollamaOptions = {
|
|
8
|
+
id: 'ollama',
|
|
9
|
+
name: 'Ollama',
|
|
10
|
+
baseURL: masterUrl,
|
|
11
|
+
fallbackURL: tailscaleMasterUrl,
|
|
12
|
+
defaultModel,
|
|
13
|
+
};
|
|
14
|
+
const kernel = new Kernel({ loadBuiltinWorkers: true, logger: options?.logger });
|
|
15
|
+
kernel.registerProvider('ollama', new OllamaProvider(ollamaOptions));
|
|
16
|
+
// Register cloud providers
|
|
17
|
+
const cloudProviders = config.get('cloudProviders') ?? [];
|
|
18
|
+
for (const cfg of cloudProviders) {
|
|
19
|
+
if (!cfg.enabled)
|
|
20
|
+
continue;
|
|
21
|
+
const preset = getProviderPreset(cfg.id);
|
|
22
|
+
if (cfg.id === 'gemini') {
|
|
23
|
+
const geminiOptions = {
|
|
24
|
+
id: cfg.id,
|
|
25
|
+
name: cfg.name,
|
|
26
|
+
apiKey: cfg.apiKey ?? '',
|
|
27
|
+
baseURL: cfg.baseURL,
|
|
28
|
+
knownModels: preset?.knownModels ?? [],
|
|
29
|
+
};
|
|
30
|
+
kernel.registerProvider(cfg.id, new GeminiProvider(geminiOptions));
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const options = {
|
|
34
|
+
id: cfg.id,
|
|
35
|
+
name: cfg.name,
|
|
36
|
+
baseURL: cfg.baseURL,
|
|
37
|
+
apiKey: cfg.apiKey,
|
|
38
|
+
headerName: cfg.headerName,
|
|
39
|
+
knownModels: preset?.knownModels ?? [],
|
|
40
|
+
};
|
|
41
|
+
kernel.registerProvider(cfg.id, new OpenAICompatibleProvider(options));
|
|
42
|
+
}
|
|
43
|
+
// Apply per-worker model pins — the worker runtime honors them when routing.
|
|
44
|
+
const workerModels = config.get('workerModels') ?? {};
|
|
45
|
+
if (workerModels && Object.keys(workerModels).length > 0) {
|
|
46
|
+
const pins = new Map();
|
|
47
|
+
for (const [type, pref] of Object.entries(workerModels)) {
|
|
48
|
+
if (pref)
|
|
49
|
+
pins.set(type, pref);
|
|
50
|
+
}
|
|
51
|
+
kernel.workerRuntime.setWorkerPins(pins);
|
|
52
|
+
}
|
|
53
|
+
// Apply the configured default policy.
|
|
54
|
+
const policyName = config.get('policy');
|
|
55
|
+
if (policyName) {
|
|
56
|
+
kernel.setDefaultPolicy(policyName);
|
|
57
|
+
}
|
|
58
|
+
return kernel;
|
|
59
|
+
}
|