## Summary `httpapi.Read` decoded request bodies with no size limit, so a single request could allocate memory without bound. This adds a 4 MiB default ceiling, leaves the endpoints that legitimately need more explicitly exempted, and counts the rejections so a limit set too tight is visible. This is the first of three PRs split out of #28048, covering the endpoints that answer in `codersdk.Response` shape. The OAuth2 decode paths (RFC 6749, RFC 7591) and the SCIM ones (RFC 7644) answer in their own error shapes and follow in separate PRs, along with the lint rule that pins the invariant. Closes PLAT-463. Remediates SEC-416 (CWE-770, CVSS 7.5) and SEC-392. ## Problem `httpapi.Read` calls `json.NewDecoder(r.Body).Decode(value)` with no ceiling, and no middleware in the chain bounds body size. The exposure is pre-authentication: login, OTP, and first-user creation all read a body before any authorization decision is reached. The existing rate limiter bounds request *rate*, which is orthogonal to the memory a single admitted request may consume. ## Fix `Read` is split into `Read` and `ReadLimit`. `ReadLimit` wraps `r.Body` in an `http.MaxBytesReader` and keeps the existing decode and validate logic; `Read` delegates to it with a new `DefaultMaxRequestBodyBytes` of 4 MiB, which covers the 124 remaining non-test callers at a single site. `http.MaxBytesReader` composes as tightest-wins, so the handlers that pre-wrapped their own bodies pass their limit to `ReadLimit` rather than wrapping, and each keeps its previous ceiling byte for byte. That matters most for the bulk secrets import at `8 * MaxSecretsFileBytes`: an unconditional wrap inside `Read` would have silently halved it to the default. `TestImportUserSecretsBodyLargerThanDefaultLimit` is the regression guard for that specific failure, and `TestMaxBytesReaderNesting` pins the composition behavior the whole requirement rests on. Every rejection site calls `httpapi.RecordRequestBodyLimit`, which names the limit that tripped on the request's existing log line and marks the request so `coderd_api_requests_too_large_total{reason="request_body"}` counts body rejections apart from the 413s coderd answers for other causes, such as agent log storage overflow. A limit set too tight for a legitimate payload therefore surfaces without waiting for a user report. The limit is a constant rather than a deployment option: an operator raising it to unblock something would reopen the vulnerability as configuration, where a security scan will not find it. A legitimate 413 is answered with a targeted `ReadLimit` on that endpoint. ## Behavior change `POST /api/v2/files` now answers 413 rather than 400 when a request body exceeds `HTTPFileMaxBytes`. It installed that bound already but reported the rejection as a read failure, which leaked the stdlib `http: request body too large` string through `Detail` and kept the largest limit in the tree off the metric. The separate 413 for an oversized expanded archive is unchanged. The task log snapshot endpoint now answers 413 rather than 400 when its 64 KiB cap is exceeded. Routing it through `ReadLimit` also changes its decode-failure message from "Failed to decode request payload." to "Request body must be valid JSON.", which is what every other endpoint answers. Its tests are updated to match both. `coderd_api_requests_too_large_total` is new, so there is no existing query to migrate. It counts the 413s coderd answers, labeled `method`, `path`, and `reason`. `reason="request_body"` is a rejection by one of the limits above; `reason="other"` is a 413 that has nothing to do with body size, such as agent log storage overflow. ## Reading this The commits are ordered to be read in sequence. Commits 1 and 2 are the security fix; commits 3 to 5 are the observability consequences, and commit 3 is the one that touches dashboards. Commit 7 documents the limit on the REST API reference index. Commits 6 and 8 add and revert an exhaustive `@Failure 413` annotation pass, which buried the fix under its regenerated swagger, and cancel out.
127 KiB
Generated
title, description, state
| title | description | state | |
|---|---|---|---|
| Chats | REST endpoints for Coder Agents Chats API (programmatic agent sessions). |
|
Programmatic API for Coder Agents (the user-facing "Coder Agents" / "Chats" product). Use these endpoints to create, list, and manage AI coding agent sessions.
List chats
Code samples
# Example request using curl
curl -X GET http://coder-server:8080/api/experimental/chats \
-H 'Accept: application/json' \
-H 'Coder-Session-Token: API_KEY'
GET /api/experimental/chats
Experimental: this endpoint is subject to change.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
q |
query | string | false | Search query. Supports title:<substring> (case-insensitive, quote multi-word values), archived:bool, has_unread:bool, pr_status:<draft|open|merged|closed> as repeated or comma-separated values, source:<created_by_me|shared_with_me>, diff_url:<url> (quote values containing colons), pr:<number> (exact PR number match), repo:<owner/repo> (case-insensitive substring match against git remote origin or URL), pr_title:<text> (case-insensitive PR title substring), search:<text> (full-text search across chat titles, PR titles, PR numbers, and message bodies; quote multi-word values; cannot be combined with title, pr_title, or pr; a value that tokenizes to no searchable words returns an empty list). Bare terms are not supported; use title:<value> or search:<value>. |
label |
query | string | false | Filter by label as key:value. Repeat for multiple (AND logic). |
Example responses
200 Response
[
{
"agent_id": "2b1e3b65-2c04-4fa2-a2d7-467901e98978",
"archived": true,
"build_id": "bfb1f3fa-bf7b-43a5-9e0b-26cc050e44cb",
"children": [
{}
],
"client_type": "ui",
"context": {
"dirty": true,
"dirty_since": "2019-08-24T14:15:22Z",
"error": "string",
"resources": [
{
"error": "string",
"kind": "instruction_file",
"size_bytes": 0,
"skill_description": "string",
"skill_name": "string",
"source": "string",
"status": "ok",
"tools": [
{
"description": "string",
"name": "string"
}
]
}
]
},
"created_at": "2019-08-24T14:15:22Z",
"diff_status": {
"additions": 0,
"approved": true,
"author_avatar_url": "string",
"author_login": "string",
"base_branch": "string",
"changed_files": 0,
"changes_requested": true,
"chat_id": "efc9fe20-a1e5-4a8c-9c48-f1b30c1e4f86",
"commits": 0,
"deletions": 0,
"head_branch": "string",
"pr_number": 0,
"pull_request_draft": true,
"pull_request_state": "string",
"pull_request_title": "string",
"refreshed_at": "2019-08-24T14:15:22Z",
"reviewer_count": 0,
"stale_at": "2019-08-24T14:15:22Z",
"url": "string"
},
"files": [
{
"created_at": "2019-08-24T14:15:22Z",
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"mime_type": "string",
"name": "string",
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"size_bytes": 0
}
],
"has_unread": true,
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"labels": {
"property1": "string",
"property2": "string"
},
"last_error": {
"detail": "string",
"kind": "generic",
"message": "string",
"provider": "string",
"retryable": true,
"status_code": 0
},
"last_model_config_id": "30ebb95f-c255-4759-9429-89aa4ec1554c",
"last_reasoning_effort": "string",
"last_turn_summary": "string",
"mcp_server_ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
],
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"owner_name": "string",
"owner_username": "string",
"parent_chat_id": "c3609ee6-3b11-4a93-b9ae-e4fabcc99359",
"pin_order": 0,
"plan_mode": "plan",
"queued_for_capacity": true,
"root_chat_id": "2898031c-fdce-4e3e-8c53-4481dd42fcd7",
"shared": true,
"status": "waiting",
"summary": "string",
"title": "string",
"updated_at": "2019-08-24T14:15:22Z",
"warnings": [
"string"
],
"workspace_id": "0967198e-ec7b-4c6b-b4d3-f71244cadbe9"
}
]
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | array of codersdk.Chat |
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
[array item] |
array | false | ||
» agent_id |
string(uuid) | false | ||
» archived |
boolean | false | ||
» build_id |
string(uuid) | false | ||
» children |
codersdk.Chat | false | Children holds child (subagent) chats nested under this root chat. Always initialized to an empty slice so the JSON field is present as []. Child chats cannot create their own subagents, so nesting depth is capped at 1 and this slice is always empty for child chats. | |
» client_type |
codersdk.ChatClientType | false | ||
» context |
codersdk.ChatContext | false | Context reports the chat's pinned workspace-context state and whether it has drifted from the agent's latest pushed snapshot. Nil when the chat has no pinned context yet. | |
»» dirty |
boolean | false | Dirty is true when the agent's latest snapshot hash differs from the chat's pinned hash. | |
»» dirty_since |
string(date-time) | false | Dirty since is when drift was first detected; nil when not dirty. | |
»» error |
string | false | Error is the snapshot-level error copied from the pinned snapshot (empty when healthy). | |
»» resources |
array | false | Resources is the chat's pinned context (instruction files and skills) the prompt is built from, metadata only (no bodies). It is populated only on the single-chat GET response; list and watch payloads leave it nil to stay lightweight. | |
»»» error |
string | false | Error explains a non-ok Status; empty when healthy. May also carry a non-fatal warning when Status is ok. | |
»»» kind |
codersdk.ChatContextResourceKind | false | ||
»»» size_bytes |
integer | false | Size bytes is the original payload size in bytes. | |
»»» skill_description |
string | false | ||
»»» skill_name |
string | false | Skill name and SkillDescription are populated only for skill kinds. | |
»»» source |
string | false | Source is the resource locator: the canonical file path for an instruction file, the skill directory for a skill, the file path for an MCP config, or the server name for an MCP server. | |
»»» status |
codersdk.ChatContextResourceStatus | false | Status is the resource's health. Non-ok resources (invalid, unreadable, oversize, excluded) are still reported so the UI can surface why a resource was dropped from the prompt instead of silently omitting it; their body-specific fields (skill name, tools) are empty. | |
»»» tools |
array | false | Tools lists the tools exposed by an MCP server. Populated only for the mcp_server kind; nil otherwise. | |
»»»» description |
string | false | Description is the tool's human-readable summary; may be empty. | |
»»»» name |
string | false | Name is the tool name with the <server>__ prefix the agent adds stripped, so it reads as the server exposes it. |
|
» created_at |
string(date-time) | false | ||
» diff_status |
codersdk.ChatDiffStatus | false | ||
»» additions |
integer | false | ||
»» approved |
boolean | false | ||
»» author_avatar_url |
string | false | ||
»» author_login |
string | false | ||
»» base_branch |
string | false | ||
»» changed_files |
integer | false | ||
»» changes_requested |
boolean | false | ||
»» chat_id |
string(uuid) | false | ||
»» commits |
integer | false | ||
»» deletions |
integer | false | ||
»» head_branch |
string | false | ||
»» pr_number |
integer | false | ||
»» pull_request_draft |
boolean | false | ||
»» pull_request_state |
string | false | ||
»» pull_request_title |
string | false | ||
»» refreshed_at |
string(date-time) | false | ||
»» reviewer_count |
integer | false | ||
»» stale_at |
string(date-time) | false | ||
»» url |
string | false | ||
» files |
array | false | ||
»» created_at |
string(date-time) | false | ||
»» id |
string(uuid) | false | ||
»» mime_type |
string | false | ||
»» name |
string | false | ||
»» organization_id |
string(uuid) | false | ||
»» owner_id |
string(uuid) | false | ||
»» size_bytes |
integer | false | ||
» has_unread |
boolean | false | Has unread is true when assistant messages exist beyond the owner's read cursor, which updates on stream connect and disconnect. | |
» id |
string(uuid) | false | ||
» labels |
object | false | ||
»» [any property] |
string | false | ||
» last_error |
codersdk.ChatError | false | ||
»» detail |
string | false | Detail is optional provider-specific context shown alongside the normalized error message when available. | |
»» kind |
codersdk.ChatErrorKind | false | Kind classifies the error for consistent client rendering. | |
»» message |
string | false | Message is the normalized, user-facing error message. | |
»» provider |
string | false | Provider identifies the upstream model provider when known. | |
»» retryable |
boolean | false | Retryable reports whether the underlying error is transient. | |
»» status_code |
integer | false | Status code is the best-effort upstream HTTP status code. | |
» last_model_config_id |
string(uuid) | false | ||
» last_reasoning_effort |
string | false | ||
» last_turn_summary |
string | false | ||
» mcp_server_ids |
array | false | ||
» organization_id |
string(uuid) | false | ||
» owner_id |
string(uuid) | false | ||
» owner_name |
string | false | ||
» owner_username |
string | false | ||
» parent_chat_id |
string(uuid) | false | ||
» pin_order |
integer | false | ||
» plan_mode |
codersdk.ChatPlanMode | false | ||
» queued_for_capacity |
boolean | false | Queued for capacity reports that the chat is waiting for a concurrent agent slot. Single-chat reads derive it; list responses leave it false. | |
» root_chat_id |
string(uuid) | false | ||
» shared |
boolean | false | Shared is true when this chat's root chat has explicit user or group ACL entries. | |
» status |
codersdk.ChatStatus | false | ||
» summary |
string | false | Summary is the persisted whole-chat summary, generated in the background. It is nil until the first summary has been produced. | |
» title |
string | false | ||
» updated_at |
string(date-time) | false | ||
» warnings |
array | false | ||
» workspace_id |
string(uuid) | false |
Enumerated Values
| Property | Value(s) |
|---|---|
client_type |
api, ui |
kind |
auth, config, content_filter, generic, hook_denied, hook_dispatch_failed, instruction_file, mcp_config, mcp_server, missing_key, overloaded, provider_disabled, rate_limit, skill, stream_silence_timeout, timeout, usage_limit |
status |
error, excluded, interrupting, invalid, ok, oversize, requires_action, running, unreadable, waiting |
plan_mode |
plan |
To perform this operation, you must be authenticated. Learn more.
Create chat
Code samples
# Example request using curl
curl -X POST http://coder-server:8080/api/experimental/chats \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Coder-Session-Token: API_KEY'
POST /api/experimental/chats
Experimental: this endpoint is subject to change.
Body parameter
{
"client_type": "ui",
"content": [
{
"content": "string",
"end_line": 0,
"file_id": "8a0cfb4f-ddc9-436d-91bb-75133c583767",
"file_name": "string",
"start_line": 0,
"text": "string",
"type": "text"
}
],
"labels": {
"property1": "string",
"property2": "string"
},
"mcp_server_ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
],
"model_config_id": "f5fb4d91-62ca-4377-9ee6-5d43ba00d205",
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"plan_mode": "plan",
"reasoning_effort": "string",
"system_prompt": "string",
"unsafe_dynamic_tools": [
{
"description": "string",
"input_schema": [
0
],
"name": "string"
}
],
"workspace_id": "0967198e-ec7b-4c6b-b4d3-f71244cadbe9"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
body |
body | codersdk.CreateChatRequest | true | Create chat request |
Example responses
201 Response
{
"agent_id": "2b1e3b65-2c04-4fa2-a2d7-467901e98978",
"archived": true,
"build_id": "bfb1f3fa-bf7b-43a5-9e0b-26cc050e44cb",
"children": [
{
"agent_id": "2b1e3b65-2c04-4fa2-a2d7-467901e98978",
"archived": true,
"build_id": "bfb1f3fa-bf7b-43a5-9e0b-26cc050e44cb",
"children": [],
"client_type": "ui",
"context": {
"dirty": true,
"dirty_since": "2019-08-24T14:15:22Z",
"error": "string",
"resources": [
{
"error": "string",
"kind": "instruction_file",
"size_bytes": 0,
"skill_description": "string",
"skill_name": "string",
"source": "string",
"status": "ok",
"tools": [
{
"description": "string",
"name": "string"
}
]
}
]
},
"created_at": "2019-08-24T14:15:22Z",
"diff_status": {
"additions": 0,
"approved": true,
"author_avatar_url": "string",
"author_login": "string",
"base_branch": "string",
"changed_files": 0,
"changes_requested": true,
"chat_id": "efc9fe20-a1e5-4a8c-9c48-f1b30c1e4f86",
"commits": 0,
"deletions": 0,
"head_branch": "string",
"pr_number": 0,
"pull_request_draft": true,
"pull_request_state": "string",
"pull_request_title": "string",
"refreshed_at": "2019-08-24T14:15:22Z",
"reviewer_count": 0,
"stale_at": "2019-08-24T14:15:22Z",
"url": "string"
},
"files": [
{
"created_at": "2019-08-24T14:15:22Z",
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"mime_type": "string",
"name": "string",
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"size_bytes": 0
}
],
"has_unread": true,
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"labels": {
"property1": "string",
"property2": "string"
},
"last_error": {
"detail": "string",
"kind": "generic",
"message": "string",
"provider": "string",
"retryable": true,
"status_code": 0
},
"last_model_config_id": "30ebb95f-c255-4759-9429-89aa4ec1554c",
"last_reasoning_effort": "string",
"last_turn_summary": "string",
"mcp_server_ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
],
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"owner_name": "string",
"owner_username": "string",
"parent_chat_id": "c3609ee6-3b11-4a93-b9ae-e4fabcc99359",
"pin_order": 0,
"plan_mode": "plan",
"queued_for_capacity": true,
"root_chat_id": "2898031c-fdce-4e3e-8c53-4481dd42fcd7",
"shared": true,
"status": "waiting",
"summary": "string",
"title": "string",
"updated_at": "2019-08-24T14:15:22Z",
"warnings": [
"string"
],
"workspace_id": "0967198e-ec7b-4c6b-b4d3-f71244cadbe9"
}
],
"client_type": "ui",
"context": {
"dirty": true,
"dirty_since": "2019-08-24T14:15:22Z",
"error": "string",
"resources": [
{
"error": "string",
"kind": "instruction_file",
"size_bytes": 0,
"skill_description": "string",
"skill_name": "string",
"source": "string",
"status": "ok",
"tools": [
{
"description": "string",
"name": "string"
}
]
}
]
},
"created_at": "2019-08-24T14:15:22Z",
"diff_status": {
"additions": 0,
"approved": true,
"author_avatar_url": "string",
"author_login": "string",
"base_branch": "string",
"changed_files": 0,
"changes_requested": true,
"chat_id": "efc9fe20-a1e5-4a8c-9c48-f1b30c1e4f86",
"commits": 0,
"deletions": 0,
"head_branch": "string",
"pr_number": 0,
"pull_request_draft": true,
"pull_request_state": "string",
"pull_request_title": "string",
"refreshed_at": "2019-08-24T14:15:22Z",
"reviewer_count": 0,
"stale_at": "2019-08-24T14:15:22Z",
"url": "string"
},
"files": [
{
"created_at": "2019-08-24T14:15:22Z",
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"mime_type": "string",
"name": "string",
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"size_bytes": 0
}
],
"has_unread": true,
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"labels": {
"property1": "string",
"property2": "string"
},
"last_error": {
"detail": "string",
"kind": "generic",
"message": "string",
"provider": "string",
"retryable": true,
"status_code": 0
},
"last_model_config_id": "30ebb95f-c255-4759-9429-89aa4ec1554c",
"last_reasoning_effort": "string",
"last_turn_summary": "string",
"mcp_server_ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
],
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"owner_name": "string",
"owner_username": "string",
"parent_chat_id": "c3609ee6-3b11-4a93-b9ae-e4fabcc99359",
"pin_order": 0,
"plan_mode": "plan",
"queued_for_capacity": true,
"root_chat_id": "2898031c-fdce-4e3e-8c53-4481dd42fcd7",
"shared": true,
"status": "waiting",
"summary": "string",
"title": "string",
"updated_at": "2019-08-24T14:15:22Z",
"warnings": [
"string"
],
"workspace_id": "0967198e-ec7b-4c6b-b4d3-f71244cadbe9"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | Created | codersdk.Chat |
| 413 | Payload Too Large | Request body exceeds 256 KiB | codersdk.Response |
To perform this operation, you must be authenticated. Learn more.
Upload chat file
Code samples
# Example request using curl
curl -X POST http://coder-server:8080/api/experimental/chats/files?organization=497f6eca-6276-4993-bfeb-53cbbbba6f08 \
-H 'Accept: application/json' \
-H 'Coder-Session-Token: API_KEY'
POST /api/experimental/chats/files
Experimental: this endpoint is subject to change.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
organization |
query | string(uuid) | true | Organization ID |
Example responses
201 Response
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | Created | codersdk.UploadChatFileResponse |
| 413 | Payload Too Large | Request body exceeds 10 MiB | codersdk.Response |
To perform this operation, you must be authenticated. Learn more.
Get chat file
Code samples
# Example request using curl
curl -X GET http://coder-server:8080/api/experimental/chats/files/{file} \
-H 'Coder-Session-Token: API_KEY'
GET /api/experimental/chats/files/{file}
Experimental: this endpoint is subject to change.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
file |
path | string(uuid) | true | File ID |
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK |
To perform this operation, you must be authenticated. Learn more.
List chat models
Code samples
# Example request using curl
curl -X GET http://coder-server:8080/api/experimental/chats/models \
-H 'Accept: application/json' \
-H 'Coder-Session-Token: API_KEY'
GET /api/experimental/chats/models
Experimental: this endpoint is subject to change.
Example responses
200 Response
{
"providers": [
{
"available": true,
"models": [
{
"display_name": "string",
"id": "string",
"model": "string",
"provider": "string"
}
],
"provider": "string",
"unavailable_reason": "missing_api_key"
}
],
"unsupported_providers": [
{
"display_name": "string",
"provider": "string"
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | codersdk.ChatModelsResponse |
To perform this operation, you must be authenticated. Learn more.
Watch chat events for a user via WebSockets
Code samples
# Example request using curl
curl -X GET http://coder-server:8080/api/experimental/chats/watch \
-H 'Accept: application/json' \
-H 'Coder-Session-Token: API_KEY'
GET /api/experimental/chats/watch
Experimental: this endpoint is subject to change.
Example responses
200 Response
{
"chat": {
"agent_id": "2b1e3b65-2c04-4fa2-a2d7-467901e98978",
"archived": true,
"build_id": "bfb1f3fa-bf7b-43a5-9e0b-26cc050e44cb",
"children": [
{}
],
"client_type": "ui",
"context": {
"dirty": true,
"dirty_since": "2019-08-24T14:15:22Z",
"error": "string",
"resources": [
{
"error": "string",
"kind": "instruction_file",
"size_bytes": 0,
"skill_description": "string",
"skill_name": "string",
"source": "string",
"status": "ok",
"tools": [
{
"description": "string",
"name": "string"
}
]
}
]
},
"created_at": "2019-08-24T14:15:22Z",
"diff_status": {
"additions": 0,
"approved": true,
"author_avatar_url": "string",
"author_login": "string",
"base_branch": "string",
"changed_files": 0,
"changes_requested": true,
"chat_id": "efc9fe20-a1e5-4a8c-9c48-f1b30c1e4f86",
"commits": 0,
"deletions": 0,
"head_branch": "string",
"pr_number": 0,
"pull_request_draft": true,
"pull_request_state": "string",
"pull_request_title": "string",
"refreshed_at": "2019-08-24T14:15:22Z",
"reviewer_count": 0,
"stale_at": "2019-08-24T14:15:22Z",
"url": "string"
},
"files": [
{
"created_at": "2019-08-24T14:15:22Z",
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"mime_type": "string",
"name": "string",
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"size_bytes": 0
}
],
"has_unread": true,
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"labels": {
"property1": "string",
"property2": "string"
},
"last_error": {
"detail": "string",
"kind": "generic",
"message": "string",
"provider": "string",
"retryable": true,
"status_code": 0
},
"last_model_config_id": "30ebb95f-c255-4759-9429-89aa4ec1554c",
"last_reasoning_effort": "string",
"last_turn_summary": "string",
"mcp_server_ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
],
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"owner_name": "string",
"owner_username": "string",
"parent_chat_id": "c3609ee6-3b11-4a93-b9ae-e4fabcc99359",
"pin_order": 0,
"plan_mode": "plan",
"queued_for_capacity": true,
"root_chat_id": "2898031c-fdce-4e3e-8c53-4481dd42fcd7",
"shared": true,
"status": "waiting",
"summary": "string",
"title": "string",
"updated_at": "2019-08-24T14:15:22Z",
"warnings": [
"string"
],
"workspace_id": "0967198e-ec7b-4c6b-b4d3-f71244cadbe9"
},
"kind": "status_change",
"tool_calls": [
{
"args": "string",
"tool_call_id": "string",
"tool_name": "string"
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | codersdk.ChatWatchEvent |
To perform this operation, you must be authenticated. Learn more.
Get chat by ID
Code samples
# Example request using curl
curl -X GET http://coder-server:8080/api/experimental/chats/{chat} \
-H 'Accept: application/json' \
-H 'Coder-Session-Token: API_KEY'
GET /api/experimental/chats/{chat}
Experimental: this endpoint is subject to change.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
chat |
path | string(uuid) | true | Chat ID |
Example responses
200 Response
{
"agent_id": "2b1e3b65-2c04-4fa2-a2d7-467901e98978",
"archived": true,
"build_id": "bfb1f3fa-bf7b-43a5-9e0b-26cc050e44cb",
"children": [
{
"agent_id": "2b1e3b65-2c04-4fa2-a2d7-467901e98978",
"archived": true,
"build_id": "bfb1f3fa-bf7b-43a5-9e0b-26cc050e44cb",
"children": [],
"client_type": "ui",
"context": {
"dirty": true,
"dirty_since": "2019-08-24T14:15:22Z",
"error": "string",
"resources": [
{
"error": "string",
"kind": "instruction_file",
"size_bytes": 0,
"skill_description": "string",
"skill_name": "string",
"source": "string",
"status": "ok",
"tools": [
{
"description": "string",
"name": "string"
}
]
}
]
},
"created_at": "2019-08-24T14:15:22Z",
"diff_status": {
"additions": 0,
"approved": true,
"author_avatar_url": "string",
"author_login": "string",
"base_branch": "string",
"changed_files": 0,
"changes_requested": true,
"chat_id": "efc9fe20-a1e5-4a8c-9c48-f1b30c1e4f86",
"commits": 0,
"deletions": 0,
"head_branch": "string",
"pr_number": 0,
"pull_request_draft": true,
"pull_request_state": "string",
"pull_request_title": "string",
"refreshed_at": "2019-08-24T14:15:22Z",
"reviewer_count": 0,
"stale_at": "2019-08-24T14:15:22Z",
"url": "string"
},
"files": [
{
"created_at": "2019-08-24T14:15:22Z",
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"mime_type": "string",
"name": "string",
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"size_bytes": 0
}
],
"has_unread": true,
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"labels": {
"property1": "string",
"property2": "string"
},
"last_error": {
"detail": "string",
"kind": "generic",
"message": "string",
"provider": "string",
"retryable": true,
"status_code": 0
},
"last_model_config_id": "30ebb95f-c255-4759-9429-89aa4ec1554c",
"last_reasoning_effort": "string",
"last_turn_summary": "string",
"mcp_server_ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
],
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"owner_name": "string",
"owner_username": "string",
"parent_chat_id": "c3609ee6-3b11-4a93-b9ae-e4fabcc99359",
"pin_order": 0,
"plan_mode": "plan",
"queued_for_capacity": true,
"root_chat_id": "2898031c-fdce-4e3e-8c53-4481dd42fcd7",
"shared": true,
"status": "waiting",
"summary": "string",
"title": "string",
"updated_at": "2019-08-24T14:15:22Z",
"warnings": [
"string"
],
"workspace_id": "0967198e-ec7b-4c6b-b4d3-f71244cadbe9"
}
],
"client_type": "ui",
"context": {
"dirty": true,
"dirty_since": "2019-08-24T14:15:22Z",
"error": "string",
"resources": [
{
"error": "string",
"kind": "instruction_file",
"size_bytes": 0,
"skill_description": "string",
"skill_name": "string",
"source": "string",
"status": "ok",
"tools": [
{
"description": "string",
"name": "string"
}
]
}
]
},
"created_at": "2019-08-24T14:15:22Z",
"diff_status": {
"additions": 0,
"approved": true,
"author_avatar_url": "string",
"author_login": "string",
"base_branch": "string",
"changed_files": 0,
"changes_requested": true,
"chat_id": "efc9fe20-a1e5-4a8c-9c48-f1b30c1e4f86",
"commits": 0,
"deletions": 0,
"head_branch": "string",
"pr_number": 0,
"pull_request_draft": true,
"pull_request_state": "string",
"pull_request_title": "string",
"refreshed_at": "2019-08-24T14:15:22Z",
"reviewer_count": 0,
"stale_at": "2019-08-24T14:15:22Z",
"url": "string"
},
"files": [
{
"created_at": "2019-08-24T14:15:22Z",
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"mime_type": "string",
"name": "string",
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"size_bytes": 0
}
],
"has_unread": true,
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"labels": {
"property1": "string",
"property2": "string"
},
"last_error": {
"detail": "string",
"kind": "generic",
"message": "string",
"provider": "string",
"retryable": true,
"status_code": 0
},
"last_model_config_id": "30ebb95f-c255-4759-9429-89aa4ec1554c",
"last_reasoning_effort": "string",
"last_turn_summary": "string",
"mcp_server_ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
],
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"owner_name": "string",
"owner_username": "string",
"parent_chat_id": "c3609ee6-3b11-4a93-b9ae-e4fabcc99359",
"pin_order": 0,
"plan_mode": "plan",
"queued_for_capacity": true,
"root_chat_id": "2898031c-fdce-4e3e-8c53-4481dd42fcd7",
"shared": true,
"status": "waiting",
"summary": "string",
"title": "string",
"updated_at": "2019-08-24T14:15:22Z",
"warnings": [
"string"
],
"workspace_id": "0967198e-ec7b-4c6b-b4d3-f71244cadbe9"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | codersdk.Chat |
To perform this operation, you must be authenticated. Learn more.
Update chat
Code samples
# Example request using curl
curl -X PATCH http://coder-server:8080/api/experimental/chats/{chat} \
-H 'Content-Type: application/json' \
-H 'Coder-Session-Token: API_KEY'
PATCH /api/experimental/chats/{chat}
Experimental: this endpoint is subject to change.
Body parameter
{
"archived": true,
"labels": {
"property1": "string",
"property2": "string"
},
"pin_order": 0,
"plan_mode": "plan",
"title": "string",
"workspace_id": "0967198e-ec7b-4c6b-b4d3-f71244cadbe9"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
chat |
path | string(uuid) | true | Chat ID |
body |
body | codersdk.UpdateChatRequest | true | Update chat request |
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 204 | No Content | No Content |
To perform this operation, you must be authenticated. Learn more.
Refresh chat context
Code samples
# Example request using curl
curl -X PUT http://coder-server:8080/api/experimental/chats/{chat}/context \
-H 'Accept: application/json' \
-H 'Coder-Session-Token: API_KEY'
PUT /api/experimental/chats/{chat}/context
Experimental: this endpoint is subject to change.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
chat |
path | string(uuid) | true | Chat ID |
Example responses
200 Response
{
"agent_id": "2b1e3b65-2c04-4fa2-a2d7-467901e98978",
"archived": true,
"build_id": "bfb1f3fa-bf7b-43a5-9e0b-26cc050e44cb",
"children": [
{
"agent_id": "2b1e3b65-2c04-4fa2-a2d7-467901e98978",
"archived": true,
"build_id": "bfb1f3fa-bf7b-43a5-9e0b-26cc050e44cb",
"children": [],
"client_type": "ui",
"context": {
"dirty": true,
"dirty_since": "2019-08-24T14:15:22Z",
"error": "string",
"resources": [
{
"error": "string",
"kind": "instruction_file",
"size_bytes": 0,
"skill_description": "string",
"skill_name": "string",
"source": "string",
"status": "ok",
"tools": [
{
"description": "string",
"name": "string"
}
]
}
]
},
"created_at": "2019-08-24T14:15:22Z",
"diff_status": {
"additions": 0,
"approved": true,
"author_avatar_url": "string",
"author_login": "string",
"base_branch": "string",
"changed_files": 0,
"changes_requested": true,
"chat_id": "efc9fe20-a1e5-4a8c-9c48-f1b30c1e4f86",
"commits": 0,
"deletions": 0,
"head_branch": "string",
"pr_number": 0,
"pull_request_draft": true,
"pull_request_state": "string",
"pull_request_title": "string",
"refreshed_at": "2019-08-24T14:15:22Z",
"reviewer_count": 0,
"stale_at": "2019-08-24T14:15:22Z",
"url": "string"
},
"files": [
{
"created_at": "2019-08-24T14:15:22Z",
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"mime_type": "string",
"name": "string",
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"size_bytes": 0
}
],
"has_unread": true,
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"labels": {
"property1": "string",
"property2": "string"
},
"last_error": {
"detail": "string",
"kind": "generic",
"message": "string",
"provider": "string",
"retryable": true,
"status_code": 0
},
"last_model_config_id": "30ebb95f-c255-4759-9429-89aa4ec1554c",
"last_reasoning_effort": "string",
"last_turn_summary": "string",
"mcp_server_ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
],
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"owner_name": "string",
"owner_username": "string",
"parent_chat_id": "c3609ee6-3b11-4a93-b9ae-e4fabcc99359",
"pin_order": 0,
"plan_mode": "plan",
"queued_for_capacity": true,
"root_chat_id": "2898031c-fdce-4e3e-8c53-4481dd42fcd7",
"shared": true,
"status": "waiting",
"summary": "string",
"title": "string",
"updated_at": "2019-08-24T14:15:22Z",
"warnings": [
"string"
],
"workspace_id": "0967198e-ec7b-4c6b-b4d3-f71244cadbe9"
}
],
"client_type": "ui",
"context": {
"dirty": true,
"dirty_since": "2019-08-24T14:15:22Z",
"error": "string",
"resources": [
{
"error": "string",
"kind": "instruction_file",
"size_bytes": 0,
"skill_description": "string",
"skill_name": "string",
"source": "string",
"status": "ok",
"tools": [
{
"description": "string",
"name": "string"
}
]
}
]
},
"created_at": "2019-08-24T14:15:22Z",
"diff_status": {
"additions": 0,
"approved": true,
"author_avatar_url": "string",
"author_login": "string",
"base_branch": "string",
"changed_files": 0,
"changes_requested": true,
"chat_id": "efc9fe20-a1e5-4a8c-9c48-f1b30c1e4f86",
"commits": 0,
"deletions": 0,
"head_branch": "string",
"pr_number": 0,
"pull_request_draft": true,
"pull_request_state": "string",
"pull_request_title": "string",
"refreshed_at": "2019-08-24T14:15:22Z",
"reviewer_count": 0,
"stale_at": "2019-08-24T14:15:22Z",
"url": "string"
},
"files": [
{
"created_at": "2019-08-24T14:15:22Z",
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"mime_type": "string",
"name": "string",
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"size_bytes": 0
}
],
"has_unread": true,
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"labels": {
"property1": "string",
"property2": "string"
},
"last_error": {
"detail": "string",
"kind": "generic",
"message": "string",
"provider": "string",
"retryable": true,
"status_code": 0
},
"last_model_config_id": "30ebb95f-c255-4759-9429-89aa4ec1554c",
"last_reasoning_effort": "string",
"last_turn_summary": "string",
"mcp_server_ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
],
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"owner_name": "string",
"owner_username": "string",
"parent_chat_id": "c3609ee6-3b11-4a93-b9ae-e4fabcc99359",
"pin_order": 0,
"plan_mode": "plan",
"queued_for_capacity": true,
"root_chat_id": "2898031c-fdce-4e3e-8c53-4481dd42fcd7",
"shared": true,
"status": "waiting",
"summary": "string",
"title": "string",
"updated_at": "2019-08-24T14:15:22Z",
"warnings": [
"string"
],
"workspace_id": "0967198e-ec7b-4c6b-b4d3-f71244cadbe9"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | codersdk.Chat |
To perform this operation, you must be authenticated. Learn more.
Get chat cost
Code samples
# Example request using curl
curl -X GET http://coder-server:8080/api/experimental/chats/{chat}/cost \
-H 'Accept: application/json' \
-H 'Coder-Session-Token: API_KEY'
GET /api/experimental/chats/{chat}/cost
Experimental: this endpoint is subject to change.
Cost covers the whole chat tree: the root chat plus every subagent chat beneath it. Requesting cost for a subagent chat returns that same total.
Cost is derived from AI Gateway data, which is subject to its own retention period, 60 days by default, configured independently of chat retention. Spend for requests older than that period is no longer reported, so a chat whose requests have all been purged reports zero cost.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
chat |
path | string(uuid) | true | Chat ID |
Example responses
200 Response
{
"chat_id": "efc9fe20-a1e5-4a8c-9c48-f1b30c1e4f86",
"request_count": 0,
"total_cost_micros": 0,
"unpriced_request_count": 0
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | codersdk.ChatCost |
To perform this operation, you must be authenticated. Learn more.
Get chat diff contents
Code samples
# Example request using curl
curl -X GET http://coder-server:8080/api/experimental/chats/{chat}/diff \
-H 'Accept: application/json' \
-H 'Coder-Session-Token: API_KEY'
GET /api/experimental/chats/{chat}/diff
Experimental: this endpoint is subject to change.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
chat |
path | string(uuid) | true | Chat ID |
Example responses
200 Response
{
"branch": "string",
"chat_id": "efc9fe20-a1e5-4a8c-9c48-f1b30c1e4f86",
"diff": "string",
"provider": "string",
"pull_request_url": "string",
"remote_origin": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | codersdk.ChatDiffContents |
To perform this operation, you must be authenticated. Learn more.
Interrupt chat
Code samples
# Example request using curl
curl -X POST http://coder-server:8080/api/experimental/chats/{chat}/interrupt \
-H 'Accept: application/json' \
-H 'Coder-Session-Token: API_KEY'
POST /api/experimental/chats/{chat}/interrupt
Experimental: this endpoint is subject to change.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
chat |
path | string(uuid) | true | Chat ID |
Example responses
200 Response
{
"agent_id": "2b1e3b65-2c04-4fa2-a2d7-467901e98978",
"archived": true,
"build_id": "bfb1f3fa-bf7b-43a5-9e0b-26cc050e44cb",
"children": [
{
"agent_id": "2b1e3b65-2c04-4fa2-a2d7-467901e98978",
"archived": true,
"build_id": "bfb1f3fa-bf7b-43a5-9e0b-26cc050e44cb",
"children": [],
"client_type": "ui",
"context": {
"dirty": true,
"dirty_since": "2019-08-24T14:15:22Z",
"error": "string",
"resources": [
{
"error": "string",
"kind": "instruction_file",
"size_bytes": 0,
"skill_description": "string",
"skill_name": "string",
"source": "string",
"status": "ok",
"tools": [
{
"description": "string",
"name": "string"
}
]
}
]
},
"created_at": "2019-08-24T14:15:22Z",
"diff_status": {
"additions": 0,
"approved": true,
"author_avatar_url": "string",
"author_login": "string",
"base_branch": "string",
"changed_files": 0,
"changes_requested": true,
"chat_id": "efc9fe20-a1e5-4a8c-9c48-f1b30c1e4f86",
"commits": 0,
"deletions": 0,
"head_branch": "string",
"pr_number": 0,
"pull_request_draft": true,
"pull_request_state": "string",
"pull_request_title": "string",
"refreshed_at": "2019-08-24T14:15:22Z",
"reviewer_count": 0,
"stale_at": "2019-08-24T14:15:22Z",
"url": "string"
},
"files": [
{
"created_at": "2019-08-24T14:15:22Z",
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"mime_type": "string",
"name": "string",
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"size_bytes": 0
}
],
"has_unread": true,
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"labels": {
"property1": "string",
"property2": "string"
},
"last_error": {
"detail": "string",
"kind": "generic",
"message": "string",
"provider": "string",
"retryable": true,
"status_code": 0
},
"last_model_config_id": "30ebb95f-c255-4759-9429-89aa4ec1554c",
"last_reasoning_effort": "string",
"last_turn_summary": "string",
"mcp_server_ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
],
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"owner_name": "string",
"owner_username": "string",
"parent_chat_id": "c3609ee6-3b11-4a93-b9ae-e4fabcc99359",
"pin_order": 0,
"plan_mode": "plan",
"queued_for_capacity": true,
"root_chat_id": "2898031c-fdce-4e3e-8c53-4481dd42fcd7",
"shared": true,
"status": "waiting",
"summary": "string",
"title": "string",
"updated_at": "2019-08-24T14:15:22Z",
"warnings": [
"string"
],
"workspace_id": "0967198e-ec7b-4c6b-b4d3-f71244cadbe9"
}
],
"client_type": "ui",
"context": {
"dirty": true,
"dirty_since": "2019-08-24T14:15:22Z",
"error": "string",
"resources": [
{
"error": "string",
"kind": "instruction_file",
"size_bytes": 0,
"skill_description": "string",
"skill_name": "string",
"source": "string",
"status": "ok",
"tools": [
{
"description": "string",
"name": "string"
}
]
}
]
},
"created_at": "2019-08-24T14:15:22Z",
"diff_status": {
"additions": 0,
"approved": true,
"author_avatar_url": "string",
"author_login": "string",
"base_branch": "string",
"changed_files": 0,
"changes_requested": true,
"chat_id": "efc9fe20-a1e5-4a8c-9c48-f1b30c1e4f86",
"commits": 0,
"deletions": 0,
"head_branch": "string",
"pr_number": 0,
"pull_request_draft": true,
"pull_request_state": "string",
"pull_request_title": "string",
"refreshed_at": "2019-08-24T14:15:22Z",
"reviewer_count": 0,
"stale_at": "2019-08-24T14:15:22Z",
"url": "string"
},
"files": [
{
"created_at": "2019-08-24T14:15:22Z",
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"mime_type": "string",
"name": "string",
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"size_bytes": 0
}
],
"has_unread": true,
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"labels": {
"property1": "string",
"property2": "string"
},
"last_error": {
"detail": "string",
"kind": "generic",
"message": "string",
"provider": "string",
"retryable": true,
"status_code": 0
},
"last_model_config_id": "30ebb95f-c255-4759-9429-89aa4ec1554c",
"last_reasoning_effort": "string",
"last_turn_summary": "string",
"mcp_server_ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
],
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"owner_name": "string",
"owner_username": "string",
"parent_chat_id": "c3609ee6-3b11-4a93-b9ae-e4fabcc99359",
"pin_order": 0,
"plan_mode": "plan",
"queued_for_capacity": true,
"root_chat_id": "2898031c-fdce-4e3e-8c53-4481dd42fcd7",
"shared": true,
"status": "waiting",
"summary": "string",
"title": "string",
"updated_at": "2019-08-24T14:15:22Z",
"warnings": [
"string"
],
"workspace_id": "0967198e-ec7b-4c6b-b4d3-f71244cadbe9"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | codersdk.Chat |
To perform this operation, you must be authenticated. Learn more.
List chat messages
Code samples
# Example request using curl
curl -X GET http://coder-server:8080/api/experimental/chats/{chat}/messages \
-H 'Accept: application/json' \
-H 'Coder-Session-Token: API_KEY'
GET /api/experimental/chats/{chat}/messages
Experimental: this endpoint is subject to change.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
chat |
path | string(uuid) | true | Chat ID |
before_id |
query | integer | false | Return messages with id < before_id |
after_id |
query | integer | false | Return messages with id > after_id |
limit |
query | integer | false | Page size, 1 to 200. Defaults to 50. |
Example responses
200 Response
{
"has_more": true,
"messages": [
{
"chat_id": "efc9fe20-a1e5-4a8c-9c48-f1b30c1e4f86",
"content": [
{
"args": [
0
],
"args_delta": "string",
"completed_at": "2019-08-24T14:15:22Z",
"content": "string",
"context_file_agent_id": {
"uuid": "string",
"valid": true
},
"context_file_content": "string",
"context_file_directory": "string",
"context_file_os": "string",
"context_file_path": "string",
"context_file_skill_meta_file": "string",
"context_file_truncated": true,
"created_at": "2019-08-24T14:15:22Z",
"data": [
0
],
"end_line": 0,
"file_id": {
"uuid": "string",
"valid": true
},
"file_name": "string",
"hook_rewritten": true,
"is_error": true,
"is_media": true,
"mcp_server_config_id": {
"uuid": "string",
"valid": true
},
"media_type": "string",
"name": "string",
"parsed_commands": [
[
"string"
]
],
"provider_executed": true,
"provider_metadata": [
0
],
"result": [
0
],
"result_delta": "string",
"result_reset": true,
"skill_description": "string",
"skill_dir": "string",
"skill_name": "string",
"source_id": "string",
"start_line": 0,
"text": "string",
"title": "string",
"tool_call_id": "string",
"tool_name": "string",
"type": "text",
"url": "string"
}
],
"created_at": "2019-08-24T14:15:22Z",
"created_by": "ee824cad-d7a6-4f48-87dc-e8461a9201c4",
"id": 0,
"model_config_id": "f5fb4d91-62ca-4377-9ee6-5d43ba00d205",
"role": "system",
"usage": {
"cache_creation_tokens": 0,
"cache_read_tokens": 0,
"context_limit": 0,
"input_tokens": 0,
"output_tokens": 0,
"reasoning_tokens": 0,
"total_tokens": 0
}
}
],
"queued_messages": [
{
"chat_id": "efc9fe20-a1e5-4a8c-9c48-f1b30c1e4f86",
"content": [
{
"args": [
0
],
"args_delta": "string",
"completed_at": "2019-08-24T14:15:22Z",
"content": "string",
"context_file_agent_id": {
"uuid": "string",
"valid": true
},
"context_file_content": "string",
"context_file_directory": "string",
"context_file_os": "string",
"context_file_path": "string",
"context_file_skill_meta_file": "string",
"context_file_truncated": true,
"created_at": "2019-08-24T14:15:22Z",
"data": [
0
],
"end_line": 0,
"file_id": {
"uuid": "string",
"valid": true
},
"file_name": "string",
"hook_rewritten": true,
"is_error": true,
"is_media": true,
"mcp_server_config_id": {
"uuid": "string",
"valid": true
},
"media_type": "string",
"name": "string",
"parsed_commands": [
[
"string"
]
],
"provider_executed": true,
"provider_metadata": [
0
],
"result": [
0
],
"result_delta": "string",
"result_reset": true,
"skill_description": "string",
"skill_dir": "string",
"skill_name": "string",
"source_id": "string",
"start_line": 0,
"text": "string",
"title": "string",
"tool_call_id": "string",
"tool_name": "string",
"type": "text",
"url": "string"
}
],
"created_at": "2019-08-24T14:15:22Z",
"id": 0,
"model_config_id": "f5fb4d91-62ca-4377-9ee6-5d43ba00d205"
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | codersdk.ChatMessagesResponse |
To perform this operation, you must be authenticated. Learn more.
Send chat message
Code samples
# Example request using curl
curl -X POST http://coder-server:8080/api/experimental/chats/{chat}/messages \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Coder-Session-Token: API_KEY'
POST /api/experimental/chats/{chat}/messages
Experimental: this endpoint is subject to change.
Body parameter
{
"busy_behavior": "queue",
"content": [
{
"content": "string",
"end_line": 0,
"file_id": "8a0cfb4f-ddc9-436d-91bb-75133c583767",
"file_name": "string",
"start_line": 0,
"text": "string",
"type": "text"
}
],
"mcp_server_ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
],
"model_config_id": "f5fb4d91-62ca-4377-9ee6-5d43ba00d205",
"plan_mode": "plan",
"reasoning_effort": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
chat |
path | string(uuid) | true | Chat ID |
body |
body | codersdk.CreateChatMessageRequest | true | Create chat message request |
Example responses
200 Response
{
"message": {
"chat_id": "efc9fe20-a1e5-4a8c-9c48-f1b30c1e4f86",
"content": [
{
"args": [
0
],
"args_delta": "string",
"completed_at": "2019-08-24T14:15:22Z",
"content": "string",
"context_file_agent_id": {
"uuid": "string",
"valid": true
},
"context_file_content": "string",
"context_file_directory": "string",
"context_file_os": "string",
"context_file_path": "string",
"context_file_skill_meta_file": "string",
"context_file_truncated": true,
"created_at": "2019-08-24T14:15:22Z",
"data": [
0
],
"end_line": 0,
"file_id": {
"uuid": "string",
"valid": true
},
"file_name": "string",
"hook_rewritten": true,
"is_error": true,
"is_media": true,
"mcp_server_config_id": {
"uuid": "string",
"valid": true
},
"media_type": "string",
"name": "string",
"parsed_commands": [
[
"string"
]
],
"provider_executed": true,
"provider_metadata": [
0
],
"result": [
0
],
"result_delta": "string",
"result_reset": true,
"skill_description": "string",
"skill_dir": "string",
"skill_name": "string",
"source_id": "string",
"start_line": 0,
"text": "string",
"title": "string",
"tool_call_id": "string",
"tool_name": "string",
"type": "text",
"url": "string"
}
],
"created_at": "2019-08-24T14:15:22Z",
"created_by": "ee824cad-d7a6-4f48-87dc-e8461a9201c4",
"id": 0,
"model_config_id": "f5fb4d91-62ca-4377-9ee6-5d43ba00d205",
"role": "system",
"usage": {
"cache_creation_tokens": 0,
"cache_read_tokens": 0,
"context_limit": 0,
"input_tokens": 0,
"output_tokens": 0,
"reasoning_tokens": 0,
"total_tokens": 0
}
},
"messages": [
{
"chat_id": "efc9fe20-a1e5-4a8c-9c48-f1b30c1e4f86",
"content": [
{
"args": [
0
],
"args_delta": "string",
"completed_at": "2019-08-24T14:15:22Z",
"content": "string",
"context_file_agent_id": {
"uuid": "string",
"valid": true
},
"context_file_content": "string",
"context_file_directory": "string",
"context_file_os": "string",
"context_file_path": "string",
"context_file_skill_meta_file": "string",
"context_file_truncated": true,
"created_at": "2019-08-24T14:15:22Z",
"data": [
0
],
"end_line": 0,
"file_id": {
"uuid": "string",
"valid": true
},
"file_name": "string",
"hook_rewritten": true,
"is_error": true,
"is_media": true,
"mcp_server_config_id": {
"uuid": "string",
"valid": true
},
"media_type": "string",
"name": "string",
"parsed_commands": [
[
"string"
]
],
"provider_executed": true,
"provider_metadata": [
0
],
"result": [
0
],
"result_delta": "string",
"result_reset": true,
"skill_description": "string",
"skill_dir": "string",
"skill_name": "string",
"source_id": "string",
"start_line": 0,
"text": "string",
"title": "string",
"tool_call_id": "string",
"tool_name": "string",
"type": "text",
"url": "string"
}
],
"created_at": "2019-08-24T14:15:22Z",
"created_by": "ee824cad-d7a6-4f48-87dc-e8461a9201c4",
"id": 0,
"model_config_id": "f5fb4d91-62ca-4377-9ee6-5d43ba00d205",
"role": "system",
"usage": {
"cache_creation_tokens": 0,
"cache_read_tokens": 0,
"context_limit": 0,
"input_tokens": 0,
"output_tokens": 0,
"reasoning_tokens": 0,
"total_tokens": 0
}
}
],
"queued": true,
"queued_message": {
"chat_id": "efc9fe20-a1e5-4a8c-9c48-f1b30c1e4f86",
"content": [
{
"args": [
0
],
"args_delta": "string",
"completed_at": "2019-08-24T14:15:22Z",
"content": "string",
"context_file_agent_id": {
"uuid": "string",
"valid": true
},
"context_file_content": "string",
"context_file_directory": "string",
"context_file_os": "string",
"context_file_path": "string",
"context_file_skill_meta_file": "string",
"context_file_truncated": true,
"created_at": "2019-08-24T14:15:22Z",
"data": [
0
],
"end_line": 0,
"file_id": {
"uuid": "string",
"valid": true
},
"file_name": "string",
"hook_rewritten": true,
"is_error": true,
"is_media": true,
"mcp_server_config_id": {
"uuid": "string",
"valid": true
},
"media_type": "string",
"name": "string",
"parsed_commands": [
[
"string"
]
],
"provider_executed": true,
"provider_metadata": [
0
],
"result": [
0
],
"result_delta": "string",
"result_reset": true,
"skill_description": "string",
"skill_dir": "string",
"skill_name": "string",
"source_id": "string",
"start_line": 0,
"text": "string",
"title": "string",
"tool_call_id": "string",
"tool_name": "string",
"type": "text",
"url": "string"
}
],
"created_at": "2019-08-24T14:15:22Z",
"id": 0,
"model_config_id": "f5fb4d91-62ca-4377-9ee6-5d43ba00d205"
},
"warnings": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | codersdk.CreateChatMessageResponse |
To perform this operation, you must be authenticated. Learn more.
Edit chat message
Code samples
# Example request using curl
curl -X PATCH http://coder-server:8080/api/experimental/chats/{chat}/messages/{message} \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Coder-Session-Token: API_KEY'
PATCH /api/experimental/chats/{chat}/messages/{message}
Experimental: this endpoint is subject to change.
Body parameter
{
"content": [
{
"content": "string",
"end_line": 0,
"file_id": "8a0cfb4f-ddc9-436d-91bb-75133c583767",
"file_name": "string",
"start_line": 0,
"text": "string",
"type": "text"
}
],
"model_config_id": "f5fb4d91-62ca-4377-9ee6-5d43ba00d205",
"reasoning_effort": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
chat |
path | string(uuid) | true | Chat ID |
message |
path | integer | true | Message ID |
body |
body | codersdk.EditChatMessageRequest | true | Edit chat message request |
Example responses
200 Response
{
"deleted_message_ids": [
0
],
"message": {
"chat_id": "efc9fe20-a1e5-4a8c-9c48-f1b30c1e4f86",
"content": [
{
"args": [
0
],
"args_delta": "string",
"completed_at": "2019-08-24T14:15:22Z",
"content": "string",
"context_file_agent_id": {
"uuid": "string",
"valid": true
},
"context_file_content": "string",
"context_file_directory": "string",
"context_file_os": "string",
"context_file_path": "string",
"context_file_skill_meta_file": "string",
"context_file_truncated": true,
"created_at": "2019-08-24T14:15:22Z",
"data": [
0
],
"end_line": 0,
"file_id": {
"uuid": "string",
"valid": true
},
"file_name": "string",
"hook_rewritten": true,
"is_error": true,
"is_media": true,
"mcp_server_config_id": {
"uuid": "string",
"valid": true
},
"media_type": "string",
"name": "string",
"parsed_commands": [
[
"string"
]
],
"provider_executed": true,
"provider_metadata": [
0
],
"result": [
0
],
"result_delta": "string",
"result_reset": true,
"skill_description": "string",
"skill_dir": "string",
"skill_name": "string",
"source_id": "string",
"start_line": 0,
"text": "string",
"title": "string",
"tool_call_id": "string",
"tool_name": "string",
"type": "text",
"url": "string"
}
],
"created_at": "2019-08-24T14:15:22Z",
"created_by": "ee824cad-d7a6-4f48-87dc-e8461a9201c4",
"id": 0,
"model_config_id": "f5fb4d91-62ca-4377-9ee6-5d43ba00d205",
"role": "system",
"usage": {
"cache_creation_tokens": 0,
"cache_read_tokens": 0,
"context_limit": 0,
"input_tokens": 0,
"output_tokens": 0,
"reasoning_tokens": 0,
"total_tokens": 0
}
},
"messages": [
{
"chat_id": "efc9fe20-a1e5-4a8c-9c48-f1b30c1e4f86",
"content": [
{
"args": [
0
],
"args_delta": "string",
"completed_at": "2019-08-24T14:15:22Z",
"content": "string",
"context_file_agent_id": {
"uuid": "string",
"valid": true
},
"context_file_content": "string",
"context_file_directory": "string",
"context_file_os": "string",
"context_file_path": "string",
"context_file_skill_meta_file": "string",
"context_file_truncated": true,
"created_at": "2019-08-24T14:15:22Z",
"data": [
0
],
"end_line": 0,
"file_id": {
"uuid": "string",
"valid": true
},
"file_name": "string",
"hook_rewritten": true,
"is_error": true,
"is_media": true,
"mcp_server_config_id": {
"uuid": "string",
"valid": true
},
"media_type": "string",
"name": "string",
"parsed_commands": [
[
"string"
]
],
"provider_executed": true,
"provider_metadata": [
0
],
"result": [
0
],
"result_delta": "string",
"result_reset": true,
"skill_description": "string",
"skill_dir": "string",
"skill_name": "string",
"source_id": "string",
"start_line": 0,
"text": "string",
"title": "string",
"tool_call_id": "string",
"tool_name": "string",
"type": "text",
"url": "string"
}
],
"created_at": "2019-08-24T14:15:22Z",
"created_by": "ee824cad-d7a6-4f48-87dc-e8461a9201c4",
"id": 0,
"model_config_id": "f5fb4d91-62ca-4377-9ee6-5d43ba00d205",
"role": "system",
"usage": {
"cache_creation_tokens": 0,
"cache_read_tokens": 0,
"context_limit": 0,
"input_tokens": 0,
"output_tokens": 0,
"reasoning_tokens": 0,
"total_tokens": 0
}
}
],
"warnings": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | codersdk.EditChatMessageResponse |
To perform this operation, you must be authenticated. Learn more.
List chat user prompts
Code samples
# Example request using curl
curl -X GET http://coder-server:8080/api/experimental/chats/{chat}/prompts \
-H 'Accept: application/json' \
-H 'Coder-Session-Token: API_KEY'
GET /api/experimental/chats/{chat}/prompts
Experimental: this endpoint is subject to change.
Returns the user-authored prompts in a chat, newest first, with each prompt's text parts concatenated in the order they were authored. Used by the composer to power the up/down arrow prompt-history cycle without paging through every message in the chat.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
chat |
path | string(uuid) | true | Chat ID |
limit |
query | integer | false | Page size, 0 to 2000. 0 (the default) means the server-side default of 500. |
Example responses
200 Response
{
"prompts": [
{
"id": 0,
"text": "string"
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | codersdk.ChatPromptsResponse |
To perform this operation, you must be authenticated. Learn more.
Reconcile invalid chat state
Code samples
# Example request using curl
curl -X POST http://coder-server:8080/api/experimental/chats/{chat}/reconcile-invalid \
-H 'Accept: application/json' \
-H 'Coder-Session-Token: API_KEY'
POST /api/experimental/chats/{chat}/reconcile-invalid
Experimental: this endpoint is subject to change.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
chat |
path | string(uuid) | true | Chat ID |
Example responses
200 Response
{
"agent_id": "2b1e3b65-2c04-4fa2-a2d7-467901e98978",
"archived": true,
"build_id": "bfb1f3fa-bf7b-43a5-9e0b-26cc050e44cb",
"children": [
{
"agent_id": "2b1e3b65-2c04-4fa2-a2d7-467901e98978",
"archived": true,
"build_id": "bfb1f3fa-bf7b-43a5-9e0b-26cc050e44cb",
"children": [],
"client_type": "ui",
"context": {
"dirty": true,
"dirty_since": "2019-08-24T14:15:22Z",
"error": "string",
"resources": [
{
"error": "string",
"kind": "instruction_file",
"size_bytes": 0,
"skill_description": "string",
"skill_name": "string",
"source": "string",
"status": "ok",
"tools": [
{
"description": "string",
"name": "string"
}
]
}
]
},
"created_at": "2019-08-24T14:15:22Z",
"diff_status": {
"additions": 0,
"approved": true,
"author_avatar_url": "string",
"author_login": "string",
"base_branch": "string",
"changed_files": 0,
"changes_requested": true,
"chat_id": "efc9fe20-a1e5-4a8c-9c48-f1b30c1e4f86",
"commits": 0,
"deletions": 0,
"head_branch": "string",
"pr_number": 0,
"pull_request_draft": true,
"pull_request_state": "string",
"pull_request_title": "string",
"refreshed_at": "2019-08-24T14:15:22Z",
"reviewer_count": 0,
"stale_at": "2019-08-24T14:15:22Z",
"url": "string"
},
"files": [
{
"created_at": "2019-08-24T14:15:22Z",
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"mime_type": "string",
"name": "string",
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"size_bytes": 0
}
],
"has_unread": true,
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"labels": {
"property1": "string",
"property2": "string"
},
"last_error": {
"detail": "string",
"kind": "generic",
"message": "string",
"provider": "string",
"retryable": true,
"status_code": 0
},
"last_model_config_id": "30ebb95f-c255-4759-9429-89aa4ec1554c",
"last_reasoning_effort": "string",
"last_turn_summary": "string",
"mcp_server_ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
],
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"owner_name": "string",
"owner_username": "string",
"parent_chat_id": "c3609ee6-3b11-4a93-b9ae-e4fabcc99359",
"pin_order": 0,
"plan_mode": "plan",
"queued_for_capacity": true,
"root_chat_id": "2898031c-fdce-4e3e-8c53-4481dd42fcd7",
"shared": true,
"status": "waiting",
"summary": "string",
"title": "string",
"updated_at": "2019-08-24T14:15:22Z",
"warnings": [
"string"
],
"workspace_id": "0967198e-ec7b-4c6b-b4d3-f71244cadbe9"
}
],
"client_type": "ui",
"context": {
"dirty": true,
"dirty_since": "2019-08-24T14:15:22Z",
"error": "string",
"resources": [
{
"error": "string",
"kind": "instruction_file",
"size_bytes": 0,
"skill_description": "string",
"skill_name": "string",
"source": "string",
"status": "ok",
"tools": [
{
"description": "string",
"name": "string"
}
]
}
]
},
"created_at": "2019-08-24T14:15:22Z",
"diff_status": {
"additions": 0,
"approved": true,
"author_avatar_url": "string",
"author_login": "string",
"base_branch": "string",
"changed_files": 0,
"changes_requested": true,
"chat_id": "efc9fe20-a1e5-4a8c-9c48-f1b30c1e4f86",
"commits": 0,
"deletions": 0,
"head_branch": "string",
"pr_number": 0,
"pull_request_draft": true,
"pull_request_state": "string",
"pull_request_title": "string",
"refreshed_at": "2019-08-24T14:15:22Z",
"reviewer_count": 0,
"stale_at": "2019-08-24T14:15:22Z",
"url": "string"
},
"files": [
{
"created_at": "2019-08-24T14:15:22Z",
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"mime_type": "string",
"name": "string",
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"size_bytes": 0
}
],
"has_unread": true,
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"labels": {
"property1": "string",
"property2": "string"
},
"last_error": {
"detail": "string",
"kind": "generic",
"message": "string",
"provider": "string",
"retryable": true,
"status_code": 0
},
"last_model_config_id": "30ebb95f-c255-4759-9429-89aa4ec1554c",
"last_reasoning_effort": "string",
"last_turn_summary": "string",
"mcp_server_ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
],
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"owner_name": "string",
"owner_username": "string",
"parent_chat_id": "c3609ee6-3b11-4a93-b9ae-e4fabcc99359",
"pin_order": 0,
"plan_mode": "plan",
"queued_for_capacity": true,
"root_chat_id": "2898031c-fdce-4e3e-8c53-4481dd42fcd7",
"shared": true,
"status": "waiting",
"summary": "string",
"title": "string",
"updated_at": "2019-08-24T14:15:22Z",
"warnings": [
"string"
],
"workspace_id": "0967198e-ec7b-4c6b-b4d3-f71244cadbe9"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | codersdk.Chat |
To perform this operation, you must be authenticated. Learn more.
Stream chat events via WebSockets
Code samples
# Example request using curl
curl -X GET http://coder-server:8080/api/experimental/chats/{chat}/stream \
-H 'Accept: application/json' \
-H 'Coder-Session-Token: API_KEY'
GET /api/experimental/chats/{chat}/stream
Experimental: this endpoint is subject to change.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
chat |
path | string(uuid) | true | Chat ID |
Example responses
200 Response
{
"action_required": {
"tool_calls": [
{
"args": "string",
"tool_call_id": "string",
"tool_name": "string"
}
]
},
"chat_id": "efc9fe20-a1e5-4a8c-9c48-f1b30c1e4f86",
"error": {
"detail": "string",
"kind": "generic",
"message": "string",
"provider": "string",
"retryable": true,
"status_code": 0
},
"message": {
"chat_id": "efc9fe20-a1e5-4a8c-9c48-f1b30c1e4f86",
"content": [
{
"args": [
0
],
"args_delta": "string",
"completed_at": "2019-08-24T14:15:22Z",
"content": "string",
"context_file_agent_id": {
"uuid": "string",
"valid": true
},
"context_file_content": "string",
"context_file_directory": "string",
"context_file_os": "string",
"context_file_path": "string",
"context_file_skill_meta_file": "string",
"context_file_truncated": true,
"created_at": "2019-08-24T14:15:22Z",
"data": [
0
],
"end_line": 0,
"file_id": {
"uuid": "string",
"valid": true
},
"file_name": "string",
"hook_rewritten": true,
"is_error": true,
"is_media": true,
"mcp_server_config_id": {
"uuid": "string",
"valid": true
},
"media_type": "string",
"name": "string",
"parsed_commands": [
[
"string"
]
],
"provider_executed": true,
"provider_metadata": [
0
],
"result": [
0
],
"result_delta": "string",
"result_reset": true,
"skill_description": "string",
"skill_dir": "string",
"skill_name": "string",
"source_id": "string",
"start_line": 0,
"text": "string",
"title": "string",
"tool_call_id": "string",
"tool_name": "string",
"type": "text",
"url": "string"
}
],
"created_at": "2019-08-24T14:15:22Z",
"created_by": "ee824cad-d7a6-4f48-87dc-e8461a9201c4",
"id": 0,
"model_config_id": "f5fb4d91-62ca-4377-9ee6-5d43ba00d205",
"role": "system",
"usage": {
"cache_creation_tokens": 0,
"cache_read_tokens": 0,
"context_limit": 0,
"input_tokens": 0,
"output_tokens": 0,
"reasoning_tokens": 0,
"total_tokens": 0
}
},
"message_part": {
"generation_attempt": 0,
"history_version": 0,
"part": {
"args": [
0
],
"args_delta": "string",
"completed_at": "2019-08-24T14:15:22Z",
"content": "string",
"context_file_agent_id": {
"uuid": "string",
"valid": true
},
"context_file_content": "string",
"context_file_directory": "string",
"context_file_os": "string",
"context_file_path": "string",
"context_file_skill_meta_file": "string",
"context_file_truncated": true,
"created_at": "2019-08-24T14:15:22Z",
"data": [
0
],
"end_line": 0,
"file_id": {
"uuid": "string",
"valid": true
},
"file_name": "string",
"hook_rewritten": true,
"is_error": true,
"is_media": true,
"mcp_server_config_id": {
"uuid": "string",
"valid": true
},
"media_type": "string",
"name": "string",
"parsed_commands": [
[
"string"
]
],
"provider_executed": true,
"provider_metadata": [
0
],
"result": [
0
],
"result_delta": "string",
"result_reset": true,
"skill_description": "string",
"skill_dir": "string",
"skill_name": "string",
"source_id": "string",
"start_line": 0,
"text": "string",
"title": "string",
"tool_call_id": "string",
"tool_name": "string",
"type": "text",
"url": "string"
},
"role": "system",
"seq": 0
},
"queued_messages": [
{
"chat_id": "efc9fe20-a1e5-4a8c-9c48-f1b30c1e4f86",
"content": [
{
"args": [
0
],
"args_delta": "string",
"completed_at": "2019-08-24T14:15:22Z",
"content": "string",
"context_file_agent_id": {
"uuid": "string",
"valid": true
},
"context_file_content": "string",
"context_file_directory": "string",
"context_file_os": "string",
"context_file_path": "string",
"context_file_skill_meta_file": "string",
"context_file_truncated": true,
"created_at": "2019-08-24T14:15:22Z",
"data": [
0
],
"end_line": 0,
"file_id": {
"uuid": "string",
"valid": true
},
"file_name": "string",
"hook_rewritten": true,
"is_error": true,
"is_media": true,
"mcp_server_config_id": {
"uuid": "string",
"valid": true
},
"media_type": "string",
"name": "string",
"parsed_commands": [
[
"string"
]
],
"provider_executed": true,
"provider_metadata": [
0
],
"result": [
0
],
"result_delta": "string",
"result_reset": true,
"skill_description": "string",
"skill_dir": "string",
"skill_name": "string",
"source_id": "string",
"start_line": 0,
"text": "string",
"title": "string",
"tool_call_id": "string",
"tool_name": "string",
"type": "text",
"url": "string"
}
],
"created_at": "2019-08-24T14:15:22Z",
"id": 0,
"model_config_id": "f5fb4d91-62ca-4377-9ee6-5d43ba00d205"
}
],
"retry": {
"attempt": 0,
"delay_ms": 0,
"error": "string",
"kind": "generic",
"provider": "string",
"retrying_at": "2019-08-24T14:15:22Z",
"status_code": 0
},
"status": {
"status": "waiting"
},
"type": "message_part"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | codersdk.ChatStreamEvent |
To perform this operation, you must be authenticated. Learn more.
Connect to chat workspace desktop via WebSockets
Code samples
# Example request using curl
curl -X GET http://coder-server:8080/api/experimental/chats/{chat}/stream/desktop \
-H 'Coder-Session-Token: API_KEY'
GET /api/experimental/chats/{chat}/stream/desktop
Raw binary WebSocket stream of the chat workspace desktop. Experimental: this endpoint is subject to change.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
chat |
path | string(uuid) | true | Chat ID |
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 101 | Switching Protocols | Switching Protocols |
To perform this operation, you must be authenticated. Learn more.
Watch chat workspace git state via WebSockets
Code samples
# Example request using curl
curl -X GET http://coder-server:8080/api/experimental/chats/{chat}/stream/git \
-H 'Accept: application/json' \
-H 'Coder-Session-Token: API_KEY'
GET /api/experimental/chats/{chat}/stream/git
Experimental: this endpoint is subject to change.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
chat |
path | string(uuid) | true | Chat ID |
Example responses
200 Response
{
"message": "string",
"repositories": [
{
"branch": "string",
"remote_origin": "string",
"removed": true,
"repo_root": "string",
"unified_diff": "string"
}
],
"scanned_at": "2019-08-24T14:15:22Z",
"type": "changes"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | codersdk.WorkspaceAgentGitServerMessage |
To perform this operation, you must be authenticated. Learn more.
Regenerate chat title
Code samples
# Example request using curl
curl -X POST http://coder-server:8080/api/experimental/chats/{chat}/title/regenerate \
-H 'Accept: application/json' \
-H 'Coder-Session-Token: API_KEY'
POST /api/experimental/chats/{chat}/title/regenerate
Experimental: this endpoint is subject to change.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
chat |
path | string(uuid) | true | Chat ID |
Example responses
200 Response
{
"agent_id": "2b1e3b65-2c04-4fa2-a2d7-467901e98978",
"archived": true,
"build_id": "bfb1f3fa-bf7b-43a5-9e0b-26cc050e44cb",
"children": [
{
"agent_id": "2b1e3b65-2c04-4fa2-a2d7-467901e98978",
"archived": true,
"build_id": "bfb1f3fa-bf7b-43a5-9e0b-26cc050e44cb",
"children": [],
"client_type": "ui",
"context": {
"dirty": true,
"dirty_since": "2019-08-24T14:15:22Z",
"error": "string",
"resources": [
{
"error": "string",
"kind": "instruction_file",
"size_bytes": 0,
"skill_description": "string",
"skill_name": "string",
"source": "string",
"status": "ok",
"tools": [
{
"description": "string",
"name": "string"
}
]
}
]
},
"created_at": "2019-08-24T14:15:22Z",
"diff_status": {
"additions": 0,
"approved": true,
"author_avatar_url": "string",
"author_login": "string",
"base_branch": "string",
"changed_files": 0,
"changes_requested": true,
"chat_id": "efc9fe20-a1e5-4a8c-9c48-f1b30c1e4f86",
"commits": 0,
"deletions": 0,
"head_branch": "string",
"pr_number": 0,
"pull_request_draft": true,
"pull_request_state": "string",
"pull_request_title": "string",
"refreshed_at": "2019-08-24T14:15:22Z",
"reviewer_count": 0,
"stale_at": "2019-08-24T14:15:22Z",
"url": "string"
},
"files": [
{
"created_at": "2019-08-24T14:15:22Z",
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"mime_type": "string",
"name": "string",
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"size_bytes": 0
}
],
"has_unread": true,
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"labels": {
"property1": "string",
"property2": "string"
},
"last_error": {
"detail": "string",
"kind": "generic",
"message": "string",
"provider": "string",
"retryable": true,
"status_code": 0
},
"last_model_config_id": "30ebb95f-c255-4759-9429-89aa4ec1554c",
"last_reasoning_effort": "string",
"last_turn_summary": "string",
"mcp_server_ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
],
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"owner_name": "string",
"owner_username": "string",
"parent_chat_id": "c3609ee6-3b11-4a93-b9ae-e4fabcc99359",
"pin_order": 0,
"plan_mode": "plan",
"queued_for_capacity": true,
"root_chat_id": "2898031c-fdce-4e3e-8c53-4481dd42fcd7",
"shared": true,
"status": "waiting",
"summary": "string",
"title": "string",
"updated_at": "2019-08-24T14:15:22Z",
"warnings": [
"string"
],
"workspace_id": "0967198e-ec7b-4c6b-b4d3-f71244cadbe9"
}
],
"client_type": "ui",
"context": {
"dirty": true,
"dirty_since": "2019-08-24T14:15:22Z",
"error": "string",
"resources": [
{
"error": "string",
"kind": "instruction_file",
"size_bytes": 0,
"skill_description": "string",
"skill_name": "string",
"source": "string",
"status": "ok",
"tools": [
{
"description": "string",
"name": "string"
}
]
}
]
},
"created_at": "2019-08-24T14:15:22Z",
"diff_status": {
"additions": 0,
"approved": true,
"author_avatar_url": "string",
"author_login": "string",
"base_branch": "string",
"changed_files": 0,
"changes_requested": true,
"chat_id": "efc9fe20-a1e5-4a8c-9c48-f1b30c1e4f86",
"commits": 0,
"deletions": 0,
"head_branch": "string",
"pr_number": 0,
"pull_request_draft": true,
"pull_request_state": "string",
"pull_request_title": "string",
"refreshed_at": "2019-08-24T14:15:22Z",
"reviewer_count": 0,
"stale_at": "2019-08-24T14:15:22Z",
"url": "string"
},
"files": [
{
"created_at": "2019-08-24T14:15:22Z",
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"mime_type": "string",
"name": "string",
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"size_bytes": 0
}
],
"has_unread": true,
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"labels": {
"property1": "string",
"property2": "string"
},
"last_error": {
"detail": "string",
"kind": "generic",
"message": "string",
"provider": "string",
"retryable": true,
"status_code": 0
},
"last_model_config_id": "30ebb95f-c255-4759-9429-89aa4ec1554c",
"last_reasoning_effort": "string",
"last_turn_summary": "string",
"mcp_server_ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
],
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
"owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05",
"owner_name": "string",
"owner_username": "string",
"parent_chat_id": "c3609ee6-3b11-4a93-b9ae-e4fabcc99359",
"pin_order": 0,
"plan_mode": "plan",
"queued_for_capacity": true,
"root_chat_id": "2898031c-fdce-4e3e-8c53-4481dd42fcd7",
"shared": true,
"status": "waiting",
"summary": "string",
"title": "string",
"updated_at": "2019-08-24T14:15:22Z",
"warnings": [
"string"
],
"workspace_id": "0967198e-ec7b-4c6b-b4d3-f71244cadbe9"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | OK | codersdk.Chat |
To perform this operation, you must be authenticated. Learn more.