| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
| import { Memory } from "./types";
|
| import { logger } from "../../../open-sse/utils/logger.ts";
|
|
|
| const log = logger("MEMORY_INJECTION");
|
|
|
| export interface ChatMessage {
|
| role: "system" | "user" | "assistant";
|
| content: string;
|
| name?: string;
|
| }
|
|
|
| export interface ChatRequest {
|
| model: string;
|
| messages: ChatMessage[];
|
| system?: string;
|
| temperature?: number;
|
| max_tokens?: number;
|
| stream?: boolean;
|
| [key: string]: unknown;
|
| }
|
|
|
| |
| |
| |
|
|
| const PROVIDERS_WITHOUT_SYSTEM_MESSAGE = new Set([
|
| "o1",
|
| "o1-mini",
|
| "o1-preview",
|
| "glm",
|
| "glmt",
|
| "glm-cn",
|
| "zai",
|
| "qianfan",
|
| ]);
|
|
|
| |
| |
| |
|
|
| export function providerSupportsSystemMessage(provider: string | null | undefined): boolean {
|
| if (!provider) return true;
|
| const normalized = provider.toLowerCase().trim();
|
| return !PROVIDERS_WITHOUT_SYSTEM_MESSAGE.has(normalized);
|
| }
|
|
|
| |
| |
| |
|
|
| export function formatMemoryContext(memories: Memory[]): string {
|
| if (!memories || memories.length === 0) return "";
|
|
|
| const content = memories
|
| .map((m) => m.content.trim())
|
| .filter(Boolean)
|
| .join("\n");
|
|
|
| return content ? `Memory context: ${content}` : "";
|
| }
|
|
|
| |
| |
| |
| |
| |
| |
| |
|
|
| export function injectMemory(
|
| request: ChatRequest,
|
| memories: Memory[],
|
| provider: string | null | undefined
|
| ): ChatRequest {
|
| if (!memories || memories.length === 0) {
|
| log.info("memory.injection.skipped", { reason: "no_memories", model: request.model });
|
| return request;
|
| }
|
|
|
| const memoryText = formatMemoryContext(memories);
|
| if (!memoryText) {
|
| log.info("memory.injection.skipped", { reason: "empty_context", model: request.model });
|
| return request;
|
| }
|
|
|
| const messages: ChatMessage[] = Array.isArray(request.messages) ? [...request.messages] : [];
|
|
|
| if (providerSupportsSystemMessage(provider)) {
|
|
|
|
|
|
|
| const memorySystemMessage: ChatMessage = { role: "system", content: memoryText };
|
| log.info("memory.injection.injected", {
|
| count: memories.length,
|
| strategy: "system",
|
| model: request.model,
|
| });
|
| return { ...request, messages: [memorySystemMessage, ...messages] };
|
| } else {
|
|
|
|
|
| const memoryUserMessage: ChatMessage = { role: "user", content: memoryText };
|
| log.info("memory.injection.injected", {
|
| count: memories.length,
|
| strategy: "user",
|
| model: request.model,
|
| });
|
| return { ...request, messages: [memoryUserMessage, ...messages] };
|
| }
|
| }
|
|
|
| |
| |
|
|
| export function shouldInjectMemory(request: ChatRequest, config?: { enabled?: boolean }): boolean {
|
| if (config?.enabled === false) return false;
|
| return Array.isArray(request.messages) && request.messages.length > 0;
|
| }
|
|
|