mirror of
https://github.com/kennethreitz/simplemind.git
synced 2026-06-05 06:46:18 +00:00
Refactor discussion.py to add MultiAIConversation class for orchestrating conversations between multiple AI models
This commit is contained in:
@@ -0,0 +1,138 @@
|
||||
import time
|
||||
from typing import List, Tuple
|
||||
|
||||
from rich.console import Console
|
||||
from rich.markdown import Markdown
|
||||
|
||||
from _context import sm
|
||||
|
||||
|
||||
class MultiAIConversation:
|
||||
"""Orchestrates conversations between multiple AI models."""
|
||||
|
||||
MODEL_SESSIONS = {
|
||||
"Llama3.2": sm.Session(
|
||||
llm_provider="ollama",
|
||||
llm_model="llama3.2",
|
||||
),
|
||||
"Claude-3.5-Sonnet": sm.Session(
|
||||
llm_provider="anthropic",
|
||||
llm_model="claude-3-5-sonnet-20241022",
|
||||
),
|
||||
"GPT-4o": sm.Session(
|
||||
llm_provider="openai",
|
||||
llm_model="gpt-4o",
|
||||
),
|
||||
"Grok-Beta": sm.Session(
|
||||
llm_provider="xai",
|
||||
llm_model="grok-beta",
|
||||
),
|
||||
}
|
||||
|
||||
def __init__(self, topic: str, turns_per_model: int = 1, max_rounds: int = 5):
|
||||
|
||||
self.topic = topic
|
||||
self.turns_per_model = turns_per_model
|
||||
self.max_rounds = max_rounds
|
||||
self.conversation_history: List[Tuple[str, str]] = []
|
||||
self.console = Console()
|
||||
|
||||
def _format_system_prompt(self, ai_name: str) -> str:
|
||||
"""Creates a system prompt for each AI model."""
|
||||
return f"""You are {ai_name}. You are participating in a thoughtful discussion with other AI models about {self.topic}.
|
||||
|
||||
Rules:
|
||||
1. Be concise but insightful (keep responses under 100 words)
|
||||
2. Build upon previous points made in the conversation
|
||||
3. Ask questions to deepen the discussion when appropriate
|
||||
4. Stay on topic while maintaining your unique perspective
|
||||
5. Be respectful of other viewpoints while maintaining your distinct voice
|
||||
|
||||
Current discussion topic: {self.topic}"""
|
||||
|
||||
def _create_conversation(
|
||||
self, session: sm.Session, ai_name: str
|
||||
) -> sm.Conversation:
|
||||
"""Creates a new conversation with appropriate context for an AI model."""
|
||||
conv = session.create_conversation()
|
||||
|
||||
# Add system prompt
|
||||
conv.add_message(role="user", text=self._format_system_prompt(ai_name))
|
||||
|
||||
# Add conversation history
|
||||
for speaker, message in self.conversation_history[-3:]: # Last 3 messages
|
||||
conv.add_message(role="user", text=f"{speaker} said: {message}")
|
||||
|
||||
return conv
|
||||
|
||||
def _print_response(self, ai_name: str, response: str):
|
||||
"""Pretty prints an AI response using Rich."""
|
||||
self.console.print(f"\n[bold blue]{ai_name}[/bold blue]:")
|
||||
self.console.print(Markdown(response))
|
||||
# Store in history
|
||||
self.conversation_history.append((ai_name, response))
|
||||
|
||||
def run_conversation(self):
|
||||
"""Runs the multi-AI conversation."""
|
||||
|
||||
# Initialize the conversation
|
||||
initial_prompt = (
|
||||
f"Let's have a thoughtful discussion about {self.topic}. "
|
||||
"Please share your initial thoughts in 2-3 sentences."
|
||||
)
|
||||
|
||||
for round_num in range(self.max_rounds):
|
||||
self.console.print(f"\n[bold green]Round {round_num + 1}[/bold green]")
|
||||
|
||||
for model_name, session in self.MODEL_SESSIONS.items():
|
||||
for turn in range(self.turns_per_model):
|
||||
conversation = self._create_conversation(session, model_name)
|
||||
|
||||
# Add the prompt
|
||||
prompt = (
|
||||
initial_prompt
|
||||
if round_num == 0 and turn == 0
|
||||
else (
|
||||
f"Continue the discussion about {self.topic}, "
|
||||
"responding to the previous points made."
|
||||
)
|
||||
)
|
||||
|
||||
conversation.add_message(role="user", text=prompt)
|
||||
|
||||
# Get and print response
|
||||
response = conversation.send()
|
||||
self._print_response(model_name, response.text)
|
||||
|
||||
# Small delay to prevent rate limiting
|
||||
time.sleep(1)
|
||||
|
||||
# Optional: Add a separator between rounds
|
||||
self.console.print("\n" + "-" * 50)
|
||||
|
||||
|
||||
def have_ai_discussion(topic: str, turns_per_model: int = 1, max_rounds: int = 3):
|
||||
"""Convenience function to start an AI discussion."""
|
||||
debate = MultiAIConversation(
|
||||
topic=topic, turns_per_model=turns_per_model, max_rounds=max_rounds
|
||||
)
|
||||
|
||||
print(f"\nStarting AI discussion on: {topic}")
|
||||
print("=" * 50)
|
||||
|
||||
debate.run_conversation()
|
||||
|
||||
|
||||
# Example usage
|
||||
if __name__ == "__main__":
|
||||
# Example topics
|
||||
topics = [
|
||||
"The future of human-AI collaboration in creative fields",
|
||||
"The role of consciousness in artificial intelligence",
|
||||
"The balance between AI advancement and ethical considerations",
|
||||
"The impact of AI on human relationships and communication",
|
||||
"The potential for AI to help solve climate change",
|
||||
]
|
||||
|
||||
# Run a discussion on the first topic
|
||||
have_ai_discussion(topic=topics[0], turns_per_model=1, max_rounds=3)
|
||||
Reference in New Issue
Block a user