Docs menuPostgreSQL

PostgreSQL

Example query and read-only user for a custom agent on PostgreSQL.

Updated 3 October 2026

This query assumes an example schema: agent_turns, with one row per question; app_users; and agent_queries, agent_reasoning, agent_messages and agent_tool_calls, with one row per step, keyed by turn_id. Replace the names with your own, and drop any column your agent doesn’t record.

Connection string

postgres://benchouse_read:PASSWORD@HOST:5432/DB?sslmode=verify-full

Query

SELECT
    t.id::text      AS turn_id,
    t.created_at    AS asked_at,
    t.updated_at    AS updated_at,
    t.finished_at   AS completed_at,
    t.question      AS question_text,
    t.answer        AS answer_text,
    t.status        AS outcome,
    t.error         AS error_message,
    t.chat_id::text AS conversation_id,
    t.user_id::text AS user_id,
    u.email         AS user_email,
    t.model         AS model_name,
    t.input_tokens  AS input_tokens,
    t.output_tokens AS output_tokens,
    COALESCE((SELECT json_agg(json_build_object(
                'sql', q.sql_text, 'status', q.status, 'error', q.error,
                'rows', q.row_count, 'started_at', q.started_at,
                'ended_at', q.ended_at, 'is_answer', q.is_final)
              ORDER BY q.started_at)
         FROM agent_queries q WHERE q.turn_id = t.id), '[]') AS statements,
    COALESCE((SELECT json_agg(json_build_object('label', r.kind, 'text', r.content)
              ORDER BY r.seq)
         FROM agent_reasoning r WHERE r.turn_id = t.id), '[]') AS reasoning,
    COALESCE((SELECT json_agg(json_build_object('kind', m.kind, 'text', m.content)
              ORDER BY m.seq)
         FROM agent_messages m WHERE m.turn_id = t.id), '[]') AS messages,
    COALESCE((SELECT json_agg(json_build_object(
                'name', c.tool, 'input', c.input, 'output', c.output,
                'status', c.status, 'started_at', c.started_at, 'ended_at', c.ended_at)
              ORDER BY c.seq)
         FROM agent_tool_calls c WHERE c.turn_id = t.id), '[]') AS tool_calls
FROM agent_turns t
LEFT JOIN app_users u ON u.id = t.user_id

Read-only user

CREATE ROLE benchouse_read LOGIN PASSWORD '…';
GRANT USAGE ON SCHEMA public TO benchouse_read;
GRANT SELECT ON agent_turns, app_users, agent_queries, agent_reasoning,
                agent_messages, agent_tool_calls TO benchouse_read;