paperclipai/paperclip · error · Error

eval-session provider is unsupported by CapabilityLiveSessio

Error message

eval-session provider is unsupported by CapabilityLiveSessionService

What it means

After the schema check, parseEvalSessionRequest validates the provider field. Only 'codex' (default), 'opencode', 'claude_managed', 'aws_agentcore', and 'acpx' are supported by CapabilityLiveSessionService; any other string throws this error. It also then cross-checks that the optional driver matches the expected driver for that provider.

Source

Thrown at packages/paperclip-runner/src/cli/eval-session-contract.ts:227

    ),
  };
}

/** Fail-closed validation for the executable boundary. */
export function parseEvalSessionRequest(value: unknown): EvalSessionRequest {
  const input = object(value, "request");
  if (input.schema !== EVAL_SESSION_REQUEST_SCHEMA) {
    throw new Error("unsupported request schema");
  }
  const providerValue = input.provider ?? "codex";
  if (
    providerValue !== "codex" &&
    providerValue !== "opencode" &&
    providerValue !== "claude_managed" &&
    providerValue !== "aws_agentcore" &&
    providerValue !== "acpx"
  ) {
    throw new Error(
      "eval-session provider is unsupported by CapabilityLiveSessionService",
    );
  }
  const provider = providerValue;
  const driver = expectedEvalSessionDriver(provider);
  if (input.driver !== undefined && input.driver !== driver) {
    throw new Error("eval-session provider/driver mismatch");
  }
  // The original Evalbook v1 producer serialized absent provider-specific
  // options as JSON null. Preserve compatibility with those immutable request
  // artifacts while continuing to reject non-null values for the wrong lane.
  const acpxAgent = input.acpxAgent === null ? undefined : input.acpxAgent;
  if (acpxAgent === "pi") throw new Error("The Pi ACPX profile is not available");
  if (
    acpxAgent !== undefined &&
    acpxAgent !== "codex" &&
    acpxAgent !== "claude"
  ) {

View on GitHub (pinned to 01ad858492)

Solutions

  1. Set request.provider to one of: 'codex', 'opencode', 'claude_managed', 'aws_agentcore', 'acpx' (or omit it to default to 'codex')
  2. Fix casing/spelling to the exact lowercase literal
  3. Check which provider ids this runner build supports and align the caller
  4. If a genuinely new provider is needed, add it to the contract and CapabilityLiveSessionService first

Example fix

// before
const req = { schema: SCHEMA, provider: 'claude' };
// after
const req = { schema: SCHEMA, provider: 'claude_managed' };
Defensive patterns

Strategy: validation

Validate before calling

const SUPPORTED_PROVIDERS = ['codex', 'opencode', 'claude_managed', 'aws_agentcore', 'acpx'];
if (!SUPPORTED_PROVIDERS.includes(req.provider ?? 'codex')) {
  throw new Error(`provider must be one of: ${SUPPORTED_PROVIDERS.join(', ')}`);
}

Type guard

type Provider = 'codex' | 'opencode' | 'claude_managed' | 'aws_agentcore' | 'acpx';
function isSupportedProvider(v) {
  return v === undefined || ['codex','opencode','claude_managed','aws_agentcore','acpx'].includes(v);
}

Try / catch

try {
  const request = parseEvalSessionRequest(raw);
} catch (err) {
  if (err.message.includes('provider is unsupported')) {
    throw new RequestValidationError('Use codex, opencode, claude_managed, aws_agentcore, or acpx (exact lowercase literals)', { cause: err });
  }
  throw err;
}

Prevention

When it happens

Trigger: Passing request.provider with a value outside the supported set — e.g. 'claude', 'codex-cli', 'gemini', a misspelling like 'opendcode', or an uppercase variant — instead of one of the five exact literals.

Common situations: A new provider was added to the caller before the runner gained support; a provider alias or display name was used instead of the canonical id; casing was normalized upstream to 'Codex'; a config file from a fork/experimental build lists an unsupported provider.

Related errors


AI-assisted analysis of paperclipai/paperclip@01ad858492 (2026-09-02). Data as JSON: /api/errors/0fef35a39d9de0b7. Report an issue: GitHub.