> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.athenaintel.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.athenaintel.com/_mcp/server.

# Update a collab agent's draft

PUT https://api.athenaintel.com/api/v0/assets/{asset_id}/agent-config
Content-Type: application/json

Write a collab agent's configuration (system prompt, model, tools, sources, behavior and channel settings) to its draft. Only the fields you send change; an omitted field keeps its current value, and a list or text field you send replaces the old one whole. The write goes to the live draft, the same draft the Athena editor shows, under the asset's existing id. Once the asset has been published, runs keep using the published version until you publish the draft with POST /api/v0/assets/\{asset\_id}/publish; one never published runs from its draft. Requires edit access to the asset; an archived asset is refused with 409. Unknown fields are refused with 422. A model must be available in the agent's workspace (422 otherwise). Tool or toolkit IDs the registry does not know are written and reported under warnings. A source (collab\_source:\<asset\_id>) or Tool Asset (tool:\<asset\_id>) the agent does not already hold must be one the caller can open: one they cannot open, or an archived one, is refused with 403 naming it, and nothing is written. A new name also becomes the asset title. The agent's email address and its outbound approval recipients are not set here.

Reference: https://docs.athenaintel.com/api-reference/assets/update-agent-config

## Authentication

- `X-API-KEY` header (required) — API Key authentication via header

## Request

### Path parameters

- `asset_id` (string, required) — ID of the collab agent to update

### Body (application/json)

This endpoint expects an UpdateAgentConfigRequestIn.

- `accent_color` (string, optional, nullable) — UI accent color (hex)
- `auto_compaction_enabled` (boolean, optional, nullable) — Auto-compaction
- `available_toolkits` (list of string, optional, nullable) — Toolkit IDs available for the agent to select
- `blacklisted_tools` (list of string, optional, nullable) — Tool IDs the agent may not use
- `can_be_subagent` (boolean, optional, nullable) — Whether the agent can be used as a sub-agent
- `comments_pane_enabled` (boolean, optional, nullable) — Allow @-mentioning the agent in an asset's comments pane
- `context_injection` (boolean, optional, nullable) — Inject contextual information into replies
- `description` (string, optional, nullable) — What the agent does and when to use it
- `handle` (string, optional, nullable) — Voice-friendly handle (lowercase words and spaces) used to address the agent as a sub-agent
- `icon` (string, optional, nullable) — Icon identifier
- `knowledge_base` (list of string, optional, nullable) — Knowledge base references available to the agent
- `knowledge_base_tags` (list of string, optional, nullable) — Tags used to filter knowledge base context
- `max_past_messages_for_subagents` (integer, optional, nullable) — Maximum number of past messages passed to sub-agents
- `meeting_attendance_enabled` (boolean, optional, nullable) — Allow the agent to attend meetings
- `meeting_voice_enabled` (boolean, optional, nullable) — The agent's meeting voice
- `model` (string, optional, nullable) — Model ID the agent runs on; must be available in its workspace
- `muses_enabled` (boolean, optional, nullable) — Muses long-term memory
- `muses_recall_enabled` (boolean, optional, nullable) — Inject relevant Muses memory before each reply
- `name` (string, optional, nullable) — Display name of the agent; also becomes the asset title
- `parallel_tool_calls` (boolean, optional, nullable) — Parallel tool calls
- `permanent_enabled_tools` (list of string, optional, nullable) — Tool IDs that stay enabled whatever else is configured
- `plan_mode_enabled` (boolean, optional, nullable) — Plan Mode
- `remove_session_computer` (boolean, optional, nullable) — True stops giving the agent's sessions a computer (existing computers are kept). Not together with session_computer.
- `session_computer` (PublicSessionComputerIn, optional, nullable) — Give the agent's sessions a computer the platform creates from an environment
- `show_only_for_admin` (boolean, optional, nullable) — Show the agent only to workspace admins
- `sms_blocked_sender_mode` (string, optional, nullable) — How the agent answers a text from a workspace member it isn't shared with: 'default' (the standard no-access message), 'silent' (no reply) or 'custom' (sms_blocked_sender_reply verbatim). The text is always saved in the agent's SMS thread and the agent never runs; senders without an Athena account in the workspace never get a reply.
- `sms_blocked_sender_reply` (string, optional, nullable) — Reply text sent to blocked SMS senders when sms_blocked_sender_mode is 'custom', e.g. 'Got it, thanks.' (max 320 characters).
- `sms_enabled` (boolean, optional, nullable) — SMS access
- `sources` (list of string, optional, nullable) — Knowledge source references: native source IDs, or collab\_source:\<asset\_id>; replaces the list
- `strict_agent_configuration` (boolean, optional, nullable) — Whether the agent must follow strict configuration constraints
- `sub_agents` (list of string, optional, nullable) — Collab agent IDs available as sub-agents
- `suggestions` (list of map from string to any, optional, nullable) — Suggested prompts or actions shown for the agent
- `system_prompt` (string, optional, nullable) — The instructions the agent follows (markdown); replaces the whole prompt
- `temperature` (double, optional, nullable) — Sampling temperature override
- `toolkits` (list of string, optional, nullable) — Toolkit IDs the agent can use; replaces the list
- `tools` (list of string, optional, nullable) — Tool IDs the agent can use; replaces the list
- `voice_enabled` (boolean, optional, nullable) — Voice access
- `voice_sub_agents` (list of string, optional, nullable) — Collab agent IDs available as voice sub-agents
- `whitelisted_emails` (list of string, optional, nullable) — Email addresses allowed to use the agent

## Response

### 200

Successful Response

- `asset_id` (string, required) — ID of the updated asset
- `asset_type` (string, required) — Type of the asset: skill or collab_agent
- `published` (boolean, required) — Always false: the write changed the draft only. Publish it with POST /api/v0/assets/\{asset\_id}/publish.
- `title` (string, required) — Title of the asset after the write
- `warnings` (list of string, optional) — Non-fatal notes, such as tool or toolkit IDs the registry does not know

## Errors

### 400 Bad Request Error

The asset is not a collab agent, no field was sent, or session_computer and remove_session_computer were both sent

- `map from string to any`

### 403 Forbidden Error

Caller lacks edit access to the asset, or the change adds a source or Tool Asset the caller cannot open

- `message` (string, required)

### 404 Not Found Error

Asset not found

- `message` (string, required)

### 409 Conflict Error

The asset is archived (in the trash): restore it first

- `any`

### 422 Unprocessable Entity Error

An unknown field, a model not available in the agent's workspace, or an invalid session_computer

- `detail` (list of ValidationError, optional)

### 503 Service Unavailable Error

The draft could not be written; nothing changed

- `any`

## Types

### PublicSessionComputerIn

The computer the platform gives each of a collab agent's sessions.

- `environment_asset_id` (string, required) — The environment asset the computer is created from
- `scope` (enum, optional, nullable) — 'session' gives every session its own computer; 'person' (the default) gives each person one computer reused across their sessions.
  - Allowed values: `session`, `person`
- `session_setup` (list of PublicSessionSetupStepIn, optional, nullable) — Commands each session runs once on its computer first
- `title` (string, optional, nullable) — Title of created computers; \{person} becomes the person's name
- `working_directory` (string, optional, nullable) — Absolute path the agent's commands start in

### ValidationError

- `loc` (list of ValidationErrorLocItems, required)
- `msg` (string, required)
- `type` (string, required)
- `ctx` (ValidationErrorCtx, optional)
- `input` (any, optional)

### PublicSessionSetupStepIn

One command a collab agent's session runs on its computer before starting.

- `command` (string, required) — Shell command to run on the computer
- `timeout_seconds` (integer, optional, nullable) — Seconds this step may take (default 120). All steps together must fit in 600 s.

### ValidationErrorLocItems

- string
- integer

### ValidationErrorCtx

## Examples

**Request**

```json
{
  "system_prompt": "You review designs for accessibility and consistency.",
  "tools": [
    "read_asset"
  ]
}
```

**Response**

```json
{
  "asset_id": "asset_9249292-d118-42d3-95b4-00eccfe0754f",
  "asset_type": "skill",
  "published": false,
  "title": "ticket-triage",
  "warnings": []
}
```

**SDK Code**

```python
import requests

url = "https://api.athenaintel.com/api/v0/assets/asset_id/agent-config"

payload = {
    "system_prompt": "You review designs for accessibility and consistency.",
    "tools": ["read_asset"]
}
headers = {
    "X-API-KEY": "<apiKey>",
    "Content-Type": "application/json"
}

response = requests.put(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://api.athenaintel.com/api/v0/assets/asset_id/agent-config';
const options = {
  method: 'PUT',
  headers: {'X-API-KEY': '<apiKey>', 'Content-Type': 'application/json'},
  body: '{"system_prompt":"You review designs for accessibility and consistency.","tools":["read_asset"]}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.athenaintel.com/api/v0/assets/asset_id/agent-config"

	payload := strings.NewReader("{\n  \"system_prompt\": \"You review designs for accessibility and consistency.\",\n  \"tools\": [\n    \"read_asset\"\n  ]\n}")

	req, _ := http.NewRequest("PUT", url, payload)

	req.Header.Add("X-API-KEY", "<apiKey>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://api.athenaintel.com/api/v0/assets/asset_id/agent-config")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Put.new(url)
request["X-API-KEY"] = '<apiKey>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"system_prompt\": \"You review designs for accessibility and consistency.\",\n  \"tools\": [\n    \"read_asset\"\n  ]\n}"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.put("https://api.athenaintel.com/api/v0/assets/asset_id/agent-config")
  .header("X-API-KEY", "<apiKey>")
  .header("Content-Type", "application/json")
  .body("{\n  \"system_prompt\": \"You review designs for accessibility and consistency.\",\n  \"tools\": [\n    \"read_asset\"\n  ]\n}")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('PUT', 'https://api.athenaintel.com/api/v0/assets/asset_id/agent-config', [
  'body' => '{
  "system_prompt": "You review designs for accessibility and consistency.",
  "tools": [
    "read_asset"
  ]
}',
  'headers' => [
    'Content-Type' => 'application/json',
    'X-API-KEY' => '<apiKey>',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://api.athenaintel.com/api/v0/assets/asset_id/agent-config");
var request = new RestRequest(Method.PUT);
request.AddHeader("X-API-KEY", "<apiKey>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"system_prompt\": \"You review designs for accessibility and consistency.\",\n  \"tools\": [\n    \"read_asset\"\n  ]\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "X-API-KEY": "<apiKey>",
  "Content-Type": "application/json"
]
let parameters = [
  "system_prompt": "You review designs for accessibility and consistency.",
  "tools": ["read_asset"]
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.athenaintel.com/api/v0/assets/asset_id/agent-config")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "PUT"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```