Egregore’s messaging system provides universal message handling through ProviderThread containers and ContentBlocks. This architecture enables seamless communication with 30+ AI providers using a single, consistent interface.
A ProviderThread is a container that organizes messages into three categories:
SystemHeader - System instructions and configuration
ProviderResponse - AI model responses
ClientRequest - User messages
Copy
from egregore import Agentagent = Agent(provider="openai:gpt-4")agent.call("Hello!")# Access the threadthread = agent.thread.current# Three message categoriesprint(thread.system_header) # System instructionsprint(thread.provider_responses) # AI responsesprint(thread.client_requests) # User messagesprint(thread.all_messages) # All messages in order
ProviderThread automatically formats messages for any provider. You work with a universal structure, and Egregore handles provider-specific conversion.
agent = Agent( provider="openai:gpt-4", system_prompt="You are a helpful Python expert.")# Access system headerheader = agent.thread.current.system_headerprint(header.content) # TextContent with system prompt
agent = Agent(provider="openai:gpt-4")agent.call("What's the weather?")# Access user messagesrequests = agent.thread.current.client_requestsfor req in requests: print(f"User: {req.content.text}")
agent = Agent(provider="openai:gpt-4")response = agent.call("Tell me a joke")# Access AI responsesresponses = agent.thread.current.provider_responsesfor resp in responses: print(f"AI: {resp.content.text}")
from egregore.core.messaging.content_blocks import ImageContent# From fileimage = ImageContent.from_file("photo.jpg")# From URLimage = ImageContent.from_url("https://example.com/image.png")# From base64image = ImageContent.from_base64(base64_data, mime_type="image/jpeg")
agent = Agent(provider="openai:gpt-4")# User message → ClientRequestagent.call("Hello!")# Flow:# 1. ClientRequest created with TextContent("Hello!")# 2. Added to ProviderThread# 3. Thread formatted for OpenAI# 4. Sent to provider# 5. ProviderResponse created with AI's reply# 6. Added to ProviderThread# 7. Response returned to user
from egregore.core.messaging.content_blocks import ImageContentagent = Agent(provider="openai:gpt-4")# Create multimodal messageimage = ImageContent.from_file("diagram.png")agent.call([ TextContent(text="What does this diagram show?"), image])# Flow:# 1. ClientRequest with [TextContent, ImageContent]# 2. Thread formats for provider (different formats for OpenAI vs Anthropic)# 3. Provider processes multimodal input# 4. ProviderResponse with text analysis
# Same code works for all providersagent = Agent(provider="openai:gpt-4")agent.call("Hello")agent = Agent(provider="anthropic:claude-3-5-sonnet-20241022")agent.call("Hello")agent = Agent(provider="google:gemini-pro")agent.call("Hello")# ProviderThread formats messages correctly for each provider
agent = Agent( provider="openai:gpt-4", system_prompt="You are a helpful assistant.")# Multi-turn conversationagent.call("My name is Alice")agent.call("What's my name?") # Agent remembers: "Alice"# Thread maintains full historythread = agent.thread.currentprint(f"Conversation has {len(thread.all_messages)} messages")
agent = Agent(provider="openai:gpt-4")# Send image with questionimage = ImageContent.from_file("sales_chart.png")response = agent.call([ TextContent(text="What insights can you draw from this chart?"), image])print(response) # AI analyzes the chart
# Current message at d0,0,0current_msg = agent.context["d0, 0, 0"]# Previous message at d1,0,0 (pushed back by ODI)prev_msg = agent.context["d1, 0, 0"]# Messages participate in ODI automaticallyagent.call("New message")# Previous messages shift: (0,0,0) → (1,0,0) → (2,0,0)
from egregore.core.context_management.pact.components import TextContent# Add metadata to current messagemetadata = TextContent( content="Important: user question about pricing", key="message_metadata")agent.context.pact_insert("d0, 1, 0", metadata)# Metadata follows message through ODI# When message moves to (1,0,0), metadata moves to (1,1,0)