fix: expose dynamic provider profiles in backends list

This commit is contained in:
Codex
2026-06-09 00:28:32 +08:00
parent 56761b8e5f
commit c685b749e4
6 changed files with 65 additions and 20 deletions
+29 -9
View File
@@ -1,7 +1,7 @@
import { createHash, randomUUID } from "node:crypto";
import { spawn } from "node:child_process";
import { AgentRunError } from "../common/errors.js";
import { backendProfileSpec, backendProfileSpecs, isBackendProfileSlug } from "../common/backend-profiles.js";
import { backendCapabilities, backendProfileSpec, backendProfileSpecs, compareBackendProfiles, isBackendProfileSlug } from "../common/backend-profiles.js";
import { dsflashGoModelCatalogFile, dsflashGoModelCatalogJson, dsflashGoModelSlug, dsflashGoRuntimeModelCatalogPath } from "../common/model-catalogs.js";
import type { AgentRunStore } from "./store.js";
import type { BackendProfile, ExecutionPolicy, JsonRecord, JsonValue } from "../common/types.js";
@@ -48,6 +48,33 @@ export async function listProviderProfiles(options: ProviderProfileOptions = {})
return { items, count: items.length, valuesPrinted: false };
}
export async function listBackendCapabilities(options: ProviderProfileOptions = {}): Promise<JsonRecord> {
const profiles = new Set<BackendProfile>(backendProfileSpecs.map((spec) => spec.profile));
try {
for (const profile of await listProviderProfileIds(options)) profiles.add(profile);
const dynamicProfiles = [...profiles].filter((profile) => !isBuiltinProviderProfile(profile)).sort(compareBackendProfiles);
return {
items: backendCapabilities([...profiles]),
dynamicProfileDiscovery: {
status: "succeeded",
dynamicProfiles,
dynamicProfileCount: dynamicProfiles.length,
valuesPrinted: false,
},
};
} catch (error) {
return {
items: backendCapabilities([...profiles]),
dynamicProfileDiscovery: {
status: "failed",
failureKind: error instanceof AgentRunError ? error.failureKind : "infra-failed",
message: redactText(error instanceof Error ? error.message : String(error)),
valuesPrinted: false,
},
};
}
}
export async function showProviderProfile(profile: string, options: ProviderProfileOptions = {}): Promise<JsonRecord> {
return providerProfileStatus(validateBackendProfile(profile), options);
}
@@ -328,14 +355,7 @@ async function listProviderProfileIds(options: ProviderProfileOptions): Promise<
}
function compareProviderProfiles(left: string, right: string): number {
const leftIndex = backendProfileSpecs.findIndex((item) => item.profile === left);
const rightIndex = backendProfileSpecs.findIndex((item) => item.profile === right);
if (leftIndex >= 0 || rightIndex >= 0) {
if (leftIndex < 0) return 1;
if (rightIndex < 0) return -1;
if (leftIndex !== rightIndex) return leftIndex - rightIndex;
}
return left.localeCompare(right);
return compareBackendProfiles(left, right);
}
function isBuiltinProviderProfile(profile: BackendProfile): boolean {
+2 -2
View File
@@ -14,7 +14,7 @@ import { runnerJobStatusSummary } from "./runner-job-status.js";
import { createSessionPvc, deleteSessionPvc, getSessionPvcSummary, refreshSessionPvcSummary, runSessionStorageGc } from "./session-pvc.js";
import type { SessionPvcSummary } from "./session-pvc.js";
import type { SessionPvcOptions } from "./session-pvc.js";
import { getProviderProfileConfig, getProviderProfileValidation, listProviderProfiles, removeProviderProfile, setProviderProfileConfig, setProviderProfileCredential, showProviderProfile, validateProviderProfile } from "./provider-profiles.js";
import { getProviderProfileConfig, getProviderProfileValidation, listBackendCapabilities, listProviderProfiles, removeProviderProfile, setProviderProfileConfig, setProviderProfileCredential, showProviderProfile, validateProviderProfile } from "./provider-profiles.js";
function pvcOptions(defaults: { kubectlCommand?: string } | undefined): SessionPvcOptions {
return defaults?.kubectlCommand ? { kubectlCommand: defaults.kubectlCommand } : {};
@@ -92,7 +92,7 @@ async function route({ method, url, body, store, sourceCommit, runnerJobDefaults
const ready = path === "/health/live" ? true : database.ready;
return { serviceId: "agentrun-mgr", live: true, ready, database, sourceCommit, secretRefs: { databaseUrl: database.adapter === "postgres" ? "redacted" : "not-used", valuesPrinted: false } };
}
if (method === "GET" && path === "/api/v1/backends") return { items: await store.backends() as unknown as JsonValue };
if (method === "GET" && path === "/api/v1/backends") return await listBackendCapabilities(providerProfileDefaults) as JsonValue;
if (method === "GET" && path === "/api/v1/provider-profiles") return await listProviderProfiles(providerProfileDefaults) as JsonValue;
const providerProfileMatch = path.match(/^\/api\/v1\/provider-profiles\/([^/]+)$/u);
if (method === "GET" && providerProfileMatch) return await showProviderProfile(providerProfileMatch[1] ?? "", providerProfileDefaults) as JsonValue;