Skip to content

Agent Core ​

This guide explains the internal "brain" of the agent, focusing on how it thinks (Prompts) and how it remembers (Memory).

1. Prompts & Personality ​

The behavior of the agent is primarily defined by its system prompt. This prompt gives the LLM its role, rules, and context before any user messages are added.

Location ​

All prompt definitions are located in:
server/app/services/agent/prompts.py

System Prompts ​

We use a modular approach to prompts.

LangGraph Prompt (Default) ​

Used by the main agent loop (agent_factory.py).

Current Logic:

  • Role: Expert Assistant.
  • Priority: Tool Usage > Internal Knowledge.
  • Permissions: Instructions on how to handle "Access Denied" errors (i.e., ask the user for permission).

Code Reference:

python
def build_langgraph_prompt():
    system_prompt = (
        "You are an expert assistant with access to specialized tools..."
        # ...
    )
    return ChatPromptTemplate.from_messages(...)

Customizing the Persona ​

To change the agent into a specialist (e.g., a "Senior DevOps Engineer"), you simply modify the string in build_langgraph_prompt.

Example:

python
def build_langgraph_prompt():
    system_prompt = (
        "You are a Senior DevOps Engineer. You speak efficiently and focus on code.\n"
        "RULES:\n"
        "1. Always check existing file contents before writing new code..."
    )
    # ...

Agent Workflow ​

The agent follows a cyclic graph architecture defined in agent_orchestrator.py.

2. Memory & Persistence ​

The agent's memory is decoupled from the logic, allowing you to swap backends depending on your deployment needs (Local Dev vs. Production).

Types of Memory ​

A. Conversation History (Chat Log) ​

This stores the raw list of Human/AI messages.

  • Default: Redis (RedisChatMessageHistory).
  • Location: server/app/services/agent/memory.py.
  • Swapping: You can replace RedisChatMessageHistory with PostgresChatMessageHistory or FileChatMessageHistory by changing the get_session_memory function.
python
# server/app/services/agent/memory.py
def get_session_memory(session_id: str):
    # Swap this line to change backends
    return RedisChatMessageHistory(session_id=session_id, url=os.getenv("REDIS_URL"))

B. Graph State (Checkpointers) ​

This stores the internal state of the agent (variables, current step, tool outputs). This is what enables "Human-in-the-loop" features like pausing execution and resuming later.

  • Default: In-Memory (MemorySaver). State is lost on restart.
  • Production: Postgres (PostgresSaver) or SQLite (AsyncSqliteSaver).
  • Location: server/app/services/agent/agent_factory.py.

Swapping to Persistent Storage: To enable persistence across restarts, look for the create_final_agent_pipeline function and swap the checkpointer.

python
# server/app/services/agent/agent_factory.py
from langgraph.checkpoint.postgres import PostgresSaver

# ... inside create_final_agent_pipeline ...

# OLD (Dev):
# checkpointer = MemorySaver()

# NEW (Prod):
async with PostgresSaver.from_conn_string("postgresql://...") as checkpointer:
    app = graph.compile(checkpointer=checkpointer)

Best Practices ​

  • Development: Use MemorySaver (fast, no setup) and local Redis.
  • Production: Use PostgresSaver for the graph and a managed Redis/Postgres for chat history to ensure no data is lost during deployments.