Agents with Memory¶
By default, each request is independent — the agent doesn’t remember previous messages. Memory fixes that.
How it works¶
ABI-Core uses thread_id in invoke() to maintain conversation history. The LLM sees all previous messages in the same thread.
from abi_core.agent.llm_provider import invoke
# First message
result = await invoke(config.LLM_CONFIG, "My name is Ana", thread_id="session-001")
# Second message — the LLM remembers "Ana"
result = await invoke(config.LLM_CONFIG, "What's my name?", thread_id="session-001")
# → "Your name is Ana"
Add memory to your agent¶
The key is passing context_id as the thread_id. Edit your step:
@agent.step(name="chat_with_memory")
async def chat_with_memory(text, context_id):
"""Respond with conversation memory."""
from abi_core.agent.llm_provider import invoke
from prompts import CHAT_PROMPT
result = await invoke(
config.LLM_CONFIG,
CHAT_PROMPT.format(text=text),
thread_id=context_id, # This enables memory
)
return {"response": result}
And your task passes the context_id through:
@agent.task(name="chat", task_id="task-chat")
async def chat(query):
data = json.loads(query) if isinstance(query, str) else query
text = data.get("text", "")
context_id = data.get("context_id", "default")
result = await agent.execute_step(
"chat_with_memory", text=text, context_id=context_id
)
yield AgentResponse.result(result)
Test it¶
# First message
curl -X POST http://localhost:8002/stream \
-H "Content-Type: application/json" \
-d '{"query": "My name is Carlos", "context_id": "session-42"}'
# Second message — same context_id
curl -X POST http://localhost:8002/stream \
-H "Content-Type: application/json" \
-d '{"query": "What is my name?", "context_id": "session-42"}'
# → "Your name is Carlos"
How context_id works¶
Same
context_id= same conversation (agent remembers)Different
context_id= fresh conversation (no memory)The web interface generates a
context_idper session automatically
Memory is in-process¶
The default memory (LangGraph MemorySaver) lives in the agent’s process memory. If the container restarts, memory is lost. For persistent memory, store conversations in the Semantic Layer using MCPToolkit.