diff --git a/packages/client/src/components/hermes/models/ProviderFormModal.vue b/packages/client/src/components/hermes/models/ProviderFormModal.vue index 997cefc..2847ad4 100644 --- a/packages/client/src/components/hermes/models/ProviderFormModal.vue +++ b/packages/client/src/components/hermes/models/ProviderFormModal.vue @@ -42,6 +42,7 @@ const modelOptions = ref>([]) const CODEX_KEY = 'openai-codex' const NOUS_KEY = 'nous' const COPILOT_KEY = 'copilot' +const CLIPROXYAPI_KEY = 'cliproxyapi' const ALIBABA_CODING_KEY = 'alibaba-coding-plan' const ALIBABA_CODING_REGIONS = { intl: 'https://coding-intl.dashscope.aliyuncs.com/v1', @@ -51,6 +52,7 @@ const ALIBABA_CODING_REGIONS = { const isCodex = computed(() => selectedPreset.value === CODEX_KEY) const isNous = computed(() => selectedPreset.value === NOUS_KEY) const isCopilot = computed(() => selectedPreset.value === COPILOT_KEY) +const isCliproxyApi = computed(() => selectedPreset.value === CLIPROXYAPI_KEY) const isAlibabaCoding = computed(() => selectedPreset.value === ALIBABA_CODING_KEY) const alibabaCodingRegion = ref<'intl' | 'cn'>('intl') @@ -171,7 +173,7 @@ async function handleSave() { message.warning(t('models.baseUrlRequired')) return } - if (!formData.value.api_key.trim()) { + if (!formData.value.api_key.trim() && !isCliproxyApi.value) { message.warning(t('models.apiKeyRequired')) return } @@ -344,7 +346,7 @@ function handleClose() { /> - + 0) modelsList = fetched } catch { /* ignore — leave empty, won't show */ } } diff --git a/packages/server/src/controllers/hermes/providers.ts b/packages/server/src/controllers/hermes/providers.ts index f18a57e..c4dd93f 100644 --- a/packages/server/src/controllers/hermes/providers.ts +++ b/packages/server/src/controllers/hermes/providers.ts @@ -5,6 +5,8 @@ import * as hermesCli from '../../services/hermes/hermes-cli' import { readConfigYaml, writeConfigYaml, saveEnvValue, PROVIDER_ENV_MAP } from '../../services/config-helpers' import { logger } from '../../services/logger' +const OPTIONAL_API_KEY_PROVIDERS = new Set(['cliproxyapi']) + function buildProviderEntry(name: string, base_url: string, api_key: string, model: string, context_length?: number) { const entry: any = { name, base_url, api_key, model } if (context_length && context_length > 0) { @@ -20,7 +22,7 @@ export async function create(ctx: any) { if (!name || !base_url || !model) { ctx.status = 400; ctx.body = { error: 'Missing name, base_url, or model' }; return } - if (!api_key) { + if (!api_key && !OPTIONAL_API_KEY_PROVIDERS.has(String(providerKey || ''))) { ctx.status = 400; ctx.body = { error: 'Missing API key' }; return } try { diff --git a/packages/server/src/services/config-helpers.ts b/packages/server/src/services/config-helpers.ts index 9685f8d..87a303b 100644 --- a/packages/server/src/services/config-helpers.ts +++ b/packages/server/src/services/config-helpers.ts @@ -24,6 +24,7 @@ export const PROVIDER_ENV_MAP: Record