ai-cost-analyzer 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of ai-cost-analyzer might be problematic. Click here for more details.
- package/README.md +228 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +219 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/analyze.d.ts +6 -0
- package/dist/tools/analyze.d.ts.map +1 -0
- package/dist/tools/analyze.js +210 -0
- package/dist/tools/analyze.js.map +1 -0
- package/dist/tools/compare.d.ts +6 -0
- package/dist/tools/compare.d.ts.map +1 -0
- package/dist/tools/compare.js +212 -0
- package/dist/tools/compare.js.map +1 -0
- package/dist/tools/optimize.d.ts +6 -0
- package/dist/tools/optimize.d.ts.map +1 -0
- package/dist/tools/optimize.js +204 -0
- package/dist/tools/optimize.js.map +1 -0
- package/dist/tools/pricing.d.ts +16 -0
- package/dist/tools/pricing.d.ts.map +1 -0
- package/dist/tools/pricing.js +162 -0
- package/dist/tools/pricing.js.map +1 -0
- package/dist/tools/savings.d.ts +6 -0
- package/dist/tools/savings.d.ts.map +1 -0
- package/dist/tools/savings.js +193 -0
- package/dist/tools/savings.js.map +1 -0
- package/dist/types.d.ts +144 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +41 -0
- package/src/index.ts +291 -0
- package/src/tools/analyze.ts +260 -0
- package/src/tools/compare.ts +282 -0
- package/src/tools/optimize.ts +291 -0
- package/src/tools/pricing.ts +197 -0
- package/src/tools/savings.ts +238 -0
- package/src/types.ts +183 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* analyze_usage tool -- accepts API usage data and returns cost analysis.
|
|
3
|
+
*/
|
|
4
|
+
import { resolveModelId, computeCost, MODEL_PRICING } from "./pricing.js";
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Constants for waste estimation
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
/** Average tokens per tool definition (name + description + schema). */
|
|
9
|
+
const AVG_TOKENS_PER_TOOL_DEF = 350;
|
|
10
|
+
/** Threshold above which a system prompt is considered "oversized". */
|
|
11
|
+
const SYSTEM_PROMPT_OVERSIZE_THRESHOLD = 2000;
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Main handler
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
export function handleAnalyzeUsage(records) {
|
|
16
|
+
if (records.length === 0) {
|
|
17
|
+
return "No usage records provided. Please supply at least one record.";
|
|
18
|
+
}
|
|
19
|
+
const analysis = analyzeRecords(records);
|
|
20
|
+
return formatAnalysis(analysis);
|
|
21
|
+
}
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// Core analysis logic
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
function analyzeRecords(records) {
|
|
26
|
+
// ---- cost by model ----
|
|
27
|
+
const byModel = new Map();
|
|
28
|
+
for (const r of records) {
|
|
29
|
+
const key = r.model;
|
|
30
|
+
if (!byModel.has(key))
|
|
31
|
+
byModel.set(key, []);
|
|
32
|
+
byModel.get(key).push(r);
|
|
33
|
+
}
|
|
34
|
+
const costByModel = [];
|
|
35
|
+
for (const [model, recs] of byModel) {
|
|
36
|
+
const modelId = resolveModelId(model);
|
|
37
|
+
let totalInput = 0;
|
|
38
|
+
let totalOutput = 0;
|
|
39
|
+
let totalCached = 0;
|
|
40
|
+
let inputCost = 0;
|
|
41
|
+
let outputCost = 0;
|
|
42
|
+
let cacheSavings = 0;
|
|
43
|
+
for (const r of recs) {
|
|
44
|
+
totalInput += r.input_tokens;
|
|
45
|
+
totalOutput += r.output_tokens;
|
|
46
|
+
totalCached += r.cached_tokens ?? 0;
|
|
47
|
+
if (modelId) {
|
|
48
|
+
const c = computeCost(modelId, r.input_tokens, r.output_tokens, r.cached_tokens ?? 0);
|
|
49
|
+
inputCost += c.inputCost;
|
|
50
|
+
outputCost += c.outputCost;
|
|
51
|
+
cacheSavings += c.cacheSavings;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
costByModel.push({
|
|
55
|
+
model,
|
|
56
|
+
requestCount: recs.length,
|
|
57
|
+
totalInputTokens: totalInput,
|
|
58
|
+
totalOutputTokens: totalOutput,
|
|
59
|
+
totalCachedTokens: totalCached,
|
|
60
|
+
inputCost,
|
|
61
|
+
outputCost,
|
|
62
|
+
cacheSavings,
|
|
63
|
+
totalCost: inputCost + outputCost,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
// ---- aggregates ----
|
|
67
|
+
const totalRequests = records.length;
|
|
68
|
+
const totalCost = costByModel.reduce((s, m) => s + m.totalCost, 0);
|
|
69
|
+
const totalInputTokens = costByModel.reduce((s, m) => s + m.totalInputTokens, 0);
|
|
70
|
+
const totalOutputTokens = costByModel.reduce((s, m) => s + m.totalOutputTokens, 0);
|
|
71
|
+
const totalCachedTokens = costByModel.reduce((s, m) => s + m.totalCachedTokens, 0);
|
|
72
|
+
const avgCostPerRequest = totalRequests > 0 ? totalCost / totalRequests : 0;
|
|
73
|
+
// ---- waste estimation ----
|
|
74
|
+
let unusedToolTokens = 0;
|
|
75
|
+
let oversizedPromptTokens = 0;
|
|
76
|
+
for (const r of records) {
|
|
77
|
+
if (r.tool_definitions && r.tool_definitions > 5) {
|
|
78
|
+
// Estimate ~40% of tool tokens are typically unused per request
|
|
79
|
+
unusedToolTokens += Math.round(r.tool_definitions * AVG_TOKENS_PER_TOOL_DEF * 0.4);
|
|
80
|
+
}
|
|
81
|
+
if (r.system_prompt_tokens && r.system_prompt_tokens > SYSTEM_PROMPT_OVERSIZE_THRESHOLD) {
|
|
82
|
+
oversizedPromptTokens += r.system_prompt_tokens - SYSTEM_PROMPT_OVERSIZE_THRESHOLD;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Estimate waste cost using a blended average input price
|
|
86
|
+
const avgInputPrice = totalInputTokens > 0 ? costByModel.reduce((s, m) => {
|
|
87
|
+
const mid = resolveModelId(m.model);
|
|
88
|
+
if (!mid)
|
|
89
|
+
return s;
|
|
90
|
+
return s + (m.totalInputTokens / totalInputTokens) * MODEL_PRICING[mid].inputPerMillion;
|
|
91
|
+
}, 0) : 3; // default to Sonnet-class pricing
|
|
92
|
+
const wasteTokens = unusedToolTokens + oversizedPromptTokens;
|
|
93
|
+
const wasteCost = (wasteTokens / 1_000_000) * avgInputPrice;
|
|
94
|
+
const wastePercentage = totalCost > 0 ? (wasteCost / totalCost) * 100 : 0;
|
|
95
|
+
// ---- trends ----
|
|
96
|
+
const daily = computeTrends(records, "day");
|
|
97
|
+
const weekly = computeTrends(records, "week");
|
|
98
|
+
return {
|
|
99
|
+
summary: {
|
|
100
|
+
totalRequests,
|
|
101
|
+
totalCost,
|
|
102
|
+
avgCostPerRequest,
|
|
103
|
+
totalInputTokens,
|
|
104
|
+
totalOutputTokens,
|
|
105
|
+
totalCachedTokens,
|
|
106
|
+
},
|
|
107
|
+
costByModel,
|
|
108
|
+
wasteEstimation: {
|
|
109
|
+
unusedToolDefinitionTokens: unusedToolTokens,
|
|
110
|
+
oversizedSystemPromptTokens: oversizedPromptTokens,
|
|
111
|
+
estimatedWasteCost: wasteCost,
|
|
112
|
+
wastePercentage,
|
|
113
|
+
},
|
|
114
|
+
trends: { daily, weekly },
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
// Trend helpers
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
function computeTrends(records, granularity) {
|
|
121
|
+
const buckets = new Map();
|
|
122
|
+
for (const r of records) {
|
|
123
|
+
const d = new Date(r.timestamp);
|
|
124
|
+
if (isNaN(d.getTime()))
|
|
125
|
+
continue;
|
|
126
|
+
let key;
|
|
127
|
+
if (granularity === "day") {
|
|
128
|
+
key = d.toISOString().slice(0, 10);
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
// ISO week: use Monday of the week
|
|
132
|
+
const day = d.getDay();
|
|
133
|
+
const diff = d.getDate() - day + (day === 0 ? -6 : 1);
|
|
134
|
+
const monday = new Date(d);
|
|
135
|
+
monday.setDate(diff);
|
|
136
|
+
key = `Week of ${monday.toISOString().slice(0, 10)}`;
|
|
137
|
+
}
|
|
138
|
+
if (!buckets.has(key))
|
|
139
|
+
buckets.set(key, []);
|
|
140
|
+
buckets.get(key).push(r);
|
|
141
|
+
}
|
|
142
|
+
const points = [];
|
|
143
|
+
for (const [period, recs] of [...buckets].sort((a, b) => a[0].localeCompare(b[0]))) {
|
|
144
|
+
let totalCost = 0;
|
|
145
|
+
for (const r of recs) {
|
|
146
|
+
const mid = resolveModelId(r.model);
|
|
147
|
+
if (mid) {
|
|
148
|
+
totalCost += computeCost(mid, r.input_tokens, r.output_tokens, r.cached_tokens ?? 0).totalCost;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
points.push({
|
|
152
|
+
period,
|
|
153
|
+
requestCount: recs.length,
|
|
154
|
+
totalCost,
|
|
155
|
+
avgCostPerRequest: recs.length > 0 ? totalCost / recs.length : 0,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
return points;
|
|
159
|
+
}
|
|
160
|
+
// ---------------------------------------------------------------------------
|
|
161
|
+
// Formatting
|
|
162
|
+
// ---------------------------------------------------------------------------
|
|
163
|
+
function formatAnalysis(a) {
|
|
164
|
+
const lines = [];
|
|
165
|
+
lines.push("# AI API Usage Analysis\n");
|
|
166
|
+
// Summary
|
|
167
|
+
lines.push("## Summary");
|
|
168
|
+
lines.push(`- **Total Requests:** ${a.summary.totalRequests.toLocaleString()}`);
|
|
169
|
+
lines.push(`- **Total Cost:** $${a.summary.totalCost.toFixed(4)}`);
|
|
170
|
+
lines.push(`- **Avg Cost/Request:** $${a.summary.avgCostPerRequest.toFixed(6)}`);
|
|
171
|
+
lines.push(`- **Total Input Tokens:** ${a.summary.totalInputTokens.toLocaleString()}`);
|
|
172
|
+
lines.push(`- **Total Output Tokens:** ${a.summary.totalOutputTokens.toLocaleString()}`);
|
|
173
|
+
lines.push(`- **Total Cached Tokens:** ${a.summary.totalCachedTokens.toLocaleString()}`);
|
|
174
|
+
lines.push("");
|
|
175
|
+
// Cost by model
|
|
176
|
+
lines.push("## Cost Breakdown by Model");
|
|
177
|
+
lines.push("| Model | Requests | Input Cost | Output Cost | Cache Savings | Total Cost |");
|
|
178
|
+
lines.push("|-------|----------|------------|-------------|---------------|------------|");
|
|
179
|
+
for (const m of a.costByModel) {
|
|
180
|
+
lines.push(`| ${m.model} | ${m.requestCount} | $${m.inputCost.toFixed(4)} | $${m.outputCost.toFixed(4)} | $${m.cacheSavings.toFixed(4)} | $${m.totalCost.toFixed(4)} |`);
|
|
181
|
+
}
|
|
182
|
+
lines.push("");
|
|
183
|
+
// Waste
|
|
184
|
+
lines.push("## Token Waste Estimation");
|
|
185
|
+
lines.push(`- **Unused Tool Definition Tokens:** ~${a.wasteEstimation.unusedToolDefinitionTokens.toLocaleString()}`);
|
|
186
|
+
lines.push(`- **Oversized System Prompt Tokens:** ~${a.wasteEstimation.oversizedSystemPromptTokens.toLocaleString()}`);
|
|
187
|
+
lines.push(`- **Estimated Waste Cost:** $${a.wasteEstimation.estimatedWasteCost.toFixed(4)} (${a.wasteEstimation.wastePercentage.toFixed(1)}% of total)`);
|
|
188
|
+
lines.push("");
|
|
189
|
+
// Trends
|
|
190
|
+
if (a.trends.daily.length > 0) {
|
|
191
|
+
lines.push("## Daily Trends");
|
|
192
|
+
lines.push("| Date | Requests | Total Cost | Avg Cost/Req |");
|
|
193
|
+
lines.push("|------|----------|------------|--------------|");
|
|
194
|
+
for (const t of a.trends.daily) {
|
|
195
|
+
lines.push(`| ${t.period} | ${t.requestCount} | $${t.totalCost.toFixed(4)} | $${t.avgCostPerRequest.toFixed(6)} |`);
|
|
196
|
+
}
|
|
197
|
+
lines.push("");
|
|
198
|
+
}
|
|
199
|
+
if (a.trends.weekly.length > 0) {
|
|
200
|
+
lines.push("## Weekly Trends");
|
|
201
|
+
lines.push("| Week | Requests | Total Cost | Avg Cost/Req |");
|
|
202
|
+
lines.push("|------|----------|------------|--------------|");
|
|
203
|
+
for (const t of a.trends.weekly) {
|
|
204
|
+
lines.push(`| ${t.period} | ${t.requestCount} | $${t.totalCost.toFixed(4)} | $${t.avgCostPerRequest.toFixed(6)} |`);
|
|
205
|
+
}
|
|
206
|
+
lines.push("");
|
|
207
|
+
}
|
|
208
|
+
return lines.join("\n");
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=analyze.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/tools/analyze.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* compare_models tool -- compares cost and quality across LLM models
|
|
3
|
+
* for a given task description.
|
|
4
|
+
*/
|
|
5
|
+
export declare function handleCompareModels(taskDescription: string, estimatedInputTokens?: number, estimatedOutputTokens?: number): string;
|
|
6
|
+
//# sourceMappingURL=compare.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../src/tools/compare.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgKH,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,MAAM,EACvB,oBAAoB,CAAC,EAAE,MAAM,EAC7B,qBAAqB,CAAC,EAAE,MAAM,GAC7B,MAAM,CA8GR"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* compare_models tool -- compares cost and quality across LLM models
|
|
3
|
+
* for a given task description.
|
|
4
|
+
*/
|
|
5
|
+
import { MODEL_PRICING } from "./pricing.js";
|
|
6
|
+
const SIMPLE_KEYWORDS = [
|
|
7
|
+
"classify", "classification", "categorize", "label", "tag",
|
|
8
|
+
"extract", "extraction", "parse", "format", "convert",
|
|
9
|
+
"summarize", "summary", "tldr", "translate", "translation",
|
|
10
|
+
"sentiment", "detect", "filter", "validate", "check",
|
|
11
|
+
"yes/no", "true/false", "simple",
|
|
12
|
+
];
|
|
13
|
+
const COMPLEX_KEYWORDS = [
|
|
14
|
+
"analyze", "analysis", "research", "write", "essay", "article",
|
|
15
|
+
"code", "implement", "build", "create", "design", "architect",
|
|
16
|
+
"debug", "refactor", "review", "reason", "explain", "teach",
|
|
17
|
+
"creative", "novel", "brainstorm", "strategy", "plan",
|
|
18
|
+
"math", "proof", "complex", "multi-step", "nuanced",
|
|
19
|
+
];
|
|
20
|
+
function classifyTask(description) {
|
|
21
|
+
const lower = description.toLowerCase();
|
|
22
|
+
const words = lower.split(/\s+/);
|
|
23
|
+
const wordCount = words.length;
|
|
24
|
+
let simpleScore = 0;
|
|
25
|
+
let complexScore = 0;
|
|
26
|
+
for (const kw of SIMPLE_KEYWORDS) {
|
|
27
|
+
if (lower.includes(kw))
|
|
28
|
+
simpleScore++;
|
|
29
|
+
}
|
|
30
|
+
for (const kw of COMPLEX_KEYWORDS) {
|
|
31
|
+
if (lower.includes(kw))
|
|
32
|
+
complexScore++;
|
|
33
|
+
}
|
|
34
|
+
let complexity;
|
|
35
|
+
let estimatedInputTokens;
|
|
36
|
+
let estimatedOutputTokens;
|
|
37
|
+
if (complexScore > simpleScore || wordCount > 50) {
|
|
38
|
+
complexity = "complex";
|
|
39
|
+
estimatedInputTokens = 4000;
|
|
40
|
+
estimatedOutputTokens = 2000;
|
|
41
|
+
}
|
|
42
|
+
else if (simpleScore > complexScore) {
|
|
43
|
+
complexity = "simple";
|
|
44
|
+
estimatedInputTokens = 500;
|
|
45
|
+
estimatedOutputTokens = 200;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
complexity = "moderate";
|
|
49
|
+
estimatedInputTokens = 1500;
|
|
50
|
+
estimatedOutputTokens = 800;
|
|
51
|
+
}
|
|
52
|
+
return { complexity, estimatedInputTokens, estimatedOutputTokens, description };
|
|
53
|
+
}
|
|
54
|
+
const MODEL_INFO = {
|
|
55
|
+
"claude-opus": {
|
|
56
|
+
modelId: "claude-opus",
|
|
57
|
+
qualityLabel: "Frontier",
|
|
58
|
+
recommendation: "Best-in-class for complex reasoning, research, and agentic tasks. Premium pricing.",
|
|
59
|
+
bestFor: [
|
|
60
|
+
"Complex multi-step reasoning",
|
|
61
|
+
"Research and analysis",
|
|
62
|
+
"Agentic coding workflows",
|
|
63
|
+
"Nuanced creative writing",
|
|
64
|
+
"Tasks requiring highest accuracy",
|
|
65
|
+
],
|
|
66
|
+
},
|
|
67
|
+
"claude-sonnet": {
|
|
68
|
+
modelId: "claude-sonnet",
|
|
69
|
+
qualityLabel: "Strong",
|
|
70
|
+
recommendation: "Best balance of quality and cost. Ideal default for most production workloads.",
|
|
71
|
+
bestFor: [
|
|
72
|
+
"General-purpose AI applications",
|
|
73
|
+
"Code generation and review",
|
|
74
|
+
"Content creation",
|
|
75
|
+
"Data analysis",
|
|
76
|
+
"Customer-facing chatbots",
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
"claude-haiku": {
|
|
80
|
+
modelId: "claude-haiku",
|
|
81
|
+
qualityLabel: "Fast / Economy",
|
|
82
|
+
recommendation: "Fastest and most affordable Claude model. Great for high-volume, simpler tasks.",
|
|
83
|
+
bestFor: [
|
|
84
|
+
"Classification and tagging",
|
|
85
|
+
"Data extraction",
|
|
86
|
+
"Simple Q&A",
|
|
87
|
+
"Content moderation",
|
|
88
|
+
"High-volume batch processing",
|
|
89
|
+
],
|
|
90
|
+
},
|
|
91
|
+
"gpt-4o": {
|
|
92
|
+
modelId: "gpt-4o",
|
|
93
|
+
qualityLabel: "Strong",
|
|
94
|
+
recommendation: "Strong multimodal model with good cost efficiency. Competitive with Sonnet.",
|
|
95
|
+
bestFor: [
|
|
96
|
+
"Multimodal tasks (image + text)",
|
|
97
|
+
"General-purpose applications",
|
|
98
|
+
"Structured data extraction",
|
|
99
|
+
"Code generation",
|
|
100
|
+
"Function calling",
|
|
101
|
+
],
|
|
102
|
+
},
|
|
103
|
+
"gpt-4o-mini": {
|
|
104
|
+
modelId: "gpt-4o-mini",
|
|
105
|
+
qualityLabel: "Fast / Economy",
|
|
106
|
+
recommendation: "Very affordable for simple tasks. Good alternative to Haiku for OpenAI users.",
|
|
107
|
+
bestFor: [
|
|
108
|
+
"Simple classification",
|
|
109
|
+
"Text extraction",
|
|
110
|
+
"Lightweight summarization",
|
|
111
|
+
"Batch processing on budget",
|
|
112
|
+
"Prototyping and testing",
|
|
113
|
+
],
|
|
114
|
+
},
|
|
115
|
+
"gemini-2.0-flash": {
|
|
116
|
+
modelId: "gemini-2.0-flash",
|
|
117
|
+
qualityLabel: "Fast / Economy",
|
|
118
|
+
recommendation: "Cheapest option with massive 1M context window. Best for long-context budget tasks.",
|
|
119
|
+
bestFor: [
|
|
120
|
+
"Long document processing",
|
|
121
|
+
"Large context window needs (1M tokens)",
|
|
122
|
+
"Budget-conscious batch jobs",
|
|
123
|
+
"Simple extraction from large docs",
|
|
124
|
+
"High-volume low-complexity tasks",
|
|
125
|
+
],
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
// ---------------------------------------------------------------------------
|
|
129
|
+
// Main handler
|
|
130
|
+
// ---------------------------------------------------------------------------
|
|
131
|
+
export function handleCompareModels(taskDescription, estimatedInputTokens, estimatedOutputTokens) {
|
|
132
|
+
const task = classifyTask(taskDescription);
|
|
133
|
+
// Allow user overrides for token estimates
|
|
134
|
+
if (estimatedInputTokens !== undefined)
|
|
135
|
+
task.estimatedInputTokens = estimatedInputTokens;
|
|
136
|
+
if (estimatedOutputTokens !== undefined)
|
|
137
|
+
task.estimatedOutputTokens = estimatedOutputTokens;
|
|
138
|
+
const lines = [];
|
|
139
|
+
lines.push("# Model Comparison\n");
|
|
140
|
+
lines.push(`**Task:** ${taskDescription}`);
|
|
141
|
+
lines.push(`**Estimated Complexity:** ${capitalize(task.complexity)}`);
|
|
142
|
+
lines.push(`**Estimated Tokens:** ~${task.estimatedInputTokens.toLocaleString()} input, ~${task.estimatedOutputTokens.toLocaleString()} output`);
|
|
143
|
+
lines.push("");
|
|
144
|
+
// Cost comparison table
|
|
145
|
+
lines.push("## Cost Comparison\n");
|
|
146
|
+
lines.push("| Model | Provider | Tier | Cost/Request | Cost/1K Requests | Monthly (10K req) |");
|
|
147
|
+
lines.push("|-------|----------|------|-------------|------------------|-------------------|");
|
|
148
|
+
const entries = [];
|
|
149
|
+
for (const [id, pricing] of Object.entries(MODEL_PRICING)) {
|
|
150
|
+
const mid = id;
|
|
151
|
+
const inputCost = (task.estimatedInputTokens / 1_000_000) * pricing.inputPerMillion;
|
|
152
|
+
const outputCost = (task.estimatedOutputTokens / 1_000_000) * pricing.outputPerMillion;
|
|
153
|
+
const costPerReq = inputCost + outputCost;
|
|
154
|
+
const per1k = costPerReq * 1000;
|
|
155
|
+
const monthly = costPerReq * 10_000;
|
|
156
|
+
entries.push({ id: mid, costPerReq, per1k, monthly });
|
|
157
|
+
const info = MODEL_INFO[mid];
|
|
158
|
+
lines.push(`| ${pricing.name} | ${pricing.provider} | ${info.qualityLabel} | $${costPerReq.toFixed(6)} | $${per1k.toFixed(2)} | $${monthly.toFixed(2)} |`);
|
|
159
|
+
}
|
|
160
|
+
lines.push("");
|
|
161
|
+
// Sort by cost for ranking
|
|
162
|
+
entries.sort((a, b) => a.costPerReq - b.costPerReq);
|
|
163
|
+
const cheapest = entries[0];
|
|
164
|
+
const mostExpensive = entries[entries.length - 1];
|
|
165
|
+
const ratio = mostExpensive.costPerReq / cheapest.costPerReq;
|
|
166
|
+
lines.push("## Cost Spread");
|
|
167
|
+
lines.push(`- **Cheapest:** ${MODEL_PRICING[cheapest.id].name} at $${cheapest.costPerReq.toFixed(6)}/request`);
|
|
168
|
+
lines.push(`- **Most Expensive:** ${MODEL_PRICING[mostExpensive.id].name} at $${mostExpensive.costPerReq.toFixed(6)}/request`);
|
|
169
|
+
lines.push(`- **Price Ratio:** ${ratio.toFixed(0)}x difference between cheapest and most expensive`);
|
|
170
|
+
lines.push("");
|
|
171
|
+
// Recommendations by task complexity
|
|
172
|
+
lines.push("## Recommendations\n");
|
|
173
|
+
if (task.complexity === "simple") {
|
|
174
|
+
lines.push(`For this **simple** task, we recommend **${MODEL_PRICING["claude-haiku"].name}** or **${MODEL_PRICING["gemini-2.0-flash"].name}**.`);
|
|
175
|
+
lines.push("");
|
|
176
|
+
lines.push("Simple tasks (classification, extraction, formatting) rarely benefit from frontier models. " +
|
|
177
|
+
"Using an economy-tier model can save 90%+ without meaningful quality loss.");
|
|
178
|
+
}
|
|
179
|
+
else if (task.complexity === "moderate") {
|
|
180
|
+
lines.push(`For this **moderate** task, we recommend **${MODEL_PRICING["claude-sonnet"].name}** or **${MODEL_PRICING["gpt-4o"].name}**.`);
|
|
181
|
+
lines.push("");
|
|
182
|
+
lines.push("Moderate tasks benefit from strong reasoning but don't require frontier-tier models. " +
|
|
183
|
+
"Sonnet and GPT-4o offer an excellent quality-to-cost ratio.");
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
lines.push(`For this **complex** task, we recommend **${MODEL_PRICING["claude-opus"].name}** for best quality, ` +
|
|
187
|
+
`or **${MODEL_PRICING["claude-sonnet"].name}** for a cost-effective alternative.`);
|
|
188
|
+
lines.push("");
|
|
189
|
+
lines.push("Complex reasoning, multi-step analysis, and creative tasks benefit most from frontier models. " +
|
|
190
|
+
"Consider using Opus for critical tasks and Sonnet for iterations/drafts.");
|
|
191
|
+
}
|
|
192
|
+
lines.push("");
|
|
193
|
+
// Per-model details
|
|
194
|
+
lines.push("## Model Details\n");
|
|
195
|
+
for (const [id, info] of Object.entries(MODEL_INFO)) {
|
|
196
|
+
const mid = id;
|
|
197
|
+
const pricing = MODEL_PRICING[mid];
|
|
198
|
+
lines.push(`### ${pricing.name} (${pricing.provider})`);
|
|
199
|
+
lines.push(`> ${info.recommendation}`);
|
|
200
|
+
lines.push("");
|
|
201
|
+
lines.push("**Best for:**");
|
|
202
|
+
for (const b of info.bestFor) {
|
|
203
|
+
lines.push(`- ${b}`);
|
|
204
|
+
}
|
|
205
|
+
lines.push("");
|
|
206
|
+
}
|
|
207
|
+
return lines.join("\n");
|
|
208
|
+
}
|
|
209
|
+
function capitalize(s) {
|
|
210
|
+
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=compare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare.js","sourceRoot":"","sources":["../../src/tools/compare.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* optimize_prompt tool -- analyzes system prompts and tool definitions,
|
|
3
|
+
* returns an optimized version with recommendations.
|
|
4
|
+
*/
|
|
5
|
+
export declare function handleOptimizePrompt(systemPrompt: string, toolDefinitions: string[], requestsPerMonth?: number, model?: string): string;
|
|
6
|
+
//# sourceMappingURL=optimize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimize.d.ts","sourceRoot":"","sources":["../../src/tools/optimize.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkBH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,EAAE,EACzB,gBAAgB,CAAC,EAAE,MAAM,EACzB,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,CAsGR"}
|