From c495ac608a264a940324ed273be6ad1710ef483a Mon Sep 17 00:00:00 2001 From: Thibault Jaigu Date: Thu, 16 Jul 2026 10:55:36 +0100 Subject: [PATCH] Add Requesty as an OpenAI-compatible LLM provider Mirror the existing OpenRouter provider (lib/llm/core/providers/openrouter.js) for Requesty, an OpenAI-compatible LLM router. Registers a dedicated 'requesty' provider using the repo's existing createOpenAICompatible path with base URL https://router.requesty.ai/v1 and REQUESTY_API_KEY auth. Wires it through the client registry, model provider list, DB seed list, and provider logo map. Signed-off-by: Thibault Jaigu --- constant/model.js | 6 ++++++ lib/db/llm-providers.js | 5 +++++ lib/llm/core/index.js | 2 ++ lib/llm/core/providers/requesty.js | 28 ++++++++++++++++++++++++++++ lib/util/providerLogo.js | 2 ++ public/imgs/providers/requesty.ico | Bin 0 -> 28352 bytes 6 files changed, 43 insertions(+) create mode 100644 lib/llm/core/providers/requesty.js create mode 100644 public/imgs/providers/requesty.ico diff --git a/constant/model.js b/constant/model.js index 67f9187a..f6f77a92 100644 --- a/constant/model.js +++ b/constant/model.js @@ -68,6 +68,12 @@ export const MODEL_PROVIDERS = [ 'microsoft/phi-3-mini-128k-instruct:free' ] }, + { + id: 'requesty', + name: 'Requesty', + defaultEndpoint: 'https://router.requesty.ai/v1', + defaultModels: ['openai/gpt-4o-mini', 'openai/gpt-4o', 'anthropic/claude-sonnet-4-5', 'google/gemini-2.5-flash'] + }, { id: 'alibailian', name: '阿里云百炼', diff --git a/lib/db/llm-providers.js b/lib/db/llm-providers.js index 39719f71..ced09b6c 100644 --- a/lib/db/llm-providers.js +++ b/lib/db/llm-providers.js @@ -59,6 +59,11 @@ export async function getLlmProviders() { name: 'OpenRouter', apiUrl: 'https://openrouter.ai/api/v1/' }, + { + id: 'requesty', + name: 'Requesty', + apiUrl: 'https://router.requesty.ai/v1' + }, { id: 'alibailian', name: '阿里云百炼', diff --git a/lib/llm/core/index.js b/lib/llm/core/index.js index 4495f39a..d436726b 100644 --- a/lib/llm/core/index.js +++ b/lib/llm/core/index.js @@ -10,6 +10,7 @@ const OllamaClient = require('./providers/ollama'); // 导入 OllamaClient const OpenAIClient = require('./providers/openai'); // 导入 OpenAIClient const ZhiPuClient = require('./providers/zhipu'); // 导入 ZhiPuClient const OpenRouterClient = require('./providers/openrouter'); +const RequestyClient = require('./providers/requesty'); const AlibailianClient = require('./providers/alibailian'); // 导入 AlibailianClient const MiniMaxClient = require('./providers/minimax'); // 导入 MiniMaxClient @@ -123,6 +124,7 @@ class LLMClient { deepseek: OpenAIClient, zhipu: ZhiPuClient, openrouter: OpenRouterClient, + requesty: RequestyClient, alibailian: AlibailianClient, minimax: MiniMaxClient }; diff --git a/lib/llm/core/providers/requesty.js b/lib/llm/core/providers/requesty.js new file mode 100644 index 00000000..c2a18412 --- /dev/null +++ b/lib/llm/core/providers/requesty.js @@ -0,0 +1,28 @@ +import { createOpenAICompatible } from '@ai-sdk/openai-compatible'; + +import BaseClient from './base.js'; + +// Requesty is an OpenAI-compatible LLM router (https://requesty.ai). +// Base URL: https://router.requesty.ai/v1 (EU: https://router.eu.requesty.ai/v1) +// Auth: Authorization: Bearer . Models use the provider/model +// naming convention (e.g. openai/gpt-4o-mini), same as OpenRouter. +class RequestyClient extends BaseClient { + constructor(config) { + super(config); + this.requesty = createOpenAICompatible({ + name: 'requesty', + baseURL: this.endpoint, + apiKey: this.apiKey, + headers: { + 'HTTP-Referer': 'https://github.com/ConardLi/easy-dataset', + 'X-Title': 'Easy Dataset' + } + }); + } + + _getModel() { + return this.requesty(this.model); + } +} + +module.exports = RequestyClient; diff --git a/lib/util/providerLogo.js b/lib/util/providerLogo.js index b1f15c60..f641c6f1 100644 --- a/lib/util/providerLogo.js +++ b/lib/util/providerLogo.js @@ -1,5 +1,6 @@ const PROVIDER_LOGO_MAP = { openrouter: '/imgs/providers/openrouter.ico', + requesty: '/imgs/providers/requesty.ico', ollama: '/imgs/providers/ollama.png', openai: '/imgs/providers/openai.png', siliconcloud: '/imgs/providers/siliconflow.ico', @@ -23,6 +24,7 @@ export function normalizeProviderId(providerId = '', providerName = '') { const normalized = raw.replace(/[\s_-]/g, ''); if (normalized === 'openrouter' || normalized === 'openrouterai') return 'openrouter'; + if (normalized === 'requesty' || normalized === 'requestyai') return 'requesty'; if (normalized === 'openai') return 'openai'; if (normalized === 'siliconflow' || normalized === 'siliconcloud') return 'siliconcloud'; if (normalized === 'zhipuai' || normalized === 'zhipu') return 'zhipu'; diff --git a/public/imgs/providers/requesty.ico b/public/imgs/providers/requesty.ico new file mode 100644 index 0000000000000000000000000000000000000000..eac20d8ba946b477efb748f571c8b183a808f085 GIT binary patch literal 28352 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 literal 0 HcmV?d00001