Skip to content

Commit 726f1da

Browse files
committed
Switch Pollinations video duration fields to base.DurationS
Replace the int64 video duration limit fields in ImageModel with base.DurationS. The provider returns these values in seconds, so using a dedicated duration type preserves units and avoids manual conversion.
1 parent c8cbb00 commit 726f1da

4 files changed

Lines changed: 94 additions & 24 deletions

File tree

providers/pollinations/client_test.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"slices"
1515
"strings"
1616
"testing"
17+
"time"
1718

1819
"github.com/maruel/genai"
1920
"github.com/maruel/genai/adapters"
@@ -61,7 +62,7 @@ func getClientInner(t *testing.T, opts *providerOptions, fn func(http.RoundTripp
6162

6263
func TestImageModelsResponse(t *testing.T) {
6364
t.Run("metadata fields", func(t *testing.T) {
64-
body := `[{"name":"klein","aliases":["flux-klein"],"category":"image","brand":"Black Forest Labs","pricing":{"currency":"pollen","completionImageTokens":"0.01"},"title":"FLUX.2 Klein 4B","description":"FLUX.2 Klein 4B - Fast image generation and editing","input_modalities":["text","image"],"output_modalities":["image"],"max_reference_images":10,"capabilities":[],"alpha":true,"added_date":1768608000000}]`
65+
body := `[{"name":"klein","aliases":["flux-klein"],"category":"image","brand":"Black Forest Labs","pricing":{"currency":"pollen","completionImageTokens":"0.01"},"title":"FLUX.2 Klein 4B","description":"FLUX.2 Klein 4B - Fast image generation and editing","input_modalities":["text","image"],"output_modalities":["image"],"max_reference_images":10,"capabilities":[],"alpha":true,"added_date":1768608000000,"min_duration":6,"max_duration":120,"default_duration":6,"duration_step":6}]`
6566
var resp pollinations.ImageModelsResponse
6667
dec := json.NewDecoder(strings.NewReader(body))
6768
dec.DisallowUnknownFields()
@@ -74,6 +75,18 @@ func TestImageModelsResponse(t *testing.T) {
7475
if resp[0].AddedDate != 1768608000000 {
7576
t.Fatalf("AddedDate = %d, want 1768608000000", resp[0].AddedDate)
7677
}
78+
if got := resp[0].MaxDuration.AsDuration(); got != 2*time.Minute {
79+
t.Fatalf("MaxDuration = %s, want 2m", got)
80+
}
81+
if got := resp[0].MinDuration.AsDuration(); got != 6*time.Second {
82+
t.Fatalf("MinDuration = %s, want 6s", got)
83+
}
84+
if got := resp[0].DefaultDuration.AsDuration(); got != 6*time.Second {
85+
t.Fatalf("DefaultDuration = %s, want 6s", got)
86+
}
87+
if got := resp[0].DurationStep.AsDuration(); got != 6*time.Second {
88+
t.Fatalf("DurationStep = %s, want 6s", got)
89+
}
7790
})
7891
}
7992

providers/pollinations/dto.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -717,11 +717,11 @@ type ImageModel struct {
717717
PricingVariants []PricingVariant `json:"pricing_variants,omitzero"`
718718
Title string `json:"title"`
719719
VideoCapabilities []string `json:"video_capabilities,omitzero"`
720-
// Video generation duration limits, in seconds. Only set on video models.
721-
MaxDuration int64 `json:"max_duration,omitzero"`
722-
MinDuration int64 `json:"min_duration,omitzero"`
723-
DefaultDuration int64 `json:"default_duration,omitzero"`
724-
DurationStep int64 `json:"duration_step,omitzero"`
720+
// Video generation duration limits. Only set on video models.
721+
MaxDuration base.DurationS `json:"max_duration,omitzero"`
722+
MinDuration base.DurationS `json:"min_duration,omitzero"`
723+
DefaultDuration base.DurationS `json:"default_duration,omitzero"`
724+
DurationStep base.DurationS `json:"duration_step,omitzero"`
725725
Pricing struct {
726726
AudioInputPrice base.Float64 `json:"audio_input_price,omitzero"`
727727
AudioOutputPrice base.Float64 `json:"audio_output_price,omitzero"`

providers/pollinations/scoreboard.json

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,38 +73,67 @@
7373
"comments": "Ignored",
7474
"models": [
7575
"Bakhshi7889/gemma-4-31b-it",
76+
"Catniti/agnes-2.0-flash",
7677
"Catniti/agnes-2.5-flash",
7778
"Catniti/agnes-image-2.0-flash",
7879
"Catniti/agnes-image-2.1-flash",
80+
"Catniti/auto-router-1",
81+
"Catniti/claude-sonnet-5",
82+
"Catniti/command-r-plus",
7983
"Catniti/deepseek-v4-flash",
8084
"Catniti/gemma-4-31b",
8185
"Catniti/glm-4.7",
8286
"Catniti/gpt-oss-120b",
87+
"Catniti/kimi-k2.6",
88+
"Catniti/openai-fast",
8389
"Circuit-Overtime/OreoLook",
8490
"CloudCompile/afforda-claude-haiku-4.5",
8591
"CloudCompile/agnes-2.5-flash",
92+
"CloudCompile/agnes-image-2.0-flash",
93+
"JustScriptzz/agnes-2.5-flash",
94+
"JustScriptzz/deepseek-v4-flash-0731",
95+
"JustScriptzz/deepseek-v4-pro-0813",
8696
"JustScriptzz/gemini-3.6-flash",
97+
"JustScriptzz/glm-5.2",
8798
"JustScriptzz/gpt-5-5",
99+
"JustScriptzz/gpt-oss-120b",
100+
"JustScriptzz/grok-4.6",
88101
"JustScriptzz/helix-agent",
89102
"JustScriptzz/kimi-k2.6",
90103
"JustScriptzz/kimi-k2.6-thinking",
104+
"JustScriptzz/lucid-origin",
105+
"JustScriptzz/minimax-m3",
106+
"JustScriptzz/moondream-3.1",
107+
"JustScriptzz/muse-spark-1.2",
108+
"JustScriptzz/phoenix-1.0",
91109
"JustScriptzz/qwen3.7-max",
92110
"JustScriptzz/qwen3.8-max",
93111
"JustScriptzz/qwen3.8-max-preview",
112+
"JustScriptzz/sdxl-lightning",
113+
"Lorodn4x/deepseek-v4-pro-0813",
94114
"Lorodn4x/intern-s2-preview-397b",
115+
"Lorodn4x/minimax-m3",
95116
"MarcosFRG/deepseek-v4-flash",
117+
"MarcosFRG/deepseek-v4-pro",
96118
"MarcosFRG/gemini-2.5-flash-lite",
97119
"MarcosFRG/gemini-3-flash-preview",
98120
"MarcosFRG/gemini-3.1-flash-lite",
99121
"MarcosFRG/gemma-4-26b-a4b",
100122
"MarcosFRG/gemma-4-31b",
123+
"MarcosFRG/glm-4.6v-flash",
101124
"MarcosFRG/glm-5.2",
125+
"MarcosFRG/gpt-5.6-luna",
126+
"MarcosFRG/lucid-origin",
102127
"MarcosFRG/metraxai",
103128
"MarcosFRG/mimo-v2.5",
104129
"MarcosFRG/minimax-m3",
130+
"MarcosFRG/nemotron-3.5-lightning-30b",
131+
"MarcosFRG/qwen3.8-2.4t-a95b",
105132
"MarcosFRG/qwen3.8-27b",
106133
"Minor-fun/deepseek-v3.2",
107134
"Minor-fun/gemma-4-31B-it",
135+
"Spit-fires/flux-schnell",
136+
"Spit-fires/muse-glimmer",
108137
"Takax62/minimax-m3-429b-vml",
109138
"YoannDev90/diffusiongemma-26b-a4b-it:free",
110139
"YoannDev90/laguna-s-2.1:free",
@@ -124,6 +153,7 @@
124153
"chigwell/gemini-3-flash",
125154
"chigwell/gemini-3.1-flash-lite",
126155
"chigwell/gemini-3.5-flash-low",
156+
"chigwell/gemini-3.7-flash",
127157
"chigwell/gpt-5.4",
128158
"chigwell/gpt-5.4-mini",
129159
"chigwell/gpt-5.5",
@@ -154,7 +184,10 @@
154184
"gemini-legacy",
155185
"gemini-search",
156186
"gemma",
187+
"gggff123/Gemini-3.7-Flash",
188+
"gggff123/Glm-5.3",
157189
"gggff123/Inkling",
190+
"gggff123/gpt-5-nano",
158191
"gggff123/step-3.7-flash",
159192
"glm",
160193
"gpt-5.4",
@@ -174,6 +207,8 @@
174207
"grok-large",
175208
"grok-video",
176209
"imagen-4",
210+
"iotserver24/gpt-5-6-sol",
211+
"iotserver24/stealth-code",
177212
"kimi",
178213
"kimi-code",
179214
"kimi-k2-thinking",
@@ -201,6 +236,7 @@
201236
"muse-glimmer",
202237
"nanobanana",
203238
"nanobanana-pro",
239+
"nemotron-3.5-lightning",
204240
"nomnom",
205241
"nova",
206242
"nova-canvas",
@@ -212,6 +248,10 @@
212248
"openai-large",
213249
"openai-reasoning",
214250
"openai-seraphyn",
251+
"pegalink/gemini-3.5-flash-lite",
252+
"pegalink/gemini-3.7-flash-exp",
253+
"pegalink/ox-alpha",
254+
"pegalink/ox-alpha-agent",
215255
"perplexity",
216256
"perplexity-deep",
217257
"perplexity-fast",
@@ -228,6 +268,11 @@
228268
"qwen-vision-pro",
229269
"qwen3.8-2.4t-a95b",
230270
"roblox-rp",
271+
"rodrigookk/claude-fable-5",
272+
"rodrigookk/claude-large",
273+
"rodrigookk/grok-large",
274+
"rodrigookk/laguna",
275+
"rodrigookk/step-flash",
231276
"rtist",
232277
"seedance",
233278
"seedance-pro",
@@ -238,6 +283,7 @@
238283
"sharktide/inferenceport-ai-gemini-2.5-flash",
239284
"sharktide/inferenceport-ai-gpt-4.1",
240285
"sharktide/inferenceport-ai-kimi-k2.7-code",
286+
"sharktide/inferenceport-ai-lightning-image-plus",
241287
"sharktide/inferenceport-ai-lightning-image-turbo",
242288
"sharktide/inferenceport-ai-lightning-text-v2",
243289
"sharktide/inferenceport-ai-lightning-text-v2-expanded-knowledge",
@@ -249,27 +295,38 @@
249295
"solarnode-developement/hy3",
250296
"step-3.5-flash",
251297
"step-flash",
298+
"tomdacatto/FLUX.1-kontext-max",
299+
"tomdacatto/Qwen-Image-2.0-Pro",
300+
"tomdacatto/chatgpt-image-2",
252301
"tomdacatto/ezra",
302+
"tomdacatto/flux-2-max",
253303
"tomdacatto/gemma-4-31b-fast",
254304
"turbo",
255305
"unity",
256306
"vendouple/animagine",
257307
"vendouple/deepseek-v3.2",
258308
"vendouple/deepseek-v4",
309+
"vendouple/deepseek-v4-flash-0731",
310+
"vendouple/deepseek-v4-pro",
259311
"vendouple/flux-2-pro",
260312
"vendouple/gemini-3.6",
261313
"vendouple/gemini-3.7",
262314
"vendouple/gemma-4-31b-sdft-heretic-rp",
263315
"vendouple/glm-5.3",
264316
"vendouple/glm-5.3:s2",
317+
"vendouple/gpt-5.6-luna",
265318
"vendouple/gpt-5.6-terra",
266319
"vendouple/grok-4.6",
320+
"vendouple/grok-imagine",
267321
"vendouple/kimi-k2.6",
268322
"vendouple/kimi-k3",
269323
"vendouple/laguna-s-2.1:free",
324+
"vendouple/lucid-origin",
270325
"vendouple/luma-photon-1",
271326
"vendouple/muse-glimmer-30b:free",
272327
"vendouple/nano-banana-pro",
328+
"vendouple/ox-alpha",
329+
"vendouple/qwen-3.8-max",
273330
"vendouple/qwen3.8-max",
274331
"vendouple/uncensored-image-enhanced",
275332
"vendouple/wai-illustrious-xl",

0 commit comments

Comments
 (0)