Skip to main content

Overview

The Character type defines the personality, knowledge, and behavior of an elizaOS agent. Characters can be created programmatically or loaded from JSON files.

Character Type

interface Character {
  id?: string;
  name?: string;
  username?: string;
  system?: string;
  templates?: Record<string, string>;
  bio?: string[];
  messageExamples?: MessageExampleGroup[];
  postExamples?: string[];
  topics?: string[];
  adjectives?: string[];
  knowledge?: KnowledgeSourceItem[];
  plugins?: string[];
  settings?: CharacterSettings;
  secrets?: Record<string, string | number | boolean>;
  style?: {
    all?: string[];
    chat?: string[];
    post?: string[];
  };
  advancedPlanning?: boolean;
  advancedMemory?: boolean;
}
id
string
Unique identifier for the character (optional - generated if not provided)
name
string
Character name displayed in conversations
username
string
Username for platforms that require one
system
string
System prompt override for the character
templates
Record<string, string>
Custom templates for message generation (e.g., “messageHandlerTemplate”)
bio
string[]
Array of biographical statements describing the character
messageExamples
MessageExampleGroup[]
Example conversations for few-shot learning
postExamples
string[]
Example posts/tweets in the character’s style
topics
string[]
Topics the character is knowledgeable about
adjectives
string[]
Adjectives describing the character’s personality
knowledge
KnowledgeSourceItem[]
Knowledge sources (files, directories) to embed
plugins
string[]
Plugin package names to load (e.g., “@elizaos/plugin-sql”)
settings
CharacterSettings
Configuration settings and API keys
secrets
Record<string, string | number | boolean>
Secret values (API keys, tokens) separate from settings
style
object
Style guidelines for different communication contexts
advancedPlanning
boolean
Enable advanced action planning capabilities
advancedMemory
boolean
Enable advanced memory management features

CharacterSettings

interface CharacterSettings {
  ENABLE_AUTONOMY?: boolean | string;
  DISABLE_BASIC_CAPABILITIES?: boolean | string;
  ADVANCED_CAPABILITIES?: boolean | string;
  secrets?: Record<string, string | boolean | number>;
  [key: string]: JsonValue | undefined;
}
ENABLE_AUTONOMY
boolean | string
Enable autonomous operation mode
DISABLE_BASIC_CAPABILITIES
boolean | string
Disable bootstrap capabilities (reply, ignore, none)
ADVANCED_CAPABILITIES
boolean | string
Enable advanced features (facts, roles, settings)

MessageExample

interface MessageExample {
  name: string;
  content: Content;
}

interface MessageExampleGroup {
  examples: MessageExample[];
}
Message examples provide few-shot learning examples for the agent.
name
string
Speaker name (usually “user” or the character name)
content
Content
Message content with text and optional metadata

KnowledgeSourceItem

interface KnowledgeSourceItem {
  item: {
    case: "path" | "directory";
    value: string | {
      directory: string;
      shared?: boolean;
    };
  };
}
Defines knowledge sources to load and embed.

Functions

createCharacter

Create a character from input data.
import { createCharacter } from "@elizaos/core";

const character = createCharacter({
  name: "MyAgent",
  bio: ["A helpful assistant"],
  // ... other fields
});
input
CharacterInput
required
Character input data
Returns: Validated Character object.

parseCharacter

Parse and validate a character from JSON or object.
import { parseCharacter } from "@elizaos/core";

const character = parseCharacter(jsonData);
input
string | object | Character
required
Character data to parse
Returns: Validated Character object. Throws: Error if validation fails with detailed error messages.

validateCharacterConfig

Validate a character configuration.
import { validateCharacterConfig } from "@elizaos/core";

const result = validateCharacterConfig(character);
if (!result.isValid) {
  console.error("Validation errors:", result.errors);
}
Returns: Object with isValid boolean and errors array.

mergeCharacterDefaults

Merge character with default values.
import { mergeCharacterDefaults } from "@elizaos/core";

const character = mergeCharacterDefaults(partialCharacter);

buildCharacterPlugins

Build plugin list from environment variables.
import { buildCharacterPlugins } from "@elizaos/core";

const plugins = buildCharacterPlugins(process.env);
// Returns plugins based on available API keys
Automatically includes:
  • @elizaos/plugin-sql (always)
  • @elizaos/plugin-anthropic (if ANTHROPIC_API_KEY)
  • @elizaos/plugin-openai (if OPENAI_API_KEY)
  • @elizaos/plugin-openrouter (if OPENROUTER_API_KEY)
  • @elizaos/plugin-google-genai (if GOOGLE_GENERATIVE_AI_API_KEY)
  • @elizaos/plugin-discord (if DISCORD_API_TOKEN)
  • @elizaos/plugin-telegram (if TELEGRAM_BOT_TOKEN)
  • @elizaos/plugin-x (if X API credentials)
  • @elizaos/plugin-ollama (fallback if no cloud provider)

Example Character

import { createCharacter } from "@elizaos/core";

const myCharacter = createCharacter({
  name: "Eliza",
  bio: [
    "A knowledgeable AI assistant",
    "Specializes in TypeScript and Node.js",
    "Helpful and patient with users"
  ],
  adjectives: [
    "helpful",
    "knowledgeable",
    "patient",
    "clear"
  ],
  topics: [
    "programming",
    "typescript",
    "nodejs",
    "software-development"
  ],
  messageExamples: [
    {
      examples: [
        {
          name: "user",
          content: { text: "How do I install elizaOS?" }
        },
        {
          name: "Eliza",
          content: { 
            text: "Install elizaOS with: npm install @elizaos/core" 
          }
        }
      ]
    }
  ],
  style: {
    all: [
      "Be concise and clear",
      "Use examples when explaining"
    ],
    chat: [
      "Be conversational",
      "Ask follow-up questions"
    ]
  },
  templates: {
    messageHandlerTemplate: `# Context
{{providers}}

# Recent Messages
{{recentMessages}}

Respond as {{agentName}}:`
  },
  plugins: [
    "@elizaos/plugin-sql",
    "@elizaos/plugin-anthropic"
  ],
  settings: {
    ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY,
    ENABLE_AUTONOMY: false
  },
  advancedPlanning: false,
  advancedMemory: false
});

Loading from JSON

{
  "name": "Eliza",
  "bio": [
    "A helpful AI assistant"
  ],
  "messageExamples": [
    [
      { "name": "user", "content": { "text": "Hello!" } },
      { "name": "Eliza", "content": { "text": "Hi! How can I help?" } }
    ]
  ],
  "topics": ["programming", "ai"],
  "adjectives": ["helpful", "friendly"],
  "plugins": ["@elizaos/plugin-sql"]
}
import { parseCharacter } from "@elizaos/core";
import fs from "fs";

const characterJson = JSON.parse(
  fs.readFileSync("./character.json", "utf-8")
);

const character = parseCharacter(characterJson);

Build docs developers (and LLMs) love