feat: add CLI backend fallback

This commit is contained in:
Peter Steinberger
2026-01-10 23:31:25 +00:00
parent 07be761779
commit d8f1124d59
18 changed files with 1448 additions and 472 deletions

View File

@@ -4,7 +4,8 @@ import {
resolveAgentWorkspaceDir,
} from "../agents/agent-scope.js";
import { ensureAuthProfileStore } from "../agents/auth-profiles.js";
import { runClaudeCliAgent } from "../agents/claude-cli-runner.js";
import { runCliAgent } from "../agents/cli-runner.js";
import { getCliSessionId, setCliSessionId } from "../agents/cli-session.js";
import { lookupContextTokens } from "../agents/context.js";
import {
DEFAULT_CONTEXT_TOKENS,
@@ -15,6 +16,7 @@ import { loadModelCatalog } from "../agents/model-catalog.js";
import { runWithModelFallback } from "../agents/model-fallback.js";
import {
buildAllowedModelSet,
isCliProvider,
modelKey,
resolveConfiguredModelRef,
resolveThinkingDefault,
@@ -361,7 +363,7 @@ export async function agentCommand(
if (overrideModel) {
const key = modelKey(overrideProvider, overrideModel);
if (
overrideProvider !== "claude-cli" &&
!isCliProvider(overrideProvider, cfg) &&
allowedModelKeys.size > 0 &&
!allowedModelKeys.has(key)
) {
@@ -380,7 +382,7 @@ export async function agentCommand(
const candidateProvider = storedProviderOverride || defaultProvider;
const key = modelKey(candidateProvider, storedModelOverride);
if (
candidateProvider === "claude-cli" ||
isCliProvider(candidateProvider, cfg) ||
allowedModelKeys.size === 0 ||
allowedModelKeys.has(key)
) {
@@ -422,7 +424,6 @@ export async function agentCommand(
let result: Awaited<ReturnType<typeof runEmbeddedPiAgent>>;
let fallbackProvider = provider;
let fallbackModel = model;
const claudeSessionId = sessionEntry?.claudeCliSessionId?.trim();
try {
const messageProvider = resolveMessageProvider(
opts.messageProvider,
@@ -433,8 +434,9 @@ export async function agentCommand(
provider,
model,
run: (providerOverride, modelOverride) => {
if (providerOverride === "claude-cli") {
return runClaudeCliAgent({
if (isCliProvider(providerOverride, cfg)) {
const cliSessionId = getCliSessionId(sessionEntry, providerOverride);
return runCliAgent({
sessionId,
sessionKey,
sessionFile,
@@ -447,7 +449,8 @@ export async function agentCommand(
timeoutMs,
runId,
extraSystemPrompt: opts.extraSystemPrompt,
claudeSessionId,
cliSessionId,
images: opts.images,
});
}
return runEmbeddedPiAgent({
@@ -542,9 +545,9 @@ export async function agentCommand(
model: modelUsed,
contextTokens,
};
if (providerUsed === "claude-cli") {
if (isCliProvider(providerUsed, cfg)) {
const cliSessionId = result.meta.agentMeta?.sessionId?.trim();
if (cliSessionId) next.claudeCliSessionId = cliSessionId;
if (cliSessionId) setCliSessionId(next, providerUsed, cliSessionId);
}
next.abortedLastRun = result.meta.aborted ?? false;
if (hasNonzeroUsage(usage)) {