> ## Documentation Index
> Fetch the complete documentation index at: https://docs.thinkplatform.ai/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Choose User guide for browser tasks, Developers for CLI, SDK and external agents, and Administration for organization management.
> Confirm identity and organization/project context before operations. Documentation access does not grant ThinkPlatform permissions.
> Review side effects, verify changes with a read, and do not blindly retry an operation with an uncertain outcome.
> Use documented UI steps for the web app and documented public CLI or SDK interfaces for automation. Follow each page’s prerequisites and authentication requirements.

# Models and results

> Look up SDK response fields, types, defaults, and JSON aliases.

Import the named types on this page from `thinkplatform.sdk`. Find the method returning a type in the [API reference](https://docs.thinkplatform.ai/python-sdk/api-reference.md). These types describe decoded results. Check the endpoint schema for required fields when creating or updating resources.

| Area | Common result types |
| - | - |
| Identity and scope | [AuthenticatedUser](#authenticateduser), [Organization](#organization), [Project](#project) |
| Agents and workspaces | [AgentSummary](#agentsummary), [AgentDetail](#agentdetail), [AgentAvailableModels](#agentavailablemodels), [AgentWorkspace](#agentworkspace), [AgentWorkspaceUpload](#agentworkspaceupload) |
| Tasks and teams | [Task](#task), [TaskGoalResponse](#taskgoalresponse), [TaskCheckpointPage](#taskcheckpointpage), [TaskRuntimePrepareResponse](#taskruntimeprepareresponse), [Team](#team) |
| Apps and delivery | [CycleApp](#cycleapp), [UiApp](#uiapp), [HookApp](#hookapp), [WebhookSubscription](#webhooksubscription), [WebhookDelivery](#webhookdelivery) |
| Hosted Apps | [HostedAppPermissions](#hostedapppermissions), [HostedAppDeployment](#hostedappdeployment), [HostedAppPublication](#hostedapppublication) |
| Lakehouse SQL | [LakehouseStatement](#lakehousestatement), [LakehouseStatementStatus](#lakehousestatementstatus), [LakehouseStatementResult](#lakehousestatementresult), [LakehouseStatementParameter](#lakehousestatementparameter) |
| Memory | [MemoryItem](#memoryitem), [MemorySearchResponse](#memorysearchresponse), [MemoryImportResponse](#memoryimportresponse) |
| Shared database | [SharedDbTable](#shareddbtable), [SharedDbColumnDefinition](#shareddbcolumndefinition), [SharedDbRow](#shareddbrow), [SharedDbRowQueryResult](#shareddbrowqueryresult) |
| Data lake | [DatalakeListPage](#datalakelistpage), [DatalakeListItem](#datalakelistitem), [DatalakeResolvedPath](#datalakeresolvedpath) |
| MLOps | [MLOpsAsset](#mlopsasset), [MLOpsJobsPage](#mlopsjobspage), [MLOpsDataFilesPage](#mlopsdatafilespage), [MLOpsEnvironment](#mlopsenvironment) |
| Modules, skills, flows | [ModuleDetail](#moduledetail), [ModuleInvocationResult](#moduleinvocationresult), [ModuleResolvedTool](#moduleresolvedtool), [SkillDetail](#skilldetail), [FlowDetail](#flowdetail) |
| Devices | [IoTDevice](#iotdevice), [IoTModule](#iotmodule), [DeviceTag](#devicetag) |
| Transport and credentials | [RawResponse](#rawresponse), [MultipartFile](#multipartfile), [AccessTokenInfo](#accesstokeninfo) |

## Model conventions

Resource models are Pydantic models with attribute access. The tables describe fields declared by this client version; the server can add other fields, which these models allow. Optional response fields default to `None` unless another default is shown. Empty list/dictionary defaults are fresh per instance. An absent field may therefore appear as `None`, `[]`, or `{}` after parsing rather than indicating that the server explicitly returned that value.

The Python field name is shown first. A JSON alias is the field name used in the response JSON; use the Python name when reading attributes. For example, `DatalakeListPage.continuation_token` reads JSON `continuationToken`, and `ModuleSummary.schema_` reads JSON `schema`. When producing JSON from a model, use Pydantic’s `model_dump(by_alias=True)` (v2) or `dict(by_alias=True)` (v1). A serialized response is not automatically a valid write payload.

`Optional[T]` means `T` or `None`; `Any` leaves the value untyped. A union such as `AgentToolConfig | dict[str, Any]` permits either representation, so check the value before relying on nested attribute access. Timestamps are strings unless the field explicitly declares another type; the SDK does not convert them into Python `datetime` objects.

Canvas pages, visualization records, dashboard results, and other methods returning `Mapping[str, Any]` use key access such as `page.get("title")`. `Any` results retain the endpoint’s decoded value without a named model.

## Read a JSON alias

This example reads a JSON field through its Python attribute, then serializes the model using the JSON alias. It runs locally without a network request.

```python theme={"system"}
from thinkplatform.sdk import DatalakeListPage

page = DatalakeListPage(items=[], continuationToken="example-next-page")
assert page.continuation_token == "example-next-page"
if hasattr(page, "model_dump"):
    wire = page.model_dump(by_alias=True)
else:
    wire = page.dict(by_alias=True)
assert wire["continuationToken"] == "example-next-page"
print(page.items, page.continuation_token)
```

## AuthenticatedUser

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `id` | `Optional[int]` | `None` | — |
| `username` | `Optional[str]` | `None` | — |

## Organization

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `id` | `Optional[int]` | `None` | — |
| `name` | `Optional[str]` | `None` | — |

## Project

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `id` | `Optional[int]` | `None` | — |
| `name` | `Optional[str]` | `None` | — |
| `organization_id` | `Optional[int]` | `None` | — |
| `user_role` | `Optional[str]` | `None` | — |

## AgentToolConfig

Use `schema_` for attribute access; its JSON alias is `schema`.

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `path` | `Optional[str]` | `None` | — |
| `url` | `Optional[str]` | `None` | — |
| `config` | `dict[str, Any]` | `{}` | — |
| `schema_` | `Optional[dict[str, Any]]` | `None` | `schema` |
| `description` | `Optional[str]` | `None` | — |
| `title` | `Optional[str]` | `None` | — |
| `device` | `Optional[str]` | `None` | — |
| `name` | `Optional[str]` | `None` | — |
| `type` | `Optional[str]` | `None` | — |
| `spec` | `dict[str, Any]` | `{}` | — |
| `approval_required` | `Optional[bool]` | `None` | — |
| `icon_url` | `Optional[str]` | `None` | — |

## AgentDatabaseRef

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `kind` | `Optional[str]` | `None` | — |
| `provider` | `Optional[str]` | `None` | — |
| `id` | `Optional[str]` | `None` | — |

## AgentWorkspaceUploadFile

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `path` | `Optional[str]` | `None` | — |
| `size` | `Optional[int]` | `None` | — |
| `content_type` | `Optional[str]` | `None` | `contentType` |

## AgentWorkspaceUpload

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `upload_id` | `Optional[str]` | `None` | `uploadId` |
| `container` | `Optional[str]` | `None` | — |
| `base_path` | `Optional[str]` | `None` | `basePath` |
| `expires_at` | `Optional[str]` | `None` | `expiresAt` |
| `files` | `list[AgentWorkspaceUploadFile \| dict[str, Any]]` | `[]` | — |

## AgentSummary

`knowledge_store` supports reading historical records. Nonempty new attachments are rejected by agent create/update methods. `AgentDetail` inherits this response shape.

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `id` | `Optional[int]` | `None` | — |
| `name` | `Optional[str]` | `None` | — |
| `model` | `Optional[str]` | `None` | — |
| `system_prompt` | `Optional[str]` | `None` | — |
| `knowledge_store` | `list[str]` | `[]` | — |
| `databases` | `list[AgentDatabaseRef \| dict[str, Any]]` | `[]` | — |
| `voice` | `Optional[str]` | `None` | — |
| `tools` | `list[AgentToolConfig \| dict[str, Any]]` | `[]` | — |
| `skills` | `list[dict[str, Any]]` | `[]` | — |
| `avatar_url` | `Optional[str]` | `None` | — |
| `access` | `Optional[dict[str, Any]]` | `None` | — |
| `project_id` | `Optional[int]` | `None` | — |
| `owner_project_id` | `Optional[int]` | `None` | — |

## AgentDetail

Inherits all fields from [AgentSummary](#agentsummary).

No additional fields.

## AgentAvailableModels

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `models` | `list[str]` | `[]` | — |
| `presets` | `list[dict[str, str]]` | `[]` | — |
| `options` | `list[dict[str, Any]]` | `[]` | — |
| `default_model` | `Optional[str]` | `None` | — |
| `default_selection` | `Optional[str]` | `None` | — |
| `llm_type` | `Optional[str]` | `None` | — |

## SystemToolCatalog

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `catalog` | `dict[str, Any]` | `{}` | — |
| `default_selection` | `dict[str, Any]` | `{}` | — |
| `project_role` | `Optional[str]` | `None` | — |

## Task

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `id` | `Optional[int]` | `None` | — |
| `thread_id` | `Optional[str]` | `None` | — |
| `title` | `Optional[str]` | `None` | — |
| `description` | `Optional[str]` | `None` | — |
| `org_id` | `Optional[int]` | `None` | — |
| `project_id` | `Optional[int]` | `None` | — |
| `user_id` | `Optional[int]` | `None` | — |
| `agent_id` | `Optional[int]` | `None` | — |
| `team_id` | `Optional[int]` | `None` | — |
| `created_by_task_id` | `Optional[int]` | `None` | — |
| `agent_spawn_depth` | `Optional[int]` | `None` | — |
| `type` | `Optional[str]` | `None` | — |
| `status` | `Optional[str]` | `None` | — |
| `updated_at` | `Optional[str]` | `None` | — |

## TaskGoal

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `id` | `Optional[int]` | `None` | — |
| `task_id` | `Optional[int]` | `None` | — |
| `thread_id` | `Optional[str]` | `None` | — |
| `goal_id` | `Optional[str]` | `None` | — |
| `objective` | `Optional[str]` | `None` | — |
| `status` | `Optional[str]` | `None` | — |
| `token_budget` | `Optional[int]` | `None` | — |
| `tokens_used` | `Optional[int]` | `None` | — |
| `time_used_seconds` | `Optional[int]` | `None` | — |
| `created_at` | `Optional[str]` | `None` | — |
| `updated_at` | `Optional[str]` | `None` | — |
| `completed_at` | `Optional[str]` | `None` | — |

## TaskGoalResponse

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `goal` | `Optional[TaskGoal \| dict[str, Any]]` | `None` | — |

## TaskRuntimePrepareResponse

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `task_id` | `Optional[int]` | `None` | — |
| `thread_id` | `Optional[str]` | `None` | — |
| `status` | `Optional[str]` | `None` | — |
| `expires_at` | `Optional[str]` | `None` | — |
| `is_private` | `Optional[bool]` | `None` | — |
| `reused` | `Optional[bool]` | `None` | — |

## Team

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `id` | `Optional[int]` | `None` | — |
| `name` | `Optional[str]` | `None` | — |
| `description` | `Optional[str]` | `None` | — |
| `org_id` | `Optional[int]` | `None` | — |
| `project_id` | `Optional[int]` | `None` | — |
| `agents` | `list[int]` | `[]` | — |
| `subteams` | `list[int]` | `[]` | — |

## TaskCheckpointPage

Contains checkpoint metadata and messages. It has no offset or continuation token.

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `count` | `Optional[int]` | `None` | — |
| `returned` | `Optional[int]` | `None` | — |
| `direction` | `Optional[str]` | `None` | — |
| `messages` | `list[dict[str, Any]]` | `[]` | — |

## ScheduleConfig

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `type` | `Optional[str]` | `None` | — |
| `time_of_day` | `Optional[str]` | `None` | `time` |
| `days_of_week` | `Optional[list[int]]` | `None` | `daysOfWeek` |
| `days_of_month` | `Optional[list[int \| str]]` | `None` | `daysOfMonth` |
| `run_at` | `Optional[str]` | `None` | `runAt` |
| `start_at` | `Optional[str]` | `None` | `startAt` |
| `timezone` | `Optional[str]` | `None` | — |
| `minute` | `Optional[int]` | `None` | — |
| `second` | `Optional[int]` | `None` | — |
| `interval_seconds` | `Optional[float]` | `None` | `intervalSeconds` |

## TriggerConfig

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `mode` | `Optional[str]` | `None` | — |
| `interval_seconds` | `Optional[float]` | `None` | `intervalSeconds` |
| `schedule` | `Optional[ScheduleConfig \| dict[str, Any]]` | `None` | — |
| `catch_up_missed` | `Optional[bool]` | `None` | `catchUpMissed` |

## CycleApp

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `id` | `Optional[int]` | `None` | — |
| `project_id` | `Optional[int]` | `None` | — |
| `name` | `Optional[str]` | `None` | — |
| `description` | `Optional[str]` | `None` | — |
| `targetType` | `Optional[str]` | `None` | — |
| `deviceId` | `Optional[str]` | `None` | — |
| `flowId` | `Optional[str]` | `None` | — |
| `agentId` | `Optional[int]` | `None` | — |
| `agentPrompt` | `Optional[str]` | `None` | — |
| `memoryEnabled` | `Optional[bool]` | `None` | — |
| `interval` | `Optional[float]` | `None` | — |
| `status` | `Optional[str]` | `None` | — |
| `retry` | `Optional[int]` | `None` | — |
| `inputs` | `list[Any]` | `[]` | — |
| `trigger` | `Optional[TriggerConfig \| dict[str, Any]]` | `None` | — |
| `runAsUserId` | `Optional[int]` | `None` | — |
| `next_run_at` | `Optional[str]` | `None` | — |
| `last_run_at` | `Optional[str]` | `None` | — |
| `last_error` | `Optional[str]` | `None` | — |
| `fail_count` | `Optional[int]` | `None` | — |
| `schedule_metadata` | `Optional[dict[str, Any]]` | `None` | — |

## UiApp

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `id` | `Optional[int]` | `None` | — |
| `project_id` | `Optional[int]` | `None` | — |
| `name` | `Optional[str]` | `None` | — |
| `description` | `Optional[str]` | `None` | — |
| `show_on_dashboard` | `Optional[bool]` | `None` | — |
| `dashboard_tab_label` | `Optional[str]` | `None` | — |
| `is_default_on_dashboard` | `Optional[bool]` | `None` | — |

## AgentWorkspaceEnvVar

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `key` | `Optional[str]` | `None` | — |
| `value` | `Optional[str]` | `None` | — |

## AgentWorkspaceStorageMount

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `storage_path` | `Optional[str]` | `None` | — |
| `mount_path` | `Optional[str]` | `None` | — |

## AgentWorkspace

The model includes legacy `secrets` and `internet_access` fields for reading existing records. Do not include them in create or update requests: the API rejects those write fields. See [Security and authentication](https://docs.thinkplatform.ai/admin/security-and-authentication.md) for runtime credentials and network policy.

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `id` | `Optional[int]` | `None` | — |
| `name` | `Optional[str]` | `None` | — |
| `description` | `Optional[str]` | `None` | — |
| `type` | `Optional[str]` | `None` | — |
| `workspace_url` | `Optional[str]` | `None` | — |
| `container_image` | `Optional[str]` | `None` | — |
| `image_policy` | `Optional[str]` | `None` | — |
| `pinned_image` | `Optional[str]` | `None` | — |
| `deployed_image_digest` | `Optional[str]` | `None` | — |
| `latest_image_digest` | `Optional[str]` | `None` | — |
| `update_available` | `Optional[bool]` | `None` | — |
| `env_vars` | `list[AgentWorkspaceEnvVar \| dict[str, Any]]` | `[]` | — |
| `secrets` | `list[AgentWorkspaceEnvVar \| dict[str, Any]]` | `[]` | — |
| `internet_access` | `Optional[bool]` | `None` | — |
| `github_repo` | `Optional[str]` | `None` | — |
| `setup_script` | `Optional[str]` | `None` | — |
| `cloud_storage_mounts` | `list[AgentWorkspaceStorageMount \| dict[str, Any]]` | `[]` | — |
| `allowed_blob_paths` | `list[str]` | `[]` | — |
| `provisioning_state` | `Optional[str]` | `None` | — |
| `device_id` | `Optional[str]` | `None` | — |
| `access` | `Optional[dict[str, Any]]` | `None` | — |
| `cpu` | `Optional[float]` | `None` | — |
| `memory` | `Optional[str]` | `None` | — |
| `targetPort` | `Optional[int]` | `None` | — |
| `owner_project_id` | `Optional[int]` | `None` | — |

## MemoryItem

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `id` | `Optional[str]` | `None` | — |
| `context` | `Optional[str]` | `None` | — |
| `text` | `Optional[str]` | `None` | — |
| `metadata` | `Optional[dict[str, Any]]` | `None` | — |

## MemorySearchResponse

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `items` | `list[MemoryItem \| dict[str, Any]]` | `[]` | — |

## MemoryImportResponse

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `imported` | `Optional[int]` | `None` | — |
| `failed` | `Optional[int]` | `None` | — |
| `errors` | `list[str]` | `[]` | — |

## MemoryExportResponse

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `items` | `list[MemoryItem \| dict[str, Any]]` | `[]` | — |

## HookResolvedAuthInfo

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `tenant_id` | `Optional[str]` | `None` | `tenantId` |
| `audience` | `Optional[str]` | `None` | — |
| `token_scope` | `Optional[str]` | `None` | `tokenScope` |
| `expected_caller_app_id` | `Optional[str]` | `None` | `expectedCallerAppId` |
| `required_role` | `Optional[str]` | `None` | `requiredRole` |

## HookApp

Some operations return secrets in credential fields. Protect these values as you would any other credential.

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `id` | `Optional[int]` | `None` | — |
| `project_id` | `Optional[int]` | `None` | — |
| `name` | `Optional[str]` | `None` | — |
| `description` | `Optional[str]` | `None` | — |
| `enabled` | `Optional[bool]` | `None` | — |
| `target_type` | `Optional[str]` | `None` | `targetType` |
| `agent_id` | `Optional[int]` | `None` | `agentId` |
| `flow_id` | `Optional[str]` | `None` | `flowId` |
| `run_as_user_id` | `Optional[int]` | `None` | `runAsUserId` |
| `instruction_text` | `Optional[str]` | `None` | `instructionText` |
| `payload_mode` | `Optional[str]` | `None` | `payloadMode` |
| `mapping_mode` | `Optional[str]` | `None` | `mappingMode` |
| `mapping_config` | `dict[str, Any]` | `{}` | `mappingConfig` |
| `auth_mode` | `Optional[str]` | `None` | `authMode` |
| `auth_config` | `dict[str, Any]` | `{}` | `authConfig` |
| `endpoint_key` | `Optional[str]` | `None` | `endpointKey` |
| `generated_secret` | `Optional[str]` | `None` | `generatedSecret` |
| `last_delivery_at` | `Optional[str]` | `None` | `lastDeliveryAt` |
| `last_error` | `Optional[str]` | `None` | `lastError` |
| `resolved_auth_info` | `Optional[HookResolvedAuthInfo]` | `None` | `resolvedAuthInfo` |
| `resolved_auth_error` | `Optional[str]` | `None` | `resolvedAuthError` |

## HookDelivery

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `id` | `Optional[int]` | `None` | — |
| `hook_app_id` | `Optional[int]` | `None` | `hookAppId` |
| `status` | `Optional[str]` | `None` | — |
| `request_id` | `Optional[str]` | `None` | `requestId` |
| `received_at` | `Optional[str]` | `None` | `receivedAt` |
| `content_type` | `Optional[str]` | `None` | `contentType` |
| `headers_json` | `Optional[dict[str, Any]]` | `None` | `headersJson` |
| `query_json` | `Optional[dict[str, Any]]` | `None` | `queryJson` |
| `body_text` | `Optional[str]` | `None` | `bodyText` |
| `body_json` | `Any` | `None` | `bodyJson` |
| `task_id` | `Optional[int]` | `None` | `taskId` |
| `error_message` | `Optional[str]` | `None` | `errorMessage` |
| `response_code` | `Optional[int]` | `None` | `responseCode` |

## HookInvokeAccepted

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `delivery_id` | `Optional[int]` | `None` | `deliveryId` |
| `status` | `Optional[str]` | `None` | — |
| `task_id` | `Optional[int]` | `None` | `taskId` |
| `received_at` | `Optional[str]` | `None` | `receivedAt` |

## WebhookSubscription

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `id` | `Optional[int]` | `None` | — |
| `project_id` | `Optional[int]` | `None` | `projectId` |
| `name` | `Optional[str]` | `None` | — |
| `description` | `Optional[str]` | `None` | — |
| `enabled` | `Optional[bool]` | `None` | — |
| `target_url` | `Optional[str]` | `None` | `targetUrl` |
| `event_types` | `list[str]` | `[]` | `eventTypes` |
| `timeout_seconds` | `Optional[int]` | `None` | `timeoutSeconds` |
| `max_attempts` | `Optional[int]` | `None` | `maxAttempts` |
| `retry_backoff_seconds` | `Optional[int]` | `None` | `retryBackoffSeconds` |
| `auth_mode` | `Optional[str]` | `None` | `authMode` |
| `custom_headers_json` | `dict[str, str]` | `{}` | `customHeadersJson` |
| `has_auth_secret` | `Optional[bool]` | `None` | `hasAuthSecret` |
| `has_signing_secret` | `Optional[bool]` | `None` | `hasSigningSecret` |
| `last_delivery_at` | `Optional[str]` | `None` | `lastDeliveryAt` |
| `last_error` | `Optional[str]` | `None` | `lastError` |
| `created_at` | `Optional[str]` | `None` | `createdAt` |
| `updated_at` | `Optional[str]` | `None` | `updatedAt` |

## WebhookEventTypeOption

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `event_type` | `Optional[str]` | `None` | `eventType` |
| `label` | `Optional[str]` | `None` | — |
| `description` | `Optional[str]` | `None` | — |
| `category` | `Optional[str]` | `None` | — |
| `test_only` | `Optional[bool]` | `None` | `testOnly` |

## WebhookDelivery

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `id` | `Optional[int]` | `None` | — |
| `delivery_key` | `Optional[str]` | `None` | `deliveryKey` |
| `subscription_id` | `Optional[int]` | `None` | `subscriptionId` |
| `event_id` | `Optional[int]` | `None` | `eventId` |
| `event_key` | `Optional[str]` | `None` | `eventKey` |
| `event_type` | `Optional[str]` | `None` | `eventType` |
| `status` | `Optional[str]` | `None` | — |
| `attempt_count` | `Optional[int]` | `None` | `attemptCount` |
| `next_attempt_at` | `Optional[str]` | `None` | `nextAttemptAt` |
| `locked_at` | `Optional[str]` | `None` | `lockedAt` |
| `locked_by` | `Optional[str]` | `None` | `lockedBy` |
| `last_response_code` | `Optional[int]` | `None` | `lastResponseCode` |
| `last_response_body` | `Optional[str]` | `None` | `lastResponseBody` |
| `last_error` | `Optional[str]` | `None` | `lastError` |
| `delivered_at` | `Optional[str]` | `None` | `deliveredAt` |
| `created_at` | `Optional[str]` | `None` | `createdAt` |
| `updated_at` | `Optional[str]` | `None` | `updatedAt` |

## WebhookTestSendResponse

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `subscription_id` | `Optional[int]` | `None` | `subscriptionId` |
| `event_id` | `Optional[int]` | `None` | `eventId` |
| `delivery_id` | `Optional[int]` | `None` | `deliveryId` |
| `delivery_key` | `Optional[str]` | `None` | `deliveryKey` |
| `status` | `Optional[str]` | `None` | — |

## SharedDbAccessProject

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `id` | `Optional[str]` | `None` | — |
| `name` | `Optional[str]` | `None` | — |

## SharedDbAccessSpec

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `mode` | `Optional[str]` | `None` | — |
| `projects` | `dict[str, SharedDbAccessProject]` | `{}` | — |

## SharedDbColumnDefinition

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `id` | `Optional[str]` | `None` | — |
| `key` | `Optional[str]` | `None` | — |
| `label` | `Optional[str]` | `None` | — |
| `description` | `Optional[str]` | `None` | — |
| `type` | `Optional[str]` | `None` | — |
| `required` | `Optional[bool]` | `None` | — |
| `options` | `Optional[list[str]]` | `None` | — |
| `order` | `Optional[int]` | `None` | — |
| `status` | `Optional[str]` | `None` | — |
| `deleted_at` | `Optional[str]` | `None` | — |

## SharedDbQueryFilter

The fields describe filter structure only. Check your deployed API for supported operators and their expected values; this model does not validate or enumerate them.

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `field` | `Optional[str]` | `None` | — |
| `op` | `Optional[str]` | `None` | — |
| `value` | `Any` | `None` | — |

## SharedDbQuerySort

Sort field and direction are strings, not an SDK enumeration. Check your deployed API for supported values.

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `field` | `Optional[str]` | `None` | — |
| `direction` | `Optional[str]` | `None` | — |

## SharedDbQueryMetadata

Query page metadata is optional. It is distinct from continuation tokens used for data lake and MLOps listing.

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `page` | `Optional[int]` | `None` | — |
| `page_size` | `Optional[int]` | `None` | — |
| `total` | `Optional[int]` | `None` | — |

## SharedDbTableSummary

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `id` | `Optional[str]` | `None` | — |
| `owner_project_id` | `Optional[int]` | `None` | — |
| `name` | `Optional[str]` | `None` | — |
| `description` | `Optional[str]` | `None` | — |
| `access_mode` | `Optional[str]` | `None` | — |
| `schema_version` | `Optional[int]` | `None` | — |
| `updated_at` | `Optional[str]` | `None` | — |

## SharedDbTable

Inspect `columns` and `schema_version` before a write. Table access metadata describes server-controlled sharing.

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `id` | `Optional[str]` | `None` | — |
| `org_id` | `Optional[int]` | `None` | — |
| `owner_project_id` | `Optional[int]` | `None` | — |
| `name` | `Optional[str]` | `None` | — |
| `description` | `Optional[str]` | `None` | — |
| `access` | `SharedDbAccessSpec` | `SharedDbAccessSpec()` | — |
| `schema_version` | `Optional[int]` | `None` | — |
| `columns` | `list[SharedDbColumnDefinition]` | `[]` | — |
| `created_at` | `Optional[str]` | `None` | — |
| `updated_at` | `Optional[str]` | `None` | — |
| `created_by` | `Optional[int]` | `None` | — |
| `updated_by` | `Optional[int]` | `None` | — |

## SharedDbRow

User columns are nested under `data`; `id`, `schema_version`, and audit fields are row metadata.

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `id` | `Optional[str]` | `None` | — |
| `org_id` | `Optional[int]` | `None` | — |
| `project_id` | `Optional[int]` | `None` | — |
| `table_id` | `Optional[str]` | `None` | — |
| `schema_version` | `Optional[int]` | `None` | — |
| `data` | `dict[str, Any]` | `{}` | — |
| `created_at` | `Optional[str]` | `None` | — |
| `updated_at` | `Optional[str]` | `None` | — |
| `created_by` | `Optional[int]` | `None` | — |
| `updated_by` | `Optional[int]` | `None` | — |

## SharedDbRowQueryResult

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `items` | `list[SharedDbRow]` | `[]` | — |
| `meta` | `SharedDbQueryMetadata` | `SharedDbQueryMetadata()` | — |

## DatalakeTreeItem

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `name` | `Optional[str]` | `None` | — |
| `path` | `Optional[str]` | `None` | — |
| `logical_path` | `Optional[str]` | `None` | — |
| `physical_path` | `Optional[str]` | `None` | — |
| `has_children` | `Optional[bool]` | `None` | — |

## DatalakeListItem

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `name` | `Optional[str]` | `None` | — |
| `path` | `Optional[str]` | `None` | — |
| `logical_path` | `Optional[str]` | `None` | — |
| `physical_path` | `Optional[str]` | `None` | — |
| `is_directory` | `Optional[bool]` | `None` | — |
| `last_modified` | `Optional[str]` | `None` | — |
| `size` | `Optional[int]` | `None` | — |

## DatalakeListPage

Pass a nonempty `continuation_token` to the next `datalake.list()` call with the same path and context.

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `items` | `list[DatalakeListItem]` | `[]` | — |
| `continuation_token` | `Optional[str]` | `None` | `continuationToken` |
| `resolved_path` | `Optional[dict[str, Any]]` | `None` | — |
| `warnings` | `list[str]` | `[]` | — |

## DatalakeTextPreview

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `content` | `Optional[str]` | `None` | — |

## DatalakeFolderSas

Signed access metadata can contain a time-limited access URL. Use it only for the intended storage operation.

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `path` | `Optional[str]` | `None` | — |
| `sas_url` | `Optional[str]` | `None` | — |
| `expires_at` | `Optional[str]` | `None` | — |

## DatalakeResolvedPath

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `input_path` | `Optional[str]` | `None` | — |
| `logical_path` | `Optional[str]` | `None` | — |
| `physical_path` | `Optional[str]` | `None` | — |
| `scope` | `Optional[str]` | `None` | — |
| `abfss_uri` | `Optional[str]` | `None` | — |
| `container` | `Optional[str]` | `None` | — |
| `storage_account` | `Optional[str]` | `None` | — |

## MLOpsAsset

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `name` | `Optional[str]` | `None` | — |
| `version` | `Optional[str]` | `None` | — |
| `latest_version` | `Optional[str]` | `None` | — |
| `tags` | `dict[str, Any]` | `{}` | — |
| `path` | `Optional[str]` | `None` | — |
| `type` | `Optional[str]` | `None` | — |
| `auto_delete_setting` | `Optional[str]` | `None` | — |
| `description` | `Optional[str]` | `None` | — |
| `properties` | `dict[str, Any]` | `{}` | — |
| `id` | `Optional[str]` | `None` | — |
| `base_path` | `Optional[str]` | `None` | — |
| `datastore` | `Optional[str]` | `None` | — |
| `producer_job_name` | `Optional[str]` | `None` | — |

## MLOpsJob

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `id` | `Optional[str]` | `None` | — |
| `name` | `Optional[str]` | `None` | — |
| `status` | `Optional[str]` | `None` | — |
| `experiment_name` | `Optional[str]` | `None` | — |
| `run_id` | `Optional[str]` | `None` | — |
| `job_name` | `Optional[str]` | `None` | — |
| `experiment_id` | `Optional[str]` | `None` | — |
| `created` | `Optional[str]` | `None` | — |

## MLOpsJobsPage

The records are in `jobs`, rather than `items`. Pass a nonempty `continuation_token` to the next jobs list call.

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `jobs` | `list[MLOpsJob]` | `[]` | — |
| `continuation_token` | `Optional[str]` | `None` | — |

## MLOpsJobLogs

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `logs` | `Optional[str]` | `None` | — |

## MLOpsArtifact

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `name` | `Optional[str]` | `None` | — |
| `version` | `Optional[str]` | `None` | — |
| `tags` | `dict[str, Any]` | `{}` | — |
| `path` | `Optional[str]` | `None` | — |
| `type` | `Optional[str]` | `None` | — |
| `description` | `Optional[str]` | `None` | — |
| `properties` | `dict[str, Any]` | `{}` | — |
| `stage` | `Optional[str]` | `None` | — |
| `files` | `list[str]` | `[]` | — |

## MLOpsDataFile

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `name` | `Optional[str]` | `None` | — |
| `path` | `Optional[str]` | `None` | — |
| `is_directory` | `Optional[bool]` | `None` | — |
| `size` | `Optional[int]` | `None` | — |

## MLOpsDataFilesPage

Pass a nonempty `continuation_token` to the next file-list call with the same asset, version, path, and context.

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `items` | `list[MLOpsDataFile]` | `[]` | — |
| `continuation_token` | `Optional[str]` | `None` | `continuationToken` |
| `root_prefix` | `Optional[str]` | `None` | `rootPrefix` |

## MLOpsFolderSas

Signed access metadata can contain a time-limited access URL. Use it only for the intended storage operation.

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `path` | `Optional[str]` | `None` | — |
| `sas_url` | `Optional[str]` | `None` | — |
| `expires_at` | `Optional[str]` | `None` | — |

## MLOpsEnvironmentCreationContext

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `created_at` | `Optional[str]` | `None` | — |
| `created_by` | `Optional[str]` | `None` | — |
| `created_by_type` | `Optional[str]` | `None` | — |
| `last_modified_at` | `Optional[str]` | `None` | — |
| `last_modified_by` | `Optional[str]` | `None` | — |
| `last_modified_by_type` | `Optional[str]` | `None` | — |

## MLOpsEnvironment

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `creation_context` | `Optional[MLOpsEnvironmentCreationContext]` | `None` | — |
| `description` | `Optional[str]` | `None` | — |
| `id` | `Optional[str]` | `None` | — |
| `image` | `Optional[str]` | `None` | — |
| `name` | `Optional[str]` | `None` | — |
| `os_type` | `Optional[str]` | `None` | — |
| `tags` | `dict[str, str]` | `{}` | — |
| `version` | `Optional[str]` | `None` | — |

## SkillRef

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `id` | `Optional[str]` | `None` | — |
| `name` | `Optional[str]` | `None` | — |
| `description` | `Optional[str]` | `None` | — |
| `blob_prefix` | `Optional[str]` | `None` | — |
| `skill_md_path` | `Optional[str]` | `None` | — |

## SkillMetadata

Inherits all fields from [SkillRef](#skillref).

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `created_at` | `Optional[str]` | `None` | — |
| `updated_at` | `Optional[str]` | `None` | — |
| `size_bytes` | `Optional[int]` | `None` | — |

## SkillDetail

Inherits all fields from [SkillMetadata](#skillmetadata).

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `files` | `list[str]` | `[]` | — |
| `skill_md_content` | `Optional[str]` | `None` | — |

## ModuleSummary

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `id` | `Optional[int]` | `None` | — |
| `name` | `Optional[str]` | `None` | — |
| `url` | `Optional[str]` | `None` | — |
| `type` | `Optional[str]` | `None` | — |
| `device` | `Optional[str]` | `None` | — |
| `schema_` | `Optional[dict[str, Any]]` | `None` | `schema` |
| `spec` | `Optional[dict[str, Any]]` | `None` | — |
| `access` | `Optional[dict[str, Any]]` | `None` | — |
| `project_id` | `Optional[int]` | `None` | — |
| `owner_project_id` | `Optional[int]` | `None` | — |
| `icon_url` | `Optional[str]` | `None` | — |

## ModuleDetail

Inherits all fields from [ModuleSummary](#modulesummary).

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `spec_text` | `Optional[str]` | `None` | — |

## ModuleInvocationResult

The computed read-only property `normalized_result: Any` normalizes common module/MCP content wrappers. It is derived from `result`; it is not a stored response field.

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `apiId` | `Optional[int]` | `None` | — |
| `tool` | `Optional[str]` | `None` | — |
| `result` | `Any` | `None` | — |
| `raw_result` | `Any` | `None` | — |

## ModuleResolvedTool

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `module_id` | `Optional[int \| str]` | `None` | — |
| `module_name` | `Optional[str]` | `None` | — |
| `tool_name` | `Optional[str]` | `None` | — |
| `input_schema` | `dict[str, Any]` | `{}` | — |
| `output_schema` | `dict[str, Any]` | `{}` | — |
| `description` | `Optional[str]` | `None` | — |

## FlowSummary

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `id` | `Optional[str]` | `None` | — |
| `name` | `Optional[str]` | `None` | — |
| `description` | `Optional[str]` | `None` | — |
| `mode` | `Optional[str]` | `None` | — |
| `device` | `Optional[str]` | `None` | — |
| `path` | `Optional[str]` | `None` | — |
| `tags` | `list[str]` | `[]` | — |
| `nodes` | `list[dict[str, Any]]` | `[]` | — |
| `edges` | `list[dict[str, Any]]` | `[]` | — |
| `input_schema` | `dict[str, Any]` | `{}` | — |
| `output_schema` | `dict[str, Any]` | `{}` | — |
| `project_id` | `Optional[int]` | `None` | — |

## FlowDetail

Inherits all fields from [FlowSummary](#flowsummary).

No additional fields.

## DeviceShareProject

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `id` | `Optional[str]` | `None` | — |
| `name` | `Optional[str]` | `None` | — |

## DeviceAccessTag

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `mode` | `Optional[str]` | `None` | — |
| `projects` | `dict[str, DeviceShareProject]` | `{}` | — |

## DeviceTag

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `organization` | `dict[str, Any]` | `{}` | — |
| `project` | `dict[str, Any]` | `{}` | — |
| `site` | `dict[str, Any]` | `{}` | — |
| `device` | `dict[str, Any]` | `{}` | — |
| `network` | `dict[str, Any]` | `{}` | — |
| `access` | `Optional[DeviceAccessTag]` | `None` | — |

## IoTDevice

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `device_id` | `Optional[str]` | `None` | — |
| `device_name` | `Optional[str]` | `None` | — |
| `status` | `Optional[str]` | `None` | — |
| `tags` | `DeviceTag` | `DeviceTag()` | — |

## IoTModule

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `module_id` | `Optional[str]` | `None` | — |
| `module_name` | `Optional[str]` | `None` | — |
| `status` | `Optional[str]` | `None` | — |
| `version` | `Optional[str]` | `None` | — |

## RawResponse

A frozen dataclass returned by raw request, download, and upload methods. All fields are required at construction.

| Field | Type | Meaning |
| - | - | - |
| `status_code` | `int` | HTTP status. Failed HTTP requests raise an SDK error before returning this result. |
| `body` | `bytes` | Unmodified response body. |
| `headers` | `Mapping[str, str]` | Response headers. |
| `content_type` | `str` | Content-Type header, or an empty string. |

## MultipartFile

A frozen dataclass representing a file to upload. `filename: str` and `content: bytes` are required; `content_type: Optional[str]` defaults to `None`. `from_text(filename, content, *, content_type=None, encoding="utf-8")` returns a file with encoded byte content. When no content type is given, multipart requests infer one from the filename or use `application/octet-stream`.

## AccessTokenInfo

A frozen dataclass containing a credential result. All fields are required at construction.

| Field | Type | Meaning |
| - | - | - |
| `token` | `str` | Bearer token; treat it as a credential. |
| `expires_on` | `Optional[int]` | Expiry in Unix seconds, or `None`. |
| `source` | `str` | Credential source label. |
| `claims` | `Mapping[str, Any]` | Token claim metadata; its presence alone does not establish server authorization. |

## CodeFlowDefinition

A frozen dataclass containing metadata for a decorated entrypoint: required `input_schema: Optional[dict[str, Any]]` and `output_schema: Optional[dict[str, Any]]`, plus `name: Optional[str] = None`. The decorator supplies omitted schemas as `None`. [CodeFlow entrypoints](https://docs.thinkplatform.ai/python-sdk/api-reference.md#codeflow-entrypoints) describes `CodeFlowContext`, `CodeFlowTools`, and metadata helpers.

## HostedAppPermissions

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `table_read` | `list[str]` | `[]` | — |
| `table_write` | `list[str]` | `[]` | — |
| `lakehouse_read` | `bool` | `False` | — |
| `project_permissions` | `list[str]` | `[]` | — |

## HostedAppDeployment

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `creation_operation_id` | `str` | `Required` | — |
| `readiness_stage` | `str` | `Required` | — |
| `status` | `str` | `Required` | — |
| `url` | `Optional[str]` | `None` | — |

## HostedAppPublication

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `app_id` | `str` | `Required` | — |
| `title` | `str` | `Required` | — |
| `release` | `str` | `Required` | — |
| `published` | `bool` | `Required` | — |
| `url` | `str` | `Required` | — |
| `permissions` | `HostedAppPermissions` | `HostedAppPermissions()` | — |

## LakehouseStatementParameter

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `name` | `str` | `Required` | — |
| `value` | `Optional[str]` | `None` | — |
| `type` | `Optional[str]` | `None` | — |

## LakehouseStatementStatus

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `state` | `str` | `Required` | — |
| `error` | `Optional[dict[str, Any]]` | `None` | — |

## LakehouseStatementResult

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `data_array` | `Optional[list[list[Any]]]` | `None` | — |
| `next_chunk_index` | `Optional[int]` | `None` | — |

## LakehouseStatement

| Python field | Type | Default | JSON alias |
| - | - | - | - |
| `statement_id` | `str` | `Required` | — |
| `status` | `LakehouseStatementStatus` | `Required` | — |
| `manifest` | `Optional[dict[str, Any]]` | `None` | — |
| `result` | `Optional[LakehouseStatementResult]` | `None` | — |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.