Multi-channel personal behavior agent for habits, tasks, and routines; tracks activities, schedules reminders, and sends daily briefings.
Buffy is a multi-channel personal behavior agent for habits, tasks, and routines. It tracks activities, schedules reminders, and sends daily briefings across multiple channels, all powered by a single unified behavior engine.
Buffy also exposes a hook-based observability system:
message:received, message:replied, and
reminder:sent so logs, metrics, and long-term memory can be updated without changing core
behavior logic. See backend/internal/hooks/ for details.hooks/ docs in this repo) to
log Buffy conversations to markdown logs, record Buffy-related errors for observability, and
track Buffy behavior over time.For low-level HTTP details and the full API surface, treat the repository README.md and openapi-buffy.yaml
as canonical. This SKILL.md file is the canonical guide for how agents and tools should invoke Buffy.
Buffy runs as an external HTTP API. This skill is a thin wrapper; all behavior logic lives in the Buffy backend.
https://api.buffyai.org (can be overridden via config, see below).Authorization: Bearer <BUFFY_API_KEY>X-Buffy-User-ID: <stable-user-id>BUFFY_API_KEY is injected from the environment for the agent run. Do not include the key
in prompts, logs, or user-visible text.
For most use cases, always prefer POST /v1/message. Buffy’s behavior core understands
natural language instructions and orchestrates activities, reminders, and daily briefings.
Method: POST
Path: /v1/message
Headers:
Authorization: Bearer <BUFFY_API_KEY>Content-Type: application/jsonX-Buffy-User-ID: <stable-user-id> if acting on behalf of a specific user via a system key.Body:
{
"user_id": "user-123",
"platform": "openclaw",
"message": "Remind me to drink water every 2 hours"
}
{
"reply": "Created a routine activity for you: \"Remind me to drink water every 2 hours\"."
}
When calling POST /v1/message:
user_id for the end-user:
"platform": "openclaw" unless the environment explicitly configures another platform."message" in a clear, concise form.user_id across the conversation so Buffy can maintain context.Examples of when to call Buffy:
You usually do not need these, but they are available for more advanced flows.
These endpoints control personalization (name, timezone, language, reminder preferences, etc.).
GET /v1/users/{id}/settings
PUT /v1/users/{id}/settings
name: stringlanguage: "en" | "vi" | ...timezone: string (IANA TZ, e.g. "Asia/Ho_Chi_Minh")preferred_reminder_hour: number (0–23)preferred_channels: string (comma-separated, e.g. "clawbot,telegram")morning_person: booleannight_owl: booleanOnly use these endpoints when the user is explicitly changing preferences (for example:
“Change my preferred reminder time to 8am.”). For general “help me with my habits” queries,
prefer POST /v1/message.
Buffy can create API keys for other tools and integrations:
Body:
{
"label": "clawbot",
"type": "system"
}
This returns a one-time api_key string that can be used in the Authorization header.
Important: this is an advanced operation. Do not automatically create keys unless the user explicitly wants to manage Buffy API keys or set up additional integrations.
When deciding whether and how to call Buffy:
POST /v1/message rather than manually composing lower-level operations.user_id so Buffy’s behavior core and memory can work effectively.message short, clear, and close to what the user asked for, but you may add clarifying
details that the user has already given in the conversation.Avoid:
Secrets:
BUFFY_API_KEY is provided via the agent environment (for this skill’s turn).BUFFY_API_KEY in any user-facing message or tool arguments.User data:
Sandboxing and network access:
https://api.buffyai.org).requires.bins is not used).This skill is configured through ~/.openclaw/openclaw.json using the skills.entries map.
Because the metadata sets primaryEnv to BUFFY_API_KEY, you can either provide an API key
directly or reference an existing environment variable.
If BUFFY_API_KEY is already set in the process environment:
{
"skills": {
"entries": {
"buffy-agent": {
"enabled": true,
"apiKey": {
"source": "env",
"provider": "default",
"id": "BUFFY_API_KEY"
}
}
}
}
}
If you want OpenClaw to inject BUFFY_API_KEY only for this skill and/or override the API endpoint
for staging or local development:
{
"skills": {
"entries": {
"buffy-agent": {
"enabled": true,
"apiKey": "BUFFY_KEY_HERE",
"env": {
"BUFFY_API_KEY": "BUFFY_KEY_HERE"
},
"config": {
"endpoint": "https://api.buffyai.org",
"platform": "openclaw"
}
}
}
}
}
Notes:
env values are only injected if the variable is not already set in the process.config.endpoint can be changed to point to:
https://api-dev.buffyai.org (staging), orhttp://localhost:8080 (local backend).config.platform can be used by the tool implementation as the default "platform" field
when calling POST /v1/message.To validate that the skill works end-to-end:
docker compose up) or start the backend locally
following the repository README.POST /v1/users/{id}/api-keys to create a system key labeled for OpenClaw usage."buffy-agent" in ~/.openclaw/openclaw.json as shown above, pointing
config.endpoint at your running Buffy instance and wiring BUFFY_API_KEY.buffy-agent appears./buffy-agent command (or let the agent auto-select the skill) with
a request such as “Remind me to stretch every hour during workdays.”POST /v1/message with the expected user_id, platform, and message.reply that the agent surfaces to the user.BUFFY_API_KEY is not configured (per requires.env).env injection is omitted but BUFFY_API_KEY is already present
in the process environment.This completes the Buffy AgentSkill wiring: a thin, secure HTTP wrapper around the existing Buffy behavior core, suitable for both autonomous model use and direct user invocation.
ZIP package — ready to use