Compare commits
220 Commits
fix-model
...
github-sync
| Author | SHA1 | Date | |
|---|---|---|---|
| cda892e0d7 | |||
| 098ff4f5bf | |||
| 0f70b8959f | |||
| b8e6d58e5b | |||
| a855001a7e | |||
| ac760b2268 | |||
| d4a5ea7ae7 | |||
| 434ed89ba2 | |||
| 6d7719a62a | |||
| 93637039ef | |||
| 9c95f796c0 | |||
| e8650b6073 | |||
| 23c2be6ff7 | |||
| 913a63dbe6 | |||
| 503087e99b | |||
| 48150f09d3 | |||
| 5fef681657 | |||
| 123054ae0c | |||
| 03060d154b | |||
| 5c9b8108e0 | |||
| c8084681f9 | |||
| 352ab4ae1b | |||
| cf0b416b15 | |||
| 38339a2a90 | |||
| ff9040bf52 | |||
| 3039804af4 | |||
| 7a4ad7bec8 | |||
| 721cc122bc | |||
| 0527f019af | |||
| c89371de50 | |||
| 6d6d4220d8 | |||
| 8b984eeec1 | |||
| 586027c8f1 | |||
| 343b5f87ef | |||
| 955b773ee5 | |||
| 98559071f0 | |||
| 0660308816 | |||
| 380f9dd8eb | |||
| 1cfdab1b18 | |||
| 75a981f957 | |||
| 7fadbcadc8 | |||
| 38f9092292 | |||
| 92149b9eaa | |||
| b614f0e69c | |||
| 67d6dac5c5 | |||
| 7d3cc61a48 | |||
| f02ea6c4d2 | |||
| 0cb50eeece | |||
| 878311d2e0 | |||
| a0e89f65d6 | |||
| 74099b7c9c | |||
| ec522435c3 | |||
| d839cd37d4 | |||
| ecb6ef7f93 | |||
| 8b4d341054 | |||
| 62f4a28308 | |||
| 2fb8ef0dc8 | |||
| 96968e2bf8 | |||
| ee9d7879ce | |||
| 71283512a6 | |||
| cd4afd7e7c | |||
| 1239d0190b | |||
| 491bf6ccba | |||
| c993d0c121 | |||
| e55c39a83d | |||
| 6dea000e25 | |||
| 3f7a757b3f | |||
| c693fd71e2 | |||
| 54e04e288a | |||
| 462a179eee | |||
| 95db59034d | |||
| 74dcc74e32 | |||
| 57975f5f25 | |||
| ad7b063747 | |||
| f76e9f0551 | |||
| d70a49b36f | |||
| 3487135f9f | |||
| 458a66c766 | |||
| d3a84dc7ec | |||
| ae61b25583 | |||
| 74be576eda | |||
| 164df2cda0 | |||
| 2cd7908369 | |||
| cc667340f5 | |||
| f2cfc1435d | |||
| 35bb8cca47 | |||
| 3468a410e1 | |||
| b1b5e3c5cd | |||
| 97f03ec672 | |||
| 9b516924aa | |||
| 929a39600b | |||
| a87d8bb8cc | |||
| 574139eb49 | |||
| 1e3bc38b31 | |||
| 8916fe9874 | |||
| 5d956b41a6 | |||
| 42a7a14f69 | |||
| f24ee000d7 | |||
| 7196b1fb2c | |||
| f6c0d5a29d | |||
| ee63449aa5 | |||
| 92aa44ec00 | |||
| 477284535c | |||
| 304233bdda | |||
| 25d782ee2c | |||
| 0f63393d51 | |||
| e780eefce2 | |||
| a79585fa83 | |||
| 00801f74f2 | |||
| 185f6731ee | |||
| d291b0575c | |||
| 382d9f3e7d | |||
| e64f5fe963 | |||
| ea57ddfe7e | |||
| 29463d7fa8 | |||
| bcc8db49ee | |||
| c8521d70f3 | |||
| 490cd249e4 | |||
| dbc636f5f3 | |||
| 9a32f671a1 | |||
| 856d925eda | |||
| 066a425917 | |||
| 6df7f20cdc | |||
| 78bb47b90e | |||
| c121d86419 | |||
| ab148eeb14 | |||
| 49d196d326 | |||
| 8899b390ef | |||
| 5217f62ddf | |||
| 55eaff9af1 | |||
| 7557c06ac0 | |||
| e85d820121 | |||
| 499d3a39ef | |||
| b9b38d6e33 | |||
| ca24ac14fa | |||
| 822546fc67 | |||
| 4555195b71 | |||
| 5eae8effc6 | |||
| c1801aef87 | |||
| 5e6464b272 | |||
| e1a4f23332 | |||
| 753e1f9f0c | |||
| 123ecd2ba5 | |||
| f15cda9fcb | |||
| 0205debbd3 | |||
| 0059766509 | |||
| be81b02916 | |||
| 2dab141166 | |||
| 45aa49af25 | |||
| 781fad3ad4 | |||
| 99d2ffcfdd | |||
| 381d7cc19d | |||
| 7482e22458 | |||
| f5e6a402e6 | |||
| 9265852852 | |||
| dc98a32996 | |||
| 56c39ae0f6 | |||
| b1f43a7595 | |||
| fed8bcae19 | |||
| fb95150d02 | |||
| a7c9a240b4 | |||
| 6432a4a3e6 | |||
| f2e4a249fe | |||
| 8667a6eed8 | |||
| 429554397a | |||
| a64e6ad0ac | |||
| d68d79888c | |||
| 6c52905c6a | |||
| 62410b8f26 | |||
| 50ce68ccab | |||
| d1c6a6b873 | |||
| 7193b068a5 | |||
| 79a8a06bd7 | |||
| b60c03e11c | |||
| 15cf98d57b | |||
| b2ee6c407b | |||
| 96a14a06e7 | |||
| adc358606d | |||
| 63d52adf6f | |||
| 9a31387766 | |||
| 735157b837 | |||
| d75b46fb37 | |||
| cc555f8482 | |||
| 7fbbcf2b49 | |||
| 14c8ec8ca5 | |||
| 72568bbdb3 | |||
| c2225b715f | |||
| 7ce25e3742 | |||
| 427868604b | |||
| 247cd801a8 | |||
| 1aa2ee22b1 | |||
| 0f57233eff | |||
| 73a78eebfc | |||
| 3a6789b819 | |||
| f7c505e140 | |||
| 6bb36806d6 | |||
| 20a404eb88 | |||
| 65ecb5cd4a | |||
| 56062a9129 | |||
| d3d9c580d4 | |||
| ef98d8a9cb | |||
| 9d17752b88 | |||
| b5a838fe8b | |||
| aa1ac39ee6 | |||
| 4bc17ccf96 | |||
| 08c1899bfe | |||
| ad50e4a5ed | |||
| 730915a123 | |||
| 6f12d18cb8 | |||
| bd8774db99 | |||
| 88fbea52a4 | |||
| 898b3c18b7 | |||
| 6316e543ef | |||
| 7a02946620 | |||
| 236af40da3 | |||
| 26465319d6 | |||
| 7a11ef241d | |||
| 145862315d | |||
| 0428299773 | |||
| eee3303df0 |
@@ -199,6 +199,17 @@ $ bun run dev
|
||||
|
||||
And it'll open the frontend at http://localhost:3000
|
||||
|
||||
### Manual testing with opencode
|
||||
|
||||
You can manually check provider changes with opencode by:
|
||||
|
||||
```bash
|
||||
$ bun install
|
||||
$ cd packages/web
|
||||
$ bun run build
|
||||
$ OPENCODE_MODELS_PATH="dist/_api.json" opencode
|
||||
```
|
||||
|
||||
### Questions?
|
||||
|
||||
Open an issue if you need help or have questions about contributing.
|
||||
|
||||
+2
-1
@@ -18,7 +18,8 @@
|
||||
"validate": "bun ./packages/core/script/validate.ts",
|
||||
"helicone:generate": "bun ./packages/core/script/generate-helicone.ts",
|
||||
"venice:generate": "bun ./packages/core/script/generate-venice.ts",
|
||||
"vercel:generate": "bun ./packages/core/script/generate-vercel.ts"
|
||||
"vercel:generate": "bun ./packages/core/script/generate-vercel.ts",
|
||||
"wandb:generate": "bun ./packages/core/script/generate-wandb.ts"
|
||||
},
|
||||
"dependencies": {
|
||||
"@cloudflare/workers-types": "^4.20250801.0",
|
||||
|
||||
@@ -24,6 +24,7 @@ enum ModelType {
|
||||
|
||||
enum SkipZeroFields {
|
||||
LimitContext = "limit.context",
|
||||
LimitInput = "limit.input",
|
||||
LimitOutput = "limit.output",
|
||||
}
|
||||
|
||||
@@ -82,6 +83,7 @@ interface ExistingModel {
|
||||
};
|
||||
limit?: {
|
||||
context?: number;
|
||||
input?: number;
|
||||
output?: number;
|
||||
};
|
||||
modalities?: {
|
||||
@@ -112,6 +114,7 @@ interface MergedModel {
|
||||
};
|
||||
limit: {
|
||||
context: number;
|
||||
input?: number;
|
||||
output: number;
|
||||
};
|
||||
modalities: {
|
||||
@@ -232,6 +235,10 @@ async function loadExistingModel(filePath: string): Promise<ExistingModel | null
|
||||
}
|
||||
}
|
||||
|
||||
function isOpenAIModel(modelId: string): boolean {
|
||||
return modelId.startsWith("openai/");
|
||||
}
|
||||
|
||||
function mergeModel(
|
||||
apiModel: z.infer<typeof VercelModel>,
|
||||
existing: ExistingModel | null,
|
||||
@@ -281,6 +288,7 @@ function mergeModel(
|
||||
...(status && { status }),
|
||||
limit: {
|
||||
context: contextLimit,
|
||||
...(isOpenAIModel(apiModel.id) && contextLimit > outputLimit && { input: contextLimit - outputLimit }),
|
||||
output: outputLimit,
|
||||
},
|
||||
modalities: {
|
||||
@@ -362,6 +370,9 @@ function formatToml(model: MergedModel): string {
|
||||
lines.push("");
|
||||
lines.push(`[limit]`);
|
||||
lines.push(`context = ${formatNumber(model.limit.context)}`);
|
||||
if (model.limit.input !== undefined) {
|
||||
lines.push(`input = ${formatNumber(model.limit.input)}`);
|
||||
}
|
||||
lines.push(`output = ${formatNumber(model.limit.output)}`);
|
||||
|
||||
lines.push("");
|
||||
@@ -435,6 +446,7 @@ function detectChanges(
|
||||
compare("cost.cache_read", existing.cost?.cache_read, merged.cost?.cache_read);
|
||||
compare("cost.cache_write", existing.cost?.cache_write, merged.cost?.cache_write);
|
||||
compare("limit.context", existing.limit?.context, merged.limit.context);
|
||||
compare("limit.input", existing.limit?.input, merged.limit.input);
|
||||
compare("limit.output", existing.limit?.output, merged.limit.output);
|
||||
compare("modalities.input", existing.modalities?.input, merged.modalities.input);
|
||||
|
||||
|
||||
@@ -0,0 +1,525 @@
|
||||
#!/usr/bin/env bun
|
||||
|
||||
import path from "node:path";
|
||||
import { mkdir } from "node:fs/promises";
|
||||
import { z } from "zod";
|
||||
import { ModelFamilyValues } from "../src/family.js";
|
||||
|
||||
const API_ENDPOINT = "https://trace.wandb.ai/inference/analysis/artificialanalysis/models";
|
||||
|
||||
const Pricing = z
|
||||
.object({
|
||||
prompt: z.string().optional(),
|
||||
completion: z.string().optional(),
|
||||
image: z.string().optional(),
|
||||
request: z.string().optional(),
|
||||
input_cache_reads: z.string().optional(),
|
||||
input_cache_writes: z.string().optional(),
|
||||
})
|
||||
.passthrough();
|
||||
|
||||
const WandbModel = z
|
||||
.object({
|
||||
id: z.string(),
|
||||
name: z.string(),
|
||||
created: z.number(),
|
||||
input_modalities: z.array(z.string()),
|
||||
output_modalities: z.array(z.string()),
|
||||
context_length: z.number(),
|
||||
max_output_length: z.number(),
|
||||
pricing: Pricing.optional(),
|
||||
supported_sampling_parameters: z.array(z.string()).default([]),
|
||||
supported_features: z.array(z.string()).default([]),
|
||||
})
|
||||
.passthrough();
|
||||
|
||||
const WandbResponse = z
|
||||
.object({
|
||||
data: z.array(WandbModel),
|
||||
})
|
||||
.strict();
|
||||
|
||||
interface ExistingModel {
|
||||
name?: string;
|
||||
family?: string;
|
||||
attachment?: boolean;
|
||||
reasoning?: boolean;
|
||||
tool_call?: boolean;
|
||||
structured_output?: boolean;
|
||||
temperature?: boolean;
|
||||
knowledge?: string;
|
||||
release_date?: string;
|
||||
last_updated?: string;
|
||||
open_weights?: boolean;
|
||||
interleaved?: boolean | { field: string };
|
||||
status?: string;
|
||||
cost?: {
|
||||
input?: number;
|
||||
output?: number;
|
||||
cache_read?: number;
|
||||
cache_write?: number;
|
||||
};
|
||||
limit?: {
|
||||
context?: number;
|
||||
input?: number;
|
||||
output?: number;
|
||||
};
|
||||
modalities?: {
|
||||
input?: string[];
|
||||
output?: string[];
|
||||
};
|
||||
}
|
||||
|
||||
interface MergedModel {
|
||||
name: string;
|
||||
family?: string;
|
||||
attachment: boolean;
|
||||
reasoning: boolean;
|
||||
tool_call: boolean;
|
||||
structured_output?: boolean;
|
||||
temperature: boolean;
|
||||
knowledge?: string;
|
||||
release_date: string;
|
||||
last_updated: string;
|
||||
open_weights: boolean;
|
||||
interleaved?: boolean | { field: string };
|
||||
status?: string;
|
||||
cost?: {
|
||||
input: number;
|
||||
output: number;
|
||||
cache_read?: number;
|
||||
cache_write?: number;
|
||||
};
|
||||
limit: {
|
||||
context: number;
|
||||
output: number;
|
||||
};
|
||||
modalities: {
|
||||
input: Array<"text" | "audio" | "image" | "video" | "pdf">;
|
||||
output: Array<"text" | "audio" | "image" | "video" | "pdf">;
|
||||
};
|
||||
}
|
||||
|
||||
interface Changes {
|
||||
field: string;
|
||||
oldValue: string;
|
||||
newValue: string;
|
||||
}
|
||||
|
||||
type SupportedModality = "text" | "audio" | "image" | "video" | "pdf";
|
||||
|
||||
const modalityMap: Record<string, SupportedModality | undefined> = {
|
||||
text: "text",
|
||||
image: "image",
|
||||
audio: "audio",
|
||||
video: "video",
|
||||
pdf: "pdf",
|
||||
file: "pdf",
|
||||
files: "pdf",
|
||||
};
|
||||
|
||||
const openWeightsPrefixes = new Set([
|
||||
"deepseek-ai/",
|
||||
"meta-llama/",
|
||||
"microsoft/",
|
||||
"MiniMaxAI/",
|
||||
"moonshotai/",
|
||||
"nvidia/",
|
||||
"OpenPipe/",
|
||||
"Qwen/",
|
||||
"zai-org/",
|
||||
]);
|
||||
|
||||
function timestampToDate(timestamp: number): string {
|
||||
return new Date(timestamp * 1000).toISOString().slice(0, 10);
|
||||
}
|
||||
|
||||
function getTodayDate(): string {
|
||||
return new Date().toISOString().slice(0, 10);
|
||||
}
|
||||
|
||||
function formatNumber(n: number): string {
|
||||
if (n >= 1000) {
|
||||
return n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, "_");
|
||||
}
|
||||
return n.toString();
|
||||
}
|
||||
|
||||
function formatDecimal(n: number): string {
|
||||
return Number(n.toFixed(6)).toString();
|
||||
}
|
||||
|
||||
function priceToPerMillion(value: string): number {
|
||||
return Number((parseFloat(value) * 1_000_000).toFixed(6));
|
||||
}
|
||||
|
||||
function isSubstring(target: string, family: string): boolean {
|
||||
return target.toLowerCase().includes(family.toLowerCase());
|
||||
}
|
||||
|
||||
function matchesFamily(target: string, family: string): boolean {
|
||||
const targetLower = target.toLowerCase();
|
||||
const familyLower = family.toLowerCase();
|
||||
let familyIdx = 0;
|
||||
|
||||
for (let i = 0; i < targetLower.length && familyIdx < familyLower.length; i++) {
|
||||
if (targetLower[i] === familyLower[familyIdx]) {
|
||||
familyIdx++;
|
||||
}
|
||||
}
|
||||
|
||||
return familyIdx === familyLower.length;
|
||||
}
|
||||
|
||||
function inferFamily(modelId: string, modelName: string): string | undefined {
|
||||
const sortedFamilies = [...ModelFamilyValues].sort((a, b) => b.length - a.length);
|
||||
|
||||
for (const family of sortedFamilies) {
|
||||
if (isSubstring(modelId, family) || isSubstring(modelName, family)) {
|
||||
return family;
|
||||
}
|
||||
}
|
||||
|
||||
for (const family of sortedFamilies) {
|
||||
if (matchesFamily(modelId, family) || matchesFamily(modelName, family)) {
|
||||
return family;
|
||||
}
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
function normalizeName(apiModel: z.infer<typeof WandbModel>): string {
|
||||
const stripped = apiModel.name.replace(/^[^:]+:\s*/, "").trim();
|
||||
return stripped || path.basename(apiModel.id);
|
||||
}
|
||||
|
||||
function inferReasoning(apiModel: z.infer<typeof WandbModel>): boolean {
|
||||
const text = `${apiModel.id} ${apiModel.name}`.toLowerCase();
|
||||
return text.includes("thinking") || /\br1\b/.test(text) || text.includes("reasoning");
|
||||
}
|
||||
|
||||
function inferOpenWeights(modelId: string): boolean {
|
||||
for (const prefix of openWeightsPrefixes) {
|
||||
if (modelId.startsWith(prefix)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function normalizeModalities(values: string[]): SupportedModality[] {
|
||||
const normalized = values
|
||||
.map((value) => modalityMap[value.toLowerCase()])
|
||||
.filter((value): value is SupportedModality => value !== undefined);
|
||||
|
||||
return [...new Set(normalized)];
|
||||
}
|
||||
|
||||
async function loadExistingModel(filePath: string): Promise<ExistingModel | null> {
|
||||
try {
|
||||
const file = Bun.file(filePath);
|
||||
if (!(await file.exists())) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const toml = await import(filePath, { with: { type: "toml" } }).then((mod) => mod.default);
|
||||
return toml as ExistingModel;
|
||||
} catch (cause) {
|
||||
console.warn(`Warning: Failed to parse existing file ${filePath}:`, cause);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function mergeModel(
|
||||
apiModel: z.infer<typeof WandbModel>,
|
||||
existing: ExistingModel | null,
|
||||
): MergedModel {
|
||||
const featureSet = new Set(apiModel.supported_features);
|
||||
const samplingSet = new Set(apiModel.supported_sampling_parameters);
|
||||
const inputModalities = normalizeModalities(apiModel.input_modalities);
|
||||
const outputModalities = normalizeModalities(apiModel.output_modalities);
|
||||
|
||||
const merged: MergedModel = {
|
||||
name: existing?.name ?? normalizeName(apiModel),
|
||||
family: existing?.family ?? inferFamily(apiModel.id, apiModel.name),
|
||||
attachment: existing?.attachment ?? inputModalities.some((m) => m !== "text"),
|
||||
reasoning: existing?.reasoning ?? inferReasoning(apiModel),
|
||||
tool_call: existing?.tool_call ?? featureSet.has("tools"),
|
||||
temperature: existing?.temperature ?? samplingSet.has("temperature"),
|
||||
release_date: existing?.release_date ?? timestampToDate(apiModel.created),
|
||||
last_updated: getTodayDate(),
|
||||
open_weights: existing?.open_weights ?? inferOpenWeights(apiModel.id),
|
||||
...(existing?.structured_output !== undefined
|
||||
? { structured_output: existing.structured_output }
|
||||
: featureSet.has("structured_outputs")
|
||||
? { structured_output: true }
|
||||
: {}),
|
||||
...(existing?.knowledge ? { knowledge: existing.knowledge } : {}),
|
||||
...(existing?.interleaved !== undefined ? { interleaved: existing.interleaved } : {}),
|
||||
...(existing?.status ? { status: existing.status } : {}),
|
||||
limit: {
|
||||
context: apiModel.context_length > 0 ? apiModel.context_length : (existing?.limit?.context ?? 0),
|
||||
output: apiModel.max_output_length > 0
|
||||
? apiModel.max_output_length
|
||||
: (existing?.limit?.output ?? 0),
|
||||
},
|
||||
modalities: {
|
||||
input: inputModalities.length > 0
|
||||
? inputModalities
|
||||
: ((existing?.modalities?.input as SupportedModality[] | undefined) ?? ["text"]),
|
||||
output: outputModalities.length > 0
|
||||
? outputModalities
|
||||
: ((existing?.modalities?.output as SupportedModality[] | undefined) ?? ["text"]),
|
||||
},
|
||||
};
|
||||
|
||||
const prompt = apiModel.pricing?.prompt;
|
||||
const completion = apiModel.pricing?.completion;
|
||||
const cacheRead = apiModel.pricing?.input_cache_reads;
|
||||
const cacheWrite = apiModel.pricing?.input_cache_writes;
|
||||
|
||||
if (prompt && completion) {
|
||||
merged.cost = {
|
||||
input: priceToPerMillion(prompt),
|
||||
output: priceToPerMillion(completion),
|
||||
...(cacheRead && parseFloat(cacheRead) > 0
|
||||
? { cache_read: priceToPerMillion(cacheRead) }
|
||||
: {}),
|
||||
...(cacheWrite && parseFloat(cacheWrite) > 0
|
||||
? { cache_write: priceToPerMillion(cacheWrite) }
|
||||
: {}),
|
||||
};
|
||||
} else if (existing?.cost?.input !== undefined && existing.cost.output !== undefined) {
|
||||
merged.cost = {
|
||||
input: existing.cost.input,
|
||||
output: existing.cost.output,
|
||||
...(existing.cost.cache_read !== undefined ? { cache_read: existing.cost.cache_read } : {}),
|
||||
...(existing.cost.cache_write !== undefined ? { cache_write: existing.cost.cache_write } : {}),
|
||||
};
|
||||
}
|
||||
|
||||
return merged;
|
||||
}
|
||||
|
||||
function formatToml(model: MergedModel): string {
|
||||
const lines: string[] = [];
|
||||
|
||||
lines.push(`name = "${model.name.replace(/"/g, '\\"')}"`);
|
||||
if (model.family) {
|
||||
lines.push(`family = "${model.family}"`);
|
||||
}
|
||||
lines.push(`release_date = "${model.release_date}"`);
|
||||
lines.push(`last_updated = "${model.last_updated}"`);
|
||||
lines.push(`attachment = ${model.attachment}`);
|
||||
lines.push(`reasoning = ${model.reasoning}`);
|
||||
if (model.structured_output !== undefined) {
|
||||
lines.push(`structured_output = ${model.structured_output}`);
|
||||
}
|
||||
lines.push(`temperature = ${model.temperature}`);
|
||||
lines.push(`tool_call = ${model.tool_call}`);
|
||||
if (model.knowledge) {
|
||||
lines.push(`knowledge = "${model.knowledge}"`);
|
||||
}
|
||||
lines.push(`open_weights = ${model.open_weights}`);
|
||||
if (model.status) {
|
||||
lines.push(`status = "${model.status}"`);
|
||||
}
|
||||
|
||||
if (model.interleaved !== undefined) {
|
||||
lines.push("");
|
||||
if (model.interleaved === true) {
|
||||
lines.push("interleaved = true");
|
||||
} else {
|
||||
lines.push("[interleaved]");
|
||||
lines.push(`field = "${model.interleaved.field}"`);
|
||||
}
|
||||
}
|
||||
|
||||
if (model.cost) {
|
||||
lines.push("");
|
||||
lines.push("[cost]");
|
||||
lines.push(`input = ${formatDecimal(model.cost.input)}`);
|
||||
lines.push(`output = ${formatDecimal(model.cost.output)}`);
|
||||
if (model.cost.cache_read !== undefined) {
|
||||
lines.push(`cache_read = ${formatDecimal(model.cost.cache_read)}`);
|
||||
}
|
||||
if (model.cost.cache_write !== undefined) {
|
||||
lines.push(`cache_write = ${formatDecimal(model.cost.cache_write)}`);
|
||||
}
|
||||
}
|
||||
|
||||
lines.push("");
|
||||
lines.push("[limit]");
|
||||
lines.push(`context = ${formatNumber(model.limit.context)}`);
|
||||
lines.push(`output = ${formatNumber(model.limit.output)}`);
|
||||
|
||||
lines.push("");
|
||||
lines.push("[modalities]");
|
||||
lines.push(`input = [${model.modalities.input.map((m) => `"${m}"`).join(", ")}]`);
|
||||
lines.push(`output = [${model.modalities.output.map((m) => `"${m}"`).join(", ")}]`);
|
||||
|
||||
return `${lines.join("\n")}\n`;
|
||||
}
|
||||
|
||||
function detectChanges(existing: ExistingModel | null, merged: MergedModel): Changes[] {
|
||||
if (!existing) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const changes: Changes[] = [];
|
||||
const epsilon = 0.001;
|
||||
|
||||
const formatValue = (value: unknown): string => {
|
||||
if (typeof value === "number") return formatNumber(value);
|
||||
if (Array.isArray(value)) return `[${value.join(", ")}]`;
|
||||
if (value === undefined) return "(none)";
|
||||
return String(value);
|
||||
};
|
||||
|
||||
const compare = (field: string, oldValue: unknown, newValue: unknown) => {
|
||||
const changed = field.startsWith("cost.")
|
||||
? (
|
||||
oldValue === undefined && newValue === undefined
|
||||
? false
|
||||
: oldValue === undefined || newValue === undefined
|
||||
? true
|
||||
: Math.abs((oldValue as number) - (newValue as number)) > epsilon
|
||||
)
|
||||
: JSON.stringify(oldValue) !== JSON.stringify(newValue);
|
||||
|
||||
if (changed) {
|
||||
changes.push({
|
||||
field,
|
||||
oldValue: formatValue(oldValue),
|
||||
newValue: formatValue(newValue),
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
compare("name", existing.name, merged.name);
|
||||
compare("family", existing.family, merged.family);
|
||||
compare("release_date", existing.release_date, merged.release_date);
|
||||
compare("attachment", existing.attachment, merged.attachment);
|
||||
compare("reasoning", existing.reasoning, merged.reasoning);
|
||||
compare("structured_output", existing.structured_output, merged.structured_output);
|
||||
compare("temperature", existing.temperature, merged.temperature);
|
||||
compare("tool_call", existing.tool_call, merged.tool_call);
|
||||
compare("open_weights", existing.open_weights, merged.open_weights);
|
||||
compare("cost.input", existing.cost?.input, merged.cost?.input);
|
||||
compare("cost.output", existing.cost?.output, merged.cost?.output);
|
||||
compare("cost.cache_read", existing.cost?.cache_read, merged.cost?.cache_read);
|
||||
compare("cost.cache_write", existing.cost?.cache_write, merged.cost?.cache_write);
|
||||
compare("limit.context", existing.limit?.context, merged.limit.context);
|
||||
compare("limit.output", existing.limit?.output, merged.limit.output);
|
||||
compare("modalities.input", existing.modalities?.input, merged.modalities.input);
|
||||
compare("modalities.output", existing.modalities?.output, merged.modalities.output);
|
||||
|
||||
return changes;
|
||||
}
|
||||
|
||||
async function main() {
|
||||
const args = process.argv.slice(2);
|
||||
const dryRun = args.includes("--dry-run");
|
||||
const newOnly = args.includes("--new-only");
|
||||
|
||||
const modelsDir = path.join(import.meta.dirname, "..", "..", "..", "providers", "wandb", "models");
|
||||
|
||||
console.log(`${dryRun ? "[DRY RUN] " : ""}${newOnly ? "[NEW ONLY] " : ""}Fetching WandB models from API...`);
|
||||
|
||||
const res = await fetch(API_ENDPOINT);
|
||||
if (!res.ok) {
|
||||
console.error(`Failed to fetch API: ${res.status} ${res.statusText}`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const json = await res.json();
|
||||
const parsed = WandbResponse.safeParse(json);
|
||||
if (!parsed.success) {
|
||||
console.error("Invalid API response:", parsed.error.errors);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const apiModels = parsed.data.data;
|
||||
const existingFiles = new Set<string>();
|
||||
|
||||
for await (const file of new Bun.Glob("**/*.toml").scan({ cwd: modelsDir, absolute: false })) {
|
||||
existingFiles.add(file);
|
||||
}
|
||||
|
||||
console.log(`Found ${apiModels.length} models in API, ${existingFiles.size} existing files\n`);
|
||||
|
||||
const apiModelIds = new Set<string>();
|
||||
let created = 0;
|
||||
let updated = 0;
|
||||
let unchanged = 0;
|
||||
|
||||
for (const apiModel of apiModels) {
|
||||
const relativePath = `${apiModel.id}.toml`;
|
||||
const filePath = path.join(modelsDir, relativePath);
|
||||
const dirPath = path.dirname(filePath);
|
||||
|
||||
apiModelIds.add(relativePath);
|
||||
|
||||
const existing = await loadExistingModel(filePath);
|
||||
const merged = mergeModel(apiModel, existing);
|
||||
const tomlContent = formatToml(merged);
|
||||
|
||||
if (existing === null) {
|
||||
created++;
|
||||
if (dryRun) {
|
||||
console.log(`[DRY RUN] Would create: ${relativePath}`);
|
||||
console.log(` name = "${merged.name}"`);
|
||||
if (merged.family) {
|
||||
console.log(` family = "${merged.family}"`);
|
||||
}
|
||||
console.log("");
|
||||
} else {
|
||||
await mkdir(dirPath, { recursive: true });
|
||||
await Bun.write(filePath, tomlContent);
|
||||
console.log(`Created: ${relativePath}`);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (newOnly) {
|
||||
unchanged++;
|
||||
continue;
|
||||
}
|
||||
|
||||
const changes = detectChanges(existing, merged);
|
||||
if (changes.length === 0) {
|
||||
unchanged++;
|
||||
continue;
|
||||
}
|
||||
|
||||
updated++;
|
||||
if (dryRun) {
|
||||
console.log(`[DRY RUN] Would update: ${relativePath}`);
|
||||
} else {
|
||||
await mkdir(dirPath, { recursive: true });
|
||||
await Bun.write(filePath, tomlContent);
|
||||
console.log(`Updated: ${relativePath}`);
|
||||
}
|
||||
|
||||
for (const change of changes) {
|
||||
console.log(` ${change.field}: ${change.oldValue} → ${change.newValue}`);
|
||||
}
|
||||
console.log("");
|
||||
}
|
||||
|
||||
const orphaned = [...existingFiles].filter((file) => !apiModelIds.has(file));
|
||||
for (const file of orphaned) {
|
||||
console.log(`Warning: Orphaned file (not in API): ${file}`);
|
||||
}
|
||||
|
||||
console.log("");
|
||||
console.log(
|
||||
dryRun
|
||||
? `Summary: ${created} would be created, ${updated} would be updated, ${unchanged} unchanged, ${orphaned.length} orphaned`
|
||||
: `Summary: ${created} created, ${updated} updated, ${unchanged} unchanged, ${orphaned.length} orphaned`,
|
||||
);
|
||||
}
|
||||
|
||||
await main();
|
||||
@@ -96,6 +96,7 @@ export const ModelFamilyValues = [
|
||||
|
||||
// NVIDIA Nemotron
|
||||
"nemotron",
|
||||
"nemotron-free",
|
||||
|
||||
// AWS Titan
|
||||
"titan",
|
||||
@@ -103,6 +104,8 @@ export const ModelFamilyValues = [
|
||||
|
||||
// MiniMax
|
||||
"minimax",
|
||||
"minimax-m2.5",
|
||||
"minimax-m2.7",
|
||||
"minimax-free",
|
||||
|
||||
// Hunyuan
|
||||
@@ -193,6 +196,9 @@ export const ModelFamilyValues = [
|
||||
|
||||
// Mimo
|
||||
"mimo",
|
||||
"mimo-pro-free",
|
||||
"mimo-omni-free",
|
||||
"mimo-flash-free",
|
||||
|
||||
// Clarifai
|
||||
"mm-poly",
|
||||
@@ -284,9 +290,6 @@ export const ModelFamilyValues = [
|
||||
// Parakeet
|
||||
"parakeet",
|
||||
|
||||
// MiMo
|
||||
"mimo-flash-free",
|
||||
|
||||
// NeMo
|
||||
"nemoretriever",
|
||||
|
||||
|
||||
@@ -12,6 +12,8 @@ open_weights = false
|
||||
[cost]
|
||||
input = 0.25
|
||||
output = 1.50
|
||||
cache_read = 0.025
|
||||
cache_write = 1.00
|
||||
|
||||
[limit]
|
||||
context = 1_048_576
|
||||
|
||||
@@ -18,7 +18,8 @@ cache_read = 0
|
||||
cache_write = 0
|
||||
|
||||
[limit]
|
||||
context = 16_608
|
||||
context = 196_608
|
||||
input = 196_601
|
||||
output = 24_576
|
||||
|
||||
[modalities]
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
name = "Jamba 1.5 Large"
|
||||
family = "jamba"
|
||||
release_date = "2024-08-15"
|
||||
last_updated = "2024-08-15"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
temperature = true
|
||||
knowledge = "2024-08"
|
||||
tool_call = true
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 2.00
|
||||
output = 8.00
|
||||
|
||||
[limit]
|
||||
context = 256_000
|
||||
output = 4_096
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
output = ["text"]
|
||||
@@ -1,22 +0,0 @@
|
||||
name = "Jamba 1.5 Mini"
|
||||
family = "jamba"
|
||||
release_date = "2024-08-15"
|
||||
last_updated = "2024-08-15"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
temperature = true
|
||||
knowledge = "2024-08"
|
||||
tool_call = true
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 0.20
|
||||
output = 0.40
|
||||
|
||||
[limit]
|
||||
context = 256_000
|
||||
output = 4_096
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
output = ["text"]
|
||||
@@ -1,21 +0,0 @@
|
||||
name = "Titan Text G1 - Express"
|
||||
family = "titan"
|
||||
release_date = "2024-12-01"
|
||||
last_updated = "2024-12-01"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
temperature = true
|
||||
tool_call = true
|
||||
open_weights = false
|
||||
|
||||
[cost]
|
||||
input = 0.20
|
||||
output = 0.60
|
||||
|
||||
[limit]
|
||||
context = 128_000
|
||||
output = 4_096
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
output = ["text"]
|
||||
@@ -1,21 +0,0 @@
|
||||
name = "Titan Text G1 - Express"
|
||||
family = "titan"
|
||||
release_date = "2024-12-01"
|
||||
last_updated = "2024-12-01"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
temperature = true
|
||||
tool_call = true
|
||||
open_weights = false
|
||||
|
||||
[cost]
|
||||
input = 0.20
|
||||
output = 0.60
|
||||
|
||||
[limit]
|
||||
context = 128_000
|
||||
output = 4_096
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
output = ["text"]
|
||||
@@ -1,22 +0,0 @@
|
||||
name = "Claude Opus 3"
|
||||
family = "claude-opus"
|
||||
release_date = "2024-02-29"
|
||||
last_updated = "2024-02-29"
|
||||
attachment = true
|
||||
reasoning = false
|
||||
temperature = true
|
||||
knowledge = "2023-08"
|
||||
tool_call = true
|
||||
open_weights = false
|
||||
|
||||
[cost]
|
||||
input = 15.00
|
||||
output = 75.00
|
||||
|
||||
[limit]
|
||||
context = 200_000
|
||||
output = 4_096
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image", "pdf"]
|
||||
output = ["text"]
|
||||
@@ -1,22 +0,0 @@
|
||||
name = "Claude Sonnet 3"
|
||||
family = "claude-sonnet"
|
||||
release_date = "2024-03-04"
|
||||
last_updated = "2024-03-04"
|
||||
attachment = true
|
||||
reasoning = false
|
||||
temperature = true
|
||||
knowledge = "2023-08"
|
||||
tool_call = true
|
||||
open_weights = false
|
||||
|
||||
[cost]
|
||||
input = 3.00
|
||||
output = 15.00
|
||||
|
||||
[limit]
|
||||
context = 200_000
|
||||
output = 4_096
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image", "pdf"]
|
||||
output = ["text"]
|
||||
@@ -1,22 +0,0 @@
|
||||
name = "Claude Instant"
|
||||
family = "claude"
|
||||
release_date = "2023-03-01"
|
||||
last_updated = "2023-03-01"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
temperature = true
|
||||
knowledge = "2023-08"
|
||||
tool_call = false
|
||||
open_weights = false
|
||||
|
||||
[cost]
|
||||
input = 0.80
|
||||
output = 2.40
|
||||
|
||||
[limit]
|
||||
context = 100_000
|
||||
output = 4_096
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
output = ["text"]
|
||||
@@ -1,7 +1,7 @@
|
||||
name = "Claude Opus 4.6"
|
||||
family = "claude-opus"
|
||||
release_date = "2026-02-05"
|
||||
last_updated = "2026-02-05"
|
||||
last_updated = "2026-03-18"
|
||||
attachment = true
|
||||
reasoning = true
|
||||
temperature = true
|
||||
@@ -15,14 +15,8 @@ output = 25.00
|
||||
cache_read = 0.50
|
||||
cache_write = 6.25
|
||||
|
||||
[cost.context_over_200k]
|
||||
input = 10.00
|
||||
output = 37.50
|
||||
cache_read = 1.00
|
||||
cache_write = 12.50
|
||||
|
||||
[limit]
|
||||
context = 200_000
|
||||
context = 1_000_000
|
||||
output = 128_000
|
||||
|
||||
[modalities]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
name = "Claude Sonnet 4.6"
|
||||
family = "claude-sonnet"
|
||||
release_date = "2026-02-17"
|
||||
last_updated = "2026-02-17"
|
||||
last_updated = "2026-03-18"
|
||||
attachment = true
|
||||
reasoning = true
|
||||
temperature = true
|
||||
@@ -15,14 +15,8 @@ output = 15.00
|
||||
cache_read = 0.30
|
||||
cache_write = 3.75
|
||||
|
||||
[cost.context_over_200k]
|
||||
input = 6.00
|
||||
output = 22.50
|
||||
cache_read = 0.60
|
||||
cache_write = 7.50
|
||||
|
||||
[limit]
|
||||
context = 200_000
|
||||
context = 1_000_000
|
||||
output = 64_000
|
||||
|
||||
[modalities]
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
name = "Claude 2"
|
||||
family = "claude"
|
||||
release_date = "2023-07-11"
|
||||
last_updated = "2023-07-11"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
temperature = true
|
||||
knowledge = "2023-08"
|
||||
tool_call = false
|
||||
open_weights = false
|
||||
|
||||
[cost]
|
||||
input = 8.00
|
||||
output = 24.00
|
||||
|
||||
[limit]
|
||||
context = 100_000
|
||||
output = 4_096
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
output = ["text"]
|
||||
@@ -1,22 +0,0 @@
|
||||
name = "Claude 2.1"
|
||||
family = "claude"
|
||||
release_date = "2023-11-21"
|
||||
last_updated = "2023-11-21"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
temperature = true
|
||||
knowledge = "2023-08"
|
||||
tool_call = false
|
||||
open_weights = false
|
||||
|
||||
[cost]
|
||||
input = 8.00
|
||||
output = 24.00
|
||||
|
||||
[limit]
|
||||
context = 200_000
|
||||
output = 4_096
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
output = ["text"]
|
||||
@@ -1,22 +0,0 @@
|
||||
name = "Command Light"
|
||||
family = "command-light"
|
||||
release_date = "2023-11-01"
|
||||
last_updated = "2023-11-01"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
temperature = true
|
||||
knowledge = "2023-08"
|
||||
tool_call = false
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 0.30
|
||||
output = 0.60
|
||||
|
||||
[limit]
|
||||
context = 4_096
|
||||
output = 4_096
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
output = ["text"]
|
||||
@@ -1,22 +0,0 @@
|
||||
name = "Command"
|
||||
family = "command"
|
||||
release_date = "2023-11-01"
|
||||
last_updated = "2023-11-01"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
temperature = true
|
||||
knowledge = "2023-08"
|
||||
tool_call = false
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 1.50
|
||||
output = 2.00
|
||||
|
||||
[limit]
|
||||
context = 4_096
|
||||
output = 4_096
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
output = ["text"]
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
name = "DeepSeek-V3.2"
|
||||
family = "deepseek"
|
||||
release_date = "2026-02-15"
|
||||
last_updated = "2026-02-15"
|
||||
release_date = "2026-02-06"
|
||||
last_updated = "2026-02-06"
|
||||
attachment = false
|
||||
reasoning = true
|
||||
temperature = true
|
||||
@@ -1,7 +1,7 @@
|
||||
name = "Claude Opus 4.6 (EU)"
|
||||
family = "claude-opus"
|
||||
release_date = "2026-02-05"
|
||||
last_updated = "2026-02-05"
|
||||
last_updated = "2026-03-18"
|
||||
attachment = true
|
||||
reasoning = true
|
||||
temperature = true
|
||||
@@ -15,14 +15,8 @@ output = 25.00
|
||||
cache_read = 0.50
|
||||
cache_write = 6.25
|
||||
|
||||
[cost.context_over_200k]
|
||||
input = 10.00
|
||||
output = 37.50
|
||||
cache_read = 1.00
|
||||
cache_write = 12.50
|
||||
|
||||
[limit]
|
||||
context = 200_000
|
||||
context = 1_000_000
|
||||
output = 128_000
|
||||
|
||||
[modalities]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
name = "Claude Sonnet 4.6 (EU)"
|
||||
family = "claude-sonnet"
|
||||
release_date = "2026-02-17"
|
||||
last_updated = "2026-02-17"
|
||||
last_updated = "2026-03-18"
|
||||
attachment = true
|
||||
reasoning = true
|
||||
temperature = true
|
||||
@@ -15,14 +15,8 @@ output = 15.00
|
||||
cache_read = 0.30
|
||||
cache_write = 3.75
|
||||
|
||||
[cost.context_over_200k]
|
||||
input = 6.00
|
||||
output = 22.50
|
||||
cache_read = 0.60
|
||||
cache_write = 7.50
|
||||
|
||||
[limit]
|
||||
context = 200_000
|
||||
context = 1_000_000
|
||||
output = 64_000
|
||||
|
||||
[modalities]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
name = "Claude Opus 4.6 (Global)"
|
||||
family = "claude-opus"
|
||||
release_date = "2026-02-05"
|
||||
last_updated = "2026-02-05"
|
||||
last_updated = "2026-03-18"
|
||||
attachment = true
|
||||
reasoning = true
|
||||
temperature = true
|
||||
@@ -15,14 +15,8 @@ output = 25.00
|
||||
cache_read = 0.50
|
||||
cache_write = 6.25
|
||||
|
||||
[cost.context_over_200k]
|
||||
input = 10.00
|
||||
output = 37.50
|
||||
cache_read = 1.00
|
||||
cache_write = 12.50
|
||||
|
||||
[limit]
|
||||
context = 200_000
|
||||
context = 1_000_000
|
||||
output = 128_000
|
||||
|
||||
[modalities]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
name = "Claude Sonnet 4.6 (Global)"
|
||||
family = "claude-sonnet"
|
||||
release_date = "2026-02-17"
|
||||
last_updated = "2026-02-17"
|
||||
last_updated = "2026-03-18"
|
||||
attachment = true
|
||||
reasoning = true
|
||||
temperature = true
|
||||
@@ -15,14 +15,8 @@ output = 15.00
|
||||
cache_read = 0.30
|
||||
cache_write = 3.75
|
||||
|
||||
[cost.context_over_200k]
|
||||
input = 6.00
|
||||
output = 22.50
|
||||
cache_read = 0.60
|
||||
cache_write = 7.50
|
||||
|
||||
[limit]
|
||||
context = 200_000
|
||||
context = 1_000_000
|
||||
output = 64_000
|
||||
|
||||
[modalities]
|
||||
|
||||
+6
-6
@@ -1,4 +1,4 @@
|
||||
name = "Llama 3 70B Instruct"
|
||||
name = "Llama 3.1 405B Instruct"
|
||||
family = "llama"
|
||||
release_date = "2024-07-23"
|
||||
last_updated = "2024-07-23"
|
||||
@@ -6,16 +6,16 @@ attachment = false
|
||||
reasoning = false
|
||||
temperature = true
|
||||
knowledge = "2023-12"
|
||||
tool_call = false
|
||||
tool_call = true
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 2.65
|
||||
output = 3.50
|
||||
input = 2.40
|
||||
output = 2.40
|
||||
|
||||
[limit]
|
||||
context = 8_192
|
||||
output = 2_048
|
||||
context = 128_000
|
||||
output = 4_096
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
@@ -1,12 +1,12 @@
|
||||
name = "Devstral 2 135B"
|
||||
family = "mistral"
|
||||
name = "Devstral 2 123B"
|
||||
family = "devstral"
|
||||
release_date = "2026-02-17"
|
||||
last_updated = "2026-02-17"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
temperature = true
|
||||
tool_call = true
|
||||
open_weights = false
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 0.40
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
name = "Magistral Small 1.2"
|
||||
family = "magistral"
|
||||
release_date = "2025-12-02"
|
||||
last_updated = "2025-12-02"
|
||||
attachment = false
|
||||
reasoning = true
|
||||
temperature = true
|
||||
tool_call = true
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 0.50
|
||||
output = 1.50
|
||||
|
||||
[limit]
|
||||
context = 128_000
|
||||
output = 40_000
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image"]
|
||||
output = ["text"]
|
||||
@@ -0,0 +1,21 @@
|
||||
name = "Ministral 3 3B"
|
||||
family = "ministral"
|
||||
release_date = "2025-12-02"
|
||||
last_updated = "2025-12-02"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
temperature = true
|
||||
tool_call = true
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 0.10
|
||||
output = 0.10
|
||||
|
||||
[limit]
|
||||
context = 256_000
|
||||
output = 8_192
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image"]
|
||||
output = ["text"]
|
||||
@@ -1,21 +0,0 @@
|
||||
name = "Mistral Large (24.02)"
|
||||
family = "mistral-large"
|
||||
release_date = "2024-12-01"
|
||||
last_updated = "2024-12-01"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
temperature = true
|
||||
tool_call = true
|
||||
open_weights = false
|
||||
|
||||
[cost]
|
||||
input = 0.50
|
||||
output = 1.50
|
||||
|
||||
[limit]
|
||||
context = 128_000
|
||||
output = 4_096
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
output = ["text"]
|
||||
@@ -0,0 +1,21 @@
|
||||
name = "Mistral Large 3"
|
||||
family = "mistral"
|
||||
release_date = "2025-12-02"
|
||||
last_updated = "2025-12-02"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
temperature = true
|
||||
tool_call = true
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 0.50
|
||||
output = 1.50
|
||||
|
||||
[limit]
|
||||
context = 256_000
|
||||
output = 8_192
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image"]
|
||||
output = ["text"]
|
||||
@@ -1,22 +0,0 @@
|
||||
name = "Mixtral-8x7B-Instruct-v0.1"
|
||||
family = "mixtral"
|
||||
release_date = "2025-04-01"
|
||||
last_updated = "2025-04-01"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
tool_call = false
|
||||
structured_output = true
|
||||
temperature = true
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 0.70
|
||||
output = 0.70
|
||||
|
||||
[limit]
|
||||
context = 32_000
|
||||
output = 32_000
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
output = ["text"]
|
||||
@@ -0,0 +1,21 @@
|
||||
name = "Pixtral Large (25.02)"
|
||||
family = "mistral"
|
||||
release_date = "2025-04-08"
|
||||
last_updated = "2025-04-08"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
temperature = true
|
||||
tool_call = true
|
||||
open_weights = false
|
||||
|
||||
[cost]
|
||||
input = 2.00
|
||||
output = 6.00
|
||||
|
||||
[limit]
|
||||
context = 128_000
|
||||
output = 8_192
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image"]
|
||||
output = ["text"]
|
||||
+7
-8
@@ -1,17 +1,16 @@
|
||||
name = "Command R"
|
||||
family = "command-r"
|
||||
release_date = "2024-03-11"
|
||||
last_updated = "2024-03-11"
|
||||
name = "NVIDIA Nemotron Nano 3 30B"
|
||||
family = "nemotron"
|
||||
release_date = "2025-12-23"
|
||||
last_updated = "2025-12-23"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
reasoning = true
|
||||
temperature = true
|
||||
knowledge = "2024-04"
|
||||
tool_call = true
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 0.50
|
||||
output = 1.50
|
||||
input = 0.06
|
||||
output = 0.24
|
||||
|
||||
[limit]
|
||||
context = 128_000
|
||||
@@ -1,7 +1,7 @@
|
||||
name = "Claude Opus 4.6 (US)"
|
||||
family = "claude-opus"
|
||||
release_date = "2026-02-05"
|
||||
last_updated = "2026-02-05"
|
||||
last_updated = "2026-03-18"
|
||||
attachment = true
|
||||
reasoning = true
|
||||
temperature = true
|
||||
@@ -15,14 +15,8 @@ output = 25.00
|
||||
cache_read = 0.50
|
||||
cache_write = 6.25
|
||||
|
||||
[cost.context_over_200k]
|
||||
input = 10.00
|
||||
output = 37.50
|
||||
cache_read = 1.00
|
||||
cache_write = 12.50
|
||||
|
||||
[limit]
|
||||
context = 200_000
|
||||
context = 1_000_000
|
||||
output = 128_000
|
||||
|
||||
[modalities]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
name = "Claude Sonnet 4.6 (US)"
|
||||
family = "claude-sonnet"
|
||||
release_date = "2026-02-17"
|
||||
last_updated = "2026-02-17"
|
||||
last_updated = "2026-03-18"
|
||||
attachment = true
|
||||
reasoning = true
|
||||
temperature = true
|
||||
@@ -15,14 +15,8 @@ output = 15.00
|
||||
cache_read = 0.30
|
||||
cache_write = 3.75
|
||||
|
||||
[cost.context_over_200k]
|
||||
input = 6.00
|
||||
output = 22.50
|
||||
cache_read = 0.60
|
||||
cache_write = 7.50
|
||||
|
||||
[limit]
|
||||
context = 200_000
|
||||
context = 1_000_000
|
||||
output = 64_000
|
||||
|
||||
[modalities]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
name = "Claude Opus 4.6"
|
||||
family = "claude-opus"
|
||||
release_date = "2026-02-05"
|
||||
last_updated = "2026-02-05"
|
||||
last_updated = "2026-03-13"
|
||||
attachment = true
|
||||
reasoning = true
|
||||
temperature = true
|
||||
@@ -15,14 +15,8 @@ output = 25.00
|
||||
cache_read = 0.50
|
||||
cache_write = 6.25
|
||||
|
||||
[cost.context_over_200k]
|
||||
input = 10.00
|
||||
output = 37.50
|
||||
cache_read = 1.00
|
||||
cache_write = 12.50
|
||||
|
||||
[limit]
|
||||
context = 200_000
|
||||
context = 1_000_000
|
||||
output = 128_000
|
||||
|
||||
[modalities]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
name = "Claude Sonnet 4.6"
|
||||
family = "claude-sonnet"
|
||||
release_date = "2026-02-17"
|
||||
last_updated = "2026-02-17"
|
||||
last_updated = "2026-03-13"
|
||||
attachment = true
|
||||
reasoning = true
|
||||
temperature = true
|
||||
@@ -15,14 +15,8 @@ output = 15.00
|
||||
cache_read = 0.30
|
||||
cache_write = 3.75
|
||||
|
||||
[cost.context_over_200k]
|
||||
input = 6.00
|
||||
output = 22.50
|
||||
cache_read = 0.60
|
||||
cache_write = 7.50
|
||||
|
||||
[limit]
|
||||
context = 200_000
|
||||
context = 1_000_000
|
||||
output = 64_000
|
||||
|
||||
[modalities]
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
name = "GPT-5.4 Mini"
|
||||
family = "gpt-mini"
|
||||
release_date = "2026-03-17"
|
||||
last_updated = "2026-03-17"
|
||||
attachment = true
|
||||
reasoning = true
|
||||
temperature = false
|
||||
knowledge = "2025-08-31"
|
||||
tool_call = true
|
||||
structured_output = true
|
||||
open_weights = false
|
||||
|
||||
[cost]
|
||||
input = 0.75
|
||||
output = 4.50
|
||||
cache_read = 0.075
|
||||
|
||||
[limit]
|
||||
context = 400_000
|
||||
input = 272_000
|
||||
output = 128_000
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image", "pdf"]
|
||||
output = ["text"]
|
||||
@@ -0,0 +1,25 @@
|
||||
name = "GPT-5.4 Nano"
|
||||
family = "gpt-nano"
|
||||
release_date = "2026-03-17"
|
||||
last_updated = "2026-03-17"
|
||||
attachment = true
|
||||
reasoning = true
|
||||
temperature = false
|
||||
knowledge = "2025-08-31"
|
||||
tool_call = true
|
||||
structured_output = true
|
||||
open_weights = false
|
||||
|
||||
[cost]
|
||||
input = 0.20
|
||||
output = 1.25
|
||||
cache_read = 0.02
|
||||
|
||||
[limit]
|
||||
context = 400_000
|
||||
input = 272_000
|
||||
output = 128_000
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image", "pdf"]
|
||||
output = ["text"]
|
||||
@@ -3,7 +3,7 @@ family = "command-r"
|
||||
release_date = "2024-08-30"
|
||||
last_updated = "2024-08-30"
|
||||
attachment = false
|
||||
reasoning = true
|
||||
reasoning = false
|
||||
temperature = true
|
||||
knowledge = "2024-06-01"
|
||||
tool_call = true
|
||||
|
||||
@@ -3,7 +3,7 @@ family = "command-r"
|
||||
release_date = "2024-08-30"
|
||||
last_updated = "2024-08-30"
|
||||
attachment = false
|
||||
reasoning = true
|
||||
reasoning = false
|
||||
temperature = true
|
||||
knowledge = "2024-06-01"
|
||||
tool_call = true
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
name = "GPT-5.4 Mini"
|
||||
family = "gpt-mini"
|
||||
release_date = "2026-03-17"
|
||||
last_updated = "2026-03-17"
|
||||
attachment = true
|
||||
reasoning = true
|
||||
temperature = false
|
||||
knowledge = "2025-08-31"
|
||||
tool_call = true
|
||||
structured_output = true
|
||||
open_weights = false
|
||||
|
||||
[cost]
|
||||
input = 0.75
|
||||
output = 4.50
|
||||
cache_read = 0.075
|
||||
|
||||
[limit]
|
||||
context = 400_000
|
||||
input = 272_000
|
||||
output = 128_000
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image", "pdf"]
|
||||
output = ["text"]
|
||||
@@ -0,0 +1,25 @@
|
||||
name = "GPT-5.4 Nano"
|
||||
family = "gpt-nano"
|
||||
release_date = "2026-03-17"
|
||||
last_updated = "2026-03-17"
|
||||
attachment = true
|
||||
reasoning = true
|
||||
temperature = false
|
||||
knowledge = "2025-08-31"
|
||||
tool_call = true
|
||||
structured_output = true
|
||||
open_weights = false
|
||||
|
||||
[cost]
|
||||
input = 0.20
|
||||
output = 1.25
|
||||
cache_read = 0.02
|
||||
|
||||
[limit]
|
||||
context = 400_000
|
||||
input = 272_000
|
||||
output = 128_000
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image", "pdf"]
|
||||
output = ["text"]
|
||||
@@ -1,4 +1,5 @@
|
||||
name = "GPT-5.4 Pro"
|
||||
family = "gpt-pro"
|
||||
release_date = "2026-03-05"
|
||||
last_updated = "2026-03-05"
|
||||
attachment = true
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
name = "GPT-5.4"
|
||||
family = "gpt"
|
||||
release_date = "2026-03-05"
|
||||
last_updated = "2026-03-05"
|
||||
attachment = true
|
||||
@@ -20,5 +21,5 @@ input = 272_000
|
||||
output = 128_000
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image"]
|
||||
input = ["text", "image", "pdf"]
|
||||
output = ["text"]
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
name = "Grok 4.1 Fast (Non-Reasoning)"
|
||||
family = "grok"
|
||||
release_date = "2025-06-27"
|
||||
last_updated = "2025-06-27"
|
||||
attachment = true
|
||||
reasoning = false
|
||||
temperature = true
|
||||
tool_call = true
|
||||
open_weights = false
|
||||
status = "beta"
|
||||
|
||||
[cost]
|
||||
input = 0.20
|
||||
output = 0.50
|
||||
cache_read = 0.05
|
||||
|
||||
[limit]
|
||||
context = 128_000
|
||||
input = 128_000
|
||||
output = 8_192
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image"]
|
||||
output = ["text"]
|
||||
@@ -0,0 +1,24 @@
|
||||
name = "Grok 4.1 Fast (Reasoning)"
|
||||
family = "grok"
|
||||
release_date = "2025-06-27"
|
||||
last_updated = "2025-06-27"
|
||||
attachment = true
|
||||
reasoning = true
|
||||
temperature = true
|
||||
tool_call = true
|
||||
open_weights = false
|
||||
status = "beta"
|
||||
|
||||
[cost]
|
||||
input = 0.20
|
||||
output = 0.50
|
||||
cache_read = 0.05
|
||||
|
||||
[limit]
|
||||
context = 128_000
|
||||
input = 128_000
|
||||
output = 8_192
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image"]
|
||||
output = ["text"]
|
||||
@@ -25,3 +25,5 @@ output = ["text"]
|
||||
|
||||
[provider]
|
||||
shape = "completions"
|
||||
npm = "@ai-sdk/openai-compatible"
|
||||
api = "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/models"
|
||||
|
||||
+8
-8
@@ -1,22 +1,22 @@
|
||||
name = "DeepSeek-V3-0324"
|
||||
name = "DeepSeek V3 0324"
|
||||
family = "deepseek"
|
||||
release_date = "2025-03-24"
|
||||
last_updated = "2025-03-24"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
temperature = true
|
||||
knowledge = "2024-10"
|
||||
knowledge = "2024-12"
|
||||
tool_call = true
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 1.14
|
||||
output = 2.75
|
||||
|
||||
[limit]
|
||||
context = 161_000
|
||||
output = 8192
|
||||
context = 164_000
|
||||
output = 131_000
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
output = ["text"]
|
||||
|
||||
[cost]
|
||||
input = 0.77
|
||||
output = 0.77
|
||||
@@ -0,0 +1,21 @@
|
||||
name = "DeepSeek V3.1"
|
||||
family = "deepseek"
|
||||
release_date = "2025-08-25"
|
||||
last_updated = "2025-08-25"
|
||||
attachment = false
|
||||
reasoning = true
|
||||
temperature = true
|
||||
tool_call = true
|
||||
open_weights = true
|
||||
|
||||
[limit]
|
||||
context = 164_000
|
||||
output = 131_000
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
output = ["text"]
|
||||
|
||||
[cost]
|
||||
input = 0.50
|
||||
output = 1.50
|
||||
@@ -1,9 +1,10 @@
|
||||
name = "DeepSeek V3.2"
|
||||
family = "deepseek"
|
||||
status = "deprecated"
|
||||
release_date = "2025-12-01"
|
||||
last_updated = "2025-12-01"
|
||||
last_updated = "2026-03-06"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
reasoning = true
|
||||
temperature = true
|
||||
knowledge = "2025-10"
|
||||
tool_call = true
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
name = "Kimi K2 Instruct 0905"
|
||||
family = "kimi"
|
||||
status = "deprecated"
|
||||
release_date = "2025-09-05"
|
||||
last_updated = "2025-09-05"
|
||||
last_updated = "2026-03-06"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
temperature = true
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
name = "Kimi K2 Thinking"
|
||||
family = "kimi-thinking"
|
||||
status = "deprecated"
|
||||
release_date = "2025-11-06"
|
||||
last_updated = "2025-11-06"
|
||||
last_updated = "2026-03-06"
|
||||
attachment = false
|
||||
reasoning = true
|
||||
temperature = true
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
name = "Nemotron 3 Super"
|
||||
family = "nemotron"
|
||||
release_date = "2026-03-11"
|
||||
last_updated = "2026-03-11"
|
||||
attachment = false
|
||||
reasoning = true
|
||||
temperature = true
|
||||
tool_call = true
|
||||
knowledge = "2026-02"
|
||||
open_weights = true
|
||||
|
||||
[interleaved]
|
||||
field = "reasoning_content"
|
||||
|
||||
[cost]
|
||||
input = 0.30
|
||||
output = 0.75
|
||||
|
||||
[limit]
|
||||
context = 262144
|
||||
output = 32678
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
output = ["text"]
|
||||
+9
-7
@@ -1,20 +1,22 @@
|
||||
name = "OpenAI: gpt-oss-120b (exacto)"
|
||||
name = "GPT OSS 120B"
|
||||
family = "gpt-oss"
|
||||
release_date = "2025-08-05"
|
||||
last_updated = "2025-08-05"
|
||||
attachment = false
|
||||
reasoning = true
|
||||
temperature = true
|
||||
knowledge = "2025-08"
|
||||
tool_call = true
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 0.039
|
||||
output = 0.19
|
||||
|
||||
[limit]
|
||||
context = 131072
|
||||
output = 26215
|
||||
context = 128_000
|
||||
output = 128_000
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
output = ["text"]
|
||||
|
||||
[cost]
|
||||
input = 0.10
|
||||
output = 0.50
|
||||
@@ -10,8 +10,9 @@ structured_output = true
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 0.15
|
||||
output = 0.6
|
||||
input = 0.30
|
||||
output = 1.10
|
||||
cache_read = 0.15
|
||||
|
||||
[limit]
|
||||
context = 196_608
|
||||
|
||||
@@ -10,9 +10,9 @@ structured_output = true
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 0.30
|
||||
output = 1.20
|
||||
cache_read = 0.15
|
||||
input = 0.39
|
||||
output = 2.34
|
||||
cache_read = 0.195
|
||||
|
||||
[limit]
|
||||
context = 262_144
|
||||
|
||||
@@ -10,12 +10,12 @@ structured_output = true
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 0.25
|
||||
output = 0.38
|
||||
cache_read = 0.125
|
||||
input = 0.28
|
||||
output = 0.42
|
||||
cache_read = 0.14
|
||||
|
||||
[limit]
|
||||
context = 163_840
|
||||
context = 131_072
|
||||
output = 65_536
|
||||
|
||||
[modalities]
|
||||
|
||||
@@ -10,8 +10,9 @@ structured_output = true
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 0.35
|
||||
output = 1.50
|
||||
input = 0.40
|
||||
output = 1.70
|
||||
cache_read = 0.20
|
||||
|
||||
[limit]
|
||||
context = 202_752
|
||||
|
||||
@@ -12,6 +12,7 @@ open_weights = true
|
||||
[cost]
|
||||
input = 0.30
|
||||
output = 0.90
|
||||
cache_read = 0.15
|
||||
|
||||
[limit]
|
||||
context = 131_072
|
||||
|
||||
@@ -10,8 +10,9 @@ structured_output = true
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 0.750
|
||||
output = 2.50
|
||||
input = 0.95
|
||||
output = 3.15
|
||||
cache_read = 0.475
|
||||
|
||||
[limit]
|
||||
context = 202_752
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
name = "GLM 5 Turbo"
|
||||
family = "glm"
|
||||
release_date = "2026-03-11"
|
||||
last_updated = "2026-03-11"
|
||||
attachment = false
|
||||
reasoning = true
|
||||
temperature = true
|
||||
tool_call = true
|
||||
structured_output = true
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 0.49
|
||||
output = 1.96
|
||||
cache_read = 0.245
|
||||
|
||||
[limit]
|
||||
context = 202_752
|
||||
output = 65_535
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
output = ["text"]
|
||||
|
||||
[interleaved]
|
||||
field = "reasoning_content"
|
||||
@@ -0,0 +1,27 @@
|
||||
name = "Kimi K2.5"
|
||||
family = "kimi"
|
||||
release_date = "2026-01-27"
|
||||
last_updated = "2026-01-27"
|
||||
attachment = true
|
||||
reasoning = true
|
||||
structured_output = true
|
||||
temperature = true
|
||||
tool_call = true
|
||||
knowledge = "2025-01"
|
||||
open_weights = true
|
||||
|
||||
[interleaved]
|
||||
field = "reasoning_content"
|
||||
|
||||
[cost]
|
||||
input = 0.60
|
||||
output = 3.00
|
||||
cache_read = 0.10
|
||||
|
||||
[limit]
|
||||
context = 256_000
|
||||
output = 256_000
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image"]
|
||||
output = ["text"]
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
name = "Nemotron 3 Super 120B"
|
||||
family = "nemotron"
|
||||
release_date = "2026-03-11"
|
||||
last_updated = "2026-03-11"
|
||||
attachment = false
|
||||
reasoning = true
|
||||
temperature = true
|
||||
tool_call = true
|
||||
open_weights = true
|
||||
|
||||
[interleaved]
|
||||
field = "reasoning_content"
|
||||
|
||||
[cost]
|
||||
input = 0.50
|
||||
output = 1.50
|
||||
|
||||
[limit]
|
||||
context = 256_000
|
||||
output = 256_000
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
output = ["text"]
|
||||
@@ -0,0 +1,22 @@
|
||||
name = "GLM-4.7-Flash"
|
||||
family = "glm-flash"
|
||||
release_date = "2026-01-19"
|
||||
last_updated = "2026-01-19"
|
||||
attachment = false
|
||||
reasoning = true
|
||||
temperature = true
|
||||
tool_call = true
|
||||
knowledge = "2025-04"
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 0.06
|
||||
output = 0.40
|
||||
|
||||
[limit]
|
||||
context = 131_072
|
||||
output = 131_072
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
output = ["text"]
|
||||
@@ -0,0 +1,27 @@
|
||||
name = "Kimi K2.5"
|
||||
family = "kimi"
|
||||
release_date = "2026-01-27"
|
||||
last_updated = "2026-01-27"
|
||||
attachment = true
|
||||
reasoning = true
|
||||
structured_output = true
|
||||
temperature = true
|
||||
tool_call = true
|
||||
knowledge = "2025-01"
|
||||
open_weights = true
|
||||
|
||||
[interleaved]
|
||||
field = "reasoning_content"
|
||||
|
||||
[cost]
|
||||
input = 0.60
|
||||
output = 3.00
|
||||
cache_read = 0.10
|
||||
|
||||
[limit]
|
||||
context = 256_000
|
||||
output = 256_000
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image"]
|
||||
output = ["text"]
|
||||
@@ -0,0 +1,24 @@
|
||||
name = "Nemotron 3 Super 120B"
|
||||
family = "nemotron"
|
||||
release_date = "2026-03-11"
|
||||
last_updated = "2026-03-11"
|
||||
attachment = false
|
||||
reasoning = true
|
||||
temperature = true
|
||||
tool_call = true
|
||||
open_weights = true
|
||||
|
||||
[interleaved]
|
||||
field = "reasoning_content"
|
||||
|
||||
[cost]
|
||||
input = 0.50
|
||||
output = 1.50
|
||||
|
||||
[limit]
|
||||
context = 256_000
|
||||
output = 256_000
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
output = ["text"]
|
||||
@@ -4,7 +4,7 @@ last_updated = "2024-10-24"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
temperature = true
|
||||
tool_call = true
|
||||
tool_call = false
|
||||
open_weights = true
|
||||
|
||||
[limit]
|
||||
|
||||
@@ -4,7 +4,7 @@ last_updated = "2024-10-24"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
temperature = true
|
||||
tool_call = true
|
||||
tool_call = false
|
||||
open_weights = true
|
||||
|
||||
[limit]
|
||||
|
||||
@@ -4,7 +4,7 @@ last_updated = "2025-05-14"
|
||||
attachment = true
|
||||
reasoning = false
|
||||
temperature = true
|
||||
tool_call = true
|
||||
tool_call = false
|
||||
open_weights = true
|
||||
|
||||
[limit]
|
||||
|
||||
@@ -4,7 +4,7 @@ last_updated = "2025-05-14"
|
||||
attachment = true
|
||||
reasoning = false
|
||||
temperature = true
|
||||
tool_call = true
|
||||
tool_call = false
|
||||
open_weights = true
|
||||
|
||||
[limit]
|
||||
|
||||
@@ -3,7 +3,7 @@ family = "command-a"
|
||||
release_date = "2025-03-13"
|
||||
last_updated = "2025-03-13"
|
||||
attachment = false
|
||||
reasoning = true
|
||||
reasoning = false
|
||||
temperature = true
|
||||
knowledge = "2024-06-01"
|
||||
tool_call = true
|
||||
|
||||
@@ -3,7 +3,7 @@ family = "command-r"
|
||||
release_date = "2024-08-30"
|
||||
last_updated = "2024-08-30"
|
||||
attachment = false
|
||||
reasoning = true
|
||||
reasoning = false
|
||||
temperature = true
|
||||
knowledge = "2024-06-01"
|
||||
tool_call = true
|
||||
|
||||
@@ -3,7 +3,7 @@ family = "command-r"
|
||||
release_date = "2024-08-30"
|
||||
last_updated = "2024-08-30"
|
||||
attachment = false
|
||||
reasoning = true
|
||||
reasoning = false
|
||||
temperature = true
|
||||
knowledge = "2024-06-01"
|
||||
tool_call = true
|
||||
|
||||
+6
-8
@@ -1,21 +1,19 @@
|
||||
name = "Llama 3 8B Instruct"
|
||||
name = "Llama 3.1 70B Turbo"
|
||||
family = "llama"
|
||||
release_date = "2024-07-23"
|
||||
last_updated = "2024-07-23"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
temperature = true
|
||||
knowledge = "2023-03"
|
||||
tool_call = false
|
||||
tool_call = true
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 0.30
|
||||
output = 0.60
|
||||
input = 0.40
|
||||
output = 0.40
|
||||
|
||||
[limit]
|
||||
context = 8_192
|
||||
output = 2_048
|
||||
context = 131_072
|
||||
output = 16_384
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
@@ -0,0 +1,20 @@
|
||||
name = "Llama 3.1 70B"
|
||||
family = "llama"
|
||||
release_date = "2024-07-23"
|
||||
last_updated = "2024-07-23"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
tool_call = true
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 0.40
|
||||
output = 0.40
|
||||
|
||||
[limit]
|
||||
context = 131_072
|
||||
output = 16_384
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
output = ["text"]
|
||||
@@ -0,0 +1,20 @@
|
||||
name = "Llama 3.1 8B Turbo"
|
||||
family = "llama"
|
||||
release_date = "2024-07-23"
|
||||
last_updated = "2024-07-23"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
tool_call = true
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 0.02
|
||||
output = 0.03
|
||||
|
||||
[limit]
|
||||
context = 131_072
|
||||
output = 16_384
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
output = ["text"]
|
||||
@@ -0,0 +1,20 @@
|
||||
name = "Llama 3.1 8B"
|
||||
family = "llama"
|
||||
release_date = "2024-07-23"
|
||||
last_updated = "2024-07-23"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
tool_call = true
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 0.02
|
||||
output = 0.05
|
||||
|
||||
[limit]
|
||||
context = 131_072
|
||||
output = 16_384
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
output = ["text"]
|
||||
+6
-6
@@ -1,19 +1,19 @@
|
||||
name = "Meta: Llama 3.3 70B Instruct (free)"
|
||||
name = "Llama 3.3 70B Turbo"
|
||||
family = "llama"
|
||||
release_date = "2024-12-06"
|
||||
last_updated = "2024-12-06"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
temperature = true
|
||||
tool_call = true
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 0
|
||||
output = 0
|
||||
input = 0.10
|
||||
output = 0.32
|
||||
|
||||
[limit]
|
||||
context = 128000
|
||||
output = 128000
|
||||
context = 131_072
|
||||
output = 16_384
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
@@ -0,0 +1,20 @@
|
||||
name = "Llama 4 Maverick 17B FP8"
|
||||
family = "llama"
|
||||
release_date = "2025-04-05"
|
||||
last_updated = "2025-04-05"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
tool_call = true
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 0.15
|
||||
output = 0.60
|
||||
|
||||
[limit]
|
||||
context = 1_000_000
|
||||
output = 16_384
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image"]
|
||||
output = ["text"]
|
||||
@@ -0,0 +1,20 @@
|
||||
name = "Llama 4 Scout 17B"
|
||||
family = "llama"
|
||||
release_date = "2025-04-05"
|
||||
last_updated = "2025-04-05"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
tool_call = true
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 0.08
|
||||
output = 0.30
|
||||
|
||||
[limit]
|
||||
context = 10_000_000
|
||||
output = 16_384
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image"]
|
||||
output = ["text"]
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" class="lucide lucide-terminal h-5 w-5 text-primary"><path d="m4 17 6-6-6-6M12 19h8"/></svg>
|
||||
|
After Width: | Height: | Size: 253 B |
@@ -0,0 +1,25 @@
|
||||
name = "GLM-4.7"
|
||||
family = "glm"
|
||||
release_date = "2025-12"
|
||||
last_updated = "2025-12"
|
||||
attachment = false
|
||||
reasoning = true
|
||||
temperature = true
|
||||
tool_call = true
|
||||
knowledge = "2025-04"
|
||||
open_weights = true
|
||||
|
||||
[interleaved]
|
||||
field = "reasoning_content"
|
||||
|
||||
[cost]
|
||||
input = 0.45
|
||||
output = 1.65
|
||||
|
||||
[limit]
|
||||
context = 200_000
|
||||
output = 128_000
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
output = ["text"]
|
||||
@@ -0,0 +1,25 @@
|
||||
name = "GLM-5"
|
||||
family = "glm"
|
||||
release_date = "2026-02"
|
||||
last_updated = "2026-02"
|
||||
attachment = false
|
||||
reasoning = true
|
||||
temperature = true
|
||||
tool_call = true
|
||||
knowledge = "2025-04"
|
||||
open_weights = true
|
||||
|
||||
[interleaved]
|
||||
field = "reasoning_content"
|
||||
|
||||
[cost]
|
||||
input = 0.75
|
||||
output = 2.40
|
||||
|
||||
[limit]
|
||||
context = 200_000
|
||||
output = 128_000
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
output = ["text"]
|
||||
+7
-7
@@ -1,6 +1,6 @@
|
||||
name = "MoonshotAI: Kimi K2 0905 (exacto)"
|
||||
release_date = "2025-09-05"
|
||||
last_updated = "2025-09-05"
|
||||
name = "GPT OSS 120B"
|
||||
release_date = "2025-08"
|
||||
last_updated = "2025-08"
|
||||
attachment = false
|
||||
reasoning = false
|
||||
temperature = true
|
||||
@@ -8,12 +8,12 @@ tool_call = true
|
||||
open_weights = true
|
||||
|
||||
[cost]
|
||||
input = 0.6
|
||||
output = 2.5
|
||||
input = 0.0675
|
||||
output = 0.27
|
||||
|
||||
[limit]
|
||||
context = 262144
|
||||
output = 52429
|
||||
context = 131_072
|
||||
output = 32_768
|
||||
|
||||
[modalities]
|
||||
input = ["text"]
|
||||
@@ -0,0 +1,5 @@
|
||||
name = "DInference"
|
||||
env = ["DINFERENCE_API_KEY"]
|
||||
npm = "@ai-sdk/openai-compatible"
|
||||
doc = "https://dinference.com"
|
||||
api = "https://api.dinference.com/v1"
|
||||
@@ -2,5 +2,5 @@ name = "Firmware"
|
||||
# Token for Firmware's OpenAI-compatible proxy
|
||||
env = ["FIRMWARE_API_KEY"]
|
||||
npm = "@ai-sdk/openai-compatible"
|
||||
api = "https://app.firmware.ai/api/v1"
|
||||
doc = "https://docs.firmware.ai"
|
||||
api = "https://app.frogbot.ai/api/v1"
|
||||
doc = "https://docs.frogbot.ai"
|
||||
|
||||
@@ -14,8 +14,9 @@ input = 0
|
||||
output = 0
|
||||
|
||||
[limit]
|
||||
context = 128_000
|
||||
context = 144_000
|
||||
output = 32_000
|
||||
input = 128_000
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image"]
|
||||
|
||||
@@ -14,8 +14,9 @@ input = 0
|
||||
output = 0
|
||||
|
||||
[limit]
|
||||
context = 128_000
|
||||
context = 160_000
|
||||
output = 32_000
|
||||
input = 128_000
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image"]
|
||||
|
||||
@@ -14,8 +14,9 @@ input = 0
|
||||
output = 0
|
||||
|
||||
[limit]
|
||||
context = 128_000
|
||||
context = 144_000
|
||||
output = 64_000
|
||||
input = 128_000
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image"]
|
||||
|
||||
@@ -14,8 +14,9 @@ input = 0
|
||||
output = 0
|
||||
|
||||
[limit]
|
||||
context = 128_000
|
||||
context = 144_000
|
||||
output = 32_000
|
||||
input = 128_000
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image"]
|
||||
|
||||
@@ -13,8 +13,9 @@ input = 0
|
||||
output = 0
|
||||
|
||||
[limit]
|
||||
context = 128_000
|
||||
context = 200_000
|
||||
output = 32_000
|
||||
input = 128_000
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image"]
|
||||
|
||||
@@ -14,8 +14,9 @@ input = 0
|
||||
output = 0
|
||||
|
||||
[limit]
|
||||
context = 128_000
|
||||
context = 216_000
|
||||
output = 16_000
|
||||
input = 128_000
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image"]
|
||||
|
||||
@@ -16,6 +16,7 @@ output = 0
|
||||
[limit]
|
||||
context = 128_000
|
||||
output = 64_000
|
||||
input = 128_000
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image", "audio", "video"]
|
||||
|
||||
@@ -17,6 +17,7 @@ output = 0
|
||||
[limit]
|
||||
context = 128_000
|
||||
output = 64_000
|
||||
input = 128_000
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image", "audio", "video"]
|
||||
|
||||
@@ -17,6 +17,7 @@ output = 0
|
||||
[limit]
|
||||
context = 128_000
|
||||
output = 64_000
|
||||
input = 128_000
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image", "audio", "video"]
|
||||
|
||||
@@ -17,6 +17,7 @@ output = 0
|
||||
[limit]
|
||||
context = 128_000
|
||||
output = 64_000
|
||||
input = 128_000
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image"]
|
||||
|
||||
@@ -14,8 +14,9 @@ input = 0
|
||||
output = 0
|
||||
|
||||
[limit]
|
||||
context = 64_000
|
||||
context = 128_000
|
||||
output = 16_384
|
||||
input = 64_000
|
||||
|
||||
[modalities]
|
||||
input = ["text", "image"]
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user