curl --request PUT \
--url https://api.runaether.dev/agent/inference \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"thinks_with": "<string>"
}
'import requests
url = "https://api.runaether.dev/agent/inference"
payload = {
"model": "<string>",
"thinks_with": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({model: '<string>', thinks_with: '<string>'})
};
fetch('https://api.runaether.dev/agent/inference', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.runaether.dev/agent/inference",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'model' => '<string>',
'thinks_with' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.runaether.dev/agent/inference"
payload := strings.NewReader("{\n \"model\": \"<string>\",\n \"thinks_with\": \"<string>\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.runaether.dev/agent/inference")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"<string>\",\n \"thinks_with\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.runaether.dev/agent/inference")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"model\": \"<string>\",\n \"thinks_with\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"browser_tools": true,
"created_at": "2023-11-07T05:31:56Z",
"cron_model": "claude-fable-5-1",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"last_used_at": "2023-11-07T05:31:56Z",
"model": "claude-fable-5-1",
"state": "provisioning",
"thinks_with": "aether",
"default_project_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"code": "org_membership_required",
"error": "<string>"
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}Choose what your agent thinks with and its model
Sets what your personal agent thinks with, aether (Aether inference, paid from your balance and held to the daily cap) or claude (your stored Claude Code credential: your Claude plan’s setup token or your Anthropic API key), and the model it converses on, together. Scheduled jobs run on Claude Haiku 5.5 unless a job names a model. Hermes applies a change when it next starts: an agent that is running restarts once it takes commands; setting what it already holds changes nothing, except that while the agent is going to sleep or pausing even that is refused (409 agent_host_illegal_transition). 400 for a thinks_with or model outside the listed values; 409 agent_inference_not_connected for claude without your Claude Code credential stored; 409 agent_host_illegal_transition while the agent is going to sleep or pausing.
curl --request PUT \
--url https://api.runaether.dev/agent/inference \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"thinks_with": "<string>"
}
'import requests
url = "https://api.runaether.dev/agent/inference"
payload = {
"model": "<string>",
"thinks_with": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({model: '<string>', thinks_with: '<string>'})
};
fetch('https://api.runaether.dev/agent/inference', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.runaether.dev/agent/inference",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'model' => '<string>',
'thinks_with' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.runaether.dev/agent/inference"
payload := strings.NewReader("{\n \"model\": \"<string>\",\n \"thinks_with\": \"<string>\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.runaether.dev/agent/inference")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"<string>\",\n \"thinks_with\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.runaether.dev/agent/inference")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"model\": \"<string>\",\n \"thinks_with\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"browser_tools": true,
"created_at": "2023-11-07T05:31:56Z",
"cron_model": "claude-fable-5-1",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"last_used_at": "2023-11-07T05:31:56Z",
"model": "claude-fable-5-1",
"state": "provisioning",
"thinks_with": "aether",
"default_project_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"code": "org_membership_required",
"error": "<string>"
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Response
OK
Whether your agent may drive a browser. Off by default; a change applies when Hermes next starts, which a running agent does at once.
The model your agent's scheduled jobs run on, unless a job names another.
claude-fable-5-1, claude-opus-5-5, claude-sonnet-5-5, claude-haiku-5-5 When your agent was created or resumed, was sent a message, or last worked. Thirty days unused pauses it.
The model your agent converses on.
claude-fable-5-1, claude-opus-5-5, claude-sonnet-5-5, claude-haiku-5-5 The host's lifecycle state. running: Hermes takes messages now; suspending and idle: asleep, woken by the next message; waking, resuming: coming up for a message; provisioning and booting: being created; updating: moving onto a new image; pausing and paused: backed up after thirty days unused, or paused by you, and resumed by you (a message from the web does not resume it); lost: its machine is gone and only deleting it helps; destroying: being deleted.
provisioning, booting, running, suspending, idle, waking, updating, pausing, paused, resuming, lost, destroying, destroyed What your agent thinks with: aether, Aether inference, paid from your balance and held to the daily cap; claude, your Claude Code credential, your Claude plan's setup token or your Anthropic API key, neither paid from your balance nor held to the cap.
aether, claude The project a task your agent starts runs on when it names no repository. Without it such a task is refused.