Skip to content

Commit 0a1c7bd

Browse files
sweetmantechclaude
andcommitted
Revert "fix: integrate handleChatCompletion to save chat memories (#128)"
This reverts the handleChatCompletion integration as memories are still not being saved correctly. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 009ca72 commit 0a1c7bd

File tree

5 files changed

+7
-364
lines changed

5 files changed

+7
-364
lines changed

lib/chat/__tests__/handleChatGenerate.test.ts

Lines changed: 0 additions & 172 deletions
Original file line numberDiff line numberDiff line change
@@ -26,25 +26,19 @@ vi.mock("@/lib/chat/setupChatRequest", () => ({
2626
setupChatRequest: vi.fn(),
2727
}));
2828

29-
vi.mock("@/lib/chat/handleChatCompletion", () => ({
30-
handleChatCompletion: vi.fn(),
31-
}));
32-
3329
vi.mock("ai", () => ({
3430
generateText: vi.fn(),
3531
}));
3632

3733
import { getApiKeyAccountId } from "@/lib/auth/getApiKeyAccountId";
3834
import { validateOverrideAccountId } from "@/lib/accounts/validateOverrideAccountId";
3935
import { setupChatRequest } from "@/lib/chat/setupChatRequest";
40-
import { handleChatCompletion } from "@/lib/chat/handleChatCompletion";
4136
import { generateText } from "ai";
4237
import { handleChatGenerate } from "../handleChatGenerate";
4338

4439
const mockGetApiKeyAccountId = vi.mocked(getApiKeyAccountId);
4540
const mockValidateOverrideAccountId = vi.mocked(validateOverrideAccountId);
4641
const mockSetupChatRequest = vi.mocked(setupChatRequest);
47-
const mockHandleChatCompletion = vi.mocked(handleChatCompletion);
4842
const mockGenerateText = vi.mocked(generateText);
4943

5044
// Helper to create mock NextRequest
@@ -64,7 +58,6 @@ function createMockRequest(
6458
describe("handleChatGenerate", () => {
6559
beforeEach(() => {
6660
vi.clearAllMocks();
67-
mockHandleChatCompletion.mockResolvedValue();
6861
});
6962

7063
afterEach(() => {
@@ -343,169 +336,4 @@ describe("handleChatGenerate", () => {
343336
);
344337
});
345338
});
346-
347-
describe("chat completion handling", () => {
348-
it("calls handleChatCompletion with body and constructed UIMessage", async () => {
349-
mockGetApiKeyAccountId.mockResolvedValue("account-123");
350-
351-
mockSetupChatRequest.mockResolvedValue({
352-
model: "gpt-4",
353-
instructions: "test",
354-
system: "test",
355-
messages: [],
356-
experimental_generateMessageId: vi.fn(),
357-
tools: {},
358-
providerOptions: {},
359-
} as any);
360-
361-
mockGenerateText.mockResolvedValue({
362-
text: "Hello! How can I help you?",
363-
finishReason: "stop",
364-
usage: { promptTokens: 10, completionTokens: 20 },
365-
response: { messages: [], headers: {}, body: null },
366-
} as any);
367-
368-
const messages = [{ id: "msg-1", role: "user", parts: [{ type: "text", text: "Hi" }] }];
369-
const request = createMockRequest(
370-
{ messages, roomId: "room-123", artistId: "artist-456" },
371-
{ "x-api-key": "valid-key" },
372-
);
373-
374-
await handleChatGenerate(request as any);
375-
376-
// Verify handleChatCompletion was called
377-
expect(mockHandleChatCompletion).toHaveBeenCalledTimes(1);
378-
379-
// Verify the body contains the correct fields
380-
expect(mockHandleChatCompletion).toHaveBeenCalledWith(
381-
expect.objectContaining({
382-
messages,
383-
roomId: "room-123",
384-
artistId: "artist-456",
385-
accountId: "account-123",
386-
}),
387-
expect.arrayContaining([
388-
expect.objectContaining({
389-
role: "assistant",
390-
parts: expect.arrayContaining([
391-
expect.objectContaining({
392-
type: "text",
393-
text: "Hello! How can I help you?",
394-
}),
395-
]),
396-
}),
397-
]),
398-
);
399-
});
400-
401-
it("constructs UIMessage with correct structure from generateText result", async () => {
402-
mockGetApiKeyAccountId.mockResolvedValue("account-123");
403-
404-
mockSetupChatRequest.mockResolvedValue({
405-
model: "gpt-4",
406-
instructions: "test",
407-
system: "test",
408-
messages: [],
409-
experimental_generateMessageId: vi.fn(),
410-
tools: {},
411-
providerOptions: {},
412-
} as any);
413-
414-
mockGenerateText.mockResolvedValue({
415-
text: "Generated response text",
416-
finishReason: "stop",
417-
usage: { promptTokens: 10, completionTokens: 20 },
418-
response: { messages: [], headers: {}, body: null },
419-
} as any);
420-
421-
const request = createMockRequest(
422-
{ prompt: "Hello" },
423-
{ "x-api-key": "valid-key" },
424-
);
425-
426-
await handleChatGenerate(request as any);
427-
428-
// Get the UIMessage that was passed to handleChatCompletion
429-
const [, responseMessages] = mockHandleChatCompletion.mock.calls[0];
430-
431-
expect(responseMessages).toHaveLength(1);
432-
expect(responseMessages[0]).toMatchObject({
433-
id: expect.any(String),
434-
role: "assistant",
435-
parts: [
436-
{
437-
type: "text",
438-
text: "Generated response text",
439-
},
440-
],
441-
});
442-
});
443-
444-
it("does not throw when handleChatCompletion fails", async () => {
445-
mockGetApiKeyAccountId.mockResolvedValue("account-123");
446-
mockHandleChatCompletion.mockRejectedValue(new Error("Completion failed"));
447-
448-
mockSetupChatRequest.mockResolvedValue({
449-
model: "gpt-4",
450-
instructions: "test",
451-
system: "test",
452-
messages: [],
453-
experimental_generateMessageId: vi.fn(),
454-
tools: {},
455-
providerOptions: {},
456-
} as any);
457-
458-
mockGenerateText.mockResolvedValue({
459-
text: "Response",
460-
finishReason: "stop",
461-
usage: { promptTokens: 10, completionTokens: 20 },
462-
response: { messages: [], headers: {}, body: null },
463-
} as any);
464-
465-
const request = createMockRequest(
466-
{ prompt: "Hello" },
467-
{ "x-api-key": "valid-key" },
468-
);
469-
470-
// Should not throw even if handleChatCompletion fails
471-
const result = await handleChatGenerate(request as any);
472-
473-
expect(result.status).toBe(200);
474-
const json = await result.json();
475-
expect(json.text).toBe("Response");
476-
});
477-
478-
it("handles empty text from generateText result", async () => {
479-
mockGetApiKeyAccountId.mockResolvedValue("account-123");
480-
481-
mockSetupChatRequest.mockResolvedValue({
482-
model: "gpt-4",
483-
instructions: "test",
484-
system: "test",
485-
messages: [],
486-
experimental_generateMessageId: vi.fn(),
487-
tools: {},
488-
providerOptions: {},
489-
} as any);
490-
491-
mockGenerateText.mockResolvedValue({
492-
text: "",
493-
finishReason: "stop",
494-
usage: { promptTokens: 10, completionTokens: 0 },
495-
response: { messages: [], headers: {}, body: null },
496-
} as any);
497-
498-
const request = createMockRequest(
499-
{ prompt: "Hello" },
500-
{ "x-api-key": "valid-key" },
501-
);
502-
503-
await handleChatGenerate(request as any);
504-
505-
// Get the UIMessage that was passed to handleChatCompletion
506-
const [, responseMessages] = mockHandleChatCompletion.mock.calls[0];
507-
508-
expect((responseMessages[0].parts[0] as { text: string }).text).toBe("");
509-
});
510-
});
511339
});

lib/chat/__tests__/handleChatStream.test.ts

Lines changed: 0 additions & 148 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,6 @@ vi.mock("@/lib/chat/setupChatRequest", () => ({
2626
setupChatRequest: vi.fn(),
2727
}));
2828

29-
vi.mock("@/lib/chat/handleChatCompletion", () => ({
30-
handleChatCompletion: vi.fn(),
31-
}));
32-
3329
vi.mock("ai", () => ({
3430
createUIMessageStream: vi.fn(),
3531
createUIMessageStreamResponse: vi.fn(),
@@ -38,14 +34,12 @@ vi.mock("ai", () => ({
3834
import { getApiKeyAccountId } from "@/lib/auth/getApiKeyAccountId";
3935
import { validateOverrideAccountId } from "@/lib/accounts/validateOverrideAccountId";
4036
import { setupChatRequest } from "@/lib/chat/setupChatRequest";
41-
import { handleChatCompletion } from "@/lib/chat/handleChatCompletion";
4237
import { createUIMessageStream, createUIMessageStreamResponse } from "ai";
4338
import { handleChatStream } from "../handleChatStream";
4439

4540
const mockGetApiKeyAccountId = vi.mocked(getApiKeyAccountId);
4641
const mockValidateOverrideAccountId = vi.mocked(validateOverrideAccountId);
4742
const mockSetupChatRequest = vi.mocked(setupChatRequest);
48-
const mockHandleChatCompletion = vi.mocked(handleChatCompletion);
4943
const mockCreateUIMessageStream = vi.mocked(createUIMessageStream);
5044
const mockCreateUIMessageStreamResponse = vi.mocked(createUIMessageStreamResponse);
5145

@@ -66,7 +60,6 @@ function createMockRequest(
6660
describe("handleChatStream", () => {
6761
beforeEach(() => {
6862
vi.clearAllMocks();
69-
mockHandleChatCompletion.mockResolvedValue();
7063
});
7164

7265
afterEach(() => {
@@ -301,145 +294,4 @@ describe("handleChatStream", () => {
301294
);
302295
});
303296
});
304-
305-
describe("chat completion handling", () => {
306-
it("passes onFinish callback to createUIMessageStream", async () => {
307-
mockGetApiKeyAccountId.mockResolvedValue("account-123");
308-
309-
const mockAgent = {
310-
stream: vi.fn().mockResolvedValue({
311-
toUIMessageStream: vi.fn().mockReturnValue(new ReadableStream()),
312-
usage: Promise.resolve({ inputTokens: 100, outputTokens: 50 }),
313-
}),
314-
tools: {},
315-
};
316-
317-
mockSetupChatRequest.mockResolvedValue({
318-
agent: mockAgent,
319-
model: "gpt-4",
320-
instructions: "test",
321-
system: "test",
322-
messages: [],
323-
experimental_generateMessageId: vi.fn(),
324-
tools: {},
325-
providerOptions: {},
326-
} as any);
327-
328-
const mockStream = new ReadableStream();
329-
mockCreateUIMessageStream.mockReturnValue(mockStream);
330-
mockCreateUIMessageStreamResponse.mockReturnValue(new Response(mockStream));
331-
332-
const request = createMockRequest({ prompt: "Hello" }, { "x-api-key": "valid-key" });
333-
334-
await handleChatStream(request as any);
335-
336-
// Verify onFinish callback was passed to createUIMessageStream
337-
expect(mockCreateUIMessageStream).toHaveBeenCalledWith(
338-
expect.objectContaining({
339-
onFinish: expect.any(Function),
340-
}),
341-
);
342-
});
343-
344-
it("calls handleChatCompletion with body and messages when onFinish is triggered", async () => {
345-
mockGetApiKeyAccountId.mockResolvedValue("account-123");
346-
347-
const mockAgent = {
348-
stream: vi.fn().mockResolvedValue({
349-
toUIMessageStream: vi.fn().mockReturnValue(new ReadableStream()),
350-
usage: Promise.resolve({ inputTokens: 100, outputTokens: 50 }),
351-
}),
352-
tools: {},
353-
};
354-
355-
mockSetupChatRequest.mockResolvedValue({
356-
agent: mockAgent,
357-
model: "gpt-4",
358-
instructions: "test",
359-
system: "test",
360-
messages: [],
361-
experimental_generateMessageId: vi.fn(),
362-
tools: {},
363-
providerOptions: {},
364-
} as any);
365-
366-
const mockStream = new ReadableStream();
367-
mockCreateUIMessageStream.mockReturnValue(mockStream);
368-
mockCreateUIMessageStreamResponse.mockReturnValue(new Response(mockStream));
369-
370-
const messages = [{ id: "msg-1", role: "user", parts: [{ type: "text", text: "Hi" }] }];
371-
const request = createMockRequest(
372-
{ messages, roomId: "room-123", artistId: "artist-456" },
373-
{ "x-api-key": "valid-key" },
374-
);
375-
376-
await handleChatStream(request as any);
377-
378-
// Get the onFinish callback that was passed to createUIMessageStream
379-
const createUIMessageStreamCall = mockCreateUIMessageStream.mock.calls[0][0] as {
380-
onFinish: (params: { messages: unknown[] }) => void;
381-
};
382-
const onFinishCallback = createUIMessageStreamCall.onFinish;
383-
384-
// Simulate onFinish being called with response messages
385-
const responseMessages = [
386-
{ id: "resp-1", role: "assistant", parts: [{ type: "text", text: "Hello!" }] },
387-
];
388-
onFinishCallback({ messages: responseMessages });
389-
390-
// Verify handleChatCompletion was called with correct arguments
391-
expect(mockHandleChatCompletion).toHaveBeenCalledWith(
392-
expect.objectContaining({
393-
messages,
394-
roomId: "room-123",
395-
artistId: "artist-456",
396-
accountId: "account-123",
397-
}),
398-
responseMessages,
399-
);
400-
});
401-
402-
it("does not throw when handleChatCompletion fails", async () => {
403-
mockGetApiKeyAccountId.mockResolvedValue("account-123");
404-
mockHandleChatCompletion.mockRejectedValue(new Error("Completion failed"));
405-
406-
const mockAgent = {
407-
stream: vi.fn().mockResolvedValue({
408-
toUIMessageStream: vi.fn().mockReturnValue(new ReadableStream()),
409-
usage: Promise.resolve({ inputTokens: 100, outputTokens: 50 }),
410-
}),
411-
tools: {},
412-
};
413-
414-
mockSetupChatRequest.mockResolvedValue({
415-
agent: mockAgent,
416-
model: "gpt-4",
417-
instructions: "test",
418-
system: "test",
419-
messages: [],
420-
experimental_generateMessageId: vi.fn(),
421-
tools: {},
422-
providerOptions: {},
423-
} as any);
424-
425-
const mockStream = new ReadableStream();
426-
mockCreateUIMessageStream.mockReturnValue(mockStream);
427-
mockCreateUIMessageStreamResponse.mockReturnValue(new Response(mockStream));
428-
429-
const request = createMockRequest({ prompt: "Hello" }, { "x-api-key": "valid-key" });
430-
431-
// Should not throw even if handleChatCompletion fails
432-
const result = await handleChatStream(request as any);
433-
expect(result).toBeInstanceOf(Response);
434-
435-
// Trigger onFinish to ensure error is caught gracefully
436-
const createUIMessageStreamCall = mockCreateUIMessageStream.mock.calls[0][0] as {
437-
onFinish: (params: { messages: unknown[] }) => void;
438-
};
439-
const onFinishCallback = createUIMessageStreamCall.onFinish;
440-
441-
// This should not throw
442-
expect(() => onFinishCallback({ messages: [] })).not.toThrow();
443-
});
444-
});
445297
});

0 commit comments

Comments
 (0)