@jellyos/agent 0.1.2 → 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 +11 -24
- 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/loader.d.ts.map +1 -1
- package/dist/loader.js +1 -25
- package/dist/loader.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 -61
- 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
- package/dist/util/safeLog.d.ts +0 -39
- package/dist/util/safeLog.d.ts.map +0 -1
- package/dist/util/safeLog.js +0 -59
- package/dist/util/safeLog.js.map +0 -1
|
@@ -0,0 +1,146 @@
|
|
|
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 type { ModelConfig } from "../runner/ModelClient.js";
|
|
13
|
+
import { type Static } from "@sinclair/typebox";
|
|
14
|
+
export interface OpenRouterModel {
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
created: number;
|
|
18
|
+
description: string;
|
|
19
|
+
context_length: number;
|
|
20
|
+
architecture: {
|
|
21
|
+
modality: string;
|
|
22
|
+
tokenizer: string;
|
|
23
|
+
instruct_type: string | null;
|
|
24
|
+
};
|
|
25
|
+
pricing: {
|
|
26
|
+
prompt: string;
|
|
27
|
+
completion: string;
|
|
28
|
+
image?: string;
|
|
29
|
+
request?: string;
|
|
30
|
+
input_cache_read?: string;
|
|
31
|
+
input_cache_write?: string;
|
|
32
|
+
};
|
|
33
|
+
top_provider: {
|
|
34
|
+
context_length: number;
|
|
35
|
+
max_completion_tokens: number | null;
|
|
36
|
+
is_moderated: boolean;
|
|
37
|
+
};
|
|
38
|
+
per_request_limits?: Record<string, string>;
|
|
39
|
+
}
|
|
40
|
+
export type ModelTier = "orchestrator" | "analyst" | "worker" | "free";
|
|
41
|
+
export interface TieredModel {
|
|
42
|
+
tier: ModelTier;
|
|
43
|
+
model: OpenRouterModel;
|
|
44
|
+
/** Nano-dollars per 1K prompt tokens (for cost comparison) */
|
|
45
|
+
costPer1K: number;
|
|
46
|
+
/** Whether this model is currently available (not deprecated / rate-limited) */
|
|
47
|
+
available: boolean;
|
|
48
|
+
/** Consecutive failures — if >= 3, mark unavailable temporarily */
|
|
49
|
+
failures: number;
|
|
50
|
+
/** Timestamp of last failure (ms) */
|
|
51
|
+
lastFailure: number;
|
|
52
|
+
/** Average stream latency in ms */
|
|
53
|
+
avgLatency: number;
|
|
54
|
+
/** Number of times used */
|
|
55
|
+
uses: number;
|
|
56
|
+
}
|
|
57
|
+
export interface TieredPool {
|
|
58
|
+
orchestrator: TieredModel[];
|
|
59
|
+
analyst: TieredModel[];
|
|
60
|
+
worker: TieredModel[];
|
|
61
|
+
free: TieredModel[];
|
|
62
|
+
}
|
|
63
|
+
export declare function classifyModel(model: OpenRouterModel): ModelTier;
|
|
64
|
+
export declare class ModelRegistry {
|
|
65
|
+
private allModels;
|
|
66
|
+
private tieredPool;
|
|
67
|
+
private modelMap;
|
|
68
|
+
private loaded;
|
|
69
|
+
private lastFetch;
|
|
70
|
+
/** Query OpenRouter /models and build the tiered pool. Called once at startup. */
|
|
71
|
+
initialise(apiKey?: string): Promise<void>;
|
|
72
|
+
/** Rebuild tier classifications (call after cache load or fetch). */
|
|
73
|
+
private rebuildTiers;
|
|
74
|
+
private saveCache;
|
|
75
|
+
private loadFromCache;
|
|
76
|
+
/** True if cache is stale and we should re-fetch on next opportunity. */
|
|
77
|
+
get cacheStale(): boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Pick the best available model for a given tier.
|
|
80
|
+
* Favours lower cost among available models, excluding those with >= 3
|
|
81
|
+
* consecutive failures (which get a 5-minute cooldown).
|
|
82
|
+
*/
|
|
83
|
+
pick(tier: ModelTier): OpenRouterModel | null;
|
|
84
|
+
/**
|
|
85
|
+
* Build a full ModelConfig chain from the tiered pool.
|
|
86
|
+
* Uses user-configured models from env first, then fills with tiered picks.
|
|
87
|
+
*/
|
|
88
|
+
buildModelChain(userModels: string[]): ModelConfig[];
|
|
89
|
+
/** Build a single ModelConfig, preferring direct provider when possible. */
|
|
90
|
+
buildConfig(modelId: string, maxTokens: number, temperature: number): ModelConfig | null;
|
|
91
|
+
recordFailure(modelId: string): void;
|
|
92
|
+
recordSuccess(modelId: string, latencyMs: number): void;
|
|
93
|
+
/** Mark a model as permanently deprecated (404, model removed). */
|
|
94
|
+
markDeprecated(modelId: string): void;
|
|
95
|
+
getTier(modelId: string): ModelTier;
|
|
96
|
+
get modelCount(): number;
|
|
97
|
+
/** Search / filter models by keyword (case-insensitive). */
|
|
98
|
+
search(query: string, maxResults?: number): TieredModel[];
|
|
99
|
+
/** Get all models for a tier. */
|
|
100
|
+
getPool(tier: ModelTier): TieredModel[];
|
|
101
|
+
/** Human-readable summary of the current pool. */
|
|
102
|
+
summary(): string;
|
|
103
|
+
/**
|
|
104
|
+
* Find the cheapest model meeting minimum requirements.
|
|
105
|
+
* @param tier - Required tier (or "any")
|
|
106
|
+
* @param minContext - Minimum context length
|
|
107
|
+
* @param maxCost - Maximum cost in nano-dollars per 1K prompt
|
|
108
|
+
*/
|
|
109
|
+
findCheapest(tier: ModelTier | "any", minContext?: number, maxCost?: number): TieredModel | null;
|
|
110
|
+
readonly listModelsParams: import("@sinclair/typebox").TObject<{
|
|
111
|
+
query: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
112
|
+
tier: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
113
|
+
limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
114
|
+
available_only: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
115
|
+
}>;
|
|
116
|
+
listModelsTool(_id: string, params: Static<typeof this.listModelsParams>): Promise<{
|
|
117
|
+
content: Array<{
|
|
118
|
+
type: "text";
|
|
119
|
+
text: string;
|
|
120
|
+
}>;
|
|
121
|
+
details: Record<string, unknown>;
|
|
122
|
+
}>;
|
|
123
|
+
readonly pickModelParams: import("@sinclair/typebox").TObject<{
|
|
124
|
+
tier: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
125
|
+
min_context: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
126
|
+
max_cost: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
127
|
+
}>;
|
|
128
|
+
pickModelTool(_id: string, params: Static<typeof this.pickModelParams>): Promise<{
|
|
129
|
+
content: Array<{
|
|
130
|
+
type: "text";
|
|
131
|
+
text: string;
|
|
132
|
+
}>;
|
|
133
|
+
details: Record<string, unknown>;
|
|
134
|
+
}>;
|
|
135
|
+
readonly summaryParams: import("@sinclair/typebox").TObject<{}>;
|
|
136
|
+
summaryTool(): Promise<{
|
|
137
|
+
content: Array<{
|
|
138
|
+
type: "text";
|
|
139
|
+
text: string;
|
|
140
|
+
}>;
|
|
141
|
+
details: Record<string, unknown>;
|
|
142
|
+
}>;
|
|
143
|
+
}
|
|
144
|
+
/** Singleton — initialised once at startup, used everywhere */
|
|
145
|
+
export declare const modelRegistry: ModelRegistry;
|
|
146
|
+
//# sourceMappingURL=ModelRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelRegistry.d.ts","sourceRoot":"","sources":["../../src/models/ModelRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|