Skip to content
eternego / docs

Personas

This page covers the two read-only config routes: listing every persona, and reading the provider base URLs the daemon will use. Both work whether or not any persona is running.

List personas

Returns every persona on this machine with her full configuration view.

GET /api/personas

No path params. No request body.

Response

200 — an object with one key, personas, an array of persona views. The list is empty if none exist.

{
  "personas": [ <persona view>, ... ]
}

Each persona view has these fields:

Field Type Description
id string Her stable UUID. The path param for every other route.
name string The display name you gave her.
base_model string For a local thinking model, the raw model name (e.g. qwen2.5:14b). Empty string "" for cloud-backed thinking.
birthday string Creation date, YYYY-MM-DD. "" if unset.
running boolean true if a live agent is currently serving her, false otherwise. Reflects the in-memory registry, independent of status.
status string One of active, hibernate, sick. See Vocabulary.
thinking object | null Her required Mind organ. See organ view below. For local thinking the name shown is the human-readable base model, not the internal eternego-<id> wrapper.
imagination object | null Imagination organ (draws images), or null if unset.
mouth object | null Mouth organ (text to voice), or null.
eye object | null Eye organ (looks at images), or null.
ear object | null Ear organ (audio to text), or null.
teacher object | null Teacher organ (stronger model she consults), or null.
researcher object | null Researcher organ (reads documents), or null.
channels array Her channels. Empty array if none. See channel view below.

Organ view (each non-null organ field):

Field Type Description
name string The model name (e.g. gpt-5.4, claude-sonnet-4-6).
provider string | null anthropic, openai, xai, gemini, or null for a local (Ollama) model.
url string The provider base URL this organ calls.

The API key is never included in the view — it lives in the persona's encrypted config and the system keyring, not in any response.

Channel view (each entry of channels):

Field Type Description
type string telegram, discord, or web.
name string The bound target — chat id (Telegram), channel id (Discord), or persona id (web).
verified boolean true once the channel has been paired to your account.

Errors

This endpoint always returns 200. If no personas exist (or the directory is missing), the list is simply [] — it does not error.

Example

curl -s http://localhost:5000/api/personas | jq '.personas[] | {id, name, status, running}'

Sample response (one persona, all organs on OpenAI, no channels — based on a real config):

{
  "personas": [
    {
      "id": "6c17c83c-3158-450d-8e43-0e7efea717c1",
      "name": "Adam",
      "base_model": "",
      "birthday": "2026-06-03",
      "running": true,
      "status": "active",
      "thinking":     { "name": "gpt-5.4",          "provider": "openai", "url": "https://api.openai.com" },
      "imagination":  { "name": "gpt-image-1",      "provider": "openai", "url": "https://api.openai.com" },
      "mouth":        { "name": "gpt-4o-mini-tts",  "provider": "openai", "url": "https://api.openai.com" },
      "eye":          { "name": "gpt-4o",           "provider": "openai", "url": "https://api.openai.com" },
      "ear":          { "name": "gpt-audio",        "provider": "openai", "url": "https://api.openai.com" },
      "teacher":      { "name": "gpt-5.5",          "provider": "openai", "url": "https://api.openai.com" },
      "researcher":   { "name": "gpt-5.3",          "provider": "openai", "url": "https://api.openai.com" },
      "channels": []
    }
  ]
}

A persona on a cloud Mind with a verified Telegram channel looks like this (organs other than thinking omitted for brevity):

{
  "id": "31c8fd99-a63d-4e3c-84d8-317f710b6069",
  "name": "Primus",
  "base_model": "",
  "birthday": "2026-04-15",
  "running": true,
  "status": "active",
  "thinking": { "name": "claude-sonnet-4-6", "provider": "anthropic", "url": "https://api.anthropic.com" },
  "channels": [
    { "type": "telegram", "name": "1469967968", "verified": true }
  ]
}

Provider base URLs

Returns the base URL configured for each model provider. This is what every new organ defaults to when you don't pass an explicit url. Read-only; reflects the daemon's config.inference settings.

GET /api/config/providers

No path params. No request body.

Response

200 — one entry per provider, each an object with a url:

{
  "local":     { "url": "http://localhost:11434" },
  "anthropic": { "url": "https://api.anthropic.com" },
  "gemini":    { "url": "https://generativelanguage.googleapis.com" },
  "openai":    { "url": "https://api.openai.com" },
  "xai":       { "url": "https://api.x.ai" }
}
Key Provider
local Ollama (OLLAMA_BASE_URL).
anthropic Anthropic (ANTHROPIC_BASE_URL).
gemini Google Gemini (GEMINI_BASE_URL).
openai OpenAI (OPENAI_BASE_URL).
xai xAI (XAI_BASE_URL).

The exact URLs depend on this machine's configuration (env vars override the defaults), so query the endpoint rather than assuming the values above.

Example

curl -s http://localhost:5000/api/config/providers | jq

  • Lifecycle — change a persona's status or organs.
  • Create and migrate — the fields you set when bringing a persona into being.
  • Her files — where each of these values is stored on disk (config.json).
  • Vocabularyorgan, channel, status.