roboto.ai.core.record
Module Contents
AGENT_CONTENT_MODEL_BY_TYPE
The model class for each JSON-serialized content type, keyed by discriminator.
Excludes AgentContentType.TEXT, whose payload is persisted as raw text rather than a serialized model. Every other member of AgentContent carries a content_type discriminator and round-trips through model_dump_json / model_validate_json; driving both serialization directions off this one map keeps them symmetric, so a member added to the union without a home here fails loudly instead of being silently dropped on write or reconstructed without its payload on read.
AgentClientContextEntry
Bases: pydantic.BaseModel
The caller’s attached viewing context, carried on their own message.
Replaces a <ctx>{json}</ctx> marker persisted as a separate ROBOTO-role message. That shape made every consumer regex a JSON blob back out of prose it had serialized itself – four parsers across two languages – and relied on the ROBOTO role to keep the marker out of the chat view. It also put the context on a non-USER message, which the compression deletion pass collapses wholesale inside a resolved task’s interior, so the context silently disappeared from compressed history.
As a block on the user’s own message it is a typed field, invisible to text renderers (no text field), and safe from that collapse – USER turns are never dropped.
Parameters
data AnyAttributes
AgentClientContextEntry.content_type
AgentClientContextEntry.context
What the caller had open: attached datasets, files, and visualizer state.
AgentCompressionFillerContent
Bases: pydantic.BaseModel
Filler standing in for a message the compression deletion pass emptied.
Carries no payload. A message reduced to nothing but tombstones keeps this single block instead of an empty content list, so it stays in the Bedrock payload at its original role and turn alternation survives without relocating content. The Bedrock boundary renders it as <Deleted in compression>. Produced only by the compression deletion pass and stored only at the DELETED tier; the verbatim original thread (what the SDK and UI render) never contains one.
Parameters
data AnyAttributes
AgentCompressionFillerContent.content_type
AgentContent
Type alias for all possible content types within agent messages.
AgentContentType
Bases: roboto.compat.StrEnum
Enumeration of different types of content within agent messages.
Defines the various content types that can be included in agent messages.
Attributes
AgentContentType.CLIENT_CONTEXT
What the caller was looking at when they composed the message this block sits on.
Superseded shape: the same payload used to be persisted as a whole ROBOTO-role message whose text was a <ctx>...</ctx> marker (ENG-2185). Readers still accept that form for threads written before this type existed; nothing emits it any more.
AgentContentType.COMPRESSION_FILLER
Stand-in block kept in a message the deletion pass emptied entirely.
A message reduced to nothing but tombstones would break user/assistant alternation if it dropped from the payload. Replacing its content with this single filler keeps the message — and its role — in place. The model sees it as <Deleted in compression>. Only the cross-message deletion pass produces it, so it appears only inside a DELETED-tier compressed variant, never in the verbatim original thread the SDK and UI read.
AgentContentType.DELETED
Tombstone marking a content block elided by compression.
Appears only inside a DELETED-tier compressed variant. Both producers — message-tier compression dropping a pure-filler text run, and the cross-message deletion pass dropping a whole tool exchange — store their output at the DELETED tier, so a message carrying one is always a DELETED-tier variant. Never in the verbatim original thread the SDK and UI read.
AgentDeletedContent
Bases: pydantic.BaseModel
Tombstone for a content block removed by compression.
Carries no payload — its presence records that a block once occupied this slot, and it converts to None at the Bedrock boundary so the block drops from the LLM payload. Produced when compression drops a block — a pure-filler text run at message compression, or a whole redundant tool exchange in the cross-message deletion pass — and stored only at the DELETED tier, so a message carrying one is always a DELETED-tier variant. A message reduced to nothing but tombstones does not drop: it is replaced with a single AgentCompressionFillerContent so it keeps its role and turn. The verbatim original thread (what the SDK and UI render) never contains one.
Parameters
data AnyAttributes
AgentDeletedContent.content_type
AgentErrorContent
Bases: pydantic.BaseModel
Error content within an agent message.
Used when message generation fails due to an error or is cancelled by the user.
Parameters
data AnyAttributes
AgentErrorContent.content_type
AgentErrorContent.error_code
Optional error code for programmatic handling.
AgentErrorContent.error_message
User-friendly error message describing what went wrong.
AgentGoalStatus
Bases: roboto.compat.StrEnum
Lifecycle of a per-turn declared goal.
Goals begin PENDING when registered. They transition to ACHIEVED when the corresponding achieve-tool reports success, or to FAILED when the runner’s corrective re-prompt budget for the turn is exhausted (or when the worker cannot construct an achieve-tool for the goal).
Attributes
AgentMessage
Bases: pydantic.BaseModel
A single message within an agent thread.
Represents one message in the conversation, containing the sender role, content blocks, and generation status. Messages can contain multiple content blocks of different types (text, tool use, tool results).
Parameters
data AnyAttributes
AgentMessage.content
List of content blocks that make up this message.
AgentMessage.is_complete()
Check if message generation is complete.
Returns
True if the message status is COMPLETED, False otherwise.
AgentMessage.is_unsuccessful()
Check if message generation failed or was cancelled.
Returns
True if the message status is FAILED or CANCELLED, False otherwise.
Attributes
AgentMessage.text()
Create a simple text message.
Convenience method for creating a message containing only text content.
Parameters
text strThe text content for the message.
role AgentRoleThe role of the message sender. Defaults to USER.
Returns
AgentMessage instance containing the text content.
AgentMessageStatus
Bases: roboto.compat.StrEnum
Enumeration of possible message generation states.
Tracks the lifecycle of message generation from initiation to completion.
Attributes
AgentMessageStatus.COMPLETED
Message generation has finished and content is complete.
AgentMessageStatus.GENERATING
Message content is currently being generated.
AgentMessageStatus.NOT_STARTED
Message has been queued but generation has not begun.
AgentMessageStatus.is_terminal()
Check if the message generation is in a terminal state.
Returns
True if the message is in a terminal state, False otherwise.
AgentRole
Bases: roboto.compat.StrEnum
Enumeration of possible roles in an agent thread.
Defines the different participants that can send messages in a thread.
AgentSubtask
Bases: pydantic.BaseModel
A lightweight checklist item under a top-level task.
Parameters
data AnyAttributes
AgentSubtaskStatus
Bases: roboto.compat.StrEnum
Lifecycle state of a sub-task.
Sub-tasks are never activated independently — they are implicitly active with their parent task — so they have no in_progress state.
AgentTask
Bases: pydantic.BaseModel
A top-level task the agent is tracking within a thread.
Parameters
data AnyAttributes
AgentTask.conclusion
Outcome recorded when the task was completed. None until then.
AgentTask.description
Longer description delimiting the task’s scope and intent.
AgentTask.start
Where the task most recently became in_progress. None if never started.
AgentTask.subtasks
Ordered sub-tasks. A task cannot be completed until all of these are done.
AgentTask.task_id
Thread-monotonic id, stable for the life of the thread. The model references this id to start or complete the task.
AgentTaskBoundary
Bases: pydantic.BaseModel
Position in the conversation where a top-level task’s active span begins or ends.
Identifies the assistant message and the content block within it whose tool call drove the transition, so callers can anchor a task to the part of the thread that worked on it.
Parameters
data AnyAgentTaskMinimal
Bases: pydantic.BaseModel
Minimal acknowledgement returned by the task mutation tools.
The full list reaches the model through the per-turn injected context, so the mutation tools echo only the affected task’s id and resulting status.
Parameters
data AnyAttributes
AgentTaskStatus
Bases: roboto.compat.StrEnum
Lifecycle state of a top-level agent task.
Attributes
AgentTaskStatus.IN_PROGRESS
The single active task. At most one task per thread is in this state.
AgentTextContent
Bases: pydantic.BaseModel
Text content within an agent message.
Parameters
data AnyAttributes
AgentThreadDelta
Bases: pydantic.BaseModel
Incremental update to an agent thread.
Contains only the changes since the last synchronization, used for efficient real-time updates without transferring the entire thread history.
Parameters
data AnyAttributes
AgentThreadDelta.continuation_token
Updated token for the next incremental synchronization.
AgentThreadDelta.goals
Latest snapshot of every goal declared in the thread, ordered by allocation. None means there has been no change since the previous delta — clients should retain the snapshot they already hold. An empty list means the thread has no declared goals. A non-empty list is the authoritative current snapshot and replaces any prior value.
AgentThreadDelta.messages_by_idx
New or updated messages indexed by their position in the conversation.
AgentThreadDelta.reset_from_message_sequence_num
Discard held messages from this index onward before applying this delta.
A delta’s messages normally extend what a client already holds, because the server sends only content the client has not seen. That breaks when a turn is abandoned partway and regenerated: the replacement message reuses the same index, so what the client holds at that index is text from an attempt that no longer exists, and appending to it would splice the real reply onto a discarded draft.
When this field is set, the client must truncate its held messages to indices strictly below it, then apply messages_by_idx and adopt continuation_token as usual — the server has rewound the stream to that point and will resend it. None (the common case) means append as normal.
AgentThreadDelta.tasks
Latest snapshot of the thread’s task list, ordered by position. None means no change since the previous delta — clients should retain the snapshot they already hold. An empty list means the thread has no tasks. A non-empty list is the authoritative current snapshot and replaces any prior value.
AgentThreadGoalRecord
Bases: pydantic.BaseModel
Customer-visible read shape of a goal declared on an agent thread.
Parameters
data AnyAttributes
AgentThreadGoalRecord.achieve_tool_use_id
tool_use_id of the achieve-tool invocation associated with this goal. Populated by the turn runner on every achieve-tool attempt, so its final value depends on the goal’s terminal status:
ACHIEVED: thetool_use_idof the successful invocation.FAILED: thetool_use_idof the last attempted invocation, orNoneif the LLM never invoked the achieve-tool before the retry budget exhausted.PENDING:None(or the most recent attempt so far).
Use with AgentThread.goals and the GoalResult accessor on the SDK wrapper to locate the exact AgentToolUseContent / AgentToolResultContent pair without scanning by tool name.
AgentThreadGoalRecord.concluded_at
Timestamp when the goal transitioned to a terminal state (ACHIEVED or FAILED). None while the goal is still PENDING.
AgentThreadGoalRecord.goal_data
The validated goal payload as JSON. Use to_agent_goal() to recover the typed model the caller declared.
AgentThreadGoalRecord.goal_type
Discriminator selecting which AgentGoal model the goal_data payload conforms to (e.g. "dataset_summary").
AgentThreadGoalRecord.message_sequence_num
Index in the thread’s full messages list of the AgentRole.USER message that declared this goal. Use to render goals adjacent to the turn they were attached to.
AgentThreadGoalRecord.status
Current lifecycle state of the goal.
AgentThreadGoalRecord.to_agent_goal()
Re-hydrate goal_data into the typed AgentGoal the caller declared.
Returns
The validated, discriminated AgentGoal instance — for "dataset_summary" rows, a DatasetSummaryAgentGoal; for "dataset_triage" rows, a DatasetTriageGoal; etc.
AgentThreadRecord
Bases: pydantic.BaseModel
Complete record of an agent thread.
Contains all the persistent data for a thread including metadata, message history, and synchronization state.
Parameters
data AnyAttributes
AgentThreadRecord.continuation_token
Token used for incremental updates and synchronization.
AgentThreadRecord.created_by_principal
Serialized RobotoPrincipal ("ptype:id") that started this thread, e.g. "user:jo@example.com" or "invocation:iv_123". Unlike created_by, this preserves whether the thread was driven by a person, a device, or an action invocation. None on threads created before this field existed.
AgentThreadRecord.created_from_agent_id
If this thread was started via the agent launch flow, the id of the agent that produced it. None for threads started directly through POST /v1/ai/threads. Forks do not inherit this field — a fork is its own thread.
AgentThreadRecord.created_from_trigger_id
If a trigger’s start_agent target launched this thread, the id of that trigger. None for every other thread, including one launched from the same agent by a person. Set alongside created_from_agent_id, which names the agent; this names what decided to run it. Forks do not inherit this field — a fork is its own thread.
AgentThreadRecord.forked_from_message_sequence_num
Message sequence number in the source thread that this fork was taken from.
Populated in tandem with forked_from_thread_id; both are None for threads that were not created as a fork.
AgentThreadRecord.forked_from_thread_id
If this thread was forked, the id of the source thread. None otherwise.
Deserialization also accepts the legacy forked_from_session_id spelling for backward compatibility.
AgentThreadRecord.goals
Goals declared across this thread’s turns, ordered by the turn that declared them. None means goals were not loaded for this record; an empty list means they were loaded but the thread never declared any.
AgentThreadRecord.messages
Complete list of messages in the conversation.
AgentThreadRecord.model_config
model_config #Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
AgentThreadRecord.model_profile
Model profile used for this agent thread (e.g., ‘standard’, ‘advanced’).
AgentThreadRecord.origin
The surface that owns this thread.
Set by Roboto when the thread is created; it cannot be supplied by a caller. A thread owned by a surface outside Roboto refuses new messages over the API, raising RobotoThreadReadOnlyException; reading, cancelling, and rating it stay open, and a fork does not inherit the origin, so the copy is writable.
None on threads created before this field existed, and equivalent to ThreadOrigin.API — every surface that predates the field was Roboto’s own. It stays nullable until those rows are backfilled.
AgentThreadRecord.pinned_at
When the calling user pinned this thread, or None if they have not.
A pin is a personal bookmark, so two users reading the same thread see different values here. Pin and unpin through roboto.ai.agent_thread.AgentThread.set_pinned(). Only GET /v1/ai/threads and POST /v1/ai/threads/search report it; reads of a single thread leave it None whatever the pin state.
AgentThreadRecord.tasks
The thread’s task list, ordered by AgentTask.position. None means tasks were not loaded for this record; an empty list means they were loaded but the thread has none.
AgentThreadRecord.thread_id
Unique identifier for this agent thread.
Deserialization also accepts the legacy session_id and chat_id spellings for backward compatibility; the canonical attribute name is thread_id.
AgentThreadRecord.visibility
Who can read this thread. PRIVATE (the default) restricts reads to the created_by user and Roboto admins; ORG opens the thread to every member of org_id.
AgentThreadStatus
Bases: roboto.compat.StrEnum
Enumeration of possible agent thread states.
Tracks the overall status of an agent thread from creation to termination.
Attributes
AgentThreadStatus.CLIENT_TOOL_TURN
Client must execute pending tool uses and submit results.
AgentThreadStatus.GOALS_FAILED
The agent runner exhausted its corrective re-prompt budget without achieving every declared goal for the most-recent turn. Signals to clients that the thread needs human intervention before it can continue.
AgentThreadStatus.NOT_STARTED
Thread has been created but no messages have been sent.
AgentToolResultContent
Bases: pydantic.BaseModel
Tool execution result content within an agent message.
Parameters
data AnyAttributes
AgentToolResultContent.content_type
AgentToolResultContent.payload
What the tool returned: free-form text, or a JSON object or array of structured data.
Independent of any model provider’s wire format (provider-agnostic, like AgentToolUseContent.input). None on results written before this field existed; use resolve_payload() to read old and new results uniformly.
AgentToolResultContent.raw_response
Legacy provider-formatted response envelope (Bedrock toolResult shape).
Kept so results written before payload existed remain readable; deprecated for new readers, who should call resolve_payload() instead of parsing this field.
Populated only where the server-side envelope is in scope: threads read over the API arrive with this field stripped (and, for legacy rows, with payload synthesized from it server-side before the strip), so API/SDK readers should not expect it.
AgentToolResultContent.resolve_payload()
Return what the tool returned, whichever field carries it.
Prefers payload. Results written before that field existed carry only the legacy envelope, from which the equivalent value is reconstructed via synthesize_tool_result_payload().
Returns
The tool’s text or JSON output, or None when neither field carries a recognizable value.
Attributes
AgentToolResultContent.runtime_ms
Wall-clock execution time of the tool in milliseconds.
AgentToolResultContent.tool_use_id
Identifier of the tool invocation this result corresponds to.
AgentToolUseContent
Bases: pydantic.BaseModel
Tool usage request content within an agent message.
Parameters
data AnyAttributes
AgentToolUseContent.content_type
AgentToolUseContent.input
Parsed tool input parameters chosen by the LLM (provider-agnostic).
AgentToolUseContent.raw_request
Raw, unparsed request payload for this tool invocation.
AgentToolUseContent.tool_use_id
Unique identifier for this tool invocation, used to correlate with its result.
CLIENT_TOOL_NAME_PREFIX
Required prefix for every client-declared tool name.
Distinguishes client tools from server-side tools at every layer (API, SDK, UI, Bedrock toolConfig) without ambiguity. Underscore is used rather than a colon so the resulting name still matches Bedrock’s Converse toolSpec.name pattern (^[a-zA-Z][a-zA-Z0-9_]*$).
ClientToolSpec
Bases: pydantic.BaseModel
Declarative specification for a client-side tool.
Unlike AgentTool (which is an ABC with a __call__ method for server-side execution), ClientToolSpec is a plain data model. The backend includes it in the LLM’s tool list but never executes it — the client is responsible for execution and submitting the result.
Parameters
data AnyModelProfileResponse
Bases: pydantic.BaseModel
Metadata about an available model profile, returned by the API.
Parameters
data AnyAttributes
ModelProfileResponse.description
Short description of the profile’s characteristics.
ModelProfileResponse.is_default
Whether this profile is selected by default for new threads.
ThreadOrigin
Bases: roboto.compat.StrEnum
The surface an AgentThreadRecord was started from, and the one that owns it.
Distinct from AgentThreadRecord.created_by_principal, which records who started a thread. This records where the conversation lives, which is what decides whether it can be added to over the API.
Import as roboto.ai.agent_thread.ThreadOrigin.
Attributes
ThreadOrigin.API
Started through Roboto itself – the web app, the CLI, the SDK, or a direct REST call.
These surfaces read the thread back from Roboto rather than mirroring it somewhere else, so there is nothing for a new turn to fall out of sync with and the thread stays writable.
ThreadOrigin.SLACK
Started by mentioning @Roboto in Slack, and mirrored into that Slack conversation.
ThreadVisibility
Bases: roboto.compat.StrEnum
Read-scope for an AgentThreadRecord.
Set when the thread is created, and changed afterwards only by the thread’s creator, via roboto.ai.agent_thread.AgentThread.set_visibility() (POST /v1/ai/threads/<thread_id>/visibility). Roboto admins read every thread but cannot re-scope one they did not create.
Import as roboto.ai.agent_thread.ThreadVisibility.
Attributes
ThreadVisibility.ORG
Any member of the thread’s organization (and Roboto admins) may read the thread.
Default for threads produced by the agent launch flow, since agents exist to share workflows across teammates. Forks of an ORG thread do not inherit visibility — every fork lands as PRIVATE.
ThreadVisibility.PRIVATE
Only the creating user (and Roboto admins) may read the thread.
Default for threads created via POST /v1/ai/threads so an in-flight experiment does not leak to the rest of the org until the caller opts in.