mirror of
https://github.com/tiennm99/ccs.git
synced 2026-10-12 22:14:22 +00:00
feat: add Requesty as an OpenAI-compatible provider (#1604)
Add a Requesty provider preset to the provider preset catalog, mirroring the existing OpenRouter preset (base https://router.requesty.ai/v1, default model openai/gpt-4o-mini, OpenAI-compatible).
This commit is contained in:
1 parent
ba0e768fbf
commit
a167f94e1b
3 files changed
+77
-6
No files matched your search
@@ -220,13 +220,13 @@
|
|||||||
"src/shared/claude-extension-setup.ts:247",
|
"src/shared/claude-extension-setup.ts:247",
|
||||||
"src/shared/claude-extension-setup.ts:257",
|
"src/shared/claude-extension-setup.ts:257",
|
||||||
"src/shared/claude-extension-setup.ts:317",
|
"src/shared/claude-extension-setup.ts:317",
|
||||||
"src/shared/provider-preset-catalog.ts:325",
|
"src/shared/provider-preset-catalog.ts:339",
|
||||||
"src/shared/provider-preset-catalog.ts:328",
|
"src/shared/provider-preset-catalog.ts:342",
|
||||||
"src/shared/provider-preset-catalog.ts:337",
|
|
||||||
"src/shared/provider-preset-catalog.ts:340",
|
|
||||||
"src/shared/provider-preset-catalog.ts:343",
|
|
||||||
"src/shared/provider-preset-catalog.ts:348",
|
|
||||||
"src/shared/provider-preset-catalog.ts:351",
|
"src/shared/provider-preset-catalog.ts:351",
|
||||||
|
"src/shared/provider-preset-catalog.ts:354",
|
||||||
|
"src/shared/provider-preset-catalog.ts:357",
|
||||||
|
"src/shared/provider-preset-catalog.ts:362",
|
||||||
|
"src/shared/provider-preset-catalog.ts:365",
|
||||||
"src/shared/toml-object.ts:23",
|
"src/shared/toml-object.ts:23",
|
||||||
"src/targets/codex-adapter.ts:103",
|
"src/targets/codex-adapter.ts:103",
|
||||||
"src/targets/codex-adapter.ts:275",
|
"src/targets/codex-adapter.ts:275",
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ export const PROVIDER_PRESET_IDS = [
|
|||||||
'ollama-cloud',
|
'ollama-cloud',
|
||||||
'novita',
|
'novita',
|
||||||
'fireworks',
|
'fireworks',
|
||||||
|
'requesty',
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
export type ProviderPresetId = (typeof PROVIDER_PRESET_IDS)[number];
|
export type ProviderPresetId = (typeof PROVIDER_PRESET_IDS)[number];
|
||||||
@@ -297,6 +298,19 @@ const RAW_PROVIDER_PRESET_DEFINITIONS: readonly ProviderPresetDefinition[] = [
|
|||||||
requiresApiKey: true,
|
requiresApiKey: true,
|
||||||
badge: 'Anthropic-compatible',
|
badge: 'Anthropic-compatible',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: 'requesty',
|
||||||
|
name: 'Requesty',
|
||||||
|
description: 'OpenAI-compatible LLM gateway (provider/model naming, e.g. openai/gpt-4o-mini)',
|
||||||
|
baseUrl: 'https://router.requesty.ai/v1',
|
||||||
|
defaultProfileName: 'requesty',
|
||||||
|
defaultModel: 'openai/gpt-4o-mini',
|
||||||
|
apiKeyPlaceholder: 'rqsty-sk-...',
|
||||||
|
apiKeyHint: 'Create an API key at app.requesty.ai/api-keys',
|
||||||
|
category: 'alternative',
|
||||||
|
requiresApiKey: true,
|
||||||
|
badge: 'OpenAI-compatible',
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
function clonePresetDefinition(preset: ProviderPresetDefinition): ProviderPresetDefinition {
|
function clonePresetDefinition(preset: ProviderPresetDefinition): ProviderPresetDefinition {
|
||||||
|
|||||||
@@ -0,0 +1,57 @@
|
|||||||
|
import { describe, expect, it } from 'bun:test';
|
||||||
|
import { getPresetById, isValidPresetId } from '../../../src/api/services/provider-presets';
|
||||||
|
import { PROVIDER_PRESET_IDS } from '../../../src/shared/provider-preset-catalog';
|
||||||
|
|
||||||
|
describe('provider-presets-requesty', () => {
|
||||||
|
it('resolves requesty preset id', () => {
|
||||||
|
const preset = getPresetById('requesty');
|
||||||
|
expect(preset?.id).toBe('requesty');
|
||||||
|
expect(preset?.baseUrl).toBe('https://router.requesty.ai/v1');
|
||||||
|
expect(preset?.defaultProfileName).toBe('requesty');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('registers requesty in PROVIDER_PRESET_IDS', () => {
|
||||||
|
expect(PROVIDER_PRESET_IDS).toContain('requesty');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('uses the OpenAI-compatible base URL with a /v1 suffix', () => {
|
||||||
|
const preset = getPresetById('requesty');
|
||||||
|
expect(preset?.baseUrl).toBe('https://router.requesty.ai/v1');
|
||||||
|
expect(preset?.baseUrl.endsWith('/v1')).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('pins a provider/model default (openai/gpt-4o-mini)', () => {
|
||||||
|
const preset = getPresetById('requesty');
|
||||||
|
expect(preset?.defaultModel).toBe('openai/gpt-4o-mini');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('validates requesty preset requires an API key', () => {
|
||||||
|
const preset = getPresetById('requesty');
|
||||||
|
expect(preset?.requiresApiKey).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('is a plain (non-featured) alternative provider', () => {
|
||||||
|
const preset = getPresetById('requesty');
|
||||||
|
expect(preset?.category).toBe('alternative');
|
||||||
|
expect(preset?.featured).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('treats requesty as a valid preset id', () => {
|
||||||
|
expect(isValidPresetId('requesty')).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('handles whitespace in requesty preset id', () => {
|
||||||
|
const preset = getPresetById(' requesty ');
|
||||||
|
expect(preset?.id).toBe('requesty');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('handles uppercase requesty preset id', () => {
|
||||||
|
const preset = getPresetById('REQUESTY');
|
||||||
|
expect(preset?.id).toBe('requesty');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('does not resolve partial or invalid requesty ids', () => {
|
||||||
|
expect(getPresetById('requesty-invalid')).toBeUndefined();
|
||||||
|
expect(isValidPresetId('requesty-invalid')).toBe(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in new issue
Block a user