From b957aa2461a72b357e494dd018a6a17cecd3e6c6 Mon Sep 17 00:00:00 2001 From: Amaya Date: Mon, 11 May 2026 11:06:59 -0600 Subject: [PATCH 1/2] feat: add input_image/input_video cost params --- README.md | 4 ++++ packages/core/src/schema.ts | 8 ++++++++ packages/web/src/index.css | 10 +++++++--- packages/web/src/index.ts | 2 ++ packages/web/src/render.tsx | 22 ++++++++++++++++++++++ packages/web/src/shared.ts | 6 ++++++ 6 files changed, 49 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index da26c6fdb..3379f6e6b 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,8 @@ cache_read = 0.30 # Cost per million cached read tokens (USD) cache_write = 3.75 # Cost per million cached write tokens (USD) input_audio = 1.00 # Cost per million audio input tokens (USD) output_audio = 10.00 # Cost per million audio output tokens (USD) +input_image = 0.45 # Cost per million image input tokens (USD) +input_video = 12.00 # Cost per million video input tokens (USD) [limit] context = 400_000 # Maximum context window (tokens) @@ -202,6 +204,8 @@ Models must conform to the following schema, as defined in `packages/core/src/sc - `cost.cache_write` _(optional)_: Number — Cost per million cached write tokens (USD) - `cost.input_audio` _(optional)_: Number — Cost per million audio input tokens, if billed separately (USD) - `cost.output_audio` _(optional)_: Number — Cost per million audio output tokens, if billed separately (USD) +- `cost.input_image` _(optional)_: Number — Cost per million image input tokens, if billed separately (USD) +- `cost.input_video` _(optional)_: Number — Cost per million video input tokens, if billed separately (USD) - `limit.context`: Number — Maximum context window (tokens) - `limit.input`: Number — Maximum input tokens - `limit.output`: Number — Maximum output tokens diff --git a/packages/core/src/schema.ts b/packages/core/src/schema.ts index 064782cf3..ee73008e8 100644 --- a/packages/core/src/schema.ts +++ b/packages/core/src/schema.ts @@ -45,6 +45,14 @@ const Cost = z .number() .min(0, "Audio output price cannot be negative") .optional(), + input_image: z + .number() + .min(0, "Image input price cannot be negative") + .optional(), + input_video: z + .number() + .min(0, "Video input price cannot be negative") + .optional(), }); const CostTier = Cost.extend({ diff --git a/packages/web/src/index.css b/packages/web/src/index.css index 3dd25505e..f5a3b0316 100644 --- a/packages/web/src/index.css +++ b/packages/web/src/index.css @@ -294,13 +294,15 @@ tbody { td:nth-child(13), td:nth-child(14), td:nth-child(15), - td:nth-child(16) { + td:nth-child(16), + td:nth-child(17), + td:nth-child(18) { color: var(--color-text); } td:nth-child(5), td:nth-child(6), - td:nth-child(18) { + td:nth-child(24) { font-size: 0.8125rem; font-family: var(--font-mono); text-transform: uppercase; @@ -316,7 +318,9 @@ tbody { td:nth-child(14), td:nth-child(15), td:nth-child(16), - td:nth-child(17) { + td:nth-child(17), + td:nth-child(18), + td:nth-child(19) { font-size: 0.8125rem; font-family: var(--font-mono); } diff --git a/packages/web/src/index.ts b/packages/web/src/index.ts index 29beab273..fbe5d0d85 100644 --- a/packages/web/src/index.ts +++ b/packages/web/src/index.ts @@ -145,6 +145,8 @@ function prepareRow(row: TableRow): VirtualizedRow { row.cacheWriteCost, row.audioInputCost, row.audioOutputCost, + row.imageInputCost, + row.videoInputCost, row.contextLimit, row.inputLimit, row.outputLimit, diff --git a/packages/web/src/render.tsx b/packages/web/src/render.tsx index cd0106f08..42bc76cad 100644 --- a/packages/web/src/render.tsx +++ b/packages/web/src/render.tsx @@ -90,6 +90,8 @@ export const TableRows: TableRow[] = Object.entries(Providers) cacheWriteCost: model.cost?.cache_write, audioInputCost: model.cost?.input_audio, audioOutputCost: model.cost?.output_audio, + imageInputCost: model.cost?.input_image, + videoInputCost: model.cost?.input_video, contextLimit: model.limit.context, inputLimit: model.limit.input, outputLimit: model.limit.output, @@ -239,6 +241,26 @@ export const Rendered = renderToString( + +
+ + Image Input Cost +
+ per 1M tokens +
+ +
+ + +
+ + Video Input Cost +
+ per 1M tokens +
+ +
+ Context Limit diff --git a/packages/web/src/shared.ts b/packages/web/src/shared.ts index 153705937..ad2fd8778 100644 --- a/packages/web/src/shared.ts +++ b/packages/web/src/shared.ts @@ -16,6 +16,8 @@ export interface TableRow { cacheWriteCost?: number; audioInputCost?: number; audioOutputCost?: number; + imageInputCost?: number; + videoInputCost?: number; contextLimit: number; inputLimit?: number; outputLimit: number; @@ -121,6 +123,8 @@ export function renderRow(row: TableRow, index: number) { ${formatCost(row.cacheWriteCost)} ${formatCost(row.audioInputCost)} ${formatCost(row.audioOutputCost)} + ${formatCost(row.imageInputCost)} + ${formatCost(row.videoInputCost)} ${formatNumber(row.contextLimit)} ${formatNumber(row.inputLimit)} ${formatNumber(row.outputLimit)} @@ -164,6 +168,8 @@ export function getLargestRow(rows: TableRow[]): TableRow { if (costWider(worst.cacheWriteCost, row.cacheWriteCost)) worst.cacheWriteCost = row.cacheWriteCost; if (costWider(worst.audioInputCost, row.audioInputCost)) worst.audioInputCost = row.audioInputCost; if (costWider(worst.audioOutputCost, row.audioOutputCost)) worst.audioOutputCost = row.audioOutputCost; + if (costWider(worst.imageInputCost, row.imageInputCost)) worst.imageInputCost = row.imageInputCost; + if (costWider(worst.videoInputCost, row.videoInputCost)) worst.videoInputCost = row.videoInputCost; const numWider = (a: number | undefined, b: number | undefined) => b !== undefined && (a === undefined || formatNumber(b).length > formatNumber(a).length); From 7d4620b7fd933e787ea7a2fdeb3fb8ab7a82a47a Mon Sep 17 00:00:00 2001 From: Amaya Date: Mon, 11 May 2026 11:07:17 -0600 Subject: [PATCH 2/2] feat: add gemini-embedding-2 --- .../google/models/gemini-embedding-2.toml | 24 +++++++++++++++++++ .../models/google/gemini-embedding-2.toml | 19 ++------------- 2 files changed, 26 insertions(+), 17 deletions(-) create mode 100644 providers/google/models/gemini-embedding-2.toml diff --git a/providers/google/models/gemini-embedding-2.toml b/providers/google/models/gemini-embedding-2.toml new file mode 100644 index 000000000..ce7d95488 --- /dev/null +++ b/providers/google/models/gemini-embedding-2.toml @@ -0,0 +1,24 @@ +name = "Gemini Embedding 2" +family = "gemini" +release_date = "2026-04-22" +last_updated = "2026-04-22" +attachment = true +reasoning = false +temperature = false +tool_call = false +open_weights = false + +[cost] +input = 0.20 +output = 0.00 +input_audio = 6.50 +input_image = 0.45 +input_video = 12.00 + +[limit] +context = 8_192 +output = 3_072 + +[modalities] +input = ["text", "image", "video", "audio", "pdf"] +output = ["text"] diff --git a/providers/vercel/models/google/gemini-embedding-2.toml b/providers/vercel/models/google/gemini-embedding-2.toml index 7d0b3b9bf..abf77fd5a 100644 --- a/providers/vercel/models/google/gemini-embedding-2.toml +++ b/providers/vercel/models/google/gemini-embedding-2.toml @@ -1,17 +1,2 @@ -name = "Gemini Embedding 2" -family = "gemini-embedding" -attachment = false -reasoning = false -tool_call = false -temperature = true -release_date = "2026-03-10" -last_updated = "2026-03-23" -open_weights = false - -[limit] -context = 0 -output = 0 - -[modalities] -input = ["text"] -output = ["text"] +[extends] +from = "google/gemini-embedding-2"