squads-cli 0.6.1 → 0.7.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/README.md +196 -1152
- package/dist/auth-YW3UPFSB.js +23 -0
- package/dist/autonomy-BWTVDEAT.js +102 -0
- package/dist/autonomy-BWTVDEAT.js.map +1 -0
- package/dist/chunk-3KCWNZWW.js +401 -0
- package/dist/chunk-3KCWNZWW.js.map +1 -0
- package/dist/chunk-67RO2HKR.js +174 -0
- package/dist/chunk-67RO2HKR.js.map +1 -0
- package/dist/chunk-7JVD7RD4.js +275 -0
- package/dist/chunk-7JVD7RD4.js.map +1 -0
- package/dist/chunk-BODLDQY7.js +452 -0
- package/dist/chunk-BODLDQY7.js.map +1 -0
- package/dist/chunk-FFFCFZ6A.js +121 -0
- package/dist/chunk-FFFCFZ6A.js.map +1 -0
- package/dist/chunk-FIWT2NMM.js +165 -0
- package/dist/chunk-FIWT2NMM.js.map +1 -0
- package/dist/chunk-L6GQCHDF.js +222 -0
- package/dist/chunk-L6GQCHDF.js.map +1 -0
- package/dist/{chunk-O7UV3FWI.js → chunk-LDM62TIX.js} +2 -2
- package/dist/chunk-LDM62TIX.js.map +1 -0
- package/dist/chunk-LOA3KWYJ.js +294 -0
- package/dist/chunk-LOA3KWYJ.js.map +1 -0
- package/dist/chunk-NA45DFXY.js +616 -0
- package/dist/chunk-NA45DFXY.js.map +1 -0
- package/dist/{chunk-4CMAEQQY.js → chunk-NQN6JPI7.js} +4 -3
- package/dist/chunk-NQN6JPI7.js.map +1 -0
- package/dist/chunk-OQJHPULO.js +103 -0
- package/dist/chunk-OQJHPULO.js.map +1 -0
- package/dist/chunk-QHNUMM4V.js +87 -0
- package/dist/chunk-QHNUMM4V.js.map +1 -0
- package/dist/chunk-RM6BWILN.js +74 -0
- package/dist/chunk-RM6BWILN.js.map +1 -0
- package/dist/chunk-WBR5J7EX.js +90 -0
- package/dist/chunk-WBR5J7EX.js.map +1 -0
- package/dist/chunk-Z2UKDBNL.js +162 -0
- package/dist/chunk-Z2UKDBNL.js.map +1 -0
- package/dist/cli.js +2151 -12594
- package/dist/cli.js.map +1 -1
- package/dist/context-M2A2DOFV.js +291 -0
- package/dist/context-M2A2DOFV.js.map +1 -0
- package/dist/context-feed-JMNW4GAM.js +391 -0
- package/dist/context-feed-JMNW4GAM.js.map +1 -0
- package/dist/cost-N37I4UTA.js +274 -0
- package/dist/cost-N37I4UTA.js.map +1 -0
- package/dist/create-554W5HNU.js +286 -0
- package/dist/create-554W5HNU.js.map +1 -0
- package/dist/daemon-XWPQPPPN.js +546 -0
- package/dist/daemon-XWPQPPPN.js.map +1 -0
- package/dist/dashboard-L7YKVQEB.js +945 -0
- package/dist/dashboard-L7YKVQEB.js.map +1 -0
- package/dist/dashboard-MFNRLCEE.js +794 -0
- package/dist/dashboard-MFNRLCEE.js.map +1 -0
- package/dist/doctor-RG75M5RO.js +346 -0
- package/dist/doctor-RG75M5RO.js.map +1 -0
- package/dist/env-config-KCLDBKYX.js +21 -0
- package/dist/exec-JQKBF7BL.js +197 -0
- package/dist/exec-JQKBF7BL.js.map +1 -0
- package/dist/feedback-KA2UYBZG.js +229 -0
- package/dist/feedback-KA2UYBZG.js.map +1 -0
- package/dist/github-UQTM5KMS.js +23 -0
- package/dist/goal-EOPC5ZCD.js +168 -0
- package/dist/goal-EOPC5ZCD.js.map +1 -0
- package/dist/health-3FZDOSR5.js +209 -0
- package/dist/health-3FZDOSR5.js.map +1 -0
- package/dist/history-TFVXJEDH.js +229 -0
- package/dist/history-TFVXJEDH.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/init-UOWTNMIE.js +747 -0
- package/dist/init-UOWTNMIE.js.map +1 -0
- package/dist/kpi-2SQ2WCVT.js +413 -0
- package/dist/kpi-2SQ2WCVT.js.map +1 -0
- package/dist/learn-6ERTERAO.js +269 -0
- package/dist/learn-6ERTERAO.js.map +1 -0
- package/dist/list-KSOMUBMB.js +92 -0
- package/dist/list-KSOMUBMB.js.map +1 -0
- package/dist/login-ST6PAXYE.js +155 -0
- package/dist/login-ST6PAXYE.js.map +1 -0
- package/dist/memory-3CSNKXIL.js +562 -0
- package/dist/memory-3CSNKXIL.js.map +1 -0
- package/dist/progress-FKG4V2VH.js +202 -0
- package/dist/progress-FKG4V2VH.js.map +1 -0
- package/dist/providers-66PDCORB.js +65 -0
- package/dist/providers-66PDCORB.js.map +1 -0
- package/dist/results-2MJFLWEO.js +224 -0
- package/dist/results-2MJFLWEO.js.map +1 -0
- package/dist/run-72OQLH5A.js +2685 -0
- package/dist/run-72OQLH5A.js.map +1 -0
- package/dist/session-6H67XPAQ.js +64 -0
- package/dist/session-6H67XPAQ.js.map +1 -0
- package/dist/{chunk-NHGLXN2F.js → sessions-GVQIMN4W.js} +23 -459
- package/dist/sessions-GVQIMN4W.js.map +1 -0
- package/dist/{squad-parser-4BI3G4RS.js → squad-parser-CM3HOIWM.js} +2 -2
- package/dist/squad-parser-CM3HOIWM.js.map +1 -0
- package/dist/stats-ONZI557Q.js +335 -0
- package/dist/stats-ONZI557Q.js.map +1 -0
- package/dist/status-FYH42FTB.js +346 -0
- package/dist/status-FYH42FTB.js.map +1 -0
- package/dist/sync-HJZJNXHW.js +800 -0
- package/dist/sync-HJZJNXHW.js.map +1 -0
- package/dist/update-B4WMUOPO.js +83 -0
- package/dist/update-B4WMUOPO.js.map +1 -0
- package/dist/{update-ALJKFFM7.js → update-L7FGHN6W.js} +2 -2
- package/dist/update-L7FGHN6W.js.map +1 -0
- package/package.json +18 -10
- package/dist/chunk-4CMAEQQY.js.map +0 -1
- package/dist/chunk-NHGLXN2F.js.map +0 -1
- package/dist/chunk-O7UV3FWI.js.map +0 -1
- package/dist/sessions-6PB7ALCE.js +0 -16
- /package/dist/{sessions-6PB7ALCE.js.map → auth-YW3UPFSB.js.map} +0 -0
- /package/dist/{squad-parser-4BI3G4RS.js.map → env-config-KCLDBKYX.js.map} +0 -0
- /package/dist/{update-ALJKFFM7.js.map → github-UQTM5KMS.js.map} +0 -0
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/lib/providers.ts
|
|
4
|
+
var PROVIDERS = {
|
|
5
|
+
anthropic: {
|
|
6
|
+
name: "anthropic",
|
|
7
|
+
displayName: "Anthropic",
|
|
8
|
+
envVars: ["ANTHROPIC_API_KEY"],
|
|
9
|
+
modelPatterns: [/^claude/i],
|
|
10
|
+
defaultPricing: { input: 3, output: 15 },
|
|
11
|
+
models: {
|
|
12
|
+
"claude-opus-4-5": { input: 15, output: 75 },
|
|
13
|
+
"claude-opus-4-5-20251101": { input: 15, output: 75 },
|
|
14
|
+
"claude-sonnet-4": { input: 3, output: 15 },
|
|
15
|
+
"claude-sonnet-4-20250514": { input: 3, output: 15 },
|
|
16
|
+
"claude-3-5-sonnet": { input: 3, output: 15 },
|
|
17
|
+
"claude-3-5-sonnet-20241022": { input: 3, output: 15 },
|
|
18
|
+
"claude-3-5-sonnet-20240620": { input: 3, output: 15 },
|
|
19
|
+
"claude-haiku-3-5": { input: 0.8, output: 4 },
|
|
20
|
+
"claude-3-5-haiku": { input: 0.8, output: 4 },
|
|
21
|
+
"claude-3-5-haiku-20241022": { input: 0.8, output: 4 },
|
|
22
|
+
"claude-3-opus": { input: 15, output: 75 },
|
|
23
|
+
"claude-3-sonnet": { input: 3, output: 15 },
|
|
24
|
+
"claude-3-haiku": { input: 0.25, output: 1.25 }
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
openai: {
|
|
28
|
+
name: "openai",
|
|
29
|
+
displayName: "OpenAI",
|
|
30
|
+
envVars: ["OPENAI_API_KEY"],
|
|
31
|
+
modelPatterns: [/^gpt-/i, /^o1/i, /^o3/i],
|
|
32
|
+
defaultPricing: { input: 2.5, output: 10 },
|
|
33
|
+
models: {
|
|
34
|
+
"gpt-4o": { input: 2.5, output: 10 },
|
|
35
|
+
"gpt-4o-2024-11-20": { input: 2.5, output: 10 },
|
|
36
|
+
"gpt-4o-2024-08-06": { input: 2.5, output: 10 },
|
|
37
|
+
"gpt-4o-mini": { input: 0.15, output: 0.6 },
|
|
38
|
+
"gpt-4o-mini-2024-07-18": { input: 0.15, output: 0.6 },
|
|
39
|
+
"gpt-4-turbo": { input: 10, output: 30 },
|
|
40
|
+
"gpt-4-turbo-2024-04-09": { input: 10, output: 30 },
|
|
41
|
+
"gpt-4": { input: 30, output: 60 },
|
|
42
|
+
"gpt-4-32k": { input: 60, output: 120 },
|
|
43
|
+
"gpt-3.5-turbo": { input: 0.5, output: 1.5 },
|
|
44
|
+
"gpt-3.5-turbo-0125": { input: 0.5, output: 1.5 },
|
|
45
|
+
o1: { input: 15, output: 60 },
|
|
46
|
+
"o1-2024-12-17": { input: 15, output: 60 },
|
|
47
|
+
"o1-preview": { input: 15, output: 60 },
|
|
48
|
+
"o1-mini": { input: 3, output: 12 },
|
|
49
|
+
"o1-mini-2024-09-12": { input: 3, output: 12 },
|
|
50
|
+
"o3-mini": { input: 1.1, output: 4.4 }
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
google: {
|
|
54
|
+
name: "google",
|
|
55
|
+
displayName: "Google",
|
|
56
|
+
envVars: ["GEMINI_API_KEY", "GOOGLE_API_KEY"],
|
|
57
|
+
modelPatterns: [/^gemini/i],
|
|
58
|
+
defaultPricing: { input: 0.1, output: 0.4 },
|
|
59
|
+
models: {
|
|
60
|
+
"gemini-2.0-flash": { input: 0.1, output: 0.4 },
|
|
61
|
+
"gemini-2.0-flash-exp": { input: 0.1, output: 0.4 },
|
|
62
|
+
"gemini-1.5-pro": { input: 1.25, output: 5 },
|
|
63
|
+
"gemini-1.5-pro-002": { input: 1.25, output: 5 },
|
|
64
|
+
"gemini-1.5-flash": { input: 0.075, output: 0.3 },
|
|
65
|
+
"gemini-1.5-flash-002": { input: 0.075, output: 0.3 },
|
|
66
|
+
"gemini-1.0-pro": { input: 0.5, output: 1.5 }
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
mistral: {
|
|
70
|
+
name: "mistral",
|
|
71
|
+
displayName: "Mistral",
|
|
72
|
+
envVars: ["MISTRAL_API_KEY"],
|
|
73
|
+
modelPatterns: [/^mistral/i, /^mixtral/i, /^codestral/i],
|
|
74
|
+
defaultPricing: { input: 2, output: 6 },
|
|
75
|
+
models: {
|
|
76
|
+
"mistral-large": { input: 2, output: 6 },
|
|
77
|
+
"mistral-large-2411": { input: 2, output: 6 },
|
|
78
|
+
"mistral-medium": { input: 2.7, output: 8.1 },
|
|
79
|
+
"mistral-small": { input: 0.2, output: 0.6 },
|
|
80
|
+
"mistral-small-2409": { input: 0.2, output: 0.6 },
|
|
81
|
+
"mixtral-8x7b": { input: 0.7, output: 0.7 },
|
|
82
|
+
"mixtral-8x22b": { input: 2, output: 6 },
|
|
83
|
+
codestral: { input: 0.2, output: 0.6 },
|
|
84
|
+
"codestral-2405": { input: 0.2, output: 0.6 }
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
groq: {
|
|
88
|
+
name: "groq",
|
|
89
|
+
displayName: "Groq",
|
|
90
|
+
envVars: ["GROQ_API_KEY"],
|
|
91
|
+
modelPatterns: [/^llama/i],
|
|
92
|
+
// llama models on Groq
|
|
93
|
+
defaultPricing: { input: 0.59, output: 0.79 },
|
|
94
|
+
models: {
|
|
95
|
+
"llama-3.3-70b-versatile": { input: 0.59, output: 0.79 },
|
|
96
|
+
"llama-3.3-70b-specdec": { input: 0.59, output: 0.99 },
|
|
97
|
+
"llama-3.1-70b-versatile": { input: 0.59, output: 0.79 },
|
|
98
|
+
"llama-3.1-8b-instant": { input: 0.05, output: 0.08 },
|
|
99
|
+
"llama-3-70b-8192": { input: 0.59, output: 0.79 },
|
|
100
|
+
"llama-3-8b-8192": { input: 0.05, output: 0.08 },
|
|
101
|
+
"mixtral-8x7b-32768": { input: 0.24, output: 0.24 },
|
|
102
|
+
"gemma2-9b-it": { input: 0.2, output: 0.2 }
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
aws_bedrock: {
|
|
106
|
+
name: "aws_bedrock",
|
|
107
|
+
displayName: "AWS Bedrock",
|
|
108
|
+
envVars: ["AWS_ACCESS_KEY_ID"],
|
|
109
|
+
modelPatterns: [/^anthropic\./i, /^amazon\./i, /^meta\./i, /^mistral\./i],
|
|
110
|
+
defaultPricing: { input: 3, output: 15 },
|
|
111
|
+
models: {
|
|
112
|
+
"anthropic.claude-3-5-sonnet-20241022-v2:0": { input: 3, output: 15 },
|
|
113
|
+
"anthropic.claude-3-5-sonnet-20240620-v1:0": { input: 3, output: 15 },
|
|
114
|
+
"anthropic.claude-3-5-haiku-20241022-v1:0": { input: 0.8, output: 4 },
|
|
115
|
+
"anthropic.claude-3-opus-20240229-v1:0": { input: 15, output: 75 },
|
|
116
|
+
"anthropic.claude-3-sonnet-20240229-v1:0": { input: 3, output: 15 },
|
|
117
|
+
"anthropic.claude-3-haiku-20240307-v1:0": { input: 0.25, output: 1.25 },
|
|
118
|
+
"amazon.titan-text-premier-v1:0": { input: 0.5, output: 1.5 },
|
|
119
|
+
"amazon.titan-text-express-v1": { input: 0.2, output: 0.6 },
|
|
120
|
+
"amazon.titan-text-lite-v1": { input: 0.15, output: 0.2 },
|
|
121
|
+
"meta.llama3-70b-instruct-v1:0": { input: 2.65, output: 3.5 },
|
|
122
|
+
"meta.llama3-8b-instruct-v1:0": { input: 0.3, output: 0.6 },
|
|
123
|
+
"meta.llama3-1-405b-instruct-v1:0": { input: 5.32, output: 16 },
|
|
124
|
+
"mistral.mistral-large-2407-v1:0": { input: 4, output: 12 }
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
azure: {
|
|
128
|
+
name: "azure",
|
|
129
|
+
displayName: "Azure OpenAI",
|
|
130
|
+
envVars: ["AZURE_OPENAI_API_KEY"],
|
|
131
|
+
modelPatterns: [],
|
|
132
|
+
// Detected via endpoint, not model name
|
|
133
|
+
defaultPricing: { input: 2.5, output: 10 },
|
|
134
|
+
models: {
|
|
135
|
+
// Same pricing as OpenAI (regional variations possible)
|
|
136
|
+
"gpt-4o": { input: 2.5, output: 10 },
|
|
137
|
+
"gpt-4o-mini": { input: 0.15, output: 0.6 },
|
|
138
|
+
"gpt-4-turbo": { input: 10, output: 30 },
|
|
139
|
+
"gpt-4": { input: 30, output: 60 },
|
|
140
|
+
"gpt-35-turbo": { input: 0.5, output: 1.5 }
|
|
141
|
+
// Azure uses different name
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
function detectProviderFromModel(model) {
|
|
146
|
+
const modelLower = model.toLowerCase();
|
|
147
|
+
if (modelLower.includes("anthropic.") || modelLower.includes("amazon.") || modelLower.includes("meta.") || modelLower.includes("mistral.")) {
|
|
148
|
+
return "aws_bedrock";
|
|
149
|
+
}
|
|
150
|
+
if (modelLower.startsWith("claude")) {
|
|
151
|
+
return "anthropic";
|
|
152
|
+
}
|
|
153
|
+
if (modelLower.startsWith("gpt-") || modelLower.startsWith("o1") || modelLower.startsWith("o3")) {
|
|
154
|
+
if (process.env.AZURE_OPENAI_ENDPOINT || process.env.AZURE_OPENAI_API_KEY) {
|
|
155
|
+
return "azure";
|
|
156
|
+
}
|
|
157
|
+
return "openai";
|
|
158
|
+
}
|
|
159
|
+
if (modelLower.startsWith("gemini")) {
|
|
160
|
+
return "google";
|
|
161
|
+
}
|
|
162
|
+
if (modelLower.startsWith("mistral") || modelLower.startsWith("mixtral") || modelLower.startsWith("codestral")) {
|
|
163
|
+
if (process.env.GROQ_API_KEY && !process.env.MISTRAL_API_KEY) {
|
|
164
|
+
return "groq";
|
|
165
|
+
}
|
|
166
|
+
return "mistral";
|
|
167
|
+
}
|
|
168
|
+
if (modelLower.startsWith("llama") || modelLower.startsWith("gemma")) {
|
|
169
|
+
return "groq";
|
|
170
|
+
}
|
|
171
|
+
return "unknown";
|
|
172
|
+
}
|
|
173
|
+
function detectProvidersFromEnv() {
|
|
174
|
+
const detected = [];
|
|
175
|
+
if (process.env.ANTHROPIC_API_KEY) {
|
|
176
|
+
const tier = parseInt(process.env.ANTHROPIC_TIER || "0", 10);
|
|
177
|
+
const budgetSet = process.env.ANTHROPIC_BUDGET_DAILY || process.env.SQUADS_DAILY_BUDGET;
|
|
178
|
+
const explicitPlan = process.env.SQUADS_PLAN_TYPE?.toLowerCase();
|
|
179
|
+
let plan = "Max";
|
|
180
|
+
let confidence = "inferred";
|
|
181
|
+
let reason = "API key detected";
|
|
182
|
+
if (explicitPlan === "usage") {
|
|
183
|
+
plan = "Usage";
|
|
184
|
+
confidence = "explicit";
|
|
185
|
+
reason = "SQUADS_PLAN_TYPE=usage";
|
|
186
|
+
} else if (explicitPlan === "max") {
|
|
187
|
+
plan = "Max";
|
|
188
|
+
confidence = "explicit";
|
|
189
|
+
reason = "SQUADS_PLAN_TYPE=max";
|
|
190
|
+
} else if (budgetSet) {
|
|
191
|
+
plan = "Usage";
|
|
192
|
+
reason = `Budget set ($${budgetSet}/day)`;
|
|
193
|
+
} else if (tier >= 4) {
|
|
194
|
+
plan = "Max";
|
|
195
|
+
reason = `Tier ${tier} (high usage)`;
|
|
196
|
+
} else if (tier >= 1 && tier <= 2) {
|
|
197
|
+
plan = "Usage";
|
|
198
|
+
reason = `Tier ${tier} (new user)`;
|
|
199
|
+
}
|
|
200
|
+
detected.push({ provider: "anthropic", plan, confidence, reason });
|
|
201
|
+
}
|
|
202
|
+
if (process.env.OPENAI_API_KEY) {
|
|
203
|
+
const orgId = process.env.OPENAI_ORG_ID;
|
|
204
|
+
detected.push({
|
|
205
|
+
provider: "openai",
|
|
206
|
+
plan: orgId ? "Team/Enterprise" : "Personal",
|
|
207
|
+
confidence: "inferred",
|
|
208
|
+
reason: orgId ? "Org ID set" : "API key only"
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
if (process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY) {
|
|
212
|
+
detected.push({
|
|
213
|
+
provider: "google",
|
|
214
|
+
plan: "Pay-as-you-go",
|
|
215
|
+
confidence: "inferred",
|
|
216
|
+
reason: "API key detected"
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
if (process.env.AWS_ACCESS_KEY_ID) {
|
|
220
|
+
detected.push({
|
|
221
|
+
provider: "aws_bedrock",
|
|
222
|
+
plan: "On-demand",
|
|
223
|
+
confidence: "inferred",
|
|
224
|
+
reason: "AWS credentials detected"
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
if (process.env.AZURE_OPENAI_API_KEY) {
|
|
228
|
+
detected.push({
|
|
229
|
+
provider: "azure",
|
|
230
|
+
plan: process.env.AZURE_OPENAI_DEPLOYMENT ? "PTU" : "Pay-as-you-go",
|
|
231
|
+
confidence: "inferred",
|
|
232
|
+
reason: process.env.AZURE_OPENAI_DEPLOYMENT ? "Deployment detected" : "API key only"
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
if (process.env.MISTRAL_API_KEY) {
|
|
236
|
+
detected.push({
|
|
237
|
+
provider: "mistral",
|
|
238
|
+
plan: "Pay-per-token",
|
|
239
|
+
confidence: "inferred",
|
|
240
|
+
reason: "API key detected"
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
if (process.env.GROQ_API_KEY) {
|
|
244
|
+
detected.push({
|
|
245
|
+
provider: "groq",
|
|
246
|
+
plan: "Developer",
|
|
247
|
+
confidence: "inferred",
|
|
248
|
+
reason: "API key detected"
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
return detected;
|
|
252
|
+
}
|
|
253
|
+
function getModelPricing(provider, model) {
|
|
254
|
+
if (provider === "unknown") {
|
|
255
|
+
return { input: 3, output: 15 };
|
|
256
|
+
}
|
|
257
|
+
const config = PROVIDERS[provider];
|
|
258
|
+
const modelLower = model.toLowerCase();
|
|
259
|
+
if (config.models[model]) {
|
|
260
|
+
return config.models[model];
|
|
261
|
+
}
|
|
262
|
+
const matchedModel = Object.keys(config.models).find(
|
|
263
|
+
(m) => m.toLowerCase() === modelLower
|
|
264
|
+
);
|
|
265
|
+
if (matchedModel) {
|
|
266
|
+
return config.models[matchedModel];
|
|
267
|
+
}
|
|
268
|
+
const partialMatch = Object.keys(config.models).find(
|
|
269
|
+
(m) => modelLower.includes(m.toLowerCase()) || m.toLowerCase().includes(modelLower)
|
|
270
|
+
);
|
|
271
|
+
if (partialMatch) {
|
|
272
|
+
return config.models[partialMatch];
|
|
273
|
+
}
|
|
274
|
+
return config.defaultPricing;
|
|
275
|
+
}
|
|
276
|
+
function calcCost(provider, model, inputTokens, outputTokens, cachedTokens = 0) {
|
|
277
|
+
const pricing = getModelPricing(provider, model);
|
|
278
|
+
const inputCost = inputTokens / 1e6 * pricing.input;
|
|
279
|
+
const outputCost = outputTokens / 1e6 * pricing.output;
|
|
280
|
+
const cachedCost = pricing.cached ? cachedTokens / 1e6 * pricing.cached : 0;
|
|
281
|
+
return inputCost + outputCost + cachedCost;
|
|
282
|
+
}
|
|
283
|
+
function getProviderDisplayName(provider) {
|
|
284
|
+
if (provider === "unknown") return "Unknown";
|
|
285
|
+
return PROVIDERS[provider].displayName;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
export {
|
|
289
|
+
detectProviderFromModel,
|
|
290
|
+
detectProvidersFromEnv,
|
|
291
|
+
calcCost,
|
|
292
|
+
getProviderDisplayName
|
|
293
|
+
};
|
|
294
|
+
//# sourceMappingURL=chunk-LOA3KWYJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/providers.ts"],"sourcesContent":["/**\n * Multi-provider LLM detection and cost tracking\n *\n * Supports: Anthropic, OpenAI, Google, AWS Bedrock, Azure, Mistral, Groq\n */\n\n// Provider types\nexport type ProviderName =\n | 'anthropic'\n | 'openai'\n | 'google'\n | 'aws_bedrock'\n | 'azure'\n | 'mistral'\n | 'groq'\n | 'unknown';\n\nexport interface ProviderDetection {\n provider: ProviderName;\n plan?: string;\n confidence: 'explicit' | 'inferred';\n reason: string;\n}\n\nexport interface ModelPricing {\n input: number; // per 1M tokens\n output: number; // per 1M tokens\n cached?: number; // per 1M cached tokens (if supported)\n}\n\nexport interface ProviderConfig {\n name: ProviderName;\n displayName: string;\n models: Record<string, ModelPricing>;\n defaultPricing: ModelPricing;\n envVars: string[]; // API key env vars to check\n modelPatterns: RegExp[]; // Model name patterns\n}\n\n// Pricing data per 1M tokens (Jan 2025)\nexport const PROVIDERS: Record<Exclude<ProviderName, 'unknown'>, ProviderConfig> = {\n anthropic: {\n name: 'anthropic',\n displayName: 'Anthropic',\n envVars: ['ANTHROPIC_API_KEY'],\n modelPatterns: [/^claude/i],\n defaultPricing: { input: 3.0, output: 15.0 },\n models: {\n 'claude-opus-4-5': { input: 15.0, output: 75.0 },\n 'claude-opus-4-5-20251101': { input: 15.0, output: 75.0 },\n 'claude-sonnet-4': { input: 3.0, output: 15.0 },\n 'claude-sonnet-4-20250514': { input: 3.0, output: 15.0 },\n 'claude-3-5-sonnet': { input: 3.0, output: 15.0 },\n 'claude-3-5-sonnet-20241022': { input: 3.0, output: 15.0 },\n 'claude-3-5-sonnet-20240620': { input: 3.0, output: 15.0 },\n 'claude-haiku-3-5': { input: 0.8, output: 4.0 },\n 'claude-3-5-haiku': { input: 0.8, output: 4.0 },\n 'claude-3-5-haiku-20241022': { input: 0.8, output: 4.0 },\n 'claude-3-opus': { input: 15.0, output: 75.0 },\n 'claude-3-sonnet': { input: 3.0, output: 15.0 },\n 'claude-3-haiku': { input: 0.25, output: 1.25 },\n },\n },\n\n openai: {\n name: 'openai',\n displayName: 'OpenAI',\n envVars: ['OPENAI_API_KEY'],\n modelPatterns: [/^gpt-/i, /^o1/i, /^o3/i],\n defaultPricing: { input: 2.5, output: 10.0 },\n models: {\n 'gpt-4o': { input: 2.5, output: 10.0 },\n 'gpt-4o-2024-11-20': { input: 2.5, output: 10.0 },\n 'gpt-4o-2024-08-06': { input: 2.5, output: 10.0 },\n 'gpt-4o-mini': { input: 0.15, output: 0.6 },\n 'gpt-4o-mini-2024-07-18': { input: 0.15, output: 0.6 },\n 'gpt-4-turbo': { input: 10.0, output: 30.0 },\n 'gpt-4-turbo-2024-04-09': { input: 10.0, output: 30.0 },\n 'gpt-4': { input: 30.0, output: 60.0 },\n 'gpt-4-32k': { input: 60.0, output: 120.0 },\n 'gpt-3.5-turbo': { input: 0.5, output: 1.5 },\n 'gpt-3.5-turbo-0125': { input: 0.5, output: 1.5 },\n o1: { input: 15.0, output: 60.0 },\n 'o1-2024-12-17': { input: 15.0, output: 60.0 },\n 'o1-preview': { input: 15.0, output: 60.0 },\n 'o1-mini': { input: 3.0, output: 12.0 },\n 'o1-mini-2024-09-12': { input: 3.0, output: 12.0 },\n 'o3-mini': { input: 1.1, output: 4.4 },\n },\n },\n\n google: {\n name: 'google',\n displayName: 'Google',\n envVars: ['GEMINI_API_KEY', 'GOOGLE_API_KEY'],\n modelPatterns: [/^gemini/i],\n defaultPricing: { input: 0.1, output: 0.4 },\n models: {\n 'gemini-2.0-flash': { input: 0.1, output: 0.4 },\n 'gemini-2.0-flash-exp': { input: 0.1, output: 0.4 },\n 'gemini-1.5-pro': { input: 1.25, output: 5.0 },\n 'gemini-1.5-pro-002': { input: 1.25, output: 5.0 },\n 'gemini-1.5-flash': { input: 0.075, output: 0.3 },\n 'gemini-1.5-flash-002': { input: 0.075, output: 0.3 },\n 'gemini-1.0-pro': { input: 0.5, output: 1.5 },\n },\n },\n\n mistral: {\n name: 'mistral',\n displayName: 'Mistral',\n envVars: ['MISTRAL_API_KEY'],\n modelPatterns: [/^mistral/i, /^mixtral/i, /^codestral/i],\n defaultPricing: { input: 2.0, output: 6.0 },\n models: {\n 'mistral-large': { input: 2.0, output: 6.0 },\n 'mistral-large-2411': { input: 2.0, output: 6.0 },\n 'mistral-medium': { input: 2.7, output: 8.1 },\n 'mistral-small': { input: 0.2, output: 0.6 },\n 'mistral-small-2409': { input: 0.2, output: 0.6 },\n 'mixtral-8x7b': { input: 0.7, output: 0.7 },\n 'mixtral-8x22b': { input: 2.0, output: 6.0 },\n codestral: { input: 0.2, output: 0.6 },\n 'codestral-2405': { input: 0.2, output: 0.6 },\n },\n },\n\n groq: {\n name: 'groq',\n displayName: 'Groq',\n envVars: ['GROQ_API_KEY'],\n modelPatterns: [/^llama/i], // llama models on Groq\n defaultPricing: { input: 0.59, output: 0.79 },\n models: {\n 'llama-3.3-70b-versatile': { input: 0.59, output: 0.79 },\n 'llama-3.3-70b-specdec': { input: 0.59, output: 0.99 },\n 'llama-3.1-70b-versatile': { input: 0.59, output: 0.79 },\n 'llama-3.1-8b-instant': { input: 0.05, output: 0.08 },\n 'llama-3-70b-8192': { input: 0.59, output: 0.79 },\n 'llama-3-8b-8192': { input: 0.05, output: 0.08 },\n 'mixtral-8x7b-32768': { input: 0.24, output: 0.24 },\n 'gemma2-9b-it': { input: 0.2, output: 0.2 },\n },\n },\n\n aws_bedrock: {\n name: 'aws_bedrock',\n displayName: 'AWS Bedrock',\n envVars: ['AWS_ACCESS_KEY_ID'],\n modelPatterns: [/^anthropic\\./i, /^amazon\\./i, /^meta\\./i, /^mistral\\./i],\n defaultPricing: { input: 3.0, output: 15.0 },\n models: {\n 'anthropic.claude-3-5-sonnet-20241022-v2:0': { input: 3.0, output: 15.0 },\n 'anthropic.claude-3-5-sonnet-20240620-v1:0': { input: 3.0, output: 15.0 },\n 'anthropic.claude-3-5-haiku-20241022-v1:0': { input: 0.8, output: 4.0 },\n 'anthropic.claude-3-opus-20240229-v1:0': { input: 15.0, output: 75.0 },\n 'anthropic.claude-3-sonnet-20240229-v1:0': { input: 3.0, output: 15.0 },\n 'anthropic.claude-3-haiku-20240307-v1:0': { input: 0.25, output: 1.25 },\n 'amazon.titan-text-premier-v1:0': { input: 0.5, output: 1.5 },\n 'amazon.titan-text-express-v1': { input: 0.2, output: 0.6 },\n 'amazon.titan-text-lite-v1': { input: 0.15, output: 0.2 },\n 'meta.llama3-70b-instruct-v1:0': { input: 2.65, output: 3.5 },\n 'meta.llama3-8b-instruct-v1:0': { input: 0.3, output: 0.6 },\n 'meta.llama3-1-405b-instruct-v1:0': { input: 5.32, output: 16.0 },\n 'mistral.mistral-large-2407-v1:0': { input: 4.0, output: 12.0 },\n },\n },\n\n azure: {\n name: 'azure',\n displayName: 'Azure OpenAI',\n envVars: ['AZURE_OPENAI_API_KEY'],\n modelPatterns: [], // Detected via endpoint, not model name\n defaultPricing: { input: 2.5, output: 10.0 },\n models: {\n // Same pricing as OpenAI (regional variations possible)\n 'gpt-4o': { input: 2.5, output: 10.0 },\n 'gpt-4o-mini': { input: 0.15, output: 0.6 },\n 'gpt-4-turbo': { input: 10.0, output: 30.0 },\n 'gpt-4': { input: 30.0, output: 60.0 },\n 'gpt-35-turbo': { input: 0.5, output: 1.5 }, // Azure uses different name\n },\n },\n};\n\n/**\n * Detect the LLM provider from a model name string.\n * Supports Anthropic, OpenAI, Google, Mistral, Groq, AWS Bedrock, and Azure.\n * @param model - Model identifier (e.g., 'claude-3-5-sonnet', 'gpt-4o')\n * @returns Provider name or 'unknown' if unrecognized\n */\nexport function detectProviderFromModel(model: string): ProviderName {\n const modelLower = model.toLowerCase();\n\n // AWS Bedrock - check first (model IDs include provider prefix)\n if (\n modelLower.includes('anthropic.') ||\n modelLower.includes('amazon.') ||\n modelLower.includes('meta.') ||\n modelLower.includes('mistral.')\n ) {\n return 'aws_bedrock';\n }\n\n // Anthropic\n if (modelLower.startsWith('claude')) {\n return 'anthropic';\n }\n\n // OpenAI\n if (\n modelLower.startsWith('gpt-') ||\n modelLower.startsWith('o1') ||\n modelLower.startsWith('o3')\n ) {\n // Check for Azure (endpoint-based detection takes priority)\n if (process.env.AZURE_OPENAI_ENDPOINT || process.env.AZURE_OPENAI_API_KEY) {\n return 'azure';\n }\n return 'openai';\n }\n\n // Google\n if (modelLower.startsWith('gemini')) {\n return 'google';\n }\n\n // Mistral vs Groq (both can run mistral/mixtral models)\n if (modelLower.startsWith('mistral') || modelLower.startsWith('mixtral') || modelLower.startsWith('codestral')) {\n // If Groq API key is set and not Mistral key, assume Groq\n if (process.env.GROQ_API_KEY && !process.env.MISTRAL_API_KEY) {\n return 'groq';\n }\n return 'mistral';\n }\n\n // Groq (llama models, gemma)\n if (modelLower.startsWith('llama') || modelLower.startsWith('gemma')) {\n return 'groq';\n }\n\n return 'unknown';\n}\n\n/**\n * Detect all LLM providers configured via environment variables.\n * Checks for API keys and infers plan type based on tier/budget settings.\n * @returns Array of detected providers with their configuration details\n */\nexport function detectProvidersFromEnv(): ProviderDetection[] {\n const detected: ProviderDetection[] = [];\n\n // Anthropic\n if (process.env.ANTHROPIC_API_KEY) {\n const tier = parseInt(process.env.ANTHROPIC_TIER || '0', 10);\n const budgetSet = process.env.ANTHROPIC_BUDGET_DAILY || process.env.SQUADS_DAILY_BUDGET;\n const explicitPlan = process.env.SQUADS_PLAN_TYPE?.toLowerCase();\n\n let plan = 'Max';\n let confidence: 'explicit' | 'inferred' = 'inferred';\n let reason = 'API key detected';\n\n if (explicitPlan === 'usage') {\n plan = 'Usage';\n confidence = 'explicit';\n reason = 'SQUADS_PLAN_TYPE=usage';\n } else if (explicitPlan === 'max') {\n plan = 'Max';\n confidence = 'explicit';\n reason = 'SQUADS_PLAN_TYPE=max';\n } else if (budgetSet) {\n plan = 'Usage';\n reason = `Budget set ($${budgetSet}/day)`;\n } else if (tier >= 4) {\n plan = 'Max';\n reason = `Tier ${tier} (high usage)`;\n } else if (tier >= 1 && tier <= 2) {\n plan = 'Usage';\n reason = `Tier ${tier} (new user)`;\n }\n\n detected.push({ provider: 'anthropic', plan, confidence, reason });\n }\n\n // OpenAI\n if (process.env.OPENAI_API_KEY) {\n const orgId = process.env.OPENAI_ORG_ID;\n detected.push({\n provider: 'openai',\n plan: orgId ? 'Team/Enterprise' : 'Personal',\n confidence: 'inferred',\n reason: orgId ? 'Org ID set' : 'API key only',\n });\n }\n\n // Google\n if (process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY) {\n detected.push({\n provider: 'google',\n plan: 'Pay-as-you-go',\n confidence: 'inferred',\n reason: 'API key detected',\n });\n }\n\n // AWS Bedrock\n if (process.env.AWS_ACCESS_KEY_ID) {\n detected.push({\n provider: 'aws_bedrock',\n plan: 'On-demand',\n confidence: 'inferred',\n reason: 'AWS credentials detected',\n });\n }\n\n // Azure OpenAI\n if (process.env.AZURE_OPENAI_API_KEY) {\n detected.push({\n provider: 'azure',\n plan: process.env.AZURE_OPENAI_DEPLOYMENT ? 'PTU' : 'Pay-as-you-go',\n confidence: 'inferred',\n reason: process.env.AZURE_OPENAI_DEPLOYMENT ? 'Deployment detected' : 'API key only',\n });\n }\n\n // Mistral\n if (process.env.MISTRAL_API_KEY) {\n detected.push({\n provider: 'mistral',\n plan: 'Pay-per-token',\n confidence: 'inferred',\n reason: 'API key detected',\n });\n }\n\n // Groq\n if (process.env.GROQ_API_KEY) {\n detected.push({\n provider: 'groq',\n plan: 'Developer',\n confidence: 'inferred',\n reason: 'API key detected',\n });\n }\n\n return detected;\n}\n\n/**\n * Get pricing information for a specific model.\n * Attempts exact match first, then case-insensitive, then partial match.\n * @param provider - Provider name\n * @param model - Model identifier\n * @returns Pricing in dollars per 1M tokens (input/output/cached)\n */\nexport function getModelPricing(provider: ProviderName, model: string): ModelPricing {\n if (provider === 'unknown') {\n // Fallback to Anthropic Sonnet pricing for unknown models\n return { input: 3.0, output: 15.0 };\n }\n\n const config = PROVIDERS[provider];\n const modelLower = model.toLowerCase();\n\n // Exact match first\n if (config.models[model]) {\n return config.models[model];\n }\n\n // Case-insensitive match\n const matchedModel = Object.keys(config.models).find(\n (m) => m.toLowerCase() === modelLower\n );\n if (matchedModel) {\n return config.models[matchedModel];\n }\n\n // Partial match (for versioned models)\n const partialMatch = Object.keys(config.models).find(\n (m) => modelLower.includes(m.toLowerCase()) || m.toLowerCase().includes(modelLower)\n );\n if (partialMatch) {\n return config.models[partialMatch];\n }\n\n return config.defaultPricing;\n}\n\n/**\n * Calculate cost for token usage based on provider pricing.\n * @param provider - Provider name\n * @param model - Model identifier\n * @param inputTokens - Number of input tokens\n * @param outputTokens - Number of output tokens\n * @param cachedTokens - Number of cached tokens (for providers that support it)\n * @returns Total cost in dollars\n */\nexport function calcCost(\n provider: ProviderName,\n model: string,\n inputTokens: number,\n outputTokens: number,\n cachedTokens = 0\n): number {\n const pricing = getModelPricing(provider, model);\n\n // Per 1M tokens pricing\n const inputCost = (inputTokens / 1_000_000) * pricing.input;\n const outputCost = (outputTokens / 1_000_000) * pricing.output;\n const cachedCost = pricing.cached\n ? (cachedTokens / 1_000_000) * pricing.cached\n : 0;\n\n return inputCost + outputCost + cachedCost;\n}\n\n/**\n * Get human-readable display name for a provider.\n * @param provider - Provider name\n * @returns Display name (e.g., 'Anthropic', 'OpenAI', 'AWS Bedrock')\n */\nexport function getProviderDisplayName(provider: ProviderName): string {\n if (provider === 'unknown') return 'Unknown';\n return PROVIDERS[provider].displayName;\n}\n\n/**\n * Check if a provider has its API key configured in environment variables.\n * @param provider - Provider name\n * @returns true if any of the provider's API key env vars are set\n */\nexport function isProviderConfigured(provider: ProviderName): boolean {\n if (provider === 'unknown') return false;\n const config = PROVIDERS[provider];\n return config.envVars.some((envVar) => !!process.env[envVar]);\n}\n"],"mappings":"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","names":[]}
|