






















@@ -2,6 +2,7 @@ import { beforeEach, describe, expect, it, vi } from "vitest";
2233const completeSimple = vi.hoisted(() => vi.fn());
44const getRuntimeAuthForModel = vi.hoisted(() => vi.fn());
5+const logVerbose = vi.hoisted(() => vi.fn());
56const requireApiKey = vi.hoisted(() => vi.fn());
67const resolveDefaultModelForAgent = vi.hoisted(() => vi.fn());
78const resolveModelAsync = vi.hoisted(() => vi.fn());
@@ -18,6 +19,8 @@ vi.mock("@mariozechner/pi-ai", async () => {
18191920vi.mock("../../agents/model-auth.js", () => ({ requireApiKey }));
202122+vi.mock("../../globals.js", () => ({ logVerbose }));
23+2124vi.mock("../../agents/model-selection.js", () => ({
2225 resolveDefaultModelForAgent,
2326}));
@@ -40,6 +43,7 @@ describe("generateConversationLabel", () => {
4043beforeEach(() => {
4144completeSimple.mockReset();
4245getRuntimeAuthForModel.mockReset();
46+logVerbose.mockReset();
4347requireApiKey.mockReset();
4448resolveDefaultModelForAgent.mockReset();
4549resolveModelAsync.mockReset();
@@ -88,4 +92,70 @@ describe("generateConversationLabel", () => {
8892cfg: {},
8993});
9094});
95+96+it("passes the label prompt as systemPrompt and the user text as message content", async () => {
97+await generateConversationLabel({
98+userMessage: "Need help with invoices",
99+prompt: "Generate a label",
100+cfg: {},
101+});
102+103+expect(completeSimple).toHaveBeenCalledWith(
104+{ provider: "openai" },
105+{
106+systemPrompt: "Generate a label",
107+messages: [
108+{
109+role: "user",
110+content: "Need help with invoices",
111+timestamp: expect.any(Number),
112+},
113+],
114+},
115+expect.objectContaining({
116+apiKey: "resolved-key",
117+maxTokens: 100,
118+temperature: 0.3,
119+signal: expect.any(AbortSignal),
120+}),
121+);
122+});
123+124+it("omits temperature for Codex Responses simple completions", async () => {
125+resolveDefaultModelForAgent.mockReturnValue({ provider: "openai-codex", model: "gpt-5.5" });
126+resolveModelAsync.mockResolvedValue({
127+model: { provider: "openai-codex", api: "openai-codex-responses" },
128+authStorage: {},
129+modelRegistry: {},
130+});
131+132+await generateConversationLabel({
133+userMessage: "тест создания топика-треда",
134+prompt: "Generate a label",
135+cfg: {},
136+});
137+138+expect(completeSimple.mock.calls[0]?.[2]).toEqual(
139+expect.not.objectContaining({ temperature: expect.anything() }),
140+);
141+});
142+143+it("logs completion errors instead of treating them as empty labels", async () => {
144+completeSimple.mockResolvedValue({
145+content: [],
146+stopReason: "error",
147+errorMessage: "Codex error: Instructions are required",
148+});
149+150+const label = await generateConversationLabel({
151+userMessage: "Need help with invoices",
152+prompt: "Generate a label",
153+cfg: {},
154+});
155+156+expect(label).toBeNull();
157+expect(logVerbose).toHaveBeenCalledWith(
158+"conversation-label-generator: completion failed: Codex error: Instructions are required",
159+);
160+});
91161});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。