DeltaKitDeltaKit
Agno Agents

Load Chat History

Recipe for loading previous conversations from Agno agent backend.

This recipe shows how to load existing conversations when using Agno agent framework on your backend. You'll fetch history from the API, convert the format using fromAgnoAgents, and initialize the chat.

Problem

Agno stores conversation history in its own format with fields like reasoning_content, tool_calls, and tool_name. You need to:

  • Fetch conversation history from your API
  • Handle loading states gracefully
  • Convert between different message formats
  • Initialize the chat with the loaded messages

Solution

Use fromAgnoAgents to convert Agno session messages into DeltaKit messages.

Frontend Implementation

import { fromAgnoAgents, useStreamChat } from "@deltakit/react";
import { useState, useEffect } from "react";

async function fetchHistory() {
  const res = await fetch("/api/chat-agno/");
  const agnoMessages = await res.json();
  return fromAgnoAgents(agnoMessages);
}

function Chat() {
  const [initialMessages, setInitialMessages] = useState([]);

  useEffect(() => {
    fetchHistory().then(setInitialMessages);
  }, []);

  const { messages, sendMessage } = useStreamChat({
    api: "/api/chat-agno",
    initialMessages,
  });

  return (/* render messages */);
}

Backend Implementation (FastAPI + Agno)

from fastapi import APIRouter
from agno.agent import Agent
from agno.db.sqlite import SqliteDb
from agno.models.openrouter import OpenRouter

router = APIRouter()

storage = SqliteDb(
    session_table="agno_agent_sessions",
    db_file="./dev.db",
)

@router.get("/api/chat-agno/")
async def get_history():
    agent = Agent(
        model=OpenRouter(id="moonshotai/kimi-k2.5"),
        db=storage,
        session_id="default-agno",
    )
    try:
        messages = await agent.aget_session_messages(
            session_id="default-agno"
        )
        return messages
    except Exception:
        return []

TanStack Router Integration

With TanStack Router's loader:

import { fromAgnoAgents } from "@deltakit/react";
import { createFileRoute } from "@tanstack/react-router";

const API_URL = "http://localhost:8000/api/chat-agno/";

async function fetchHistory() {
  const res = await fetch(API_URL);
  if (!res.ok) throw new Error("Failed to fetch history");
  const agnoMessages = await res.json();
  return fromAgnoAgents(agnoMessages);
}

export const Route = createFileRoute("/chat-agno")({
  loader: () => fetchHistory(),
  component: ChatAgno,
});

function ChatAgno() {
  const initialMessages = Route.useLoaderData();
  
  const { messages, sendMessage } = useStreamChat({
    api: API_URL,
    initialMessages,
  });
  
  return (/* render messages */);
}

What Gets Converted

fromAgnoAgents handles all Agno message types:

Agno FieldDeltaKit Part
User contentTextPart
Assistant contentTextPart
Assistant reasoning_contentReasoningPart
Assistant tool_callsToolCallPart[]
Tool contentAttached to matching ToolCallPart.result

Notes

  • initialMessages is only read on the first render
  • To reset the conversation, use setMessages:
const { setMessages } = useStreamChat({ api: "/api/chat-agno" });
setMessages(newMessages);

On this page