always require upstream url

This commit is contained in:
miloschwartz
2026-08-13 10:07:01 -04:00
parent c35ac493ed
commit 9a551c91e5
5 changed files with 13 additions and 67 deletions
+1 -1
View File
@@ -1777,7 +1777,7 @@
"aiProviderTypeMicrosoftFoundryDescription": "Microsoft Foundry; upstream URL required", "aiProviderTypeMicrosoftFoundryDescription": "Microsoft Foundry; upstream URL required",
"aiProviderTypeOpenRouterDescription": "OpenRouter API", "aiProviderTypeOpenRouterDescription": "OpenRouter API",
"aiProviderTypeVercelAiGatewayDescription": "Vercel AI Gateway", "aiProviderTypeVercelAiGatewayDescription": "Vercel AI Gateway",
"aiProviderTypeCustomDescription": "Bring your own OpenAI-compatible endpoint or route via Pangolin targets", "aiProviderTypeCustomDescription": "Bring your own endpoint or route via site targets",
"aiProviderUpstreamUrl": "Upstream URL", "aiProviderUpstreamUrl": "Upstream URL",
"aiProviderUpstreamUrlDescription": "Base URL for the provider API", "aiProviderUpstreamUrlDescription": "Base URL for the provider API",
"aiProviderUpstreamUrlOptionalDescription": "Leave blank to use the default upstream URL for this provider", "aiProviderUpstreamUrlOptionalDescription": "Leave blank to use the default upstream URL for this provider",
@@ -41,7 +41,6 @@ import {
createAiProviderFormSchema, createAiProviderFormSchema,
showsUpstreamUrlField, showsUpstreamUrlField,
toAiProviderNetworkPayload, toAiProviderNetworkPayload,
upstreamUrlRequired,
type AiProviderFormValues type AiProviderFormValues
} from "@app/lib/aiProviderFormSchema"; } from "@app/lib/aiProviderFormSchema";
import { aiProviderQueries } from "@app/lib/queries"; import { aiProviderQueries } from "@app/lib/queries";
@@ -91,7 +90,6 @@ export default function AiProviderNetworkPage() {
const providerType = form.watch("type"); const providerType = form.watch("type");
const routingMode = form.watch("routingMode"); const routingMode = form.watch("routingMode");
const showUpstream = showsUpstreamUrlField(providerType, routingMode); const showUpstream = showsUpstreamUrlField(providerType, routingMode);
const requireUpstream = upstreamUrlRequired(providerType, routingMode);
const showRoutingMode = providerType === "custom"; const showRoutingMode = providerType === "custom";
const isTargetModeSelected = routingMode === "target"; const isTargetModeSelected = routingMode === "target";
const isTargetModeSaved = const isTargetModeSaved =
@@ -218,22 +216,9 @@ export default function AiProviderNetworkPage() {
field.value ?? field.value ??
"url" "url"
} }
onChange={( onChange={
value field.onChange
) => { }
field.onChange(
value
);
if (
value ===
"target"
) {
form.setValue(
"upstreamUrl",
""
);
}
}}
/> />
</FormControl> </FormControl>
<FormMessage /> <FormMessage />
@@ -284,14 +269,10 @@ export default function AiProviderNetworkPage() {
{t( {t(
"aiProviderUpstreamUrl" "aiProviderUpstreamUrl"
)} )}
{requireUpstream
? ""
: " (optional)"}
</FormLabel> </FormLabel>
<FormControl> <FormControl>
<Input <Input
autoComplete="off" autoComplete="off"
placeholder="https://"
value={ value={
field.value ?? field.value ??
"" ""
@@ -302,13 +283,9 @@ export default function AiProviderNetworkPage() {
/> />
</FormControl> </FormControl>
<FormDescription> <FormDescription>
{requireUpstream {t(
? t( "aiProviderUpstreamUrlDescription"
"aiProviderUpstreamUrlDescription" )}
)
: t(
"aiProviderUpstreamUrlOptionalDescription"
)}
</FormDescription> </FormDescription>
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
@@ -49,7 +49,6 @@ import {
emptyUpstreamForType, emptyUpstreamForType,
showsUpstreamUrlField, showsUpstreamUrlField,
toAiProviderCreatePayload, toAiProviderCreatePayload,
upstreamUrlRequired,
type AiProviderFormValues type AiProviderFormValues
} from "@app/lib/aiProviderFormSchema"; } from "@app/lib/aiProviderFormSchema";
import { zodResolver } from "@hookform/resolvers/zod"; import { zodResolver } from "@hookform/resolvers/zod";
@@ -95,7 +94,6 @@ export default function CreateAiProviderPage() {
const authType = form.watch("authType"); const authType = form.watch("authType");
const showUpstream = showsUpstreamUrlField(providerType, routingMode); const showUpstream = showsUpstreamUrlField(providerType, routingMode);
const requireUpstream = upstreamUrlRequired(providerType, routingMode);
const showRoutingMode = providerType === "custom"; const showRoutingMode = providerType === "custom";
const showTargets = providerType === "custom" && routingMode === "target"; const showTargets = providerType === "custom" && routingMode === "target";
const showApiKey = authTypeRequiresApiKey(authType ?? "bearer"); const showApiKey = authTypeRequiresApiKey(authType ?? "bearer");
@@ -436,14 +434,9 @@ export default function CreateAiProviderPage() {
value value
); );
if ( if (
value === value !==
"target" "target"
) { ) {
form.setValue(
"upstreamUrl",
""
);
} else {
targetsRef.current = targetsRef.current =
[]; [];
} }
@@ -498,14 +491,10 @@ export default function CreateAiProviderPage() {
{t( {t(
"aiProviderUpstreamUrl" "aiProviderUpstreamUrl"
)} )}
{requireUpstream
? ""
: " (optional)"}
</FormLabel> </FormLabel>
<FormControl> <FormControl>
<Input <Input
autoComplete="off" autoComplete="off"
placeholder="https://"
value={ value={
field.value ?? field.value ??
"" ""
@@ -516,13 +505,9 @@ export default function CreateAiProviderPage() {
/> />
</FormControl> </FormControl>
<FormDescription> <FormDescription>
{requireUpstream {t(
? t( "aiProviderUpstreamUrlDescription"
"aiProviderUpstreamUrlDescription" )}
)
: t(
"aiProviderUpstreamUrlOptionalDescription"
)}
</FormDescription> </FormDescription>
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
+2 -7
View File
@@ -85,13 +85,8 @@ export function providerRequiresUpstreamUrl(
type: AiProviderType, type: AiProviderType,
routingMode: AiProviderRoutingMode = "url" routingMode: AiProviderRoutingMode = "url"
): boolean { ): boolean {
if (routingMode === "target") { const mode = type === "custom" ? routingMode : "url";
return false; return mode !== "target";
}
if (type === "custom") {
return true;
}
return AI_PROVIDER_DEFAULTS[type].upstreamUrl === null;
} }
export function defaultsForProviderType( export function defaultsForProviderType(
-11
View File
@@ -148,17 +148,6 @@ export function emptyUpstreamForType(type: AiProviderType): string {
export function showsUpstreamUrlField( export function showsUpstreamUrlField(
type: AiProviderType, type: AiProviderType,
routingMode: "url" | "target" | undefined routingMode: "url" | "target" | undefined
): boolean {
const mode = type === "custom" ? (routingMode ?? "url") : "url";
if (mode === "target") {
return false;
}
return true;
}
export function upstreamUrlRequired(
type: AiProviderType,
routingMode: "url" | "target" | undefined
): boolean { ): boolean {
const mode = type === "custom" ? (routingMode ?? "url") : "url"; const mode = type === "custom" ? (routingMode ?? "url") : "url";
return providerRequiresUpstreamUrl(type, mode); return providerRequiresUpstreamUrl(type, mode);