oclaw/interfaces/gateway/server_methods/models.py
oliver 4a23b715a2 重构仓库目录为统一的 runtime 分层并清理历史 openclaw 残留。
本次迁移将网关/通道/工具/技能/脚本与协议资源集中到新结构,统一路径常量与脚本转发机制,减少顶层噪音并保证运行与测试行为一致。

Made-with: Cursor
2026-04-25 01:24:23 +08:00

61 lines
1.8 KiB
Python

from __future__ import annotations
from typing import Any
from .shared_types import GatewayRequestHandlers
from .validation import error_shape
def _ok(respond, payload: Any) -> None:
if callable(respond):
respond(True, payload, None, None)
def _bad(respond, message: str) -> None:
if callable(respond):
respond(False, None, error_shape("INVALID_REQUEST", message), None)
def _unavailable(respond, message: str) -> None:
if callable(respond):
respond(False, None, error_shape("UNAVAILABLE", message), None)
def _models_list_handler(opts: dict[str, Any]) -> None:
params = opts.get("params")
respond = opts.get("respond")
context = opts.get("context")
if params is not None and not isinstance(params, dict):
_bad(respond, "invalid models.list params")
return
load_catalog = context.get("loadGatewayModelCatalog") if isinstance(context, dict) else None
if not callable(load_catalog):
# Staging fallback: keep contract shape.
_ok(respond, {"models": []})
return
try:
catalog = load_catalog()
if not isinstance(catalog, list):
catalog = []
except Exception as exc:
_unavailable(respond, str(exc))
return
# Optional policy hook to emulate TS buildAllowedModelSet behavior.
allowed_hook = context.get("filterAllowedModels") if isinstance(context, dict) else None
if callable(allowed_hook):
try:
allowed = allowed_hook(catalog)
if isinstance(allowed, list) and len(allowed) > 0:
_ok(respond, {"models": allowed})
return
except Exception:
# Non-fatal: fallback to full catalog
pass
_ok(respond, {"models": catalog})
models_handlers: GatewayRequestHandlers = {
"models.list": _models_list_handler,
}