fix(runner): attribute ACP candidate model usage to its biller

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
DottaandPaperclip committed 2026-09-28 14:12:58 -05:00
1 parent ac17430b01
commit 766dda2b4f
2 files changed
+34 -14

No files matched your search

@@ -95,6 +95,20 @@ const defaultCapabilityRunnerdBinary = () =>
process.env.PAPERCLIP_ATTACH_TRANSITION_RUNNER ??
qualifiedCapabilityRunnerdBinary();
it("attributes opened candidate sessions to the harness biller instead of the model vendor", () => {
const provider = runnerdLaunchProfileInternals.openedThreadModelProvider;
for (const model of ["gpt-5.6-luna[context=272k,reasoning=medium,fast=false]", "claude-sonnet-5"]) {
expect(provider("acpx", "cursor", model)).toBe("cursor");
expect(provider("acpx", "copilot", model)).toBe("github");
}
expect(provider("acpx", "pi", "openrouter/deepseek/deepseek-v4-flash-0731")).toBe("openrouter");
expect(provider("acpx", "claude", "claude-sonnet-5")).toBe("anthropic");
expect(provider("acpx", "codex", "gpt-5.6-sol")).toBe("openai");
expect(provider("opencode", "codex", "openrouter/openai/gpt-6-astra")).toBe("openrouter");
expect(provider("claude_managed", "codex", "claude-sonnet-5")).toBe("anthropic");
expect(provider("aws_agentcore", "codex", "global.anthropic.claude-sonnet-4-6")).toBe("aws");
});
async function expectTurnStarted(
notifications: AsyncIterator<{ method: string }>,
) {
@@ -4763,20 +4763,7 @@ class DurablePrpCodexTransport implements CodexAppServerTransport {
? {}
: { providerIdentity: structuredClone(this.#providerIdentity) }),
model: params.model,
modelProvider:
provider === "opencode" && typeof params.model === "string"
? params.model.split("/", 1)[0]
: provider === "claude_managed"
? "anthropic"
: provider === "aws_agentcore"
? "aws"
: provider === "acpx"
? acpxAgent === "pi"
? "openrouter"
: acpxAgent === "claude"
? "anthropic"
: "openai"
: "openai",
modelProvider: openedThreadModelProvider(provider, acpxAgent, params.model),
},
};
}
@@ -6673,7 +6660,26 @@ export function createCapabilityRunnerdCodexTransport(
export const createRunnerdCodexTransport =
createCapabilityRunnerdCodexTransport;
/** The transport provider identifies the biller, independently of model family. */
function openedThreadModelProvider(
provider: CapabilityRunnerdCodexTransportOptions["provider"],
acpxAgent: QualifiedAcpxAgent,
model: unknown,
): string {
if (provider === "opencode" && typeof model === "string") return model.split("/", 1)[0]!;
if (provider === "claude_managed") return "anthropic";
if (provider === "aws_agentcore") return "aws";
if (provider === "acpx") {
if (acpxAgent === "pi") return "openrouter";
if (acpxAgent === "claude") return "anthropic";
if (acpxAgent === "cursor") return "cursor";
if (acpxAgent === "copilot") return "github";
}
return "openai";
}
export const runnerdLaunchProfileInternals = Object.freeze({
openedThreadModelProvider,
acpxProviderPackageAuthority,
acpxRunnerLaunchProfile,
resolveBuildOwnedCliArtifact,