Skip to Content
Polyant is open source under AGPL-3.0 — star us on GitHub.
Admin PanelConversations

Conversations

The Conversations screen (/conversations) is the global browse view across every instance and every channel.

Listing

  • Pagination. 20 conversations per page (PAGE_SIZE in packages/web/src/app/(admin)/conversations/page.tsx).
  • Search. Full-text search over message content. Implemented as PostgreSQL FTS with the simple config (no language stop-words) so multilingual content works.
  • Filters. Single drop-down to filter by instance — there is no date-range filter and no channel filter on the list page.
  • Columns. Title (auto-generated), instance, channel, message count, last activity, status.

The list is ordered by last-activity desc by default. Click a column header to sort by another field.

Conversation detail

Click a conversation row to open the detail view. You see:

  • Header. Title, instance, channel, conversation id (copyable), open/closed, language detected.
  • Metadata grid. Started at, last message at, message count, total tokens (in/out), estimated cost.
  • Message list. Each message displays role (user, assistant, tool, system), content, and timestamp.
  • Tool calls. Tool calls are rendered inline under the assistant message that issued them, with the tool name, arguments, return value, and duration.
  • Attachments. Photos and PDFs from WhatsApp/Telegram appear inline when the engine has S3 storage configured (PLATFORM_S3_* env vars).

Conversation state

Besides its messages, a conversation carries a state store: a small key/value blob that tools and hooks read and write during a turn. It is how one tool hands a derived value (a resolved customer id, a field mapped in from an HTTP-channel payload) to the next tool or to the next turn, without routing it through the model.

  • The store is read once per turn; writes are buffered and flushed when the turn commits, so a failed turn does not leave half-written state.
  • Concurrent turns on the same conversation merge per key rather than overwriting the whole blob.
  • It is not in the prompt by default. Turning on Conversation state in prompt (Settings) renders a truncated, read-only view into the turn so the model can see the known facts; the store stays the source of truth either way.

GET /api/conversations/{conversationId}/state returns the current blob (permission conversation:read).

Hook executions

GET /api/conversations/{conversationId}/hooks returns the lifecycle-hook executions recorded for the conversation: event, function, success, duration, and any control signal the hook requested. Use it to confirm whether a hook fired on a given turn and what it did. See Hooks.

Per-message debug payload

When an agent has Debug payload enabled (Settings), GET /api/conversations/{conversationId}/messages/{messageId}/debug returns the exact LLM request behind that assistant turn — full system prompt, messages array, and tool definitions. It is off by default because it stores personal data at rest.

Deletion

Delete a single conversation from its detail page (top-right, Delete button), or bulk-delete from the list (select rows, Delete selected). Deletion cascades in one transaction: messages, AI-gateway call logs, pipeline traces, tool audit logs, governance events, hook executions, memories extracted from the conversation, its state store, and its encrypted per-conversation credentials.

The same cascade runs unattended when an agent has a retention policy.

Tip. When auditing, export the conversation first (the Export JSON button in the detail view), then delete. Exported conversations are full-fidelity dumps including system prompts and tool internals.

Last updated on