Skip to main content
charm.yaml is the manifest that tells Charm how to display, run, price, and publish an agent.

Annotated Reference

This is a fully annotated example to understand specific capabilities or customization options.

# ==================================================================
# Charm Agent Manifest (Annotated Reference)
# ==================================================================

version: "{manifest_version}"  # [System] The UAC Spec version (Do not change manually).

# ------------------------------------------------------------------
# 1. Identity & Store Metadata
# ------------------------------------------------------------------
persona:
  name: "My Charm Agent" # Display Project Name (Max 50 chars)
  version: "0.1.0" # [Agent] Your Agent's Semantic Version. Update this when publishing updates.
  description: "A short description of this agent." # Tagline (Card view, Max 100 chars)
  
  # Full description supports Markdown. Used for the Info Page.
  full_description: |
    # My Charm Agent
    ...
  # Describe usage, available capabilities, and expected deliverables.
    
  authors: ["Brand, Company, or Individual Name"]
  tags: ["research", "productivity"] # We use tags to categorize agents for users, so please make sure your first tag is one of Productivity, Developer, Creative, Learning, Lifestyle, Search & News, or Others.
  license: "MIT"
  
  # Assets for the Storefront
  assets:
    icon: "https://your-site.com/assets/icon.png" # 512x512 Square
    banner: "https://your-site.com/assets/banner.png"  # 1200x600 Wide

pricing:
  model: "free"  # Options: free, subscription, one_time.
  amount: 0      # Price in USD. Ignored when model is 'free'.
  # billing_period: "monthly" # Options: monthly, annual (for subscription)
  # trial:
  #   enabled: true
  #   days: 7

# ------------------------------------------------------------------
# 2. UI Generation
# ------------------------------------------------------------------
# Defines the input form shown to users.
# It uses standard JSON Schema.
interface:
  input:
    type: "object"
    required: ["topic"] # Mandatory fields
    properties:
      # Example 1: Simple Text Input
      topic:
        type: "string"
        title: "Research Topic"
        default: "AI Agents"
      
      # Example 2: Large Text Area
      details:
        type: "string"
        title: "Extra Details"
        description: "Paste any background info here."
      
      # Example 3: File Upload
      # The Runner will download the file and inject the filename into this variable.
      document:
        type: "string"
        title: "Upload Document"

      # Example 4: Number Input
      depth:
        type: "integer"
        title: "Search Depth"
        default: 3
        minimum: 1
        maximum: 5

  # Maps input fields to frontend UI components
  ui:
    details: { "ui:widget": "textarea" }
    document: { "ui:widget": "file" }

  output:
    type: "object"
    description: "The structure of the final result."

  # Optional: For agents that persist state across runs
  state:
    format: "json"
    schema:
      type: "object"
      properties:
        history:
          type: "array"
      additionalProperties: false

# ------------------------------------------------------------------
# 3. Runtime Configuration
# ------------------------------------------------------------------
runtime:
  adapter:
    # - crewai / langchain / langgraph : Standard Python Frameworks
    # - openclaw : Configuration-driven Agent
    # - custom : Pure Python functions
    type: "crewai"
    
    # --------------------------------------------------------------
    # ENTRY POINT: Where is your agent object?
    # Format: <python_module_path>:<variable_or_function_name>
    # --------------------------------------------------------------
    # [Case A] For Frameworks (CrewAI, LangChain): Point to the agent instance.
    entry_point: "src.main:my_crew"
    
    # [Case B] For Custom (Pure Python): Point to a function or class instance.
    entry_point: "src.my_script:run_pipeline"

    # [Case C] For OpenClaw: Optional (uses default host if empty)
    entry_point: ""
    
    # --------------------------------------------------------------
    # SECURE ENV VARS: List keys your agent needs.
    # DO NOT put values here. The Runner injects them securely.
    # --------------------------------------------------------------
    environment_variables:
      models:
        - "OPENAI_API_KEY"
      tools:
        - "SERPER_API_KEY"

  # --------------------------------------------------------------
  # ENGINE CONFIG: For OpenClaw or specific engines
  # --------------------------------------------------------------
  config:
    system_prompt: "You are an expert researcher."
    model: "gpt-4o"
    temperature: 0.0
    auto_install_dependencies: true

  # --------------------------------------------------------------
  # SKILLS & MCP TOOLS
  # --------------------------------------------------------------
  skills:
    
    # [Source: Git] 
    - name: "research-flow"
      source: "git:https://github.com/openclaw/skill-researcher"
      version: "main" # Or Commit Hash / Tag (If you want to pin the version)

    # [Source: Zip] 
    - name: "finance-analyst"
      source: "https://clawhub.ai/download/skills/finance-v1.2.0.zip"

    # [Source: NPM] 
    - name: "google-search"
      source: "npm:@modelcontextprotocol/server-google-search"

    # [Source: PyPI] 
    - name: "local-time"
      source: "pip:mcp-server-time"
  
  # --------------------------------------------------------------
  # Memory & State Storage (Optional)
  # --------------------------------------------------------------
  memory:
    provider: "local" # Options: local, redis, postgres (Requires custom memory plugin)
    
  # --------------------------------------------------------------
  # Observability (Optional)
  # --------------------------------------------------------------
  telemetry:
    - "datadog" # Enable custom telemetry exporters
  
  # --------------------------------------------------------------
  # Base Image
  # --------------------------------------------------------------
   # Override standard images with your own custom Docker image
  # custom_image: "ghcr.io/your-org/my-agent-image:latest"

  # --------------------------------------------------------------
  # Execution Mode
  # --------------------------------------------------------------
   # "serverless": Runs once and shuts down. Perfect for one-time tasks, async workflows, or heavy batch processing.
   # "interactive": Built for continuous dialogue. Keeps context alive for seamless, back-and-forth interactions.
   # "daemon": 24/7 always-on. Ideal for monitoring, event listeners, or continuous background services.
  lifecycle: "serverless"

# ------------------------------------------------------------------
# 4. Authentication
# ------------------------------------------------------------------
# Declare if your agent needs user's OAuth tokens.
# NOTE: Use the official scope strings defined by the provider.
auth:
  providers:
    # [OAuth: Google]
    - name: "google"
      scopes: 
        - "https://www.googleapis.com/auth/calendar.readonly"
        - "https://www.googleapis.com/auth/gmail.send"

    # [OAuth: GitHub]
    - name: "github"
      scopes: 
        - "repo"
        - "read:user"

# ------------------------------------------------------------------
# 5. Governance (Policies)
# ------------------------------------------------------------------
policies:
  allow_internet_access: true
  max_steps: 20
  # Optional: Override serverless run timeout for this agent (seconds).
  # execution_timeout_seconds: 600

Field Reference Table

SectionFieldTypeDescription
PersonanameStringPublic display name of the agent.
versionStringThe semantic version of the agent (e.g., 1.0.0).
descriptionStringShort tagline for search results and cards.
assets.iconURL512x512px PNG/JPG image.
PricingmodelEnumfree, subscription, one_time.
amountNumberPrice in USD. Ignored if free.
billing_periodEnummonthly, annual (for subscription).
trial.enabledBooleanWhether trial is offered.
trial.daysIntegerNumber of trial days.
InterfaceinputSchemaStandard JSON Schema defining user inputs.
uiObjectMaps input keys to UI widgets (e.g. textarea, file).
stateSchemaOptional JSON Schema defining persistent state.
Runtimeadapter.typeEnumcrewai, langchain, langgraph, custom, openclaw.
entry_pointStringPython path (module:obj). Optional for openclaw.
environment_variablesObjectMap of ‘models’ and ‘tools’ requiring Env keys (e.g., OPENAI_API_KEY).
configObjectEngine-specific configuration (e.g. OpenClaw system_prompt, model).
skillsListList of MCP Skills to mount.
custom_imageStringCustom Docker image URI for the runtime environment.
memoryObjectConfiguration for persistent memory and state storage (e.g., provider).
telemetryListList of telemetry exporter names to enable.
modeEnumstandard (Default), full. Selects the container environment (Deprecated).
AuthprovidersListList of OAuth providers.
Policiesmax_stepsIntegerMaximum execution steps to prevent infinite loops.