Skip to content

v1.3.0 — Provider Icon Sync, Audio & Image Output, 340+ Models

Choose a tag to compare

@sena-labs sena-labs released this 07 May 18:58
· 99 commits to main since this release
42b0582

What's new in v1.3.0

✨ New features

Provider icon sync
Provider logos (OpenAI, Anthropic, Google, Meta, Mistral, DeepSeek, Cohere, Perplexity, Qwen, Microsoft, Fireworks, Moonshot, Amazon) are now written directly into Open WebUI's model database on startup. Icons appear in the model selector without any manual configuration and survive cache refreshes. Five bugs that silently prevented icons from ever appearing after the first load have been fixed.

Audio output support
Models that return audio (e.g. openai/gpt-4o-audio-preview) now surface their transcript as readable text in both streaming and non-streaming mode. Previously these responses produced an empty reply.

Image output support
Models that generate images (e.g. google/gemini-2.5-flash-image-preview) embed the result as a markdown image directly in the chat. URLs are validated — only http:// and https:// schemes are rendered; invalid URLs are silently dropped.

Token usage & cost display
Non-streaming responses append a compact footer — Tokens: 312 in / 84 out · Cost: $0.0004 — when OpenRouter includes usage data. Useful for tracking spend per message without leaving Open WebUI.


🔧 Also in this release (carried from v1.2.0, now officially tagged)

  • Connection pooling via requests.Session — better throughput for multi-turn conversations
  • Model list caching with 5-minute TTL and automatic invalidation when valves change
  • Exponential backoff with jitter on transient network errors (min(2^n + rand, 30s))
  • Fallback model deduplication — silently removes duplicate IDs from FALLBACK_MODELS
  • Base URL validation — Pydantic rejects non-HTTP(S) schemes at save time
  • "error" model guard — selecting the error pseudo-model returns a clear message instead of hitting the API
  • Empty message guard — returns a clear error instead of sending an empty payload
  • Fallback attribution — non-stream replies show Responded by: model-id when a fallback handled the request
  • HTTP 502 auth detection — Clerk 502 errors (malformed API key) caught at model-list time

🐛 Bug fixes

  • _sync_model_icons(): wrong skip condition caused all icons to be silently skipped (any existing icon, including the OWUI default SVG, blocked the update)
  • _sync_model_icons(): race condition — icons written before pipes() returned were overwritten by OWUI's default; now also syncs on cache-hit paths until all icons are confirmed
  • _sync_model_icons(): DB errors no longer mark a model as permanently synced, allowing retry on next request
  • _sync_model_icons(): update_model_by_id no longer clobbers user-set temperature / system prompt with an empty ModelParams()
  • _sync_model_icons(): function_id cached once at __init__ instead of recomputed on every call
  • Streaming "done" status event now emitted correctly (async generator replaces sync generator that could not await)
  • pipes(): response.close() guaranteed in all code paths via finally block
  • Image markdown: invalid URL schemes dropped silently instead of producing broken ![]() tags
  • Payload deep-copy prevents mutation when ENABLE_CACHE_CONTROL is active
  • IndexError on stream chunks with empty choices array
  • Stream error handler caches response body before closing connection

📦 Install / upgrade

Open WebUI Community hub — search OpenRouter Pipe and click Update.

Manual — replace the pipe content in Admin Panel → Functions with the latest openrouter_pipe.py.

From source
```bash
git pull origin main
python test_pipe.py # 431/431 ✓
```

No valve changes required — all new features activate automatically or via existing valves (SYNC_PROVIDER_ICONS to control icon sync, default: enabled).


✅ Compatibility

Requirement Minimum
Open WebUI 0.4.0
Python 3.10
requests 2.20
pydantic 2.0

Full changelog: v1.1.0 → v1.3.0