Skip to main content
Glama
orneryd

M.I.M.I.R - Multi-agent Intelligent Memory & Insight Repository

by orneryd
CONVERSATION_PERSISTENCE_IMPLEMENTATION.md9.08 kB
# Conversation Persistence Implementation Summary ## ✅ Completed ### 1. ConversationHistoryManager (`src/orchestrator/ConversationHistoryManager.ts`) **Full implementation of Option 4 (Embeddings + Retrieval):** - ✅ Message storage with automatic embedding generation - ✅ Vector similarity search for relevant past messages - ✅ Session-based conversation management - ✅ Smart context assembly (system + retrieved + recent + new) - ✅ Neo4j vector index creation - ✅ Session statistics and cleanup methods **Key Methods:** ```typescript // Store messages await conversationHistory.storeMessage(sessionId, 'user', content); await conversationHistory.storeConversationTurn(sessionId, userMsg, assistantMsg); // Retrieve messages await conversationHistory.getRecentMessages(sessionId, 10); await conversationHistory.retrieveRelevantMessages(sessionId, query, 10, 0.70, 5); // Build full context await conversationHistory.buildConversationContext(sessionId, systemPrompt, query); // Session management await conversationHistory.getSessionStats(sessionId); await conversationHistory.clearSession(sessionId); ``` ### 2. CopilotAgentClient Integration (`src/orchestrator/llm-client.ts`) **Integrated conversation history with LLM client:** - ✅ Added imports for `ConversationHistoryManager` and `neo4j` - ✅ Added private properties: `conversationHistory` and `neo4jDriver` - ✅ Added `initializeConversationHistory()` method - ✅ Updated `execute()` signature to accept optional `sessionId` parameter - ✅ Updated `executeInternal()` to build conversation context before execution - ✅ Added automatic conversation storage after successful execution - ✅ Works for both direct LLM mode and agent mode **Usage:** ```typescript const agent = new CopilotAgentClient({ preamblePath: 'docs/agents/claudette-mimir-v2.md', model: 'gpt-4', temperature: 0.0 }); await agent.loadPreamble('docs/agents/claudette-mimir-v2.md'); await agent.initializeConversationHistory(); // Enable persistence // Execute with session ID to enable persistence const result = await agent.execute( 'Your task here', 0, // retryCount undefined, // circuitBreakerLimit 'session-123' // sessionId enables persistence ); ``` ### 3. Documentation - ✅ `docs/guides/CONVERSATION_PERSISTENCE_GUIDE.md` - Complete usage guide - ✅ This implementation summary document ### 4. Build Verification - ✅ TypeScript compilation successful - ✅ No linter errors - ✅ All imports resolved ## Tool Registration Verification ### Tools Are Properly Configured ✅ **Checked:** 1. ✅ `webSearchTool` is defined in `src/orchestrator/tools.ts` 2. ✅ Included in `fileSystemTools` array 3. ✅ `consolidatedTools` includes all `fileSystemTools` 4. ✅ Agent class constructor uses `consolidatedTools` by default 5. ✅ Tools are passed to `createReactAgent()` correctly 6. ✅ Tools count is logged at initialization **Tool List in consolidatedTools (14 tools):** 1. `run_terminal_cmd` 2. `read_file` 3. `write` 4. `search_replace` 5. `list_dir` 6. `grep` 7. `delete_file` 8. `web_search` ← **Available** 9. `memory_node` (MCP) 10. `memory_edge` (MCP) 11. `memory_batch` (MCP) 12. `get_task_context` (MCP) 13. `vector_search_nodes` (MCP) 14. `todo` (MCP) ### Added Debugging Added debug logging to help diagnose tool calling issues: ```typescript // Shows all tools registered with agent console.log(`🔧 Agent initialized with ${this.tools.length} tools: ${this.tools.map(t => t.name).join(', ')}`); // Shows if any tool calls were detected console.log(`🔍 Debug: ${detectedToolCalls.length} tool calls detected in response`); ``` ## Testing the Implementation ### Test Conversation Persistence ```typescript // test-conversation-persistence.ts import { CopilotAgentClient } from './src/orchestrator/llm-client.js'; async function testConversationPersistence() { const agent = new CopilotAgentClient({ preamblePath: 'docs/agents/claudette-mimir-v2.md', model: 'gpt-4', temperature: 0.0 }); await agent.loadPreamble('docs/agents/claudette-mimir-v2.md'); await agent.initializeConversationHistory(); const sessionId = 'test-session-' + Date.now(); // First message console.log('\n=== First Message ==='); const result1 = await agent.execute( 'I am building a React app with TypeScript and PostgreSQL', 0, undefined, sessionId ); console.log('Response:', result1.output.substring(0, 200)); // Second message - should retrieve context from first console.log('\n=== Second Message ==='); const result2 = await agent.execute( 'What database am I using?', 0, undefined, sessionId ); console.log('Response:', result2.output); // Check stats const stats = await agent.conversationHistory.getSessionStats(sessionId); console.log('\n=== Session Stats ==='); console.log(stats); // Cleanup await agent.conversationHistory.clearSession(sessionId); } testConversationPersistence().catch(console.error); ``` ### Test Tool Calling ```typescript // test-tool-calling.ts import { CopilotAgentClient } from './src/orchestrator/llm-client.js'; async function testToolCalling() { const agent = new CopilotAgentClient({ preamblePath: 'docs/agents/claudette-mimir-v2.md', model: 'gpt-4', // Try different models temperature: 0.0 }); await agent.loadPreamble('docs/agents/claudette-mimir-v2.md'); console.log('\n=== Testing Tool Calling ==='); const result = await agent.execute( 'Use the web_search tool to search for "LangGraph documentation"', 0 ); console.log('\nTool Calls:', result.toolCalls); console.log('Output:', result.output.substring(0, 500)); } testToolCalling().catch(console.error); ``` ## Next Steps for Tool Calling Issue The tool registration is **correct**. The issue is likely one of these: ### 1. Model Doesn't Support Function Calling Well **Problem:** Some models (especially smaller ones) don't generate proper function calls. **Check:** ```bash # What model is being used? grep -r "model:" llmconfig.json ``` **Solution:** - Use a model known for good function calling: `gpt-4`, `gpt-3.5-turbo`, `claude-3-*` - Avoid: TinyLlama, Phi, small Mistral variants ### 2. Model Is Generating Plans Instead of Actions **Problem:** The agent is trained to "think before acting" and gets stuck in planning mode. **Symptoms:** - Outputs like "I'll start by...", "Sub-steps:", "Now searching..." - No actual tool calls in the response **Solution:** Add to system prompt: ```markdown **CRITICAL - IMMEDIATE TOOL EXECUTION:** When you decide to use a tool, IMMEDIATELY invoke it. Do NOT announce what you will do. NEVER write "I'll search..." or "Now I will..." - just invoke the tool directly. WRONG: "I'll start by searching the web..." RIGHT: [immediately calls web_search tool] ``` ### 3. LangGraph Not Receiving Tool Definitions **Check:** Look at the debug output for: ``` 🔧 Agent initialized with 14 tools: run_terminal_cmd, read_file, write, search_replace, list_dir, grep, delete_file, web_search, memory_node, memory_edge, memory_batch, get_task_context, vector_search_nodes, todo 🔍 Debug: 0 tool calls detected in response ``` If you see "0 tool calls" every time, the LLM isn't generating tool calls. ### 4. Tool Schema Issues **Check:** ```typescript // In src/orchestrator/tools.ts console.log('web_search schema:', JSON.stringify(webSearchTool.schema, null, 2)); ``` The schema should be valid JSON Schema format that LangChain can convert to function calling format. ## Recommended Debugging Steps 1. **Check Model:** ```bash # In your pipeline Check which model is actually being used ``` 2. **Test with Known-Good Model:** ```typescript // Use GPT-4 which definitely supports function calling const agent = new CopilotAgentClient({ preamblePath: 'docs/agents/claudette-mimir-v2.md', model: 'gpt-4', provider: LLMProvider.COPILOT, temperature: 0.0 }); ``` 3. **Add Explicit Tool Instruction:** Modify system prompt to be more explicit about tool usage. 4. **Check Tool Call Format:** Add logging to see what the LLM is actually generating: ```typescript // After agent.invoke console.log('Raw messages:', JSON.stringify(result.messages, null, 2)); ``` ## Environment Variables Needed ```bash # For conversation persistence NEO4J_URI=bolt://localhost:7687 NEO4J_USER=neo4j NEO4J_PASSWORD=yourpassword # For embeddings (if using Ollama) # Configure in llmconfig.json: { "embeddings": { "enabled": true, "provider": "ollama", "model": "nomic-embed-text", "dimensions": 768, "baseUrl": "http://localhost:11434" } } ``` ## Summary ✅ **Conversation Persistence:** Fully implemented and integrated ✅ **Tool Registration:** Verified correct, tools are available ❓ **Tool Calling Issue:** Likely a model capability or prompting issue, not a code issue The implementation is complete. The tool calling issue needs investigation at the **model/prompt level**, not the code level.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/orneryd/Mimir'

If you have feedback or need assistance with the MCP directory API, please join our Discord server