From b6fdd2b51e1727f29790b323ebc3375c6cb14fcf Mon Sep 17 00:00:00 2001 From: Thibault Jaigu Date: Mon, 28 Sep 2026 15:56:11 +0100 Subject: [PATCH 1/2] feat: add Requesty to the provider catalog Requesty is an OpenAI compatible gateway. Like OpenRouter it ships no built in models and resolves capabilities through the cross provider lookup, reading its key from REQUESTY_API_KEY. --- src/model/catalog/providers.ts | 8 ++++++++ tests/model/config/parseModelConfig.spec.ts | 14 ++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/model/catalog/providers.ts b/src/model/catalog/providers.ts index 426503369..2aeefbcfd 100644 --- a/src/model/catalog/providers.ts +++ b/src/model/catalog/providers.ts @@ -1141,6 +1141,14 @@ export const PROVIDER_CATALOG: ProviderCatalog = { models: {}, }, + requesty: { + displayName: "Requesty", + protocol: "openai", + defaultUrl: "https://router.requesty.ai/v1", + apiKeyEnvVar: "REQUESTY_API_KEY", + models: {}, + }, + ollama: { displayName: "Ollama", protocol: "openai", diff --git a/tests/model/config/parseModelConfig.spec.ts b/tests/model/config/parseModelConfig.spec.ts index ef112cff7..294bcb679 100644 --- a/tests/model/config/parseModelConfig.spec.ts +++ b/tests/model/config/parseModelConfig.spec.ts @@ -263,3 +263,17 @@ test("catalog model aliases keep their declared provider image capability", () = ["text", "image"], ); }); + +test("requesty catalog provider resolves default URL, protocol and env api key", () => { + const config = parseModelConfig({ + providers: { + requesty: { + models: { "openai/gpt-4o-mini": {} }, + }, + }, + }, { env: { REQUESTY_API_KEY: "requesty-env-key" } }); + + assert.equal(config.providers.requesty.url, "https://router.requesty.ai/v1"); + assert.equal(config.providers.requesty.protocol, "openai"); + assert.equal(config.providers.requesty.apiKey, "requesty-env-key"); +}); From a3de1f5d4727882458a5a15d256fdef94b6c0893 Mon Sep 17 00:00:00 2001 From: Thibault Jaigu Date: Mon, 28 Sep 2026 15:56:12 +0100 Subject: [PATCH 2/2] feat(settings): list Requesty in the provider catalog Mirror the OpenRouter entry in the Web UI catalog with a short seed list checked against the live Requesty model list, and accept a Requesty provider without an explicit url like the other catalog providers. --- ui/server/services/pilotdeckConfig.js | 1 + ui/src/shared/catalogProviders.test.ts | 14 ++++++++++++++ ui/src/shared/catalogProviders.ts | 13 +++++++++++++ 3 files changed, 28 insertions(+) diff --git a/ui/server/services/pilotdeckConfig.js b/ui/server/services/pilotdeckConfig.js index e2635e16a..1c41d0818 100644 --- a/ui/server/services/pilotdeckConfig.js +++ b/ui/server/services/pilotdeckConfig.js @@ -52,6 +52,7 @@ const CATALOG_PROVIDER_DEFAULT_URLS = { volc_ark: 'https://ark.cn-beijing.volces.com/api/v3', zhipu: 'https://api.z.ai/api/paas/v4', openrouter: 'https://openrouter.ai/api/v1', + requesty: 'https://router.requesty.ai/v1', ollama: 'http://localhost:11434/v1', }; let configWriteQueue = Promise.resolve(); diff --git a/ui/src/shared/catalogProviders.test.ts b/ui/src/shared/catalogProviders.test.ts index 6c7bacac5..22b7425fd 100644 --- a/ui/src/shared/catalogProviders.test.ts +++ b/ui/src/shared/catalogProviders.test.ts @@ -56,4 +56,18 @@ describe('catalogProviders maxOutputTokens', () => { expect(ollama?.models.find((model) => model.id === 'qwen3:0.6b')?.maxContextTokens).toBe(40_960); expect(ollama?.models.find((model) => model.id === 'llama3.1:8b')?.maxOutputTokens).toBe(8_192); }); + + it('exposes Requesty as an OpenAI-compatible gateway provider', () => { + const requesty = findCatalogProviderById('requesty'); + + expect(requesty?.protocol).toBe('openai'); + expect(requesty?.defaultUrl).toBe('https://router.requesty.ai/v1'); + expect(requesty?.apiKeyEnvVar).toBe('REQUESTY_API_KEY'); + expect(requesty?.models.map((model) => model.id)).toEqual([ + 'anthropic/claude-sonnet-5', + 'openai/gpt-5.4', + 'google/gemini-3.1-pro-preview', + 'deepseek/deepseek-chat', + ]); + }); }); diff --git a/ui/src/shared/catalogProviders.ts b/ui/src/shared/catalogProviders.ts index a1d629fd9..4950f7709 100644 --- a/ui/src/shared/catalogProviders.ts +++ b/ui/src/shared/catalogProviders.ts @@ -148,6 +148,19 @@ export const CATALOG_PROVIDERS: CatalogProvider[] = [ { id: 'moonshotai/kimi-k2.6', displayName: 'Kimi K2.6', supportsImage: true, maxContextTokens: 262144, maxOutputTokens: 8192 }, ], }, + { + id: 'requesty', + displayName: 'Requesty', + protocol: 'openai', + defaultUrl: 'https://router.requesty.ai/v1', + apiKeyEnvVar: 'REQUESTY_API_KEY', + models: [ + { id: 'anthropic/claude-sonnet-5', displayName: 'Claude Sonnet 5', supportsImage: true, maxContextTokens: 1000000, maxOutputTokens: 128000 }, + { id: 'openai/gpt-5.4', displayName: 'GPT-5.4', supportsImage: true, maxContextTokens: 1050000, maxOutputTokens: 128000 }, + { id: 'google/gemini-3.1-pro-preview', displayName: 'Gemini 3.1 Pro Preview', supportsImage: true, maxContextTokens: 1048576, maxOutputTokens: 65535 }, + { id: 'deepseek/deepseek-chat', displayName: 'DeepSeek Chat', maxContextTokens: 1000000, maxOutputTokens: 384000 }, + ], + }, { id: 'ollama', displayName: 'Ollama',