Distinguishing agent by adapter type (how it executes) vs. organizational role (what it is responsible for). The same adapter can serve a manager or an individual contributor.
The four adapter families in Paperclip AI, when to choose each one, and how adapter type determines what an agent can actually do.
An agent row in the database is configuration — it has no compute of its own. The adapter is what turns an invocation into a real LLM call, shell command, or HTTP request. Paperclip ships four adapter families:
| Adapter | Invokes | Best for |
|---|---|---|
claude-code |
Anthropic Claude via CLI subprocess | Code generation, research, long-form reasoning |
openai |
OpenAI Chat Completions API | GPT-4o tasks, function calling |
http |
Any REST endpoint | External AI services, your own models |
shell |
Local shell command | File processing, data transforms, scripts |
claude-code AdapterThe default for local development. It spawns a claude-code CLI subprocess, passes the assembled prompt as stdin, and captures structured JSON output.
{
"adapter_type": "claude-code",
"adapter_config": {
"model": "claude-opus-4-5",
"max_tokens": 4096,
"temperature": 0.3
}
}
Requires the ANTHROPIC_API_KEY environment variable. Works in sandbox mode (PGlite) and production.
openai AdapterUses the OpenAI Chat Completions API.
{
"adapter_type": "openai",
"adapter_config": {
"model": "gpt-4o",
"max_tokens": 2048,
"api_key_env": "OPENAI_API_KEY"
}
}
Set api_key_env to the name of the environment variable that holds the key — never put the key directly in adapter_config.
http AdapterCalls any REST endpoint with a POST request. Useful for Ollama, local models, or your own inference server.
{
"adapter_type": "http",
"adapter_config": {
"url": "http://localhost:11434/api/generate",
"headers": { "Content-Type": "application/json" },
"body_template": "{\"model\": \"llama3\", \"prompt\": \"{{prompt}}\"}"
}
}
The {{prompt}} placeholder is replaced with the assembled task prompt at invocation time.
shell AdapterRuns a shell command with the task description passed as an argument or stdin.
{
"adapter_type": "shell",
"adapter_config": {
"command": "python3 /home/agents/researcher.py",
"timeout_ms": 30000
}
}
Useful for data pipeline agents that don't need an LLM at all.
Need LLM reasoning?
├── Yes, prefer Anthropic → claude-code
├── Yes, prefer OpenAI → openai
├── Yes, local model → http (point at Ollama)
└── No, pure computation → shell
You can have agents with different adapters in the same company. A common pattern:
claude-code (heavy reasoning)openai (lightweight, GPT-3.5)shell (runs a Python ETL script, no LLM needed)adapter_config without exposing API keys