| name | metaclaw-evolving-agent |
| description | Deploy and configure MetaClaw — an agent that meta-learns and evolves from live conversations using skills injection, RL training, and smart scheduling. |
| triggers | ["set up metaclaw agent","configure evolving agent","metaclaw skills mode","metaclaw rl training","metaclaw madmax scheduler","agent meta-learning setup","tinker rl backend configuration","metaclaw proxy deployment"] |
MetaClaw Evolving Agent
Skill by ara.so — Daily 2026 Skills collection
MetaClaw is an OpenAI-compatible proxy agent that intercepts conversations, injects learned skills, and continuously improves itself through real-world interactions. It supports three modes: lightweight skills injection, immediate RL training, and a smart "madmax" scheduler that defers weight updates to idle/sleep windows.
Installation
pip install -e .
pip install -e ".[rl]"
pip install -e ".[evolve]"
pip install -e ".[scheduler]"
pip install -e ".[rl,evolve,scheduler]"
Quick Start
metaclaw setup
metaclaw start
metaclaw start --mode skills_only
metaclaw start --mode rl
metaclaw start --mode rl
After metaclaw start, a local OpenAI-compatible proxy is running. Point your client (OpenClaw or any OpenAI SDK consumer) at http://localhost:<port> instead of the upstream LLM endpoint.
Configuration
metaclaw setup writes a config file (default: ~/.metaclaw/config.yaml). You can also edit it directly:
proxy:
host: 0.0.0.0
port: 8080
llm:
provider: kimi
base_url: https://api.moonshot.cn/v1
model: moonshot-v1-8k
skills:
enabled: true
max_injected: 5
summarize_after_session: true
rl:
enabled: true
backend: auto
batch_size: 32
algorithm: grpo
opd_teacher: false
scheduler:
enabled: true
sleep_hours: [22, 7]
idle_timeout_minutes: 15
google_calendar: false
logging:
Environment Variables
export METACLAW_LLM_API_KEY="your-llm-api-key"
export METACLAW_TINKER_API_KEY="your-tinker-api-key"
export METACLAW_MINT_API_KEY="your-mint-api-key"
export GOOGLE_CALENDAR_CREDENTIALS_PATH="path/to/creds.json"
Operating Modes
| Mode | Command | GPU Required | Description |
|---|
skills_only | metaclaw start --mode skills_only | No | Proxy + skills injection + auto-summarization |
rl | metaclaw start --mode rl | Via API | Skills + GRPO training when batch fills |
madmax | metaclaw start | Via API | Skills + RL + scheduler (trains only during idle/sleep/meetings) |
Python API
Programmatic startup
import asyncio
from metaclaw import MetaClawAgent, AgentConfig, Mode
async def main():
config = AgentConfig.from_yaml("~/.metaclaw/config.yaml")
agent = MetaClawAgent(config, mode=Mode.MADMAX)
await agent.start()
asyncio.run(main())
Manual skill injection
from metaclaw.skills import SkillStore, SkillInjector
store = SkillStore(path="~/.metaclaw/skills")
store.add(
name="code-review-checklist",
content="Always check for: 1) error handling, 2) type hints, 3) docstrings.",
tags=["code", "review"]
)
injector = SkillInjector(store)
relevant = injector.retrieve(query="review my Python function", top_k=3)
for skill in relevant:
print(skill.name, skill.score)
Intercepting and recording conversations
from metaclaw.proxy import ConversationInterceptor
from metaclaw.memory import ExperienceBuffer
buffer = ExperienceBuffer(max_size=1000)
interceptor = ConversationInterceptor(
upstream_url="https://api.moonshot.cn/v1",
on_complete=buffer.record
)
async def on_complete(messages: list[dict], response: dict) -> None:
...
Triggering RL training manually
from metaclaw.training import RLTrainer, TrainingConfig
trainer = RLTrainer(
config=TrainingConfig(
backend="tinker",
algorithm="grpo",
batch_size=32,
lora_rank=16,
)
)
async def run_training(buffer):
batch = buffer.sample(n=32, split="support")
result = await trainer.train(batch)
print(f"Training complete. Loss: {result.loss:.4f}, Steps: {result.steps}")
Reward modeling
from metaclaw.rewards import RewardModel
reward_model = RewardModel(provider="llm")
async def score_turn(prompt: str, response: str) -> float:
score = await reward_model.score(prompt=prompt, response=response)
return score
Skills Lifecycle
Conversation turn
│
▼
SkillInjector.retrieve() ← vector search over SkillStore
│ injects top-k skills into system prompt
▼
LLM responds
│
▼
ExperienceBuffer.record() ← stores (context, response, metadata)
│
▼ (end of session)
SkillSummarizer.run() ← LLM extracts reusable patterns
│
▼
SkillStore.upsert() ← new/updated skills persisted to disk
Integration: OpenAI SDK as Client
Point any OpenAI SDK client at the MetaClaw proxy:
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8080/v1",
api_key="not-used-but-required-by-sdk"
)
response = client.chat.completions.create(
model="moonshot-v1-8k",
messages=[
{"role": "user", "content": "Review my pull request strategy."}
]
)
print(response.choices[0].message.content)
Skills are injected transparently — the client code does not change.
Scheduler (MadMax Mode)
The scheduler ensures RL weight updates never interrupt active use:
from metaclaw.scheduler import MadMaxScheduler, SchedulerConfig
scheduler = MadMaxScheduler(
config=SchedulerConfig(
sleep_hours=(22, 7),
idle_timeout_minutes=15,
google_calendar=True,
credentials_path="creds.json"
)
)
if await scheduler.is_training_window():
await trainer.train(batch)
Google Calendar Setup
export GOOGLE_CALENDAR_CREDENTIALS_PATH="/path/to/creds.json"
metaclaw start
Support/Query Set Separation
MetaClaw separates experience into support and query sets to prevent stale rewards from polluting updates:
from metaclaw.memory import ExperienceBuffer
buffer = ExperienceBuffer(
max_size=2000,
support_ratio=0.5
)
support_batch = buffer.sample(n=16, split="support")
query_batch = buffer.sample(n=16, split="query")
await trainer.train_meta(support=support_batch, query=query_batch)
RL Backends
Tinker (default)
rl:
backend: tinker
tinker_project: my-metaclaw-project
lora_rank: 16
learning_rate: 1e-4
MinT
pip install metaclaw-mint
rl:
backend: mint
mint_endpoint: https://your-mint-endpoint
Auto-detection
rl:
backend: auto
Troubleshooting
Proxy not reachable after metaclaw start
- Check port conflicts:
lsof -i :8080
- Change
proxy.port in config and restart
rl mode: "No training backend available"
- Ensure
pip install -e ".[rl]" completed successfully
- Verify
METACLAW_TINKER_API_KEY or METACLAW_MINT_API_KEY is set
- Try
rl.backend: tinker explicitly instead of auto
Skills not persisting between sessions
- Confirm
skills.summarize_after_session: true in config
- Check write permissions on
~/.metaclaw/skills/
- Run
metaclaw skills list to inspect stored skills
Madmax mode never trains
- Verify
scheduler.sleep_hours covers your timezone's night
- Lower
scheduler.idle_timeout_minutes for testing (e.g., 1)
- Check scheduler logs:
~/.metaclaw/logs/scheduler.log
Google Calendar integration fails
- Re-run OAuth flow: delete
~/.metaclaw/token.json and restart
- Ensure Calendar API is enabled in your Google Cloud project
OPD teacher distillation errors
CLI Reference
metaclaw setup
metaclaw start
metaclaw start --mode skills_only
metaclaw start --mode rl
metaclaw start --config path/to/config.yaml
metaclaw skills list
metaclaw skills delete <name>
metaclaw skills export skills.json
metaclaw status
metaclaw logs
metaclaw logs --component scheduler