feat: add claw backend adapter

This commit is contained in:
kris
2026-04-03 01:36:29 +08:00
parent 8daaea01fd
commit 39b576cc42
23 changed files with 1212 additions and 23 deletions

View File

@@ -59,6 +59,7 @@ export async function POST(
modelOverride?: unknown;
reasoningEffortOverride?: unknown;
promptOverride?: unknown;
backendOverride?: unknown;
};
const hasModelOverride = Object.prototype.hasOwnProperty.call(payload, "modelOverride");
const hasReasoningEffortOverride = Object.prototype.hasOwnProperty.call(
@@ -66,9 +67,10 @@ export async function POST(
"reasoningEffortOverride",
);
const hasPromptOverride = Object.prototype.hasOwnProperty.call(payload, "promptOverride");
const allowedKeys = new Set(["modelOverride", "reasoningEffortOverride", "promptOverride"]);
const hasBackendOverride = Object.prototype.hasOwnProperty.call(payload, "backendOverride");
const allowedKeys = new Set(["modelOverride", "reasoningEffortOverride", "promptOverride", "backendOverride"]);
const hasUnsupportedKeys = Object.keys(payload).some((key) => !allowedKeys.has(key));
if ((!hasModelOverride && !hasReasoningEffortOverride && !hasPromptOverride) || hasUnsupportedKeys) {
if ((!hasModelOverride && !hasReasoningEffortOverride && !hasPromptOverride && !hasBackendOverride) || hasUnsupportedKeys) {
return NextResponse.json({ ok: false, message: "INVALID_AGENT_CONTROLS_PAYLOAD" }, { status: 400 });
}
@@ -90,6 +92,14 @@ export async function POST(
if (hasPromptOverride && payload.promptOverride !== undefined && payload.promptOverride !== null && typeof payload.promptOverride !== "string") {
return NextResponse.json({ ok: false, message: "INVALID_PROMPT_OVERRIDE" }, { status: 400 });
}
if (
hasBackendOverride &&
payload.backendOverride !== undefined &&
payload.backendOverride !== null &&
payload.backendOverride !== "claw-runtime"
) {
return NextResponse.json({ ok: false, message: "INVALID_BACKEND_OVERRIDE" }, { status: 400 });
}
try {
const controls = await updateProjectAgentControls(
@@ -98,6 +108,7 @@ export async function POST(
...(hasModelOverride ? { modelOverride: payload.modelOverride } : {}),
...(hasReasoningEffortOverride ? { reasoningEffortOverride: payload.reasoningEffortOverride } : {}),
...(hasPromptOverride ? { promptOverride: payload.promptOverride } : {}),
...(hasBackendOverride ? { backendOverride: payload.backendOverride } : {}),
},
session.account,
);

View File

@@ -71,12 +71,14 @@ export async function POST(
const payload = body as {
userPromptContent?: unknown;
promptOverride?: unknown;
backendOverride?: unknown;
};
const hasUserPromptContent = Object.prototype.hasOwnProperty.call(payload, "userPromptContent");
const hasPromptOverride = Object.prototype.hasOwnProperty.call(payload, "promptOverride");
const allowedKeys = new Set(["userPromptContent", "promptOverride"]);
const hasBackendOverride = Object.prototype.hasOwnProperty.call(payload, "backendOverride");
const allowedKeys = new Set(["userPromptContent", "promptOverride", "backendOverride"]);
const hasUnsupportedKeys = Object.keys(payload).some((key) => !allowedKeys.has(key));
if ((!hasUserPromptContent && !hasPromptOverride) || hasUnsupportedKeys) {
if ((!hasUserPromptContent && !hasPromptOverride && !hasBackendOverride) || hasUnsupportedKeys) {
return NextResponse.json({ ok: false, message: "INVALID_PROMPT_PROFILE_PAYLOAD" }, { status: 400 });
}
if (hasUserPromptContent && payload.userPromptContent !== undefined && payload.userPromptContent !== null && typeof payload.userPromptContent !== "string") {
@@ -85,6 +87,22 @@ export async function POST(
if (hasPromptOverride && payload.promptOverride !== undefined && payload.promptOverride !== null && typeof payload.promptOverride !== "string") {
return NextResponse.json({ ok: false, message: "INVALID_PROMPT_OVERRIDE" }, { status: 400 });
}
if (
hasBackendOverride
&& payload.backendOverride !== undefined
&& payload.backendOverride !== null
&& typeof payload.backendOverride !== "string"
) {
return NextResponse.json({ ok: false, message: "INVALID_BACKEND_OVERRIDE" }, { status: 400 });
}
if (
hasBackendOverride
&& typeof payload.backendOverride === "string"
&& payload.backendOverride.trim() !== ""
&& payload.backendOverride.trim() !== "claw-runtime"
) {
return NextResponse.json({ ok: false, message: "INVALID_BACKEND_OVERRIDE" }, { status: 400 });
}
try {
if (hasUserPromptContent) {
@@ -96,9 +114,10 @@ export async function POST(
}
}
if (hasPromptOverride) {
if (hasPromptOverride || hasBackendOverride) {
await updateProjectAgentControls(projectId, {
promptOverride: payload.promptOverride,
...(hasPromptOverride ? { promptOverride: payload.promptOverride } : {}),
...(hasBackendOverride ? { backendOverride: payload.backendOverride } : {}),
}, session.account);
}