


























@@ -1,66 +1,27 @@
11import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../../agents/agent-scope.js";
22import { DEFAULT_PROVIDER } from "../../agents/defaults.js";
3+import {
4+loadModelCatalogForBrowse,
5+type ModelCatalogBrowseView,
6+} from "../../agents/model-catalog-browse.js";
37import { resolveVisibleModelCatalog } from "../../agents/model-catalog-visibility.js";
4-import { parseConfiguredModelVisibilityEntries } from "../../agents/model-selection-shared.js";
58import { resolveDefaultAgentWorkspaceDir } from "../../agents/workspace.js";
6-import type { OpenClawConfig } from "../../config/types.openclaw.js";
79import {
810ErrorCodes,
911errorShape,
1012formatValidationErrors,
1113validateModelsListParams,
1214} from "../protocol/index.js";
13-import type { GatewayRequestContext } from "./shared-types.js";
1415import type { GatewayRequestHandlers } from "./types.js";
151616-type ModelsListView = "default" | "configured" | "all";
17-type GatewayModelCatalog = Awaited<ReturnType<GatewayRequestContext["loadGatewayModelCatalog"]>>;
17+type ModelsListView = ModelCatalogBrowseView;
181819-const MODELS_LIST_CATALOG_TIMEOUT_MS = 750;
2019let loggedSlowModelsListCatalog = false;
21202221function resolveModelsListView(params: Record<string, unknown>): ModelsListView {
2322return typeof params.view === "string" ? (params.view as ModelsListView) : "default";
2423}
252426-async function loadModelsListCatalog(
27-context: GatewayRequestContext,
28-view: ModelsListView,
29-cfg: OpenClawConfig,
30-): Promise<GatewayModelCatalog> {
31-if (view === "all") {
32-return await context.loadGatewayModelCatalog({ readOnly: false });
33-}
34-if (parseConfiguredModelVisibilityEntries({ cfg }).providerWildcards.size > 0) {
35-return await context.loadGatewayModelCatalog({ readOnly: false });
36-}
37-let timeout: NodeJS.Timeout | undefined;
38-const timedOut = Symbol("models-list-catalog-timeout");
39-const catalogPromise = context.loadGatewayModelCatalog({ readOnly: true });
40-const timeoutPromise = new Promise<typeof timedOut>((resolve) => {
41-timeout = setTimeout(() => resolve(timedOut), MODELS_LIST_CATALOG_TIMEOUT_MS);
42-timeout.unref?.();
43-});
44-try {
45-const result = await Promise.race([catalogPromise, timeoutPromise]);
46-if (result === timedOut) {
47-catalogPromise.catch(() => undefined);
48-if (!loggedSlowModelsListCatalog) {
49-loggedSlowModelsListCatalog = true;
50-context.logGateway.debug(
51-`models.list continuing without model catalog after ${MODELS_LIST_CATALOG_TIMEOUT_MS}ms`,
52-);
53-}
54-return [];
55-}
56-return result;
57-} finally {
58-if (timeout) {
59-clearTimeout(timeout);
60-}
61-}
62-}
63-6425export const modelsHandlers: GatewayRequestHandlers = {
6526"models.list": async ({ params, respond, context }) => {
6627if (!validateModelsListParams(params)) {
@@ -80,7 +41,20 @@ export const modelsHandlers: GatewayRequestHandlers = {
8041resolveAgentWorkspaceDir(cfg, resolveDefaultAgentId(cfg)) ??
8142resolveDefaultAgentWorkspaceDir();
8243const view = resolveModelsListView(params);
83-const catalog = await loadModelsListCatalog(context, view, cfg);
44+const catalog = await loadModelCatalogForBrowse({
45+ cfg,
46+ view,
47+loadCatalog: context.loadGatewayModelCatalog,
48+onTimeout: (timeoutMs) => {
49+if (loggedSlowModelsListCatalog) {
50+return;
51+}
52+loggedSlowModelsListCatalog = true;
53+context.logGateway.debug(
54+`models.list continuing without model catalog after ${timeoutMs}ms`,
55+);
56+},
57+});
8458if (view === "all") {
8559respond(true, { models: catalog }, undefined);
8660return;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。