Skip to content

Commit 7c7832e

Browse files
authored
adding openrouter image example (TanStack#350)
1 parent 1e0f993 commit 7c7832e

2 files changed

Lines changed: 31 additions & 11 deletions

File tree

testing/panel/src/routes/api.image.ts

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ import { createFileRoute } from '@tanstack/react-router'
22
import { generateImage, createImageOptions } from '@tanstack/ai'
33
import { geminiImage } from '@tanstack/ai-gemini'
44
import { openaiImage } from '@tanstack/ai-openai'
5+
import { openRouterImage } from '@tanstack/ai-openrouter'
56

6-
type Provider = 'openai' | 'gemini'
7+
type Provider = 'openai' | 'gemini' | 'openrouter'
78

89
export const Route = createFileRoute('/api/image')({
910
server: {
@@ -13,21 +14,28 @@ export const Route = createFileRoute('/api/image')({
1314
const { prompt, numberOfImages = 1, size = '1024x1024' } = body
1415
const data = body.data || {}
1516
const provider: Provider = data.provider || body.provider || 'openai'
16-
const model: string = data.model || body.model || 'gpt-image-1'
17+
18+
const defaultModels: Record<Provider, string> = {
19+
openai: 'gpt-image-1',
20+
gemini: 'gemini-2.0-flash-preview-image-generation',
21+
openrouter: 'google/gemini-3.1-flash-image-preview',
22+
}
23+
const model: string =
24+
data.model || body.model || defaultModels[provider]
1725

1826
try {
19-
// Pre-define typed adapter configurations with full type inference
20-
// Model is passed to the adapter factory function for type-safe autocomplete
2127
const adapterConfig = {
2228
gemini: () =>
2329
createImageOptions({
24-
adapter: geminiImage(
25-
(model || 'gemini-2.0-flash-preview-image-generation') as any,
26-
),
30+
adapter: geminiImage(model as any),
2731
}),
2832
openai: () =>
2933
createImageOptions({
30-
adapter: openaiImage((model || 'gpt-image-1') as any),
34+
adapter: openaiImage(model as any),
35+
}),
36+
openrouter: () =>
37+
createImageOptions({
38+
adapter: openRouterImage(model as any),
3139
}),
3240
}
3341

@@ -46,8 +54,7 @@ export const Route = createFileRoute('/api/image')({
4654
})
4755

4856
console.log(
49-
'>> image generation result:',
50-
JSON.stringify(result, null, 2),
57+
`>> image generation complete: ${result.images.length} image(s)`,
5158
)
5259

5360
return new Response(

testing/panel/src/routes/image.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { useState } from 'react'
22
import { createFileRoute } from '@tanstack/react-router'
33
import { ImageIcon, Loader2, Download } from 'lucide-react'
44

5-
type Provider = 'openai' | 'gemini'
5+
type Provider = 'openai' | 'gemini' | 'openrouter'
66

77
interface ImageProvider {
88
id: Provider
@@ -22,6 +22,19 @@ const PROVIDERS: Array<ImageProvider> = [
2222
// name: 'Gemini (Imagen)',
2323
// sizes: ['1024x1024', '1:1', '16:9', '9:16', '4:3', '3:4'],
2424
// },
25+
{
26+
id: 'openrouter',
27+
name: 'OpenRouter (Gemini 3.1 Flash Image)',
28+
sizes: [
29+
'1024x1024',
30+
'1248x832',
31+
'832x1248',
32+
'1184x864',
33+
'864x1184',
34+
'1344x768',
35+
'768x1344',
36+
],
37+
},
2538
]
2639

2740
interface GeneratedImage {

0 commit comments

Comments
 (0)