Skip to content
Roboto
Esc
↑↓navigate↵open⌘Jpreview
On this page

roboto.ai.core

Core AI abstractions usable by any other submodule within module roboto.ai.

Submodules

Package Contents

AGENT_CONTENT_MODEL_BY_TYPE

roboto.ai.core.AGENT_CONTENT_MODEL_BY_TYPE: dict[AgentContentType, type[AgentContent]]#View Source

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

class roboto.ai.core.AgentClientContextEntry(/, **data)#View Source

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 Any

Attributes

AgentClientContextEntry.content_type

content_type Literal[AgentContentType] #

AgentClientContextEntry.context

What the caller had open: attached datasets, files, and visualizer state.

AgentCompressionFillerContent

class roboto.ai.core.AgentCompressionFillerContent(/, **data)#View Source

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 Any

Attributes

AgentCompressionFillerContent.content_type

content_type Literal[AgentContentType] #

AgentContent

Type alias for all possible content types within agent messages.

AgentContentType

class roboto.ai.core.AgentContentType#View Source

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

CLIENT_CONTEXT = '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

COMPRESSION_FILLER = '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

DELETED = '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.

AgentContentType.ERROR

ERROR = 'error' #

Error information when message generation fails.

AgentContentType.TEXT

TEXT = 'text' #

Plain text content from users or AI responses.

AgentContentType.TOOL_RESULT

TOOL_RESULT = 'tool_result' #

Results returned from tool executions.

AgentContentType.TOOL_USE

TOOL_USE = 'tool_use' #

Tool invocation requests from the AI assistant.

AgentDeletedContent

class roboto.ai.core.AgentDeletedContent(/, **data)#View Source

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 Any

Attributes

AgentDeletedContent.content_type

content_type Literal[AgentContentType] #

AgentErrorContent

class roboto.ai.core.AgentErrorContent(/, **data)#View Source

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 Any

Attributes

AgentErrorContent.content_type

content_type Literal[AgentContentType] #

AgentErrorContent.error_code

error_code str | None = None #

Optional error code for programmatic handling.

AgentErrorContent.error_message

error_message str #

User-friendly error message describing what went wrong.

AgentErrorEvent

class roboto.ai.core.AgentErrorEvent(/, **data)#View Source

Bases: pydantic.BaseModel

Signals that message generation failed or was cancelled.

Parameters

data Any

Attributes

AgentErrorEvent.error_code

error_code str | None = None #

Optional error code for programmatic handling.

AgentErrorEvent.error_message

error_message str #

User-friendly error message describing what went wrong.

AgentEvent

AgentMessage

class roboto.ai.core.AgentMessage(/, **data)#View Source

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 Any

Attributes

AgentMessage.content

List of content blocks that make up this message.

AgentMessage.created

created datetime.datetime = None #

Timestamp when this message was created.

AgentMessage.is_complete()

is_complete()#View Source

Check if message generation is complete.

Returns

bool

True if the message status is COMPLETED, False otherwise.

AgentMessage.is_unsuccessful()

is_unsuccessful()#View Source

Check if message generation failed or was cancelled.

Returns

bool

True if the message status is FAILED or CANCELLED, False otherwise.

Attributes

AgentMessage.role

The role of the message sender (user, assistant, or roboto).

AgentMessage.status

Current generation status of this message.

AgentMessage.text()

classmethod text(text, role=AgentRole.USER)#View Source

Create a simple text message.

Convenience method for creating a message containing only text content.

Parameters

text str

The text content for the message.

The role of the message sender. Defaults to USER.

Returns

AgentMessage instance containing the text content.

AgentMessageStatus

class roboto.ai.core.AgentMessageStatus#View Source

Bases: roboto.compat.StrEnum

Enumeration of possible message generation states.

Tracks the lifecycle of message generation from initiation to completion.

Attributes

AgentMessageStatus.CANCELLED

CANCELLED = 'cancelled' #

Message generation was cancelled by the user.

AgentMessageStatus.COMPLETED

COMPLETED = 'completed' #

Message generation has finished and content is complete.

AgentMessageStatus.FAILED

FAILED = 'failed' #

Message generation failed due to an error.

AgentMessageStatus.GENERATING

GENERATING = 'generating' #

Message content is currently being generated.

AgentMessageStatus.NOT_STARTED

NOT_STARTED = 'not_started' #

Message has been queued but generation has not begun.

AgentMessageStatus.is_terminal()

is_terminal()#View Source

Check if the message generation is in a terminal state.

Returns

bool

True if the message is in a terminal state, False otherwise.

AgentRole

class roboto.ai.core.AgentRole#View Source

Bases: roboto.compat.StrEnum

Enumeration of possible roles in an agent thread.

Defines the different participants that can send messages in a thread.

Attributes

AgentRole.ASSISTANT

ASSISTANT = 'assistant' #

AI agent responding to user queries and requests.

AgentRole.ROBOTO

ROBOTO = 'roboto' #

Roboto system providing tool results and system information.

AgentRole.USER

USER = 'user' #

Human user sending messages to the agent.

AgentStartTextEvent

class roboto.ai.core.AgentStartTextEvent(/, **data)#View Source

Bases: pydantic.BaseModel

Signals the beginning of text generation in a chat response.

Parameters

data Any

AgentTextContent

class roboto.ai.core.AgentTextContent(/, **data)#View Source

Bases: pydantic.BaseModel

Text content within an agent message.

Parameters

data Any

Attributes

AgentTextContent.text

text str #

The actual text content of the message.

AgentTextDeltaEvent

class roboto.ai.core.AgentTextDeltaEvent(/, **data)#View Source

Bases: pydantic.BaseModel

Contains incremental text content as the AI generates its response.

Parameters

data Any

Attributes

AgentTextDeltaEvent.text

text str #

Text fragment from the streaming response.

AgentTextEndEvent

class roboto.ai.core.AgentTextEndEvent(/, **data)#View Source

Bases: pydantic.BaseModel

Signals the completion of text generation in a chat response.

Parameters

data Any

AgentThreadDelta

class roboto.ai.core.AgentThreadDelta(/, **data)#View Source

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 Any

Attributes

AgentThreadDelta.continuation_token

continuation_token str #

Updated token for the next incremental synchronization.

AgentThreadDelta.goals

goals list[AgentThreadGoalRecord] | None = None #

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

messages_by_idx dict[int, AgentMessage] #

New or updated messages indexed by their position in the conversation.

AgentThreadDelta.reset_from_message_sequence_num

reset_from_message_sequence_num int | None = None #

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.status

status AgentThreadStatus | None = None #

Updated status of the agent thread.

AgentThreadDelta.tasks

tasks list[roboto.ai.core.task.AgentTask] | None = None #

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.

AgentThreadDelta.title

title str | None = None #

Updated title of the agent thread.

AgentThreadRecord

class roboto.ai.core.AgentThreadRecord(/, **data)#View Source

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 Any

Attributes

AgentThreadRecord.continuation_token

continuation_token str #

Token used for incremental updates and synchronization.

AgentThreadRecord.created

created datetime.datetime #

Timestamp when this agent thread was created.

AgentThreadRecord.created_by

created_by str #

User ID of the person who created this agent thread.

AgentThreadRecord.created_by_principal

created_by_principal str | None = None #

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

created_from_agent_id str | None = None #

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

created_from_trigger_id str | None = None #

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

forked_from_message_sequence_num int | None = None #

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

forked_from_thread_id str | None = None #

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 list[AgentThreadGoalRecord] | None = None #

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

messages list[AgentMessage] = None #

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 str | None = None #

Model profile used for this agent thread (e.g., ‘standard’, ‘advanced’).

AgentThreadRecord.org_id

org_id str #

Organization ID that owns this agent thread.

AgentThreadRecord.origin

origin ThreadOrigin | None = None #

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

pinned_at datetime.datetime | None = None #

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.status

Current status of this agent thread.

AgentThreadRecord.tasks

tasks list[roboto.ai.core.task.AgentTask] | None = None #

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

thread_id str = None #

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.title

title str | None = None #

Title of this agent thread.

AgentThreadRecord.visibility

visibility ThreadVisibility #

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

class roboto.ai.core.AgentThreadStatus#View Source

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_TOOL_TURN = 'client_tool_turn' #

Client must execute pending tool uses and submit results.

AgentThreadStatus.GOALS_FAILED

GOALS_FAILED = '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

NOT_STARTED = 'not_started' #

Thread has been created but no messages have been sent.

AgentThreadStatus.ROBOTO_TURN

ROBOTO_TURN = 'roboto_turn' #

Roboto is generating a message.

AgentThreadStatus.USER_TURN

USER_TURN = 'user_turn' #

User has the turn to send a message.

AgentToolResultContent

class roboto.ai.core.AgentToolResultContent(/, **data)#View Source

Bases: pydantic.BaseModel

Tool execution result content within an agent message.

Parameters

data Any

Attributes

AgentToolResultContent.content_type

content_type Literal[AgentContentType] #

AgentToolResultContent.payload

payload str | dict[str, Any] | list[Any] | None = None #

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

raw_response dict[str, Any] | None = None #

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()

resolve_payload()#View Source

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

Optional[Union[str, dict[str, Any], list[Any]]]

The tool’s text or JSON output, or None when neither field carries a recognizable value.

Attributes

AgentToolResultContent.runtime_ms

runtime_ms int #

Wall-clock execution time of the tool in milliseconds.

AgentToolResultContent.status

status str #

Outcome of the tool execution (e.g. ‘success’, ‘error’).

AgentToolResultContent.tool_name

tool_name str #

Name of the tool that was executed.

AgentToolResultContent.tool_use_id

tool_use_id str #

Identifier of the tool invocation this result corresponds to.

AgentToolResultEvent

class roboto.ai.core.AgentToolResultEvent(/, **data)#View Source

Bases: pydantic.BaseModel

Contains the result of a tool invocation.

Parameters

data Any

Attributes

AgentToolResultEvent.name

name str #

Name of the tool that was invoked.

AgentToolResultEvent.output

output dict[str, Any] | None = None #

Raw tool output payload (from the underlying tool_result’s raw_response). May be None for errored invocations or for tools that return no data.

AgentToolResultEvent.runtime_ms

runtime_ms int | None = None #

Wall-clock execution time of the tool in milliseconds, as reported by the tool-result content. None only if the underlying content omits it.

AgentToolResultEvent.success

success bool #

Whether the tool invocation succeeded.

AgentToolResultEvent.tool_use_id

tool_use_id str #

Unique identifier for this tool invocation.

AgentToolUseContent

class roboto.ai.core.AgentToolUseContent(/, **data)#View Source

Bases: pydantic.BaseModel

Tool usage request content within an agent message.

Parameters

data Any

Attributes

AgentToolUseContent.content_type

content_type Literal[AgentContentType] #

AgentToolUseContent.input

input dict[str, Any] | None = None #

Parsed tool input parameters chosen by the LLM (provider-agnostic).

AgentToolUseContent.raw_request

raw_request dict[str, Any] | None = None #

Raw, unparsed request payload for this tool invocation.

AgentToolUseContent.tool_name

tool_name str #

Name of the tool the LLM is requesting to invoke.

AgentToolUseContent.tool_use_id

tool_use_id str #

Unique identifier for this tool invocation, used to correlate with its result.

AgentToolUseEvent

class roboto.ai.core.AgentToolUseEvent(/, **data)#View Source

Bases: pydantic.BaseModel

Signals that the AI is invoking a tool to gather information.

Parameters

data Any

Attributes

AgentToolUseEvent.input

input dict[str, Any] | None = None #

Parsed tool input parameters chosen by the LLM.

AgentToolUseEvent.name

name str #

Name of the tool being invoked.

AgentToolUseEvent.tool_use_id

tool_use_id str #

Unique identifier for this tool invocation.

AnalysisScope

class roboto.ai.core.AnalysisScope(/, **data)#View Source

Bases: pydantic.BaseModel

The slice of data an agent is expected to analyze.

An AnalysisScope is delivered to every AgentTool invocation on the server side. Individual tools opt in to honoring the scope as they are adopted; this SDK type carries the configuration, it does not itself enforce anything. Fields set to None are unconstrained on that dimension; an AnalysisScope with every field None is equivalent to no scope at all.

Parameters

data Any

Attributes

AnalysisScope.end_time

end_time int | None = None #

Upper bound (inclusive) of the analysis window, expressed as nanoseconds since the Unix epoch.

AnalysisScope.merge()

merge(override)#View Source

Zipper-merge override onto this scope, dimension by dimension.

For each field, the override value wins when it is set (not None); otherwise this scope’s value carries through. Used to reconcile an invoke-time scope (override) against an authored template scope (self): a launch can override individual dimensions while inheriting the rest.

Parameters

override AnalysisScope

Return type

Attributes

AnalysisScope.start_time

start_time int | None = None #

Lower bound (inclusive) of the analysis window, expressed as nanoseconds since the Unix epoch.

ClientToolSpec

class roboto.ai.core.ClientToolSpec(/, **data)#View Source

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 Any

Attributes

ClientToolSpec.description

description str #

ClientToolSpec.input_schema

input_schema dict[str, Any] #

ClientToolSpec.name

name str #

ClientViewingContext

class roboto.ai.core.ClientViewingContext(/, **data)#View Source

Bases: pydantic.BaseModel

What the Roboto client (e.g. the Web UI) is currently viewing when the user composed a message.

Passed to the agent as implicit context for resolving deictic references — “this dataset”, “those files”, “the visualizer state I’m looking at” — that the user would otherwise have to spell out. This type is purely informational; it is not enforced and never gates tool authorization.

Distinct from:

  • AnalysisScope, which is a hard analysis window honored by individual tools on the server side.
  • AgentGoal, which declares typed outcomes the agent runner must drive the turn to satisfy.

The corresponding wire-format field is client_context (with a one-release context alias for migration).

Parameters

data Any

Attributes

ClientViewingContext.collection_ids

collection_ids list[str] = None #

IDs of collections the user is currently viewing or has selected.

ClientViewingContext.dataset_ids

dataset_ids list[str] = None #

IDs of datasets the user is currently viewing or has selected.

ClientViewingContext.device_ids

device_ids list[str] = None #

IDs of devices the user is currently viewing or has selected.

Device IDs are user-chosen rather than minted by Roboto, so unlike the other fields here a value may look like anything at all.

ClientViewingContext.display_time_anchor_label

display_time_anchor_label str | None = None #

What the client shows the user as the name of that t=0 — “Start of workspace”, or a picked timestamp rendered as local time.

Informational, like every field here: it lets the agent name the instant an offset is counted from, rather than leaving the reader to guess. None whenever display_time_anchor_ns is None.

ClientViewingContext.display_time_anchor_ns

display_time_anchor_ns int | None = None #

Epoch nanoseconds the client renders as t=0, set only while the user is reading timestamps as an elapsed count from that instant, and None otherwise.

Informational, like every field here: it lets the agent resolve a bare relative time the user types (“around 65 s”) to an absolute instant, and the agent still reports absolute nanoseconds back.

ClientViewingContext.file_ids

file_ids list[str] = None #

IDs of files the user is currently viewing or has selected.

ClientViewingContext.misc_context

misc_context dict[str, Any] | None = None #

Miscellaneous client-supplied context that doesn’t fit the typed fields above. Use sparingly; prefer adding a typed field when a recurring shape emerges.

ClientViewingContext.table_state

table_state dict[str, Any] | None = None #

The resource table on screen, when the user composed the message from one: its target (datasets, files, …) and its live definition – the same shape a View stores: RoboQL text or filter controls, plus visible columns, sort, and page size.

Sent whether or not a View is loaded, so the agent can describe ad-hoc filters and so “save what I’m looking at as a View” names something concrete. Informational, like every field here.

ClientViewingContext.view_ids

view_ids list[str] = None #

IDs of Views – saved, shareable searches over one resource type – applied to a resource table the user is looking at.

Informational, like every field here: it lets the agent resolve “this View” without the user naming it, and the agent still reads the View through its own tools.

ClientViewingContext.visualizer_state

visualizer_state dict[str, Any] | None = None #

State of the visualizer, when the user composed the message from the visualizer view. A relatively opaque JSON blob.

ModelProfileResponse

class roboto.ai.core.ModelProfileResponse(/, **data)#View Source

Bases: pydantic.BaseModel

Metadata about an available model profile, returned by the API.

Parameters

data Any

Attributes

ModelProfileResponse.description

description str #

Short description of the profile’s characteristics.

ModelProfileResponse.id

id str #

Profile identifier, e.g. ‘standard’ or ‘advanced’.

ModelProfileResponse.is_default

is_default bool = False #

Whether this profile is selected by default for new threads.

ModelProfileResponse.label

label str #

Human-readable display label.

synthesize_tool_result_payload()

roboto.ai.core.synthesize_tool_result_payload(raw_response)#View Source

Reconstruct a tool result’s text or JSON output from its legacy response envelope.

Reads both shapes tool results were persisted with before AgentToolResultContent.payload existed:

  • The provider envelope: a toolResult object whose content list carries the output as a text or json block, followed at most by image attachments.
  • A bare output dict with no toolResult key at all — the shape client-submitted results and fabricated skill-invocation results persisted, where the dict is the tool’s output and is returned as the payload verbatim.

A json value of the exact single-key form {"items": [...]} — the wrapper applied because the model provider rejected a top-level array — is unwrapped back to the bare array. This unwrap is heuristic: a tool that genuinely returned a single-key {"items": [...]} dict is indistinguishable from the wrapper here and synthesizes as the bare array. Writers that still hold the tool’s true return value should persist AgentToolResultContent.payload directly rather than round- tripping through this function.

Parameters

raw_response Optional[dict[str, Any]]

The legacy value, as carried by AgentToolResultContent.raw_response. None is accepted.

Returns

Optional[Union[str, dict[str, Any], list[Any]]]

The tool’s text or JSON output, or None when the value is absent, is a malformed envelope, or is an envelope carrying no text or JSON block.

Was this page helpful?