Our system was a powerful and autonomous engine, but its interface was still rudimentary. Users could see goals and deliverables, but interaction was limited. To fully realize our vision of a "digital colleagues team", we needed to give users a way to dialogue with the system naturally.
We didn't want a simple chatbot. We wanted a true Conversational Project Manager, an interface capable of understanding user requests in the project context and translating them into concrete actions.
The question was: where should we place this conversational capability? We had several options:
Option C was the clear winner. By treating conversation as a specialized skill requiring its own agent, we maintained consistency with our architectural philosophy while gaining several key benefits:
💡 Why a Dedicated Conversational Agent?
1. Specialization: Conversation requires unique skills (context management, intent recognition, natural language understanding)
2. State Management: Unlike stateless task agents, conversations need persistent memory and context
3. Tool Orchestration: The conversational agent acts as a conductor, deciding which specialized tools to use based on user intent
4. Consistent Architecture: Follows our "agent for every specialized capability" pattern
Instead of adding scattered chat logic in our endpoints, we followed our specialization pattern and created a new fixed agent: the SimpleConversationalAgent
.
Reference code: backend/agents/conversational.py
(hypothetical)
This agent is unique for two reasons:
Session
primitive.Conversation Flow:
To make the conversational interface truly effective, we implemented a dual-chat architecture that reflects the different types of interactions users need with the system:
🔧 Fixed Chats (System Management)
These are persistent, specialized chats for specific system aspects:
Each fixed chat maintains long-term context and specialized knowledge about its domain.
🎯 Dynamic Chats (Goal Management)
These are created on-demand for specific goals or projects:
This architecture allows users to seamlessly switch between managing the system (fixed chats) and driving project outcomes (dynamic chats), each with appropriate context and capabilities.
To accelerate expert user workflows, we implemented a slash command system that provides rapid access to common tools and information. Users can type /
to see available commands:
Command | Description | Use Case |
---|---|---|
/show_project_status |
📊 View Project Status | Get comprehensive project overview and metrics |
/show_team_status |
👥 View Team Status | See current team composition and activities |
/show_goal_progress |
🎯 View Goal Progress | Check progress on specific objectives |
/show_deliverables |
📦 View Deliverables | See completed deliverables and assets |
/approve_all_feedback |
✅ Approve All Feedback | Bulk approve pending feedback requests |
/add_team_member |
➕ Add Team Member | Add new member with specific role and skills |
/create_goal |
🎯 Create Goal | Define new project objectives |
/fix_workspace_issues |
🔧 Fix Workspace Issues | Restart failed tasks and resolve issues |
These commands transform natural language requests into precise tool calls, dramatically reducing the cognitive load for frequent operations.
While conversation is powerful, some interactions are better handled through structured interfaces. We developed a set of standard artifacts that users can access through conversation or directly through the UI:
🎭 Team Management Artifacts
AgentSkillRadarChart
component🎯 Project Orchestration Artifacts
🛠️ Tools & Integrations Artifacts
✅ Quality Assurance Artifacts
Each artifact is designed to be both standalone (accessible via direct URL) and conversationally integrated (can be requested through chat).
One of the biggest challenges was how to allow the conversational agent to perform actions (like modifying the budget) without tightly coupling it to database logic.
The solution was to create an agnostic Service Layer.
Reference code: backend/services/workspace_service.py
(hypothetical)
We created an interface (WorkspaceServiceInterface
) that defines high-level business actions (e.g., update_budget
, add_agent_to_team
). Then, we created a concrete implementation of this interface for Supabase (SupabaseWorkspaceService
).
The conversational agent knows nothing about Supabase. It simply calls workspace_service.update_budget(...)
. This respects Pillar #14 (Modular Tool/Service-Layer) and would allow us in the future to change databases by modifying only one class, without touching the agent logic.
Our early chat versions were frustrating. The user asked: "What's the project status?", the AI responded. Then the user asked: "And what are the risks?", and the AI responded: "Which project?". The conversation had no memory.
Disaster Logbook (July 29):
USER: "Show me the team members."
AI: "Sure, the team consists of Marco, Elena and Sara."
USER: "OK, add a QA Specialist."
AI: "Which team do you want to add them to?"
The Lesson Learned: Context is Everything.
A conversation without context is not a conversation, it's a series of isolated exchanges. The solution was to implement a robust Context Management Pipeline.
This transformed our chat from a simple command interface to a true intelligent and contextual dialogue.
✓ Treat Chat as an Agent, Not an Endpoint: A robust conversational interface requires a dedicated agent that handles state, intent, and tool orchestration.
✓ Decouple Actions from Business Logic: Use a Service Layer to prevent your conversational agents from being tightly coupled to your database implementation.
✓ Context is King of Conversation: Invest time in creating a solid context management pipeline. It's the difference between a frustrating chatbot and an intelligent assistant.
✓ Design for Long and Short-Term Memory: Use the SDK's Session
for short-term memory (current conversation) and your WorkspaceMemory
for long-term knowledge.
Chapter Conclusion
With an intelligent conversational interface, we finally had an intuitive way for users to interact with our system's power. But it wasn't enough. To truly gain user trust, we needed to take one more step: we had to open the "black box" and show them how the AI reached its conclusions. It was time to implement Deep Reasoning.