@jellyos/agent 0.1.3 → 0.1.4
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 +9 -9
- package/dist/api/Registry.js +3 -1
- package/dist/api/Registry.js.map +1 -1
- package/dist/cli.js +10 -1
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/models/CostTracker.d.ts +66 -0
- package/dist/models/CostTracker.d.ts.map +1 -0
- package/dist/models/CostTracker.js +148 -0
- package/dist/models/CostTracker.js.map +1 -0
- package/dist/models/ModelRegistry.d.ts +146 -0
- package/dist/models/ModelRegistry.d.ts.map +1 -0
- package/dist/models/ModelRegistry.js +400 -0
- package/dist/models/ModelRegistry.js.map +1 -0
- package/dist/models/index.d.ts +5 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +3 -0
- package/dist/models/index.js.map +1 -0
- package/dist/runner/AgentRunner.d.ts +5 -1
- package/dist/runner/AgentRunner.d.ts.map +1 -1
- package/dist/runner/AgentRunner.js +18 -8
- package/dist/runner/AgentRunner.js.map +1 -1
- package/dist/runner/ModelClient.d.ts +16 -5
- package/dist/runner/ModelClient.d.ts.map +1 -1
- package/dist/runner/ModelClient.js +69 -23
- package/dist/runner/ModelClient.js.map +1 -1
- package/dist/runner/SwarmRouter.d.ts +4 -1
- package/dist/runner/SwarmRouter.d.ts.map +1 -1
- package/dist/runner/SwarmRouter.js +15 -7
- package/dist/runner/SwarmRouter.js.map +1 -1
- package/dist/session/SessionManager.d.ts +2 -2
- package/dist/session/SessionManager.js +3 -3
- package/dist/session/SessionManager.js.map +1 -1
- package/dist/tools/NewsSentiment.d.ts +67 -0
- package/dist/tools/NewsSentiment.d.ts.map +1 -0
- package/dist/tools/NewsSentiment.js +199 -0
- package/dist/tools/NewsSentiment.js.map +1 -0
- package/dist/tools/PriceFeed.d.ts +103 -0
- package/dist/tools/PriceFeed.d.ts.map +1 -0
- package/dist/tools/PriceFeed.js +230 -0
- package/dist/tools/PriceFeed.js.map +1 -0
- package/dist/tools/TechnicalAnalysis.d.ts +73 -0
- package/dist/tools/TechnicalAnalysis.d.ts.map +1 -0
- package/dist/tools/TechnicalAnalysis.js +272 -0
- package/dist/tools/TechnicalAnalysis.js.map +1 -0
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tui/App.d.ts +7 -5
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +178 -56
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/StatusBar.js +1 -1
- package/dist/tui/StatusBar.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ModelRegistry — dynamic model discovery, tiering, and routing.
|
|
3
|
+
*
|
|
4
|
+
* Queries OpenRouter's /models endpoint at startup to build a local registry
|
|
5
|
+
* of all available models. Classifies them into tiers (orchestrator / analyst /
|
|
6
|
+
* worker / free), tracks performance, handles deprecation, and exposes
|
|
7
|
+
* model selection as both a tool and a REPL command.
|
|
8
|
+
*
|
|
9
|
+
* Also supports direct provider routing (Anthropic/OpenAI/Google keys) for
|
|
10
|
+
* models that can be reached cheaper outside OpenRouter.
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
13
|
+
import { join } from "node:path";
|
|
14
|
+
import { homedir } from "node:os";
|
|
15
|
+
import { Type } from "@sinclair/typebox";
|
|
16
|
+
// ── Tier classification ───────────────────────────────────────────────────────
|
|
17
|
+
/**
|
|
18
|
+
* Tier classification rules (priority-ordered).
|
|
19
|
+
* Models match the first rule whose pattern and context-length requirements
|
|
20
|
+
* are met. Fallback is "worker".
|
|
21
|
+
*/
|
|
22
|
+
const TIER_RULES = [
|
|
23
|
+
// Orchestrator: top-tier reasoning models
|
|
24
|
+
{ tier: "orchestrator", pattern: /claude.*opus|o1-pro|gemini-2\.[5-9]-pro|gpt-4\.5|deepseek-v4-671b/i, notFree: true },
|
|
25
|
+
// Analyst: strong reasoning, moderate cost
|
|
26
|
+
{ tier: "analyst", pattern: /claude.*sonnet|gpt-4o(?!-mini)|gemini-(?!.*flash)|gemma-4.*(2[7-9]b|3[0-9]b)|deepseek.*(?:r1|chat)|grok.*(?:build|3)/i, notFree: true },
|
|
27
|
+
// Free tier: zero-cost models
|
|
28
|
+
{ tier: "free", pattern: /:free$|openrouter\/free/i },
|
|
29
|
+
// Default: worker
|
|
30
|
+
{ tier: "worker", pattern: /.*/ },
|
|
31
|
+
];
|
|
32
|
+
export function classifyModel(model) {
|
|
33
|
+
for (const rule of TIER_RULES) {
|
|
34
|
+
if (!rule.pattern.test(model.id))
|
|
35
|
+
continue;
|
|
36
|
+
if (rule.notFree && parseFloat(model.pricing.prompt || "0") <= 0)
|
|
37
|
+
continue;
|
|
38
|
+
if (rule.minContext && (model.context_length || 0) < rule.minContext)
|
|
39
|
+
continue;
|
|
40
|
+
if (rule.minTokens && (model.top_provider.max_completion_tokens || 0) < rule.minTokens)
|
|
41
|
+
continue;
|
|
42
|
+
return rule.tier;
|
|
43
|
+
}
|
|
44
|
+
return "worker";
|
|
45
|
+
}
|
|
46
|
+
// ── ModelRegistry class ───────────────────────────────────────────────────────
|
|
47
|
+
const JELLY_HOME = process.env.JELLYOS_HOME ?? join(homedir(), ".jelly");
|
|
48
|
+
const CACHE_FILE = join(JELLY_HOME, "models.json");
|
|
49
|
+
const CACHE_TTL = 6 * 60 * 60 * 1000; // 6 hours
|
|
50
|
+
export class ModelRegistry {
|
|
51
|
+
allModels = [];
|
|
52
|
+
tieredPool = { orchestrator: [], analyst: [], worker: [], free: [] };
|
|
53
|
+
modelMap = new Map();
|
|
54
|
+
loaded = false;
|
|
55
|
+
lastFetch = 0;
|
|
56
|
+
// ── Initialisation ────────────────────────────────────────────────────────
|
|
57
|
+
/** Query OpenRouter /models and build the tiered pool. Called once at startup. */
|
|
58
|
+
async initialise(apiKey) {
|
|
59
|
+
const key = apiKey ?? process.env.OPENROUTER_API_KEY;
|
|
60
|
+
if (!key) {
|
|
61
|
+
this.loadFromCache();
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
// Try live fetch
|
|
65
|
+
try {
|
|
66
|
+
const res = await fetch("https://openrouter.ai/api/v1/models", {
|
|
67
|
+
headers: { Authorization: `Bearer ${key}`, "User-Agent": "JellyOS/1.0" },
|
|
68
|
+
signal: AbortSignal.timeout(15_000),
|
|
69
|
+
});
|
|
70
|
+
if (res.ok) {
|
|
71
|
+
const body = await res.json();
|
|
72
|
+
this.allModels = body.data ?? [];
|
|
73
|
+
this.lastFetch = Date.now();
|
|
74
|
+
this.saveCache();
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
this.loadFromCache();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
this.loadFromCache();
|
|
82
|
+
}
|
|
83
|
+
this.rebuildTiers();
|
|
84
|
+
this.loaded = true;
|
|
85
|
+
}
|
|
86
|
+
/** Rebuild tier classifications (call after cache load or fetch). */
|
|
87
|
+
rebuildTiers() {
|
|
88
|
+
this.tieredPool = { orchestrator: [], analyst: [], worker: [], free: [] };
|
|
89
|
+
this.modelMap.clear();
|
|
90
|
+
for (const m of this.allModels) {
|
|
91
|
+
const tier = classifyModel(m);
|
|
92
|
+
const cost = parseFloat(m.pricing.prompt || "0") * 1_000_000_000; // nano-dollars per 1K
|
|
93
|
+
const tm = {
|
|
94
|
+
tier, model: m, costPer1K: cost,
|
|
95
|
+
available: true, failures: 0, lastFailure: 0,
|
|
96
|
+
avgLatency: 0, uses: 0,
|
|
97
|
+
};
|
|
98
|
+
this.tieredPool[tier].push(tm);
|
|
99
|
+
this.modelMap.set(m.id, tm);
|
|
100
|
+
}
|
|
101
|
+
// Sort each tier by cost (cheapest first within each tier)
|
|
102
|
+
for (const tier of ["orchestrator", "analyst", "worker", "free"]) {
|
|
103
|
+
this.tieredPool[tier].sort((a, b) => a.costPer1K - b.costPer1K);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// ── Cache ─────────────────────────────────────────────────────────────────
|
|
107
|
+
saveCache() {
|
|
108
|
+
try {
|
|
109
|
+
mkdirSync(JELLY_HOME, { recursive: true });
|
|
110
|
+
writeFileSync(CACHE_FILE, JSON.stringify({
|
|
111
|
+
models: this.allModels,
|
|
112
|
+
fetchedAt: this.lastFetch,
|
|
113
|
+
version: 1,
|
|
114
|
+
}));
|
|
115
|
+
}
|
|
116
|
+
catch { /* cache write is best-effort */ }
|
|
117
|
+
}
|
|
118
|
+
loadFromCache() {
|
|
119
|
+
try {
|
|
120
|
+
if (!existsSync(CACHE_FILE))
|
|
121
|
+
return;
|
|
122
|
+
const raw = JSON.parse(readFileSync(CACHE_FILE, "utf-8"));
|
|
123
|
+
if (Array.isArray(raw.models)) {
|
|
124
|
+
this.allModels = raw.models;
|
|
125
|
+
this.lastFetch = raw.fetchedAt ?? 0;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch { /* cache read is best-effort */ }
|
|
129
|
+
}
|
|
130
|
+
/** True if cache is stale and we should re-fetch on next opportunity. */
|
|
131
|
+
get cacheStale() {
|
|
132
|
+
return Date.now() - this.lastFetch > CACHE_TTL;
|
|
133
|
+
}
|
|
134
|
+
// ── Model selection ────────────────────────────────────────────────────────
|
|
135
|
+
/**
|
|
136
|
+
* Pick the best available model for a given tier.
|
|
137
|
+
* Favours lower cost among available models, excluding those with >= 3
|
|
138
|
+
* consecutive failures (which get a 5-minute cooldown).
|
|
139
|
+
*/
|
|
140
|
+
pick(tier) {
|
|
141
|
+
const pool = this.tieredPool[tier] ?? this.tieredPool["worker"];
|
|
142
|
+
const now = Date.now();
|
|
143
|
+
for (const tm of pool) {
|
|
144
|
+
// Cooldown: if 3+ consecutive failures, wait 5 minutes
|
|
145
|
+
if (!tm.available || (tm.failures >= 3 && now - tm.lastFailure < 300_000))
|
|
146
|
+
continue;
|
|
147
|
+
return tm.model;
|
|
148
|
+
}
|
|
149
|
+
// Fallback: return any available model from any tier
|
|
150
|
+
for (const t of ["worker", "analyst", "orchestrator", "free"]) {
|
|
151
|
+
for (const tm of this.tieredPool[t]) {
|
|
152
|
+
if (tm.available && tm.failures < 3)
|
|
153
|
+
return tm.model;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Build a full ModelConfig chain from the tiered pool.
|
|
160
|
+
* Uses user-configured models from env first, then fills with tiered picks.
|
|
161
|
+
*/
|
|
162
|
+
buildModelChain(userModels) {
|
|
163
|
+
const env = process.env;
|
|
164
|
+
const tokens = parseInt(env.MAX_TOKENS ?? "8192");
|
|
165
|
+
const temp = parseFloat(env.TEMPERATURE ?? "0.7");
|
|
166
|
+
const results = [];
|
|
167
|
+
// User-specified models always come first
|
|
168
|
+
for (const mid of userModels) {
|
|
169
|
+
const cfg = this.buildConfig(mid, tokens, temp);
|
|
170
|
+
if (cfg)
|
|
171
|
+
results.push(cfg);
|
|
172
|
+
}
|
|
173
|
+
if (!this.loaded)
|
|
174
|
+
return results;
|
|
175
|
+
// Fill remaining slots with tiered picks (up to 5 total, max 2 free)
|
|
176
|
+
const tiers = ["orchestrator", "analyst", "analyst", "worker", "free"];
|
|
177
|
+
let freeUsed = 0;
|
|
178
|
+
for (const tier of tiers) {
|
|
179
|
+
if (results.length >= 5)
|
|
180
|
+
break;
|
|
181
|
+
if (tier === "free" && freeUsed >= 2)
|
|
182
|
+
continue;
|
|
183
|
+
const picked = this.pick(tier);
|
|
184
|
+
if (!picked)
|
|
185
|
+
continue;
|
|
186
|
+
// Skip if already in the list
|
|
187
|
+
if (results.some(r => r.model === picked.id))
|
|
188
|
+
continue;
|
|
189
|
+
const cfg = this.buildConfig(picked.id, tokens, temp);
|
|
190
|
+
if (cfg) {
|
|
191
|
+
results.push(cfg);
|
|
192
|
+
if (tier === "free")
|
|
193
|
+
freeUsed++;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return results.slice(0, 5);
|
|
197
|
+
}
|
|
198
|
+
/** Build a single ModelConfig, preferring direct provider when possible. */
|
|
199
|
+
buildConfig(modelId, maxTokens, temperature) {
|
|
200
|
+
const env = process.env;
|
|
201
|
+
// Direct Anthropic routing (cheaper — no OR markup)
|
|
202
|
+
if (modelId.startsWith("anthropic/") && env.ANTHROPIC_API_KEY) {
|
|
203
|
+
const model = modelId.replace("anthropic/", "");
|
|
204
|
+
return {
|
|
205
|
+
baseUrl: "https://api.anthropic.com/v1",
|
|
206
|
+
apiKey: env.ANTHROPIC_API_KEY,
|
|
207
|
+
model,
|
|
208
|
+
maxTokens,
|
|
209
|
+
temperature,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
// Direct OpenAI routing
|
|
213
|
+
if (modelId.startsWith("openai/") && env.OPENAI_API_KEY) {
|
|
214
|
+
const model = modelId.replace("openai/", "");
|
|
215
|
+
return {
|
|
216
|
+
baseUrl: env.OPENAI_BASE_URL ?? "https://api.openai.com/v1",
|
|
217
|
+
apiKey: env.OPENAI_API_KEY,
|
|
218
|
+
model,
|
|
219
|
+
maxTokens,
|
|
220
|
+
temperature,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
// OpenRouter fallback
|
|
224
|
+
if (env.OPENROUTER_API_KEY) {
|
|
225
|
+
return {
|
|
226
|
+
baseUrl: "https://openrouter.ai/api/v1",
|
|
227
|
+
apiKey: env.OPENROUTER_API_KEY,
|
|
228
|
+
model: modelId,
|
|
229
|
+
maxTokens,
|
|
230
|
+
temperature,
|
|
231
|
+
siteUrl: env.OPENROUTER_SITE_URL ?? "https://jellychain.fun",
|
|
232
|
+
siteName: env.OPENROUTER_SITE_NAME ?? "JellyOS",
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
// Local model
|
|
236
|
+
if (env.OPENAI_BASE_URL) {
|
|
237
|
+
return {
|
|
238
|
+
baseUrl: env.OPENAI_BASE_URL,
|
|
239
|
+
apiKey: env.OPENAI_API_KEY ?? "local",
|
|
240
|
+
model: modelId,
|
|
241
|
+
maxTokens,
|
|
242
|
+
temperature,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
// ── Failure tracking ─────────────────────────────────────────────────────
|
|
248
|
+
recordFailure(modelId) {
|
|
249
|
+
const tm = this.modelMap.get(modelId);
|
|
250
|
+
if (!tm)
|
|
251
|
+
return;
|
|
252
|
+
tm.failures++;
|
|
253
|
+
tm.lastFailure = Date.now();
|
|
254
|
+
if (tm.failures >= 3)
|
|
255
|
+
tm.available = false;
|
|
256
|
+
}
|
|
257
|
+
recordSuccess(modelId, latencyMs) {
|
|
258
|
+
const tm = this.modelMap.get(modelId);
|
|
259
|
+
if (!tm)
|
|
260
|
+
return;
|
|
261
|
+
tm.failures = 0;
|
|
262
|
+
tm.available = true;
|
|
263
|
+
tm.avgLatency = tm.uses === 0 ? latencyMs : (tm.avgLatency * tm.uses + latencyMs) / (tm.uses + 1);
|
|
264
|
+
tm.uses++;
|
|
265
|
+
}
|
|
266
|
+
/** Mark a model as permanently deprecated (404, model removed). */
|
|
267
|
+
markDeprecated(modelId) {
|
|
268
|
+
const tm = this.modelMap.get(modelId);
|
|
269
|
+
if (!tm)
|
|
270
|
+
return;
|
|
271
|
+
tm.available = false;
|
|
272
|
+
tm.failures = 999; // never recover
|
|
273
|
+
}
|
|
274
|
+
getTier(modelId) {
|
|
275
|
+
return this.modelMap.get(modelId)?.tier ?? "worker";
|
|
276
|
+
}
|
|
277
|
+
// ── Queries ───────────────────────────────────────────────────────────────
|
|
278
|
+
get modelCount() {
|
|
279
|
+
return this.allModels.length;
|
|
280
|
+
}
|
|
281
|
+
/** Search / filter models by keyword (case-insensitive). */
|
|
282
|
+
search(query, maxResults = 30) {
|
|
283
|
+
const q = query.toLowerCase();
|
|
284
|
+
const results = [];
|
|
285
|
+
for (const tm of this.modelMap.values()) {
|
|
286
|
+
if (tm.model.id.toLowerCase().includes(q) || tm.model.name.toLowerCase().includes(q)) {
|
|
287
|
+
results.push(tm);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return results.slice(0, maxResults);
|
|
291
|
+
}
|
|
292
|
+
/** Get all models for a tier. */
|
|
293
|
+
getPool(tier) {
|
|
294
|
+
return [...this.tieredPool[tier]];
|
|
295
|
+
}
|
|
296
|
+
/** Human-readable summary of the current pool. */
|
|
297
|
+
summary() {
|
|
298
|
+
const lines = [];
|
|
299
|
+
for (const tier of ["orchestrator", "analyst", "worker", "free"]) {
|
|
300
|
+
const pool = this.tieredPool[tier];
|
|
301
|
+
const avail = pool.filter(tm => tm.available && tm.failures < 3).length;
|
|
302
|
+
lines.push(`${tier}: ${avail}/${pool.length} available`);
|
|
303
|
+
}
|
|
304
|
+
return `Model pool (${this.allModels.length} total):\n` + lines.join("\n");
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Find the cheapest model meeting minimum requirements.
|
|
308
|
+
* @param tier - Required tier (or "any")
|
|
309
|
+
* @param minContext - Minimum context length
|
|
310
|
+
* @param maxCost - Maximum cost in nano-dollars per 1K prompt
|
|
311
|
+
*/
|
|
312
|
+
findCheapest(tier, minContext = 0, maxCost = Infinity) {
|
|
313
|
+
const allTiers = ["orchestrator", "analyst", "worker", "free"];
|
|
314
|
+
const pool = tier === "any"
|
|
315
|
+
? allTiers.flatMap(t => this.tieredPool[t])
|
|
316
|
+
: this.tieredPool[tier] ?? [];
|
|
317
|
+
return pool
|
|
318
|
+
.filter(tm => tm.available && tm.failures < 3)
|
|
319
|
+
.filter(tm => (tm.model.context_length || 0) >= minContext)
|
|
320
|
+
.filter(tm => tm.costPer1K <= maxCost)
|
|
321
|
+
.sort((a, b) => a.costPer1K - b.costPer1K)[0] ?? null;
|
|
322
|
+
}
|
|
323
|
+
// ── Tool: list_models ─────────────────────────────────────────────────────
|
|
324
|
+
listModelsParams = Type.Object({
|
|
325
|
+
query: Type.Optional(Type.String({ description: "Search query (model name or provider)" })),
|
|
326
|
+
tier: Type.Optional(Type.String({ description: "Filter by tier: orchestrator, analyst, worker, free" })),
|
|
327
|
+
limit: Type.Optional(Type.Number({ description: "Max results", default: 20 })),
|
|
328
|
+
available_only: Type.Optional(Type.Boolean({ description: "Only show available models", default: true })),
|
|
329
|
+
});
|
|
330
|
+
async listModelsTool(_id, params) {
|
|
331
|
+
let results;
|
|
332
|
+
if (params.query) {
|
|
333
|
+
results = this.search(params.query, params.limit ?? 20);
|
|
334
|
+
}
|
|
335
|
+
else if (params.tier && this.tieredPool[params.tier]) {
|
|
336
|
+
results = this.tieredPool[params.tier];
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
results = [...this.modelMap.values()];
|
|
340
|
+
}
|
|
341
|
+
if (params.available_only !== false) {
|
|
342
|
+
results = results.filter(tm => tm.available && tm.failures < 3);
|
|
343
|
+
}
|
|
344
|
+
results = results.slice(0, params.limit ?? 20);
|
|
345
|
+
const text = results.map(tm => {
|
|
346
|
+
const costStr = tm.costPer1K <= 0 ? "FREE" : `$${(tm.costPer1K / 1_000_000_000).toFixed(6)}/1K`;
|
|
347
|
+
const ctx = tm.model.context_length
|
|
348
|
+
? tm.model.context_length >= 1_000_000
|
|
349
|
+
? `${(tm.model.context_length / 1_000_000).toFixed(1)}M ctx`
|
|
350
|
+
: `${(tm.model.context_length / 1000).toFixed(0)}K ctx`
|
|
351
|
+
: "?K ctx";
|
|
352
|
+
const status = tm.available ? "" : " [UNAVAILABLE]";
|
|
353
|
+
return `[${tm.tier}] ${tm.model.id.padEnd(46)} ${costStr.padEnd(18)} ${ctx}${status}`;
|
|
354
|
+
}).join("\n");
|
|
355
|
+
return {
|
|
356
|
+
content: [{ type: "text", text: text || "(no models match)" }],
|
|
357
|
+
details: { count: results.length },
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
// ── Tool: pick_model ──────────────────────────────────────────────────────
|
|
361
|
+
pickModelParams = Type.Object({
|
|
362
|
+
tier: Type.Optional(Type.String({ description: "Tier: orchestrator, analyst, worker, free, any" })),
|
|
363
|
+
min_context: Type.Optional(Type.Number({ description: "Minimum context length in tokens" })),
|
|
364
|
+
max_cost: Type.Optional(Type.Number({ description: "Maximum cost per 1K prompt in nano-dollars" })),
|
|
365
|
+
});
|
|
366
|
+
async pickModelTool(_id, params) {
|
|
367
|
+
const tier = (params.tier ?? "any");
|
|
368
|
+
const cheapest = this.findCheapest(tier, params.min_context ?? 0, params.max_cost ?? Infinity);
|
|
369
|
+
if (!cheapest) {
|
|
370
|
+
return { content: [{ type: "text", text: "No matching model found." }], details: {} };
|
|
371
|
+
}
|
|
372
|
+
const costDollars = cheapest.costPer1K / 1_000_000_000;
|
|
373
|
+
return {
|
|
374
|
+
content: [{
|
|
375
|
+
type: "text",
|
|
376
|
+
text: `Recommended: ${cheapest.model.id}\n Tier: ${cheapest.tier}\n Context: ${(cheapest.model.context_length ?? 0).toLocaleString()} tokens\n Cost: $${costDollars.toFixed(6)}/1K prompt tokens\n Provider: ${cheapest.model.id.split("/")[0]}`,
|
|
377
|
+
}],
|
|
378
|
+
details: { model_id: cheapest.model.id, tier: cheapest.tier, cost_per_1k: costDollars },
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
// ── Tool: model_summary ───────────────────────────────────────────────────
|
|
382
|
+
summaryParams = Type.Object({});
|
|
383
|
+
async summaryTool() {
|
|
384
|
+
return {
|
|
385
|
+
content: [{ type: "text", text: this.summary() }],
|
|
386
|
+
details: {
|
|
387
|
+
total: this.allModels.length,
|
|
388
|
+
tiers: {
|
|
389
|
+
orchestrator: this.tieredPool.orchestrator.filter(tm => tm.available).length,
|
|
390
|
+
analyst: this.tieredPool.analyst.filter(tm => tm.available).length,
|
|
391
|
+
worker: this.tieredPool.worker.filter(tm => tm.available).length,
|
|
392
|
+
free: this.tieredPool.free.filter(tm => tm.available).length,
|
|
393
|
+
},
|
|
394
|
+
},
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
/** Singleton — initialised once at startup, used everywhere */
|
|
399
|
+
export const modelRegistry = new ModelRegistry();
|
|
400
|
+
//# sourceMappingURL=ModelRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelRegistry.js","sourceRoot":"","sources":["../../src/models/ModelRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { ModelRegistry, modelRegistry, classifyModel } from "./ModelRegistry.js";
|
|
2
|
+
export type { OpenRouterModel, TieredModel, TieredPool, ModelTier } from "./ModelRegistry.js";
|
|
3
|
+
export { CostTracker } from "./CostTracker.js";
|
|
4
|
+
export type { UsageEntry, SessionUsage, LifetimeUsage } from "./CostTracker.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjF,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEjF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
import type { Registry } from "../api/Registry.js";
|
|
10
10
|
import type { SessionManager } from "../session/SessionManager.js";
|
|
11
11
|
import type { SessionContext } from "../api/ExtensionAPI.js";
|
|
12
|
+
import type { ModelRegistry } from "../models/ModelRegistry.js";
|
|
13
|
+
import type { CostTracker } from "../models/CostTracker.js";
|
|
12
14
|
export type RunnerEvent = {
|
|
13
15
|
type: "text_delta";
|
|
14
16
|
text: string;
|
|
@@ -51,7 +53,9 @@ export declare class AgentRunner {
|
|
|
51
53
|
private modelChain;
|
|
52
54
|
private dispatcher;
|
|
53
55
|
private swarmRouter;
|
|
54
|
-
|
|
56
|
+
private modelRegistry?;
|
|
57
|
+
private costTracker?;
|
|
58
|
+
constructor(registry: Registry, session: SessionManager, onEvent: RunnerEventHandler, sessionCtx: SessionContext, effectLevel?: string, modelReg?: ModelRegistry, costTracker?: CostTracker);
|
|
55
59
|
/**
|
|
56
60
|
* Live reconfigure effect level without recreating the runner.
|
|
57
61
|
* Called by the /effect REPL command immediately on each invocation so that
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentRunner.d.ts","sourceRoot":"","sources":["../../src/runner/AgentRunner.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAQ,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"AgentRunner.d.ts","sourceRoot":"","sources":["../../src/runner/AgentRunner.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAQ,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAQ,0BAA0B,CAAC;AAE9D,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAK,IAAI,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAK,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAM,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAC1E;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpE;IAAE,IAAI,EAAE,eAAe,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACtF;IAAE,IAAI,EAAE,cAAc,CAAC;IAAG,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAU,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhD,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;AAY9D,qBAAa,WAAW;IAQpB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,WAAW;IAXrB,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,WAAW,CAAC,CAAgB;gBAG1B,QAAQ,EAAK,QAAQ,EACrB,OAAO,EAAM,cAAc,EAC3B,OAAO,EAAM,kBAAkB,EAC/B,UAAU,EAAG,cAAc,EAC3B,WAAW,GAAE,MAAiB,EACtC,QAAQ,CAAC,EAAE,aAAa,EACxB,WAAW,CAAC,EAAE,WAAW;IAa3B;;;;OAIG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAUnC,yFAAyF;IACnF,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAqB/B,QAAQ;IAgChB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;CAmGtC"}
|
|
@@ -26,19 +26,23 @@ export class AgentRunner {
|
|
|
26
26
|
modelChain;
|
|
27
27
|
dispatcher;
|
|
28
28
|
swarmRouter;
|
|
29
|
-
|
|
29
|
+
modelRegistry;
|
|
30
|
+
costTracker;
|
|
31
|
+
constructor(registry, session, onEvent, sessionCtx, effectLevel = "normal", modelReg, costTracker) {
|
|
30
32
|
this.registry = registry;
|
|
31
33
|
this.session = session;
|
|
32
34
|
this.onEvent = onEvent;
|
|
33
35
|
this.sessionCtx = sessionCtx;
|
|
34
36
|
this.effectLevel = effectLevel;
|
|
35
|
-
this.
|
|
37
|
+
this.modelRegistry = modelReg;
|
|
38
|
+
this.costTracker = costTracker;
|
|
39
|
+
this.modelChain = resolveModelChain(modelReg);
|
|
36
40
|
this.dispatcher = new ToolDispatcher(registry);
|
|
37
41
|
const sc = EFFECT_SWARM[effectLevel] ?? EFFECT_SWARM["normal"];
|
|
38
42
|
this.swarmRouter = new SwarmRouter({
|
|
39
43
|
maxAgents: sc.maxAgents,
|
|
40
44
|
complexityThreshold: sc.threshold,
|
|
41
|
-
});
|
|
45
|
+
}, modelReg);
|
|
42
46
|
}
|
|
43
47
|
/**
|
|
44
48
|
* Live reconfigure effect level without recreating the runner.
|
|
@@ -47,13 +51,12 @@ export class AgentRunner {
|
|
|
47
51
|
*/
|
|
48
52
|
setEffectLevel(level) {
|
|
49
53
|
this.effectLevel = level;
|
|
50
|
-
|
|
51
|
-
this.modelChain = resolveModelChain();
|
|
54
|
+
this.modelChain = resolveModelChain(this.modelRegistry);
|
|
52
55
|
const sc = EFFECT_SWARM[level] ?? EFFECT_SWARM["normal"];
|
|
53
56
|
this.swarmRouter = new SwarmRouter({
|
|
54
57
|
maxAgents: sc.maxAgents,
|
|
55
58
|
complexityThreshold: sc.threshold,
|
|
56
|
-
});
|
|
59
|
+
}, this.modelRegistry);
|
|
57
60
|
}
|
|
58
61
|
/** Run one user turn — may invoke multiple tool rounds and model fallbacks internally */
|
|
59
62
|
async run(userMessage) {
|
|
@@ -106,7 +109,7 @@ export class AgentRunner {
|
|
|
106
109
|
// Try model chain — rotate on 429/5xx
|
|
107
110
|
for (let mi = 0; mi < this.modelChain.length; mi++) {
|
|
108
111
|
const cfg = this.modelChain[mi];
|
|
109
|
-
const client = new ModelClient(cfg);
|
|
112
|
+
const client = new ModelClient(cfg, this.modelRegistry);
|
|
110
113
|
assistantText = "";
|
|
111
114
|
pendingToolCalls = [];
|
|
112
115
|
modelError = null;
|
|
@@ -133,6 +136,10 @@ export class AgentRunner {
|
|
|
133
136
|
break; // success — use this model's output
|
|
134
137
|
// Rotate to next model on rate-limit or server errors
|
|
135
138
|
const nextCfg = this.modelChain[mi + 1];
|
|
139
|
+
// Save any partial text the user already saw before rotating
|
|
140
|
+
if (assistantText.trim()) {
|
|
141
|
+
this.session.addMessage({ role: "assistant", content: assistantText + "\n\n[connection interrupted — retrying with fallback model]" });
|
|
142
|
+
}
|
|
136
143
|
if (nextCfg && isRateLimit) {
|
|
137
144
|
this.onEvent({
|
|
138
145
|
type: "model_fallback",
|
|
@@ -142,7 +149,10 @@ export class AgentRunner {
|
|
|
142
149
|
});
|
|
143
150
|
continue;
|
|
144
151
|
}
|
|
145
|
-
// Non-recoverable error or no more fallbacks
|
|
152
|
+
// Non-recoverable error or no more fallbacks — commit partial text if any
|
|
153
|
+
if (assistantText.trim()) {
|
|
154
|
+
this.session.addMessage({ role: "assistant", content: assistantText });
|
|
155
|
+
}
|
|
146
156
|
this.onEvent({ type: "error", message: modelError ?? "Model error" });
|
|
147
157
|
return;
|
|
148
158
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentRunner.js","sourceRoot":"","sources":["../../src/runner/AgentRunner.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,WAAW,EACX,iBAAiB,GAIlB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAO,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAU,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"AgentRunner.js","sourceRoot":"","sources":["../../src/runner/AgentRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,10 +5,15 @@
|
|
|
5
5
|
* OpenRouter > Anthropic compat > OpenAI > local (ollama/lm-studio)
|
|
6
6
|
*
|
|
7
7
|
* Model rotation: resolveModelChain() returns up to 5 configs — the AgentRunner
|
|
8
|
-
* walks the chain on 429 (rate limit) or 5xx errors,
|
|
8
|
+
* walks the chain on 429 (rate limit) or 5xx errors, with exponential backoff
|
|
9
|
+
* (up to 2 retries per model) before falling through.
|
|
10
|
+
*
|
|
11
|
+
* When a ModelRegistry is available, chains are dynamically built from the
|
|
12
|
+
* tiered pool, with per-model performance tracking and cost estimation.
|
|
9
13
|
*
|
|
10
14
|
* All outbound, all local — no inbound ports, no server.
|
|
11
15
|
*/
|
|
16
|
+
import type { ModelRegistry } from "../models/ModelRegistry.js";
|
|
12
17
|
export interface Message {
|
|
13
18
|
role: "system" | "user" | "assistant" | "tool";
|
|
14
19
|
content: string | null;
|
|
@@ -45,6 +50,9 @@ export interface ModelConfig {
|
|
|
45
50
|
/**
|
|
46
51
|
* Build the ordered model fallback chain.
|
|
47
52
|
*
|
|
53
|
+
* If a ModelRegistry is provided, builds from the tiered pool dynamically.
|
|
54
|
+
* Falls back to static env-var parsing otherwise.
|
|
55
|
+
*
|
|
48
56
|
* User-configurable pool: JELLY_MODEL_1 … JELLY_MODEL_5
|
|
49
57
|
* If any JELLY_MODEL_N vars are set they take priority; up to 5 are used in
|
|
50
58
|
* order. Unset slots are filled with provider-appropriate defaults.
|
|
@@ -54,16 +62,19 @@ export interface ModelConfig {
|
|
|
54
62
|
* JELLY_MODEL_2=openai/gpt-4o
|
|
55
63
|
* JELLY_MODEL_3=google/gemini-2.5-pro
|
|
56
64
|
*/
|
|
57
|
-
export declare function resolveModelChain(): ModelConfig[];
|
|
65
|
+
export declare function resolveModelChain(modelReg?: ModelRegistry): ModelConfig[];
|
|
58
66
|
/** Convenience: returns just the primary (first) model config */
|
|
59
|
-
export declare function resolveModelConfig(): ModelConfig;
|
|
67
|
+
export declare function resolveModelConfig(modelReg?: ModelRegistry): ModelConfig;
|
|
60
68
|
export declare class ModelClient {
|
|
61
69
|
private cfg;
|
|
62
|
-
|
|
70
|
+
private modelRegistry?;
|
|
71
|
+
constructor(cfg: ModelConfig, modelReg?: ModelRegistry);
|
|
63
72
|
/**
|
|
64
73
|
* Stream a chat completion. Yields ChatChunk objects.
|
|
65
|
-
*
|
|
74
|
+
* Retries up to 2 times on 429 / 5xx with exponential backoff (1s, 2s).
|
|
75
|
+
* On persistent HTTP error the generator yields a single { type: "error", status, error }
|
|
66
76
|
* chunk and returns — the caller (AgentRunner) decides whether to rotate.
|
|
77
|
+
* Also reports success/failure to the ModelRegistry for tiering and cooldown.
|
|
67
78
|
*/
|
|
68
79
|
stream(messages: Message[], tools?: Array<{
|
|
69
80
|
type: "function";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModelClient.d.ts","sourceRoot":"","sources":["../../src/runner/ModelClient.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ModelClient.d.ts","sourceRoot":"","sources":["../../src/runner/ModelClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEhE,MAAM,WAAW,OAAO;IACtB,IAAI,EAAW,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IACxD,OAAO,EAAQ,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,CAAC,EAAU,MAAM,CAAC;IACtB,UAAU,CAAC,EAAI,QAAQ,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAQ,MAAM,CAAC;IACjB,IAAI,EAAM,UAAU,CAAC;IACrB,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/C;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAY,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;IACzD,IAAI,CAAC,EAAW,MAAM,CAAC;IACvB,UAAU,CAAC,EAAK,QAAQ,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAU,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sEAAsE;IACtE,MAAM,CAAC,EAAS,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAM,MAAM,CAAC;IACpB,MAAM,EAAO,MAAM,CAAC;IACpB,KAAK,EAAQ,MAAM,CAAC;IACpB,SAAS,EAAI,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAK,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAI,MAAM,CAAC;CACrB;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,aAAa,GAAG,WAAW,EAAE,CAuFzE;AAED,iEAAiE;AACjE,wBAAgB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,aAAa,GAAG,WAAW,CAExE;AAID,qBAAa,WAAW;IAIpB,OAAO,CAAC,GAAG;IAHb,OAAO,CAAC,aAAa,CAAC,CAAgB;gBAG5B,GAAG,EAAE,WAAW,EACxB,QAAQ,CAAC,EAAE,aAAa;IAK1B;;;;;;OAMG;IACI,MAAM,CACX,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,OAAO,CAAA;SAAE,CAAA;KAAE,CAAC,GACxG,cAAc,CAAC,SAAS,CAAC;CA2I7B"}
|