feat(models): refresh qianwenai lineup, add flash-0731 and gpt-5.6-luna, default to flash (#160)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Yaowei Zheng
2026-08-03 15:51:37 +08:00
committed by GitHub
parent c76a2c61bb
commit f3193ae628
17 changed files with 169 additions and 150 deletions
+95 -81
View File
@@ -219,32 +219,27 @@ export const MODEL_CATALOG: ModelCatalogEntry[] = [
pricing: cny(0.025, 3, 6),
supportsVision: false,
},
// -- OpenRouter (gateway: OpenAI-compatible protocol, preset base URL). Entries added
// 2026-07-20 list no cache pricing on their OpenRouter pages, so cache_read carries the
// standard input price; the :free tier and the openrouter/free Free Models Router store a
// genuine $0 price (not "unknown"), so costs correctly compute to 0. GPT models are
// uniformly vision-capable (OpenAI product-line policy) even where the gateway page omits
// the modality.
// Two cache_read conventions coexist in this block: rows whose upstream publishes a
// cache-hit price store that real price (the google/gemini-3.6-flash and
// google/gemini-3.5-flash-lite entries below), while the 2026-07-20 rows still repeat the
// input price. Several of those older rows do have a published cache price upstream and
// should be re-read in one pass; until then treat their cache_read as an upper bound. --
// -- OpenRouter (gateway: OpenAI-compatible protocol, preset base URL). Prices re-read in
// one pass on 2026-08-03 from the models API (/api/v1/models): cache_read stores the
// published input_cache_read (falling back to the input price for the few rows without
// one — qwen3.6-35b-a3b and the :free rows); cache_write stores input_cache_write only
// when it is a genuine per-token write premium (the Anthropic and GPT rows, 1.25x input) —
// Gemini's field is an hourly cache-STORAGE rate, not a per-token price, so those rows
// keep the input price — and otherwise also carries the input price. The :free tier and
// the openrouter/free Free Models Router store a genuine $0 price (not "unknown"), so
// costs correctly compute to 0. GPT models are uniformly vision-capable (OpenAI
// product-line policy) even where the gateway page omits the modality. --
{
modelId: "anthropic/claude-fable-5",
displayName: "Claude Fable 5",
provider: "openrouter",
contextWindow: 1000000,
pricing: usd(10, 10, 50),
pricing: usd(1, 12.5, 50),
supportsVision: true,
clientType: "openai",
baseUrl: OPENROUTER_BASE_URL,
},
{
// Upstream publishes full cache pricing for this row (2026-07-24, per the OpenRouter
// models API: $0.50/mtok cache hit, $6.25 cache write = 1.25 x input, $5 input, $25
// output), so cache_read stores the real discounted price — same convention as the
// Gemini rows below — instead of repeating the input price.
modelId: "anthropic/claude-opus-5",
displayName: "Claude Opus 5",
provider: "openrouter",
@@ -259,7 +254,7 @@ export const MODEL_CATALOG: ModelCatalogEntry[] = [
displayName: "Claude Opus 4.8",
provider: "openrouter",
contextWindow: 1000000,
pricing: usd(5, 5, 25),
pricing: usd(0.5, 6.25, 25),
supportsVision: true,
clientType: "openai",
baseUrl: OPENROUTER_BASE_URL,
@@ -269,7 +264,7 @@ export const MODEL_CATALOG: ModelCatalogEntry[] = [
displayName: "Claude Opus 4.7",
provider: "openrouter",
contextWindow: 1000000,
pricing: usd(5, 5, 25),
pricing: usd(0.5, 6.25, 25),
supportsVision: true,
clientType: "openai",
baseUrl: OPENROUTER_BASE_URL,
@@ -279,17 +274,27 @@ export const MODEL_CATALOG: ModelCatalogEntry[] = [
displayName: "Claude Sonnet 5",
provider: "openrouter",
contextWindow: 1000000,
pricing: usd(2, 2, 10),
pricing: usd(0.2, 2.5, 10),
supportsVision: true,
clientType: "openai",
baseUrl: OPENROUTER_BASE_URL,
},
{
modelId: "deepseek/deepseek-v4-flash-0731",
displayName: "DeepSeek V4 Flash 0731",
provider: "openrouter",
contextWindow: 1000000,
pricing: usd(0.018, 0.09, 0.18),
supportsVision: false,
clientType: "openai",
baseUrl: OPENROUTER_BASE_URL,
},
{
modelId: "deepseek/deepseek-v4-flash",
displayName: "DeepSeek V4 Flash",
provider: "openrouter",
contextWindow: 1000000,
pricing: usd(0.09, 0.09, 0.18),
pricing: usd(0.028, 0.14, 0.28),
supportsVision: false,
clientType: "openai",
baseUrl: OPENROUTER_BASE_URL,
@@ -299,19 +304,16 @@ export const MODEL_CATALOG: ModelCatalogEntry[] = [
displayName: "DeepSeek V4 Pro",
provider: "openrouter",
contextWindow: 1000000,
pricing: usd(0.435, 0.435, 0.87),
pricing: usd(0.003625, 0.435, 0.87),
supportsVision: false,
clientType: "openai",
baseUrl: OPENROUTER_BASE_URL,
},
{
// Unlike the older OpenRouter entries above, upstream **does** publish a cache-hit price
// for the Gemini rows (2026-07-22: $0.15/mtok here, agreed by the OpenRouter models API
// and AgentHub's own supported-model registry), so cache_read stores the real discounted
// price rather than repeating the input price: cache_read is billed as its own bucket in
// the cost center, and an input-priced cache_read overstates cache-heavy spend 10x.
// cache_write repeats the input price (no separate per-token cache-write fee), matching
// the direct-vendor Gemini rows below.
// cache_read is billed as its own bucket in the cost center, and an input-priced
// cache_read would overstate cache-heavy Gemini spend 10x; cache_write repeats the input
// price (see the block comment — Gemini publishes storage-per-hour, not per-token write),
// matching the direct-vendor Gemini rows below.
modelId: "google/gemini-3.6-flash",
displayName: "Gemini 3.6 Flash",
provider: "openrouter",
@@ -326,7 +328,7 @@ export const MODEL_CATALOG: ModelCatalogEntry[] = [
displayName: "Gemini 3.5 Flash",
provider: "openrouter",
contextWindow: 1048576,
pricing: usd(1.5, 1.5, 9),
pricing: usd(0.15, 1.5, 9),
supportsVision: true,
clientType: "openai",
baseUrl: OPENROUTER_BASE_URL,
@@ -372,7 +374,7 @@ export const MODEL_CATALOG: ModelCatalogEntry[] = [
displayName: "Kimi K3",
provider: "openrouter",
contextWindow: 1000000,
pricing: usd(3, 3, 15),
pricing: usd(0.3, 3, 15),
supportsVision: true,
clientType: "openai",
baseUrl: OPENROUTER_BASE_URL,
@@ -382,7 +384,7 @@ export const MODEL_CATALOG: ModelCatalogEntry[] = [
displayName: "Kimi K2.6",
provider: "openrouter",
contextWindow: 262144,
pricing: usd(0.144, 0.684, 3.42),
pricing: usd(0.2, 0.6, 3.41),
supportsVision: true,
clientType: "openai",
baseUrl: OPENROUTER_BASE_URL,
@@ -397,12 +399,25 @@ export const MODEL_CATALOG: ModelCatalogEntry[] = [
clientType: "openai",
baseUrl: OPENROUTER_BASE_URL,
},
{
// The page shows the $0.10/$0.60 rate under a "50% off" banner; the models API bills the
// same numbers (with real hit/write prices), so this row stores them — re-read when the
// promotion ends.
modelId: "openai/gpt-5.6-luna",
displayName: "GPT-5.6 Luna",
provider: "openrouter",
contextWindow: 1000000,
pricing: usd(0.01, 0.125, 0.6),
supportsVision: true,
clientType: "openai",
baseUrl: OPENROUTER_BASE_URL,
},
{
modelId: "openai/gpt-5.6-sol",
displayName: "GPT-5.6 Sol",
provider: "openrouter",
contextWindow: 1000000,
pricing: usd(5, 5, 30),
pricing: usd(0.5, 6.25, 30),
supportsVision: true,
clientType: "openai",
baseUrl: OPENROUTER_BASE_URL,
@@ -412,7 +427,7 @@ export const MODEL_CATALOG: ModelCatalogEntry[] = [
displayName: "GPT-5.6 Terra",
provider: "openrouter",
contextWindow: 1000000,
pricing: usd(2.5, 2.5, 15),
pricing: usd(0.1, 1.25, 6),
supportsVision: true,
clientType: "openai",
baseUrl: OPENROUTER_BASE_URL,
@@ -422,7 +437,7 @@ export const MODEL_CATALOG: ModelCatalogEntry[] = [
displayName: "GPT-5.5",
provider: "openrouter",
contextWindow: 1000000,
pricing: usd(5, 5, 30),
pricing: usd(0.5, 5, 30),
supportsVision: true,
clientType: "openai",
baseUrl: OPENROUTER_BASE_URL,
@@ -444,19 +459,6 @@ export const MODEL_CATALOG: ModelCatalogEntry[] = [
clientType: "openai",
baseUrl: OPENROUTER_BASE_URL,
},
{
// Poolside's free tier of Laguna M.1, its flagship coding-agent model (agentic coding
// workflows with tool calling and reasoning), text-only; context and $0 pricing per the
// OpenRouter models API (2026-07-24).
modelId: "poolside/laguna-m.1:free",
displayName: "Laguna M.1 (free)",
provider: "openrouter",
contextWindow: 262144,
pricing: usd(0, 0, 0),
supportsVision: false,
clientType: "openai",
baseUrl: OPENROUTER_BASE_URL,
},
{
// Neither the OpenRouter page nor AgentHub's registry publishes a cache price for this
// model, so cache_read repeats the input price (no discount assumed).
@@ -485,7 +487,7 @@ export const MODEL_CATALOG: ModelCatalogEntry[] = [
displayName: "Hy3",
provider: "openrouter",
contextWindow: 262144,
pricing: usd(0.035, 0.14, 0.58),
pricing: usd(0.033, 0.132, 0.528),
supportsVision: false,
clientType: "openai",
baseUrl: OPENROUTER_BASE_URL,
@@ -495,7 +497,7 @@ export const MODEL_CATALOG: ModelCatalogEntry[] = [
displayName: "Grok 4.5",
provider: "openrouter",
contextWindow: 500000,
pricing: usd(2, 2, 6),
pricing: usd(0.3, 2, 6),
supportsVision: true,
clientType: "openai",
baseUrl: OPENROUTER_BASE_URL,
@@ -515,7 +517,7 @@ export const MODEL_CATALOG: ModelCatalogEntry[] = [
displayName: "GLM-5.2",
provider: "openrouter",
contextWindow: 1000000,
pricing: usd(0.93, 0.93, 3),
pricing: usd(0.221, 1.19, 3.74),
supportsVision: false,
clientType: "openai",
baseUrl: OPENROUTER_BASE_URL,
@@ -634,16 +636,17 @@ export const MODEL_CATALOG: ModelCatalogEntry[] = [
clientType: "openai",
baseUrl: SILICONFLOW_BASE_URL,
},
// The three Pro/ and Qwen/ entries below carry no pricing: AgentHub's registry publishes
// none for them, and SiliconFlow's price list sits behind an authenticated API (the public
// /v1/models endpoint returns 401 and the console page is client-rendered). Rather than
// invent a rate, the entries ship unpriced — the same state as qwen3.8-max-preview, so their
// cost reads as 0 until a published price can be filled in.
// The Pro/ and Qwen/ entries below were unpriced until 2026-08-03 (SiliconFlow's price
// list sits behind an authenticated console); prices below are its official CNY list
// prices. GLM-5.1 bills in two input-length tiers ([0, 32k) and [32k, +inf) for hit/input/
// output alike); the catalog stores one number per bucket, so these rows keep the LOWER
// tier — treat its cost as a floor for long-context use.
{
modelId: "Pro/moonshotai/Kimi-K2.6",
displayName: "Kimi K2.6",
provider: "siliconflow",
contextWindow: 262144,
pricing: cny(1.1, 6.5, 27),
supportsVision: true,
clientType: "openai",
baseUrl: SILICONFLOW_BASE_URL,
@@ -653,15 +656,18 @@ export const MODEL_CATALOG: ModelCatalogEntry[] = [
displayName: "GLM-5.1",
provider: "siliconflow",
contextWindow: 200000,
pricing: cny(1.3, 6, 24),
supportsVision: false,
clientType: "openai",
baseUrl: SILICONFLOW_BASE_URL,
},
{
// No cache-hit price on the list, so cache_read carries the input price.
modelId: "Qwen/Qwen3.6-35B-A3B",
displayName: "Qwen 3.6 35B A3B",
provider: "siliconflow",
contextWindow: 262144,
pricing: cny(1.8, 1.8, 10.8),
supportsVision: true,
clientType: "openai",
baseUrl: SILICONFLOW_BASE_URL,
@@ -679,9 +685,18 @@ export const MODEL_CATALOG: ModelCatalogEntry[] = [
// -- Qwen Token Plan (subscription gateway; vision flags per the plan's supported-model
// table). Pricing and context windows from each model's page at
// www.qianwenai.com/models/<id> (official CNY list prices; limited-time promotions such as
// the 20%/50% off discounts are not stored). qwen3.8-max-preview is preview-only with a
// quota-multiplier promotion and publishes no per-token list price nor a context window, so
// it carries no pricing and uses its family's 1M window. --
// the 20%/50% off discounts are not stored). Lineup updated 2026-08-03: qwen3.8-max and
// deepseek-v4-flash-0731 join; qwen3.8-max-preview and qwen3.7-max leave the plan. --
{
modelId: "deepseek-v4-flash-0731",
displayName: "DeepSeek V4 Flash 0731",
provider: "qwen-token-plan",
contextWindow: 1000000,
pricing: cny(0.2, 1, 2),
supportsVision: false,
clientType: "openai",
baseUrl: QWEN_TOKEN_PLAN_BASE_URL,
},
{
modelId: "deepseek-v4-pro",
displayName: "DeepSeek V4 Pro",
@@ -703,24 +718,15 @@ export const MODEL_CATALOG: ModelCatalogEntry[] = [
baseUrl: QWEN_TOKEN_PLAN_BASE_URL,
},
{
modelId: "qwen3.8-max-preview",
displayName: "Qwen 3.8 Max Preview",
modelId: "qwen3.8-max",
displayName: "Qwen 3.8 Max",
provider: "qwen-token-plan",
contextWindow: 1000000,
pricing: cny(1.5, 12, 36),
supportsVision: true,
clientType: "openai",
baseUrl: QWEN_TOKEN_PLAN_BASE_URL,
},
{
modelId: "qwen3.7-max",
displayName: "Qwen 3.7 Max",
provider: "qwen-token-plan",
contextWindow: 1000000,
pricing: cny(2.4, 12, 36),
supportsVision: false,
clientType: "openai",
baseUrl: QWEN_TOKEN_PLAN_BASE_URL,
},
{
modelId: "qwen3.7-plus",
displayName: "Qwen 3.7 Plus",
@@ -733,7 +739,18 @@ export const MODEL_CATALOG: ModelCatalogEntry[] = [
},
// -- Qwen Pay-As-You-Go (DashScope's OpenAI-compatible pay-per-token marketplace; official
// CNY list prices and specs from each model's page at www.qianwenai.com/models/<id> —
// resold third-party models keep their vendor-prefixed upstream ids) --
// resold third-party models keep their upstream ids exactly as the page lists them: kimi/
// and ZHIPU/ carry vendor prefixes, DeepSeek is listed bare) --
{
modelId: "deepseek-v4-flash-0731",
displayName: "DeepSeek V4 Flash 0731",
provider: "qwen-pay-as-you-go",
contextWindow: 1000000,
pricing: cny(0.2, 1, 2),
supportsVision: false,
clientType: "openai",
baseUrl: QWEN_PAYG_BASE_URL,
},
{
modelId: "kimi/kimi-k3",
displayName: "Kimi K3",
@@ -745,12 +762,12 @@ export const MODEL_CATALOG: ModelCatalogEntry[] = [
baseUrl: QWEN_PAYG_BASE_URL,
},
{
modelId: "qwen3.7-max",
displayName: "Qwen 3.7 Max",
modelId: "qwen3.8-max",
displayName: "Qwen 3.8 Max",
provider: "qwen-pay-as-you-go",
contextWindow: 1000000,
pricing: cny(2.4, 12, 36),
supportsVision: false,
pricing: cny(1.5, 12, 36),
supportsVision: true,
clientType: "openai",
baseUrl: QWEN_PAYG_BASE_URL,
},
@@ -1044,16 +1061,13 @@ export function presetModelEntries(): ModelEntry[] {
/**
* The model's own homepage/detail page for the frontend's model-card link. Gateway groups
* have a stable per-model URL pattern (works for user-added ids in those groups too);
* direct-vendor models link to the vendor's model list/docs page; the Token Plan preview
* model has no dedicated page and links to the plan's model overview; custom and
* user-defined groups have no page to vouch for.
* direct-vendor models link to the vendor's model list/docs page; custom and user-defined
* groups have no page to vouch for.
*/
export function modelHomepageUrl(provider: string, modelId: string): string | undefined {
if (provider === "openrouter") return `https://openrouter.ai/${modelId}`;
if (provider === "qwen-token-plan") {
return modelId === "qwen3.8-max-preview"
? providerInfo(provider)?.modelsUrl
: `https://www.qianwenai.com/models/${modelId}`;
return `https://www.qianwenai.com/models/${modelId}`;
}
if (provider === "fireworks") {
// API id "accounts/<owner>/models/<slug>" -> page "app.fireworks.ai/models/<owner>/<slug>";
+1 -1
View File
@@ -133,7 +133,7 @@ export interface ProjectConfig {
*/
export function defaultProjectConfig(): ProjectConfig {
return {
default_model: { provider: "deepseek", model_id: "deepseek-v4-pro" },
default_model: { provider: "deepseek", model_id: "deepseek-v4-flash" },
models: presetModelEntries(),
};
}