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;