Q85: custom endpoints accept local HTTP servers and keyless access
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
9599d0aecd
commit
da0b94ce59
11 files changed
+90
-17
No files matched your search
@@ -384,8 +384,9 @@ function validateProvider(draft: Draft, providers: ProviderCatalogEntry[]): stri
|
||||
const selected = providers.find((entry) => entry.key === draft.providerKey);
|
||||
if (!selected) return t("Provider is no longer available.");
|
||||
if (selected.customEndpoint && !draft.providerBaseUrl.trim()) return t("Base URL is required.");
|
||||
if (!draft.providerSecret.trim()) {
|
||||
return selected.authType === "api_key" || selected.customEndpoint ? t("API key is required.") : t("Access token is required.");
|
||||
// A custom endpoint may be a local server that takes no key.
|
||||
if (!draft.providerSecret.trim() && !selected.customEndpoint) {
|
||||
return selected.authType === "api_key" ? t("API key is required.") : t("Access token is required.");
|
||||
}
|
||||
if (!draft.providerModel.trim()) return t("Model is required.");
|
||||
return null;
|
||||
|
||||
@@ -78,7 +78,7 @@ function ProviderCredentialFields({
|
||||
const hasCredential = isOAuthLike
|
||||
? Boolean(draft.providerSecret.trim())
|
||||
: isCustom
|
||||
? Boolean(draft.providerBaseUrl.trim() && draft.providerSecret.trim())
|
||||
? Boolean(draft.providerBaseUrl.trim())
|
||||
: Boolean(draft.providerSecret.trim());
|
||||
|
||||
const loadModels = async (secret: string) => {
|
||||
@@ -133,7 +133,7 @@ function ProviderCredentialFields({
|
||||
onChange={(event) => onChange({ providerBaseUrl: event.target.value })}
|
||||
/>
|
||||
</Field>
|
||||
<Field label={t("API key")}>
|
||||
<Field label={t("API key (if the server asks for one)")}>
|
||||
<input
|
||||
className="input"
|
||||
type="password"
|
||||
|
||||
@@ -32,6 +32,7 @@ export const zh: Record<string, string> = {
|
||||
"superseded": "已被取代",
|
||||
"stalled": "已停滞",
|
||||
"Resume": "恢复",
|
||||
"API key (if the server asks for one)": "API 密钥(服务需要时填写)",
|
||||
"Checking...": "检查中...",
|
||||
"Check for agent work": "检查能否胜任 Agent 工作",
|
||||
"This model follows instructions and calls tools.": "该模型能遵循指令并调用工具。",
|
||||
|
||||
@@ -88,7 +88,7 @@ function CompatFieldsForm({ entry, provider }: { entry: ProviderCatalogEntry; pr
|
||||
onChange={(event) => setBaseUrl(event.target.value)}
|
||||
/>
|
||||
</Field>
|
||||
<Field label={t("API key")}><input className="input" name="secret" type="password" required /></Field>
|
||||
<Field label={t("API key (if the server asks for one)")}><input className="input" name="secret" type="password" /></Field>
|
||||
<ModelPicker entry={entry} provider={provider} />
|
||||
</>
|
||||
);
|
||||
|
||||
Reference in new issue
Block a user