Skip to main content

πŸ€– Auto-Curator Agent - Self-Maintaining Awesome List

A multi-agent system built with Docker cagent that maintains itself - it discovers new Docker cagent resources, validates links, and submits PRs to keep the awesome-docker-cagent list fresh.

🎯 What You'll Learn​

  1. Build a 4-agent system with specialized roles (Curator, Discoverer, Validator, Publisher)
  2. Configure GitHub Models as a free LLM provider for cagent
  3. Use custom providers via the providers: YAML section
  4. Integrate MCP tools (GitHub, DuckDuckGo, Fetch)
  5. Work with cagent skills for domain-specific knowledge
  6. Handle token limits when using free-tier APIs

πŸ—οΈ Architecture​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ CURATOR (Root) β”‚
β”‚ β”‚
β”‚ β€’ Coordinates all maintenance tasks β”‚
β”‚ β€’ Formats entries using awesome-list table syntax β”‚
β”‚ β€’ Decides what to add, update, or remove β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β–Ό β–Ό β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ DISCOVERER β”‚ β”‚ VALIDATOR β”‚ β”‚ PUBLISHER β”‚
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β€’ Web search β”‚ β”‚ β€’ Check β”‚ β”‚ β€’ Create β”‚
β”‚ β€’ GitHub API β”‚ β”‚ URLs β”‚ β”‚ branches β”‚
β”‚ β€’ Find repos β”‚ β”‚ β€’ Quality β”‚ β”‚ β€’ Update β”‚
β”‚ β€’ Find blogs β”‚ β”‚ scoring β”‚ β”‚ README β”‚
β”‚ β”‚ β”‚ β€’ Freshnessβ”‚ β”‚ β€’ Open PRs β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ β”‚ β”‚
β–Ό β–Ό β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ DuckDuckGoβ”‚ β”‚ Fetch β”‚ β”‚ GitHub β”‚
β”‚ MCP β”‚ β”‚ Tool β”‚ β”‚ MCP β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸš€ Quick Start​

Prerequisites​

  • Docker Desktop 4.49+ (includes cagent)
  • GitHub Personal Access Token with repo + models:read permissions

Step 1: Set Up Your GitHub Token​

Create a fine-grained PAT at github.com/settings/personal-access-tokens with:

PermissionScopeWhy
repoRepositoryRead/write awesome-list repo, create branches and PRs
models:readAccountAccess GitHub Models API for LLM inference
export GITHUB_TOKEN=your_github_pat

Step 2: Clone and Run​

git clone https://github.com/ajeetraina/docker-workshop
cd docker-workshop/docs/lab10/projects/auto-curator-agent/

# Run the lite version (recommended for GitHub Models free tier)
cagent run ./cagent-curator-lite.yaml "Find new cagent blog posts"

⚑ Two Configs: Full vs Lite​

cagent-curator.yaml (Full)cagent-curator-lite.yaml (Lite)
Skillsβœ… 3 skill files loaded❌ Disabled (saves ~2,500 tokens)
InstructionsDetailed with examplesCondensed essentials
Sub-agent modelgpt-4o (smart)gpt-4o-mini (fast)
Token budget~4,500+ tokens overhead~1,500 tokens overhead
Best forPaid GitHub Models / other providersGitHub Models free tier
GitHub Models Free Tier Token Limit

GitHub Models free tier limits gpt-4o to 8,000 input tokens per request. Skills + detailed instructions + fetched content can easily exceed this. Use the lite version unless you have paid GitHub Models or another provider.

πŸ“‹ Usage Examples​

Discover New Resources​

# Basic discovery
cagent run ./cagent-curator-lite.yaml "Find new Docker cagent blog posts published this week"

# Specific and targeted (recommended)
cagent run ./cagent-curator-lite.yaml "Search for blog posts that specifically mention \
'cagent' the Docker multi-agent runtime tool. Only include posts that discuss \
cagent YAML configs, cagent run commands, or multi-agent orchestration. \
Exclude generic Docker or Docker Model Runner posts."

# With deduplication against existing list
cagent run ./cagent-curator-lite.yaml "Read the current README from \
collabnix/awesome-docker-cagent, then search for new blog posts about \
Docker cagent that are NOT already in the list."
cagent run ./cagent-curator-lite.yaml "Read the awesome-docker-cagent README \
and check all URLs for broken links"

Submit Updates via PR​

cagent run ./cagent-curator-lite.yaml "Find new cagent resources, validate them, \
and create a PR adding them to the awesome list"

πŸ”§ Configuration Deep Dive​

GitHub Models as a Custom Provider​

There is no built-in github provider in cagent. We define one using the providers: section:

providers:
github:
api_type: openai_chatcompletions
base_url: https://models.github.ai/inference
token_key: GITHUB_TOKEN

models:
smart:
provider: github
model: openai/gpt-4o # vendor prefix required!
max_tokens: 4096
fast:
provider: github
model: openai/gpt-4o-mini
max_tokens: 2048
Common Pitfall: Model Name Format

GitHub Models requires the openai/ vendor prefix in model names. Using just gpt-4o results in 403 Forbidden: No access to model: /gpt-4o. Always use openai/gpt-4o, openai/gpt-4o-mini, etc.

GitHub Models Free Tier Rate Limits​

Limitgpt-4ogpt-4o-mini
Input tokens/request8,0008,000
Output tokens/request4,0964,096
Requests/minute1015
Requests/day50150

πŸ’‘ Prompting Tips​

The lite config trades detailed skill instructions for token headroom. Your prompt quality matters more:

❌ Too Vagueβœ… Specific
"Find new cagent blog posts""Search for posts that specifically mention 'cagent' the Docker multi-agent runtime. Exclude generic Docker or DMR posts."
"Check links""Read the awesome-docker-cagent README and check all URLs in the MCP Servers section for broken links"

Key tips:

  • Say "cagent" explicitly - helps distinguish from generic Docker content
  • Mention what to exclude - "Exclude Docker Model Runner, Claude Code posts"
  • Ask it to read the README first - enables deduplication
  • One task per prompt - saves tokens within the 8K limit

πŸ› Troubleshooting​

ErrorCauseFix
403 no_access to model: /gpt-4oMissing vendor prefixUse openai/gpt-4o not gpt-4o
403 no_access to model: openai/gpt-4oToken missing models permissionAdd models:read to your PAT
413 Request Entity Too LargeInput exceeds 8K tokensSwitch to cagent-curator-lite.yaml
429 Too Many RequestsRate limit hitWait and retry (10 req/min for gpt-4o)
Results include generic Docker postsPrompt too vagueBe specific - see Prompting Tips above

πŸ“¦ Skills (Full Version Only)​

The full config loads 3 skills from .claude/skills/:

SkillPurpose
awesome-list-formatTable syntax, section structure, categorization rules
link-validationURL checking, GitHub activity monitoring, content freshness
resource-discoverySearch strategies, quality scoring, deduplication

πŸ”„ Automation with GitHub Actions​

# .github/workflows/curate.yml
name: Weekly Curation
on:
schedule:
- cron: '0 9 * * 1' # Every Monday at 9am
workflow_dispatch:

jobs:
curate:
runs-on: ubuntu-latest
steps:
- uses: docker/cagent-action@v1
with:
config: cagent-curator-lite.yaml
prompt: "Search for blog posts that specifically mention cagent the Docker multi-agent runtime. Read the current README first to avoid duplicates. Create a PR with any new findings."
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

πŸ“¦ Push to Docker Hub​

docker login
cagent push ./cagent-curator-lite.yaml docker.io/YOUR_USERNAME/awesome-cagent-curator:latest

πŸ“Š Workshop Flow​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ AUTO-CURATOR AGENT WORKFLOW β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ β”‚
β”‚ 1. CONFIGURE 2. DISCOVER 3. PUBLISH β”‚
β”‚ ─────────── ─────────── ────────── β”‚
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ GitHub β”‚ β”‚ Search β”‚ β”‚ Create PR β”‚ β”‚
β”‚ β”‚ Models │───────▢│ + Check │───────▢│ to Update β”‚ β”‚
β”‚ β”‚ + PAT β”‚ β”‚ + Score β”‚ β”‚ Awesome Listβ”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β–Ό β–Ό β–Ό β”‚
β”‚ Custom provider DuckDuckGo MCP GitHub MCP β”‚
β”‚ via providers: + Fetch tool creates branch β”‚
β”‚ section validates URLs + opens PR β”‚
β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸŽ“ Key Concepts Covered​

ConceptDescription
Custom ProvidersDefining GitHub Models as an OpenAI-compatible provider via providers:
Token BudgetingManaging free-tier API limits with lite vs full configs
Multi-Agent Coordination4 agents with specialized roles collaborating on a task
MCP ToolsGitHub, DuckDuckGo, and Fetch tools via Model Context Protocol
cagent SkillsDomain-specific knowledge loaded from .claude/skills/
Vendor PrefixesGitHub Models requires openai/gpt-4o format
Self-Maintaining SystemsAgents that keep a community resource list up to date