Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -1425,6 +1425,12 @@ APP_LOG_TO_FILE=true
# NANOBANANA_POLL_TIMEOUT_MS=120000 # Max wait for job completion (default: 120s)
# NANOBANANA_POLL_INTERVAL_MS=2500 # Poll frequency (default: 2.5s)

# ── Microsoft Designer Web (Image Generation) ──
# Polling config for the microsoft-designer-web submit-then-poll image job.
# Used by: open-sse/handlers/imageGeneration/providers/designerWeb.ts
# DESIGNER_WEB_POLL_TIMEOUT_MS=60000 # Max wait for job completion (default: 60s)
# DESIGNER_WEB_POLL_INTERVAL_MS=2000 # Poll frequency (default: 2s)

# ── AWS Bedrock (Kiro / Audio) ──
# Region used to construct AWS Bedrock endpoints. Used by:
# src/lib/providers/validation.ts and open-sse/handlers/audioSpeech.ts.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- feat(sse): add Microsoft Designer as an unofficial web-session image provider, reverse-engineered submit-then-poll DallE.ashx flow (#6672)
2 changes: 2 additions & 0 deletions docs/reference/ENVIRONMENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -801,6 +801,8 @@ Automatic model pricing data synchronization from external sources.
| `MODEL_CATALOG_INCLUDE_NAMES` | `true` | `src/shared/constants/featureFlagDefinitions.ts` | Include display-friendly `name` fields in `/v1/models` responses. Disable for clients that expect IDs only. |
| `NANOBANANA_POLL_TIMEOUT_MS` | `120000` | `open-sse/handlers/imageGeneration.ts` | Max wait for NanoBanana image generation jobs. |
| `NANOBANANA_POLL_INTERVAL_MS` | `2500` | `open-sse/handlers/imageGeneration.ts` | NanoBanana job polling frequency. |
| `DESIGNER_WEB_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/designerWeb.ts` | Max wait for microsoft-designer-web image generation jobs. |
| `DESIGNER_WEB_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/designerWeb.ts` | microsoft-designer-web job polling frequency. |
| `AWS_REGION` | _(unset)_ | `src/lib/providers/validation.ts`, `open-sse/handlers/audioSpeech.ts` | Region used to construct AWS Bedrock endpoints (Kiro, audio). |
| `AWS_DEFAULT_REGION` | _(unset)_ | `src/lib/providers/validation.ts`, `open-sse/handlers/audioSpeech.ts` | Fallback when `AWS_REGION` is not set. |
| `CLOUDFLARE_ACCOUNT_ID` | _(unset)_ | `open-sse/executors/cloudflare-ai.ts` | Account ID for Cloudflare Workers AI. |
Expand Down
8 changes: 5 additions & 3 deletions docs/reference/PROVIDER_REFERENCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ lastUpdated: 2026-07-17
> Regenerate with: `npm run gen:provider-reference`
> **Last generated:** 2026-07-17

Total providers: **256**. See category breakdown below.
Total providers: **258**. See category breakdown below.

## Categories

Expand Down Expand Up @@ -58,7 +58,7 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each
| `zed` | `zd` | Zed IDE | OAuth | [link](https://zed.dev) | Zed stores LLM provider credentials (OpenAI, Anthropic, Google, Mistral, xAI) in the OS keychain. Use the Import button below to discover and import them automatically. |
| `zed-hosted` | — | Zed Hosted Models | OAuth | [link](https://zed.dev) | Sign in with your Zed account (native-app sign-in). OmniRoute generates a one-time RSA keypair and opens zed.dev to authorize it — on a remote/headless install, copy the resulting 127.0.0.1 callback URL from your browser's address bar and paste it back here. Distinct from the 'Zed IDE' credential-import entry above: this proxies chat completions through Zed's own hosted model aggregator (cloud.zed.dev), fronting Anthropic/OpenAI/Google/xAI models under your Zed plan. |

## Web Cookie Providers (26)
## Web Cookie Providers (27)

| ID | Alias | Name | Tags | Website | Notes |
|----|-------|------|------|---------|-------|
Expand All @@ -77,6 +77,7 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each
| `inner-ai` | `in-ai` | Inner.ai (Subscription) | Web cookie | [link](https://app.innerai.com) | Paste your token cookie and email separated by a space: open DevTools → Application → Cookies → .innerai.com, copy the token value, then append a space and your Inner.ai login email. Example: eyJhbG... user@example.com |
| `kimi-web` | `kimi-web` | Kimi Web (Moonshot AI) | Web cookie | [link](https://www.kimi.com) | Paste your Cookie header from www.kimi.com (must contain kimi-auth=...). Find it via DevTools → Network → request → Cookie. |
| `lmarena` | `lma` | Arena (Free) | Web cookie | [link](https://arena.ai) | Paste the full Cookie header from arena.ai (DevTools → Network → request → Cookie). Include arena-auth-prod-v1.0/.1… and cf_clearance/__cf_bm when present. OmniRoute uses Chrome TLS impersonation; if Arena still 403s, set providerSpecificData.recaptchaV3Token from a live browser session. |
| `microsoft-designer-web` | `msdesigner` | Microsoft Designer (Image Generation) | Web cookie | [link](https://designer.microsoft.com) | Sign in at designer.microsoft.com, then open DevTools → Network, generate an image, and find the request to DallE.ashx?action=GetDallEImagesCogSci. Copy the value of its Authorization: Bearer header (the access_token — no 'Bearer ' prefix). The token is short-lived; this is an unofficial, reverse-engineered integration. |
| `muse-spark-web` | `ms-web` | Muse Spark Web (Meta AI) | Web cookie | [link](https://www.meta.ai) | Paste your ecto_1_sess value or full cookie header from meta.ai |
| `notion-web` | `nw` | Notion AI Web (Unofficial/Experimental) | Web cookie | [link](https://www.notion.so) | Paste your token_v2 cookie value from notion.so (DevTools → Application → Cookies). Optionally append `; space_id=...` and/or `; notion_browser_id=...` if your workspace requires them. |
| `perplexity-web` | `pplx-web` | Perplexity Web (Pro/Max) | Web cookie | [link](https://www.perplexity.ai) | Paste your __Secure-next-auth.session-token cookie value from perplexity.ai |
Expand All @@ -89,7 +90,7 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each
| `zai-web` | `zw` | Z.ai Web (Free) | Web cookie | [link](https://chat.z.ai) | Paste the full Cookie header from chat.z.ai (must include the token=<JWT> cookie) |
| `zenmux-free` | `zmf` | ZenMux Free (Web) | Web cookie | [link](https://zenmux.ai) | Login at zenmux.ai, then export all cookies using EditThisCookie or Cookie-Editor and paste the full Cookie header string here. Refresh every ~30 days. |

## API Key Providers (paid / paid-with-free-credits) (170)
## API Key Providers (paid / paid-with-free-credits) (171)

| ID | Alias | Name | Tags | Website | Notes |
|----|-------|------|------|---------|-------|
Expand Down Expand Up @@ -145,6 +146,7 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each
| `fireworks` | `fireworks` | Fireworks AI | API key | [link](https://fireworks.ai) | $1 free starter credits on signup for API testing |
| `freeaiapikey` | `faik` | FreeAIAPIKey | API key | [link](https://freeaiapikey.com) | — |
| `freemodel-dev` | `fmd` | FreeModel.dev | API key | [link](https://freemodel.dev) | $300 free credits on signup — no credit card required. Access GPT-5.4 and GPT-5.5 (OpenAI's latest flagship models) through an OpenAI-compatible API. |
| `freepik` | `fpk` | Freepik (Mystic) | API key, image | [link](https://freepik.com) | Get API key at freepik.com/developers (Mystic image endpoint) |
| `freetheai` | `fta` | FreeTheAi | API key, aggregator | [link](https://freetheai.xyz) | Join the FreeTheAi Discord to get your free API key. |
| `friendliai` | `friendli` | FriendliAI | API key | [link](https://friendli.ai) | Free tier for serverless inference — no credit card required |
| `galadriel` | `galadriel` | Galadriel | API key | [link](https://galadriel.com) | ⚠️ **DEPRECATED.** api.galadriel.ai no longer resolves (sweep 2026-06-19); the inference API appears discontinued. |
Expand Down
11 changes: 11 additions & 0 deletions open-sse/config/imageRegistry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,17 @@ export const IMAGE_PROVIDERS: Record<string, ImageProviderConfig> = {
supportedSizes: ["1024x1024", "1024x1536", "1536x1024"],
},

"microsoft-designer-web": {
id: "microsoft-designer-web",
alias: "msdesigner",
baseUrl: "https://designerapp.officeapps.live.com/designerapp/DallE.ashx?action=GetDallEImagesCogSci",
authType: "apikey",
authHeader: "bearer",
format: "designer-web",
models: [{ id: "dall-e-3", name: "DALL-E 3 (Microsoft Designer Web)" }],
supportedSizes: ["1024x1024", "1792x1024", "1024x1792"],
},

xai: {
id: "xai",
baseUrl: "https://api.x.ai/v1/images/generations",
Expand Down
43 changes: 43 additions & 0 deletions open-sse/config/providers/registry/kie/models.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/**
* KIE image-provider model catalog — extracted from imageRegistry.ts
* (god-file decomposition, mirrors the lmarena/directModels.ts pattern).
* Pure data literal; imported by imageRegistry.ts. No behavior change.
*/
export const KIE_IMAGE_MODELS = [
{ id: "gpt4o-image", name: "KIE 4o Image" },
{ id: "seedream/4.5-text-to-image", name: "Seedream 4.5", isMarket: true },
{ id: "seedream/4.5-edit", name: "Seedream 4.5 Edit", isMarket: true },
{ id: "seedream/5.0-lite-text-to-image", name: "Seedream 5.0 Lite", isMarket: true },
{ id: "seedream/5.0-lite-image-to-image", name: "Seedream 5.0 Lite I2I", isMarket: true },
{ id: "z-image/4.0-text-to-image", name: "Z-Image v4.0", isMarket: true },
{ id: "z-image/4.5-text-to-image", name: "Z-Image v4.5", isMarket: true },
{ id: "google-imagen/imagen4-fast", name: "Imagen 4 Fast", isMarket: true },
{ id: "google-imagen/imagen4-ultra", name: "Imagen 4 Ultra", isMarket: true },
{ id: "google-imagen/imagen4", name: "Imagen 4", isMarket: true },
{ id: "google-imagen/nano-banana-2", name: "Nano Banana 2", isMarket: true },
{ id: "google-imagen/nano-banana", name: "Nano Banana", isMarket: true },
{ id: "google-imagen/nano-banana-pro", name: "Nano Banana Pro", isMarket: true },
{ id: "google-imagen/nano-banana-edit", name: "Nano Banana Edit", isMarket: true },
{ id: "flux/2-pro-image-to-image", name: "Flux 2 Pro I2I", isMarket: true },
{ id: "flux/2-pro-text-to-image", name: "Flux 2 Pro T2I", isMarket: true },
{ id: "flux/2-image-to-image", name: "Flux 2 I2I", isMarket: true },
{ id: "flux/2-text-to-image", name: "Flux 2 T2I", isMarket: true },
{ id: "flux/kontext", name: "Flux Kontext", isMarket: true },
{ id: "grok-imagine/text-to-image", name: "Grok Imagine T2I", isMarket: true },
{ id: "grok-imagine/image-to-image", name: "Grok Imagine I2I", isMarket: true },
{ id: "gpt/gpt-image-1.5-text-to-image", name: "GPT Image 1.5 T2I", isMarket: true },
{ id: "gpt/gpt-image-1.5-image-to-image", name: "GPT Image 1.5 I2I", isMarket: true },
{ id: "gpt/gpt-image-2-text-to-image", name: "GPT Image 2 T2I", isMarket: true },
{ id: "gpt/gpt-image-2-image-to-image", name: "GPT Image 2 I2I", isMarket: true },
{ id: "ideogram/v3-text-to-image", name: "Ideogram v3", isMarket: true },
{ id: "ideogram/v3-edit", name: "Ideogram v3 Edit", isMarket: true },
{ id: "ideogram/v3-remix", name: "Ideogram v3 Remix", isMarket: true },
{ id: "ideogram/v3-reframe", name: "Ideogram v3 Reframe", isMarket: true },
{ id: "qwen/text-to-image", name: "Qwen T2I", isMarket: true },
{ id: "qwen/image-to-image", name: "Qwen I2I", isMarket: true },
{ id: "qwen/image-edit", name: "Qwen Edit", isMarket: true },
{ id: "qwen2/image-edit", name: "Qwen2 Edit", isMarket: true },
{ id: "qwen2/text-to-image", name: "Qwen2 T2I", isMarket: true },
{ id: "wan/2.7-image", name: "Wan 2.7 Image", isMarket: true },
{ id: "wan/2.7-image-pro", name: "Wan 2.7 Image Pro", isMarket: true },
];
4 changes: 4 additions & 0 deletions open-sse/executors/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import { AdaptaWebExecutor } from "./adapta-web.ts";
import { ClaudeWebWithAutoRefresh } from "./claude-web-with-auto-refresh.ts";
import { CopilotWebExecutor } from "./copilot-web.ts";
import { CopilotM365WebExecutor } from "./copilot-m365-web.ts";
import { MicrosoftDesignerWebExecutor } from "./microsoft-designer-web.ts";
import { VeoAIFreeWebExecutor } from "./veoaifree-web.ts";
import { DuckDuckGoWebExecutor } from "./duckduckgo-web.ts";
import { FeloWebExecutor } from "./felo-web.ts";
Expand Down Expand Up @@ -125,6 +126,8 @@ const executors = {
"copilot-web": new CopilotWebExecutor(),
"copilot-m365-web": new CopilotM365WebExecutor(),
copilot: new CopilotWebExecutor(), // Alias
"microsoft-designer-web": new MicrosoftDesignerWebExecutor(),
msdesigner: new MicrosoftDesignerWebExecutor(), // Alias
"veoaifree-web": new VeoAIFreeWebExecutor(),
"veo-free": new VeoAIFreeWebExecutor(), // Alias
"duckduckgo-web": new DuckDuckGoWebExecutor(),
Expand Down Expand Up @@ -239,6 +242,7 @@ export { DevinCliExecutor } from "./devin-cli.ts";
export { AuggieExecutor } from "./auggie.ts";
export { CopilotWebExecutor } from "./copilot-web.ts";
export { CopilotM365WebExecutor } from "./copilot-m365-web.ts";
export { MicrosoftDesignerWebExecutor } from "./microsoft-designer-web.ts";
export { VeoAIFreeWebExecutor } from "./veoaifree-web.ts";
export { DuckDuckGoWebExecutor } from "./duckduckgo-web.ts";
export { FeloWebExecutor } from "./felo-web.ts";
Expand Down
51 changes: 51 additions & 0 deletions open-sse/executors/microsoft-designer-web.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// MicrosoftDesignerWebExecutor — chat-completions guard for the
// microsoft-designer-web web-cookie provider (#6672).
//
// Microsoft Designer (designerapp.officeapps.live.com/DallE.ashx) is an
// image-generation-only upstream: it has no chat/completions surface at all.
// The real request/response flow lives entirely in the image-generation
// handler (open-sse/handlers/imageGeneration/providers/designerWeb.ts),
// dispatched from open-sse/handlers/imageGeneration.ts by
// providerConfig.format === "designer-web" — NOT through getExecutor().
//
// microsoft-designer-web is still listed in WEB_COOKIE_PROVIDERS (it uses
// the same unofficial, DevTools-sourced bearer-token credential UX and
// subscription-risk notice as the other web-cookie providers — see
// tests/unit/microsoft-designer-web-6672.test.ts). Without a registered
// executor here, getExecutor("microsoft-designer-web") silently falls
// through to DefaultExecutor's `PROVIDERS[provider] || PROVIDERS.openai`
// fallback (open-sse/executors/index.ts:176 comment, #6699) — which would
// send the user's real Designer bearer token to api.openai.com, mislabeled
// as an OpenAI request, if anything ever mis-routes a chat/completions call
// to this provider.
//
// This executor closes that gap cheaply: it never calls the network. Any
// chat/completions attempt against microsoft-designer-web is rejected
// immediately with a clean, sanitized 400 telling the caller to use
// /v1/images/generations instead — satisfying the executor wrapper
// contract (tests/unit/executor-web-cookie-sweep.test.ts) without ever
// forwarding credentials anywhere.
import { BaseExecutor, type ExecuteInput } from "./base.ts";
import { makeExecutorErrorResult } from "../utils/error.ts";

const DESIGNER_WEB_BASE_URL =
"https://designerapp.officeapps.live.com/designerapp/DallE.ashx?action=GetDallEImagesCogSci";

export class MicrosoftDesignerWebExecutor extends BaseExecutor {
constructor() {
super("microsoft-designer-web", { id: "microsoft-designer-web", baseUrl: DESIGNER_WEB_BASE_URL });
}

async execute(_input: ExecuteInput) {
return makeExecutorErrorResult(
400,
"microsoft-designer-web is an image-generation-only provider and does not support " +
"chat completions. Use POST /v1/images/generations with model " +
'"microsoft-designer-web/dall-e-3" instead.',
_input.body,
DESIGNER_WEB_BASE_URL
);
}
}

export default MicrosoftDesignerWebExecutor;
12 changes: 12 additions & 0 deletions open-sse/handlers/imageGeneration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ import {
CHATGPT_WEB_IMAGE_ID_RE,
} from "./imageGeneration/providers/chatgptWeb.ts";
import { handleNvidiaNimImageGeneration } from "./imageGeneration/providers/nvidiaNim.ts";
import { handleDesignerWebImageGeneration } from "./imageGeneration/providers/designerWeb.ts";
import { handleMinimaxImageGeneration } from "./imageGeneration/providers/minimax.ts";


Expand Down Expand Up @@ -462,6 +463,17 @@ export async function handleImageGeneration({
});
}

if (providerConfig.format === "designer-web") {
return handleDesignerWebImageGeneration({
model,
provider,
providerConfig,
body,
credentials,
log,
});
}

if (providerConfig.format === "nanobanana") {
return handleNanoBananaImageGeneration({
model,
Expand Down
Loading