wolf-of-nyc / knowledge_assistant.py
yetog's picture
Upload 21 files
f7892e5 verified
"""Knowledge assistant for intelligent content queries."""
from typing import List, Dict, Any, Tuple
from rag_services import rag_service
class KnowledgeAssistant:
"""Provides intelligent assistance based on the knowledge base."""
def __init__(self):
self.commands = {
"!search": self.search_knowledge,
"!characters": self.list_characters,
"!stories": self.list_stories,
"!world": self.list_world_elements,
"!analyze": self.analyze_content,
"!suggest": self.suggest_related,
"!consistency": self.check_consistency,
"!rebuild": self.rebuild_index
}
def process_query(self, query: str) -> str:
"""Process user queries and provide intelligent responses."""
query = query.strip()
# Check for commands
if query.startswith("!"):
command_parts = query.split(" ", 1)
command = command_parts[0]
args = command_parts[1] if len(command_parts) > 1 else ""
if command in self.commands:
return self.commands[command](args)
else:
return f"Unknown command: {command}\nAvailable commands: {', '.join(self.commands.keys())}"
# Regular search query
return self.search_knowledge(query)
def search_knowledge(self, query: str) -> str:
"""Search across all knowledge base content."""
if not query.strip():
return "Please provide a search query."
results = rag_service.search(query, k=5)
if not results:
return f"No results found for: {query}"
response = f"πŸ” SEARCH RESULTS FOR: '{query}'\n\n"
for i, result in enumerate(results, 1):
metadata = result['metadata']
content_type = metadata.get('content_type', 'content')
title = metadata.get('title', 'Unknown')
content = result['content'][:200] + "..." if len(result['content']) > 200 else result['content']
score = result['score']
response += f"{i}. {content_type.title()}: {title} (Relevance: {score:.2f})\n"
response += f" {content}\n\n"
return response
def list_characters(self, query: str = "") -> str:
"""List characters in the knowledge base."""
results = rag_service.search(query if query else "character", k=10, content_type="character")
if not results:
return "No characters found in knowledge base."
response = "πŸ‘₯ CHARACTERS IN KNOWLEDGE BASE:\n\n"
for result in results:
title = result['metadata'].get('title', 'Unknown')
content = result['content'][:150] + "..." if len(result['content']) > 150 else result['content']
response += f"β€’ {title}\n {content}\n\n"
return response
def list_stories(self, query: str = "") -> str:
"""List stories in the knowledge base."""
results = rag_service.search(query if query else "story", k=10, content_type="story")
if not results:
return "No stories found in knowledge base."
response = "πŸ“š STORIES IN KNOWLEDGE BASE:\n\n"
for result in results:
title = result['metadata'].get('title', 'Unknown')
content = result['content'][:150] + "..." if len(result['content']) > 150 else result['content']
response += f"β€’ {title}\n {content}\n\n"
return response
def list_world_elements(self, query: str = "") -> str:
"""List world elements in the knowledge base."""
results = rag_service.search(query if query else "world", k=10, content_type="world_element")
if not results:
return "No world elements found in knowledge base."
response = "🌍 WORLD ELEMENTS IN KNOWLEDGE BASE:\n\n"
for result in results:
title = result['metadata'].get('title', 'Unknown')
content = result['content'][:150] + "..." if len(result['content']) > 150 else result['content']
response += f"β€’ {title}\n {content}\n\n"
return response
def analyze_content(self, content: str) -> str:
"""Analyze provided content against the knowledge base."""
if not content.strip():
return "Please provide content to analyze."
# Find related content
results = rag_service.search(content, k=5)
response = "πŸ“Š CONTENT ANALYSIS:\n\n"
if results:
response += "Related content found:\n"
for result in results:
metadata = result['metadata']
content_type = metadata.get('content_type', 'content')
title = metadata.get('title', 'Unknown')
score = result['score']
response += f"β€’ {content_type.title()}: {title} (Similarity: {score:.2f})\n"
else:
response += "No related content found in knowledge base."
return response
def suggest_related(self, content: str) -> str:
"""Suggest related content based on input."""
if not content.strip():
return "Please provide content for suggestions."
# Get diverse suggestions
char_results = rag_service.search(content, k=2, content_type="character")
story_results = rag_service.search(content, k=2, content_type="story")
world_results = rag_service.search(content, k=2, content_type="world_element")
response = "πŸ’‘ SUGGESTIONS BASED ON YOUR CONTENT:\n\n"
if char_results:
response += "Relevant Characters:\n"
for result in char_results:
title = result['metadata'].get('title', 'Unknown')
response += f"β€’ {title}\n"
response += "\n"
if story_results:
response += "Related Stories:\n"
for result in story_results:
title = result['metadata'].get('title', 'Unknown')
response += f"β€’ {title}\n"
response += "\n"
if world_results:
response += "Relevant World Elements:\n"
for result in world_results:
title = result['metadata'].get('title', 'Unknown')
response += f"β€’ {title}\n"
response += "\n"
if not any([char_results, story_results, world_results]):
response += "No related content found in knowledge base."
return response
def check_consistency(self, content: str) -> str:
"""Check content consistency against knowledge base."""
if not content.strip():
return "Please provide content to check for consistency."
from langchain_tools import context_enhancer
analysis = context_enhancer.analyze_character_consistency(content)
response = "βœ… CONSISTENCY CHECK:\n\n"
response += analysis
return response
def rebuild_index(self, args: str = "") -> str:
"""Rebuild the vector index from current data."""
try:
rag_service.rebuild_index_from_projects()
return "βœ… Knowledge base index rebuilt successfully!"
except Exception as e:
return f"❌ Error rebuilding index: {str(e)}"
# Global assistant instance
knowledge_assistant = KnowledgeAssistant()