mirror of
https://github.com/badlogic/pi-mono.git
synced 2026-11-05 23:37:25 +00:00
feat(ai): carry responseModel on pi-messages terminal events (#11265)
This commit makes it so we store the responseModel (i.e. the "phyiscal"
model used) on each PiMessage. This allows e.g. Radius to know which
physical model was used by virtual models (like `cheap`). It's
especially important after we merged
https://github.com/earendil-works/pi/pull/11000
(9113094291), where Pi will drop thinking
traces when the model name doesn't match - with this change we can check
the physical model instead.
This commit is contained in:
parent
906e1302f9
commit
14c8118412
4 changed files with 24 additions and 3 deletions
|
|
@ -74,6 +74,7 @@ export type PiMessagesEvent =
|
|||
reason: Extract<PiMessagesStopReason, "stop" | "length" | "toolUse">;
|
||||
usage: PiMessagesUsage;
|
||||
responseId?: string;
|
||||
responseModel?: string;
|
||||
providerThinkingLevel?: string;
|
||||
rewrite?: PiMessagesRewriteImpact;
|
||||
}
|
||||
|
|
@ -83,6 +84,7 @@ export type PiMessagesEvent =
|
|||
usage: PiMessagesUsage;
|
||||
errorMessage?: string;
|
||||
responseId?: string;
|
||||
responseModel?: string;
|
||||
providerThinkingLevel?: string;
|
||||
rewrite?: PiMessagesRewriteImpact;
|
||||
};
|
||||
|
|
@ -199,6 +201,9 @@ function createEventConverter(model: Model<"pi-messages">) {
|
|||
usage: event.usage,
|
||||
responseId: event.responseId,
|
||||
});
|
||||
if (event.responseModel !== undefined) {
|
||||
partial.responseModel = event.responseModel;
|
||||
}
|
||||
if (event.providerThinkingLevel !== undefined) {
|
||||
partial.providerThinkingLevel = event.providerThinkingLevel;
|
||||
}
|
||||
|
|
@ -211,6 +216,9 @@ function createEventConverter(model: Model<"pi-messages">) {
|
|||
errorMessage: event.errorMessage,
|
||||
responseId: event.responseId,
|
||||
});
|
||||
if (event.responseModel !== undefined) {
|
||||
partial.responseModel = event.responseModel;
|
||||
}
|
||||
if (event.providerThinkingLevel !== undefined) {
|
||||
partial.providerThinkingLevel = event.providerThinkingLevel;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -588,7 +588,7 @@ export interface AssistantMessage {
|
|||
api: Api;
|
||||
provider: ProviderId;
|
||||
model: string;
|
||||
responseModel?: string; // Concrete model reported by the provider when different from the requested `model`
|
||||
responseModel?: string; // Concrete model reported by the provider, when reported. May equal the requested `model`
|
||||
responseId?: string; // Provider-specific response/message identifier when the upstream API exposes one
|
||||
/** Exact provider-native effort level used for this response. Absent for legacy or unmanaged responses. */
|
||||
providerThinkingLevel?: string;
|
||||
|
|
|
|||
|
|
@ -116,6 +116,7 @@ describe("pi-messages", () => {
|
|||
reason: "toolUse",
|
||||
usage,
|
||||
responseId: "resp_1",
|
||||
responseModel: "claude-opus-5-5",
|
||||
providerThinkingLevel: "high",
|
||||
},
|
||||
],
|
||||
|
|
@ -145,6 +146,7 @@ describe("pi-messages", () => {
|
|||
expect(message.responseId).toBe("resp_1");
|
||||
expect(message.providerThinkingLevel).toBe("high");
|
||||
expect(message.model).toBe("auto");
|
||||
expect(message.responseModel).toBe("claude-opus-5-5");
|
||||
expect(message.provider).toBe("radius");
|
||||
expect(message.content).toEqual([
|
||||
{ type: "text", text: "Hello", textSignature: undefined },
|
||||
|
|
@ -190,6 +192,7 @@ describe("pi-messages", () => {
|
|||
expect(eventModels).toEqual(wireEvents.map(() => model));
|
||||
expect(message.stopReason).toBe("stop");
|
||||
expect(message.responseId).toBe("resp_1");
|
||||
expect(message).not.toHaveProperty("responseModel");
|
||||
expect(message.content).toEqual([{ type: "text", text: "Hello", textSignature: undefined }]);
|
||||
});
|
||||
|
||||
|
|
@ -234,7 +237,16 @@ describe("pi-messages", () => {
|
|||
|
||||
it("propagates server-sent error events", async () => {
|
||||
const { baseUrl } = await startServer({
|
||||
events: [{ type: "start" }, { type: "error", reason: "error", usage, errorMessage: "Upstream failed" }],
|
||||
events: [
|
||||
{ type: "start" },
|
||||
{
|
||||
type: "error",
|
||||
reason: "error",
|
||||
usage,
|
||||
errorMessage: "Upstream failed",
|
||||
responseModel: "claude-opus-5-5",
|
||||
},
|
||||
],
|
||||
});
|
||||
const model = createModel(baseUrl);
|
||||
|
||||
|
|
@ -243,6 +255,7 @@ describe("pi-messages", () => {
|
|||
expect(message.stopReason).toBe("error");
|
||||
expect(message.errorMessage).toBe("Upstream failed");
|
||||
expect(message.usage).toEqual(usage);
|
||||
expect(message.responseModel).toBe("claude-opus-5-5");
|
||||
});
|
||||
|
||||
it("errors when no API key is provided", async () => {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue