feat: add llmgateway.io model sync provider

Add a sync provider for the LLM Gateway (llmgateway.io) aggregator,
mirroring its public /v1/models catalog into providers/llmgateway.

The gateway exposes an OpenRouter-shaped response, but its
supported_parameters and modality data are noisy (it omits "tools" for
flagship models yet lists "temperature" for ones marked temperature=false).
So the gateway is treated as authoritative only for the volatile,
gateway-specific data — cost and served limits — while capability and
modality fields stay curated (preserved from the existing entry, which a
factored model inherits from its base). Only text-output models are synced.

- packages/core/src/sync/providers/llmgateway.ts: new provider
- packages/core/src/sync/index.ts: register in providers + aggregators
- package.json: add llmgateway:sync script
- .github/workflows/sync-models.yml: optional LLMGATEWAY_API_KEY

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Luca Steeb
2026-06-24 17:01:30 +01:00
parent 2a005dcfd5
commit 9629a104d5
101 changed files with 561 additions and 480 deletions
+1
View File
@@ -67,6 +67,7 @@ jobs:
HF_TOKEN: ${{ secrets.HF_TOKEN }}
OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
VENICE_API_KEY: ${{ secrets.VENICE_API_KEY }}
LLMGATEWAY_API_KEY: ${{ secrets.LLMGATEWAY_API_KEY }}
GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }}
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
GOOGLE_GENERATIVE_AI_API_KEY: ${{ secrets.GOOGLE_GENERATIVE_AI_API_KEY }}
+1
View File
@@ -24,6 +24,7 @@
"databricks:generate": "bun ./packages/core/script/generate-databricks.ts",
"helicone:generate": "bun ./packages/core/script/generate-helicone.ts",
"huggingface:sync": "bun ./packages/core/script/sync-models.ts huggingface",
"llmgateway:sync": "bun ./packages/core/script/sync-models.ts llmgateway",
"venice:sync": "bun ./packages/core/script/sync-models.ts venice",
"vercel:generate": "bun ./packages/core/script/sync-models.ts vercel",
"wandb:generate": "bun ./packages/core/script/generate-wandb.ts",
+4 -1
View File
@@ -8,6 +8,7 @@ import { baseten } from "./providers/baseten.js";
import { cloudflareWorkersAi } from "./providers/cloudflare-workers-ai.js";
import { google } from "./providers/google.js";
import { huggingface } from "./providers/huggingface.js";
import { llmgateway } from "./providers/llmgateway.js";
import { openrouter } from "./providers/openrouter.js";
import { ovhcloud } from "./providers/ovhcloud.js";
import { vercel } from "./providers/vercel.js";
@@ -82,6 +83,7 @@ export const providers: {
"cloudflare-workers-ai": SyncProvider<any>;
google: SyncProvider<any>;
huggingface: SyncProvider<any>;
llmgateway: SyncProvider<any>;
openrouter: SyncProvider<any>;
ovhcloud: SyncProvider<any>;
vercel: SyncProvider<any>;
@@ -92,6 +94,7 @@ export const providers: {
"cloudflare-workers-ai": cloudflareWorkersAi,
google,
huggingface,
llmgateway,
openrouter,
ovhcloud,
vercel,
@@ -100,7 +103,7 @@ export const providers: {
};
export const groups = {
aggregators: ["huggingface", "openrouter", "vercel"],
aggregators: ["huggingface", "llmgateway", "openrouter", "vercel"],
cloudflare: ["cloudflare-workers-ai"],
direct: ["baseten", "google", "ovhcloud", "venice", "xai"],
} as const;
@@ -0,0 +1,217 @@
import { z } from "zod";
import { inferKimiFamily, ModelFamilyValues } from "../../family.js";
import type { ExistingModel, SyncProvider, SyncedFullModel, SyncedModel } from "../index.js";
import { factorBaseModel } from "./openrouter.js";
const API_ENDPOINT = "https://api.llmgateway.io/v1/models";
const Pricing = z.object({
prompt: z.string().optional(),
completion: z.string().optional(),
internal_reasoning: z.string().optional(),
input_cache_read: z.string().optional(),
input_cache_write: z.string().optional(),
});
export const LLMGatewayModel = z.object({
id: z.string(),
name: z.string(),
created: z.number(),
family: z.string().optional(),
architecture: z.object({
input_modalities: z.array(z.string()),
output_modalities: z.array(z.string()),
}),
pricing: Pricing,
context_length: z.number(),
supported_parameters: z.array(z.string()),
structured_outputs: z.boolean().optional(),
}).passthrough();
export const LLMGatewayResponse = z.object({
data: z.array(LLMGatewayModel),
}).passthrough();
export type LLMGatewayModel = z.infer<typeof LLMGatewayModel>;
export const llmgateway = {
id: "llmgateway",
name: "LLM Gateway",
modelsDir: "providers/llmgateway/models",
async fetchModels() {
const headers = process.env.LLMGATEWAY_API_KEY
? { Authorization: `Bearer ${process.env.LLMGATEWAY_API_KEY}` }
: undefined;
const response = await fetch(API_ENDPOINT, { headers });
if (!response.ok) {
throw new Error(`LLM Gateway request failed: ${response.status} ${response.statusText}`);
}
return response.json();
},
parseModels(raw) {
return LLMGatewayResponse.parse(raw).data.filter((model) => {
const output = model.architecture.output_modalities;
return output.length === 1 && output[0] === "text";
});
},
translateModel(model, context) {
return {
id: model.id,
model: buildLLMGatewayModel(model, context.existing(model.id)),
};
},
} satisfies SyncProvider<LLMGatewayModel>;
function dateFromTimestamp(timestamp: number) {
return new Date(timestamp * 1000).toISOString().slice(0, 10);
}
function price(value: string | undefined) {
if (value === undefined) return undefined;
const number = Number(value);
return Number.isFinite(number) && number >= 0
? Math.round(number * 1_000_000_000_000) / 1_000_000
: undefined;
}
// Cache/reasoning prices are reported as "0" when the gateway has no data; treat
// those as unknown so we never downgrade a hand-authored value to zero.
function nonZeroPrice(value: string | undefined) {
const result = price(value);
return result !== undefined && result > 0 ? result : undefined;
}
type Modality = "text" | "audio" | "image" | "video" | "pdf";
function modalities(values: string[], fallback: Modality[]): Modality[] {
const allowed = new Set<Modality>(["text", "audio", "image", "video", "pdf"]);
const result = values
.map((value) => value.toLowerCase())
.map((value) => (value === "file" ? "pdf" : value))
.filter((value): value is Modality => allowed.has(value as Modality));
return [...new Set(result.length > 0 ? result : fallback)];
}
function inferFamily(model: LLMGatewayModel, name: string) {
const kimiFamily = inferKimiFamily(model.id, name);
if (kimiFamily !== undefined) return kimiFamily;
const target = `${model.id} ${name}`.toLowerCase();
return [...ModelFamilyValues]
.sort((a, b) => b.length - a.length)
.find((family) => {
const value = family.toLowerCase().replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
if (family === "o") {
return new RegExp(`(^|[^a-z0-9])${value}(?=\\d|$|[^a-z0-9])`).test(target);
}
return new RegExp(`(^|[^a-z0-9])${value}(?=$|[^a-z0-9])`).test(target);
});
}
function buildLLMGatewayModel(
model: LLMGatewayModel,
existing: ExistingModel | undefined,
): SyncedModel {
const prompt = price(model.pricing.prompt);
const completion = price(model.pricing.completion);
const reasoning = model.supported_parameters.includes("reasoning")
|| model.supported_parameters.includes("include_reasoning");
const context = model.context_length > 0
? model.context_length
: existing?.limit?.context ?? model.context_length;
// The gateway is authoritative for the volatile, gateway-specific data — cost
// and served limits. Its supported_parameters / modalities are too noisy to
// drive capability fields (it omits "tools" for flagship models yet lists
// "temperature" for ones the catalog deliberately marks temperature=false),
// so those stay curated: preserved from the existing entry (which, for a
// factored model, inherits its base when the field is absent).
const cost = prompt !== undefined && completion !== undefined
? {
input: prompt,
output: completion,
reasoning: reasoning ? nonZeroPrice(model.pricing.internal_reasoning) ?? existing?.cost?.reasoning : existing?.cost?.reasoning,
cache_read: nonZeroPrice(model.pricing.input_cache_read) ?? existing?.cost?.cache_read,
cache_write: nonZeroPrice(model.pricing.input_cache_write) ?? existing?.cost?.cache_write,
tiers: existing?.cost?.tiers,
}
: existing?.cost;
const limit = {
context,
input: existing?.limit?.input,
output: existing?.limit?.output ?? context,
};
// Existing factored model: refresh cost + limit, keep every authored override
// as-is (undefined fields keep inheriting the base model).
if (existing?.base_model !== undefined) {
return factorBaseModel(
existing.base_model,
{
attachment: existing.attachment,
reasoning: existing.reasoning,
temperature: existing.temperature,
tool_call: existing.tool_call,
structured_output: existing.structured_output,
status: existing.status,
interleaved: existing.interleaved,
knowledge: existing.knowledge,
modalities: existing.modalities,
limit,
cost,
},
limit,
existing.base_model_omit,
);
}
// Existing full model: refresh cost + limit, preserve curated metadata.
if (existing !== undefined) {
return {
name: existing.name ?? model.name,
family: existing.family,
release_date: existing.release_date ?? dateFromTimestamp(model.created),
last_updated: existing.last_updated ?? dateFromTimestamp(model.created),
attachment: existing.attachment ?? false,
reasoning: existing.reasoning ?? false,
temperature: existing.temperature ?? false,
tool_call: existing.tool_call ?? false,
structured_output: existing.structured_output,
knowledge: existing.knowledge,
open_weights: existing.open_weights ?? false,
status: existing.status,
interleaved: existing.interleaved,
cost,
limit,
modalities: existing.modalities ?? defaultModalities(model),
} satisfies SyncedFullModel;
}
// Brand-new model: best-effort translation from the gateway. Capability and
// modality data are unreliable here and should be hand-reviewed.
const { input, output } = defaultModalities(model);
return {
name: model.name,
family: inferFamily(model, model.name),
release_date: dateFromTimestamp(model.created),
last_updated: dateFromTimestamp(model.created),
attachment: input.some((value) => value !== "text"),
reasoning,
temperature: model.supported_parameters.includes("temperature"),
tool_call: model.supported_parameters.includes("tools")
|| model.supported_parameters.includes("tool_choice"),
structured_output: model.structured_outputs ?? false,
open_weights: false,
cost,
limit,
modalities: { input, output },
} satisfies SyncedFullModel;
}
function defaultModalities(model: LLMGatewayModel) {
return {
input: modalities(model.architecture.input_modalities, ["text"]),
output: modalities(model.architecture.output_modalities, ["text"]),
};
}
@@ -1,24 +0,0 @@
name = "Claude 3.5 Haiku"
family = "claude"
release_date = "2024-10-22"
last_updated = "2024-10-22"
attachment = false
reasoning = false
temperature = true
tool_call = true
structured_output = false
open_weights = false
status = "deprecated"
[cost]
input = 0.80
output = 4.00
cache_read = 0.08
[limit]
context = 200_000
output = 8_192
[modalities]
input = ["text"]
output = ["text"]
@@ -1,7 +0,0 @@
base_model = "anthropic/claude-3-5-sonnet-20241022"
[cost]
input = 3
output = 15
cache_read = 0.3
cache_write = 3.75
@@ -10,9 +10,10 @@ structured_output = false
open_weights = false
[cost]
input = 3.00
output = 15.00
cache_read = 0.30
input = 3
output = 15
cache_read = 0.3
cache_write = 3.75
[limit]
context = 200_000
@@ -20,4 +21,4 @@ output = 8_192
[modalities]
input = ["text"]
output = ["text"]
output = ["text"]
@@ -10,9 +10,10 @@ structured_output = false
open_weights = false
[cost]
input = 15.00
output = 75.00
cache_read = 1.50
input = 15
output = 75
cache_read = 1.5
cache_write = 18.75
[limit]
context = 200_000
@@ -20,4 +21,4 @@ output = 4_096
[modalities]
input = ["text", "image"]
output = ["text"]
output = ["text"]
@@ -1,7 +0,0 @@
base_model = "anthropic/claude-opus-4-20250514"
[cost]
input = 15
output = 75
cache_read = 1.5
cache_write = 18.75
@@ -1,7 +0,0 @@
base_model = "anthropic/claude-sonnet-4-20250514"
[cost]
input = 3
output = 15
cache_read = 0.3
cache_write = 3.75
@@ -1,23 +0,0 @@
name = "DeepSeek R1 (0528)"
family = "deepseek"
release_date = "2025-05-28"
last_updated = "2025-05-28"
attachment = false
reasoning = true
temperature = true
tool_call = false
structured_output = false
open_weights = true
status = "beta"
[cost]
input = 0.55
output = 2.19
[limit]
context = 64_000
output = 16_384
[modalities]
input = ["text"]
output = ["text"]
@@ -12,7 +12,7 @@ open_weights = true
[cost]
input = 0.56
output = 1.68
cache_read = 0.07
cache_read = 0.112
[limit]
context = 128_000
@@ -12,7 +12,7 @@ open_weights = true
[cost]
input = 0.28
output = 0.42
cache_read = 0.056
cache_read = 0.028
[limit]
context = 163_840
@@ -7,3 +7,6 @@ field = "reasoning_content"
input = 0.14
output = 0.28
cache_read = 0.0028
[limit]
context = 1_050_000
@@ -7,3 +7,6 @@ field = "reasoning_content"
input = 0.435
output = 0.87
cache_read = 0.003625
[limit]
context = 1_050_000
@@ -4,3 +4,6 @@ status = "deprecated"
[cost]
input = 0.1
output = 0.3
[limit]
context = 131_072
@@ -0,0 +1,22 @@
name = "Fugu Ultra"
release_date = "2026-06-22"
last_updated = "2026-06-22"
attachment = true
reasoning = true
temperature = true
tool_call = true
structured_output = false
open_weights = false
[cost]
input = 5
output = 30
cache_read = 0.5
[limit]
context = 1_000_000
output = 1_000_000
[modalities]
input = ["text", "image"]
output = ["text"]
@@ -1,5 +0,0 @@
base_model = "google/gemini-2.0-flash-lite"
[cost]
input = 0.075
output = 0.3
@@ -1,6 +0,0 @@
base_model = "google/gemini-2.0-flash"
[cost]
input = 0.1
output = 0.4
cache_read = 0.025
@@ -0,0 +1,23 @@
name = "Gemini 2.5 Flash Lite Preview (09-2025)"
family = "gemini"
release_date = "2025-09-25"
last_updated = "2025-09-25"
attachment = true
reasoning = false
temperature = true
tool_call = true
structured_output = true
open_weights = false
[cost]
input = 0.1
output = 0.4
cache_read = 0.01
[limit]
context = 1_048_576
output = 1_048_576
[modalities]
input = ["text", "image"]
output = ["text"]
@@ -4,4 +4,3 @@ base_model = "google/gemini-2.5-flash-lite"
input = 0.1
output = 0.4
cache_read = 0.01
input_audio = 0.3
@@ -4,4 +4,3 @@ base_model = "google/gemini-2.5-flash"
input = 0.3
output = 2.5
cache_read = 0.03
input_audio = 1
@@ -4,4 +4,3 @@ base_model = "google/gemini-3-flash-preview"
input = 0.5
output = 3
cache_read = 0.05
input_audio = 1
@@ -1,7 +0,0 @@
base_model = "google/gemini-3.1-flash-lite-preview"
[cost]
input = 0.25
output = 1.5
cache_read = 0.025
input_audio = 0.5
@@ -4,4 +4,4 @@ base_model = "google/gemini-3.1-flash-lite"
input = 0.25
output = 1.5
cache_read = 0.025
input_audio = 0.5
cache_write = 0.08333
@@ -4,4 +4,4 @@ base_model = "google/gemini-3.5-flash"
input = 1.5
output = 9
cache_read = 0.15
input_audio = 1.5
cache_write = 0.08333
@@ -1,22 +0,0 @@
name = "Gemma 2 27B IT"
family = "gemma"
release_date = "2024-06-27"
last_updated = "2024-06-27"
attachment = false
reasoning = false
temperature = true
tool_call = false
structured_output = false
open_weights = true
[cost]
input = 0.08
output = 0.08
[limit]
context = 8_192
output = 16_384
[modalities]
input = ["text"]
output = ["text"]
@@ -1,22 +0,0 @@
name = "Gemma 3 1B IT"
family = "gemma"
release_date = "2025-03-12"
last_updated = "2025-03-12"
attachment = false
reasoning = false
temperature = true
tool_call = false
structured_output = false
open_weights = true
[cost]
input = 0.08
output = 0.30
[limit]
context = 1_000_000
output = 16_384
[modalities]
input = ["text"]
output = ["text"]
@@ -1,22 +0,0 @@
name = "Gemma 3 27B"
family = "gemma"
release_date = "2025-03-12"
last_updated = "2025-03-12"
attachment = true
reasoning = false
temperature = true
tool_call = false
structured_output = false
open_weights = true
[cost]
input = 0.27
output = 0.27
[limit]
context = 128_000
output = 16_384
[modalities]
input = ["text", "image"]
output = ["text"]
@@ -5,3 +5,6 @@ input = 0.2
output = 1.1
cache_read = 0.03
cache_write = 0
[limit]
context = 131_000
@@ -5,3 +5,6 @@ input = 0
output = 0
cache_read = 0
cache_write = 0
[limit]
context = 128_000
+3
View File
@@ -5,3 +5,6 @@ input = 0.6
output = 2.2
cache_read = 0.11
cache_write = 0
[limit]
context = 131_000
@@ -3,3 +3,7 @@ base_model = "zhipuai/glm-4.5v"
[cost]
input = 0.6
output = 1.8
cache_read = 0.11
[limit]
context = 128_000
@@ -3,3 +3,7 @@ base_model = "zhipuai/glm-4.6v"
[cost]
input = 0.3
output = 0.9
cache_read = 0.05
[limit]
context = 131_072
@@ -0,0 +1,22 @@
name = "GLM-4.7 Flash (Free)"
family = "glm"
release_date = "2025-12-22"
last_updated = "2025-12-22"
attachment = false
reasoning = true
temperature = true
tool_call = true
structured_output = false
open_weights = false
[cost]
input = 0
output = 0
[limit]
context = 200_000
output = 200_000
[modalities]
input = ["text"]
output = ["text"]
@@ -1,7 +1,7 @@
base_model = "zhipuai/glm-4.7-flash"
[cost]
input = 0
output = 0
cache_read = 0
input = 0.06
output = 0.4
cache_read = 0.01
cache_write = 0
+6 -3
View File
@@ -4,7 +4,10 @@ base_model = "zhipuai/glm-5.1"
field = "reasoning_content"
[cost]
input = 6
output = 24
cache_read = 1.3
input = 1.4
output = 4.4
cache_read = 0.26
cache_write = 0
[limit]
context = 204_800
+3
View File
@@ -8,3 +8,6 @@ input = 1
output = 3.2
cache_read = 0.2
cache_write = 0
[limit]
context = 203_000
@@ -4,3 +4,6 @@ base_model = "openai/gpt-4.1-mini"
input = 0.4
output = 1.6
cache_read = 0.1
[limit]
context = 1_000_000
@@ -4,3 +4,6 @@ base_model = "openai/gpt-4.1-nano"
input = 0.1
output = 0.4
cache_read = 0.025
[limit]
context = 1_000_000
+3
View File
@@ -4,3 +4,6 @@ base_model = "openai/gpt-4.1"
input = 2
output = 8
cache_read = 0.5
[limit]
context = 1_000_000
-4
View File
@@ -10,7 +10,3 @@ tier = { type = "context", size = 272_000 }
input = 10
output = 45
cache_read = 1
[experimental.modes.fast]
cost = { input = 12.5, output = 75, cache_read = 1.25 }
provider = { body = { service_tier = "priority" } }
@@ -10,8 +10,8 @@ structured_output = true
open_weights = false
[cost]
input = 0.05
output = 0.25
input = 0.15
output = 0.75
[limit]
context = 131_072
+2 -2
View File
@@ -10,8 +10,8 @@ structured_output = true
open_weights = false
[cost]
input = 0.04
output = 0.15
input = 0.1
output = 0.5
[limit]
context = 131_072
@@ -0,0 +1,23 @@
name = "Grok 4.1 Fast Non-Reasoning"
family = "grok"
release_date = "2025-11-19"
last_updated = "2025-11-19"
attachment = true
reasoning = false
temperature = true
tool_call = true
structured_output = false
open_weights = false
[cost]
input = 0.2
output = 0.5
cache_read = 0.05
[limit]
context = 2_000_000
output = 2_000_000
[modalities]
input = ["text", "image"]
output = ["text"]
@@ -1,8 +1,8 @@
base_model = "xai/grok-4.20-0309-non-reasoning"
[cost]
input = 1.25
output = 2.5
input = 2
output = 6
cache_read = 0.2
[[cost.tiers]]
@@ -10,3 +10,6 @@ tier = { type = "context", size = 200_000 }
input = 2.5
output = 5
cache_read = 0.4
[limit]
context = 2_000_000
@@ -1,9 +1,12 @@
base_model = "xai/grok-4.20-0309-reasoning"
reasoning_options = [{ type = "effort", values = ["low", "medium", "high"] }]
[[reasoning_options]]
type = "effort"
values = ["low", "medium", "high"]
[cost]
input = 1.25
output = 2.5
input = 2
output = 6
cache_read = 0.2
[[cost.tiers]]
@@ -11,3 +14,6 @@ tier = { type = "context", size = 200_000 }
input = 2.5
output = 5
cache_read = 0.4
[limit]
context = 2_000_000
@@ -1,8 +1,8 @@
base_model = "xai/grok-4.20-0309-non-reasoning"
[cost]
input = 1.25
output = 2.5
input = 2
output = 6
cache_read = 0.2
[[cost.tiers]]
@@ -10,3 +10,6 @@ tier = { type = "context", size = 200_000 }
input = 2.5
output = 5
cache_read = 0.4
[limit]
context = 2_000_000
@@ -1,9 +1,12 @@
base_model = "xai/grok-4.20-0309-reasoning"
reasoning_options = [{ type = "effort", values = ["low", "medium", "high"] }]
[[reasoning_options]]
type = "effort"
values = ["low", "medium", "high"]
[cost]
input = 1.25
output = 2.5
input = 2
output = 6
cache_read = 0.2
[[cost.tiers]]
@@ -11,3 +14,6 @@ tier = { type = "context", size = 200_000 }
input = 2.5
output = 5
cache_read = 0.4
[limit]
context = 2_000_000
+5 -2
View File
@@ -1,10 +1,13 @@
base_model = "xai/grok-4.3"
reasoning_options = [{ type = "effort", values = ["low", "medium", "high"] }]
[[reasoning_options]]
type = "effort"
values = ["low", "medium", "high"]
[cost]
input = 1.25
output = 2.5
cache_read = 0.2
cache_read = 0.3125
[[cost.tiers]]
tier = { type = "context", size = 200_000 }
@@ -1,24 +0,0 @@
name = "Grok 4 Fast Reasoning"
family = "grok"
release_date = "2025-07-09"
last_updated = "2025-07-09"
attachment = true
reasoning = true
reasoning_options = [{ type = "effort", values = ["low", "medium", "high"] }]
temperature = true
tool_call = true
structured_output = true
open_weights = false
[cost]
input = 0.20
output = 0.50
cache_read = 0.05
[limit]
context = 2_000_000
output = 30_000
[modalities]
input = ["text", "image"]
output = ["text"]
@@ -1,22 +1,23 @@
name = "Grok 4 (0709)"
name = "Grok 4"
family = "grok"
release_date = "2025-07-09"
last_updated = "2025-07-09"
attachment = false
attachment = true
reasoning = false
temperature = true
tool_call = true
structured_output = true
structured_output = false
open_weights = false
[cost]
input = 3.00
output = 15.00
input = 3
output = 15
cache_read = 0.75
[limit]
context = 256_000
output = 256_000
[modalities]
input = ["text"]
output = ["text"]
input = ["text", "image"]
output = ["text"]
@@ -1,22 +0,0 @@
name = "Hermes 2 Pro Llama 3 8B"
family = "hermes"
release_date = "2024-05-27"
last_updated = "2024-05-27"
attachment = false
reasoning = false
temperature = true
tool_call = false
structured_output = false
open_weights = true
[cost]
input = 0.14
output = 0.14
[limit]
context = 8_192
output = 8_192
[modalities]
input = ["text"]
output = ["text"]
+4 -4
View File
@@ -10,12 +10,12 @@ structured_output = true
open_weights = true
[cost]
input = 0.60
output = 2.50
cache_read = 0.12
input = 1
output = 3
cache_read = 0.5
[limit]
context = 131_072
context = 256_000
output = 16_384
[modalities]
@@ -1,23 +0,0 @@
name = "Llama 3.1 8B Instruct"
family = "llama"
release_date = "2024-07-23"
last_updated = "2024-07-23"
attachment = false
reasoning = false
temperature = true
tool_call = true
structured_output = true
open_weights = true
status = "beta"
[cost]
input = 0.22
output = 0.22
[limit]
context = 128_000
output = 2_048
[modalities]
input = ["text"]
output = ["text"]
@@ -1,23 +1,8 @@
name = "Llama 3.1 Nemotron Ultra 253B"
base_model = "nvidia/llama-3.1-nemotron-ultra-253b"
family = "llama"
release_date = "2025-04-07"
last_updated = "2025-04-07"
attachment = false
reasoning = false
temperature = true
tool_call = false
structured_output = true
open_weights = true
[cost]
input = 0.60
output = 1.80
[limit]
context = 128_000
output = 8_192
[modalities]
input = ["text"]
output = ["text"]
input = 0.6
output = 1.8
@@ -1,5 +1,8 @@
base_model = "meta/llama-3.3-70b-instruct"
[cost]
input = 0
output = 0
input = 0.13
output = 0.4
[limit]
context = 131_072
@@ -14,7 +14,7 @@ input = 0.24
output = 0.97
[limit]
context = 8_192
context = 1_048_576
output = 2_048
[modalities]
@@ -14,7 +14,7 @@ input = 0.17
output = 0.66
[limit]
context = 8_192
context = 131_072
output = 2_048
[modalities]
@@ -1,23 +0,0 @@
name = "Llama 4 Scout"
family = "llama"
release_date = "2025-04-05"
last_updated = "2025-04-05"
attachment = false
reasoning = false
temperature = true
tool_call = true
structured_output = false
open_weights = true
status = "beta"
[cost]
input = 0.18
output = 0.59
[limit]
context = 32_768
output = 16_384
[modalities]
input = ["text"]
output = ["text"]
@@ -1,10 +0,0 @@
base_model = "xiaomi/mimo-v2-flash"
reasoning_options = [{ type = "toggle" }]
[interleaved]
field = "reasoning_content"
[cost]
input = 0.1
output = 0.3
cache_read = 0.01
@@ -8,3 +8,6 @@ field = "reasoning_content"
input = 0.4
output = 2
cache_read = 0.08
[limit]
context = 256_000
+6 -1
View File
@@ -1,5 +1,7 @@
base_model = "xiaomi/mimo-v2-pro"
reasoning_options = [{ type = "toggle" }]
[[reasoning_options]]
type = "toggle"
[interleaved]
field = "reasoning_content"
@@ -14,3 +16,6 @@ tier = { type = "context", size = 256_000 }
input = 2
output = 6
cache_read = 0.4
[limit]
context = 1_000_000
@@ -1,16 +1,21 @@
base_model = "xiaomi/mimo-v2.5-pro"
reasoning_options = [{ type = "toggle" }]
[[reasoning_options]]
type = "toggle"
[interleaved]
field = "reasoning_content"
[cost]
input = 1
output = 3
cache_read = 0.2
input = 0.435
output = 0.87
cache_read = 0.0036
[[cost.tiers]]
tier = { type = "context", size = 256_000 }
input = 2
output = 6
cache_read = 0.4
[limit]
context = 1_000_000
+9 -4
View File
@@ -1,16 +1,21 @@
base_model = "xiaomi/mimo-v2.5"
reasoning_options = [{ type = "toggle" }]
[[reasoning_options]]
type = "toggle"
[interleaved]
field = "reasoning_content"
[cost]
input = 0.4
output = 2
cache_read = 0.08
input = 0.14
output = 0.28
cache_read = 0.0028
[[cost.tiers]]
tier = { type = "context", size = 256_000 }
input = 0.8
output = 4
cache_read = 0.16
[limit]
context = 1_000_000
@@ -1,5 +1,5 @@
base_model = "minimax/MiniMax-M2.1"
[cost]
input = 0.3
output = 1.2
input = 0.27
output = 1.1
@@ -3,5 +3,5 @@ base_model = "minimax/MiniMax-M2.5-highspeed"
[cost]
input = 0.6
output = 2.4
cache_read = 0.06
cache_read = 0.03
cache_write = 0.375
@@ -5,3 +5,6 @@ input = 0.3
output = 1.2
cache_read = 0.03
cache_write = 0.375
[limit]
context = 228_700
+3 -2
View File
@@ -1,5 +1,6 @@
base_model = "minimax/MiniMax-M2"
[cost]
input = 0.3
output = 1.2
input = 0.2
output = 1
cache_read = 0.03
@@ -1,5 +1,8 @@
base_model = "mistral/mistral-large-latest"
[cost]
input = 0.5
output = 1.5
input = 4
output = 12
[limit]
context = 128_000
@@ -1,7 +1,12 @@
base_model = "nvidia/nemotron-3-ultra-550b-a55b"
reasoning_options = [{ type = "toggle" }]
[[reasoning_options]]
type = "toggle"
[cost]
input = 0.5
output = 2.5
cache_read = 0.15
[limit]
context = 262_144
@@ -1,5 +1,5 @@
base_model = "mistral/pixtral-large-latest"
[cost]
input = 2
output = 6
input = 4
output = 12
@@ -3,3 +3,5 @@ base_model = "alibaba/qwen-flash"
[cost]
input = 0.05
output = 0.4
cache_read = 0.01
cache_write = 0.0625
@@ -10,8 +10,8 @@ structured_output = true
open_weights = false
[cost]
input = 0.345
output = 1.377
input = 1.6
output = 6.4
[limit]
context = 32_768
@@ -1,7 +1,5 @@
base_model = "alibaba/qwen-omni-turbo"
[cost]
input = 0.07
output = 0.27
input_audio = 4.44
output_audio = 8.89
input = 0.2
output = 0.8
@@ -10,11 +10,13 @@ structured_output = true
open_weights = false
[cost]
input = 0.115
output = 0.287
input = 0.4
output = 1.2
cache_read = 0.08
cache_write = 0.5
[limit]
context = 131_072
context = 1_000_000
output = 8_192
[modalities]
@@ -4,3 +4,8 @@ base_model = "alibaba/qwen-plus"
input = 0.4
output = 1.2
reasoning = 4
cache_read = 0.08
cache_write = 0.5
[limit]
context = 131_072
@@ -2,4 +2,4 @@ base_model = "alibaba/qwen-vl-plus"
[cost]
input = 0.21
output = 0.63
output = 0.64
@@ -1,5 +1,8 @@
base_model = "alibaba/qwen2-5-vl-72b-instruct"
[cost]
input = 2.8
output = 8.4
input = 0.13
output = 0.4
[limit]
context = 32_768
@@ -1,22 +0,0 @@
name = "Qwen2.5 Coder 7B"
family = "qwen"
release_date = "2024-09-19"
last_updated = "2024-09-19"
attachment = false
reasoning = false
temperature = true
tool_call = false
structured_output = true
open_weights = true
[cost]
input = 0.05
output = 0.05
[limit]
context = 131_072
output = 8_192
[modalities]
input = ["text"]
output = ["text"]
@@ -10,11 +10,11 @@ structured_output = true
open_weights = true
[cost]
input = 0.20
output = 0.80
input = 0.2
output = 0.8
[limit]
context = 131_072
context = 40_960
output = 8_192
[modalities]
@@ -10,11 +10,11 @@ structured_output = true
open_weights = true
[cost]
input = 0.09
output = 0.58
input = 0.2
output = 0.6
[limit]
context = 131_072
context = 262_000
output = 8_192
[modalities]
@@ -10,11 +10,11 @@ structured_output = true
open_weights = true
[cost]
input = 0.20
output = 0.60
input = 0.2
output = 0.6
[limit]
context = 131_072
context = 262_000
output = 8_192
[modalities]
@@ -1,22 +0,0 @@
name = "Qwen3 30B A3B FP8"
family = "qwen"
release_date = "2025-04-28"
last_updated = "2025-04-28"
attachment = false
reasoning = true
temperature = true
tool_call = true
structured_output = true
open_weights = true
[cost]
input = 0.10
output = 0.10
[limit]
context = 131_072
output = 8_192
[modalities]
input = ["text"]
output = ["text"]
@@ -10,11 +10,11 @@ structured_output = true
open_weights = true
[cost]
input = 0.10
output = 0.30
input = 0.1
output = 0.3
[limit]
context = 131_072
context = 262_000
output = 8_192
[modalities]
@@ -1,22 +0,0 @@
name = "Qwen3 30B A3B Thinking (2507)"
family = "qwen"
release_date = "2025-07-08"
last_updated = "2025-07-08"
attachment = false
reasoning = true
temperature = true
tool_call = true
structured_output = true
open_weights = true
[cost]
input = 0.10
output = 0.10
[limit]
context = 131_072
output = 8_192
[modalities]
input = ["text"]
output = ["text"]
@@ -1,22 +0,0 @@
name = "Qwen3 32B FP8"
family = "qwen"
release_date = "2025-04-28"
last_updated = "2025-04-28"
attachment = false
reasoning = true
temperature = true
tool_call = true
structured_output = true
open_weights = true
[cost]
input = 0.10
output = 0.10
[limit]
context = 131_072
output = 8_192
[modalities]
input = ["text"]
output = ["text"]
+5 -2
View File
@@ -1,6 +1,9 @@
base_model = "alibaba/qwen3-32b"
[cost]
input = 0.7
output = 2.8
input = 0.1
output = 0.3
reasoning = 8.4
[limit]
context = 32_768
@@ -14,7 +14,7 @@ input = 0.03
output = 0.03
[limit]
context = 131_072
context = 128_000
output = 8_192
[modalities]
@@ -1,5 +1,8 @@
base_model = "alibaba/qwen3-coder-30b-a3b-instruct"
[cost]
input = 0.45
output = 2.25
input = 0.1
output = 0.3
[limit]
context = 262_000
@@ -1,5 +1,5 @@
base_model = "alibaba/qwen3-coder-480b-a35b-instruct"
[cost]
input = 1.5
output = 7.5
input = 0.4
output = 1.8
@@ -3,3 +3,5 @@ base_model = "alibaba/qwen3-coder-flash"
[cost]
input = 0.3
output = 1.5
cache_read = 0.06
cache_write = 0.375
@@ -12,6 +12,7 @@ open_weights = false
[cost]
input = 0.108
output = 0.675
cache_read = 0.06
[limit]
context = 262_144
@@ -1,5 +1,10 @@
base_model = "alibaba/qwen3-coder-plus"
[cost]
input = 1
output = 5
input = 6
output = 60
cache_read = 1.2
cache_write = 7.5
[limit]
context = 1_000_000
@@ -10,12 +10,13 @@ structured_output = true
open_weights = false
[cost]
input = 0.359
output = 1.434
cache_read = 0.072
input = 1.2
output = 6
cache_read = 0.24
cache_write = 1.5
[limit]
context = 256_000
context = 262_144
output = 32_800
[modalities]
+4 -2
View File
@@ -1,5 +1,7 @@
base_model = "alibaba/qwen3-max"
[cost]
input = 1.2
output = 6
input = 3
output = 15
cache_read = 0.6
cache_write = 3.75
@@ -10,8 +10,8 @@ structured_output = true
open_weights = true
[cost]
input = 0.30
output = 1.50
input = 0.5
output = 2
[limit]
context = 131_072
@@ -10,12 +10,12 @@ structured_output = true
open_weights = false
[cost]
input = 0.022
output = 0.215
cache_read = 0.0044
input = 0.05
output = 0.4
cache_read = 0.01
[limit]
context = 1_000_000
context = 262_144
output = 32_000
[modalities]
@@ -4,3 +4,5 @@ base_model = "alibaba/qwen3-vl-plus"
input = 0.2
output = 1.6
reasoning = 4.8
cache_read = 0.04
cache_write = 0.25
@@ -12,3 +12,6 @@ input = 2
output = 6
cache_read = 0.2
cache_write = 2.5
[limit]
context = 262_144

Some files were not shown because too many files have changed in this diff Show More