adonis-ai-kit 0.0.0-stage → 1.1.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/LICENSE +21 -0
- package/README.md +325 -2
- package/dist/commands/ai_test.d.ts +12 -0
- package/dist/commands/ai_test.d.ts.map +1 -0
- package/dist/commands/ai_test.js +98 -0
- package/dist/commands/ai_test.js.map +1 -0
- package/dist/commands/main.d.ts +14 -0
- package/dist/commands/main.d.ts.map +1 -0
- package/dist/commands/main.js +31 -0
- package/dist/commands/main.js.map +1 -0
- package/dist/commands/make_agent.d.ts +13 -0
- package/dist/commands/make_agent.d.ts.map +1 -0
- package/dist/commands/make_agent.js +116 -0
- package/dist/commands/make_agent.js.map +1 -0
- package/dist/providers/ai_provider.d.ts +23 -0
- package/dist/providers/ai_provider.d.ts.map +1 -0
- package/dist/providers/ai_provider.js +34 -0
- package/dist/providers/ai_provider.js.map +1 -0
- package/dist/services/main.d.ts +4 -0
- package/dist/services/main.d.ts.map +1 -0
- package/dist/services/main.js +7 -0
- package/dist/services/main.js.map +1 -0
- package/dist/src/acp/acp_agents.d.ts +75 -0
- package/dist/src/acp/acp_agents.d.ts.map +1 -0
- package/dist/src/acp/acp_agents.js +343 -0
- package/dist/src/acp/acp_agents.js.map +1 -0
- package/dist/src/acp/index.d.ts +4 -0
- package/dist/src/acp/index.d.ts.map +1 -0
- package/dist/src/acp/index.js +4 -0
- package/dist/src/acp/index.js.map +1 -0
- package/dist/src/acp/provider.d.ts +64 -0
- package/dist/src/acp/provider.d.ts.map +1 -0
- package/dist/src/acp/provider.js +255 -0
- package/dist/src/acp/provider.js.map +1 -0
- package/dist/src/acp/types.d.ts +107 -0
- package/dist/src/acp/types.d.ts.map +1 -0
- package/dist/src/acp/types.js +2 -0
- package/dist/src/acp/types.js.map +1 -0
- package/dist/src/agents/agent_runner.d.ts +60 -0
- package/dist/src/agents/agent_runner.d.ts.map +1 -0
- package/dist/src/agents/agent_runner.js +134 -0
- package/dist/src/agents/agent_runner.js.map +1 -0
- package/dist/src/agents/index.d.ts +4 -0
- package/dist/src/agents/index.d.ts.map +1 -0
- package/dist/src/agents/index.js +4 -0
- package/dist/src/agents/index.js.map +1 -0
- package/dist/src/agents/loader.d.ts +56 -0
- package/dist/src/agents/loader.d.ts.map +1 -0
- package/dist/src/agents/loader.js +184 -0
- package/dist/src/agents/loader.js.map +1 -0
- package/dist/src/agents/manifest.d.ts +61 -0
- package/dist/src/agents/manifest.d.ts.map +1 -0
- package/dist/src/agents/manifest.js +35 -0
- package/dist/src/agents/manifest.js.map +1 -0
- package/dist/src/ai_manager.d.ts +136 -0
- package/dist/src/ai_manager.d.ts.map +1 -0
- package/dist/src/ai_manager.js +701 -0
- package/dist/src/ai_manager.js.map +1 -0
- package/dist/src/budget/budget_allocator.d.ts +37 -0
- package/dist/src/budget/budget_allocator.d.ts.map +1 -0
- package/dist/src/budget/budget_allocator.js +98 -0
- package/dist/src/budget/budget_allocator.js.map +1 -0
- package/dist/src/budget/budget_enforcer.d.ts +70 -0
- package/dist/src/budget/budget_enforcer.d.ts.map +1 -0
- package/dist/src/budget/budget_enforcer.js +195 -0
- package/dist/src/budget/budget_enforcer.js.map +1 -0
- package/dist/src/budget/cost_tracker.d.ts +71 -0
- package/dist/src/budget/cost_tracker.d.ts.map +1 -0
- package/dist/src/budget/cost_tracker.js +199 -0
- package/dist/src/budget/cost_tracker.js.map +1 -0
- package/dist/src/budget/index.d.ts +6 -0
- package/dist/src/budget/index.d.ts.map +1 -0
- package/dist/src/budget/index.js +6 -0
- package/dist/src/budget/index.js.map +1 -0
- package/dist/src/budget/pricing.d.ts +35 -0
- package/dist/src/budget/pricing.d.ts.map +1 -0
- package/dist/src/budget/pricing.js +129 -0
- package/dist/src/budget/pricing.js.map +1 -0
- package/dist/src/budget/types.d.ts +91 -0
- package/dist/src/budget/types.d.ts.map +1 -0
- package/dist/src/budget/types.js +2 -0
- package/dist/src/budget/types.js.map +1 -0
- package/dist/src/catalog/index.d.ts +3 -0
- package/dist/src/catalog/index.d.ts.map +1 -0
- package/dist/src/catalog/index.js +3 -0
- package/dist/src/catalog/index.js.map +1 -0
- package/dist/src/catalog/models_dev.d.ts +87 -0
- package/dist/src/catalog/models_dev.d.ts.map +1 -0
- package/dist/src/catalog/models_dev.js +38 -0
- package/dist/src/catalog/models_dev.js.map +1 -0
- package/dist/src/catalog/source.d.ts +52 -0
- package/dist/src/catalog/source.d.ts.map +1 -0
- package/dist/src/catalog/source.js +668 -0
- package/dist/src/catalog/source.js.map +1 -0
- package/dist/src/circuit_breaker.d.ts +40 -0
- package/dist/src/circuit_breaker.d.ts.map +1 -0
- package/dist/src/circuit_breaker.js +172 -0
- package/dist/src/circuit_breaker.js.map +1 -0
- package/dist/src/define_config.d.ts +11 -0
- package/dist/src/define_config.d.ts.map +1 -0
- package/dist/src/define_config.js +48 -0
- package/dist/src/define_config.js.map +1 -0
- package/dist/src/error_classifier.d.ts +17 -0
- package/dist/src/error_classifier.d.ts.map +1 -0
- package/dist/src/error_classifier.js +80 -0
- package/dist/src/error_classifier.js.map +1 -0
- package/dist/src/errors.d.ts +52 -0
- package/dist/src/errors.d.ts.map +1 -0
- package/dist/src/errors.js +70 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/guard/confirmation.d.ts +67 -0
- package/dist/src/guard/confirmation.d.ts.map +1 -0
- package/dist/src/guard/confirmation.js +180 -0
- package/dist/src/guard/confirmation.js.map +1 -0
- package/dist/src/guard/errors.d.ts +10 -0
- package/dist/src/guard/errors.d.ts.map +1 -0
- package/dist/src/guard/errors.js +14 -0
- package/dist/src/guard/errors.js.map +1 -0
- package/dist/src/guard/guard.d.ts +47 -0
- package/dist/src/guard/guard.d.ts.map +1 -0
- package/dist/src/guard/guard.js +133 -0
- package/dist/src/guard/guard.js.map +1 -0
- package/dist/src/guard/index.d.ts +7 -0
- package/dist/src/guard/index.d.ts.map +1 -0
- package/dist/src/guard/index.js +7 -0
- package/dist/src/guard/index.js.map +1 -0
- package/dist/src/guard/registry.d.ts +66 -0
- package/dist/src/guard/registry.d.ts.map +1 -0
- package/dist/src/guard/registry.js +182 -0
- package/dist/src/guard/registry.js.map +1 -0
- package/dist/src/guard/schema_registry.d.ts +37 -0
- package/dist/src/guard/schema_registry.d.ts.map +1 -0
- package/dist/src/guard/schema_registry.js +57 -0
- package/dist/src/guard/schema_registry.js.map +1 -0
- package/dist/src/guard/types.d.ts +64 -0
- package/dist/src/guard/types.d.ts.map +1 -0
- package/dist/src/guard/types.js +2 -0
- package/dist/src/guard/types.js.map +1 -0
- package/dist/src/index.d.ts +13 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +12 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/response_macro.d.ts +16 -0
- package/dist/src/response_macro.d.ts.map +1 -0
- package/dist/src/response_macro.js +151 -0
- package/dist/src/response_macro.js.map +1 -0
- package/dist/src/types.d.ts +297 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/usage.d.ts +13 -0
- package/dist/src/usage.d.ts.map +1 -0
- package/dist/src/usage.js +61 -0
- package/dist/src/usage.js.map +1 -0
- package/package.json +141 -3
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { DEFAULT_MODEL_PRICING, computeCost, lookupPricing, normalizeModelName, toSafeTokens, } from './pricing.js';
|
|
2
|
+
const DEFAULT_MAX_RECORDS = 10_000;
|
|
3
|
+
const MAX_WARNED_MODELS = 1_000;
|
|
4
|
+
function newAggregate() {
|
|
5
|
+
return { tokens: 0, cost: 0, calls: 0, totalDurationMs: 0 };
|
|
6
|
+
}
|
|
7
|
+
function addTo(agg, record) {
|
|
8
|
+
agg.tokens += record.totalTokens;
|
|
9
|
+
agg.cost += record.costUsd;
|
|
10
|
+
agg.calls += 1;
|
|
11
|
+
agg.totalDurationMs += record.durationMs;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Tracks token usage and monetary cost per agent, model, and session.
|
|
15
|
+
* Provides aggregations and logging without framework dependencies.
|
|
16
|
+
*
|
|
17
|
+
* All keyed state uses `Map`, so agent/model names such as `__proto__` or `constructor`
|
|
18
|
+
* cannot pollute prototypes. Memory is bounded by `maxRecords`.
|
|
19
|
+
*/
|
|
20
|
+
export class CostTracker {
|
|
21
|
+
ring = [];
|
|
22
|
+
ringStart = 0;
|
|
23
|
+
ringSize = 0;
|
|
24
|
+
maxRecords;
|
|
25
|
+
sink;
|
|
26
|
+
byAgent = new Map();
|
|
27
|
+
byModel = new Map();
|
|
28
|
+
total = newAggregate();
|
|
29
|
+
customPricing = new Map();
|
|
30
|
+
defaultPricing = new Map(Object.entries(DEFAULT_MODEL_PRICING));
|
|
31
|
+
warnedModels = new Set();
|
|
32
|
+
logger;
|
|
33
|
+
pricingLoader;
|
|
34
|
+
constructor(opts = {}) {
|
|
35
|
+
const max = opts.maxRecords ?? DEFAULT_MAX_RECORDS;
|
|
36
|
+
if (!Number.isInteger(max) || max < 0) {
|
|
37
|
+
throw new RangeError(`[CostTracker] maxRecords must be a non-negative integer, got ${max}`);
|
|
38
|
+
}
|
|
39
|
+
this.maxRecords = max;
|
|
40
|
+
this.sink = opts.sink;
|
|
41
|
+
if (opts.pricing) {
|
|
42
|
+
this.setPricing(opts.pricing);
|
|
43
|
+
}
|
|
44
|
+
this.logger = opts.logger;
|
|
45
|
+
this.pricingLoader = opts.pricingLoader;
|
|
46
|
+
}
|
|
47
|
+
setLogger(logger) {
|
|
48
|
+
this.logger = logger;
|
|
49
|
+
}
|
|
50
|
+
setPricing(pricing) {
|
|
51
|
+
for (const [model, price] of Object.entries(pricing)) {
|
|
52
|
+
this.customPricing.set(model, price);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
registerPricingLoader(loader) {
|
|
56
|
+
this.pricingLoader = loader;
|
|
57
|
+
}
|
|
58
|
+
async loadPricing() {
|
|
59
|
+
if (!this.pricingLoader)
|
|
60
|
+
return;
|
|
61
|
+
try {
|
|
62
|
+
const loaded = await this.pricingLoader();
|
|
63
|
+
this.setPricing(loaded);
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
this.logger?.warn?.('[CostTracker] Failed to load dynamic pricing:', err);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Backwards-compatible initialization alias.
|
|
71
|
+
*/
|
|
72
|
+
async initFromCatalog() {
|
|
73
|
+
return this.loadPricing();
|
|
74
|
+
}
|
|
75
|
+
record(entry) {
|
|
76
|
+
const inputTokens = toSafeTokens(entry.inputTokens);
|
|
77
|
+
const outputTokens = toSafeTokens(entry.outputTokens);
|
|
78
|
+
const details = {
|
|
79
|
+
cacheReadTokens: toSafeTokens(entry.cacheReadTokens),
|
|
80
|
+
cacheWriteTokens: toSafeTokens(entry.cacheWriteTokens),
|
|
81
|
+
reasoningTokens: toSafeTokens(entry.reasoningTokens),
|
|
82
|
+
};
|
|
83
|
+
const costUsd = this.calculateCost(entry.model, inputTokens, outputTokens, details);
|
|
84
|
+
const record = {
|
|
85
|
+
...entry,
|
|
86
|
+
agentName: String(entry.agentName || 'unknown'),
|
|
87
|
+
inputTokens,
|
|
88
|
+
outputTokens,
|
|
89
|
+
cacheReadTokens: details.cacheReadTokens,
|
|
90
|
+
cacheWriteTokens: details.cacheWriteTokens,
|
|
91
|
+
reasoningTokens: details.reasoningTokens,
|
|
92
|
+
totalTokens: toSafeTokens(entry.totalTokens) || inputTokens + outputTokens,
|
|
93
|
+
durationMs: toSafeTokens(entry.durationMs),
|
|
94
|
+
costUsd,
|
|
95
|
+
timestamp: Date.now(),
|
|
96
|
+
};
|
|
97
|
+
this.aggregate(record);
|
|
98
|
+
this.store(record);
|
|
99
|
+
if (this.sink) {
|
|
100
|
+
try {
|
|
101
|
+
this.sink(record);
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
this.logger?.warn?.('[CostTracker] Sink failed:', err);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return costUsd;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Cost in USD. `inputTokens` is the total input (cached included), `outputTokens` the total
|
|
111
|
+
* output (reasoning included); `details` carves cache/reasoning tokens out at their own rates.
|
|
112
|
+
*/
|
|
113
|
+
calculateCost(model, inputTokens, outputTokens, details = {}) {
|
|
114
|
+
const pricing = lookupPricing(model, this.customPricing) ?? lookupPricing(model, this.defaultPricing);
|
|
115
|
+
if (!pricing) {
|
|
116
|
+
const shortModel = normalizeModelName(model);
|
|
117
|
+
if (!this.warnedModels.has(shortModel) && this.warnedModels.size < MAX_WARNED_MODELS) {
|
|
118
|
+
this.warnedModels.add(shortModel);
|
|
119
|
+
this.logger?.warn?.(`[CostTracker] Unknown model "${shortModel}" (full: "${model}"). Cost tracking will report $0. Consider configuring pricing.`);
|
|
120
|
+
}
|
|
121
|
+
return 0;
|
|
122
|
+
}
|
|
123
|
+
return computeCost(pricing, inputTokens, outputTokens, details);
|
|
124
|
+
}
|
|
125
|
+
getByAgent() {
|
|
126
|
+
return Object.fromEntries([...this.byAgent].map(([name, v]) => [
|
|
127
|
+
name,
|
|
128
|
+
{
|
|
129
|
+
tokens: v.tokens,
|
|
130
|
+
cost: v.cost,
|
|
131
|
+
calls: v.calls,
|
|
132
|
+
avgDurationMs: v.calls > 0 ? Math.round(v.totalDurationMs / v.calls) : 0,
|
|
133
|
+
totalDurationMs: v.totalDurationMs,
|
|
134
|
+
},
|
|
135
|
+
]));
|
|
136
|
+
}
|
|
137
|
+
getByModel() {
|
|
138
|
+
return Object.fromEntries([...this.byModel].map(([model, v]) => [
|
|
139
|
+
model,
|
|
140
|
+
{ tokens: v.tokens, cost: v.cost, calls: v.calls },
|
|
141
|
+
]));
|
|
142
|
+
}
|
|
143
|
+
getTotalCost() {
|
|
144
|
+
return this.total.cost;
|
|
145
|
+
}
|
|
146
|
+
getTotalTokens() {
|
|
147
|
+
return this.total.tokens;
|
|
148
|
+
}
|
|
149
|
+
getTotalCalls() {
|
|
150
|
+
return this.total.calls;
|
|
151
|
+
}
|
|
152
|
+
/** Most recent records (at most `maxRecords`), oldest first. */
|
|
153
|
+
getRecords() {
|
|
154
|
+
const out = [];
|
|
155
|
+
for (let i = 0; i < this.ringSize; i++) {
|
|
156
|
+
out.push(this.ring[(this.ringStart + i) % this.maxRecords]);
|
|
157
|
+
}
|
|
158
|
+
return out;
|
|
159
|
+
}
|
|
160
|
+
reset() {
|
|
161
|
+
this.ring = [];
|
|
162
|
+
this.ringStart = 0;
|
|
163
|
+
this.ringSize = 0;
|
|
164
|
+
this.byAgent.clear();
|
|
165
|
+
this.byModel.clear();
|
|
166
|
+
this.total = newAggregate();
|
|
167
|
+
this.warnedModels.clear();
|
|
168
|
+
}
|
|
169
|
+
toLogString() {
|
|
170
|
+
const byAgent = this.getByAgent();
|
|
171
|
+
const lines = Object.entries(byAgent).map(([name, { tokens, cost, calls, avgDurationMs }]) => ` ${name}: ${calls} calls, ${tokens} tokens, $${cost.toFixed(4)}, avg ${avgDurationMs}ms`);
|
|
172
|
+
lines.push(` TOTAL: ${this.total.calls} calls, ${this.getTotalTokens()} tokens, $${this.getTotalCost().toFixed(4)}`);
|
|
173
|
+
return lines.join('\n');
|
|
174
|
+
}
|
|
175
|
+
aggregate(record) {
|
|
176
|
+
addTo(this.total, record);
|
|
177
|
+
let agent = this.byAgent.get(record.agentName);
|
|
178
|
+
if (!agent)
|
|
179
|
+
this.byAgent.set(record.agentName, (agent = newAggregate()));
|
|
180
|
+
addTo(agent, record);
|
|
181
|
+
const modelKey = normalizeModelName(record.model);
|
|
182
|
+
let model = this.byModel.get(modelKey);
|
|
183
|
+
if (!model)
|
|
184
|
+
this.byModel.set(modelKey, (model = newAggregate()));
|
|
185
|
+
addTo(model, record);
|
|
186
|
+
}
|
|
187
|
+
store(record) {
|
|
188
|
+
if (this.maxRecords === 0)
|
|
189
|
+
return;
|
|
190
|
+
if (this.ringSize < this.maxRecords) {
|
|
191
|
+
this.ring[(this.ringStart + this.ringSize) % this.maxRecords] = record;
|
|
192
|
+
this.ringSize++;
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
this.ring[this.ringStart] = record;
|
|
196
|
+
this.ringStart = (this.ringStart + 1) % this.maxRecords;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=cost_tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost_tracker.js","sourceRoot":"","sources":["../../../src/budget/cost_tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/budget/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/budget/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ModelPricing, TokenUsageDetails } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Default pricing catalog for popular LLM models (USD per 1M tokens).
|
|
4
|
+
*
|
|
5
|
+
* Prices drift: treat this table as a fallback and prefer `CostTracker.setPricing()` /
|
|
6
|
+
* `registerPricingLoader()` (e.g. backed by models.dev) for authoritative values.
|
|
7
|
+
*/
|
|
8
|
+
export declare const DEFAULT_MODEL_PRICING: Readonly<Record<string, ModelPricing>>;
|
|
9
|
+
/**
|
|
10
|
+
* Extracts normalized model name (removes provider prefix like 'openai/gpt-4o' -> 'gpt-4o').
|
|
11
|
+
*/
|
|
12
|
+
export declare function normalizeModelName(model: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Candidate pricing keys for a model id, from most to least specific:
|
|
15
|
+
* `claude-3-7-sonnet-20250219` -> `claude-3-7-sonnet`, `gpt-4o-2024-08-06` -> `gpt-4o`,
|
|
16
|
+
* `claude-3-7-sonnet-latest` -> `claude-3-7-sonnet`.
|
|
17
|
+
*/
|
|
18
|
+
export declare function pricingKeyCandidates(model: string): string[];
|
|
19
|
+
/**
|
|
20
|
+
* Looks up pricing in `table`, tolerating dated/`-latest` variants of a known model.
|
|
21
|
+
* Uses own-property lookups only, so keys like `__proto__` or `constructor` never match.
|
|
22
|
+
*/
|
|
23
|
+
export declare function lookupPricing(model: string, table: ReadonlyMap<string, ModelPricing> | Readonly<Record<string, ModelPricing>>): ModelPricing | undefined;
|
|
24
|
+
/** Coerces untrusted numbers (NaN, Infinity, negatives, non-numbers) to a safe non-negative value. */
|
|
25
|
+
export declare function toSafeTokens(value: unknown): number;
|
|
26
|
+
/**
|
|
27
|
+
* Computes USD cost for a call.
|
|
28
|
+
*
|
|
29
|
+
* `inputTokens` is the total input (cache reads/writes included) and `outputTokens` is the total
|
|
30
|
+
* output (reasoning included), matching the AI SDK usage convention. Cached tokens are billed at
|
|
31
|
+
* their dedicated rates and removed from the regular input charge; reasoning tokens are billed at
|
|
32
|
+
* `reasoningCostPer1M` when set, otherwise at the output rate.
|
|
33
|
+
*/
|
|
34
|
+
export declare function computeCost(pricing: ModelPricing, inputTokens: number, outputTokens: number, details?: TokenUsageDetails): number;
|
|
35
|
+
//# sourceMappingURL=pricing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../../src/budget/pricing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEjE;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CA4ChC,CAAA;AAEzC;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAU5D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,GAChF,YAAY,GAAG,SAAS,CAsB1B;AAED,sGAAsG;AACtG,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEnD;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,YAAY,EACrB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,iBAAsB,GAC9B,MAAM,CAsBR"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default pricing catalog for popular LLM models (USD per 1M tokens).
|
|
3
|
+
*
|
|
4
|
+
* Prices drift: treat this table as a fallback and prefer `CostTracker.setPricing()` /
|
|
5
|
+
* `registerPricingLoader()` (e.g. backed by models.dev) for authoritative values.
|
|
6
|
+
*/
|
|
7
|
+
export const DEFAULT_MODEL_PRICING = Object.freeze({
|
|
8
|
+
// OpenAI
|
|
9
|
+
'gpt-4.1': { input: 2.0, output: 8.0, cacheReadCostPer1M: 0.5 },
|
|
10
|
+
'gpt-4.1-mini': { input: 0.4, output: 1.6, cacheReadCostPer1M: 0.1 },
|
|
11
|
+
'gpt-4.1-nano': { input: 0.1, output: 0.4, cacheReadCostPer1M: 0.025 },
|
|
12
|
+
'gpt-4o': { input: 2.5, output: 10.0, cacheReadCostPer1M: 1.25 },
|
|
13
|
+
'gpt-4o-mini': { input: 0.15, output: 0.6, cacheReadCostPer1M: 0.075 },
|
|
14
|
+
'gpt-4-turbo': { input: 10.0, output: 30.0 },
|
|
15
|
+
'o1': { input: 15.0, output: 60.0, cacheReadCostPer1M: 7.5 },
|
|
16
|
+
'o1-mini': { input: 1.1, output: 4.4, cacheReadCostPer1M: 0.55 },
|
|
17
|
+
'o3': { input: 2.0, output: 8.0, cacheReadCostPer1M: 0.5 },
|
|
18
|
+
'o3-mini': { input: 1.1, output: 4.4, cacheReadCostPer1M: 0.55 },
|
|
19
|
+
'o4-mini': { input: 1.1, output: 4.4, cacheReadCostPer1M: 0.275 },
|
|
20
|
+
// Anthropic (cache read = 0.1x input, 5-minute cache write = 1.25x input)
|
|
21
|
+
'claude-opus-4-1': { input: 15.0, output: 75.0, cacheReadCostPer1M: 1.5, cacheWriteCostPer1M: 18.75 },
|
|
22
|
+
'claude-opus-4': { input: 15.0, output: 75.0, cacheReadCostPer1M: 1.5, cacheWriteCostPer1M: 18.75 },
|
|
23
|
+
'claude-sonnet-4-5': { input: 3.0, output: 15.0, cacheReadCostPer1M: 0.3, cacheWriteCostPer1M: 3.75 },
|
|
24
|
+
'claude-sonnet-4': { input: 3.0, output: 15.0, cacheReadCostPer1M: 0.3, cacheWriteCostPer1M: 3.75 },
|
|
25
|
+
'claude-haiku-4-5': { input: 1.0, output: 5.0, cacheReadCostPer1M: 0.1, cacheWriteCostPer1M: 1.25 },
|
|
26
|
+
'claude-3-7-sonnet': { input: 3.0, output: 15.0, cacheReadCostPer1M: 0.3, cacheWriteCostPer1M: 3.75 },
|
|
27
|
+
'claude-3-5-sonnet': { input: 3.0, output: 15.0, cacheReadCostPer1M: 0.3, cacheWriteCostPer1M: 3.75 },
|
|
28
|
+
'claude-3-5-haiku': { input: 0.8, output: 4.0, cacheReadCostPer1M: 0.08, cacheWriteCostPer1M: 1.0 },
|
|
29
|
+
'claude-haiku-3.5': { input: 0.8, output: 4.0, cacheReadCostPer1M: 0.08, cacheWriteCostPer1M: 1.0 },
|
|
30
|
+
'claude-3-opus': { input: 15.0, output: 75.0, cacheReadCostPer1M: 1.5, cacheWriteCostPer1M: 18.75 },
|
|
31
|
+
// Google (prices for prompts <= 200k tokens; reasoning is billed as output)
|
|
32
|
+
'gemini-2.5-pro': { input: 1.25, output: 10.0, cacheReadCostPer1M: 0.31 },
|
|
33
|
+
'gemini-2.5-flash': { input: 0.3, output: 2.5, cacheReadCostPer1M: 0.075 },
|
|
34
|
+
'gemini-2.5-flash-lite': { input: 0.1, output: 0.4, cacheReadCostPer1M: 0.025 },
|
|
35
|
+
'gemini-2.0-flash': { input: 0.1, output: 0.4, cacheReadCostPer1M: 0.025 },
|
|
36
|
+
'gemini-2.0-flash-lite': { input: 0.075, output: 0.3 },
|
|
37
|
+
'gemini-1.5-pro': { input: 1.25, output: 5.0 },
|
|
38
|
+
'gemini-1.5-flash': { input: 0.075, output: 0.3 },
|
|
39
|
+
// Groq / Open-source / Meta
|
|
40
|
+
'llama-3.3-70b-versatile': { input: 0.59, output: 0.79 },
|
|
41
|
+
'llama-3.3-70b': { input: 0.59, output: 0.79 },
|
|
42
|
+
'llama-3.1-70b': { input: 0.59, output: 0.79 },
|
|
43
|
+
'llama-3.1-8b': { input: 0.05, output: 0.08 },
|
|
44
|
+
// DeepSeek
|
|
45
|
+
'deepseek-chat': { input: 0.14, output: 0.28 },
|
|
46
|
+
'deepseek-reasoner': { input: 0.55, output: 2.19 },
|
|
47
|
+
});
|
|
48
|
+
/**
|
|
49
|
+
* Extracts normalized model name (removes provider prefix like 'openai/gpt-4o' -> 'gpt-4o').
|
|
50
|
+
*/
|
|
51
|
+
export function normalizeModelName(model) {
|
|
52
|
+
if (!model)
|
|
53
|
+
return '';
|
|
54
|
+
return model.split('/').pop() ?? model;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Candidate pricing keys for a model id, from most to least specific:
|
|
58
|
+
* `claude-3-7-sonnet-20250219` -> `claude-3-7-sonnet`, `gpt-4o-2024-08-06` -> `gpt-4o`,
|
|
59
|
+
* `claude-3-7-sonnet-latest` -> `claude-3-7-sonnet`.
|
|
60
|
+
*/
|
|
61
|
+
export function pricingKeyCandidates(model) {
|
|
62
|
+
const short = normalizeModelName(model);
|
|
63
|
+
const candidates = [model, short];
|
|
64
|
+
const stripped = short
|
|
65
|
+
.replace(/-latest$/, '')
|
|
66
|
+
.replace(/-\d{4}-\d{2}-\d{2}$/, '')
|
|
67
|
+
.replace(/-\d{8}$/, '')
|
|
68
|
+
.replace(/@\d{8}$/, '');
|
|
69
|
+
if (stripped !== short)
|
|
70
|
+
candidates.push(stripped);
|
|
71
|
+
return [...new Set(candidates.filter(Boolean))];
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Looks up pricing in `table`, tolerating dated/`-latest` variants of a known model.
|
|
75
|
+
* Uses own-property lookups only, so keys like `__proto__` or `constructor` never match.
|
|
76
|
+
*/
|
|
77
|
+
export function lookupPricing(model, table) {
|
|
78
|
+
const get = (key) => table instanceof Map
|
|
79
|
+
? table.get(key)
|
|
80
|
+
: Object.hasOwn(table, key)
|
|
81
|
+
? table[key]
|
|
82
|
+
: undefined;
|
|
83
|
+
const candidates = pricingKeyCandidates(model);
|
|
84
|
+
for (const key of candidates) {
|
|
85
|
+
const hit = get(key);
|
|
86
|
+
if (hit)
|
|
87
|
+
return hit;
|
|
88
|
+
}
|
|
89
|
+
// Longest known key that is a dash-delimited prefix of the model (e.g. `gpt-4.1-2025-04-14`).
|
|
90
|
+
const short = candidates[candidates.length - 1];
|
|
91
|
+
const keys = table instanceof Map ? [...table.keys()] : Object.keys(table);
|
|
92
|
+
let best;
|
|
93
|
+
for (const key of keys) {
|
|
94
|
+
if (short.startsWith(`${key}-`) && (!best || key.length > best.length))
|
|
95
|
+
best = key;
|
|
96
|
+
}
|
|
97
|
+
return best ? get(best) : undefined;
|
|
98
|
+
}
|
|
99
|
+
/** Coerces untrusted numbers (NaN, Infinity, negatives, non-numbers) to a safe non-negative value. */
|
|
100
|
+
export function toSafeTokens(value) {
|
|
101
|
+
return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : 0;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Computes USD cost for a call.
|
|
105
|
+
*
|
|
106
|
+
* `inputTokens` is the total input (cache reads/writes included) and `outputTokens` is the total
|
|
107
|
+
* output (reasoning included), matching the AI SDK usage convention. Cached tokens are billed at
|
|
108
|
+
* their dedicated rates and removed from the regular input charge; reasoning tokens are billed at
|
|
109
|
+
* `reasoningCostPer1M` when set, otherwise at the output rate.
|
|
110
|
+
*/
|
|
111
|
+
export function computeCost(pricing, inputTokens, outputTokens, details = {}) {
|
|
112
|
+
const input = toSafeTokens(inputTokens);
|
|
113
|
+
const output = toSafeTokens(outputTokens);
|
|
114
|
+
const cacheRead = Math.min(toSafeTokens(details.cacheReadTokens), input);
|
|
115
|
+
const cacheWrite = Math.min(toSafeTokens(details.cacheWriteTokens), input - cacheRead);
|
|
116
|
+
const reasoning = Math.min(toSafeTokens(details.reasoningTokens), output);
|
|
117
|
+
const cacheReadRate = pricing.cacheReadCostPer1M ?? pricing.cacheRead ?? pricing.input;
|
|
118
|
+
const cacheWriteRate = pricing.cacheWriteCostPer1M ?? pricing.cacheWrite ?? pricing.input;
|
|
119
|
+
const reasoningRate = pricing.reasoningCostPer1M ?? pricing.output;
|
|
120
|
+
const plainInput = input - cacheRead - cacheWrite;
|
|
121
|
+
const plainOutput = output - reasoning;
|
|
122
|
+
const total = plainInput * pricing.input +
|
|
123
|
+
cacheRead * cacheReadRate +
|
|
124
|
+
cacheWrite * cacheWriteRate +
|
|
125
|
+
plainOutput * pricing.output +
|
|
126
|
+
reasoning * reasoningRate;
|
|
127
|
+
return total / 1_000_000;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=pricing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pricing.js","sourceRoot":"","sources":["../../../src/budget/pricing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
export interface Logger {
|
|
2
|
+
info(message: string, ...args: unknown[]): void;
|
|
3
|
+
warn(message: string, ...args: unknown[]): void;
|
|
4
|
+
error(message: string, ...args: unknown[]): void;
|
|
5
|
+
debug?(message: string, ...args: unknown[]): void;
|
|
6
|
+
}
|
|
7
|
+
export interface ModelPricing {
|
|
8
|
+
/** Price in USD per 1M input tokens (non-cached input) */
|
|
9
|
+
input: number;
|
|
10
|
+
/** Price in USD per 1M output tokens (reasoning tokens included unless `reasoningCostPer1M` is set) */
|
|
11
|
+
output: number;
|
|
12
|
+
/**
|
|
13
|
+
* Price in USD per 1M cached-read input tokens.
|
|
14
|
+
* When omitted, cached reads are billed at the regular `input` price (conservative).
|
|
15
|
+
*/
|
|
16
|
+
cacheReadCostPer1M?: number;
|
|
17
|
+
/**
|
|
18
|
+
* Price in USD per 1M cache-write input tokens.
|
|
19
|
+
* When omitted, cache writes are billed at the regular `input` price (conservative).
|
|
20
|
+
*/
|
|
21
|
+
cacheWriteCostPer1M?: number;
|
|
22
|
+
/**
|
|
23
|
+
* Price in USD per 1M reasoning tokens, when a provider bills them separately from output.
|
|
24
|
+
* When omitted, reasoning tokens are billed at the `output` price.
|
|
25
|
+
*/
|
|
26
|
+
reasoningCostPer1M?: number;
|
|
27
|
+
/** @deprecated Use `cacheReadCostPer1M`. */
|
|
28
|
+
cacheRead?: number;
|
|
29
|
+
/** @deprecated Use `cacheWriteCostPer1M`. */
|
|
30
|
+
cacheWrite?: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Token breakdown used for cost calculation.
|
|
34
|
+
*
|
|
35
|
+
* Follows the AI SDK convention: `inputTokens` is the TOTAL input (cached tokens included)
|
|
36
|
+
* and `outputTokens` is the TOTAL output (reasoning tokens included).
|
|
37
|
+
*/
|
|
38
|
+
export interface TokenUsageDetails {
|
|
39
|
+
cacheReadTokens?: number;
|
|
40
|
+
cacheWriteTokens?: number;
|
|
41
|
+
reasoningTokens?: number;
|
|
42
|
+
}
|
|
43
|
+
export interface AgentCostRecord {
|
|
44
|
+
agentName: string;
|
|
45
|
+
model: string;
|
|
46
|
+
inputTokens: number;
|
|
47
|
+
outputTokens: number;
|
|
48
|
+
cacheReadTokens?: number;
|
|
49
|
+
cacheWriteTokens?: number;
|
|
50
|
+
reasoningTokens?: number;
|
|
51
|
+
totalTokens: number;
|
|
52
|
+
durationMs: number;
|
|
53
|
+
costUsd: number;
|
|
54
|
+
timestamp: number;
|
|
55
|
+
metadata?: Record<string, unknown>;
|
|
56
|
+
}
|
|
57
|
+
export interface AgentCostSummary {
|
|
58
|
+
tokens: number;
|
|
59
|
+
cost: number;
|
|
60
|
+
calls: number;
|
|
61
|
+
avgDurationMs: number;
|
|
62
|
+
totalDurationMs: number;
|
|
63
|
+
}
|
|
64
|
+
export interface BudgetModifier {
|
|
65
|
+
factor: string;
|
|
66
|
+
pctChange: number;
|
|
67
|
+
}
|
|
68
|
+
export interface BudgetAllocation {
|
|
69
|
+
perAgent: number;
|
|
70
|
+
perSession: number;
|
|
71
|
+
modifiers: BudgetModifier[];
|
|
72
|
+
totalModifierPct: number;
|
|
73
|
+
reason: string;
|
|
74
|
+
}
|
|
75
|
+
export interface BudgetEnforcerOptions {
|
|
76
|
+
perAgentMaxTokens?: number;
|
|
77
|
+
perSessionMaxTokens?: number;
|
|
78
|
+
perAgentMaxCostUsd?: number;
|
|
79
|
+
perSessionMaxCostUsd?: number;
|
|
80
|
+
}
|
|
81
|
+
export interface BudgetSummary {
|
|
82
|
+
sessionTokensUsed: number;
|
|
83
|
+
sessionMaxTokens: number;
|
|
84
|
+
sessionCostUsd: number;
|
|
85
|
+
sessionMaxCostUsd: number;
|
|
86
|
+
agentUsage: Record<string, {
|
|
87
|
+
tokens: number;
|
|
88
|
+
costUsd: number;
|
|
89
|
+
}>;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/budget/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;IAC/C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;IAC/C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;IAChD,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;CAClD;AAED,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAA;IACb,uGAAuG;IACvG,MAAM,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,cAAc,EAAE,CAAA;IAC3B,gBAAgB,EAAE,MAAM,CAAA;IACxB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,qBAAqB;IACpC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,iBAAiB,EAAE,MAAM,CAAA;IACzB,gBAAgB,EAAE,MAAM,CAAA;IACxB,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAA;IACzB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAChE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/budget/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/catalog/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/catalog/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { ModelPricing } from '../budget/types.js';
|
|
2
|
+
import { type ModelsDevLoadOptions, type ModelsDevRefreshOptions } from './source.js';
|
|
3
|
+
export interface ModelsDevModelLimit {
|
|
4
|
+
context?: number;
|
|
5
|
+
output?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface ModelsDevModelCost {
|
|
8
|
+
input?: number;
|
|
9
|
+
output?: number;
|
|
10
|
+
cache_read?: number;
|
|
11
|
+
cache_write?: number;
|
|
12
|
+
reasoning?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface ModelsDevModelModalities {
|
|
15
|
+
input?: string[];
|
|
16
|
+
output?: string[];
|
|
17
|
+
}
|
|
18
|
+
export interface ModelsDevModel {
|
|
19
|
+
id: string;
|
|
20
|
+
name: string;
|
|
21
|
+
description?: string;
|
|
22
|
+
family?: string;
|
|
23
|
+
tool_call?: boolean;
|
|
24
|
+
structured_output?: boolean;
|
|
25
|
+
attachment?: boolean;
|
|
26
|
+
reasoning?: boolean;
|
|
27
|
+
temperature?: boolean;
|
|
28
|
+
knowledge?: string;
|
|
29
|
+
release_date?: string;
|
|
30
|
+
last_updated?: string;
|
|
31
|
+
modalities?: ModelsDevModelModalities;
|
|
32
|
+
open_weights?: boolean;
|
|
33
|
+
limit?: ModelsDevModelLimit;
|
|
34
|
+
cost?: ModelsDevModelCost;
|
|
35
|
+
headers?: Record<string, string>;
|
|
36
|
+
[key: string]: unknown;
|
|
37
|
+
}
|
|
38
|
+
export interface ModelsDevProvider {
|
|
39
|
+
id: string;
|
|
40
|
+
name: string;
|
|
41
|
+
env: string[];
|
|
42
|
+
api?: string;
|
|
43
|
+
npm?: string;
|
|
44
|
+
protocol?: string;
|
|
45
|
+
models: Record<string, ModelsDevModel>;
|
|
46
|
+
[key: string]: unknown;
|
|
47
|
+
}
|
|
48
|
+
export type ModelsDevCatalog = Record<string, ModelsDevProvider>;
|
|
49
|
+
export interface ModelCatalogEntry {
|
|
50
|
+
id: string;
|
|
51
|
+
name: string;
|
|
52
|
+
providerId: string;
|
|
53
|
+
providerName: string;
|
|
54
|
+
contextLimit: number;
|
|
55
|
+
outputLimit: number;
|
|
56
|
+
toolCall: boolean;
|
|
57
|
+
structuredOutput: boolean;
|
|
58
|
+
pricing?: ModelPricing;
|
|
59
|
+
description?: string;
|
|
60
|
+
headers?: Record<string, string>;
|
|
61
|
+
rawModel?: ModelsDevModel;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Loads the models.dev catalog using in-memory and disk cache.
|
|
65
|
+
*/
|
|
66
|
+
export declare function loadModelsDev(options?: ModelsDevLoadOptions): Promise<ModelsDevCatalog>;
|
|
67
|
+
/**
|
|
68
|
+
* Refreshes the models.dev catalog from remote source or validates local cache.
|
|
69
|
+
*/
|
|
70
|
+
export declare function refreshModelsDev(options?: ModelsDevRefreshOptions): Promise<ModelsDevCatalog>;
|
|
71
|
+
/**
|
|
72
|
+
* Resets in-memory cached catalog.
|
|
73
|
+
*/
|
|
74
|
+
export declare function resetModelsDevCache(): void;
|
|
75
|
+
/**
|
|
76
|
+
* Looks up a model by provider ID and model ID.
|
|
77
|
+
*/
|
|
78
|
+
export declare function findModel(providerId: string, modelId: string): Promise<ModelCatalogEntry | undefined>;
|
|
79
|
+
/**
|
|
80
|
+
* Lists all providers in the catalog.
|
|
81
|
+
*/
|
|
82
|
+
export declare function listProviders(): Promise<ModelsDevProvider[]>;
|
|
83
|
+
/**
|
|
84
|
+
* Lists models, optionally filtered by provider.
|
|
85
|
+
*/
|
|
86
|
+
export declare function listModels(providerId?: string): Promise<ModelCatalogEntry[]>;
|
|
87
|
+
//# sourceMappingURL=models_dev.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models_dev.d.ts","sourceRoot":"","sources":["../../../src/catalog/models_dev.ts"],"names":[],"mappings":"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"}
|