openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
90 lines (89 loc) • 3.12 kB
JavaScript
import "./agent-scope-MrLta7Pq.js";
import { c as resolveDefaultAgentId, n as listAgentIds } from "./agent-scope-config-CgCYpZfK.js";
import { i as getRuntimeConfig } from "./io-Gi7-pyU-.js";
import { n as authorizeOperatorScopesForMethod } from "./method-scopes-BtdN3y7s.js";
import { a as sendJson, i as sendInvalidRequest, o as sendMethodNotAllowed, s as sendMissingScopeForbidden } from "./http-common-DunL6val.js";
import { l as resolveOpenAiCompatibleHttpOperatorScopes, t as authorizeGatewayHttpRequestOrReply } from "./http-auth-utils-Du8mRZIw.js";
import { i as resolveAgentIdFromModel, n as OPENCLAW_MODEL_ID, t as OPENCLAW_DEFAULT_MODEL_ID } from "./http-utils-leZWdpma.js";
//#region src/gateway/models-http.ts
function toOpenAiModel(id) {
return {
id,
object: "model",
created: 0,
owned_by: "openclaw",
permission: []
};
}
async function authorizeRequest(req, res, opts) {
return await authorizeGatewayHttpRequestOrReply({
req,
res,
auth: opts.auth,
trustedProxies: opts.trustedProxies,
allowRealIpFallback: opts.allowRealIpFallback,
rateLimiter: opts.rateLimiter
});
}
function loadAgentModelIds() {
const cfg = getRuntimeConfig();
const defaultAgentId = resolveDefaultAgentId(cfg);
const ids = new Set([OPENCLAW_MODEL_ID, OPENCLAW_DEFAULT_MODEL_ID]);
ids.add(`openclaw/${defaultAgentId}`);
for (const agentId of listAgentIds(cfg)) ids.add(`openclaw/${agentId}`);
return Array.from(ids);
}
function resolveRequestPath(req) {
return new URL(req.url ?? "/", "http://localhost").pathname;
}
/** Handle OpenAI-compatible model list/detail requests, returning false for unrelated paths. */
async function handleOpenAiModelsHttpRequest(req, res, opts) {
const requestPath = resolveRequestPath(req);
if (requestPath !== "/v1/models" && !requestPath.startsWith("/v1/models/")) return false;
if (req.method !== "GET") {
sendMethodNotAllowed(res, "GET");
return true;
}
const requestAuth = await authorizeRequest(req, res, opts);
if (!requestAuth) return true;
const scopeAuth = authorizeOperatorScopesForMethod("models.list", resolveOpenAiCompatibleHttpOperatorScopes(req, requestAuth));
if (!scopeAuth.allowed) {
sendMissingScopeForbidden(res, scopeAuth.missingScope);
return true;
}
const ids = loadAgentModelIds();
if (requestPath === "/v1/models") {
sendJson(res, 200, {
object: "list",
data: ids.map(toOpenAiModel)
});
return true;
}
const encodedId = requestPath.slice(11);
if (!encodedId) {
sendInvalidRequest(res, "Missing model id.");
return true;
}
let decodedId;
try {
decodedId = decodeURIComponent(encodedId);
} catch {
sendInvalidRequest(res, "Invalid model id encoding.");
return true;
}
if (decodedId !== "openclaw" && !resolveAgentIdFromModel(decodedId)) {
sendInvalidRequest(res, "Invalid model id.");
return true;
}
if (!ids.includes(decodedId)) {
sendJson(res, 404, { error: {
message: `Model '${decodedId}' not found.`,
type: "invalid_request_error"
} });
return true;
}
sendJson(res, 200, toOpenAiModel(decodedId));
return true;
}
//#endregion
export { handleOpenAiModelsHttpRequest };