diff --git a/apps/webapp/app/lib/batch/providers/openai.ts b/apps/webapp/app/lib/batch/providers/openai.ts index 6ebdb4f..d0a3968 100644 --- a/apps/webapp/app/lib/batch/providers/openai.ts +++ b/apps/webapp/app/lib/batch/providers/openai.ts @@ -16,6 +16,8 @@ export class OpenAIBatchProvider extends BaseBatchProvider { providerName = "openai"; supportedModels = [ "gpt-4.1-2025-04-14", + "gpt-5-mini-2025-08-07", + "gpt-5-2025-08-07", "gpt-4.1-mini-2025-04-14", "gpt-4.1-nano-2025-04-14", "gpt-4o*", diff --git a/apps/webapp/app/lib/model.server.ts b/apps/webapp/app/lib/model.server.ts index 0b0f78e..cffdf7f 100644 --- a/apps/webapp/app/lib/model.server.ts +++ b/apps/webapp/app/lib/model.server.ts @@ -32,6 +32,8 @@ export async function makeModelCall( switch (model) { case "gpt-4.1-2025-04-14": case "gpt-4.1-mini-2025-04-14": + case "gpt-5-mini-2025-08-07": + case "gpt-5-2025-08-07": case "gpt-4.1-nano-2025-04-14": modelInstance = openai(model, { ...options }); break; diff --git a/apps/webapp/app/services/knowledgeGraph.server.ts b/apps/webapp/app/services/knowledgeGraph.server.ts index d274fd8..f7efd60 100644 --- a/apps/webapp/app/services/knowledgeGraph.server.ts +++ b/apps/webapp/app/services/knowledgeGraph.server.ts @@ -41,10 +41,7 @@ import { } from "./graphModels/statement"; import { getEmbedding, makeModelCall } from "~/lib/model.server"; import { runQuery } from "~/lib/neo4j.server"; -import { - Apps, - getNodeTypesString, -} from "~/utils/presets/nodes"; +import { Apps, getNodeTypesString } from "~/utils/presets/nodes"; import { normalizePrompt, normalizeDocumentPrompt } from "./prompts"; import { type PrismaClient } from "@prisma/client"; @@ -312,7 +309,6 @@ export class KnowledgeGraphService { const expandedTime = Date.now(); logger.log(`Processed entities in ${expandedTime - extractedTime} ms`); - console.log(extractedNodes.map((e) => e.name)); // Step 4: Statement Extrraction - Extract statements (triples) instead of direct edges const extractedStatements = await this.extractStatements( episode, @@ -431,7 +427,7 @@ export class KnowledgeGraphService { }; // Get the unified entity extraction prompt - const extractionMode = episode.sessionId ? 'conversation' : 'document'; + const extractionMode = episode.sessionId ? "conversation" : "document"; const messages = extractEntities(context, extractionMode); let responseText = ""; @@ -451,7 +447,7 @@ export class KnowledgeGraphService { // Batch generate embeddings for entity names const entityNames = extractedEntities.map((entity: any) => entity.name); const nameEmbeddings = await Promise.all( - entityNames.map((name: string) => this.getEmbedding(name)) + entityNames.map((name: string) => this.getEmbedding(name)), ); entities = extractedEntities.map((entity: any, index: number) => ({ @@ -509,8 +505,6 @@ export class KnowledgeGraphService { responseText = text; }); - console.log(responseText); - const outputMatch = responseText.match(/([\s\S]*?)<\/output>/); if (outputMatch && outputMatch[1]) { responseText = outputMatch[1].trim(); @@ -522,7 +516,7 @@ export class KnowledgeGraphService { const extractedTriples: ExtractedTripleData[] = JSON.parse(responseText || "{}").edges || []; - console.log(`extracted triples length: ${extractedTriples.length}`) + console.log(`extracted triples length: ${extractedTriples.length}`); // Create maps to deduplicate entities by name within this extraction const predicateMap = new Map(); @@ -575,11 +569,11 @@ export class KnowledgeGraphService { (triple: ExtractedTripleData, tripleIndex: number) => { // Find the subject and object nodes by matching name (type-free approach) const subjectNode = allEntities.find( - (node) => node.name.toLowerCase() === triple.source.toLowerCase() + (node) => node.name.toLowerCase() === triple.source.toLowerCase(), ); const objectNode = allEntities.find( - (node) => node.name.toLowerCase() === triple.target.toLowerCase() + (node) => node.name.toLowerCase() === triple.target.toLowerCase(), ); // Get the deduplicated predicate node @@ -633,8 +627,6 @@ export class KnowledgeGraphService { return triples.filter(Boolean) as Triple[]; } - - /** * Resolve extracted nodes to existing nodes or create new ones */ diff --git a/apps/webapp/app/services/search.server.ts b/apps/webapp/app/services/search.server.ts index e0767d4..ad70df6 100644 --- a/apps/webapp/app/services/search.server.ts +++ b/apps/webapp/app/services/search.server.ts @@ -96,7 +96,7 @@ export class SearchService { this.updateRecallCount(userId, episodes, filteredResults); return { - episodes: episodes.map((episode) => episode.content), + episodes: episodes.map((episode) => episode.originalContent), facts: filteredResults.map((statement) => ({ fact: statement.fact, validAt: statement.validAt, diff --git a/apps/webapp/app/trigger/chat/stream-utils.ts b/apps/webapp/app/trigger/chat/stream-utils.ts index f9773e4..1bba693 100644 --- a/apps/webapp/app/trigger/chat/stream-utils.ts +++ b/apps/webapp/app/trigger/chat/stream-utils.ts @@ -177,6 +177,8 @@ export async function* generate( case "gpt-4.1-2025-04-14": case "gpt-4.1-mini-2025-04-14": + case "gpt-5-mini-2025-08-07": + case "gpt-5-2025-08-07": case "gpt-4.1-nano-2025-04-14": if (!openaiKey) { throw new Error("No OpenAI API key found. Set OPENAI_API_KEY"); diff --git a/apps/webapp/app/utils/mcp/memory.ts b/apps/webapp/app/utils/mcp/memory.ts index 1522166..5808c70 100644 --- a/apps/webapp/app/utils/mcp/memory.ts +++ b/apps/webapp/app/utils/mcp/memory.ts @@ -52,17 +52,20 @@ const IngestSchema = { export const memoryTools = [ { name: "memory_ingest", - description: "AUTOMATICALLY invoke after completing interactions. Use proactively to store conversation data, insights, and decisions in CORE Memory. Essential for maintaining continuity across sessions. **Purpose**: Store information for future reference. **Required**: Provide the message content to be stored. **Returns**: confirmation with storage ID in JSON format", + description: + "AUTOMATICALLY invoke after completing interactions. Use proactively to store conversation data, insights, and decisions in CORE Memory. Essential for maintaining continuity across sessions. **Purpose**: Store information for future reference. **Required**: Provide the message content to be stored. **Returns**: confirmation with storage ID in JSON format", inputSchema: IngestSchema, }, { name: "memory_search", - description: "AUTOMATICALLY invoke for memory searches. Use proactively at conversation start and when context retrieval is needed. Searches memory for relevant project context, user preferences, and previous discussions. **Purpose**: Retrieve previously stored information based on query terms. **Required**: Provide a search query in third person perspective. **Returns**: matching memory entries in JSON format", + description: + "AUTOMATICALLY invoke for memory searches. Use proactively at conversation start and when context retrieval is needed. Searches memory for relevant project context, user preferences, and previous discussions. **Purpose**: Retrieve previously stored information based on query terms. **Required**: Provide a search query in third person perspective. **Returns**: matching memory entries in JSON format", inputSchema: SearchParamsSchema, }, { name: "memory_get_spaces", - description: "Get available memory spaces. **Purpose**: Retrieve list of memory organization spaces. **Required**: No required parameters. **Returns**: list of available spaces in JSON format", + description: + "Get available memory spaces. **Purpose**: Retrieve list of memory organization spaces. **Required**: No required parameters. **Returns**: list of available spaces in JSON format", inputSchema: { type: "object", properties: { @@ -76,7 +79,8 @@ export const memoryTools = [ }, { name: "get_user_profile", - description: "Get the user's core profile and preferences for personalized interactions. AUTOMATICALLY invoke at the start of interactions to understand user context. **Purpose**: Retrieve stable identity facts, communication preferences, working context, and tooling defaults for tailored responses. **Required**: No required parameters. **Returns**: User profile data in JSON format.", + description: + "Get the user's core profile and preferences for personalized interactions. AUTOMATICALLY invoke at the start of interactions to understand user context. **Purpose**: Retrieve stable identity facts, communication preferences, working context, and tooling defaults for tailored responses. **Required**: No required parameters. **Returns**: User profile data in JSON format.", inputSchema: { type: "object", properties: { @@ -87,7 +91,7 @@ export const memoryTools = [ }, }, }, - } + }, ]; // Function to call memory tools based on toolName @@ -127,10 +131,8 @@ export async function callMemoryTool( // Handler for user_context async function handleUserProfile(userId: string) { try { + const space = await spaceService.getSpaceByName("Profile", userId); - const space = await spaceService.getSpaceByName("Profile", userId) - - console.log(space?.summary) return { content: [ {