From d55fcce4fecc93c35d5607cb40e88d7bb67c9974 Mon Sep 17 00:00:00 2001 From: Sayt0 <138035894+Sayt-0@users.noreply.github.com> Date: Fri, 3 Jul 2026 14:31:26 +0200 Subject: [PATCH] docker-agent: single-source docs via Hugo module mount (#25480) Single-sources the Docker Agent documentation from the product repo via a Hugo module mount, joining the pattern used by CLI, Buildx, Compose, BuildKit, Model Runner, and the Moby API. Closes the docs.docker.com side of docker/docker-agent#3371. ## Context The pages under `content/manuals/ai/docker-agent/` were hand-authored duplicates of the product repo docs and drifted on every upstream change. The source docs were converted to portable Hugo-clean Markdown and prepared for mounting in docker/docker-agent#3413 and docker/docker-agent#3414, released in docker-agent v1.96.0. ## What changed | Change | Detail | |---|---| | `go.mod` | `github.com/docker/docker-agent v1.96.0` added to `require` and `tool` | | `hugo.yaml` | `module.imports` mounts the eight docs sections and `demo.gif` onto `content/manuals/ai/docker-agent/` | | Content | The 16 hand-authored pages are removed; `_index.md` stays hand-authored (landing page), with links rewritten to the mounted pages | | `_vendor/` | 99 vendored files from the module | | `.github/workflows/sync-docker-agent-docs.yml` | Daily poll that vendors the latest docker-agent release and opens a bot PR, modeled on `sync-cli-docs.yml` | ## URL preservation Every removed page keeps its URL: the mounted pages carry `aliases` front matter (added upstream in docker/docker-agent#3414), and `_index.md` keeps aliases for the removed section indexes (`integrations/`, `reference/`, `reference/examples/`). | Old URL | Redirects to | |---|---| | `/ai/docker-agent/tutorial/` | `.../getting-started/quickstart/` | | `/ai/docker-agent/best-practices/` | `.../guides/tips/` | | `/ai/docker-agent/evals/` | `.../features/evaluation/` | | `/ai/docker-agent/local-models/` | `.../providers/local/` | | `/ai/docker-agent/model-providers/` | `.../providers/overview/` | | `/ai/docker-agent/rag/` | `.../tools/rag/` | | `/ai/docker-agent/sharing-agents/` | `.../concepts/distribution/` | | `/ai/docker-agent/integrations/{a2a,acp,mcp}/` | `.../features/a2a/`, `.../features/acp/`, `.../tools/mcp/` | | `/ai/docker-agent/reference/{cli,config,toolsets}/` | `.../features/cli/`, `.../configuration/overview/`, `.../configuration/tools/` | | `/ai/docker-agent/integrations/`, `/ai/docker-agent/reference/`, `/ai/docker-agent/reference/examples/` | `/ai/docker-agent/` | ## Mount scope All eight sections are mounted rather than a core subset: `refLinksErrorLevel: ERROR` makes partial mounts fail the build for any relative link into an unmounted page, and the link closure from the core sections already pulls in 68 of the 90 pages. Mounting everything keeps the build link-safe and removes all drift. ## Keeping the pin fresh On each docker-agent release, `sync-docker-agent-docs.yml` (daily poll, mirrors `sync-cli-docs.yml`) compares the latest release tag against the pinned version and opens a bot PR with the re-vendored module. docker/docker-agent also runs `validate-upstream.yml` on every docs PR, so upstream changes that would break this site fail CI before they merge (two source-side issues were caught exactly this way while preparing this change). ## Validation `docker buildx bake validate` passes on this branch: | Target | Result | |---|---| | test (Hugo build + htmltest) | pass (3196 pages, 1515 aliases, 3110 documents tested) | | lint | pass | | unused-media | pass | | test-go-redirects | pass | | validate-vendor | pass | | dockerfile-lint | pass | `actionlint` passes on the new workflow. --- .github/workflows/sync-docker-agent-docs.yml | 130 +++ .../docker-agent/docs/community/_index.md | 5 + .../docs/community/contributing/index.md | 130 +++ .../docs/community/opentelemetry/index.md | 98 ++ .../docs/community/telemetry/index.md | 78 ++ .../docs/community/troubleshooting/index.md | 254 +++++ .../docker-agent/docs/concepts/_index.md | 5 + .../docs/concepts/agents/index.md | 113 +++ .../docs/concepts/distribution/index.md | 146 +++ .../docs/concepts/models/index.md | 160 ++++ .../docs/concepts/multi-agent/index.md | 420 +++++++++ .../docker-agent/docs/concepts/tools/index.md | 70 ++ .../docker-agent/docs/configuration/_index.md | 5 + .../docs/configuration/agents/index.md | 552 +++++++++++ .../docs/configuration/hcl/index.md | 244 +++++ .../docs/configuration/hooks/index.md | 882 ++++++++++++++++++ .../docs/configuration/models/index.md | 531 +++++++++++ .../docs/configuration/overview/index.md | 507 ++++++++++ .../docs/configuration/permissions/index.md | 242 +++++ .../docs/configuration/routing/index.md | 169 ++++ .../docs/configuration/sandbox/index.md | 209 +++++ .../configuration/structured-output/index.md | 216 +++++ .../docs/configuration/tools/index.md | 503 ++++++++++ .../docker/docker-agent/docs/demo.gif | Bin 0 -> 1095704 bytes .../docker-agent/docs/features/_index.md | 5 + .../docker-agent/docs/features/a2a/index.md | 68 ++ .../docker-agent/docs/features/acp/index.md | 116 +++ .../docs/features/api-server/index.md | 355 +++++++ .../docs/features/chat-server/index.md | 231 +++++ .../docker-agent/docs/features/cli/index.md | 570 +++++++++++ .../docs/features/evaluation/index.md | 238 +++++ .../docs/features/harnesses/index.md | 200 ++++ .../docs/features/mcp-mode/index.md | 126 +++ .../docs/features/remote-mcp/index.md | 279 ++++++ .../docs/features/skills/index.md | 375 ++++++++ .../docs/features/snapshots/index.md | 111 +++ .../docker-agent/docs/features/tui/index.md | 416 +++++++++ .../docs/getting-started/_index.md | 5 + .../getting-started/installation/index.md | 148 +++ .../getting-started/introduction/index.md | 73 ++ .../docs/getting-started/quickstart/index.md | 144 +++ .../docker/docker-agent/docs/guides/_index.md | 5 + .../docker-agent/docs/guides/go-sdk/index.md | 615 ++++++++++++ .../docker-agent/docs/guides/secrets/index.md | 271 ++++++ .../docs/guides/thinking/index.md | 360 +++++++ .../docker-agent/docs/guides/tips/index.md | 423 +++++++++ .../docker-agent/docs/providers/_index.md | 5 + .../docs/providers/anthropic/index.md | 239 +++++ .../docs/providers/baseten/index.md | 90 ++ .../docs/providers/bedrock/index.md | 174 ++++ .../docs/providers/cerebras/index.md | 102 ++ .../providers/cloudflare-ai-gateway/index.md | 114 +++ .../providers/cloudflare-workers-ai/index.md | 90 ++ .../docs/providers/custom/index.md | 265 ++++++ .../docs/providers/deepseek/index.md | 95 ++ .../docker-agent/docs/providers/dmr/index.md | 252 +++++ .../docs/providers/fireworks/index.md | 101 ++ .../docs/providers/github-copilot/index.md | 146 +++ .../docs/providers/google/index.md | 173 ++++ .../docker-agent/docs/providers/groq/index.md | 98 ++ .../docs/providers/huggingface/index.md | 100 ++ .../docs/providers/local/index.md | 221 +++++ .../docs/providers/minimax/index.md | 91 ++ .../docs/providers/mistral/index.md | 105 +++ .../docs/providers/moonshot/index.md | 96 ++ .../docs/providers/nebius/index.md | 89 ++ .../docs/providers/openai/index.md | 126 +++ .../docs/providers/opencode-go/index.md | 159 ++++ .../docs/providers/opencode-zen/index.md | 223 +++++ .../docs/providers/openrouter/index.md | 87 ++ .../docs/providers/overview/index.md | 99 ++ .../docs/providers/ovhcloud/index.md | 107 +++ .../docs/providers/together/index.md | 100 ++ .../docs/providers/vercel/index.md | 105 +++ .../docker-agent/docs/providers/xai/index.md | 98 ++ .../docker/docker-agent/docs/tools/_index.md | 5 + .../docker-agent/docs/tools/a2a/index.md | 40 + .../docker-agent/docs/tools/api/index.md | 251 +++++ .../docs/tools/background-agents/index.md | 115 +++ .../docker-agent/docs/tools/fetch/index.md | 172 ++++ .../docs/tools/filesystem/index.md | 112 +++ .../docker-agent/docs/tools/handoff/index.md | 62 ++ .../docker-agent/docs/tools/lsp/index.md | 226 +++++ .../docs/tools/mcp-catalog/index.md | 112 +++ .../docker-agent/docs/tools/mcp/index.md | 287 ++++++ .../docker-agent/docs/tools/memory/index.md | 58 ++ .../docs/tools/model-picker/index.md | 72 ++ .../docker-agent/docs/tools/open-url/index.md | 94 ++ .../docker-agent/docs/tools/openapi/index.md | 82 ++ .../docker-agent/docs/tools/plan/index.md | 132 +++ .../docker-agent/docs/tools/rag/index.md | 264 ++++++ .../docker-agent/docs/tools/script/index.md | 63 ++ .../docs/tools/session_context/index.md | 66 ++ .../docs/tools/session_plan/index.md | 126 +++ .../docker-agent/docs/tools/shell/index.md | 128 +++ .../docker-agent/docs/tools/tasks/index.md | 58 ++ .../docker-agent/docs/tools/think/index.md | 29 + .../docker-agent/docs/tools/todo/index.md | 53 ++ .../docs/tools/transfer-task/index.md | 63 ++ .../docs/tools/user-prompt/index.md | 185 ++++ _vendor/modules.txt | 3 +- content/manuals/ai/docker-agent/_index.md | 19 +- .../manuals/ai/docker-agent/best-practices.md | 254 ----- content/manuals/ai/docker-agent/evals.md | 163 ---- .../docker-agent/images/cagent-acp-zed.avif | Bin 42442 -> 0 bytes .../ai/docker-agent/integrations/_index.md | 53 -- .../ai/docker-agent/integrations/a2a.md | 205 ---- .../ai/docker-agent/integrations/acp.md | 185 ---- .../ai/docker-agent/integrations/mcp.md | 308 ------ .../manuals/ai/docker-agent/local-models.md | 215 ----- .../ai/docker-agent/model-providers.md | 166 ---- content/manuals/ai/docker-agent/rag.md | 436 --------- .../ai/docker-agent/reference/_index.md | 6 - .../manuals/ai/docker-agent/reference/cli.md | 482 ---------- .../ai/docker-agent/reference/config.md | 621 ------------ .../ai/docker-agent/reference/examples.md | 33 - .../ai/docker-agent/reference/toolsets.md | 639 ------------- .../manuals/ai/docker-agent/sharing-agents.md | 96 -- content/manuals/ai/docker-agent/tutorial.md | 291 ------ go.mod | 6 +- go.sum | 4 + hugo.yaml | 34 + 122 files changed, 17461 insertions(+), 4166 deletions(-) create mode 100644 .github/workflows/sync-docker-agent-docs.yml create mode 100644 _vendor/github.com/docker/docker-agent/docs/community/_index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/community/contributing/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/community/opentelemetry/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/community/telemetry/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/community/troubleshooting/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/concepts/_index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/concepts/agents/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/concepts/distribution/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/concepts/models/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/concepts/multi-agent/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/concepts/tools/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/configuration/_index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/configuration/agents/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/configuration/hcl/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/configuration/hooks/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/configuration/models/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/configuration/overview/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/configuration/permissions/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/configuration/routing/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/configuration/sandbox/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/configuration/structured-output/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/configuration/tools/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/demo.gif create mode 100644 _vendor/github.com/docker/docker-agent/docs/features/_index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/features/a2a/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/features/acp/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/features/api-server/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/features/chat-server/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/features/cli/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/features/evaluation/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/features/harnesses/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/features/mcp-mode/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/features/remote-mcp/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/features/skills/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/features/snapshots/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/features/tui/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/getting-started/_index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/getting-started/installation/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/getting-started/introduction/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/getting-started/quickstart/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/guides/_index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/guides/go-sdk/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/guides/secrets/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/guides/thinking/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/guides/tips/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/_index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/anthropic/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/baseten/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/bedrock/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/cerebras/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/cloudflare-ai-gateway/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/cloudflare-workers-ai/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/custom/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/deepseek/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/dmr/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/fireworks/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/github-copilot/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/google/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/groq/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/huggingface/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/local/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/minimax/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/mistral/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/moonshot/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/nebius/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/openai/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/opencode-go/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/opencode-zen/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/openrouter/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/overview/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/ovhcloud/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/together/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/vercel/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/providers/xai/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/tools/_index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/tools/a2a/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/tools/api/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/tools/background-agents/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/tools/fetch/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/tools/filesystem/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/tools/handoff/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/tools/lsp/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/tools/mcp-catalog/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/tools/mcp/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/tools/memory/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/tools/model-picker/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/tools/open-url/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/tools/openapi/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/tools/plan/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/tools/rag/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/tools/script/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/tools/session_context/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/tools/session_plan/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/tools/shell/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/tools/tasks/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/tools/think/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/tools/todo/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/tools/transfer-task/index.md create mode 100644 _vendor/github.com/docker/docker-agent/docs/tools/user-prompt/index.md delete mode 100644 content/manuals/ai/docker-agent/best-practices.md delete mode 100644 content/manuals/ai/docker-agent/evals.md delete mode 100644 content/manuals/ai/docker-agent/images/cagent-acp-zed.avif delete mode 100644 content/manuals/ai/docker-agent/integrations/_index.md delete mode 100644 content/manuals/ai/docker-agent/integrations/a2a.md delete mode 100644 content/manuals/ai/docker-agent/integrations/acp.md delete mode 100644 content/manuals/ai/docker-agent/integrations/mcp.md delete mode 100644 content/manuals/ai/docker-agent/local-models.md delete mode 100644 content/manuals/ai/docker-agent/model-providers.md delete mode 100644 content/manuals/ai/docker-agent/rag.md delete mode 100644 content/manuals/ai/docker-agent/reference/_index.md delete mode 100644 content/manuals/ai/docker-agent/reference/cli.md delete mode 100644 content/manuals/ai/docker-agent/reference/config.md delete mode 100644 content/manuals/ai/docker-agent/reference/examples.md delete mode 100644 content/manuals/ai/docker-agent/reference/toolsets.md delete mode 100644 content/manuals/ai/docker-agent/sharing-agents.md delete mode 100644 content/manuals/ai/docker-agent/tutorial.md diff --git a/.github/workflows/sync-docker-agent-docs.yml b/.github/workflows/sync-docker-agent-docs.yml new file mode 100644 index 0000000000..3f24f332ca --- /dev/null +++ b/.github/workflows/sync-docker-agent-docs.yml @@ -0,0 +1,130 @@ +name: sync-docker-agent-docs + +on: + schedule: + # Run daily at 02:30 UTC, offset from sync-cli-docs + - cron: '30 2 * * *' + workflow_dispatch: + inputs: + version: + description: "(optional) docker-agent version - defaults to the latest release tag" + required: false + default: "" + pull_request: + paths: + - '.github/workflows/sync-docker-agent-docs.yml' + +permissions: + contents: write + pull-requests: write + +env: + BRANCH_NAME: "bot/sync-docker-agent-docs" + MODULE_NAME: "github.com/docker/docker-agent" + +jobs: + sync-docker-agent-docs: + runs-on: ubuntu-24.04 + steps: + - + name: Checkout docs repo + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + with: + fetch-depth: 0 + - + name: Get target version + id: get-version + env: + GH_TOKEN: ${{ github.token }} + run: | + if [ -n "${{ inputs.version }}" ]; then + VERSION="${{ inputs.version }}" + else + VERSION=$(gh release view --repo docker/docker-agent --json tagName --jq .tagName) + fi + CURRENT=$(go list -m -f '{{ .Version }}' "$MODULE_NAME" || true) + + echo "version=$VERSION" >> "$GITHUB_OUTPUT" + echo "current=$CURRENT" >> "$GITHUB_OUTPUT" + echo "docker-agent version: **$VERSION** (currently pinned: **$CURRENT**)" | tee -a "$GITHUB_STEP_SUMMARY" + - + name: Set up Docker Buildx + if: steps.get-version.outputs.version != steps.get-version.outputs.current + uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4 + - + # go mod edit sets the version before plain make vendor: passing + # VENDOR_MODULE would run hugo mod get, which records docker-agent's + # full transitive graph as indirect requires in go.mod. + name: Update vendor + if: steps.get-version.outputs.version != steps.get-version.outputs.current + run: | + go mod edit -require "${MODULE_NAME}@${{ steps.get-version.outputs.version }}" + make vendor + - + name: Detect changes + id: changes + if: steps.get-version.outputs.version != steps.get-version.outputs.current + run: | + if [ -n "$(git status --porcelain)" ]; then + echo "changes=true" >> "$GITHUB_OUTPUT" + echo "Changes detected - syncing Docker Agent docs" >> "$GITHUB_STEP_SUMMARY" + else + echo "changes=false" >> "$GITHUB_OUTPUT" + echo "No changes to sync - Docker Agent docs are up to date" >> "$GITHUB_STEP_SUMMARY" + fi + - + name: Commit changes + if: steps.changes.outputs.changes == 'true' + env: + BRANCH_NAME: ${{ env.BRANCH_NAME }} + VERSION: ${{ steps.get-version.outputs.version }} + run: | + git checkout -b "$BRANCH_NAME" + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add -A + git commit -m "docker-agent: sync docs with docker-agent $VERSION" + - + name: Create or update Pull Request + if: steps.changes.outputs.changes == 'true' && github.event_name != 'pull_request' + env: + GH_TOKEN: ${{ github.token }} + BRANCH_NAME: ${{ env.BRANCH_NAME }} + PR_TITLE: "docker-agent: sync docs with docker-agent ${{ steps.get-version.outputs.version }}" + PR_BODY: | + ## Summary + + Automated sync of Docker Agent documentation from the docker/docker-agent repository. + + **docker-agent version:** ${{ steps.get-version.outputs.version }} + + --- + + > [!IMPORTANT] + > **Reviewer:** Please close and reopen this PR to trigger CI checks. + > See: https://docs.github.com/en/actions/how-tos/write-workflows/choose-when-workflows-run/trigger-a-workflow#triggering-a-workflow-from-a-workflow + run: | + # Check for existing open PR from this branch + EXISTING_PR=$(gh pr list --state open --head "$BRANCH_NAME" --json url --jq ".[0].url // empty") + + if [ -n "$EXISTING_PR" ]; then + echo "Updating existing PR: $EXISTING_PR" >> "$GITHUB_STEP_SUMMARY" + git push -u origin "$BRANCH_NAME" --force + gh pr edit "$EXISTING_PR" --title "$PR_TITLE" --body "$PR_BODY" + else + # Check if a closed PR with the same title already exists + CLOSED_PR=$(gh pr list --state closed --search "$PR_TITLE in:title" --json url --jq ".[0].url // empty") + if [ -n "$CLOSED_PR" ]; then + echo "A closed PR already exists for this version: $CLOSED_PR" >> "$GITHUB_STEP_SUMMARY" + echo "Skipping PR creation." + exit 0 + fi + + echo "Creating new PR" >> "$GITHUB_STEP_SUMMARY" + git push -u origin "$BRANCH_NAME" + gh pr create \ + --title "$PR_TITLE" \ + --body "$PR_BODY" \ + --base main \ + --head "$BRANCH_NAME" + fi diff --git a/_vendor/github.com/docker/docker-agent/docs/community/_index.md b/_vendor/github.com/docker/docker-agent/docs/community/_index.md new file mode 100644 index 0000000000..764483d971 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/community/_index.md @@ -0,0 +1,5 @@ +--- +title: "Community" +description: "Contributing, troubleshooting, and telemetry." +weight: 80 +--- diff --git a/_vendor/github.com/docker/docker-agent/docs/community/contributing/index.md b/_vendor/github.com/docker/docker-agent/docs/community/contributing/index.md new file mode 100644 index 0000000000..3821f3318c --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/community/contributing/index.md @@ -0,0 +1,130 @@ +--- +title: "Contributing" +description: "docker-agent is open source. Here's how to set up your development environment and contribute." +keywords: docker agent, ai agents, community, contributing +weight: 10 +--- + +_docker-agent is open source. Here's how to set up your development environment and contribute._ + +## Development Setup + +### Prerequisites + +- [Go 1.26](https://go.dev/dl/) or higher +- API key(s) for your chosen AI provider +- [Task](https://taskfile.dev/installation/) +- [golangci-lint](https://golangci-lint.run/docs/welcome/install/local/) + +> [!NOTE] +> **Platform Support** +> +> macOS and Linux are fully supported for development. On Windows, use `task build-local` to build via Docker. + +### Build from Source + +```bash +# Clone and build +git clone https://github.com/docker/docker-agent.git +cd docker-agent +task build + +# Set API keys +export OPENAI_API_KEY=your_key_here +export ANTHROPIC_API_KEY=your_key_here + +# Run an example +./bin/docker-agent run examples/code.yaml +``` + +### Development Commands + +| Command | Description | +| ------------------ | ----------------------------------------------- | +| `task build` | Build the binary to `./bin/docker-agent` | +| `task test` | Run all tests (clears API keys for determinism) | +| `task lint` | Run golangci-lint | +| `task format` | Format code | +| `task dev` | Run lint, test, and build in sequence | +| `task build-local` | Build for local platform via Docker | +| `task cross` | Cross-platform builds (all architectures) | + +## Dogfooding + +Use docker-agent to work on docker-agent! The project includes a specialized developer agent: + +```bash +cd docker-agent +docker agent run ./golang_developer.yaml +``` + +This agent is an expert Go developer that understands the docker-agent codebase. Ask it questions, request fixes, or have it implement features. + +## Core Concepts + +- **Root Agent** — Main entry point that coordinates the system +- **Sub-Agents** — Specialized agents for specific domains +- **Tools** — External capabilities via MCP +- **Models** — AI provider configurations + +## Code Style + +The project uses `golangci-lint` with strict rules. As long as `task lint` passes, the code is stylistically acceptable. + +Key conventions: + +- Use `fmt.Errorf("context: %w", err)` for error wrapping +- Always pass `context.Context` as the first parameter +- Use `slog` for structured logging +- Use functional options pattern for constructors +- In tests: use `t.Context()`, `t.TempDir()`, `t.Setenv()`, and `t.Parallel()` + +## Opening Issues + +File issues on the [GitHub issue tracker](https://github.com/docker/docker-agent/issues). Please: + +> [!NOTE] +> **See also** +> +> [Troubleshooting](../troubleshooting/index.md) — Common issues and debug mode. [Telemetry](../telemetry/index.md) — What data is collected and how to opt out. + +- Use the included issue template +- Search for existing issues before creating new ones +- Only use issues for bugs and feature requests (not support) + +## Submitting Pull Requests + +1. **Fork** the repository and create a branch for your changes +2. **Write** your code following the style and testing guidelines above +3. **Test** your changes: run `task lint` and `task test` +4. **Sign** your commits with `git commit -s` (DCO required) +5. **Open a pull request** against the `main` branch + +> [!TIP] +> Use the dogfooding agent (`docker agent run ./golang_developer.yaml`) to help write and review your changes before submitting. + +## Sign Your Work + +All contributions require a Developer Certificate of Origin (DCO) sign-off: + +```bash +# Sign commits automatically +git config user.name "Your Name" +git config user.email "your.email@example.com" +git commit -s -m "Your commit message" +``` + +## Community + +Find us on [Slack](https://dockercommunity.slack.com/archives/C09DASHHRU4) for questions and discussions. + +## Code of Conduct + +We want to keep the docker-agent community welcoming, inclusive, and collaborative. Key guidelines: + +- **Be nice** — Be courteous, respectful, and polite. No abuse of any kind will be tolerated. +- **Encourage diversity** — Make everyone feel welcome regardless of background. +- **Keep it legal** — Share only content you own and don't break the law. +- **Stay on topic** — Post to the correct channel and avoid off-topic discussions. + +The governance for this repository is handled by Docker Inc. diff --git a/_vendor/github.com/docker/docker-agent/docs/community/opentelemetry/index.md b/_vendor/github.com/docker/docker-agent/docs/community/opentelemetry/index.md new file mode 100644 index 0000000000..857c304a0f --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/community/opentelemetry/index.md @@ -0,0 +1,98 @@ +--- +title: "OpenTelemetry Tracing" +description: "Export docker-agent traces to any OTLP backend, including Langfuse and LangSmith, for debugging agentic workflows." +keywords: docker agent, ai agents, community, opentelemetry tracing +weight: 40 +--- + +_docker-agent can export OpenTelemetry traces of an agent run to any OTLP/HTTP backend. This is separate from [product-analytics telemetry](../telemetry/index.md) and is opt-in via the `--otel` flag._ + +When enabled, docker-agent emits OpenTelemetry GenAI (`gen_ai.*`) and MCP (`mcp.*`) spans following the [OpenTelemetry semantic conventions](https://opentelemetry.io/docs/specs/semconv/gen-ai/). Spans cover the agent turn, model calls (with token usage and cost attributes), tool calls, MCP client/server activity, sub-agent hand-offs, and provider fallbacks. W3C `traceparent` context is propagated so the whole run renders as a single connected trace tree. + +## Enabling + +```bash +docker agent run agent.yaml --otel +``` + +Without an exporter endpoint configured, spans are recorded locally as no-ops. To ship them somewhere, set the standard OTLP environment variables described below. + +## Configuration + +docker-agent reads the standard OTLP environment variables: + +| Variable | Purpose | +| --- | --- | +| `OTEL_EXPORTER_OTLP_ENDPOINT` | Base OTLP/HTTP endpoint. The signal subpath (`/v1/traces`, `/v1/metrics`, `/v1/logs`) is appended automatically. | +| `OTEL_EXPORTER_OTLP_HEADERS` | Comma-separated `key=value` headers sent with every export request (for example, an `Authorization` header). | +| `OTEL_RESOURCE_ATTRIBUTES` | Extra resource attributes merged into every span. | +| `OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT` | Set to `true` to capture prompt and response message content as span attributes. Off by default. | + +> [!NOTE] +> **Base endpoint, not the full signal URL** +> +> Set `OTEL_EXPORTER_OTLP_ENDPOINT` to the **base** endpoint (for example `https://cloud.langfuse.com/api/public/otel`). docker-agent appends `/v1/traces` for you, matching the value documented by Langfuse and LangSmith. A bare `host:port` is also accepted and gets `https://` (or `http://` for localhost). + +> [!WARNING] +> **Message content can contain sensitive data** +> +> `OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT` is off by default because chat history routinely contains PII, secrets, and internal documents. Enable it only for backends and environments where exporting that content is acceptable. + +## Backends + +Protocol support is OTLP over HTTP (`http/protobuf`). gRPC endpoints are not currently supported. + +### Langfuse + +[Langfuse](https://langfuse.com) exposes an OTLP endpoint and authenticates with HTTP Basic auth built from a project's public and secret keys. + +```bash +# Base64 of "public_key:secret_key" +LANGFUSE_AUTH=$(echo -n "pk-lf-...:sk-lf-..." | base64) + +export OTEL_EXPORTER_OTLP_ENDPOINT="https://cloud.langfuse.com/api/public/otel" +export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Basic ${LANGFUSE_AUTH}" + +docker agent run agent.yaml --otel +``` + +Regional and self-hosted hosts use the same `/api/public/otel` base path: + +| Region | Endpoint | +| --- | --- | +| EU | `https://cloud.langfuse.com/api/public/otel` | +| US | `https://us.cloud.langfuse.com/api/public/otel` | +| Self-hosted (>= v3.22.0) | `http://localhost:3000/api/public/otel` | + +### LangSmith + +[LangSmith](https://docs.langchain.com/langsmith/trace-with-opentelemetry) authenticates with an `x-api-key` header (the raw API key, with no `Basic`/`Bearer` prefix). An optional `Langsmith-Project` header routes traces to a named project. + +```bash +export OTEL_EXPORTER_OTLP_ENDPOINT="https://api.smith.langchain.com/otel" +export OTEL_EXPORTER_OTLP_HEADERS="x-api-key=,Langsmith-Project=" + +docker agent run agent.yaml --otel +``` + +### OpenTelemetry Collector + +Any OTLP/HTTP collector (the OpenTelemetry Collector, Grafana Alloy, Jaeger, and so on) works by pointing at its base endpoint: + +```bash +export OTEL_EXPORTER_OTLP_ENDPOINT="http://localhost:4318" +docker agent run agent.yaml --otel +``` + +> [!NOTE] +> **Langfuse and LangSmith ingest traces only** +> +> Both backends accept the traces signal only. docker-agent also wires metric and log exporters at the same endpoint, so their periodic exports return `404` against trace-only backends. This is harmless to traces but appears in the debug log. Point a full OTLP collector at the endpoint if you also want metrics and logs. + +## Inspecting traces locally + +Use `--debug` to print telemetry activity to the debug log (`~/.cagent/cagent.debug.log` by default) without standing up a backend: + +```bash +docker agent run agent.yaml --otel --debug +``` diff --git a/_vendor/github.com/docker/docker-agent/docs/community/telemetry/index.md b/_vendor/github.com/docker/docker-agent/docs/community/telemetry/index.md new file mode 100644 index 0000000000..0e097684fe --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/community/telemetry/index.md @@ -0,0 +1,78 @@ +--- +title: "Telemetry" +description: "docker-agent collects anonymous usage data to help improve the tool. Telemetry can be disabled at any time." +keywords: docker agent, ai agents, community, telemetry +weight: 30 +--- + +_docker-agent collects anonymous usage data to help improve the tool. Telemetry can be disabled at any time._ + +On first startup, docker-agent displays a notice about telemetry collection so you're always informed. All events are processed synchronously when recorded. + +## Disabling Telemetry + +```bash +# Disable via environment variable +$ TELEMETRY_ENABLED=false docker agent run agent.yaml + +# Or export it in your shell profile +$ export TELEMETRY_ENABLED=false +``` + +> [!NOTE] +> **Default** +> +> Telemetry is **enabled by default**. Set `TELEMETRY_ENABLED=false` to opt out. + +## What's Collected ✅ + +- Command names and success/failure status +- Agent names and model types +- Tool names and whether calls succeed or fail +- Token counts (input/output totals) and estimated costs +- Session metadata (durations, error counts) + +## What's NOT Collected ❌ + +- User input or prompts +- Agent responses or generated content +- File contents +- API keys or credentials +- Personally identifying information (PII) + +> [!TIP] +> **See events locally** +> +> Use `--debug` to see telemetry events printed to the debug log without sending them anywhere additional. + +```bash +docker agent run agent.yaml --debug +``` + +## Event Types + +The telemetry system uses structured, type-safe events: + +| Event Type | What It Tracks | +| ----------- | ------------------------------------------------------------------- | +| **Command** | CLI command execution with success status | +| **Tool** | Agent tool calls with timing and error information | +| **Token** | LLM token usage by model, session, and cost | +| **Session** | Agent session lifecycle with start/end events and aggregate metrics | + +## For Developers + +Telemetry is automatically wrapped around all commands. To record additional events, use the context-based API: + +```bash +// Recommended: context-based telemetry (clean, testable) +if telemetryClient := telemetry.FromContext(ctx); telemetryClient != nil { + telemetryClient.RecordToolCall(ctx, "filesystem", "session-id", "agentName", time.Millisecond*500, nil) + telemetryClient.RecordTokenUsage(ctx, "gpt-4", 100, 50, 0.01) +} + +// Or use direct calls +telemetry.TrackCommand("run", args) +``` + +Events are processed synchronously when `Track()` is called, sending HTTP requests immediately. diff --git a/_vendor/github.com/docker/docker-agent/docs/community/troubleshooting/index.md b/_vendor/github.com/docker/docker-agent/docs/community/troubleshooting/index.md new file mode 100644 index 0000000000..c100e014c3 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/community/troubleshooting/index.md @@ -0,0 +1,254 @@ +--- +title: "Troubleshooting" +description: "Common issues and how to resolve them when working with docker-agent." +keywords: docker agent, ai agents, community, troubleshooting +weight: 20 +--- + +_Common issues and how to resolve them when working with docker-agent._ + +## Common Errors + +### Context Window Exceeded + +Error message: `context_length_exceeded` or similar. + +- Use `/compact` in the TUI to summarize and reduce conversation history +- Set `num_history_items` in agent config to limit messages sent to the model +- Switch to a model with larger context (Claude Sonnet 4.5 supports 1M tokens, Gemini up to 2M) +- Break large tasks into smaller conversations + +### Max Iterations Reached + +The agent hit its `max_iterations` limit without completing the task. + +- Increase `max_iterations` in agent config (default is unlimited, but many agents set 20-50) +- Check if the agent is stuck in a loop (enable `--debug` to see tool calls) +- Break complex tasks into smaller steps + +### Model Fallback Triggered + +When the primary model fails, docker-agent automatically switches to fallback models. Look for log messages like `"Switching to fallback model"`. + +- **429 errors:** Rate limited — the cooldown period keeps using the fallback +- **5xx errors:** Server issues — retries with exponential backoff first, then falls back +- **4xx errors:** Client errors — skips directly to next model + +Configure fallback behavior in your agent config: + +```yaml +agents: + root: + model: anthropic/claude-sonnet-4-5 + fallback: + models: [openai/gpt-5-mini, openai/gpt-4o-mini] + retries: 2 # retries per model for 5xx errors + cooldown: 1m # how long to stick with fallback after 429 +``` + +## Debug Mode + +The first step for any issue is enabling debug logging. This provides detailed information about what docker-agent is doing internally. + +```bash +# Enable debug logging (writes to ~/.cagent/cagent.debug.log) +$ docker agent run config.yaml --debug + +# Write debug logs to a custom file +$ docker agent run config.yaml --debug --log-file ./debug.log + +# Enable OpenTelemetry tracing for deeper analysis +$ docker agent run config.yaml --otel +``` + +> [!TIP] +> Always enable `--debug` when reporting issues. The log file contains detailed traces of API calls, tool executions, and agent interactions. + +## Agent Not Responding + +### API keys not set + +Each model provider requires its own API key as an environment variable: + +| Provider | Environment Variable | +| ------------- | --------------------------------------------------- | +| OpenAI | `OPENAI_API_KEY` | +| Anthropic | `ANTHROPIC_API_KEY` | +| Google Gemini | `GOOGLE_API_KEY` or `GEMINI_API_KEY` | +| Mistral | `MISTRAL_API_KEY` | +| xAI | `XAI_API_KEY` | +| Nebius | `NEBIUS_API_KEY` | +| MiniMax | `MINIMAX_API_KEY` | +| Requesty | `REQUESTY_API_KEY` | +| OpenRouter | `OPENROUTER_API_KEY` | +| GitHub Copilot | `GITHUB_TOKEN` (PAT with `copilot` scope) | +| Azure OpenAI | `AZURE_API_KEY` (override with `token_key`) | +| AWS Bedrock | `AWS_BEARER_TOKEN_BEDROCK` or AWS credentials chain | + +```bash +# Verify your keys are set +$ env | grep API_KEY +``` + +### Incorrect model name + +Model names must match the provider's naming exactly. Common mistakes: + +- Using a deprecated model name (e.g. `gpt-4` instead of `gpt-5-mini` or `gpt-4o`) +- Model references are case-sensitive: `openai/gpt-5-mini` ≠ `openai/GPT-5-mini` + +### Network connectivity + +If the agent hangs or times out, check that you can reach the provider's API endpoint. Firewalls, VPNs, or proxy settings may block requests. + +## Tool Execution Failures + +### MCP tools not found or failing + +- Ensure the MCP tool command is installed and on your `PATH` +- Check file permissions — tools need to be executable +- Test MCP tools independently before integrating with docker-agent +- For Docker-based MCP tools (`ref: docker:*`), ensure Docker Desktop is running + +### Filesystem / shell tool errors + +- Verify the agent has the correct toolset configured (`type: filesystem`, `type: shell`) +- Check that the working directory exists and is accessible +- On macOS, ensure terminal has the necessary permissions (e.g., Full Disk Access) + +### Tool lifecycle issues + +MCP and LSP toolsets are managed by a supervisor that auto-restarts them when they crash or drop their session. The TUI exposes that supervisor through two slash commands: + +- `/tools` — the unified tools dialog. Its top section lists every toolset with its current state (`Stopped`, `Starting`, `Ready`, `Degraded`, `Restarting`, `Failed`), restart count, and last error; the bottom section lists every tool the agent can call. Start here whenever a tool seems missing or stuck. +- `/toolset-restart ` — force a supervisor-driven reconnect of the named toolset. Useful after completing OAuth, when a remote MCP server has been redeployed, or when a language server like `gopls` is unresponsive. + +Remote MCP servers that return `401 invalid_token` (e.g. because the stored OAuth token was revoked or rotated) are now self-healing: docker-agent silently exchanges the refresh token for a new one when possible, or surfaces an OAuth re-authentication prompt on your next message when refresh is not possible. No more stuck toolsets that require a process restart — but if you want to trigger re-auth immediately, `/toolset-restart ` forces it right away. + +MCP tools using stdio transport must complete the initialization handshake before becoming available. If tools fail silently: + +1. Run `/tools` to see whether the toolset is `Failed` or stuck in `Restarting`, and what the last error was. +2. Enable `--debug` and look for MCP protocol messages in the log +3. Check that the MCP server process starts and responds to `initialize` +4. Verify environment variables required by the tool are set (check `env` and `env_file` in the toolset config) + +> [!NOTE] +> **Startup tool-listing timeout** +> +> At startup, docker-agent queries each toolset for its tool list. If a toolset does not respond within 10 seconds (e.g. a wedged MCP stdio server that never answers `tools/list`), that toolset is skipped with a warning and the remaining toolsets load normally. The sidebar resolves showing whichever tools did load — no infinite spinner. Enable `--debug` to see the warning message, and use `/toolset-restart ` once the server becomes responsive. + +If a toolset keeps crashing in a tight loop, tune the [`lifecycle`](../../configuration/tools/index.md#toolset-lifecycle) block on the toolset (e.g. raise `backoff.initial`, lower `max_restarts`, or switch to the `best-effort` profile) so a flaky dependency does not amplify into a restart storm. + +## Configuration Errors + +### YAML syntax issues + +docker-agent validates config at startup and reports errors with line numbers. Common problems: + +- Incorrect indentation (YAML is whitespace-sensitive) +- Missing quotes around values containing special characters (`:`, `#`, `{`, `}`) +- Using tabs instead of spaces + +### Missing references + +- Local agents in `sub_agents` must be defined in the `agents` section (external OCI references like `agentcatalog/pirate` are resolved from registries automatically) +- Named model references must exist in the `models` section (or use inline format like `openai/gpt-5`) +- RAG source names referenced by agents must be defined in the `rag` section + +### Toolset validation + +- The `path` field is valid for `memory` and `tasks` toolsets, and for the agent-level `cache` block +- MCP toolsets need either `command` (stdio), `remote` (Streamable HTTP/SSE), or `ref` (Docker) +- Provider names must be one of: `openai`, `anthropic`, `google`, `amazon-bedrock`, `dmr`, etc. + +> [!NOTE] +> **Schema Validation** +> +> Use the [JSON schema](https://github.com/docker/docker-agent/blob/main/agent-schema.json) in your editor for real-time config validation and autocompletion. + +## Session & Connectivity Issues + +### Port conflicts + +When running docker-agent as an API server or MCP server, ensure the port is not already in use: + +```bash +# Check if port 8080 is in use +$ lsof -i :8080 + +# Use a different port +$ docker agent serve api config.yaml --listen :9090 +``` + +### MCP endpoint accessibility + +For remote MCP servers, verify the endpoint is reachable: + +```bash +# Test streamable HTTP endpoint +$ curl -v https://mcp-server.example.com/mcp +``` + +### Session isolation + +The API server stores every conversation as a distinct session in the SQLite database (`session.db` by default). Each session is identified by its UUID and only mixes messages when the same session ID is reused. If conversations seem to bleed into each other: + +- Make sure each client creates a fresh session via `POST /api/sessions` (don't reuse session IDs across users). +- Confirm `--session-db` points to the path you expect — a stale database from another run can resurface old sessions. +- Use `GET /api/sessions/:id` to inspect what is actually stored, and `DELETE /api/sessions/:id` to clear sessions you don't want anymore. + +## Performance Issues + +### High memory usage + +- Large context windows (64K+ tokens) consume significant memory — consider reducing `max_tokens` +- Use `num_history_items` in agent config to limit conversation history +- For DMR (local models), tune `runtime_flags` for your hardware (e.g., `--ngl` for GPU layers) + +### Slow responses + +- Check if MCP tools are adding latency (visible in debug logs) +- Use the `/cost` command in TUI to see token usage and identify expensive interactions +- For DMR, consider enabling [speculative decoding](../../providers/dmr/index.md) for faster inference + +### Tool resource leaks + +Monitor for tools that don't clean up properly — check debug logs for MCP server start/stop lifecycle events. Orphaned tool processes can consume system resources. + +## Agent Store Issues + +### Pull / push failures + +```bash +# Test registry connectivity +$ docker pull docker.io/username/agent:latest + +# Verify pulled agent content +$ docker agent share pull docker.io/username/agent:latest +``` + +### Agent content issues + +- Ensure the pushed YAML is valid — run `docker agent run` locally before pushing +- Check that referenced resources (MCP tools, files) are available on the target machine +- For auto-refresh (`--pull-interval`), verify the registry is accessible from the server + +## Log Analysis + +When reviewing debug logs, search for these key patterns: + +| Log Pattern | What It Indicates | +| --------------------------- | ------------------------------------------------------------------------------------------------ | +| `"Starting runtime stream"` | Agent execution beginning | +| `"Tool call"` | A tool is being executed | +| `"Tool call result"` | Tool execution completed | +| `"Stream stopped"` | Agent finished processing | +| `HTTP 429` | Rate limiting — consider adding a [fallback model](../../configuration/agents/index.md) | +| `context canceled` | Operation was interrupted (timeout or user cancel) | +| `[RAG Manager]` | RAG retrieval operations | +| `[Reranker]` | Reranking operations | + +> [!WARNING] +> **Still stuck?** +> +> If these steps don't resolve your issue, file a bug on the [GitHub issue tracker](https://github.com/docker/docker-agent/issues) with your debug log attached, or ask on [Slack](https://dockercommunity.slack.com/archives/C09DASHHRU4). diff --git a/_vendor/github.com/docker/docker-agent/docs/concepts/_index.md b/_vendor/github.com/docker/docker-agent/docs/concepts/_index.md new file mode 100644 index 0000000000..a4a44d0432 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/concepts/_index.md @@ -0,0 +1,5 @@ +--- +title: "Core Concepts" +description: "The core ideas behind Docker Agent: agents, models, tools, and multi-agent teams." +weight: 20 +--- diff --git a/_vendor/github.com/docker/docker-agent/docs/concepts/agents/index.md b/_vendor/github.com/docker/docker-agent/docs/concepts/agents/index.md new file mode 100644 index 0000000000..d4ee993dc0 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/concepts/agents/index.md @@ -0,0 +1,113 @@ +--- +title: "Agents" +description: "Agents are the core building blocks of docker-agent. Each agent is an AI-powered entity with a model, instructions, tools, and optional sub-agents." +keywords: docker agent, ai agents, concepts, agents +weight: 10 +--- + +_Agents are the core building blocks of docker-agent. Each agent is an AI-powered entity with a model, instructions, tools, and optional sub-agents._ + +## What is an Agent? + +An agent in docker-agent is defined by: + +- **Model** — The AI model powering it (e.g., Claude, GPT-5, Gemini). See [Models](../models/index.md). +- **Description** — A brief summary of what the agent does (used by other agents for delegation) +- **Instruction** — The system prompt that defines the agent's behavior and personality +- **Tools** — Capabilities like filesystem access, shell commands, or external APIs +- **Sub-agents** — Other agents it can delegate tasks to + +```yaml +agents: + root: + model: anthropic/claude-sonnet-4-5 + description: Expert software developer + instruction: | + You are an expert developer. Write clean, efficient code + and explain your reasoning step by step. + toolsets: + - type: filesystem + - type: shell + - type: think +``` + +## The Root Agent + +Every docker-agent configuration has a **root agent** — the entry point that receives user messages. In a single-agent setup, this is the only agent. In a multi-agent setup, the root agent acts as a coordinator, delegating tasks to specialized sub-agents. + +> [!NOTE] +> **Naming** +> +> The first agent defined in your YAML (or the one named `root`) is the root agent by default. You can also specify which agent to start with using `docker agent run config.yaml -a agent_name`. + +## Agent Properties + +| Property | Type | Required | Description | +| ---------------------- | ------- | -------- | -------------------------------------------------------------- | +| `model` | string | ✓ | Model reference (inline like `openai/gpt-5` or a named model) | +| `description` | string | ✓ | What the agent does — used by other agents for delegation | +| `instruction` | string | ✓ | System prompt defining behavior | +| `toolsets` | array | ✗ | List of tool configurations | +| `sub_agents` | array | ✗ | Names of agents this agent can delegate to | +| `fallback` | object | ✗ | Fallback model configuration for resilience | +| `add_date` | boolean | ✗ | Include current date in context | +| `add_environment_info` | boolean | ✗ | Include OS, working directory, git info in context | +| `max_iterations` | int | ✗ | Max tool-calling loops (default: unlimited) | +| `commands` | object | ✗ | Named prompts callable via `/command` | +| `skills` | boolean \| list | ✗ | Enable skill discovery and loading. `true` = `["local"]`; list values may combine `"local"` with remote skill-server URLs. | + +## Model Fallbacks + +Agents can automatically fail over to alternative models when the primary model is unavailable: + +```yaml +agents: + root: + model: anthropic/claude-sonnet-4-5 + fallback: + models: + - openai/gpt-5 + - google/gemini-3.5-flash + retries: 2 # retries per model for 5xx errors + cooldown: 1m # stick with fallback after 429 +``` + +## Named Commands + +Define reusable prompts that can be invoked as commands: + +```yaml +agents: + root: + model: openai/gpt-5 + instruction: You are a helpful assistant. + commands: + df: "Check how much free space I have on my disk" + greet: "Say hello to ${env.USER}" +``` + +```bash +# Run a named command +$ docker agent run agent.yaml /df +$ docker agent run agent.yaml /greet +``` + +Commands support environment variable interpolation using JavaScript template literal syntax. Undefined variables expand to empty strings. + +## Default Agent + +Running `docker agent run` without a config file uses a built-in default agent. This is a capable general-purpose agent for quick tasks without needing any configuration. + +```bash +# Use the default agent +$ docker agent run + +# Override the default with an alias +$ docker agent alias add default /path/to/my-agent.yaml +$ docker agent run # now runs your custom agent +``` + +> [!TIP] +> **See also** +> +> For reusable task-specific instructions, see [Skills](../../features/skills/index.md). For multi-agent patterns, see [Multi-Agent](../multi-agent/index.md). For full config reference, see [Agent Config](../../configuration/agents/index.md). diff --git a/_vendor/github.com/docker/docker-agent/docs/concepts/distribution/index.md b/_vendor/github.com/docker/docker-agent/docs/concepts/distribution/index.md new file mode 100644 index 0000000000..dd2b16d0ee --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/concepts/distribution/index.md @@ -0,0 +1,146 @@ +--- +title: "Agent Distribution" +description: "Package, share, and run agents via OCI-compatible registries — just like container images." +keywords: docker agent, ai agents, concepts, agent distribution +weight: 50 +aliases: + - /ai/docker-agent/sharing-agents/ +--- + +_Package, share, and run agents via OCI-compatible registries — just like container images._ + +## Overview + +docker-agent agents can be pushed to any OCI-compatible registry (Docker Hub, GitHub Container Registry, etc.) and pulled/run anywhere. This makes sharing agents as easy as sharing Docker images. + +> [!TIP] +> For CLI commands related to distribution, see [CLI Reference](../../features/cli/index.md) (`docker agent share push`, `docker agent share pull`, `docker agent alias`). + +## Pushing Agents + +```bash +# Push to Docker Hub +$ docker agent share push ./agent.yaml docker.io/username/my-agent:latest + +# Push to GitHub Container Registry +$ docker agent share push ./agent.yaml ghcr.io/username/my-agent:v1.0 +``` + +## Pulling Agents + +```bash +# Pull an agent +$ docker agent share pull docker.io/username/my-agent:latest + +# Pull from the agent catalog +$ docker agent share pull agentcatalog/pirate +``` + +## Running from a Registry + +Run agents directly from a registry without pulling first: + +```bash +# Run directly from Docker Hub +$ docker agent run docker.io/username/my-agent:latest + +# Run from the agent catalog +$ docker agent run agentcatalog/pirate + +# Run with a specific agent from a multi-agent config +$ docker agent run docker.io/username/dev-team:latest -a developer +``` + +## Agent Catalog + +The `agentcatalog` namespace on Docker Hub hosts pre-built agents you can try: + +```bash +# Try the pirate-themed assistant +$ docker agent run agentcatalog/pirate + +# Try the coding agent +$ docker agent run agentcatalog/coder +``` + +## Using as Sub-Agents + +Registry agents can be used directly as sub-agents in a multi-agent configuration — no need to define them locally: + +```yaml +agents: + root: + model: openai/gpt-5 + description: Coordinator + instruction: Delegate tasks to the right sub-agent. + sub_agents: + - agentcatalog/pirate # auto-named "pirate" + - my_reviewer:myorg/reviewer # explicitly named "my_reviewer" +``` + +External sub-agents are automatically named after their last path segment. Use the `name:reference` syntax to give them a custom name. + +Tag references are checked against the registry on every `docker agent run`, which adds a network round-trip per sub-agent at startup. Pin them to a digest (`agentcatalog/pirate@sha256:…`) to serve them from cache instead. + +See [Pin external sub-agents to a digest](../multi-agent/index.md#pin-external-sub-agents-to-a-digest) and [External Sub-Agents](../multi-agent/index.md#external-sub-agents-from-registries) for details. + +## Using with Aliases + +Combine OCI references with aliases for convenient access: + +```bash +# Create an alias for a registry agent +$ docker agent alias add coder agentcatalog/coder --yolo + +# Now just run +$ docker agent run coder +``` + +## Using with API Server + +The API server supports OCI references with auto-refresh: + +```bash +# Start API from registry, auto-pull every 10 minutes +$ docker agent serve api docker.io/username/agent:latest --pull-interval 10 +``` + +## Private Repositories + +docker-agent supports pulling from private GitHub repositories and registries that require authentication. Use standard Docker login or GitHub authentication: + +```bash +# Login to a registry +$ docker login docker.io + +# Now push/pull works with private repos +$ docker agent share push ./agent.yaml docker.io/myorg/private-agent:latest +$ docker agent run docker.io/myorg/private-agent:latest +``` + +> [!NOTE] +> **Docker Desktop credentials** +> +> When pulling or running an agent from a `docker.com` or `*.docker.com` HTTPS URL (e.g. `desktop.docker.com`), docker-agent automatically forwards your Docker Desktop JWT for authentication — no explicit login required when Docker Desktop is running and signed in. +> +> Note: `docker.io` (the standard Docker Hub registry domain) is a separate domain and is **not** covered by automatic JWT forwarding. Agents pulled from `docker.io` or `registry-1.docker.io` still require `docker login docker.io` for private repositories. + +> [!NOTE] +> **Troubleshooting** +> +> Having issues with push/pull? See [Troubleshooting](../../community/troubleshooting/index.md) for common registry issues. + +## Local Development + +For local development and testing, you can run an agent directly from a local HTTP server without a registry: + +```bash +# Serve an agent config locally +$ python3 -m http.server 8080 + +# Run it directly via HTTP +$ docker agent run http://localhost:8080/agent.yaml +$ docker agent run http://127.0.0.1:8080/agent.yaml +``` + +This is useful for iterating on agent configs served from a local dev server before pushing to a registry. Both `localhost` and `127.0.0.1` addresses are supported with plain `http://` URLs. diff --git a/_vendor/github.com/docker/docker-agent/docs/concepts/models/index.md b/_vendor/github.com/docker/docker-agent/docs/concepts/models/index.md new file mode 100644 index 0000000000..85fb247253 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/concepts/models/index.md @@ -0,0 +1,160 @@ +--- +title: "Models" +description: "Models are the AI brains behind your agents. docker-agent supports multiple providers and flexible configuration." +keywords: docker agent, ai agents, concepts, models +weight: 20 +--- + +_Models are the AI brains behind your agents. docker-agent supports multiple providers and flexible configuration._ + +## Inline vs. Named Models + +There are two ways to assign a model to an agent: + +### Inline (Quick) + +Use the `provider/model` shorthand directly in the agent definition: + +```yaml +agents: + root: + model: openai/gpt-5 + instruction: You are a helpful assistant. +``` + +### Named (Full Control) + +Define models in a `models` section and reference them by name: + +```yaml +models: + claude: + provider: anthropic + model: claude-sonnet-4-5 + max_tokens: 64000 + temperature: 0.7 + +agents: + root: + model: claude + instruction: You are a helpful assistant. +``` + +Named models let you configure temperature, token limits, thinking budgets, and other parameters. They're also reusable across multiple agents. + +## First Available Models + +A named model can also select the first usable model from a priority list. This +is useful for shared configs that should prefer paid cloud models when their API +keys are present, but still work with a local fallback: + +```yaml +models: + smart: + first_available: + - anthropic/claude-sonnet-4-5 + - openai/gpt-5 + - dmr/ai/qwen3 + +agents: + root: + model: smart + instruction: You are a helpful assistant. +``` + +At load time, docker-agent selects the first candidate whose credentials are +configured. You only need credentials for one candidate. See +[Model Configuration](../../configuration/models/index.md#first-available-models) +for details. + +## Supported Providers + +| Provider | Key | Example Models | API Key Env Var | +| ------------------- | ---------------- | ------------------------------------ | ----------------------------------- | +| OpenAI | `openai` | gpt-5, gpt-5-mini, gpt-4o | `OPENAI_API_KEY` | +| Anthropic | `anthropic` | claude-sonnet-4-5, claude-opus-4-7 | `ANTHROPIC_API_KEY` | +| Google | `google` | gemini-3.5-flash, gemini-3-pro | `GOOGLE_API_KEY` / `GEMINI_API_KEY` | +| AWS Bedrock | `amazon-bedrock` | Claude, Nova, Llama models | AWS credentials | +| Docker Model Runner | `dmr` | ai/qwen3, ai/llama3.2 | None (local) | +| Mistral | `mistral` | Mistral models | `MISTRAL_API_KEY` | +| xAI | `xai` | Grok models | `XAI_API_KEY` | +| Nebius | `nebius` | Open-source and specialised models | `NEBIUS_API_KEY` | +| MiniMax | `minimax` | MiniMax models | `MINIMAX_API_KEY` | +| Baseten | `baseten` | DeepSeek, Kimi, GLM, Llama models | `BASETEN_API_KEY` | +| OVHcloud | `ovhcloud` | Qwen, Llama, Mistral, DeepSeek (EU-hosted) | `OVH_AI_ENDPOINTS_ACCESS_TOKEN` | +| Groq | `groq` | Llama, Qwen, GPT-OSS (fast inference) | `GROQ_API_KEY` | +| Fireworks AI | `fireworks` | Kimi, Llama, Qwen, DeepSeek, GLM (open models) | `FIREWORKS_API_KEY` | +| DeepSeek | `deepseek` | DeepSeek-V3 chat and R1 reasoner | `DEEPSEEK_API_KEY` | +| Cerebras | `cerebras` | GPT-OSS, GLM (fast inference) | `CEREBRAS_API_KEY` | +| Together AI | `together` | Llama, Qwen, DeepSeek, Kimi (open models) | `TOGETHER_API_KEY` | +| Hugging Face | `huggingface` | Llama, Qwen, DeepSeek, GLM (open models) | `HF_TOKEN` | +| Cloudflare Workers AI | `cloudflare-workers-ai` | Llama, Mistral, Qwen, Gemma (edge-hosted open models) | `CLOUDFLARE_API_TOKEN` + `CLOUDFLARE_ACCOUNT_ID` | +| Moonshot AI | `moonshot` | Kimi K2 chat, reasoning, and coding models | `MOONSHOT_API_KEY` | +| Vercel AI Gateway | `vercel` | Multi-provider gateway | `AI_GATEWAY_API_KEY` | +| Cloudflare AI Gateway | `cloudflare-ai-gateway` | Multi-provider gateway | `CLOUDFLARE_API_TOKEN` + `CLOUDFLARE_ACCOUNT_ID` + `CLOUDFLARE_GATEWAY_ID` | +| Requesty | `requesty` | Multi-provider gateway | `REQUESTY_API_KEY` | +| OpenRouter | `openrouter` | Multi-provider gateway | `OPENROUTER_API_KEY` | +| Azure OpenAI | `azure` | gpt-4o, gpt-5 on Azure | `AZURE_API_KEY` + `base_url` | +| Ollama | `ollama` | Any local Ollama model | None (local; optional `base_url`) | +| GitHub Copilot | `github-copilot` | Copilot-hosted OpenAI/Anthropic | `GITHUB_TOKEN` (PAT with `copilot`) | + +See the [Model Providers](../../providers/overview/index.md) section for detailed configuration guides. + +## Model Properties + +| Property | Type | Description | +| ------------------- | ---------- | ------------------------------------------------- | +| `provider` | string | Provider identifier (required) | +| `model` | string | Model name (required) | +| `temperature` | float | Randomness: 0.0 (deterministic) to 1.0 (creative) | +| `max_tokens` | int | Maximum response length | +| `top_p` | float | Nucleus sampling: 0.0 to 1.0 | +| `frequency_penalty` | float | Reduce repetition: 0.0 to 2.0 | +| `presence_penalty` | float | Encourage topic diversity: 0.0 to 2.0 | +| `base_url` | string | Custom API endpoint | +| `thinking_budget` | string/int | Reasoning effort configuration | +| `task_budget` | int/object | Total token budget for an agentic task (Anthropic; honored by Opus 4.7 today) | +| `provider_opts` | object | Provider-specific options | + +## Reasoning / Thinking Budget + +Control how much the model "thinks" before responding: + +| Provider | Format | Values | Default | +| ---------- | ---------- | ------------------------------------------------------------------- | -------------------------------- | +| OpenAI | string | `minimal`, `low`, `medium`, `high`, `xhigh` | `medium` (always-reasoning models only) | +| Anthropic | int or str | 1024–32768 tokens, or `adaptive`, `adaptive/`, effort level | off | +| Gemini 2.5 | int | 0 (off), -1 (dynamic), or token count | -1 (dynamic) | +| Gemini 3 | string | `minimal`, `low`, `medium`, `high` | varies | +| All | string/int | `none` or `0` to disable | — | + +```yaml +models: + deep-thinker: + provider: anthropic + model: claude-sonnet-4-5 + thinking_budget: 16384 + + fast-responder: + provider: openai + model: gpt-5 + thinking_budget: none # disable thinking +``` + +> [!NOTE] +> **Multi-provider teams** +> +> Different agents can use different providers in the same config. See [Multi-Agent](../multi-agent/index.md) for patterns. + +## Alloy Models + +"Alloy models" let you use more than one model in the same conversation — docker-agent alternates between them to leverage the strengths of each: + +```yaml +agents: + root: + model: anthropic/claude-sonnet-4-5,openai/gpt-5 + instruction: You are a helpful assistant. +``` + +Read more about the alloy model concept at [xbow.com/blog/alloy-agents](https://xbow.com/blog/alloy-agents). diff --git a/_vendor/github.com/docker/docker-agent/docs/concepts/multi-agent/index.md b/_vendor/github.com/docker/docker-agent/docs/concepts/multi-agent/index.md new file mode 100644 index 0000000000..3075faa658 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/concepts/multi-agent/index.md @@ -0,0 +1,420 @@ +--- +title: "Multi-Agent Systems" +description: "Build teams of specialized agents that collaborate and delegate tasks to each other." +keywords: docker agent, ai agents, concepts, multi-agent systems +linkTitle: "Multi-Agent" +weight: 40 +--- + +_Build teams of specialized agents that collaborate and delegate tasks to each other._ + +## Why Multi-Agent? + +Complex tasks benefit from specialization. Instead of one monolithic agent trying to do everything, you can create a **team** of focused agents: + +- A **coordinator** that understands the overall goal and delegates +- A **developer** that writes code with filesystem and shell access +- A **reviewer** that checks code quality +- A **researcher** that searches the web for information + +Each agent has its own model, tools, and instructions — optimized for its specific role. + +## Two Patterns: Delegation vs. Handoffs + +Docker Agent supports two multi-agent patterns: + +| | **Delegation** (`sub_agents`) | **Handoffs** (`handoffs`) | +|---|---|---| +| **Topology** | Hierarchical (parent → child → parent) | Peer-to-peer graph (A → B → C → A) | +| **Session** | Child runs in a **sub-session** | Conversation stays in the **same session** | +| **Context** | Child gets a clean task description | Next agent sees the **full conversation history** | +| **Control flow** | Parent blocks until child finishes, then continues | Active agent switches — previous agent is no longer in the loop | +| **Tool** | `transfer_task` | `handoff` | +| **Best for** | Task delegation to specialists | Pipeline workflows, conversational routing | + +You can combine both patterns in the same configuration — an agent can have both `sub_agents` and `handoffs`. + +> [!TIP] +> **When to use which** +> +> **`sub_agents`** — Use when a coordinator needs to send tasks to specialists and synthesize their results. +> +> **`handoffs`** — Use when agents should take turns processing the same conversation (pipelines, routing). +> +> **`background_agents`** — Use when multiple independent tasks can run simultaneously. + +## Delegation with `sub_agents` + +Agents delegate tasks using the built-in `transfer_task` tool, which is automatically available to any agent with `sub_agents`. The parent agent sends a task to a child agent, waits for the result, and then continues. + +1. **User** sends a message to the root agent +2. **Root agent** analyzes the request and decides which sub-agent should handle it +3. **Root agent** calls `transfer_task` with the target agent, task description, and expected output +4. **Sub-agent** processes the task in its own agentic loop using its tools +5. **Results** flow back to the root agent, which responds to the user + +```bash +# The transfer_task tool call looks like: +transfer_task( + agent="developer", + task="Create a REST API endpoint for user authentication", + expected_output="Working Go code with tests" +) +``` + +> [!NOTE] +> **Auto-Approved** +> +> Unlike other tools, `transfer_task` is always auto-approved — no user confirmation needed. This allows seamless delegation between agents. + +## Handoffs Routing + +Handoffs are a peer-to-peer routing pattern where agents **hand off the entire conversation** to another agent. Unlike delegation, there is no sub-session — the conversation stays in a single session and the active agent simply switches. + +This pattern is ideal for: + +- **Pipeline workflows** — data flows through a chain of specialized agents +- **Conversational routing** — a coordinator routes the user to the right specialist, who can route back when done +- **Graph topologies** — agents can form cycles (A → B → C → A), enabling iterative workflows + +### How It Works + +1. **User** sends a message to the starting agent +2. **Agent A** processes the message, then calls `handoff` to route to **Agent B** +3. **Agent B** becomes the active agent and sees the **full conversation history** +4. **Agent B** can respond, use its own tools, or hand off to another agent +5. This continues until an agent responds directly without handing off + +```bash +# The handoff tool call looks like: +handoff( + agent="summarizer" +) +``` + +> [!NOTE] +> **Scoped Handoff Targets** +> +> Each agent can only hand off to agents listed in its own `handoffs` array. The `handoff` tool is automatically injected — you don't need to add it manually. + +### Example + +A coordinator routes to a researcher, who hands off to a summarizer, who returns to the coordinator: + +```text +Root ──→ Researcher ──→ Summarizer ──→ Root +``` + +```yaml +agents: + root: + model: anthropic/claude-sonnet-4-5 + description: Coordinator that routes queries + instruction: | + Route research queries to the researcher. + handoffs: + - researcher + + researcher: + model: openai/gpt-5 + description: Web researcher + instruction: | + Search the web, then hand off to the summarizer. + toolsets: + - type: mcp + ref: docker:duckduckgo + handoffs: + - summarizer + + summarizer: + model: openai/gpt-5 + description: Summarizes findings + instruction: | + Summarize the research results, then hand off + back to root. + handoffs: + - root +``` + +> [!TIP] +> **Full pipeline example** +> +> For a more complex handoff graph with branching and multiple processing stages, see [`examples/handoff.yaml`](https://github.com/docker/docker-agent/blob/main/examples/handoff.yaml). + +### Forced Handoffs + +With `handoffs`, the **model decides** whether to call the `handoff` tool — which means it can forget to, breaking pipelines that depend on a strict order. `force_handoff` removes that uncertainty: whenever the agent produces a final response, the **runtime itself** routes the conversation to the named agent, bypassing the LLM's tool-calling entirely. The full conversation context carries over. + +```yaml +agents: + root: + model: anthropic/claude-sonnet-4-5 + description: Extracts key facts from the input + instruction: | + Extract the key facts from the user's input as a bullet list. + force_handoff: summarizer + + summarizer: + model: anthropic/claude-sonnet-4-5 + description: Produces the final summary + instruction: | + Summarize the extracted facts for the user. +``` + +Rules enforced at config load time: + +- The target must be an agent defined in the config (or an external reference) +- An agent cannot `force_handoff` to itself +- Chains of `force_handoff` edges must not form a cycle (A → B → A is rejected) + +See [`examples/force_handoff.yaml`](https://github.com/docker/docker-agent/blob/main/examples/force_handoff.yaml) for a runnable example. + +## Parallel Delegation with Background Agents + +`transfer_task` is **sequential** — the coordinator waits for the sub-agent to finish before continuing. When you need to fan out work to multiple agents at the same time, use the `background_agents` toolset instead. + +Add it to your coordinator's toolsets: + +```yaml +agents: + root: + model: anthropic/claude-sonnet-4-5 + description: Research coordinator + sub_agents: [researcher, analyst, writer] + toolsets: + - type: think + - type: background_agents +``` + +The coordinator can then: + +1. **Dispatch** several tasks at once with `run_background_agent` — each returns a task ID immediately +2. **Monitor** progress with `list_background_agents` or `view_background_agent` +3. **Collect** results once tasks complete +4. **Cancel** tasks that are no longer needed with `stop_background_agent` + +```bash +# Start two tasks in parallel +run_background_agent(agent="researcher", task="Find recent papers on LLM agents") +run_background_agent(agent="analyst", task="Analyze our current architecture") + +# Check on all tasks +list_background_agents() + +# Read results when ready +view_background_agent(task_id="agent_task_abc123") +``` + +## External Sub-Agents from Registries + +Sub-agents don't have to be defined locally — you can reference agents from OCI registries (such as the [Docker Agent Catalog](https://hub.docker.com/u/agentcatalog)) directly in your `sub_agents` list. This lets you compose teams using pre-built, shared agents without duplicating their configuration. + +```yaml +agents: + root: + model: openai/gpt-5 + description: Coordinator that delegates to local and catalog sub-agents + instruction: | + Delegate tasks to the most appropriate sub-agent. + sub_agents: + - local_helper + - agentcatalog/pirate # pulled from registry automatically + + local_helper: + model: openai/gpt-5 + description: A local helper agent for simple tasks + instruction: You are a helpful assistant. +``` + +External sub-agents are automatically named after their last path segment — for example, `agentcatalog/pirate` becomes `pirate`. You can also give them an explicit name using the `name:reference` syntax: + +```yaml + sub_agents: + - my_pirate:agentcatalog/pirate # available as "my_pirate" + - reviewer:docker.io/myorg/review-agent:latest +``` + +### Pin external sub-agents to a digest + +External references use a tag by default: `agentcatalog/pirate` is shorthand for `agentcatalog/pirate:latest`. Tag references are re-resolved against the registry on **every** `docker agent run`: each unpinned external sub-agent triggers a digest lookup at startup, even when that sub-agent is never invoked in the session. On a healthy connection this typically adds a second or two per reference (it depends on your network and registry), and it is one of the paths that can stall if the registry or credential helper misbehaves. + +Pinning a reference to an immutable digest (`@sha256:…`) makes the runtime serve it straight from the local cache with no network round-trip, so startup stays fast and your team is fully reproducible: + +```yaml + sub_agents: + - reviewer:docker.io/myorg/review-agent@sha256:44117e73263afa5c861bdf3730dae7925918ffdd146827eee5bcff20bc55e8fa +``` + +Copy the digest from your registry (Docker Hub shows it next to the tag) or read it with a standard OCI tool such as `docker buildx imagetools inspect `. Docker Agent logs a startup warning for any external OCI reference that still uses a tag instead of a digest. + +External references in `handoffs` and `force_handoff` carry the same per-run cost, so pin those to a digest too. + +> [!TIP] +> External sub-agents work with any OCI-compatible registry, not just the Docker Agent Catalog. See [Agent Distribution](../distribution/index.md) for more on registry references. +> +> See [`examples/sub-agents-from-catalog.yaml`](https://github.com/docker/docker-agent/blob/main/examples/sub-agents-from-catalog.yaml) for a complete example mixing local and catalog sub-agents. + +## Harness-Backed Sub-Agents + +Sub-agents can be backed by external coding CLIs — Claude Code, Codex, opencode, or pi — instead of a model API. Add a `harness:` block in place of a `model:` field to create a harness sub-agent: + +```yaml +agents: + root: + model: anthropic/claude-sonnet-4-5 + description: Orchestrator that plans and delegates + instruction: | + Break down coding tasks and delegate to the coding agents. + sub_agents: + - claude-coder + - codex-coder + + claude-coder: + description: Claude Code specialist + harness: + type: claude-code + effort: high + + codex-coder: + description: Codex specialist + harness: + type: codex +``` + +The orchestrator uses `transfer_task` to send work to a harness sub-agent just like any other sub-agent. Docker Agent handles the orchestration and hooks; the external CLI drives the coding loop. + +> [!TIP] +> **Learn more** +> +> See [Coding Harnesses](../../features/harnesses/index.md) for the full field reference, parallel dispatch patterns, and what does not work inside harness agents. + +## Example: Development Team + +```yaml +agents: + root: + model: anthropic/claude-sonnet-4-5 + description: Technical lead coordinating development + instruction: | + You are a technical lead managing a development team. + Analyze requests and delegate to the right specialist. + Ensure quality by reviewing results before responding. + sub_agents: [developer, reviewer, tester] + toolsets: + - type: think + + developer: + model: anthropic/claude-sonnet-4-5 + description: Expert software developer + instruction: | + You are an expert developer. Write clean, efficient code + and follow best practices. + toolsets: + - type: filesystem + - type: shell + - type: think + + reviewer: + model: openai/gpt-5 + description: Code review specialist + instruction: | + You review code for quality, security, and maintainability. + Provide actionable feedback. + toolsets: + - type: filesystem + + tester: + model: openai/gpt-5 + description: Quality assurance engineer + instruction: | + You write tests and ensure software quality. Run tests + and report results. + toolsets: + - type: shell + - type: todo +``` + +## Example: Research Team + +```yaml +agents: + root: + model: anthropic/claude-sonnet-4-5 + description: Research coordinator + instruction: | + Coordinate research tasks. Delegate web searches to + the researcher and writing to the writer. + sub_agents: [researcher, writer] + toolsets: + - type: think + + researcher: + model: openai/gpt-5 + description: Web researcher + instruction: Search the web and gather information. + toolsets: + - type: mcp + ref: docker:duckduckgo + - type: memory + path: ./research.db + + writer: + model: anthropic/claude-sonnet-4-5 + description: Content writer + instruction: Write clear, well-structured content. + toolsets: + - type: filesystem +``` + +## Multi-Model Teams + +A key advantage of multi-agent systems is using different models for different roles — picking the best model for each job: + +```yaml +models: + fast: + provider: openai + model: gpt-5-mini + temperature: 0.2 # precise + + creative: + provider: openai + model: gpt-5 + temperature: 0.8 # creative + + local: + provider: dmr + model: ai/qwen3 # runs locally, no API cost + +agents: + analyst: + model: fast # cheap and fast for analysis + writer: + model: creative # creative for content + helper: + model: local # free for simple tasks +``` + +## Shared Tools + +Tools like `todo` can be shared between agents for collaborative task tracking: + +```yaml +toolsets: + - type: todo + shared: true # all agents see the same todo list +``` + +## Best Practices + +- **Keep agents focused** — Each agent should have a clear, narrow role +- **Write clear descriptions** — The coordinator uses descriptions to decide who to delegate to +- **Give minimal tools** — Only give each agent the tools it needs for its specific role +- **Use the think tool when needed** — For models without native reasoning, give coordinators the think tool so they reason about delegation. Models with built-in thinking (e.g., via `thinking_budget`) don't need it +- **Use the right model** — Use capable models for complex reasoning, cheap models for simple tasks +- **Choose the right pattern** — Use `sub_agents` for hierarchical task delegation, `handoffs` for pipeline workflows and conversational routing + +> [!NOTE] +> **Beyond Docker Agent** +> +> For interoperability with other agent frameworks, Docker Agent supports the [A2A protocol](../../features/a2a/index.md) and can expose agents via [MCP Mode](../../features/mcp-mode/index.md). diff --git a/_vendor/github.com/docker/docker-agent/docs/concepts/tools/index.md b/_vendor/github.com/docker/docker-agent/docs/concepts/tools/index.md new file mode 100644 index 0000000000..117b28d803 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/concepts/tools/index.md @@ -0,0 +1,70 @@ +--- +title: "Tools" +description: "Tools give agents the ability to interact with the world — read files, run commands, search the web, query databases, and more." +keywords: docker agent, ai agents, concepts, tools +weight: 30 +--- + +_Tools give agents the ability to interact with the world — read files, run commands, search the web, query databases, and more._ + +## How Tools Work + +When an agent needs to perform an action, it makes a **tool call**. The docker-agent runtime executes the tool and returns the result to the agent, which can then use it to continue its work. + +1. Agent receives a user message +2. Agent decides it needs to use a tool (e.g., read a file) +3. docker-agent executes the tool and returns the result +4. Agent incorporates the result and responds + +> [!NOTE] +> **Tool Confirmation** +> +> By default, docker-agent asks for user confirmation before executing tools that have side effects (shell commands, file writes). Use `--yolo` to auto-approve all tool calls. + +## Built-in Tools + +docker-agent ships with several built-in tools that require no external dependencies. Each is enabled by adding its `type` to the agent's `toolsets` list: + +| Tool | Description | +| --- | --- | +| [Filesystem](../../tools/filesystem/index.md) | Read, write, list, search, and navigate files and directories | +| [Shell](../../tools/shell/index.md) | Execute synchronous and background shell commands | +| [Think](../../tools/think/index.md) | Step-by-step reasoning scratchpad for planning and decision-making | +| [Todo](../../tools/todo/index.md) | Task list management for complex multi-step workflows | +| [Tasks](../../tools/tasks/index.md) | Persistent task database shared across sessions | +| [Memory](../../tools/memory/index.md) | Persistent key-value storage backed by SQLite | +| [Fetch](../../tools/fetch/index.md) | Read content from HTTP/HTTPS URLs (GET only) | +| [Script](../../tools/script/index.md) | Define custom shell scripts as named tools | +| [LSP](../../tools/lsp/index.md) | Connect to Language Server Protocol servers for code intelligence | +| [API](../../tools/api/index.md) | Create custom tools that call HTTP APIs without writing code | +| [OpenAPI](../../tools/openapi/index.md) | Generate tools from an OpenAPI 3.x document | +| [RAG](../../tools/rag/index.md) | Retrieval-augmented generation over indexed sources | +| [Model Picker](../../tools/model-picker/index.md) | Let the agent pick between several models per turn | +| [User Prompt](../../tools/user-prompt/index.md) | Ask users questions and collect interactive input | +| [Open URL](../../tools/open-url/index.md) | Open a fixed URL in the user's default browser | +| [Transfer Task](../../tools/transfer-task/index.md) | Delegate tasks to sub-agents (auto-enabled with `sub_agents`) | +| [Background Agents](../../tools/background-agents/index.md) | Dispatch work to sub-agents concurrently | +| [Handoff](../../tools/handoff/index.md) | Hand the conversation off to another local agent in the same config (auto-enabled with `handoffs:`) | +| [A2A](../../tools/a2a/index.md) | Connect to remote agents via the Agent-to-Agent protocol | +| [MCP Catalog](../../tools/mcp-catalog/index.md) | Discover and activate remote MCP servers from the Docker MCP Catalog on demand | + +## MCP Tools + +docker-agent supports the [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) for extending agents with external tools. There are three ways to connect MCP tools: + +- **Docker MCP** (recommended) — Run MCP servers in Docker containers via the [MCP Gateway](https://github.com/docker/mcp-gateway). Browse the [Docker MCP Catalog](https://hub.docker.com/search?q=&type=mcp). +- **Local MCP (stdio)** — Run MCP servers as local processes communicating over stdin/stdout. +- **Remote MCP (Streamable HTTP / SSE)** — Connect to MCP servers running on a network. See [Remote MCP Servers](../../features/remote-mcp/index.md). + +```yaml +toolsets: + - type: mcp + ref: docker:duckduckgo +``` + +See [Tool Config](../../configuration/tools/index.md#mcp-tools) for full MCP configuration reference. + +> [!TIP] +> **See also** +> +> For full configuration reference, see [Tool Config](../../configuration/tools/index.md). diff --git a/_vendor/github.com/docker/docker-agent/docs/configuration/_index.md b/_vendor/github.com/docker/docker-agent/docs/configuration/_index.md new file mode 100644 index 0000000000..7b70d5fcfd --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/configuration/_index.md @@ -0,0 +1,5 @@ +--- +title: "Configuration" +description: "Complete reference for configuring agents in YAML or HCL." +weight: 30 +--- diff --git a/_vendor/github.com/docker/docker-agent/docs/configuration/agents/index.md b/_vendor/github.com/docker/docker-agent/docs/configuration/agents/index.md new file mode 100644 index 0000000000..f5550c0820 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/configuration/agents/index.md @@ -0,0 +1,552 @@ +--- +title: "Agent Configuration" +description: "Complete reference for defining agents in your YAML configuration." +keywords: docker agent, ai agents, configuration, yaml, agent configuration +linkTitle: "Agent Config" +weight: 30 +--- + +_Complete reference for defining agents in your YAML configuration._ + +## Full Schema + + +```yaml +agents: + agent_name: + model: string # Required: model reference + description: string # Required: what this agent does + instruction: string # Required (unless instruction_file): system prompt + instruction_file: string | [list] # Optional: load the system prompt from one or more files relative to this config (mutually exclusive with instruction) + sub_agents: [list] # Optional: local or external sub-agent references + toolsets: [list] # Optional: tool configurations (use `type: rag` for RAG sources) + fallback: # Optional: fallback config + models: [list] + retries: 2 + cooldown: 1m + add_date: boolean # Optional: add date to context + add_environment_info: boolean # Optional: add env info to context + add_prompt_files: [list] # Optional: include additional prompt files + add_description_parameter: bool # Optional: add description to tool schema + redact_secrets: boolean # Optional: scrub detected secrets out of tool args, outgoing chat messages, and tool output + code_mode_tools: boolean # Optional: enable code mode tool format + max_iterations: int # Optional: max tool-calling loops + max_consecutive_tool_calls: int # Optional: max identical consecutive tool calls + max_old_tool_call_tokens: int # Optional: token budget for old tool call content (disabled unless positive) + num_history_items: int # Optional: limit conversation history + use_toolsets: [list] # Optional: names of top-level toolsets to merge into this agent + readonly: boolean # Optional: restrict all toolsets to read-only tools only + skills: boolean | [list] # Optional: enable skill discovery (true/false or list of names and/or sources) + use_commands: [list] # Optional: names of top-level commands groups to merge into this agent + use_skills: [list] # Optional: names of top-level skills groups to merge into this agent + commands: # Optional: named prompts + name: "prompt text" # or {instruction: "prompt", agent: "sub_agent_name"} or {url: "https://..."} (TUI only) + welcome_message: string # Optional: message shown at session start + handoffs: [list] # Optional: agent names this agent can hand off to + force_handoff: string # Optional: agent that always receives the conversation when this agent stops + hooks: # Optional: lifecycle hooks + pre_tool_use: [list] + tool_response_transform: [list] + post_tool_use: [list] + session_start: [list] + session_end: [list] + on_user_input: [list] + stop: [list] + notification: [list] + structured_output: # Optional: constrain output format + name: string + schema: object + cache: # Optional: response cache (skip the model on repeat questions) + enabled: boolean + case_sensitive: boolean + trim_spaces: boolean + path: string + harness: # Optional: delegate to an external coding CLI (Claude Code, Codex, opencode, pi) + type: string # Required: claude-code | codex | opencode | pi + model: string # Optional: model override forwarded to the CLI + effort: string # claude-code only: low | medium | high | max + agent: string # opencode only: agent profile name + thinking: boolean # opencode only: enable extended thinking +``` + +> [!TIP] +> **See also** +> +> For model parameters, see [Model Config](../models/index.md). For tool details, see [Tool Config](../tools/index.md). For multi-agent patterns, see [Multi-Agent](../../concepts/multi-agent/index.md). + +## Properties Reference + +| Property | Type | Required | Description | +| --------------------------- | ------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `model` | string | ✓ | Model reference. Either inline (`openai/gpt-5`) or a named model from the `models` section. | +| `description` | string | ✓ | Brief description of the agent's purpose. Used by coordinators to decide delegation. | +| `instruction` | string | ✓ | System prompt that defines the agent's behavior, personality, and constraints. Required unless `instruction_file` is set. | +| `instruction_file` | string \| array | ✗ | Path(s) to a file or files (relative to the config file's directory) whose contents become the agent's instruction, loaded at startup. Accepts a single path or a list; multiple files are concatenated in order, separated by a blank line. Mutually exclusive with `instruction`. Each path must be a local relative path inside the config directory (absolute paths and `..` traversal are rejected). Only supported for local file-based configs, not OCI/URL sources. See [External Instruction Files](#external-instruction-files) below. | +| `sub_agents` | array | ✗ | List of agent names or external OCI references this agent can delegate to. Supports local agents, registry references (e.g., `agentcatalog/pirate`), and named references (`name:reference`). Automatically enables the `transfer_task` tool. Pin external OCI references to a digest (`name@sha256:…`) to skip the per-run registry lookup that tag references incur. See [External Sub-Agents](../../concepts/multi-agent/index.md#external-sub-agents-from-registries). | +| `toolsets` | array | ✗ | List of tool configurations. See [Tool Config](../tools/index.md). | +| `fallback` | object | ✗ | Automatic model failover configuration. | +| `add_date` | boolean | ✗ | When `true`, injects the current date into the agent's context. | +| `add_environment_info` | boolean | ✗ | When `true`, injects working directory, OS, CPU architecture, and git info into context. | +| `add_prompt_files` | array | ✗ | List of file paths whose contents are appended to the system prompt. Useful for including coding standards, guidelines, or additional context. | +| `add_description_parameter` | boolean | ✗ | When `true`, adds agent descriptions as a parameter in tool schemas. Helps with tool selection in multi-agent scenarios. | +| `redact_secrets` | boolean | ✗ | When `true`, scrubs detected secrets (API keys, tokens, private keys, etc.) out of tool-call arguments, outgoing chat messages, and tool output before they reach a tool, the model, or downstream consumers. See [Redacting Secrets](#redacting-secrets) below. | +| `code_mode_tools` | boolean | ✗ | When `true`, formats tool responses in a code-optimized format with structured output schemas. Useful for MCP gateway and programmatic access. | +| `max_iterations` | int | ✗ | Maximum number of tool-calling loops. Default: unlimited (0). Set this to prevent infinite loops. | +| `max_consecutive_tool_calls` | int | ✗ | Maximum consecutive identical tool calls before the agent is terminated, preventing degenerate loops. Default: `5`. | +| `max_old_tool_call_tokens` | int | ✗ | Maximum number of tokens to keep from old tool call arguments and results. Older tool calls beyond this budget have their content replaced with a placeholder, saving context space. Tokens are approximated as `len/4`. Truncation is disabled by default; set a positive value to enable it. Set to `-1` to disable truncation (unlimited). | +| `num_history_items` | int | ✗ | Limit the number of conversation history messages sent to the model. Useful for managing context window size with long conversations. Default: unlimited (all messages sent). | +| `skills` | bool/array | ✗ | Enable automatic skill discovery. `true` loads all discovered local skills, `false` disables them. A list can mix skill sources (`local` or `https://…` URLs) and skill names to include — see [Skills](../../features/skills/index.md). | +| `commands` | object | ✗ | Named prompts that can be run with `docker agent run config.yaml /command_name`. Can be simple strings or objects with `instruction` and/or `agent` fields for agent switching, or a `url` field to open a link in the browser (TUI only). See [Named Commands](#named-commands) below. | +| `use_commands` | list of string | ✗ | Names of top-level `commands` groups to merge into this agent. Inline `commands` entries take precedence on name conflicts. Default: `[]`. | +| `use_skills` | list of string | ✗ | Names of top-level `skills` groups to merge into this agent. Inline skills are deduplicated by name against merged entries. Default: `[]`. | +| `use_toolsets` | list of string | ✗ | Names of top-level `toolsets` groups to merge into this agent. See [Reusable Toolsets](../overview/index.md#reusable-toolsets-toolsets). Default: `[]`. | +| `readonly` | boolean | ✗ | When `true`, every toolset on this agent is filtered to expose only read-only tools (those annotated with a read-only hint). Mutating tools are removed at load time and cannot be called even if the model tries. See [Read-Only Agents](#read-only-agents) below. | +| `welcome_message` | string | ✗ | Message displayed to the user when a session starts. Rendered as Markdown in the TUI. **Not sent to the model** — it exists purely for the user's benefit. Useful for telling users what the agent can do and what commands are available. | +| `handoffs` | array | ✗ | List of agent names this agent can hand off the conversation to. Enables the `handoff` tool. See [Handoffs Routing](../../concepts/multi-agent/index.md#handoffs-routing). | +| `force_handoff` | string | ✗ | Name of an agent that unconditionally receives the conversation whenever this agent produces a final response. The runtime performs the switch itself, bypassing the LLM's tool-calling, guaranteeing deterministic pipelines. Must not reference the agent itself, and chains must not form a cycle. See [Forced Handoffs](../../concepts/multi-agent/index.md#forced-handoffs). | +| `hooks` | object | ✗ | Lifecycle hooks for running commands at various points. See [Hooks](../hooks/index.md). | +| `structured_output` | object | ✗ | Constrain agent output to match a JSON schema. See [Structured Output](../structured-output/index.md). | +| `cache` | object | ✗ | Response cache. When the same user question is asked again, the previous answer is replayed verbatim and the model is not called. See [Response Cache](#response-cache) below. | +| `harness` | object | ✗ | Run this agent through an external coding CLI instead of a model. **Note:** Any `toolsets:` defined on the same agent are silently ignored when `harness:` is set — the external CLI brings its own tools. See [Coding Harnesses](../../features/harnesses/index.md). | + +> [!WARNING] +> **max_iterations** +> +> Default is `0` (unlimited). Always set `max_iterations` for agents with powerful tools like `shell` to prevent infinite loops. A value of 20–50 is typical for development agents. + +## External Instruction Files + +Long system prompts can be kept in their own files instead of being inlined in +the YAML, using `instruction_file`. This separates infrastructure configuration +(models, providers, tools) from behavioral content (the prompt), which keeps +version-control diffs focused, reduces merge conflicts on shared configs, and +lets instruction content be edited without risking YAML syntax errors. + +```yaml +agents: + coordinator: + model: openai/gpt-5-mini + description: Routes work between specialist agents + instruction_file: instructions/coordinator.md + sub_agents: + - writer + writer: + model: openai/gpt-5-mini + description: Drafts and edits written content + instruction_file: instructions/writer.md +``` + +The path is resolved relative to the config file's directory and the file's +contents are loaded as the agent's instruction when the config is loaded. Notes: + +- **Mutually exclusive** with `instruction`. Setting both is an error. +- Each path must be a **local relative path inside the config directory**. + Absolute paths and `..` traversal are rejected. +- A **list** of files is also accepted; their contents are concatenated in + order, separated by a blank line. This lets a shared preamble be reused + across agents while each agent appends its own specifics: + + ```yaml + agents: + writer: + model: openai/gpt-5-mini + description: Drafts and edits written content + instruction_file: + - instructions/shared-preamble.md + - instructions/writer.md + ``` + +- Only supported for **local file-based configs**, not agents loaded from OCI + registries or URLs. When an agent is pushed with `docker agent share push`, + the file contents are inlined into the pushed artifact, so the published + agent stays self-contained. + +A runnable example lives in [`examples/instruction_file.yaml`](https://github.com/docker/docker-agent/blob/main/examples/instruction_file.yaml). + +## Response Cache + +The response cache short-circuits the model when the same user question is asked again. The first time a question is asked, the agent calls the model normally and stores the assistant's reply. Subsequent identical questions skip the model entirely and replay the stored reply verbatim. + +```yaml +agents: + root: + model: openai/gpt-5 + description: Cached assistant + instruction: You are a helpful assistant. + cache: + enabled: true # required to turn the cache on + case_sensitive: false # default: false ("Hello" == "hello") + trim_spaces: true # default: false (" hello " == "hello") + path: ./cache.json # optional: persist to disk; omit for in-memory +``` + +| Property | Type | Default | Description | +| ---------------- | ------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `enabled` | boolean | `false` | Master switch. When `false` (or when the `cache` section is omitted), no caching is performed. | +| `case_sensitive` | boolean | `false` | When `true`, questions must match exactly (including case) to hit the cache. | +| `trim_spaces` | boolean | `false` | When `true`, leading and trailing whitespace is stripped from the question before it is compared. | +| `path` | string | _empty_ | When set, cache entries are persisted to a JSON file at the given path and reloaded on startup so the cache survives restarts. Relative paths resolve against the agent config directory. When empty, the cache lives in memory only. | + +**How it works** + +- The cache key is the latest user message in the session, normalized according to `case_sensitive` and `trim_spaces`. +- On a hit, the cached reply is added to the session as the assistant message and stop hooks fire normally — the rest of the agent (tools, sub-agents, the model) is bypassed. +- On a miss, the agent runs normally; the final assistant message produced by the first stop of the run is then stored under the question's key. +- Only the response to the original user question of a run is cached; follow-up turns inside the same `RunStream` are not. + +**File-backed storage** + +When `path` is set, every `Store` rewrites the entire cache file. Writes are **atomic**: the new content is written to a sibling temp file, `fsync`'d, and renamed over the destination, so a concurrent reader (or a process that crashes mid-write) will always see either the previous content or the new content in full — never a partially written file. The parent directory is also `fsync`'d after the rename so the rename itself is durable. + +**Cross-process sharing** + +Multiple processes can share the same `path:` cache file safely. Every `Store` takes an exclusive advisory lock on a sibling `.lock` file (POSIX `flock(2)` on Unix, `LockFileEx` on Windows), reloads the current on-disk state under the lock, merges the new entry, and writes back atomically. Two processes that store *different* keys at the same time both see their writes preserved on disk; the lock window is short (one read + one fsync'd write). + +`Lookup` watches the file's modification time and reloads the in-memory map when the file has advanced since its last load, so writes from a sibling process become visible without a restart. The `.lock` sentinel file is created on first write and never deleted: removing it would let two processes lock different inodes and lose mutual exclusion. + +## Redacting Secrets + +The `redact_secrets` flag is a single agent-level switch that scrubs accidentally leaked credentials, tokens, and private keys out of an agent's I/O. It wires up three complementary defenses: + +1. A `pre_tool_use` built-in hook that scrubs detected secrets from the **arguments of every tool call**, before the tool sees them. +2. A `before_llm_call` built-in hook that scrubs the same patterns from **outgoing chat messages** — message content, multi-part text content, prior reasoning content, and the JSON-encoded arguments of any tool call still in the conversation — before they reach the model provider. +3. A `tool_response_transform` built-in hook that scrubs **tool output at the source**, so the secret never reaches event consumers, the persisted session file, the `post_tool_use` hook input, or the next LLM call. + +```yaml +agents: + root: + model: openai/gpt-5 + description: A helpful assistant that scrubs secrets before they leak + instruction: | + You are a helpful assistant. If the user accidentally pastes a token, + do your best work without echoing the secret back. + redact_secrets: true + toolsets: + - type: shell +``` + +Detection uses the [portcullis](https://github.com/docker/portcullis) ruleset, which recognises common secret patterns including: + +- GitHub Personal Access Tokens (`ghp_*`, `gho_*`, `ghu_*`, `ghs_*`, `ghr_*`, fine-grained `github_pat_*`) +- AWS access keys (`AKIA*`, `ASIA*`, …) and secret access keys +- GitLab PATs (`glpat-*`), Hugging Face tokens (`hf_*`) +- Stripe (`sk_live_*`, `pk_test_*`, …), Slack (`xoxb-*`, …), Shopify, Twilio, Discord, Atlassian, Mailchimp, SendGrid, and many more +- JWTs, GCP service-account JSON, Heroku keys, Docker Hub PATs (`dckr_pat_*`) +- PEM-encoded private keys (`-----BEGIN … PRIVATE KEY-----` blocks) + +Each detected span is replaced with the literal string `[REDACTED]`; the surrounding text is preserved so a redacted argument still looks like a legitimate flag (e.g. `--token=[REDACTED]`). Redaction is idempotent — applying it twice yields the same result. + +> [!NOTE] +> **False positives vs. false negatives** +> +> False positives are extremely rare: every rule pairs a regex with a discriminating keyword, so plain English never trips detection. **False negatives are possible** — only patterns the ruleset recognises are scrubbed, so this is a defense-in-depth feature, not a substitute for keeping secrets out of the conversation in the first place. Pair it with a proper [secret manager](../../guides/secrets/index.md) for the credentials your agent actually needs. + +> [!NOTE] +> **Equivalent hook entry** +> +> Setting `redact_secrets: true` on the agent is shorthand for auto-registering all three legs of the feature as hook entries. They share the _same_ built-in name (`type: builtin`, `command: redact_secrets`) on `pre_tool_use`, `before_llm_call`, and `tool_response_transform` respectively — the implementation dispatches on the hook event. You can spell them out by hand to scope a leg to a subset of tools (set `matcher:` to a regex), stack them with other rewriters in a specific order, or enable just one or two legs. See [`examples/redact_secrets_hooks.yaml`](https://github.com/docker/docker-agent/blob/main/examples/redact_secrets_hooks.yaml) for a complete manual wiring and the [Hooks reference](../hooks/index.md#available-built-ins) for the builtin's event coverage. + +## Welcome Message + +Display a message when users start a session: + +```yaml +agents: + assistant: + model: openai/gpt-5 + description: Development assistant + instruction: You are a helpful coding assistant. + welcome_message: | + 👋 Welcome! I'm your development assistant. + + I can help you with: + - Writing and reviewing code + - Running tests and debugging + - Explaining concepts + + What would you like to work on? +``` + +## Deferred Tool Loading + +Toolsets support `defer` to load tools on-demand and speed up agent startup. See [Deferred Tool Loading](../tools/index.md#deferred-tool-loading) for details. + +```yaml +agents: + root: + model: anthropic/claude-sonnet-4-5 + description: Multi-purpose assistant + instruction: You have access to many tools. + toolsets: + - type: mcp + ref: docker:github-official + defer: true + - type: filesystem +``` + +## Fallback Configuration + +Automatically switch to backup models when the primary fails: + +| Property | Type | Default | Description | +| ---------- | ------ | ------- | ---------------------------------------------------------- | +| `models` | array | `[]` | Fallback models to try in order | +| `retries` | int | `2` | Retries per model for 5xx errors. `-1` to disable. | +| `cooldown` | string | `1m` | How long to stick with a fallback after a rate limit (429) | + +**Error handling:** + +- **Retryable** (same model with backoff): HTTP 5xx, 408, network timeouts +- **Non-retryable** (skip to next model): HTTP 429, 4xx client errors + +```yaml +agents: + root: + model: anthropic/claude-sonnet-4-5 + fallback: + models: + - openai/gpt-5 + - google/gemini-3.5-flash + retries: 2 + cooldown: 1m +``` + +## Named Commands + +Define reusable prompt shortcuts that can send prompts to the current agent, switch to a different sub-agent, or open a URL in the browser: + +> **Note:** Named slash commands execute immediately, even while the agent is processing another message. Unlike regular chat messages (which are queued), slash commands interrupt or direct the agent even while it is mid-response. + +```yaml +agents: + root: + model: openai/gpt-5 + instruction: You are a system administrator. + commands: + df: "Check how much free space I have on my disk" + logs: "Show me the last 50 lines of system logs" + greet: "Say hello to ${env.USER}" + deploy: "Deploy ${env.PROJECT_NAME || 'app'} to ${env.ENV || 'staging'}" + + # Advanced format with agent switching + plan: + agent: planner # Switch to the 'planner' sub-agent + instruction: "Create a detailed plan for: $1" # Optional: send this prompt after switching + + # Agent switching without instruction - forwards remaining text as prompt + review: + agent: reviewer # Any text after /review is sent to the reviewer agent + + # URL command - opens a link in the browser instead of messaging the agent + docs: + description: "Open the documentation" + url: https://docs.docker.com/ +``` + +### Command Formats + +Commands support three formats: + +1. **Simple string format**: The string becomes the instruction sent to the current agent + + ```yaml + df: "Check disk space" + ``` + +2. **Advanced object format**: Supports agent switching and optional instructions + + ```yaml + plan: + agent: planner # Required: name of sub-agent to switch to + instruction: "Plan: $1" # Optional: prompt to send after switching + description: "Switch to planning mode" # Optional: shown in help text + ``` + +3. **URL format**: Opens a link in the browser instead of messaging the agent + + ```yaml + docs: + url: https://docs.docker.com/ # Required: URL to open + description: "Open the documentation" # Optional: shown in help text + ``` + +When `agent` is set without `instruction`, any text typed after the slash command (e.g., `/plan build a web app`) is forwarded as a prompt to the target agent. The target agent must be listed in the current agent's `sub_agents` array. + +### Agent-Switching Commands + +Commands with an `agent` field switch the active agent for that command's scope. This is useful for building workflow shortcuts where `/plan`, `/review`, `/deploy` each route the user to the appropriate specialist. + +```yaml +agents: + root: + model: openai/gpt-5 + description: Main assistant + instruction: You are a project coordinator. + sub_agents: [planner, reviewer] + commands: + # Switch to planner with a pre-filled prompt + plan: + agent: planner + instruction: "Create a detailed plan for: $1" + # Switch to reviewer; any text after /review is forwarded + review: + agent: reviewer + # Simple prompt command (no switching) + status: "Summarize what we have accomplished so far" + + planner: + model: openai/gpt-5 + description: Planning specialist + instruction: You create detailed project plans. + + reviewer: + model: anthropic/claude-sonnet-4-5 + description: Code review specialist + instruction: You review code and suggest improvements. +``` + +**Agent-switching vs. `handoff`** + +| | Agent-switching command | `handoff` tool | +| --- | --- | --- | +| **Trigger** | User runs `/command` | Model calls `handoff()` | +| **Session** | Stays in the same session | Stays in the same session | +| **History** | Target agent sees full conversation | Target agent sees full conversation | +| **Return** | User must explicitly switch back | Target agent can chain to another agent | + +**Agent-switching vs. `transfer_task`** + +`transfer_task` launches a **sub-session**: the root agent sends a task, the child runs in isolation, and the result is returned to the root. The root agent stays in control and the child's work is never in the main conversation. Use `transfer_task` (via `sub_agents`) when you want delegation with a clean result; use agent-switching commands when you want to *become* a different agent for the rest of the conversation. + +See [`examples/agent_switching_commands.yaml`](https://github.com/docker/docker-agent/blob/main/examples/agent_switching_commands.yaml) for a complete example. + +```bash +# Run commands from the CLI +$ docker agent run agent.yaml /df +$ docker agent run agent.yaml /greet +$ PROJECT_NAME=myapp ENV=production docker agent run agent.yaml /deploy +``` + +Commands use JavaScript template literal syntax (`${env.VAR}`) for environment variable interpolation. Undefined variables expand to empty strings. + +The same syntax is also expanded in agent and toolset instructions: `agents..instruction` and `toolsets[*].instruction` support `${env.X}` placeholders (with optional `||` defaults and ternary expressions). `agents..description` and `agents..welcome_message` also support it. + +Note that path-like fields (`working_dir`, `path`) primarily use a shell-style syntax (`$VAR`, `${VAR}`, `~`), and also accept `${env.X}` as an alias (though not richer JS expressions). See [Variable Expansion in Config Fields](../overview/index.md#variable-expansion-in-config-fields) for the full table. + +### URL Commands + +A command with a `url` field opens that URL in the user's default browser instead of sending a prompt to the agent. Any URI scheme the OS knows how to dispatch works — both standard web URLs and custom schemes such as `docker-desktop://` for deep links. URL commands are TUI-only — they have no effect when run from the CLI. + +```yaml +agents: + root: + model: openai/gpt-5 + description: An agent with handy URL shortcuts. + instruction: You are a helpful assistant. + commands: + feedback: + description: "Open the feedback site for this session" + url: https://example.com/feedback?session={{session_id}} + docs: + description: "Open the documentation" + url: https://docs.docker.com/ + desktop: + description: "Open this session in Docker Desktop" + url: docker-desktop://dashboard/session/{{session_id}} +``` + +The `{{session_id}}` token is replaced at invocation time with the current session ID (URL-query-escaped so it can't break the URL or inject extra query parameters), letting a command deep-link to something scoped to the conversation. This token deliberately uses `{{...}}` rather than the `${...}` JS-expansion syntax, since the session ID is only known at dispatch time. + +URLs are validated before being handed to the OS opener: a parseable URL with a non-empty scheme is required, and flag-like inputs (those starting with `-`) are rejected to prevent argument injection. + +See [`examples/url_commands.yaml`](https://github.com/docker/docker-agent/blob/main/examples/url_commands.yaml) for a complete example. + +## Read-Only Agents + +Set `readonly: true` on an agent to restrict all of its toolsets to tools that are annotated as read-only. Mutating tools are filtered out at load time — the agent cannot list or call them, even if the model hallucinates a call. + +You can also set `readonly: true` on an individual toolset to restrict only that toolset while leaving others unrestricted. + +```yaml +agents: + # Agent-level readonly: every toolset is restricted to read-only tools. + inspector: + model: anthropic/claude-sonnet-4-5 + description: Read-only inspector that can explore but never modify. + instruction: Explore the project. Do not make changes. + readonly: true + toolsets: + - type: filesystem + - type: shell + + # Toolset-level readonly: only the filesystem toolset is restricted; + # the shell toolset keeps all of its tools. + mixed: + model: anthropic/claude-sonnet-4-5 + description: Read-only file access, full shell access. + instruction: You can read files and run any shell command. + toolsets: + - type: filesystem + readonly: true + - type: shell +``` + +See [`examples/readonly.yaml`](https://github.com/docker/docker-agent/blob/main/examples/readonly.yaml) for a complete example. + +> [!NOTE] +> **Which tools are read-only?** +> +> Whether a tool is read-only is determined by its `ReadOnlyHint` annotation. For built-in tools, read-only operations (list/read/search) carry the hint; mutating operations (write/delete/execute) do not. Custom and MCP tools expose the hint via their own annotations. + +## Complete Example + +```yaml +models: + claude: + provider: anthropic + model: claude-sonnet-4-5 + max_tokens: 64000 + +agents: + root: + model: claude + description: Technical lead coordinating development + instruction: | + You are a technical lead. Analyze requests and delegate + to the right specialist. Always review work before responding. + welcome_message: "👋 I'm your tech lead. How can I help today?" + sub_agents: [developer, researcher] + add_date: true + add_environment_info: true + fallback: + models: [openai/gpt-5] + toolsets: + - type: think + commands: + review: "Review all recent code changes for issues" + hooks: + session_start: + - type: command + command: "./scripts/setup.sh" + + developer: + model: claude + description: Expert software developer + instruction: Write clean, tested, production-ready code. + max_iterations: 30 + toolsets: + - type: filesystem + - type: shell + - type: think + - type: todo + + researcher: + model: openai/gpt-5 + description: Web researcher with memory + instruction: Search for information and remember findings. + toolsets: + - type: mcp + ref: docker:duckduckgo + - type: memory + path: ./research.db +``` diff --git a/_vendor/github.com/docker/docker-agent/docs/configuration/hcl/index.md b/_vendor/github.com/docker/docker-agent/docs/configuration/hcl/index.md new file mode 100644 index 0000000000..9a0718bf25 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/configuration/hcl/index.md @@ -0,0 +1,244 @@ +--- +title: "HCL Configuration" +description: "Write docker-agent configs in HCL instead of YAML, using labeled blocks, heredocs, and the same underlying schema." +keywords: docker agent, ai agents, configuration, yaml, hcl configuration +weight: 20 +--- + +_Write docker-agent configs in HCL instead of YAML. It maps to the same docker-agent schema and validation rules._ + +`docker-agent` supports `.hcl` config files anywhere it supports `.yaml` or `.yml` files. HCL is useful if you prefer labeled blocks, less punctuation, and heredocs for long prompts. + +> [!TIP] +> **Same config model, different syntax** +> +> YAML and HCL are just two syntaxes for the same docker-agent configuration model. docker-agent converts HCL to the equivalent YAML structure internally, then runs the normal schema validation and loading pipeline. + +## Minimal Example + +```hcl +#!/usr/bin/env docker agent run + +agent "root" { + model = "openai/gpt-5" + description = "A helpful assistant" + instruction = <<-EOT + You are a helpful assistant. + EOT + + toolset "think" {} +} +``` + +Run it exactly like a YAML config: + +```bash +$ docker agent run agent.hcl +$ docker agent run --exec agent.hcl "Summarize this repository" +$ docker agent serve api ./agents/ # directories may mix .yaml, .yml, and .hcl files +``` + +> [!TIP] +> **See also** +> +> HCL changes the syntax, not the meaning of fields. For what each field does, see [Agent Config](../agents/index.md), [Model Config](../models/index.md), and [Tool Config](../tools/index.md). + +## YAML vs HCL + +These two configs are equivalent: + +```yaml +models: + claude: + provider: anthropic + model: claude-sonnet-4-5 + +agents: + root: + model: claude + description: Coding assistant + instruction: You help with software development. + toolsets: + - type: filesystem + - type: shell +``` + +```hcl +model "claude" { + provider = "anthropic" + model = "claude-sonnet-4-5" +} + +agent "root" { + model = "claude" + description = "Coding assistant" + instruction = "You help with software development." + + toolset "filesystem" {} + toolset "shell" {} +} +``` + +## Core Conventions + +HCL follows a few simple mapping rules: + +| HCL syntax | YAML shape | +| --- | --- | +| `agent "root" { ... }` | `agents.root` | +| `model "claude" { ... }` | `models.claude` | +| `provider "team" { ... }` | `providers.team` | +| `mcp "github" { ... }` | `mcps.github` | +| `rag "docs" { ... }` | `rag.docs` | +| `command "fix" { ... }` inside an agent | `commands.fix` | +| `toolset "shell" {}` | list item in `toolsets` with `type: shell` | +| `metadata { ... }`, `permissions { ... }` | singleton blocks with the same top-level name | + +### Top-level keyed maps become labeled blocks + +In YAML, several sections are maps keyed by name. In HCL, those become labeled blocks: + +```hcl +model "claude" { + provider = "anthropic" + model = "claude-sonnet-4-5" +} + +agent "root" { + model = "claude" + description = "Primary assistant" + instruction = "You are helpful." +} +``` + +The supported top-level labeled blocks are: + +- `agent` +- `model` +- `provider` +- `mcp` +- `rag` + +The supported top-level singleton blocks are: + +- `metadata` +- `permissions` + +### Toolsets use the block label as `type` + +Instead of writing list entries with `type: ...`, HCL uses a `toolset` block whose label becomes the tool type: + +```hcl +agent "root" { + model = "openai/gpt-5" + description = "Dev assistant" + instruction = "You can inspect and modify code." + + toolset "filesystem" {} + + toolset "mcp" { + ref = "docker:github-official" + } +} +``` + +### Commands use labeled blocks too + +Agent commands are often nicer to write in HCL because each command gets its own block: + +```hcl +agent "root" { + model = "openai/gpt-5" + description = "Build helper" + instruction = "You help with builds." + + command "fix-lint" { + description = "Fix lint issues" + instruction = "Run the linter, then fix any problems." + } +} +``` + +## Strings and Heredocs + +Use quoted strings for short values and heredocs for long prompts, welcome messages, or embedded JSON. + +```hcl +agent "root" { + model = "openai/gpt-5" + description = "Friendly assistant" + + instruction = <<-EOT + You are a helpful assistant. + + Keep answers concise and practical. + EOT +} +``` + +### Escaping literal `${...}` + +HCL treats `${...}` inside strings and heredocs as template interpolation. If you need the literal text `${...}` in your prompt, escape it as `$${...}`. + +This matters for command prompts that intentionally show docker-agent template snippets: + +```hcl +command "fix-lint" { + instruction = <<-EOT + Run the linter and inspect the result: + + $${shell({cmd: "task lint"})} + EOT +} +``` + +The model will receive the literal `${shell({cmd: "task lint"})}` text. + +## Repeated Blocks Become Lists + +Some YAML sections are lists. In HCL, those are written as repeated blocks. + +For example, model routing rules become repeated `routing { ... }` blocks: + +```hcl +model "smart_router" { + provider = "openai" + model = "gpt-5" + + routing { + model = "anthropic/claude-sonnet-4-5" + examples = [ + "Write a detailed technical document", + "Review this code for security issues", + ] + } + + routing { + model = "openai/gpt-5" + examples = [ + "Generate some creative ideas", + "Help me brainstorm", + ] + } +} +``` + +The same idea applies to other list-shaped sections such as RAG `strategy` blocks and hook event entries. + +## Important Differences from Terraform + +docker-agent uses HCL as a configuration syntax, not as Terraform: + +- There are no modules, `locals`, or `variable` blocks. +- There are no docker-agent-specific HCL functions to call from expressions. +- Prefer normal literal values: strings, numbers, booleans, lists, objects, and nested blocks. +- After conversion, the result is validated exactly like the equivalent YAML config. + +If you already know Terraform, think of docker-agent HCL as a thin block-based syntax over the existing config schema. + +## Examples + +See these real configs in the repository: + +- [`examples/pirate.hcl`](https://github.com/docker/docker-agent/blob/main/examples/pirate.hcl) +- [`examples/gopher.hcl`](https://github.com/docker/docker-agent/blob/main/examples/gopher.hcl) diff --git a/_vendor/github.com/docker/docker-agent/docs/configuration/hooks/index.md b/_vendor/github.com/docker/docker-agent/docs/configuration/hooks/index.md new file mode 100644 index 0000000000..b1bf7b005f --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/configuration/hooks/index.md @@ -0,0 +1,882 @@ +--- +title: "Hooks" +description: "Run shell commands at various points during agent execution for deterministic control over behavior." +keywords: docker agent, ai agents, configuration, yaml, hooks +weight: 60 +--- + +_Run shell commands at various points during agent execution for deterministic control over behavior._ + +## Overview + +Hooks allow you to execute shell commands or scripts at key points in an agent's lifecycle. They provide deterministic control that works alongside the LLM's behavior, enabling validation, logging, environment setup, and more. + +> [!NOTE] +> **Use Cases** +> +> - Validate or transform tool inputs before execution +> - Log all tool calls to an audit file +> - Block dangerous operations based on custom rules +> - Validate, redact, or enrich user prompts before they reach the model +> - Programmatically approve or deny tool calls without prompting the user +> - Steer or veto context-window compaction +> - Audit sub-agent handoffs in multi-agent setups +> - Set up the environment when a session starts +> - Clean up resources when a session ends +> - Log or validate model responses before returning to the user +> - Send external notifications on agent errors or warnings + +## Hook Types + +docker-agent dispatches the following hook events: + +| Event | When it fires | Can block? | +| --------------------------- | --------------------------------------------------------------------------------- | ---------- | +| `pre_tool_use` | Before a tool call executes | Yes | +| `tool_response_transform` | Between a tool's execution and the runtime's emission/record of the response | No | +| `post_tool_use` | After a tool completes — fires for both success and failure | Yes | +| `permission_request` | Just before the runtime would prompt the user to approve a tool | Yes | +| `session_start` | When a session begins or resumes | No | +| `user_prompt_submit` | Once per user message, after submission and before the model runs | Yes | +| `user_steering_messages_submit` | Each time queued steering messages are drained (mid-turn, after stop, or while idle) | Yes | +| `user_followup_submit` | Each time a queued follow-up message starts a fresh turn (end-of-turn) | Yes | +| `turn_start` | At the start of every agent turn (each model call) | No | +| `turn_end` | At the end of every agent turn — fires no matter why the turn ended | No | +| `before_llm_call` | Just before every model call (after `turn_start`) | Yes | +| `after_llm_call` | After every successful model call, before the response is recorded | No | +| `session_end` | When a session terminates | No | +| `pre_compact` | Just before the runtime compacts the session transcript | Yes | +| `before_compaction` | Just before a compaction runs — can veto or supply a custom summary | Yes | +| `after_compaction` | After a successful compaction (summary applied to the session) | No | +| `subagent_stop` | When a sub-agent (transferred task / background / skill sub-session) finishes | No | +| `on_user_input` | When the agent is waiting for user input | No | +| `stop` | When the model finishes responding | No | +| `notification` | When the agent emits a notification (error or warning) | No | +| `on_error` | When the runtime hits an error during a turn (fires alongside `notification`) | No | +| `on_max_iterations` | When the runtime reaches its configured `max_iterations` limit | No | +| `on_agent_switch` | When the runtime moves the active agent (transfer_task, handoff, return) | No | +| `on_session_resume` | When the user explicitly approves continuation past `max_iterations` | No | +| `on_tool_approval_decision` | After the runtime's approval chain (yolo / permissions / readonly / ask) resolves | No | +| `worktree_create` | After `docker agent run --worktree` creates a git worktree, before the session | Yes | + +> [!NOTE] +> **Two compaction events** +> +> `pre_compact` and `before_compaction` both fire just before a compaction. `pre_compact` is the original event and is best-suited to _steering_ the LLM-generated summary by appending guidance via `additional_context`. `before_compaction` is the newer, structured event: it carries the input/output token counts, the model's context limit, and a `compaction_reason` so handlers can decide based on real session pressure, and it can _replace_ the LLM-generated summary verbatim via `hook_specific_output.summary`. + +## Configuration + +```yaml +agents: + root: + model: openai/gpt-4o + description: An agent with hooks + instruction: You are a helpful assistant. + hooks: + # Run before specific tools + pre_tool_use: + - matcher: "shell|edit_file" + hooks: + - type: command + command: "./scripts/validate-command.sh" + timeout: 30 + + # Run after all tool calls + post_tool_use: + - matcher: "*" + hooks: + - type: command + command: "./scripts/log-tool-call.sh" + + # Run when session starts + session_start: + - type: command + command: "./scripts/setup-env.sh" + + # Run when session ends + session_end: + - type: command + command: "./scripts/cleanup.sh" + + # Run when agent is waiting for user input + on_user_input: + - type: command + command: "./scripts/notify.sh" + + # Run when the model finishes responding + stop: + - type: command + command: "./scripts/log-response.sh" + + # Run on agent errors and warnings + notification: + - type: command + command: "./scripts/alert.sh" +``` + +## Built-in Hooks + +In addition to shell `command` hooks, docker-agent ships a small library of **built-in hooks** — in-process Go functions that run without spawning a subprocess. They're invoked with `type: builtin`, where `command` is the builtin's registered name and `args` are passed through as the builtin's parameters. + +```yaml +hooks: + turn_start: + - type: builtin + command: add_date + - type: builtin + command: add_prompt_files + args: + - GUIDELINES.md + - PROJECT.md + session_start: + - type: builtin + command: add_environment_info + before_llm_call: + - type: builtin + command: max_iterations + args: ["50"] +``` + +Built-ins are typically zero-config and faster than equivalent shell hooks because they don't fork a process. They cover the common "inject context into every turn / session" patterns out of the box. + +### Available built-ins + +| Builtin | Event | Args | What it does | +| ----------------------- | ----------------------------------------------------------------------------------------- | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `add_date` | `turn_start` | _none_ | Prepends `Today's date: YYYY-MM-DD` so the model always knows the current date. | +| `add_environment_info` | `session_start` | _none_ | Adds the working directory, git-repo status, OS, and CPU architecture. | +| `add_prompt_files` | `turn_start` | `[file1, file2, ...]` | Reads each named file from the workdir hierarchy (walking up) and the home directory, and appends their contents. | +| `add_git_status` | `turn_start` | _none_ | Adds the output of `git status --short --branch` (no-op outside a git repo or when git isn't installed). | +| `add_git_diff` | `turn_start` | _none_, or `["full"]` | Adds `git diff --stat` by default. Pass `args: ["full"]` to emit the full unified diff. Output is capped to 4 KB. | +| `add_directory_listing` | `session_start` | _none_ | Adds an alphabetical listing of the cwd's top-level entries (skips dot-files, capped at 100 with a "... and N more"). | +| `add_user_info` | `session_start` | _none_ | Adds the current OS user (username and full name) and the hostname. | +| `add_recent_commits` | `session_start` | _none_, or `[""]` | Adds `git log --oneline -n N`. `N` defaults to 10; pass a positive integer to override. | +| `max_iterations` | `before_llm_call` | `[""]` (required) | Hard-stops the agent after `N` model calls. Stateless: the runtime supplies the iteration counter on every dispatch. | +| `snapshot` | `session_start`, `turn_start`, `turn_end`, `pre_tool_use`, `post_tool_use`, `session_end` | _none_ | Records filesystem snapshots in a shadow git repo under the docker-agent data directory. No-op outside git repos; respects the source repo's ignore rules and skips newly-added files larger than 2 MiB. | +| `redact_secrets` | `pre_tool_use`, `before_llm_call`, `tool_response_transform` | _none_ | Scrubs detected secrets (API keys, tokens, private keys, …) out of tool call arguments, outgoing chat content, and tool output. The same builtin handles all three events and dispatches on the event name. Auto-registered on all three events by `redact_secrets: true` on the agent — see [`examples/redact_secrets_hooks.yaml`](https://github.com/docker/docker-agent/blob/main/examples/redact_secrets_hooks.yaml) for the manual wiring. | +| `limit_large_tool_results` | `tool_response_transform`, `session_end` | _none_ | **Always-on safety hook** — automatically injected by the runtime, no configuration required. When a tool result from the `filesystem`, `shell`, `mcp`, or `a2a` categories exceeds 2,000 lines or 50 KiB, the full payload is written to a per-session temp file and replaced in the conversation with a notice plus a bounded tail (last 2,000 lines, up to 50 KiB). The `session_end` leg deletes the temp directory. Internal toolsets (`memory`, `plan`, `tasks`, `think`, …) are not affected. | +| `safer_shell` | `pre_tool_use` (with `preempt_yolo: true`) | _none_ | Classifies shell commands against an embedded taxonomy. Destructive matches (rm -rf, docker volume rm, mkfs, …) get an Ask verdict with `blast_radius` / `category` metadata; known-safe reads (ls, git status, docker ps, …) flow through silently; everything else asks with `blast_radius=unknown`. Filters by tool name internally (no-op for non-shell calls). Registered with `preempt_yolo: true` so the entry fires before `Decide()` / `--yolo`. Auto-registered by `safer: true` on a shell toolset — see [`examples/shell_safer.yaml`](https://github.com/docker/docker-agent/blob/main/examples/shell_safer.yaml). | +| `unload` | `on_agent_switch` | _none_ | POSTs `{"model": ""}` to each of the previous agent's DMR model endpoints (`/_unload` by default, overridable per-model via `unload_api`) to free the GPU/RAM the just-departing model was holding. Pure HTTP — reads the model snapshot the runtime ships on `on_agent_switch` and depends on no provider-specific runtime state. Non-DMR providers (OpenAI, Anthropic, …) are silently skipped, so cross-provider chains are safe. Errors are logged and swallowed; agent switching never blocks on a slow or unreachable engine (each call has a 10 s timeout). See [`examples/unload_on_switch.yaml`](https://github.com/docker/docker-agent/blob/main/examples/unload_on_switch.yaml). | + +> [!NOTE] +> **Per-turn vs. per-session** +> +> `turn_start` built-ins recompute every turn and contribute **transient** context that is _not_ persisted to the session — perfect for fast-moving signals like the date or current git state. `session_start` built-ins run once per session and their context **persists** across turns and resumes — pick this for stable context like the OS user or the initial directory listing. + +> [!NOTE] +> **Auto-injected built-ins** +> +> The agent flags `add_date: true`, `add_environment_info: true`, `add_prompt_files: [...]`, and `redact_secrets: true` are shorthands that auto-register the matching built-in hook. You don't need to repeat them under `hooks:` — set the flag _or_ the hook entry(ies), not both. `redact_secrets: true` auto-registers the same builtin on all three of `pre_tool_use`, `before_llm_call`, and `tool_response_transform`; you can also wire any subset of them by hand for finer-grained control (per-tool matchers, ordering with other rewriters, …). +> +> `limit_large_tool_results` is injected unconditionally by the runtime — it is always active and cannot be removed from config. + +A minimal snapshot wiring looks like this: + +```yaml +hooks: + turn_start: + - type: builtin + command: snapshot + turn_end: + - type: builtin + command: snapshot + session_end: + - type: builtin + command: snapshot +``` + +The shadow repository stores tree objects only; it never writes commits or touches the source repository's `.git` directory. The source repository's `.gitignore` and `info/exclude` rules are mirrored before each capture so ignored files do not appear in snapshots. The built-in only records undo checkpoints when files changed, so a final no-op model response does not hide the last changed snapshot. + +You can also enable snapshots globally for every agent with user config: + +```yaml +settings: + snapshot: true +``` + +Omit `snapshot` or set it to `false` to leave automatic snapshots off; manually configured snapshot hooks still run. + +See [`examples/snapshot_hooks.yaml`](https://github.com/docker/docker-agent/blob/main/examples/snapshot_hooks.yaml) for a complete snapshot hook configuration. For an overview of the snapshot feature and the `/undo` / `/snapshots` commands, see [Snapshots](../../features/snapshots/index.md). + +> [!WARNING] +> **Two flavors of `max_iterations`** +> +> The `max_iterations` agent field has its own UX (it pauses and asks the user to resume past the limit). The `max_iterations` built-in hook is a **hard stop with no resume** — when its counter trips, the agent terminates with a block decision. Use the agent field for interactive sessions and the built-in hook to enforce non-negotiable caps in unattended runs. + +## Matcher Patterns + +The `matcher` field uses regex patterns to match tool names: + +| Pattern | Matches | +| ------------------ | ----------------------------- | +| `*` | All tools | +| `shell` | Only the `shell` tool | +| `shell\|edit_file` | Either `shell` or `edit_file` | +| `mcp:.*` | All MCP tools (regex) | + +## Hook Input + +Hooks receive JSON input via stdin with context about the event: + +```json +{ + "session_id": "abc123", + "cwd": "/path/to/project", + "hook_event_name": "pre_tool_use", + "tool_name": "shell", + "tool_use_id": "call_xyz", + "tool_input": { + "cmd": "rm -rf /tmp/cache", + "cwd": "." + } +} +``` + +### Common Fields + +Every hook event carries: + +| Field | Description | +| ----------------- | ------------------------------------- | +| `session_id` | The current session's ID. | +| `cwd` | The runtime's working directory. | +| `hook_event_name` | The event name (e.g. `pre_tool_use`). | + +### Per-Event Extra Fields + +In addition to the common fields, each event ships its own payload: + +| Event | Extra fields | +| --------------------------- | --------------------------------------------------------------------------------------------------------------------- | +| `pre_tool_use` | `agent_name`, `tool_name`, `tool_use_id`, `tool_input` | +| `tool_response_transform` | `tool_name`, `tool_use_id`, `tool_input`, `tool_response` | +| `post_tool_use` | `agent_name`, `tool_name`, `tool_use_id`, `tool_input`, `tool_response`, `tool_error` | +| `permission_request` | `agent_name`, `tool_name`, `tool_use_id`, `tool_input` | +| `session_start` | `source` — one of `startup`, `resume`, `clear`, `compact` | +| `user_prompt_submit` | `prompt` — the text the user just submitted | +| `user_steering_messages_submit` | `steering_messages` — the drained steering messages, in submission order | +| `user_followup_submit` | `prompt` — the text of the dequeued follow-up message | +| `turn_start` | _none_ (just the common fields) | +| `turn_end` | `agent_name`, `reason` — one of `normal`, `continue`, `steered`, `error`, `canceled`, `hook_blocked`, `loop_detected` | +| `before_llm_call` | `iteration` — 1-based run-loop iteration counter (the model call this hook is gating), `model_id` | +| `after_llm_call` | `agent_name`, `stop_response`, `last_user_message`, `model_id`, `usage`, `cost` | +| `session_end` | `reason` — one of `clear`, `logout`, `prompt_input_exit`, `other` | +| `pre_compact` | `source` — one of `manual`, `auto`, `overflow`, `tool_overflow` | +| `before_compaction` | `input_tokens`, `output_tokens`, `context_limit`, `compaction_reason` (one of `threshold`/`overflow`/`manual`) | +| `after_compaction` | `input_tokens`, `output_tokens`, `context_limit`, `compaction_reason`, `summary` | +| `subagent_stop` | `agent_name` (the sub-agent), `parent_session_id`, `stop_response` | +| `on_user_input` | _none_ | +| `stop` | `agent_name`, `stop_response`, `last_user_message` | +| `notification` | `notification_level` (`error` or `warning`), `notification_message` | +| `on_error` | `notification_level` (always `error`), `notification_message` | +| `on_max_iterations` | `notification_level` (always `warning`), `notification_message` | +| `on_agent_switch` | `from_agent`, `to_agent`, `agent_switch_kind` (`transfer_task`, `transfer_task_return`, `handoff`, or `force_handoff`) | +| `on_session_resume` | `previous_max_iterations`, `new_max_iterations` | +| `on_tool_approval_decision` | `tool_name`, `tool_use_id`, `tool_input`, `approval_decision`, `approval_source` | +| `worktree_create` | `worktree_path`, `worktree_branch`, `worktree_source_dir` (`cwd` is also set to the new worktree) | + +Notes: + +- `tool_response` for `post_tool_use` carries the tool's result; `tool_error` is `true` when the tool failed (the failure detail is surfaced inside `tool_response`). +- `agent_name` on `pre_tool_use`, `post_tool_use`, and `permission_request` identifies the agent that issued the tool call — in multi-agent setups this follows the active sub-agent, not always the root agent. +- `prompt` is only populated for `user_prompt_submit`. Sub-sessions (transferred tasks, background agents, skills) do **not** fire this event because their kick-off message is synthesised by the runtime, not authored by the user. +- `steering_messages` is only populated for `user_steering_messages_submit`. It carries the user messages the runtime just drained from the steering queue — messages submitted while the agent was already working (mid-turn, after the model stopped, or while idle before the first model call). +- `prompt` is also populated for `user_followup_submit`, carrying the text of the dequeued follow-up message (a user message queued for end-of-turn processing via the FollowUp API / queue, as opposed to mid-turn steering). +- `stop_response` carries the model's final assistant text for `stop`, `after_llm_call`, and `subagent_stop`. `last_user_message` carries the latest user message at dispatch time. +- `model_id` is populated for `after_llm_call` (and `before_llm_call`) in the canonical `/` form (e.g. `anthropic/claude-sonnet-4-5`). For harness agents, `model_id` is the harness label (e.g. `claude-code`) rather than a canonical model name — see [Coding Harnesses](../../features/harnesses/index.md). +- `usage` and `cost` are populated for `after_llm_call` only. `usage` is the per-call token usage object (`input_tokens`, `output_tokens`, `cached_input_tokens`, `cached_write_tokens`, and `reasoning_tokens` — the last is itself omitted for non-reasoning models); the whole object is absent when the provider reported no usage. `cost` is the USD price of that one model response. For a **native model call** it is the price computed from `usage` and the model's pricing table, and equals the cost the session records for the turn: it is **absent** when the response is unpriced (no pricing data on file, or no usage) and an explicit `0` for a priced call that was free — so a present `cost` is authoritative and an absent one means "unpriced", with no need to cross-check `usage`. (For harness agents the meaning differs — see the next note.) A cost ledger can therefore record per-call spend from the payload alone, without subscribing to the runtime event channel. +- For [harness agents](../../features/harnesses/index.md), `cost` is the harness's own reported total for the call rather than a computed price, and is present only when the harness reported a non-zero cost (some harnesses, e.g. `codex`, report token counts but no cost — those turns carry `usage` with `cost` absent, even though the recorded message stores `0`). +- `after_llm_call` fires for **every** model call, including calls made inside sub-sessions (transferred tasks, background agents, skills). For those, `session_id` is the sub-session's id. Summing `cost` across `after_llm_call` events therefore captures **all** spend, including sub-sessions (and even sub-sessions that error before their cost is persisted). Do **not** add a separately-queried session cost total on top: the runtime's own total already recurses into and includes completed sub-session spend, so combining the two double-counts. Pick one source — the summed hook costs — as the authoritative ledger. +- `context_limit` is `0` when the model definition is unavailable (treat `0` as "unknown", not as a real limit). +- `approval_decision` is one of `allow`, `deny`, `canceled`. `approval_source` is a stable classifier of which step decided (e.g. `yolo`, `session_permissions_allow`, `session_permissions_deny`, `team_permissions_allow`, `team_permissions_deny`, `pre_tool_use_hook_allow`, `pre_tool_use_hook_deny`, `readonly_hint`, `user_approved`, `user_approved_session`, `user_approved_tool`, `user_rejected`, `context_canceled`). + +## Hook Output + +Hooks communicate back via JSON output to stdout: + +```json +{ + "continue": true, + "stop_reason": "Optional message when continue=false", + "suppress_output": false, + "system_message": "Warning message to show user", + "decision": "block", + "reason": "Explanation for the decision", + "hook_specific_output": { + "hook_event_name": "pre_tool_use", + "permission_decision": "allow", + "permission_decision_reason": "Command is safe", + "updated_input": { "cmd": "modified command" } + } +} +``` + +All fields are optional. Returning `{}` (or no output at all) means "do nothing, continue normally". + +### Output Fields + +| Field | Type | Description | +| ----------------- | ------- | ----------------------------------------------- | +| `continue` | boolean | Whether to continue execution (default: `true`) | +| `stop_reason` | string | Message to show when `continue=false` | +| `suppress_output` | boolean | Hide stdout from transcript | +| `system_message` | string | Warning message to display to user | +| `decision` | string | For blocking: `block` to prevent operation | +| `reason` | string | Explanation for the decision | + +### Pre-Tool-Use / Permission-Request Specific Output + +The `hook_specific_output` for `pre_tool_use` (and `permission_request`) supports: + +| Field | Type | Description | +| ---------------------------- | ------ | --------------------------------------- | +| `permission_decision` | string | `allow`, `deny`, or `ask` | +| `permission_decision_reason` | string | Explanation for the decision | +| `updated_input` | object | Modified tool input (replaces original) | +| `metadata` | object | (`permission_request` and `pre_tool_use` entries with `preempt_yolo: true` only) string key/value annotations merged onto the tool-call confirmation prompt — see below | + +### Preempting `--yolo` from `pre_tool_use` + +`pre_tool_use` entries default to firing AFTER the deterministic approval +pipeline (`--yolo` / permission allow-rules / read-only hint), so a yolo'd +call skips them entirely. For security-critical checks that MUST run on +every call regardless of `--yolo`, set `preempt_yolo: true` on the matcher +entry: + +```yaml +hooks: + pre_tool_use: + - matcher: "*" + preempt_yolo: true + hooks: + - type: builtin + command: safer_shell +``` + +The entry then fires in a dedicated stage 0 BEFORE `Decide()`: + +- `deny` rejects the call outright; the user is not prompted. +- `ask` forces user confirmation. The default `pre_tool_use` lane and + `permission_request` are skipped on this path so a policy-level + allow there can't override the security verdict. +- `allow` is advisory — the pipeline still runs `Decide()` and the + rest of `pre_tool_use`. Same shape as a regular `allow` on the + default lane, just observed earlier. +- No verdict (empty `permission_decision`) falls through. + +Hook crashes on a `preempt_yolo: true` entry fail closed (deny), matching +the default `pre_tool_use` posture. + +Preempting entries can attach structured context via +`hook_specific_output.metadata` (`map[string]string`). The runtime merges +that into the tool-call confirmation event. Two key conventions get +special rendering in the TUI confirmation prompt: + +- `blast_radius` — one of `low`, `medium`, `high`, `unknown`. Rendered + as a colored severity badge (green / yellow / red / muted). +- `category` — taxonomy tag (e.g. `fs-delete`, `dk-volume-del`). + +Plus a free-form `reason` key that the dialog shows as supporting +context. Other keys render as plain text. Last writer wins on key +clashes across hooks. The `safer_shell` builtin uses this convention. + +### Tool-Response-Transform Specific Output + +The `hook_specific_output` for `tool_response_transform` supports: + +| Field | Type | Description | +| ----------------------- | ------ | --------------------------------------------- | +| `updated_tool_response` | string | Rewritten tool output (replaces the original) | + +This is the symmetric counterpart of `pre_tool_use`'s `updated_input`, applied to tool **results** instead of tool **arguments**. The rewrite reaches every downstream consumer — event subscribers, the persisted session file, the `post_tool_use` hook input, and the next LLM call. Use it to truncate excessive output, scrub PII, or normalise tool dialects. The built-in `redact_secrets` registers itself on this event as the third leg of the redact_secrets feature. + +### Context-Contributing Events + +For `session_start`, `user_prompt_submit`, `user_steering_messages_submit`, `user_followup_submit`, `turn_start`, `post_tool_use`, `pre_compact`, and `stop`, hooks may set `hook_specific_output.additional_context` to inject text into the conversation. `turn_start` context is **transient** (recomputed every turn, never persisted); `session_start` context **persists** for the life of the session. `user_steering_messages_submit` and `user_followup_submit` context is **transient** like `user_prompt_submit` — it is spliced into the steered/follow-up turn only and never persisted. (`worktree_create` also surfaces stdout, but to the CLI user rather than the conversation — the session doesn't exist yet.) + +### Before-Compaction Specific Output + +For `before_compaction`, the `hook_specific_output.summary` field, when non-empty, replaces the LLM-generated compaction summary. The runtime applies the string verbatim and skips the model call. + +```json +{ + "hook_specific_output": { + "hook_event_name": "before_compaction", + "summary": "User asked to refactor pkg/foo. Done in commit abc123." + } +} +``` + +Returning `decision: "block"` (or exit code 2) instead vetoes the compaction entirely. Be cautious about denying when `compaction_reason` is `overflow`: the runtime is recovering from a context-overflow error and a denial there will leave the session unable to make progress. + +### Plain Text Output + +For `session_start`, `user_prompt_submit`, `user_steering_messages_submit`, `user_followup_submit`, `turn_start`, `post_tool_use`, `pre_compact`, and `stop` hooks, plain text written to stdout (i.e., output that is not valid JSON) is captured as additional context for the agent. For `pre_compact` it is appended to the compaction prompt; for the others it is spliced into the conversation as a (transient or persisted) system message depending on the event. + +## Exit Codes + +Hook exit codes have special meaning: + +| Exit Code | Meaning | +| --------- | -------------------------------------- | +| `0` | Success — continue normally | +| `2` | Blocking error — stop the operation | +| Other | Error — logged but execution continues | + +## Per-hook options + +Hooks have a default timeout of 60 seconds. You can also give hooks a name, add environment variables, choose a working directory, and control how non-security hook failures behave: + +```yaml +hooks: + post_tool_use: + - matcher: "shell" + hooks: + - name: "summarize shell output" + type: command + command: "./summarize.sh" + timeout: 120 # 2 minutes + working_dir: ./hooks + env: + PROFILE: dev + on_error: warn # warn | ignore | block +``` + +`pre_tool_use` is fail-closed for safety: a failed pre-tool hook blocks the tool call regardless of `on_error`. + +`working_dir` and `env` apply to `command` and `builtin` hooks. For `builtin` hooks, `working_dir` is resolved with the same logic as `command` hooks (absolute path wins; relative paths join onto the executor directory). For `model` hooks, both fields are accepted by the schema but have no effect: model hooks render a prompt template and call the LLM API directly — no subprocess is spawned and no file I/O is performed, so working directory and environment variables have no applicable semantics. + +> [!WARNING] +> **Performance** +> +> Hooks run synchronously and can slow down agent execution. Keep hook scripts fast and efficient. Consider using `suppress_output: true` for logging hooks to reduce noise. + +> [!NOTE] +> **Session End and Cancellation** +> +> `session_end` hooks are designed to run even when the session is interrupted (e.g., Ctrl+C). They are still subject to their configured timeout. + +## Examples + +### Validation Script + +A simple pre-tool-use hook that blocks dangerous shell commands: + +```bash +#!/bin/bash +# scripts/validate-command.sh + +# Read JSON input from stdin +INPUT=$(cat) +TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name') +CMD=$(echo "$INPUT" | jq -r '.tool_input.cmd // empty') + +# Block dangerous commands +if [[ "$TOOL_NAME" == "shell" ]]; then + if [[ "$CMD" =~ ^sudo ]] || [[ "$CMD" =~ rm.*-rf ]]; then + echo '{"decision": "block", "reason": "Dangerous command blocked by policy"}' + exit 2 + fi +fi + +# Allow everything else (returning {} means "do nothing, continue normally") +echo '{}' +exit 0 +``` + +### Audit Logging + +A post-tool-use hook that logs all tool calls: + +```bash +#!/bin/bash +# scripts/log-tool-call.sh + +INPUT=$(cat) +TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ") +TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name') +SESSION_ID=$(echo "$INPUT" | jq -r '.session_id') + +# Append to audit log +echo "$TIMESTAMP | $SESSION_ID | $TOOL_NAME" >> ./audit.log + +# Don't block execution +echo '{"continue": true}' +exit 0 +``` + +### Session Lifecycle + +Session start and end hooks for environment setup and cleanup: + +```yaml +hooks: + session_start: + - type: command + timeout: 10 + command: | + INPUT=$(cat) + SESSION_ID=$(echo "$INPUT" | jq -r '.session_id // "unknown"') + echo "Session $SESSION_ID started at $(date)" >> /tmp/agent-session.log + echo '{"hook_specific_output":{"additional_context":"Session initialized."}}' + + session_end: + - type: command + timeout: 10 + command: | + INPUT=$(cat) + SESSION_ID=$(echo "$INPUT" | jq -r '.session_id // "unknown"') + REASON=$(echo "$INPUT" | jq -r '.reason // "unknown"') + echo "Session $SESSION_ID ended ($REASON) at $(date)" >> /tmp/agent-session.log +``` + +### Response Logging with Stop Hook + +Log every model response for analytics or compliance: + +```yaml +hooks: + stop: + - type: command + timeout: 10 + command: | + INPUT=$(cat) + SESSION_ID=$(echo "$INPUT" | jq -r '.session_id // "unknown"') + RESPONSE_LENGTH=$(echo "$INPUT" | jq -r '.stop_response // ""' | wc -c | tr -d ' ') + echo "[$(date)] Session $SESSION_ID - Response: $RESPONSE_LENGTH chars" >> /tmp/agent-responses.log +``` + +The `stop` hook is useful for: + +- **Response quality checks** — validate that responses meet criteria before returning +- **Analytics** — track response lengths, patterns, or content +- **Compliance logging** — record all agent outputs for audit + +### Error Notifications + +Send alerts when the agent encounters errors: + +```yaml +hooks: + notification: + - type: command + timeout: 10 + command: | + INPUT=$(cat) + LEVEL=$(echo "$INPUT" | jq -r '.notification_level // "unknown"') + MESSAGE=$(echo "$INPUT" | jq -r '.notification_message // "no message"') + echo "[$(date)] [$LEVEL] $MESSAGE" >> /tmp/agent-notifications.log +``` + +The `notification` hook fires when: + +- The model returns an error (all models failed) — also fires `on_error` +- A degenerate tool call loop is detected — also fires `on_error` +- The maximum iteration limit is reached — also fires `on_max_iterations` + +Use `on_error` and `on_max_iterations` instead of `notification` when you want a structured handler for one of these conditions without parsing `notification_level`. + +### Turn-Start: per-turn context + +`turn_start` fires at the start of every agent turn (each model call). Anything you contribute via `additional_context` (or plain stdout) is appended as a **transient** system message for that turn only — it is *not* persisted to the session. Use it for fast-moving signals like the date, current git state, or per-turn prompt files. The built-in hooks `add_date`, `add_prompt_files`, `add_git_status`, and `add_git_diff` all target this event. + +### Turn-End: per-turn finalizer + +`turn_end` is the symmetric counterpart of `turn_start`. It fires once per turn when the iteration finishes — no matter why. The runtime guarantees the dispatch on every exit path (a normal stop, an error, a hook-driven shutdown, the loop detector, even context cancellation), and it uses `context.WithoutCancel` internally so handlers run to completion on Ctrl+C. + +The `reason` field classifies the exit: + +| `reason` | When | +| --------------- | ------------------------------------------------------------ | +| `normal` | Model finished cleanly with no follow-up | +| `continue` | More iterations to come (e.g. tool calls, follow-up message) | +| `steered` | Drained steered messages prompted a re-entry | +| `error` | Model call failed (`handleStreamError` exited the loop) | +| `canceled` | Context was cancelled (e.g. Ctrl+C) | +| `hook_blocked` | `before_llm_call` or `post_tool_use` denied the call | +| `loop_detected` | The consecutive-tool-call loop detector terminated the turn | + +`turn_end` is observational — the result is ignored. Use it to time turns, accumulate per-turn metrics (token usage, tool counts), or notify external observability pipelines symmetrically with `turn_start`. + +### Before/After-LLM-Call: budget guards and model auditing + +`before_llm_call` fires immediately before every model call (after `turn_start` has assembled the messages). It cannot contribute context — use `turn_start` for that — but it can **stop the run** by returning `decision: block` (or exit code 2). The built-in `max_iterations` hook implements a hard cap on top of this event. + +`after_llm_call` fires immediately after each successful model call, before the response is recorded into the session and tool calls are dispatched. The assistant text is in `stop_response`, and the call's `usage` and `cost` carry the per-turn token usage and computed USD spend (see the field notes above). Use it for response auditing, redaction logging, quality metrics, or a sidecar cost ledger that records per-call spend without subscribing to the runtime event channel. Failed model calls fire `on_error` instead. + +### Before/After-Compaction: structured compaction control + +`before_compaction` fires immediately before a compaction. Unlike `pre_compact`, it carries structured token-pressure data: `input_tokens`, `output_tokens`, `context_limit`, and a `compaction_reason` (`threshold`, `overflow`, or `manual`). Hooks can either: + +- veto compaction by returning `decision: block` (the runtime skips compaction entirely), or +- replace the LLM-generated summary by returning `hook_specific_output.summary` (the runtime applies that summary verbatim and skips the model call). + +`after_compaction` fires after a successful compaction. It carries the produced `summary` along with the *pre-compaction* `input_tokens` / `output_tokens` so observability handlers can naturally express "compacted from X to Y". `after_compaction` is purely observational; output is ignored. + +### Agent-Switch and Session-Resume: observability for multi-agent and long runs + +`on_agent_switch` fires whenever the runtime moves the active agent to a new one — `transfer_task`, `handoff`, `force_handoff`, or the return after a transferred task completes. The cause is in `agent_switch_kind`, the source and destination in `from_agent` and `to_agent`. Use it for audit, transcript, and metrics pipelines that track which agent ran which tools. + +The built-in [`unload`](#available-built-ins) hooks into this event to release the resources held by the previous agent's models. It's the canonical way to run two heavy local models on a GPU that can only fit one at a time: + +```yaml +agents: + coder: + model: qwen3-large + handoffs: [reviewer] + hooks: + on_agent_switch: + - type: builtin + command: unload + reviewer: + model: qwen3-coder + handoffs: [coder] + hooks: + on_agent_switch: + - type: builtin + command: unload + +models: + qwen3-large: + provider: dmr + model: ai/qwen3-large + qwen3-coder: + provider: dmr + model: ai/qwen3-coder +``` + +At every transfer the runtime ships a snapshot of the previous agent's model endpoints on the `on_agent_switch` hook input, and the `unload` builtin POSTs `{"model": ""}` to each DMR endpoint's `/_unload` URL over plain HTTP. For cloud providers (OpenAI, Anthropic, …) the hook is a silent no-op since they don't expose an HTTP unload endpoint. Cross-provider chains are safe — only DMR endpoints are touched. See [`examples/unload_on_switch.yaml`](https://github.com/docker/docker-agent/blob/main/examples/unload_on_switch.yaml) for the full file. + +`on_session_resume` fires when the user explicitly approves the runtime to continue past its configured `max_iterations` limit. `previous_max_iterations` carries the cap that was reached and `new_max_iterations` carries the new cap after approval. Useful for alerting on extended-runtime sessions or for billing / quota pipelines that meter resumes. + +### Tool-Approval-Decision: who-approved-what audit trail + +`on_tool_approval_decision` fires after the runtime's tool-approval chain (yolo / permissions / readonly / pre_tool_use hooks / interactive prompt) has resolved a verdict for a tool call. `approval_decision` is `allow`, `deny`, or `canceled`; `approval_source` is a stable classifier of which step produced the verdict. Observational only — it gives audit pipelines a single, structured "who approved what" record without re-implementing the chain. + +### Worktree-Create: prepare an isolated checkout + +`worktree_create` fires once, just after `docker agent run --worktree[=name]` creates a fresh [git worktree](../../features/cli/index.md) and **before** the session starts. Each hook runs **inside** the new worktree — its working directory (and `cwd` in the input) is the fresh checkout — so setup commands operate on the new tree rather than your original one. The worktree path and branch are in `worktree_path` and `worktree_branch`, and `worktree_source_dir` carries the repository root it was branched from. + +Use it to prepare the checkout before the agent begins: copy untracked files git won't carry over (`.env`, local config), install dependencies, or warm caches. Because the worktree lives under the docker-agent data directory — not next to your checkout — resolve the original files through `worktree_source_dir` rather than a relative path. A hook may **abort the run** by returning `decision: block` / `{"continue": false}` / exit code 2 (for example, when a setup step fails); plain stdout is surfaced as additional context. + +```yaml +hooks: + worktree_create: + # Copy untracked dotfiles git won't bring into the new worktree. + - name: seed local env + type: command + command: | + INPUT=$(cat) + SRC=$(echo "$INPUT" | jq -r '.worktree_source_dir // ""') + [ -n "$SRC" ] && [ -f "$SRC/.env" ] && [ ! -f .env ] && cp "$SRC/.env" .env + echo "Prepared worktree" + # Install dependencies, aborting the run on failure. + - name: install dependencies + type: command + timeout: 600 + command: | + if [ -f package.json ]; then + npm install || { echo '{"continue": false, "system_message": "npm install failed"}'; exit 2; } + fi +``` + +Unlike most events, `worktree_create` is dispatched from the CLI rather than the run loop, because the worktree (and the working directory the runtime, session, tools, and snapshot machinery all capture) must be settled before the runtime and session exist. See [`examples/worktree_create_hook.yaml`](https://github.com/docker/docker-agent/blob/main/examples/worktree_create_hook.yaml) for the full file. + +### Pre-Compact: steer the summary + +`pre_compact` fires just before the runtime compacts the session transcript. Its `source` field tells you why compaction was triggered: + +- `manual` — the user invoked `/compact` +- `auto` — proactive compaction at the configured threshold +- `overflow` — emergency compaction after a context-overflow error +- `tool_overflow` — proactive compaction triggered by tool results pushing the estimated context past the threshold + +Return `additional_context` (or plain stdout) to append guidance to the compaction prompt without modifying the agent's instruction. Block the event (`decision: block` / exit code 2) to cancel compaction — useful when you want to handle truncation yourself. + +### User-Prompt-Submit: gate or enrich every user message + +`user_prompt_submit` fires once per user message, after the prompt is recorded in the session and before the first model call. The submitted text is in `prompt`. Use it to: + +- block prompts that violate policy (`decision: block` / exit code 2), +- inject per-prompt context (`additional_context` is spliced as a transient system message for that turn), +- audit user prompts to a log. + +It does **not** fire for sub-sessions (transferred tasks, background agents, skill sub-sessions) because their kick-off message is synthesised by the runtime. + +### User-Steering-Messages-Submit: gate or enrich mid-flight steering + +`user_steering_messages_submit` is the steering-queue analogue of `user_prompt_submit`. It fires each time the runtime drains the steering queue — messages the user submitted while the agent was already working: mid-turn (after a batch of tool calls), after the model stopped, or while idle before the first model call. The drained messages arrive as a JSON array in `steering_messages`. Use it to: + +- block a run when steering violates policy (`decision: block` / exit code 2), +- inject context in response to the steering (`additional_context` is spliced as a transient system message for the steered turn — never persisted, exactly like `user_prompt_submit`), +- audit steering messages to a log. + +Unlike `turn_end` with `reason: steered`, which only observes the mid-turn and post-stop drains, this event fires on **every** drain — including steering applied while the agent was idle before its first model call. + +```yaml +hooks: + user_steering_messages_submit: + - type: command + timeout: 5 + command: | + INPUT=$(cat) + COUNT=$(echo "$INPUT" | jq -r '.steering_messages | length') + echo "$INPUT" | jq -r '.steering_messages[]' >> /tmp/agent-steering.log + if [ "$COUNT" -gt 0 ]; then + echo '{"hook_specific_output":{"additional_context":"The user sent new instructions while you were working — re-read the latest user messages and adjust course before continuing."}}' + fi +``` + +### User-Followup-Submit: gate or enrich queued follow-ups + +`user_followup_submit` is the follow-up-queue analogue of `user_prompt_submit`. It fires each time the runtime dequeues a follow-up message at the end of a turn and starts a fresh turn for it. Follow-ups are user messages queued for end-of-turn processing (the FollowUp API / queue) — distinct from mid-turn steering: the model sees a follow-up as fresh input, not an interruption, and each follow-up gets a full undivided turn. The follow-up text is in `prompt`. Use it to: + +- block a queued follow-up that violates policy (`decision: block` / exit code 2), +- inject per-follow-up context (`additional_context` is spliced as a transient system message for the follow-up turn — never persisted, exactly like `user_prompt_submit`), +- audit follow-up messages to a log. + +This closes the gap left by `user_prompt_submit`, which fires only for the first interactive prompt and never for queued follow-ups. + +```yaml +hooks: + user_followup_submit: + - type: command + timeout: 5 + command: | + INPUT=$(cat) + echo "$INPUT" | jq -r '.prompt' >> /tmp/agent-followups.log +``` + +### Subagent-Stop: observe handoff completions + +`subagent_stop` fires whenever a sub-agent finishes — `transfer_task` returns, a background agent completes, or a skill sub-session ends. It runs against the *parent* agent's hooks executor, so handlers configured on the orchestrator see every child completion in one place. The sub-agent's name is in `agent_name`, the parent's session ID in `parent_session_id`, and the child's final assistant message in `stop_response`. + +### Permission-Request: programmatic tool approval + +`permission_request` fires just before the runtime would prompt the user to approve a tool call (i.e. when neither `--yolo` nor a permissions rule short-circuited the decision and the tool is not read-only). Use the same `hook_specific_output.permission_decision` shape as `pre_tool_use` to auto-approve or auto-deny the call: + +```yaml +hooks: + permission_request: + - matcher: "shell" + hooks: + - type: command + command: | + INPUT=$(cat) + CMD=$(echo "$INPUT" | jq -r '.tool_input.cmd // ""') + if echo "$CMD" | grep -qE '^(ls|pwd|cat) '; then + echo '{"hook_specific_output":{"permission_decision":"allow","permission_decision_reason":"safe read-only command"}}' + fi +``` + +Return nothing to fall through to the usual interactive confirmation. + +When the hook falls through (returns no `permission_decision`), it can still attach key/value `metadata` to the confirmation prompt the runtime shows the user. The runtime merges it onto any static metadata the toolset attached to the tool (hook keys win on a clash) and emits it on the tool-call confirmation message, so clients (TUI, HTTP) can render extra per-call context. Keys from multiple matching hooks are merged; the last hook in config order wins on a clash. + +```yaml +hooks: + permission_request: + - matcher: "shell" + hooks: + - type: command + command: | + INPUT=$(cat) + CMD=$(echo "$INPUT" | jq -r '.tool_input.cmd // ""') + if echo "$CMD" | grep -qE '\brm\b'; then + echo '{"hook_specific_output":{"metadata":{"risk":"high","note":"deletes files"}}}' + fi +``` + +### LLM as a Judge (Auto-Approving Tool Calls) + +The `model` hook type asks an LLM and translates its reply into the +hook's native output — no Go code, no shell glue, no JSON parsing on +your side. Combined with the well-known `pre_tool_use_decision` +schema it gives you a fully-configurable LLM judge that decides +`allow` / `ask` / `deny` per tool call. + +```yaml +hooks: + pre_tool_use: + - matcher: "shell|edit_file|mcp:.*" + hooks: + - type: model + model: openai/gpt-4o-mini + timeout: 15 + schema: pre_tool_use_decision + prompt: | + You are a security judge for an autonomous agent. + Decide whether this tool call is safe to auto-approve. + + Tool: {{ .ToolName }} + Args: {{ .ToolInput | toJSON }} + + Project rules: + - Reads under the working directory are safe. + - Writes to ~/.ssh / ~/.aws / ~/.docker are deny. +``` + +| Field | Required | Description | +| --------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `model` | yes | Model spec (`provider/model`, e.g. `openai/gpt-4o-mini`). The judge model — small/cheap is recommended. | +| `prompt` | yes | Go [`text/template`](https://pkg.go.dev/text/template) body. Sees the hook [Input](#hook-input) as data, plus the `toJSON` and `truncate ` helpers. | +| `schema` | no | Well-known response interpretation. `pre_tool_use_decision` produces a `permission_decision` verdict; omit for free-form text injected as `additional_context`. | +| `timeout` | no (default 60s) | Per-call timeout. **Timeouts fail closed (deny) for `pre_tool_use`** regardless of any other setting. Match it to your judge model's typical latency plus a small buffer. | + +The `pre_tool_use_decision` schema constrains the judge to reply with +strict `{decision, reason}` JSON. Providers that honor structured +output (OpenAI, ...) are asked to emit that shape directly; on +providers that ignore it the framework still parses tolerant +JSON-in-text. Anything unparseable propagates as a hook error and the +executor falls closed (deny) on `pre_tool_use`. + +Pair it with deterministic `permissions:` rules so destructive calls +(e.g. `sudo`, `rm -rf`) are blocked even if the judge is misled, and +obvious read-only calls bypass the LLM entirely. See +[`examples/llm_judge.yaml`](https://github.com/docker/docker-agent/blob/main/examples/llm_judge.yaml) +for a complete configuration. + +**Security considerations**: + +- **Sensitive data**: Tool arguments (including file paths, command + arguments, and any other parameters) are sent to the judge LLM. Avoid + using the judge on tools that handle secrets, or ensure your judge + model is self-hosted. +- **Defense in depth**: The judge should not be your only security + layer. Use deterministic `permissions:` rules to block obviously + dangerous operations (e.g., `sudo`, `rm -rf`) before the judge sees + them, as shown in the example configuration. + +## CLI Flags + +You can add hooks from the command line without modifying the agent's YAML file. This is useful for one-off debugging, audit logging, or layering hooks onto an existing agent. + +| Flag | Description | +| ---------------------- | ------------------------------------------------ | +| `--hook-pre-tool-use` | Run a command before every tool call | +| `--hook-post-tool-use` | Run a command after every tool call | +| `--hook-session-start` | Run a command when a session starts | +| `--hook-session-end` | Run a command when a session ends | +| `--hook-on-user-input` | Run a command when waiting for input | +| `--hook-stop` | Run a command when the model finishes responding | + +All flags are repeatable — pass multiple to register multiple hooks. + +```bash +# Add a session-start hook +$ docker agent run agent.yaml --hook-session-start "./scripts/setup-env.sh" + +# Combine multiple hooks +$ docker agent run agent.yaml \ + --hook-pre-tool-use "./scripts/validate.sh" \ + --hook-post-tool-use "./scripts/log.sh" + +# Add hooks to an agent from a registry +$ docker agent run agentcatalog/coder \ + --hook-pre-tool-use "./audit.sh" +``` + +> [!NOTE] +> **Merging behavior** +> +> CLI hooks are **appended** to any hooks already defined in the agent's YAML config. They don't replace existing hooks. Pre/post-tool-use hooks added via CLI match all tools (equivalent to `matcher: "*"`). diff --git a/_vendor/github.com/docker/docker-agent/docs/configuration/models/index.md b/_vendor/github.com/docker/docker-agent/docs/configuration/models/index.md new file mode 100644 index 0000000000..086a0562c5 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/configuration/models/index.md @@ -0,0 +1,531 @@ +--- +title: "Model Configuration" +description: "Complete reference for defining models with providers, parameters, and reasoning settings." +keywords: docker agent, ai agents, configuration, yaml, model configuration +linkTitle: "Model Config" +weight: 40 +--- + +_Complete reference for defining models with providers, parameters, and reasoning settings._ + +## Full Schema + + +```yaml +models: + model_name: + first_available: [list] # Optional: candidate model refs, tried in order by available credentials. + # Mutually exclusive with other model settings. + provider: string # Required unless using first_available. One of: openai, anthropic, google, amazon-bedrock, + # dmr, mistral, xai, nebius, minimax, baseten, ovhcloud, groq, fireworks, deepseek, cerebras, together, huggingface, moonshot, vercel, cloudflare-workers-ai, cloudflare-ai-gateway, requesty, openrouter, + # azure, ollama, github-copilot, or a named provider defined + # under the top-level `providers:` section. + model: string # Required: model identifier + temperature: float # Optional: 0.0–2.0 (provider-dependent; e.g. Anthropic caps at 1.0) + max_tokens: integer # Optional: response length limit + top_p: float # Optional: 0.0–1.0 + frequency_penalty: float # Optional: -2.0–2.0 + presence_penalty: float # Optional: -2.0–2.0 + base_url: string # Optional: custom API endpoint + token_key: string # Optional: env var for API token + thinking_budget: string|int # Optional: reasoning effort + task_budget: int|object # Optional: total task token budget (Anthropic) + parallel_tool_calls: boolean # Optional: allow parallel tool calls + track_usage: boolean # Optional: track token usage + routing: [list] # Optional: rule-based model routing + capabilities: # Optional: override attachment capabilities + image: boolean # Optional: whether the model accepts image attachments + pdf: boolean # Optional: whether the model accepts PDF attachments + provider_opts: # Optional: provider-specific options + key: value + title_model: string # Optional: model used for session-title generation + compaction_model: string # Optional: model used for session-compaction (summary generation) + bypass_models_gateway: boolean # Optional: skip the models gateway for this model +``` + +## Properties Reference + +| Property | Type | Required | Description | +| --------------------- | ---------- | -------- | ------------------------------------------------------------------------------------- | +| `first_available` | array | ✗ | Candidate model references tried in order; selects the first whose credentials are configured. Mutually exclusive with other model settings. | +| `provider` | string | ✓/✗ | Required for regular model definitions; omitted for `first_available` selectors. Provider: `openai`, `anthropic`, `google`, `amazon-bedrock`, `dmr`, `mistral`, `xai`, `nebius`, `minimax`, `baseten`, `ovhcloud`, `groq`, `fireworks`, `deepseek`, `cerebras`, `together`, `huggingface`, `moonshot`, `vercel`, `cloudflare-workers-ai`, `cloudflare-ai-gateway`, `requesty`, `openrouter`, `azure`, `ollama`, `github-copilot`, or any [named provider](../../providers/custom/index.md). | +| `model` | string | ✓/✗ | Required for regular model definitions; omitted for `first_available` selectors. Model name (e.g., `gpt-4o`, `claude-sonnet-4-5`, `gemini-3.5-flash`) | +| `temperature` | float | ✗ | Sampling randomness. Range is provider-dependent — typically `0.0–2.0` (Anthropic caps at `1.0`). `0.0` is deterministic. | +| `max_tokens` | int | ✗ | Maximum response length in tokens | +| `top_p` | float | ✗ | Nucleus sampling threshold (`0.0–1.0`) | +| `frequency_penalty` | float | ✗ | Penalize repeated tokens (`-2.0–2.0`) | +| `presence_penalty` | float | ✗ | Encourage topic diversity (`-2.0–2.0`) | +| `base_url` | string | ✗ | Custom API endpoint URL (for self-hosted or proxied endpoints) | +| `token_key` | string | ✗ | Environment variable name containing the API token (overrides provider default) | +| `thinking_budget` | string/int | ✗ | Reasoning effort control | +| `task_budget` | int/object | ✗ | Total token budget for an agentic task (forwarded to Anthropic; see [Task Budget](#task-budget)). | +| `parallel_tool_calls` | boolean | ✗ | Allow model to call multiple tools at once | +| `track_usage` | boolean | ✗ | Track and report token usage for this model | +| `routing` | array | ✗ | Rule-based routing to different models. See [Model Routing](../routing/index.md). | +| `capabilities` | object | ✗ | Override attachment capabilities for this model. See [Attachment Capability Overrides](#attachment-capability-overrides). | +| `provider_opts` | object | ✗ | Provider-specific options (see provider pages) | +| `title_model` | string | ✗ | Model used for session-title generation. Can be a named model from the `models:` section or an inline `provider/model` string. When omitted, the agent's primary model generates titles. Cannot be combined with `first_available`. | +| `compaction_model` | string | ✗ | Model used for session compaction (summary generation). Can be a named model or an inline `provider/model` string. When omitted, the primary model compacts. Cannot be combined with `first_available`. See [Delegating Session Compaction](#delegating-session-compaction). | +| `bypass_models_gateway` | boolean | ✗ | When `true`, this model connects directly to its provider even when a models gateway (`--models-gateway` / `CAGENT_MODELS_GATEWAY`) is configured. See [Gateway Bypass](#gateway-bypass). | + +## Attachment Capability Overrides + +For custom OpenAI-compatible providers, local models (Ollama, DMR), and any +model the built-in catalogue does not describe, docker-agent cannot +auto-detect whether the endpoint accepts image or PDF attachments. When the +model is absent from the catalogue, docker-agent logs a diagnostic and falls +back to text-only, silently dropping attachments. + +Declare `capabilities` to make the model's attachment support authoritative +and skip the catalogue lookup entirely: + +```yaml +models: + llava-local: + provider: ollama + model: llava + capabilities: + image: true # accepts image attachments + pdf: false # does not accept PDFs + + proxy-vision: + provider: vision-proxy + model: gpt-4o + capabilities: + image: true + pdf: true +``` + +| Field | Type | Description | +| ---------------------- | ------- | ------------------------------------------------- | +| `capabilities.image` | boolean | Whether the model accepts image attachments | +| `capabilities.pdf` | boolean | Whether the model accepts PDF attachments | + +The flags must match what the endpoint actually accepts. Claiming a modality +that the endpoint does not support leads to a provider-side API error. When +`capabilities` is omitted the behaviour is unchanged (catalogue lookup then +conservative text-only fallback). + +See [`examples/capability-overrides.yaml`](https://github.com/docker/docker-agent/blob/main/examples/capability-overrides.yaml) for a complete example. + +## Delegating Session-Title Generation + +The `title_model` field lets a heavyweight primary model hand off the cheap +title-generation call to a smaller, faster model: + +```yaml +model: anthropic/claude-opus-4-7 +title_model: anthropic/claude-haiku-4-5 +``` + +The value can be a named entry from the `models` stanza or an inline +`provider/model` string. When omitted, the agent's primary model generates +titles. + +> [!WARNING] +> **Constraint** +> +> `title_model` cannot be combined with `first_available` model selection — the combination is rejected at validation time. + +## Delegating Session Compaction + +The `compaction_model` field lets a heavyweight primary model hand off the expensive +compaction (summary generation) call to a smaller, faster model: + +```yaml +models: + primary: + provider: anthropic + model: claude-sonnet-4-5 + compaction_model: fast + fast: + provider: anthropic + model: claude-haiku-4-5 +``` + +The value can be a named entry from the `models` stanza or an inline +`provider/model` string. When omitted, the primary model compacts. + +If the compaction model has a **smaller context window** than the primary, +docker-agent triggers compaction against the smaller window so the summary +call can always ingest the full conversation. Pair the primary with a +compaction model whose window is at least as large to keep the proactive +trigger aligned with the primary's window. + +> [!WARNING] +> **Constraint** +> +> `compaction_model` cannot be combined with `first_available` model selection — the combination is rejected at validation time. + +See [`examples/compaction_model.yaml`](https://github.com/docker/docker-agent/blob/main/examples/compaction_model.yaml) for a complete example. + +## Gateway Bypass + +When a models gateway (`--models-gateway` / `CAGENT_MODELS_GATEWAY`) is configured, +all models route through it by default. Set `bypass_models_gateway: true` on a +specific model to make it connect directly to its provider instead: + +```yaml +models: + gateway-model: + provider: openai + model: gpt-5 + + direct-model: + provider: anthropic + model: claude-sonnet-4-5 + bypass_models_gateway: true # uses ANTHROPIC_API_KEY directly +``` + +The bypassed model authenticates with the provider's own credentials +(`OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `token_key`, etc.) rather than the +gateway's short-lived token. The rest of the agent's models continue routing +through the gateway as before. + +Bypass is propagated transparently through router models: a bypass-flagged routing +model passes the flag to all of its routed targets automatically. + +> [!WARNING] +> **Security note** +> +> On an untrusted config, a malicious `base_url` combined with `bypass_models_gateway: true` could route provider credentials to an attacker-controlled endpoint. Only enable this on configs you control. + +> [!WARNING] +> **Constraint** +> +> `bypass_models_gateway: true` cannot be combined with `first_available` — the combination is rejected at validation time. + +See [`examples/bypass_models_gateway.yaml`](https://github.com/docker/docker-agent/blob/main/examples/bypass_models_gateway.yaml) for a complete example. + +## First Available Models + +Use `first_available` when the same agent should work with whichever provider credentials are available in the current environment. docker-agent checks the candidates in order at load time and replaces the selector with the first candidate whose required environment variables are configured. + +```yaml +models: + smart: + first_available: + - anthropic/claude-sonnet-4-6 + - openai/gpt-5 + - google/gemini-3.5-flash + - dmr/ai/qwen3 # local fallback; no API key required + +agents: + root: + model: smart + instruction: You are a helpful assistant. +``` + +Candidates can be inline `provider/model` references or names from the same `models:` section. Local providers such as `dmr` and `ollama` do not require credentials, so they are useful as final fallbacks. + +If none of the candidates has credentials configured, docker-agent reports the missing environment variables grouped by candidate. You only need to configure one group of credentials, not every provider in the list. + +A `first_available` model is only a selector. It cannot be combined with `provider`, `model`, `routing`, `token_key`, budgets, sampling options, or other model settings. Put those settings on named candidate models instead: + +```yaml +models: + claude: + provider: anthropic + model: claude-sonnet-4-6 + max_tokens: 64000 + + gpt: + provider: openai + model: gpt-5 + thinking_budget: low + + smart: + first_available: + - claude + - gpt + - dmr/ai/qwen3 +``` + +See [`examples/first_available.yaml`](https://github.com/docker/docker-agent/blob/main/examples/first_available.yaml) for a complete example. + +## Thinking Budget + +Control how much reasoning the model does before responding. This varies by provider: + +### OpenAI + +Uses effort levels as strings: + +```yaml +models: + gpt: + provider: openai + model: gpt-5 + thinking_budget: low # minimal | low | medium | high | xhigh +``` + +### Anthropic + +Uses an integer token budget (1024–32768), or — on adaptive-capable models (Opus 4.6+) — `adaptive`, `adaptive/`, or a bare effort level: + +```yaml +models: + claude: + provider: anthropic + model: claude-sonnet-4-5 + thinking_budget: 16384 # must be < max_tokens + + opus: + provider: anthropic + model: claude-opus-4-6 + thinking_budget: adaptive # or adaptive/, or low | medium | high | xhigh | max +``` + +### Google Gemini 2.5 + +Uses an integer token budget. `0` disables, `-1` lets the model decide: + +```yaml +models: + gemini: + provider: google + model: gemini-2.5-flash + thinking_budget: -1 # dynamic (default) +``` + +### Google Gemini 3 + +Uses effort levels like OpenAI: + +```yaml +models: + gemini3: + provider: google + model: gemini-3-flash + thinking_budget: medium # minimal | low | medium | high +``` + +### Disabling Thinking + +Works for all providers: + +```yaml +thinking_budget: none # or 0 +``` + +Models that always reason (OpenAI o-series, gpt-5, Gemini 3) fall back to the API default and still reason internally. + +See the [Thinking / Reasoning guide](../../guides/thinking/index.md) for per-provider details, including AWS Bedrock and Docker Model Runner. + +## Task Budget + +**Anthropic-only.** + +`task_budget` caps the **total** number of tokens the model may spend across a +multi-step agentic task — combining thinking, tool calls, and final output +tokens. It lets long-running agents self-regulate effort without having to +choose a tight per-call `max_tokens`. + +It is forwarded to Anthropic's +[`output_config.task_budget`](https://platform.claude.com/docs/en/about-claude/models/whats-new-claude-4-7) +request field. docker-agent automatically attaches the required +`task-budgets-2026-03-13` beta header whenever this field is set. + +You can configure `task_budget` on **any** Claude model — docker-agent never +gates it by model name. At the time of writing only **Claude Opus 4.7** +actually honors the field; other Claude models will reject requests that +include it. Check the Anthropic release notes linked above for the current +list of supported models. + +### Integer shorthand + +```yaml +models: + opus: + provider: anthropic + model: claude-opus-4-7 + task_budget: 128000 # total tokens for the whole task + thinking_budget: adaptive # works nicely together +``` + +### Object form + +Equivalent, and forward-compatible with future budget types: + +```yaml +models: + opus: + provider: anthropic + model: claude-opus-4-7 + task_budget: + type: tokens # only "tokens" is supported today + total: 128000 +``` + +Setting `task_budget: 0` (or omitting the field) disables the feature — the +model falls back to the provider's default behavior. + +Like other inheritable model settings, `task_budget` can also be declared on a +[provider definition](../../providers/custom/index.md) and is +inherited by every model that references that provider. + +See [`examples/task_budget.yaml`](https://github.com/docker/docker-agent/blob/main/examples/task_budget.yaml) for a complete example. + +## Interleaved Thinking + +For Anthropic and Bedrock Claude models, interleaved thinking allows tool calls during model reasoning. It is auto-enabled whenever a thinking budget is configured: + +```yaml +models: + claude: + provider: anthropic + model: claude-sonnet-4-5 + thinking_budget: 8192 + # interleaved_thinking is auto-enabled when thinking_budget is set + provider_opts: + interleaved_thinking: false # disable if needed +``` + +## Thinking Display (Anthropic) + +For Anthropic Claude models, `thinking_display` controls whether thinking blocks are returned in responses when thinking is enabled. Newer Claude models (Opus 4.7+, Fable 5) hide thinking content by default (`omitted`); docker-agent requests `summarized` thinking by default for adaptive/effort-based budgets so reasoning stays visible. Set this provider option to override: + +```yaml +models: + opus-4-7: + provider: anthropic + model: claude-opus-4-7 + thinking_budget: adaptive + provider_opts: + thinking_display: omitted # "summarized", "display", or "omitted" +``` + +See the [Anthropic provider page](../../providers/anthropic/index.md#thinking-display) for details. + +## Custom HTTP Headers + +For OpenAI-compatible providers (`openai`, `github-copilot`, `mistral`, `xai`, +`nebius`, `minimax`, `baseten`, `ovhcloud`, `groq`, `fireworks`, `deepseek`, `cerebras`, `together`, `huggingface`, `moonshot`, `vercel`, `cloudflare-workers-ai`, `cloudflare-ai-gateway`, `requesty`, `openrouter`, `ollama`, and any custom provider using the OpenAI API), +`provider_opts.http_headers` adds arbitrary HTTP headers to every outgoing +request: + +```yaml +models: + my_model: + provider: openai + model: gpt-4o + provider_opts: + http_headers: + X-Request-Source: docker-agent + X-Tenant-Id: my-team +``` + +Header names are matched case-insensitively. The `github-copilot` provider +automatically sets `Copilot-Integration-Id: copilot-developer-cli` — see the +[GitHub Copilot provider page](../../providers/github-copilot/index.md) +for details. + +## Examples by Provider + +```yaml +models: + # OpenAI + gpt: + provider: openai + model: gpt-5 + + # Anthropic + claude: + provider: anthropic + model: claude-sonnet-4-5 + max_tokens: 64000 + + # Google Gemini + gemini: + provider: google + model: gemini-3.5-flash + temperature: 0.5 + + # AWS Bedrock + bedrock: + provider: amazon-bedrock + model: global.anthropic.claude-sonnet-4-5-20250929-v1:0 + provider_opts: + region: us-east-1 + + # OpenRouter + openrouter: + provider: openrouter + model: meta-llama/llama-3.3-70b-instruct + + # Docker Model Runner (local) + local: + provider: dmr + model: ai/qwen3 + max_tokens: 8192 +``` + +For detailed provider setup, see the [Model Providers](../../providers/overview/index.md) section. + +## Custom Endpoints + +Use `base_url` to point to custom or self-hosted endpoints: + +```yaml +models: + # Azure OpenAI + azure_gpt: + provider: openai + model: gpt-4o + base_url: https://my-resource.openai.azure.com/openai/deployments/gpt-4o + token_key: AZURE_OPENAI_API_KEY + + # Self-hosted vLLM + local_llama: + provider: openai # vLLM is OpenAI-compatible + model: meta-llama/Llama-3.2-3B-Instruct + base_url: http://localhost:8000/v1 + + # Proxy or gateway + proxied: + provider: openai + model: gpt-4o + base_url: https://proxy.internal.company.com/openai/v1 + token_key: INTERNAL_API_KEY +``` + +The `model` and `base_url` fields accept `${env.VAR}` (or `${VAR}`) references, which are substituted from the environment when the model is loaded. This keeps the model id or endpoint out of the config when it is supplied by the environment, e.g. a Docker Compose / DMR setup: + +```yaml +models: + nemotron3: + provider: dmr + model: "${env.NEMOTRON3_MODEL}" + base_url: "${env.DMR_BASE_URL}" +``` + +See [Variable Expansion in Config Fields](../overview/index.md#variable-expansion-in-config-fields) for the full set of fields and supported syntaxes. + +See [Local Models](../../providers/local/index.md) for more examples of custom endpoints. + +## Inheriting from Provider Definitions + +Models can reference a named provider to inherit shared defaults. Model-level settings always take precedence: + +```yaml +providers: + my_anthropic: + provider: anthropic + token_key: MY_ANTHROPIC_KEY + max_tokens: 16384 + thinking_budget: 8192 + temperature: 0.5 + +models: + claude: + provider: my_anthropic + model: claude-sonnet-4-5 + # Inherits max_tokens, thinking_budget, temperature from provider + + claude_fast: + provider: my_anthropic + model: claude-haiku-4-5 + thinking_budget: 1024 # Overrides provider default +``` + +See [Provider Definitions](../../providers/custom/index.md) for the full list of inheritable properties. diff --git a/_vendor/github.com/docker/docker-agent/docs/configuration/overview/index.md b/_vendor/github.com/docker/docker-agent/docs/configuration/overview/index.md new file mode 100644 index 0000000000..104e7f0130 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/configuration/overview/index.md @@ -0,0 +1,507 @@ +--- +title: "Configuration Overview" +description: "docker-agent uses YAML or HCL configuration files to define agents, models, tools, and their relationships." +keywords: docker agent, ai agents, configuration, yaml, configuration overview +linkTitle: "Overview" +weight: 10 +aliases: + - /ai/docker-agent/reference/config/ +--- + +_docker-agent uses YAML or HCL configuration files to define agents, models, tools, and their relationships._ + +## File Structure + +A docker-agent config can be written in YAML or HCL. The examples on this page use YAML; see [HCL Configuration](../hcl/index.md) for the block-based HCL syntax. + +A docker-agent config has these main sections: + +```bash +# 1. Version — configuration schema version (optional but recommended) +version: 10 + +# 2. Metadata — optional agent metadata for distribution +metadata: + author: my-org + description: My helpful agent + version: "1.0.0" + +# 3. Models — define AI models with their parameters +models: + claude: + provider: anthropic + model: claude-sonnet-4-5 + max_tokens: 64000 + +# 4. Agents — define AI agents with their behavior +agents: + root: + model: claude + description: A helpful assistant + instruction: You are helpful. + toolsets: + - type: think + +# 5. RAG — define retrieval-augmented generation sources (optional) +rag: + docs: + docs: ["./docs"] + strategies: + - type: chunked-embeddings + embedding_model: openai/text-embedding-3-small + +# 6. MCPs — reusable MCP server definitions (optional) +mcps: + github: + remote: + url: https://api.githubcopilot.com/mcp + transport_type: sse + +# 7. Providers — optional reusable provider definitions +providers: + my_provider: + provider: anthropic # or openai (default), google, amazon-bedrock, etc. + token_key: MY_API_KEY + max_tokens: 16384 + +# 8. Permissions — agent-level tool permission rules (optional) +# For user-wide global permissions, see ~/.config/cagent/config.yaml +permissions: + allow: ["read_*"] + deny: ["shell:cmd=sudo*"] + +# 9. Commands & Skills — reusable, named groups shared across agents (optional) +commands: + ci: + deploy: "Deploy the application" +skills: + base: [local, git] + +# 10. Toolsets — reusable, named toolset definitions shared across agents (optional) +toolsets: + fs: + type: filesystem +``` + +## Minimal Config + +The simplest possible configuration — a single agent with an inline model: + +```yaml +agents: + root: + model: openai/gpt-5 + description: A helpful assistant + instruction: You are a helpful assistant. +``` + +The same config in HCL: + +```hcl +agent "root" { + model = "openai/gpt-5" + description = "A helpful assistant" + instruction = "You are a helpful assistant." +} +``` + +## Inline vs Named Models + +Models can be referenced inline or defined in the `models` section: + +- **Inline** — quick and simple. Use `provider/model` syntax directly: `model: openai/gpt-5` +- **Named** — full control over parameters, reusable across agents: `model: my_claude` + +## Config Sections + +- [**HCL Configuration**](../hcl/index.md) — write the same agent schema in HCL using labeled blocks, heredocs, and block-based tool definitions. +- [**Agent Config**](../agents/index.md) — all agent properties: model, instruction, tools, sub-agents, hooks, and more. +- [**Model Config**](../models/index.md) — provider setup, parameters, thinking budget, and provider-specific options. +- [**Tool Config**](../tools/index.md) — built-in tools, MCP tools, Docker MCP, LSP, API tools, and tool filtering. + +## Advanced Configuration + +- [**Hooks**](../hooks/index.md) — run shell commands at lifecycle events like tool calls and session start/end. +- [**Permissions**](../permissions/index.md) — control which tools auto-approve, require confirmation, or are blocked. +- [**Sandbox Mode**](../sandbox/index.md) — run agents in an isolated Docker container for security. +- [**Structured Output**](../structured-output/index.md) — constrain agent responses to match a specific JSON schema. + +## Environment Variables + +API keys and secrets are read from environment variables — never stored in config files. See [Managing Secrets](../../guides/secrets/index.md) for all the ways to provide credentials (env files, Docker Compose secrets, macOS Keychain, `pass`): + +| Variable | Provider | +| -------------------------- | --------------------------------------------------- | +| `OPENAI_API_KEY` | OpenAI | +| `ANTHROPIC_API_KEY` | Anthropic | +| `GOOGLE_API_KEY` / `GEMINI_API_KEY` | Google Gemini | +| `MISTRAL_API_KEY` | Mistral | +| `XAI_API_KEY` | xAI | +| `NEBIUS_API_KEY` | Nebius | +| `MINIMAX_API_KEY` | MiniMax | +| `REQUESTY_API_KEY` | Requesty | +| `OPENROUTER_API_KEY` | OpenRouter | +| `GITHUB_TOKEN` | GitHub Copilot (PAT with `copilot` scope) | +| `AZURE_API_KEY` | Azure OpenAI (override with `token_key`) | +| `AWS_BEARER_TOKEN_BEDROCK` | AWS Bedrock (or the standard AWS credentials chain) | + +**Tool Auto-Installation:** + +| Variable | Description | +| --------------------- | --------------------------------------------------------------- | +| `DOCKER_AGENT_AUTO_INSTALL` | Set to `false` to disable automatic tool installation | +| `DOCKER_AGENT_TOOLS_DIR` | Override the base directory for installed tools (default: `~/.cagent/tools/`) | + +**Runtime overrides:** + +| Variable | Description | +| ----------------------------------- | ---------------------------------------------------------------------------------------------------- | +| `DOCKER_AGENT_DEFAULT_MODEL` | Default model used when none is specified, in `provider/model` form (e.g. `openai/gpt-5`). | +| `DOCKER_AGENT_MODELS_GATEWAY` | Route model traffic through a gateway. Equivalent to the `--models-gateway` flag. | +| `DOCKER_AGENT_HIDE_TELEMETRY_BANNER`| Set to `1` to suppress the first-run telemetry notice. | +| `DOCKER_AGENT_AUTO_UPDATE` | Set to a truthy value (`1`, `true`, `yes`, `on`) to let standalone release binaries self-update before running. See [Optional Self-Updates](../../getting-started/installation/index.md#optional-self-updates). | + +> [!NOTE] +> **Legacy `CAGENT_*` aliases** +> +> The same variables are also accepted with the legacy `CAGENT_` prefix (e.g. `CAGENT_DEFAULT_MODEL`, `CAGENT_MODELS_GATEWAY`, `CAGENT_HIDE_TELEMETRY_BANNER`) for backward compatibility. Prefer the `DOCKER_AGENT_*` form in new setups. + +> [!IMPORTANT] +> Model references are case-sensitive: `openai/gpt-5` is not the same as `openai/GPT-5`. + +## Variable Expansion in Config Fields + +docker-agent expands `${env.VAR}` references in many config fields. This is the **canonical syntax everywhere** — prefer it for every field. Two engines back it: a full JavaScript evaluator for prompt/HTTP fields (where you also get defaults, ternaries, and tool calls), and a simpler path expander for filesystem/env fields (which additionally accepts the legacy `$VAR` / `${VAR}` / `~` shell forms). Picking `${env.VAR}` everywhere always works; the one caveat is that the path expander does not evaluate richer JS expressions. Using a shell-style `$VAR` in a JS-templated field is currently a silent no-op, so the literal string is passed through. Tracking issue: [#2615](https://github.com/docker/docker-agent/issues/2615). + +### JavaScript template literals — `${env.VAR}` + +Used wherever the agent prompt or HTTP traffic is templated. Backed by a JS evaluator, so you also get `||` defaults, ternaries, and tool calls (`${tool({...})}`). + +Applies to: + +- `agents..description` +- `agents..welcome_message` +- `agents..instruction` +- `agents..commands.*` (string form and `instruction:` field) +- `toolsets[*].instruction` +- `toolsets[*].headers` and `toolsets[*].remote.headers` (MCP, A2A, OpenAPI, fetch, API) + +For `api` toolsets, `api_config.endpoint` and `api_config.headers` are also rendered through the JS expander (the same syntax applies). + +```yaml +agents: + root: + description: "Assistant for ${env.USER || 'guest'}" + commands: + deploy: "Deploy ${env.PROJECT_NAME || 'app'} to ${env.ENV || 'staging'}" + toolsets: + - type: openapi + url: https://api.example.com + headers: + Authorization: "Bearer ${env.INTERNAL_TOKEN}" +``` + +Undefined variables expand to the empty string. + +### Path & env fields — `${env.VAR}` (canonical), `$VAR` / `${VAR}` / `~` (aliases) + +Used for filesystem paths and process environment values. Backed by `os.ExpandEnv` plus tilde expansion against the current user's home directory. The canonical `${env.VAR}` form is accepted here too, so a single syntax works across every field; the bare `$VAR` / `${VAR}` shell forms remain supported as aliases. + +Applies to: + +- `agents..toolsets[*].working_dir` (MCP, LSP) +- `agents..toolsets[*].path` (memory, tasks) +- `agents..toolsets[*].env` values (MCP, shell, script, LSP) +- The `~` prefix is also accepted in any path-like field documented as such. + +```yaml +agents: + root: + toolsets: + - type: memory + path: "~/notes/${env.PROJECT}/memory.db" + - type: mcp + command: my-server + working_dir: "${env.HOME}/work" +``` + +Unlike the JS-templated fields above, these accept only a plain variable reference: richer JS expressions (e.g. `${env.VAR || 'default'}`) are **not** evaluated here, and the legacy `$VAR` / `${VAR}` forms keep working for backward compatibility. + +Model definitions follow the same rule. The `models..model` and `models..base_url` fields are expanded when the provider is built, accepting both `${env.VAR}` and `${VAR}`. This is useful when the model id or endpoint is injected by the environment (for example a Docker Compose / DMR setup that exports the model reference as a variable): + +```yaml +models: + nemotron3: + provider: dmr + model: "${env.NEMOTRON3_MODEL}" # resolved from the environment at load time + base_url: "${DMR_BASE_URL}" # ${VAR} is accepted as well +``` + +`token_key` is **not** expanded: it already names the environment variable that holds the API token, so its value is used as a key rather than substituted. An unset variable in `model` or `base_url` is reported as an error instead of dialing with an empty value. + +### Quick reference + +| Field | `${env.X}` | `$X` / `${X}` | `~` | +| --------------------------------------------- | :--------: | :-----------: | :-: | +| `description`, `welcome_message` | ✓ | ✗ | ✗ | +| `instruction` (agent and toolset) | ✓ | ✗ | ✗ | +| `commands.*` | ✓ | ✗ | ✗ | +| `headers`, `remote.headers`, `api_config.headers` | ✓ | ✗ | ✗ | +| `models.*.model`, `models.*.base_url` | ✓ | ✓ | ✗ | +| `working_dir`, `path` | ✓ | ✓ | ✓ | +| `env` values | ✓ | ✓ | ✗ | + +The `~` prefix is meaningful only in path-like fields (`working_dir`, `path`). + +Prefer `${env.X}` everywhere. The bare `$X` / `${X}` and `~` forms are accepted only in path and `env` value fields, where they remain supported for backward compatibility. + +## Validation + +docker-agent validates your configuration at startup: + +- Local `sub_agents` must reference agents defined in the config (external OCI references like `agentcatalog/pirate` are pulled from registries automatically; pin them to a digest with `@sha256:…` to avoid a per-run registry lookup) +- Named model references must exist in the `models` section +- Provider names must be valid (`openai`, `anthropic`, `google`, `dmr`, etc.) +- Required environment variables (API keys) must be set +- Tool-specific fields are validated (e.g., `path` is only valid for `memory`) + +## JSON Schema + +For YAML editor autocompletion and validation, use the [Docker Agent JSON Schema](https://github.com/docker/docker-agent/blob/main/agent-schema.json). Add this to the top of your YAML file: + +```bash +# yaml-language-server: $schema=https://raw.githubusercontent.com/docker/docker-agent/main/agent-schema.json +``` + +## Config Versioning + +docker-agent configs are versioned. The current version is `10`. Add the version at the top of your config: + +```yaml +version: 10 + +agents: + root: + model: openai/gpt-5 + # ... +``` + +When you load an older config, docker-agent automatically migrates it to the latest schema. It's recommended to include the version to ensure consistent behavior. + +## Metadata Section + +Optional metadata for agent distribution via OCI registries: + +```yaml +metadata: + author: my-org + license: Apache-2.0 + description: A helpful coding assistant + readme: | # Displayed in registries + This agent helps with coding tasks. + version: "1.0.0" + tags: [coding, review] +``` + +| Field | Description | +| ------------- | ------------------------------------------ | +| `author` | Author or organization name | +| `license` | License identifier (e.g., Apache-2.0, MIT) | +| `description` | Short description for the agent | +| `readme` | Longer markdown description | +| `version` | Semantic version string | +| `tags` | Tags for categorization and discovery | + +See [Agent Distribution](../../concepts/distribution/index.md) for publishing agents to registries. + +## Reusable MCP Servers (`mcps:`) + +The top-level `mcps:` section defines named MCP server configurations that agents can reference with `toolsets: [{type: mcp, ref: }]`. This avoids repeating the same command / URL / headers across agents and keeps credentials in one place. + +```yaml +mcps: + github: + remote: + url: https://api.githubcopilot.com/mcp + transport_type: sse + playwright: + command: npx + args: ["-y", "@modelcontextprotocol/server-playwright"] + +agents: + root: + model: openai/gpt-5 + toolsets: + - type: mcp + ref: github # reuse the definition above + - type: mcp + ref: playwright +``` + +An `mcps` entry accepts every field a regular `type: mcp` toolset accepts (command/args/env, `remote` with `url`/`transport_type`/`headers`/`oauth`, `tools` filter, `instruction`, `defer`, …) — the `type: mcp` is implicit. See the [Tool Config](../tools/index.md) page for all options and the [Remote MCP Servers](../../features/remote-mcp/index.md) guide for remote setups. + +## Reusable Toolsets (`toolsets:`) + +The top-level `toolsets:` map defines named toolset configurations that agents can reference by name through `use_toolsets:`. This avoids repeating the same toolset definition across multiple agents — the same pattern as `mcps:` for MCP servers and `commands:` / `skills:` for reusable prompt groups. + +Any toolset type is supported, including ones that reference MCP or RAG definitions. Shared toolsets are resolved before the MCP/RAG pass, so they can contain `{type: mcp, ref: }` references. + +```yaml +toolsets: + fs: # a named shared toolset + type: filesystem + docs: + type: fetch + allowed_domains: + - docker.com + +agents: + root: + model: openai/gpt-5 + # Pull in shared toolsets by name; inline toolsets come first. + use_toolsets: [fs, docs] + toolsets: + - type: think + + reviewer: + model: openai/gpt-5 + # Reuse the same filesystem toolset without copying its definition. + use_toolsets: [fs] +``` + +Inline `toolsets:` entries listed directly on the agent take precedence in ordering (they come first) and are always included alongside referenced ones. + +See [`examples/shared-toolsets.yaml`](https://github.com/docker/docker-agent/blob/main/examples/shared-toolsets.yaml) for a complete example. + +## Reusable Commands & Skills (`commands:` / `skills:`) + +The top-level `commands:` and `skills:` sections define named, reusable groups that agents pull in by name through `use_commands:` / `use_skills:`. This avoids repeating the same command set or skill configuration across agents. Each group value uses the exact same format as an agent's own `commands` / `skills` field. + +Referenced groups are merged into the agent during config loading. An agent's own inline `commands` / `skills` entries take precedence on name conflicts. + +```yaml +commands: + ci: # a named command group + deploy: "Deploy the application" + test: "Run the test suite" +skills: + base: [local, git] # a named skill group + +agents: + root: + model: openai/gpt-5 + use_commands: [ci] # reuse the "ci" command group + use_skills: [base] # reuse the "base" skill group + commands: + lint: "Run the linter" # inline command, merged in (wins on conflict) + reviewer: + model: openai/gpt-5 + use_commands: [ci] # same group, reused without duplication +``` + +See [`examples/shared-commands-skills.yaml`](https://github.com/docker/docker-agent/blob/main/examples/shared-commands-skills.yaml) for a complete example. + +## Custom Providers Section + +Define reusable provider configurations with shared defaults. Providers can wrap any provider type — not just OpenAI-compatible endpoints: + +```yaml +providers: + # OpenAI-compatible custom endpoint + azure: + api_type: openai_chatcompletions + base_url: https://my-resource.openai.azure.com/openai/deployments/gpt-4o + token_key: AZURE_OPENAI_API_KEY + + # Anthropic with shared model defaults + team_anthropic: + provider: anthropic + token_key: TEAM_ANTHROPIC_KEY + max_tokens: 32768 + thinking_budget: 16384 + +models: + azure_gpt: + provider: azure + model: gpt-4o + + claude: + provider: team_anthropic + model: claude-sonnet-4-5 + # Inherits max_tokens, thinking_budget from provider + +agents: + root: + model: claude +``` + +| Field | Description | +| --------------------- | ---------------------------------------------------------------------------------------- | +| `provider` | Underlying provider type: `openai` (default), `anthropic`, `google`, `amazon-bedrock`, etc. | +| `api_type` | API schema: `openai_chatcompletions` (default) or `openai_responses`. OpenAI-only. | +| `base_url` | Base URL for the API endpoint. Required for OpenAI-compatible providers. | +| `token_key` | Environment variable name for the API token. | +| `temperature` | Default sampling temperature. | +| `max_tokens` | Default maximum response tokens. | +| `thinking_budget` | Default reasoning effort/budget. | +| `task_budget` | Default total token budget for an agentic task (Anthropic; honored by Claude Opus 4.7 today). | +| `top_p` | Default top-p sampling parameter. | +| `frequency_penalty` | Default frequency penalty. | +| `presence_penalty` | Default presence penalty. | +| `parallel_tool_calls` | Enable parallel tool calls by default. | +| `track_usage` | Track token usage by default. | +| `provider_opts` | Provider-specific options. | + +See [Provider Definitions](../../providers/custom/index.md) for more details. + +## Reusable YAML (anchors & aliases) + +YAML anchors (`&name`), aliases (`*name`) and merge keys (`<<`) are part of the YAML spec, and Docker Agent's config parser supports them. Use them to declare a value once and reuse it elsewhere in the same file, instead of copy-pasting the same block across agents. + +This complements the named-reuse sections above (`mcps:`, `commands:` / `skills:`, `providers:`). Reach for anchors when you want to share something those sections don't cover, such as an instruction string or a block of agent settings. + +Reuse a value verbatim with an anchor and an alias: + +```yaml +agents: + root: + model: anthropic/claude-sonnet-4-5 + description: Coordinator. + instruction: &house_rules | + You are part of the Acme engineering team. + Cite the files you looked at and keep changes minimal. + reviewer: + model: anthropic/claude-sonnet-4-5 + description: Reviews code changes. + instruction: *house_rules # the same instruction, declared once +``` + +Compose a block with a merge key (`<<`), then override individual fields: + +```yaml +agents: + reviewer: &specialist + model: anthropic/claude-sonnet-4-5 + description: Reviews code changes. + instruction: | + You are a meticulous software professional. + toolsets: + - type: filesystem + documenter: + <<: *specialist # inherit model, instruction, toolsets + description: Writes documentation. # then override one field +``` + +> [!WARNING] +> **Where anchors can live** +> +> An anchor has to sit on a real value inside a known section (for example a real agent, model, or MCP entry, as above). Parking anchors in a separate top-level block such as `defaults:` or `prompts:` fails, because the parser rejects unknown top-level keys. + +> [!WARNING] +> **Overriding merged keys** +> +> Overriding a key that a `<<` merge already set works only in the `agents:` section, as shown above. Every other section (`models:`, `mcps:`, `providers:`, `rag:`) is parsed strictly and reports the override as a duplicate key. There, use `<<` only to add new fields, or use the named-reuse sections above when you need per-entry overrides. + +Anchors are for static reuse within a single file, not dynamic values or cross-file composition. For environment-specific settings, see [Variable Expansion in Config Fields](#variable-expansion-in-config-fields), which substitutes `${env.VAR}` at load time. Templating tags such as `!include` are not acted on: the tag is ignored and its argument is kept as a plain string, so no other file is loaded. Circular aliases are not detected, so keep references acyclic. + +See [`examples/yaml-anchors.yaml`](https://github.com/docker/docker-agent/blob/main/examples/yaml-anchors.yaml) for a complete example. diff --git a/_vendor/github.com/docker/docker-agent/docs/configuration/permissions/index.md b/_vendor/github.com/docker/docker-agent/docs/configuration/permissions/index.md new file mode 100644 index 0000000000..e06f7cb736 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/configuration/permissions/index.md @@ -0,0 +1,242 @@ +--- +title: "Permissions" +description: "Control which tools can execute automatically, require confirmation, or are blocked entirely." +keywords: docker agent, ai agents, configuration, yaml, permissions +weight: 70 +--- + +_Control which tools can execute automatically, require confirmation, or are blocked entirely._ + +## Overview + +Permissions provide fine-grained control over tool execution. You can configure which tools are auto-approved (run without asking), which require user confirmation, and which are completely blocked. + +> [!NOTE] +> **Evaluation Order** +> +> Permissions are evaluated in this order: **Deny → Allow → Ask**. Deny patterns take priority, then allow patterns, and anything else defaults to asking for user confirmation. + +## Permission Levels + +Permissions can be defined at two levels: + +| Level | Location | Scope | +| ----- | -------- | ----- | +| **Agent-level** | Agent YAML config (`permissions:` section) | Applies to that specific agent config | +| **Global (user-level)** | `~/.config/cagent/config.yaml` under `settings.permissions` | Applies to every agent you run | + +Both levels use the same `allow`/`ask`/`deny` pattern syntax. When both are present, they are **merged** at startup -- patterns from both sources are combined into a single checker. See [Merging Behavior](#merging-behavior) for details. + +## Agent-Level Configuration + +```yaml +agents: + root: + model: openai/gpt-4o + description: Agent with permission controls + instruction: You are a helpful assistant. + +permissions: + # Auto-approve these tools (no confirmation needed) + allow: + - "read_file" + - "read_*" # Glob patterns + - "shell:cmd=ls*" # With argument matching + + # Always ask before running these tools, even if an allow pattern would match + ask: + - "shell:cmd=git push*" + - "write_file:path=/home/user/important/*" + + # Block these tools entirely + deny: + - "shell:cmd=sudo*" + - "shell:cmd=rm*-rf*" + - "dangerous_tool" +``` + +The three lists are evaluated in order `deny` → `allow` → `ask`, so an `ask:` entry lets you add a confirmation layer on top of an otherwise-allowed tool. + +## Global Permissions + +Global permissions let you enforce rules across **all** agents, regardless of which agent config you run. Define them in your user config file: + +```yaml +# ~/.config/cagent/config.yaml +settings: + permissions: + deny: + - "shell:cmd=sudo*" + - "shell:cmd=rm*-rf*" + allow: + - "read_*" + - "shell:cmd=ls*" + - "shell:cmd=cat*" +``` + +This is useful for setting personal safety guardrails that apply everywhere -- for example, always blocking `sudo` or always auto-approving read-only tools -- without relying on each agent config to include those rules. + +### Merging Behavior + +When both global and agent-level permissions are present, they are merged into a single set of patterns before evaluation. The merge works as follows: + +- **Deny patterns from either source block the tool.** A global deny cannot be overridden by an agent-level allow, and vice versa. +- **Allow patterns from either source auto-approve the tool** (as long as no deny pattern matches). +- **Ask patterns from either source force confirmation** (as long as no deny or allow pattern matches). + +The evaluation order remains the same after merging: **Deny > Allow > Ask > default Ask**. + +> [!TIP] +> **Example: Global deny + agent allow** +> +> If your global config denies `shell:cmd=sudo*` and an agent config allows `shell:cmd=sudo apt update`, the deny wins. Deny patterns always take priority regardless of source. + +## Pattern Syntax + +Permissions support glob-style patterns with optional argument matching: + +### Simple Patterns + +| Pattern | Matches | +| -------------- | ------------------------------ | +| `shell` | Exact match for `shell` tool | +| `read_*` | Any tool starting with `read_` | +| `mcp:github:*` | Any GitHub MCP tool | +| `*` | All tools | + +### Argument Matching + +You can match tools based on their argument values using `tool:arg=pattern` syntax: + +```yaml +permissions: + allow: + # Allow shell only when cmd starts with "ls" or "cat" + - "shell:cmd=ls*" + - "shell:cmd=cat*" + + # Allow edit_file only in specific directory + - "edit_file:path=/home/user/safe/*" + + deny: + # Block shell with sudo + - "shell:cmd=sudo*" + + # Block writes to system directories + - "write_file:path=/etc/*" + - "write_file:path=/usr/*" +``` + +### Multiple Argument Conditions + +Chain multiple argument conditions with colons. All conditions must match: + +```yaml +permissions: + allow: + # Allow shell with ls in current directory + - "shell:cmd=ls*:cwd=." + + deny: + # Block shell with rm -rf anywhere + - "shell:cmd=rm*:cmd=*-rf*" +``` + +## Glob Pattern Rules + +Patterns follow filepath.Match semantics with some extensions: + +- `*` — matches any sequence of characters (including spaces) +- `?` — matches any single character +- `[abc]` — matches any character in the set +- `[a-z]` — matches any character in the range + +Matching is **case-insensitive**. + +> [!TIP] +> **Trailing Wildcards** +> +> Trailing wildcards like `sudo*` match any characters including spaces, so `sudo*` matches `sudo rm -rf /`. + +## Decision Types + +| Decision | Behavior | +| --------- | --------------------------------------------------- | +| **Allow** | Tool executes immediately without user confirmation | +| **Ask** | User must confirm before tool executes (default) | +| **Deny** | Tool is blocked and returns an error to the agent | + +## Examples + +### Read-Only Agent + +Allow all read operations, block all writes: + +```yaml +permissions: + allow: + - "read_file" + - "read_multiple_files" + - "list_directory" + - "directory_tree" + - "search_files_content" + deny: + - "write_file" + - "edit_file" + - "shell" +``` + +### Safe Shell Agent + +Allow specific safe commands, block dangerous ones: + +```yaml +permissions: + allow: + - "shell:cmd=ls*" + - "shell:cmd=cat*" + - "shell:cmd=grep*" + - "shell:cmd=find*" + - "shell:cmd=head*" + - "shell:cmd=tail*" + - "shell:cmd=wc*" + deny: + - "shell:cmd=sudo*" + - "shell:cmd=rm*" + - "shell:cmd=mv*" + - "shell:cmd=chmod*" + - "shell:cmd=chown*" +``` + +### MCP Tool Permissions + +Control MCP tools by their qualified names: + +```yaml +permissions: + allow: + # Allow all GitHub read operations + - "mcp:github:get_*" + - "mcp:github:list_*" + - "mcp:github:search_*" + deny: + # Block destructive GitHub operations + - "mcp:github:delete_*" + - "mcp:github:close_*" +``` + +## Combining with Hooks + +Permissions work alongside [hooks](../hooks/index.md). The evaluation order is: + +1. Check **deny** patterns — if matched, tool is blocked +2. Check **allow** patterns — if matched, tool is auto-approved +3. Run **pre_tool_use hooks** — hooks can allow, deny, or ask +4. If no decision, **ask user** for confirmation + +Hooks can override allow decisions but cannot override deny decisions. + +> [!WARNING] +> **Security Note** +> +> Permissions are enforced client-side. They help prevent accidental operations but should not be relied upon as a security boundary for untrusted agents. For stronger isolation, use [sandbox mode](../sandbox/index.md). diff --git a/_vendor/github.com/docker/docker-agent/docs/configuration/routing/index.md b/_vendor/github.com/docker/docker-agent/docs/configuration/routing/index.md new file mode 100644 index 0000000000..60f5bd5aba --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/configuration/routing/index.md @@ -0,0 +1,169 @@ +--- +title: "Model Routing" +description: "Route requests to different models based on the content of user messages." +keywords: docker agent, ai agents, configuration, yaml, model routing +weight: 100 +--- + +_Route requests to different models based on the content of user messages._ + +## Overview + +Model routing lets you define a "router" model that automatically selects the best underlying model based on the user's message. This is useful for cost optimization, specialized handling, or load balancing across models. + +> [!NOTE] +> **How It Works** +> +> docker-agent uses NLP-based text similarity (via Bleve full-text search) to match user messages against example phrases you define. The route with the best-matching examples wins, and that model handles the request. + +## Configuration + +Add `routing` rules to any model definition. The model's `provider`/`model` fields become the fallback when no route matches: + +```yaml +models: + smart_router: + # Fallback model when no routing rule matches + provider: openai + model: gpt-5-mini + + # Routing rules + routing: + - model: anthropic/claude-sonnet-4-5 + examples: + - "Write a detailed technical document" + - "Help me architect this system" + - "Review this code for security issues" + - "Explain this complex algorithm" + + - model: openai/gpt-5 + examples: + - "Generate some creative ideas" + - "Write a story about" + - "Help me brainstorm" + - "Come up with names for" + + - model: openai/gpt-5-mini + examples: + - "What time is it" + - "Convert this to JSON" + - "Simple math calculation" + - "Translate this word" + +agents: + root: + model: smart_router + description: Assistant with intelligent model routing + instruction: You are a helpful assistant. +``` + +## Routing Rules + +Each routing rule has: + +| Field | Type | Required | Description | +| ---------- | ------ | -------- | ------------------------------------------------------------- | +| `model` | string | ✓ | Target model (inline format or reference to `models` section) | +| `examples` | array | ✓ | Example phrases that should route to this model | + +## Matching Behavior + +The router: + +1. Extracts the last user message from the conversation +2. Searches all examples using full-text search +3. Aggregates match scores by route (best score per route wins) +4. Selects the route with the highest overall score +5. Falls back to the base model if no good match is found + +> [!TIP] +> **Writing Good Examples** +> +> - Use diverse phrasing that captures the intent +> - Include keywords users actually use +> - Add 5-10 examples per route for best results +> - Examples don't need to be exact matches — the router uses semantic similarity + +## Use Cases + +### Cost Optimization + +Route simple queries to cheaper models: + +```yaml +models: + cost_optimizer: + provider: openai + model: gpt-5-mini # Cheap fallback + routing: + - model: anthropic/claude-sonnet-4-5 + examples: + - "Complex analysis" + - "Detailed research" + - "Multi-step reasoning" +``` + +### Specialized Models + +Route coding tasks to code-specialized models: + +```yaml +models: + task_router: + provider: openai + model: gpt-5-mini # General fallback + routing: + - model: anthropic/claude-sonnet-4-5 + examples: + - "Write code" + - "Debug this function" + - "Review my implementation" + - "Fix this bug" + - model: openai/gpt-5 + examples: + - "Write a blog post" + - "Help me with writing" + - "Summarize this document" +``` + +### Load Balancing + +Distribute load across equivalent models from different providers: + +```yaml +models: + load_balancer: + provider: openai + model: gpt-5-mini + routing: + - model: anthropic/claude-sonnet-4-5 + examples: + - "First request pattern" + - "Another request type" + - model: google/gemini-2.5-flash + examples: + - "Different request pattern" + - "Alternative query style" +``` + +## Debugging + +Enable debug logging to see routing decisions: + +```bash +$ docker agent run config.yaml --debug +``` + +Look for log entries like: + +```text +"Rule-based router selected model" router=smart_router selected_model=anthropic/claude-sonnet-4-5 +"Route matched" model=anthropic/claude-sonnet-4-5 score=2.45 +``` + +> [!WARNING] +> **Limitations** +> +> - Routing only considers the last user message, not full conversation context +> - Very short messages may not match well — consider your fallback carefully +> - Each routed model creates a separate provider connection diff --git a/_vendor/github.com/docker/docker-agent/docs/configuration/sandbox/index.md b/_vendor/github.com/docker/docker-agent/docs/configuration/sandbox/index.md new file mode 100644 index 0000000000..fa7dcf4b97 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/configuration/sandbox/index.md @@ -0,0 +1,209 @@ +--- +title: "Sandbox Mode" +description: "Run agents in an isolated Docker sandbox VM for enhanced security." +keywords: docker agent, ai agents, configuration, yaml, sandbox mode +weight: 80 +--- + +_Run agents in an isolated Docker sandbox VM for enhanced security._ + +## Overview + +Sandbox mode runs the entire agent inside a disposable sandbox VM instead of directly on the host system. All shell, filesystem, and process activity happens inside that VM, so a misbehaving agent cannot touch files outside the mounted working directory or reach long-lived host state. + +The backend is provided by the [`docker sandbox`](https://docs.docker.com/ai/sandboxes/) CLI plugin (ships with Docker Desktop) or the standalone [`sbx`](https://github.com/docker/sbx) CLI if it is on `PATH`. + +> [!NOTE] +> **Requirements** +> +> Sandbox mode requires Docker Desktop with sandbox support (or a working `sbx` CLI). docker-agent shells out to these tools, it does not start raw `docker run` containers. + +## Usage + +Enable sandbox mode with the `--sandbox` flag on the `docker agent run` command: + +```bash +docker agent run --sandbox agent.yaml +``` + +docker-agent launches a sandbox VM, copies itself into it, mounts the current working directory, and re-runs the agent from inside. + +## Flags + +| Flag | Default | Description | +| ------------- | -------------------------------------------- | --------------------------------------------------------------------------------------------------------- | +| `--sandbox` | `false` | Enable sandbox mode. | +| `--template` | `docker/sandbox-templates:docker-agent` | OCI image used as the sandbox template. Passed to `docker sandbox create -t` / `sbx create -t`. | +| `--sbx` | `true` | Prefer the `sbx` CLI backend when it is available. Set `--sbx=false` to always use `docker sandbox`. | +| `--no-kit` | `false` | Disable the [auto-kit](#auto-kit) — do not stage skills or prompt files into the sandbox. | + +```bash +# Use a custom template image +docker agent run --sandbox --template myorg/custom-agent-template:latest agent.yaml + +# Force the docker sandbox backend even if sbx is on PATH +docker agent run --sandbox --sbx=false agent.yaml + +# Run without staging skills / prompt files into the sandbox +docker agent run --sandbox --no-kit agent.yaml +``` + +### Always sandbox a given agent + +Add `--sandbox` to an [alias](../../features/cli/index.md#docker-agent-alias) so the +sandbox path is taken automatically whenever that alias is invoked: + +```bash +docker agent alias add safe-coder agentcatalog/coder --sandbox +docker agent run safe-coder +``` + +An explicit `--sandbox=false` on the command line still wins, so you can opt +out of the sandbox for a single run without touching the alias. + +### Bake the default into the agent config + +Agent authors can declare a sandbox default in the YAML itself. Any caller of +the agent then gets the sandbox path automatically, without having to know +(or remember) to pass `--sandbox`: + +```yaml +# agent.yaml +runtime: + sandbox: true + +agents: + root: + model: openai/gpt-4o + description: A helpful assistant + instruction: You are a helpful assistant. + toolsets: + - type: shell +``` + +```bash +docker agent run agent.yaml # runs in a sandbox automatically +``` + +The rule is the same as for aliases: an explicit `--sandbox=false` on the +CLI overrides the config default, so you can debug an agent on the host +without editing its YAML. + +### Declare a network allowlist + +The runner already opens the [tool install hosts](#network-allowlist) and +the [models gateway](#how-it-works) automatically, but agents that talk +to endpoints those resolvers can't infer (custom MCP servers, third-party +APIs, registries not covered by the aqua resolver) would still see a 403 +from the sandbox proxy on first contact. + +Declare those hosts in `runtime.network_allowlist` and they are unioned +with the inferred set, so the agent can reach them on its first request: + +```yaml +# agent.yaml +runtime: + sandbox: true + network_allowlist: + - api.example.com + - registry.npmjs.org +``` + +Each entry is a hostname with an optional `:port` suffix. Commas and +whitespace are rejected to keep a single entry from smuggling several +rules into the policy engine. The runner prints the resulting allowlist +before launch so you can audit exactly which hosts the run opens up. + +### Persist your own allowlist + +For hosts you keep needing across agents (a corporate proxy, a +self-hosted registry, ...) `docker agent sandbox allow` writes the +entry into `~/.config/cagent/config.yaml` once and unions it with the +inferred and agent-declared sets on every subsequent `--sandbox` run: + +```bash +# I just got a `Blocked by network policy` 403 on api.example.com. +docker agent sandbox allow api.example.com + +# See what's currently persisted. +docker agent sandbox list + +# Drop a host you no longer need. +docker agent sandbox deny api.example.com +``` + +When the kit's per-toolset host resolver fails (the `! using fallback +host set` line in the launch summary), the runner now prints a hint +pointing at this command so you can turn the missing host into a +one-line, persistent fix instead of relying on the wider conservative +fallback host set. + +## Example + +```yaml +# agent.yaml +agents: + root: + model: openai/gpt-4o + description: Agent with sandboxed shell + instruction: You are a helpful assistant. + toolsets: + - type: shell +``` + +```bash +docker agent run --sandbox agent.yaml +``` + +## How It Works + +1. `--sandbox` tells docker-agent to prefer the `sbx` CLI (if available and `--sbx` is true), otherwise it falls back to `docker sandbox`. +2. A new sandbox VM is created from the image passed via `--template`. +3. The current working directory is mounted into the VM; the agent binary is copied in. +4. The [auto-kit](#auto-kit) is staged on the host and bind-mounted read-only into the VM, so the agent sees its skills and prompt files inside the sandbox. +5. The default-deny network proxy is opened for the configured [models gateway](../../features/cli/index.md#runtime-configuration-flags) and any package hosts the auto-installer needs for the agent's MCP/LSP toolsets. +6. All tools (shell, filesystem, background jobs, etc.) run inside the VM. +7. When the session ends, docker-agent exits but does not stop or remove the sandbox VM; both the VM and the kit are kept around so subsequent runs from the same workspace can reuse them. A fresh sandbox is created only when the mount set has changed. + +## Auto-Kit + +The sandbox VM has its own filesystem and `$HOME` — none of the host's `~/.agents/skills/`, `~/.claude/skills/`, project-level `.agents/skills/`, or prompt files like `AGENTS.md` and `CLAUDE.md` are visible inside it. To bridge that gap, docker-agent automatically builds a **kit**: a self-contained directory staged on the host before the sandbox starts and bind-mounted read-only into the VM at the same path. + +The kit is built whenever `--sandbox` is used with an agent reference. It is opt-out via `--no-kit`. + +### What gets staged + +For the agent referenced on the command line, the kit collects: + +- **Local [skills](../../features/skills/index.md)** — every `SKILL.md` discovered on the host (global `~/.codex/skills/`, `~/.claude/skills/`, `~/.agents/skills/`, plus project `.claude/skills/` and `.agents/skills/`) is copied under `/skills//`. The in-sandbox skills loader reads from the kit instead of the (non-existent) host `$HOME`. +- **Prompt files** — every file referenced via the agent's `add_prompt_files` (`AGENTS.md`, `CLAUDE.md`, …) is collected. Files that already live under the working directory are left alone (the live workspace mount surfaces them); files outside it (e.g. an `AGENTS.md` in `$HOME`) are copied under `/prompt_files/`. +- **A manifest** — `/manifest.json` records what was staged. The on-disk copy is sanitised so it cannot be used to map the host filesystem from inside the sandbox. + +Before launch, docker-agent prints a summary of what was staged so you can see exactly which skills and prompt files the agent will have access to inside the sandbox. + +### Secret redaction + +Every text file copied into the kit is run through [portcullis](https://github.com/docker/portcullis), which redacts secrets that match its detection patterns (API keys, tokens, …) in the staged copy. The kit's printed summary marks files as `(redacted)` whenever at least one secret was replaced. Detection is best-effort — portcullis recognises common secret formats but novel or obfuscated tokens may slip through, so the kit is not a substitute for keeping secrets out of skill sources in the first place. + +### Network allowlist + +The sandbox templates ship with a default-deny network proxy that allows the major model providers but blocks `*.docker.com` and every package-registry / source host the auto-installer reaches for. When the agent declares MCP or LSP toolsets that have a `command` and an installable `version`, the kit build resolves each toolset's package against the [aqua](https://aquaproj.github.io/) registry and computes the minimal set of hosts the in-sandbox auto-installer will need (Go module proxy + toolchain bootstrap for `go_install` packages, GitHub release hosts for `github_release` packages, …). Those hosts, `models.dev` (needed so the in-sandbox agent can resolve model metadata such as context limits, pricing, and capabilities — without it the first catalog lookup fails with a `403 Blocked by network policy` error), and the configured [`--models-gateway`](../../features/cli/index.md#runtime-configuration-flags) — are then allow-listed on the sandbox proxy. If a per-toolset registry lookup fails, a conservative fallback union is used so the run can still succeed; the affected toolsets are surfaced in the printed summary. + +### Caching + +Kits are stored under the docker-agent cache directory (`~/Library/Caches/cagent/sandbox-kits/` on macOS) keyed by a content hash of the agent reference. Reusing the same agent across runs reuses the same kit directory in place; disk usage is bounded by the number of distinct agents you have run. Kits are deliberately kept on disk between runs because the reused sandbox VM holds a hard reference to the kit's bind-mount path — deleting it would leave the sandbox un-startable. + +### Disabling the kit + +Pass `--no-kit` to skip the kit build entirely. The agent then runs without any host-side skills or external prompt files visible inside the sandbox, and the network allowlist falls back to the template defaults. Useful for debugging the sandbox itself, or for agents that don't depend on host skills. + +```bash +docker agent run --sandbox --no-kit agent.yaml +``` + +> [!WARNING] +> **Limitations** +> +> - Sandboxes are reused across runs from the same workspace; if the required mount set changes (e.g. a new kit is staged), the previous sandbox is removed and a fresh one is created. +> - Only the working directory, the agent config directory, and (when staged) the kit directory are mounted; other host files are not visible to the agent. +> - Network egress is constrained by the sandbox backend's default-deny policy plus the per-run allowlist described above. diff --git a/_vendor/github.com/docker/docker-agent/docs/configuration/structured-output/index.md b/_vendor/github.com/docker/docker-agent/docs/configuration/structured-output/index.md new file mode 100644 index 0000000000..5f0adddd73 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/configuration/structured-output/index.md @@ -0,0 +1,216 @@ +--- +title: "Structured Output" +description: "Force the agent to respond with JSON matching a specific schema." +keywords: docker agent, ai agents, configuration, yaml, structured output +weight: 90 +--- + +_Force the agent to respond with JSON matching a specific schema._ + +## Overview + +Structured output constrains the agent's responses to match a predefined JSON schema. This is useful for building agents that need to produce machine-readable output for downstream processing, API responses, or integration with other systems. + +> [!NOTE] +> **When to Use** +> +> - Building API endpoints that need consistent JSON responses +> - Data extraction and transformation pipelines +> - Agents that feed into other automated systems +> - Ensuring predictable output format for parsing + +## Configuration + +```yaml +agents: + analyzer: + model: openai/gpt-4o + description: Code analyzer that outputs structured results + instruction: | + Analyze the provided code and identify issues. + Return your findings in the structured format. + structured_output: + name: analysis_result + description: Code analysis findings + strict: true + schema: + type: object + properties: + issues: + type: array + items: + type: object + properties: + severity: + type: string + enum: ["error", "warning", "info"] + line: + type: integer + message: + type: string + required: ["severity", "line", "message"] + summary: + type: string + required: ["issues", "summary"] +``` + +## Properties + +| Property | Type | Required | Description | +| ------------- | ------- | -------- | --------------------------------------------------- | +| `name` | string | ✓ | Name identifier for the output schema | +| `description` | string | ✗ | Description of what the output represents | +| `strict` | boolean | ✗ | Enforce strict schema validation (default: `false`) | +| `schema` | object | ✓ | JSON Schema defining the output structure | + +## Schema Format + +The schema follows [JSON Schema](https://json-schema.org/) specification. Common schema types: + +### Simple Object + +```yaml +schema: + type: object + properties: + name: + type: string + count: + type: integer + active: + type: boolean + required: ["name", "count"] +``` + +### Array of Objects + +```yaml +schema: + type: object + properties: + items: + type: array + items: + type: object + properties: + id: + type: string + value: + type: number + required: ["id", "value"] + required: ["items"] +``` + +### Enum Values + +```yaml +schema: + type: object + properties: + status: + type: string + enum: ["pending", "approved", "rejected"] + priority: + type: string + enum: ["low", "medium", "high", "critical"] + required: ["status"] +``` + +## Strict Mode + +When `strict: true`, the model is constrained to only produce output that exactly matches the schema. This provides stronger guarantees but may limit the model's flexibility. + +- **`strict: false` (default)** — model aims to match the schema but may include additional fields or slight variations. +- **`strict: true`** — model output is constrained to exactly match the schema. Stronger guarantees. + +## Provider Support + +Structured output support varies by provider: + +| Provider | Support | Notes | +| ------------- | ---------- | --------------------------------------- | +| OpenAI | ✓ Full | Native JSON mode with schema validation | +| Anthropic | ✓ Full | Tool-based structured output | +| Google Gemini | ✓ Full | Native JSON mode | +| AWS Bedrock | ✓ Partial | Depends on underlying model | +| DMR | ⚠️ Limited | Depends on model capabilities | + +## Example: Data Extraction Agent + +```yaml +agents: + extractor: + model: openai/gpt-4o + description: Extract structured data from text + instruction: | + Extract contact information from the provided text. + Return all found contacts in the structured format. + structured_output: + name: contacts + description: Extracted contact information + strict: true + schema: + type: object + properties: + contacts: + type: array + items: + type: object + properties: + name: + type: string + description: Full name of the contact + email: + type: string + description: Email address + phone: + type: string + description: Phone number + company: + type: string + description: Company or organization + required: ["name"] + total_found: + type: integer + description: Total number of contacts found + required: ["contacts", "total_found"] +``` + +## Example: Classification Agent + +```yaml +agents: + classifier: + model: anthropic/claude-sonnet-4-5 + description: Classify support tickets + instruction: | + Classify the support ticket into the appropriate category + and priority level based on its content. + structured_output: + name: ticket_classification + strict: true + schema: + type: object + properties: + category: + type: string + enum: + ["billing", "technical", "account", "feature_request", "other"] + priority: + type: string + enum: ["low", "medium", "high", "urgent"] + confidence: + type: number + minimum: 0 + maximum: 1 + description: Confidence score between 0 and 1 + reasoning: + type: string + description: Brief explanation for the classification + required: ["category", "priority", "confidence"] +``` + +> [!WARNING] +> **Tool Limitations** +> +> When using structured output, the agent typically cannot use tools since its response format is constrained to the schema. Design your agent workflow accordingly — structured output agents work best for single-turn analysis or extraction tasks. diff --git a/_vendor/github.com/docker/docker-agent/docs/configuration/tools/index.md b/_vendor/github.com/docker/docker-agent/docs/configuration/tools/index.md new file mode 100644 index 0000000000..db3e16aaea --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/configuration/tools/index.md @@ -0,0 +1,503 @@ +--- +title: "Tool Configuration" +description: "Complete reference for configuring built-in tools, MCP tools, and Docker-based tools." +keywords: docker agent, ai agents, configuration, yaml, tool configuration +linkTitle: "Tool Config" +weight: 50 +aliases: + - /ai/docker-agent/reference/toolsets/ +--- + +_Complete reference for configuring built-in tools, MCP tools, and Docker-based tools._ + +## Built-in Tools + +Built-in tools are included with docker-agent and require no external dependencies. Add them to your agent's `toolsets` list by `type`. Each tool's dedicated page covers its full configuration options, available operations, and examples. + +| Type | Description | Page | +| --- | --- | --- | +| `filesystem` | Read, write, list, search, navigate | [Filesystem](../../tools/filesystem/index.md) | +| `shell` | Execute shell commands (sync + background jobs) | [Shell](../../tools/shell/index.md) | +| `think` | Reasoning scratchpad | [Think](../../tools/think/index.md) | +| `plan` | Shared persistent scratchpad for multi-agent collaboration | [Plan](../../tools/plan/index.md) | +| `session_plan` | Per-session markdown plan for the draft-review-execute workflow | [Session Plan](../../tools/session_plan/index.md) | +| `session_context` | Reference a previous session as context (read-only) | [Session Context](../../tools/session_context/index.md) | +| `todo` | Task list management | [Todo](../../tools/todo/index.md) | +| `memory` | Persistent key-value storage (SQLite) | [Memory](../../tools/memory/index.md) | +| `tasks` | Persistent task database shared across sessions | [Tasks](../../tools/tasks/index.md) | +| `fetch` | HTTP `GET` requests with text/markdown/html output | [Fetch](../../tools/fetch/index.md) | +| `script` | Custom shell scripts as tools | [Script](../../tools/script/index.md) | +| `lsp` | Language Server Protocol integration | [LSP](../../tools/lsp/index.md) | +| `api` | Custom HTTP API tools | [API](../../tools/api/index.md) | +| `openapi` | Import every operation of an OpenAPI 3.x document as tools | [OpenAPI](../../tools/openapi/index.md) | +| `rag` | Retrieval-augmented generation over indexed sources | [RAG](../../tools/rag/index.md) | +| `model_picker` | Let the agent pick between several models per turn | [Model Picker](../../tools/model-picker/index.md) | +| `user_prompt` | Interactive user input | [User Prompt](../../tools/user-prompt/index.md) | +| `open_url` | Open a fixed URL in the user's default browser | [Open URL](../../tools/open-url/index.md) | +| `transfer_task` | Delegate to sub-agents (auto-enabled) | [Transfer Task](../../tools/transfer-task/index.md) | +| `background_agents` | Parallel sub-agent dispatch | [Background Agents](../../tools/background-agents/index.md) | +| `handoff` | Local conversation handoff to another agent in the same config (auto-enabled by `handoffs:`) | [Handoff](../../tools/handoff/index.md) | +| `a2a` | A2A remote agent connection | [A2A](../../tools/a2a/index.md) | +| `mcp_catalog` | Discover and activate remote MCP servers from the Docker MCP Catalog on demand | [MCP Catalog](../../tools/mcp-catalog/index.md) | + +**Example:** + +```yaml +toolsets: + - type: filesystem + - type: shell + - type: think + - type: todo + - type: memory + path: ./dev.db +``` + +## MCP Tools + +Extend agents with external tools via the [Model Context Protocol](https://modelcontextprotocol.io/). For a standalone overview of the `mcp` toolset see the [MCP tool page](../../tools/mcp/index.md). + +> [!TIP] +> **Reusable MCP definitions** +> +> Repeated MCP server definitions can be hoisted into the top-level `mcps:` section and referenced by name with `{type: mcp, ref: }`. See [Reusable MCP Servers](../overview/index.md#reusable-mcp-servers-mcps). + +### Docker MCP (Recommended) + +Run MCP servers as secure Docker containers via the [MCP Gateway](https://github.com/docker/mcp-gateway): + +```yaml +toolsets: + - type: mcp + ref: docker:duckduckgo # web search + - type: mcp + ref: docker:github-official # GitHub integration +``` + +Browse available tools at the [Docker MCP Catalog](https://hub.docker.com/search?q=&type=mcp). + +| Property | Type | Description | +| ------------- | ------ | ---------------------------------------------------------------- | +| `ref` | string | Docker MCP reference (`docker:name`) | +| `tools` | array | Optional: only expose these tools | +| `instruction` | string | Custom instructions injected into the agent's context | +| `config` | any | MCP server-specific configuration (passed during initialization) | +| `working_dir` | string | Working directory for the MCP gateway subprocess. Only applies when the catalog entry runs as a local process (not remote). Relative paths are resolved against the agent's working directory. Supports `${env.VAR}` (canonical), plus `~` and shell-style `$VAR`/`${VAR}` expansion ([details](../overview/index.md#variable-expansion-in-config-fields)). | + +### Local MCP (stdio) + +Run MCP servers as local processes communicating over stdin/stdout: + +```yaml +toolsets: + - type: mcp + command: python + args: ["-m", "mcp_server"] + tools: ["search", "fetch"] + env: + API_KEY: value +``` + +| Property | Type | Description | +| --- | --- | --- | +| `command` | string | Command to execute the MCP server | +| `args` | array | Command arguments | +| `tools` | array | Optional: only expose these tools | +| `env` | object | Environment variables (key-value pairs) | +| `working_dir` | string | Working directory for the MCP server process. Relative paths are resolved against the agent's working directory. Defaults to the agent's working directory when omitted. Supports `${env.VAR}` (canonical), plus `~` and shell-style `$VAR`/`${VAR}` expansion ([details](../overview/index.md#variable-expansion-in-config-fields)). | +| `instruction` | string | Custom instructions injected into the agent's context | +| `version` | string | Package reference for [auto-installing](#auto-installing-tools) the command binary | + +### Remote MCP (Streamable HTTP / SSE) + +Connect to MCP servers over the network: + +```yaml +toolsets: + - type: mcp + remote: + url: "https://mcp-server.example.com" + transport_type: "streamable" + headers: + Authorization: "Bearer your-token" + # Optional: allow OAuth helper requests to reach private/internal IPs. + allow_private_ips: true + tools: ["search_web", "fetch_url"] +``` + +| Property | Type | Description | +| ----------------------- | ------- | --------------------------------------------------------------------------------------------------------------------- | +| `remote.url` | string | Base URL of the MCP server | +| `remote.transport_type` | string | `streamable` or `sse` | +| `remote.headers` | object | HTTP headers (typically for auth) | +| `allow_private_ips` | boolean | Permit remote MCP OAuth helper requests to dial non-public IP addresses. Use only for trusted internal servers. | + +## Auto-Installing Tools + +When configuring MCP or LSP tools that require a binary command, docker agent can **automatically download and install** the command if it's not already available on your system. This uses the [aqua registry](https://github.com/aquaproj/aqua-registry) — a curated index of CLI tool packages. + +### How It Works + +1. When a toolset with a `command` is loaded, docker agent checks if the command is available in your `PATH` +2. If not found, it checks the docker agent tools directory (`~/.cagent/tools/bin/`) +3. If still not found, it looks up the command in the aqua registry and installs it automatically + +### Explicit Package Reference + +Use the `version` property to specify exactly which package to install: + +```yaml +toolsets: + - type: mcp + command: gopls + version: "golang/tools@v0.21.0" + args: ["mcp"] + - type: lsp + command: rust-analyzer + version: "rust-lang/rust-analyzer@2024-01-01" + file_types: [".rs"] +``` + +The format is `owner/repo` or `owner/repo@version`. When a version is omitted, the latest release is used. + +### Automatic Detection + +If the `version` property is not set, docker agent tries to auto-detect the package from the command name by searching the aqua registry: + +```yaml +toolsets: + - type: mcp + command: gopls # auto-detected as golang/tools + args: ["mcp"] +``` + +### Checksum Verification + +Where the aqua registry includes a checksum manifest, downloaded binaries are verified against it before installation. Verification behaviour depends on the checksum type advertised: + +- **Strong checksums (sha256, sha512, etc.)** — verified before the binary is installed. If the downloaded archive does not match, the install is aborted and an error is returned (fails closed). +- **Unsupported or weak checksum types (e.g. md5, sha1)** — skipped with a warning; installation proceeds without verification. +- **No manifest** — if no checksum is advertised in the registry entry, the binary is installed without verification. + +### version_overrides Resolution + +The auto-installer correctly resolves **`version_overrides`** entries in the aqua registry. Many common tools (for example, `fzf`) keep their package configuration — including download URLs and checksums — under `version_overrides` rather than at the top level of their registry entry. These tools previously failed to install silently; they are now handled correctly. + +### Disabling Auto-Install + +**Per toolset** — set `version` to `"false"` or `"off"`: + +```yaml +toolsets: + - type: mcp + command: my-custom-server + version: "false" +``` + +**Globally** — set the `DOCKER_AGENT_AUTO_INSTALL` environment variable: + +```bash +export DOCKER_AGENT_AUTO_INSTALL=false +``` + +### Environment Variables + +| Variable | Default | Description | +| ---------------------------- | ------------------ | ------------------------------------------------ | +| `DOCKER_AGENT_AUTO_INSTALL` | (enabled) | Set to `false` to disable all auto-installation | +| `DOCKER_AGENT_TOOLS_DIR` | `~/.cagent/tools/` | Base directory for installed tools | +| `GITHUB_TOKEN` | — | GitHub token to raise API rate limits (optional) | + +Installed binaries are placed in `~/.cagent/tools/bin/` and cached so they are only downloaded once. + +> [!TIP] +> Auto-install supports both Go packages (via `go install`) and GitHub release binaries (via archive download). The aqua registry metadata determines which method is used. + +## Toolset Lifecycle + +Long-running toolsets — local MCP servers (stdio), remote MCP servers (Streamable HTTP / SSE), and LSP servers — are managed by a single supervisor that can auto-reconnect them when they crash, time out, or drop their session. The `lifecycle` block on the toolset lets you tune that supervisor per toolset. It applies to every `type: mcp` and `type: lsp` toolset. + +The simplest knob is `profile`, which picks a preset: + +| Profile | Auto-restart | Use case | +| --- | --- | --- | +| `resilient` | Yes | Default. Exponential backoff on disconnect; the agent keeps running if the toolset is unavailable. Matches the historical docker-agent behaviour. | +| `strict` | No | Fail-fast. Marks the toolset as required. Intended for CI / headless runs where a missing dependency should be a hard error. | +| `best-effort` | No | Single attempt, no retries. Good for experimental MCPs whose flakiness should not amplify into a restart loop. | + +```yaml +toolsets: + - type: mcp + ref: docker:duckduckgo + lifecycle: + profile: resilient # default; shown here for clarity + + - type: lsp + command: gopls + file_types: [".go"] + lifecycle: + profile: strict + + - type: mcp + ref: docker:openbnb-airbnb + lifecycle: + profile: best-effort +``` + +### Tuning the defaults + +Any field set on `lifecycle` overrides the profile preset, so you can mix-and-match: pick a profile and only override the knobs you care about. + +```yaml +toolsets: + - type: mcp + command: ["docker", "mcp", "gateway"] + lifecycle: + profile: resilient + max_restarts: 10 # keep trying longer than the default of 5 + backoff: + initial: 500ms + max: 1m + multiplier: 2 + jitter: 0.2 # 20% random offset to avoid thundering-herd retries +``` + +| Property | Type | Description | +| --- | --- | --- | +| `profile` | string | One of `resilient` (default), `strict`, `best-effort`. Picks defaults for every other field. | +| `restart` | string | When the supervisor should reconnect after a disconnect: `never`, `on_failure` (default), or `always`. For **remote** MCP toolsets (Streamable HTTP / SSE), `on_failure` is automatically promoted to `always` so idle-timeout closes reconnect gracefully — `never` is still honored. | +| `max_restarts` | int | Maximum consecutive restart attempts before the toolset is marked `Failed`. `0` uses the profile default (5); `-1` means unlimited. | +| `backoff.initial` | duration | First wait between attempts (Go duration: `500ms`, `1s`, …). Default: `1s`. | +| `backoff.max` | duration | Cap on the wait between attempts. Default: `32s`. | +| `backoff.multiplier` | number | Multiplier applied each attempt. Default: `2`. | +| `backoff.jitter` | number | Fraction (0..1) of the computed delay applied as a uniform random offset. `0` disables jitter (default). | +| `required` | boolean | Marks the toolset as critical. Today this is informational; a future eager-startup phase will refuse to start the agent when a required toolset cannot reach Ready. Defaults to `true` under `strict`, `false` otherwise. | +| `startup_timeout` | duration | Cap on the initial connect+initialize duration. Today this is informational; the eager-startup phase that enforces it ships in a follow-up. | +| `call_timeout` | duration | Documented per-call timeout. Informational; the runtime currently uses the caller's context for cancellation. | + +> [!NOTE] +> **`required` and `startup_timeout` are not yet enforced** +> +> The schema validates these fields and the supervisor stores them, but no code path acts on them yet. They are documented now so config files written today keep working when the planned eager-startup phase lands. Picking the `strict` profile is forward-compatible — it will start enforcing `required=true` automatically. + +### Inspecting and restarting toolsets at runtime + +The TUI exposes the supervisor through two slash commands: + +- `/tools` — the unified tools dialog. Its top section lists every toolset on the current agent with its lifecycle state (`Stopped`, `Starting`, `Ready`, `Degraded`, `Restarting`, `Failed`), restart count, and last error; its bottom section lists every tool the agent can call, grouped by category. Use this to answer both "what can the agent do?" and "is anything degraded?" with one command. +- `/toolset-restart ` — force the supervisor to reconnect the named toolset. Useful after completing OAuth, when a remote MCP server has been redeployed, or when an LSP like `gopls` is stuck. + +See the [TUI reference](../../features/tui/index.md) for the full list of slash commands. + +See [`examples/lifecycle.yaml`](https://github.com/docker/docker-agent/blob/main/examples/lifecycle.yaml) for a complete lifecycle configuration example. + +## TOON-Encoded Tool Outputs + +Many MCP servers return verbose JSON responses that consume a lot of context budget. The `toon` field on a toolset transparently re-encodes matching tools' JSON output as [TOON](https://github.com/alpkeskin/gotoon) — a compact, model-friendly key/value format — before the result is shown to the model. + +```yaml +toolsets: + - type: mcp + ref: docker:github-official + toon: ".*" # toonify every tool from this MCP server + - type: mcp + command: my-server + toon: "list_.*,get_.*" # only toonify list_/get_ tools +``` + +| Property | Type | Description | +| -------- | ------ | ----------- | +| `toon` | string | Comma-delimited list of regular expressions matching tool names whose JSON output should be re-encoded as TOON. Non-JSON outputs and non-matching tools are passed through untouched. | + +When a tool's output is not valid JSON, it is returned unchanged — TOON encoding is best-effort and never breaks tools that emit plain text. + +> [!NOTE] +> **When to use TOON** +> +> TOON typically yields 30-60% smaller payloads than equivalent JSON for MCP tools that return arrays of records (issue lists, search results, file listings, …). It works best when the schema is regular; one-off responses with deeply nested or heterogeneous shapes may benefit less. + +## Per-Toolset Model Routing + +The `model` field on a toolset overrides which LLM is invoked for the **next turn** after a tool from that toolset returns — letting you process simple tool results (file reads, knowledge-base lookups, shell stdout) with a cheaper or faster model while keeping the agent's primary model for reasoning. + +```yaml +models: + primary: + provider: anthropic + model: claude-sonnet-4-5 + fast: + provider: anthropic + model: claude-haiku-4-5 + +agents: + root: + model: primary + toolsets: + - type: filesystem + model: fast # process file reads with the fast model + - type: shell + model: fast # ditto for shell stdout + - type: mcp + ref: docker:github-official + model: openai/gpt-4o-mini # inline provider/model also works +``` + +| Property | Type | Description | +| -------- | ------ | ----------- | +| `model` | string | Model used for the LLM turn that processes tool results from this toolset. Either a name from the `models:` section or an inline `provider/model` (e.g. `openai/gpt-4o-mini`). The override is **one-shot**: subsequent turns return to the agent's primary model. | + +When multiple tool calls in a single turn come from toolsets with different `model` overrides, the runtime picks the override of the **first** tool call that has one set. See [`examples/per_tool_model_routing.yaml`](https://github.com/docker/docker-agent/blob/main/examples/per_tool_model_routing.yaml) for a complete configuration. + +## Tool Filtering + +Toolsets may expose many tools. Use the `tools` property to whitelist only the ones your agent needs. This works for any toolset type — not just MCP: + +```yaml +toolsets: + - type: mcp + ref: docker:github-official + tools: ["list_issues", "create_issue", "get_pull_request"] + - type: filesystem + tools: ["read_file", "search_files_content"] + - type: shell + tools: ["shell"] +``` + +> [!TIP] +> Filtering tools improves agent performance — fewer tools means less confusion for the model about which tool to use. + +## Tool Instructions + +Add context-specific instructions that get injected when a toolset is loaded: + +```yaml +toolsets: + - type: mcp + ref: docker:github-official + instruction: | + Use these tools to manage GitHub issues. + Always check for existing issues before creating new ones. + Label new issues with 'triage' by default. +``` + +By default, the `instruction:` field **replaces** the toolset's built-in instructions (if any). To keep the built-in guidance and add your own rules on top, include the `{ORIGINAL_INSTRUCTIONS}` placeholder anywhere in your instruction text. At runtime it expands to the toolset's default instructions: + +```yaml +toolsets: + # Enrich: keep built-in instructions, then add your own rules + - type: filesystem + instruction: | + {ORIGINAL_INSTRUCTIONS} + + ## Project-specific rules + - Never modify files outside the `src/` directory. + - Always create a backup before overwriting a file. + + # Enrich: prepend your rules before the built-in instructions + - type: shell + instruction: | + Important: only run commands inside the project root. + {ORIGINAL_INSTRUCTIONS} + + # Replace: omit the placeholder to discard built-in instructions entirely + - type: mcp + ref: docker:github-official + instruction: | + Only read GitHub issues. Never create, edit, or close anything. +``` + +Three patterns at a glance: + +| Pattern | Description | +| --- | --- | +| `{ORIGINAL_INSTRUCTIONS}` then your text | Append your rules after the defaults | +| Your text then `{ORIGINAL_INSTRUCTIONS}` | Prepend your rules before the defaults | +| No placeholder | Replace the defaults entirely | + +See [`examples/toolset_instructions.yaml`](https://github.com/docker/docker-agent/blob/main/examples/toolset_instructions.yaml) for a complete example. + +## Deferred Tool Loading + +Load tools on-demand to speed up agent startup. When a toolset is deferred, its tools are registered lazily — the tool server process is not started until the agent first calls one of its tools. This is useful for large toolsets (e.g., an MCP server with hundreds of tools) where startup time matters. + +```yaml +toolsets: + - type: mcp + ref: docker:github-official + defer: true + - type: mcp + ref: docker:slack + defer: true + - type: filesystem +``` + +Or defer specific tools within a toolset: + +```yaml +toolsets: + - type: mcp + ref: docker:github-official + defer: + - "list_issues" + - "search_repos" +``` + +When `defer` is a list of tool names, only those specific tools are deferred; all other tools in the toolset load eagerly. Setting `defer: true` defers the entire toolset. + +See [`examples/deferred.yaml`](https://github.com/docker/docker-agent/blob/main/examples/deferred.yaml) for a complete example. + +## Combined Example + +```yaml +agents: + root: + model: anthropic/claude-sonnet-4-5 + description: Full-featured developer assistant + instruction: You are an expert developer. + toolsets: + # Built-in tools + - type: filesystem + - type: shell + - type: think + - type: todo + - type: memory + path: ./dev.db + - type: user_prompt + # LSP for code intelligence + - type: lsp + command: gopls + file_types: [".go"] + # Custom scripts + - type: script + shell: + run_tests: + description: Run the test suite + cmd: task test + lint: + description: Run the linter + cmd: task lint + # Custom API tool + - type: api + api_config: + name: get_status + method: GET + endpoint: "https://api.example.com/status" + instruction: Check service health + # Docker MCP tools + - type: mcp + ref: docker:github-official + tools: ["list_issues", "create_issue"] + - type: mcp + ref: docker:duckduckgo + # Remote MCP + - type: mcp + remote: + url: "https://internal-api.example.com/mcp" + transport_type: "streamable" + headers: + Authorization: "Bearer ${env.INTERNAL_TOKEN}" +``` + +> [!WARNING] +> **Toolset Order Matters** +> +> If multiple toolsets provide a tool with the same name, the first one wins. Order your toolsets intentionally. diff --git a/_vendor/github.com/docker/docker-agent/docs/demo.gif b/_vendor/github.com/docker/docker-agent/docs/demo.gif new file mode 100644 index 0000000000000000000000000000000000000000..e235a4f3e27a649c067f169c706450dd2a7328ed GIT binary patch literal 1095704 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 z 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

9FedokQY5%28 z<3Sv4Lr!mzt@4w83v5{my#Hv)L4V1{m^YP}#Q_R<-N_S1>LORI5(bn$$?5BDUqoUc z@-T0=KKyv_y|3RyT$}_QWVoGk6XtB&j^K#mHf@W@J>GBBhOZCC^-?&!Dq;NDAg& zAsq^xk>-{})>#~ab1gx3T);HgE;3B`e5K@Lxr8bx&FZ zwC5qbP0rdq<5e=x3WyboUa2X$U&x18y{H@@h4gvLAo2Y)K!Z0f!sz`_ zj*%fVZX@>_hK90gMP<>mu>APk8pO(*gKQ=`oA6zOA25n7N43CH^JENu3$evNN+{#3 zI~=g@!@0S#$44P{3o4U@ik!)hq!kMWq?-rfuM(dK@?_!MhlmnMHd7YN0EjIev0U^9 zWpOz0XO(a?mDm5eKj+yIz!Q?5jC_n}Dl)paskUbUL%MaP0E*@Tn zj2!%{h2B}3k0pU9v~82{1}!I!DNCCvvf~1{!QL||=#3=Qh2t1QC3oYLlP(|OQ=Zf^ zHw+qhQh8TLA3GZ*adhmsA=R_?!GF2ee>FLS5mrlh!f%G{P&dC`FPMtl#rCy{+*ae>4mY^ zMICp}#NH6=I&XG)c0TFe;iacGyFS0T@nuJabFSNqE1N&Rx^pUb?#t`jH84GwJo;#d zRNpSFdGOPvtYB^<_lxbF@xf@n}ioWWqF(26V zLvNW%ik>alBtw7iL?sR-`gV3qi;&q8Om`kAN zaP=4)qo+83hu12a7s1d7ZHrKLjHzDV2Z~()zO22o++4T1<^DW%-loyC^9Ob>HM8~% z>Oem%m=_wXw~N5Ce%NXlgmbV|aPu?hQ_EmmTaV~kPA;bhczkM$1CYUV_>pomvEkhX z>;1Ap&zGTgqid|?>YKhJDf8~kyH+m%QgpZQihQ0A68UV0c8>@gHEOEQ>)d^ZXvRkk z^HnDr&9n{kP4_h0o0Axky=zIB(Y%WJ=TtwI(ibn%M(@r!H*Os2aX-P3V?uBb^?n9? zRbg~@0dV>-rEK)@_F*~T_`IEsT&2+_R7FO+K572%p1;NE)`#KIr!PE>t2=%1dDipO zmtKl3K1Byd(bYn9le=#6?sDOA=*YErUFx2HV-mO5OgINKmky71(!gfV&e1k~__MDb z{nl@E8yiH)?6Emc&NlS@xf8o&&kA|vqG5XJ{1@ADx&G-ziaN`mUorvCCzYdhESCOC zce@@Tx6}SJ2CjgNKM&W7FmrnOSWOzQg3ExUIz?v@_$lZ0DYMiCAJsNYlP*pB3LM_5 zB&pczmEX7Ehnl!7L}mZG-Xl95{%$&8`=p)Sv-k>_^^&}Fk=a?Yu4jaOSnNDn{b1?00h@GBuWBK0@ zGrC`Xsn6@CQ7CF(();(^w$Yu>{QmIY%jUlW478zZ0r^*1v2Cq4e==Q!# z2RP>p^(qk8xRz$&gnELfI{o8BNA3hr@x_SBKnLH;kNjb^p>5I)OXB$V%ON$7iD}FW z!om~Iz$|Gj9ikrL{1@E~)l}Hg0jY2Olo%IFK+{QUb{qrnxh=0y>D-&%gv>6J;8C*) zbpVoq3dBV^1o;wIe$i$@E#!7uW;NYaRgddAcw3Gtc-r9Nd-0eGna z3cZz+Ps{No^80MPupoYhrwpH=>|X$h<||o#7i-@}Xl`@&e2wey!?bn5=PKBYj^%jE zh16A7fA=6im%w#B)Wn~=V1ZS=I}(fC4zzYXUiAI#y+W9$;{QMP`T>cpX9LbMG}FqU zGD|zB{GN+48?@W+GRw|EkzOu7Xrq_Zs*Cb}CN*U8&hOrfx5dQwpe>&K_lja0hi5lj z<|@&!)h7 zT^57>5B4-oaYFLZd_RpF^TbtF>^I!Zl?-<$ljHXw24 zj|fmiE(f-n7U(+=BqDGr;BGvKASxk^mjXn`(j*p>YP9y(As(a`JEx8QFa}{JgHuw? z2RUp&Wbv7aBuwxsvy_K1F_)Ws`wT*G)!HeE6s~*PKC#C%%2bbUh{bdRsEE&ea)ML& zpQrUGwT)FjqZ8ERhl&k-ngy57OSfv)h)LVarRIP?{n7oke|Z3=nJ=4P{)>PqXdoXj zVCKBA-{%TSEOASi7z|yOrC^_0mVI~C>E#F=juI5qpceElFOo)4Dm65z{y%rIRkRYs z(w^QW(q-vI@g!y5O?xWE6aM(Ic^L)Ty_gB22HpC6I${~2Oi*9=aSw+Q=yPlrLdpeN zV;v+PX{RcewKL%r9LZ)b>#fC<%5tcQ1J;L%SNJLpH5n(4yC@+{d6kk&llqjn53Mp` z?YT!2$7cweQd6ejk%RqoKH&=2Q5~i?;qT!PQv8dfgk27GtgAY4LRzFmtJ-W0K6Pn; zqq=8zhUFs}S4bJJzi!%SU6Oh#f0BS9v&<**P-a!hnX+md^6)?a;?sCMidzIr;G=xf zSco$OJ|Xlz4k1*OB+}V>Of|=&M1;0g9ww<2@Rx3B(?{$Uz6)9B^RVvI^zrBodTTLk z(skx{56>Ug=qPXBl50$SFz>#e%_qIRM@fUovmjhCV_I&_6d(`-v z&`9*peSEL^YFRdfW`u)9|C>fUckF~PyAhLFATi6BipBBWFU;+~10L1h`4`h6VrZPj zr`{s{s<#Ael)!AFMrvC`zf;h26s%>q)6Y+dy|oD9mM6~+ZZiqkpy^WKCH#PS?V`$6 zX{XaoS_)Q|3bmOpO6-1ubVgo+h;C$C3}bFu>p@;R%~#3y)NuI043YP=zfpruWo6Ay z9cML=O3Y*``cyb;ymso1^29FWQ150);)RDHFk1D3ttGEa5xr=JXnwWClOl%utwXf3 z<~EA!me$1|4M3!^=2ANJDF@L5AVUGCb1d3U5EqO`z?c9XA7Gs#uWUASnS~%@$f#OO zZ|p;Jm<|f|v0xQI29WJ6dMoSX769S*63hnu{3K?02ogQiO%XGMY;$bXL@8(ULIhlE zPAVkyCY8SD{`l3=Fuz0Alpul?Q~UljNHRG0(Hd(K)8g8_zZg9*GXDuW zO1Zwe)4Co4ia?JNwogg`90ShLW<<@Z3@{R(rcOJG$g{q4L1@Pc)(b~*9IfmXtt!rG z|0}06`e*$*=ecyw@qo`u)AFZG1Qm3frC7-$5oFM%o$aM&f%VFi`n8~L=VAh!QNs3U zTJ<~%v`B@!a~{$CIu|5#UV1n1()d{yQ)xn%?6dEr8?l`ztR?gj!QW2Z7MM>7+>_8r zCv+waN({@ZkTlSJGS~yq(xjaSn?!lnx-k7LKPp#CZMl@&txdZ{*Rp7SaQ7)p(S+GO zrh%9~K99HByH%p0VN~oCrh%u#N67Y=Wpf1gybD0axpfE{%r{T6BRI5E30byl?KH_T z5bn-}(_Dk9_W*=m)B-x(eYVrg2!W)jz(r$AKgD~=wPm-+_$bLS*G}7G;^TLg;@VZA zfr*~iF&=#WSmTp549JXU=Q%Pyue#HV?0^4t=^U1oryhI(#P*tjRP96}WV4{gp5C&5 z#xtCV=zQkN_6(DF4T9?nOsK76bQd<@(MiWk=yVvH%<}EGj7ef=Q0r5JyXYkr?&a%N zE{6=O{oR>wc4%2lW)i(0M5J|XPJz!Gw@c7t(`!UGm#e(%+2L=-JU2=R+?oVeu8>)&q9O3w8<;M>m5D|_oZE-~{2 zuqpn2gA&^sCC?zlEL5_PE7{VqWIiC7-_^OeP2vl{2@|^w5pNc^zjL=*ME-3vrm(mkujUV0wfZ>Gtoq(iqR7SpISrL*(&Qu1KC)_QS}TK`EfP(^hWfI*wsCni;N818JuDqn*)ND%udJIick zGikwd2ibmI?6XqGbJy8(<*B#<#hd3>6?qDy9(Qb(Vhy-vReuE!0 z;j4t7_c4B7`r#bW`P@l~Weph%IB4IJNZRSx6pX21UTKFPDucNXOXv)dU59vKvm=oL zKNlx9gxG$qosJR5bN$o0LMFSy)4JD8YPxY!BZkN@rP(kPy!i@3%asOPm64ixnQ&7_ z-fRef`c=~TelUYH6?ICrxP3TlHPe70GN<|5t3^gMQK3&cnj$iyio$d;n~ZK6q&4^a z>umaA+086M4MRi*XcYmo;^)_1WB!-x!PK)abqBg98`$wPx`mEDxccm}v-#cDYU zJPc8Nu+j>^S|XGAkSH3Bo5Vj9>OP;+9TVym+9J~ikuy`sC?zri;t=|zt3L^f0ogNL zdlcN3q{IL!T^{tqrwAPdVP^n>)&ad-D{Sq;FoQ7mnFM&|Dy}Q1970AYHM%KZq_rju ze(6R!hu5=;D5!H5&x_HXfX=^8GyyQ7vig^MXnWEzX?OiVu8CC1>2an_-?H6~U)0Dcxe)6FrMHt+|2*Rdh-pc8g zZtex^|dgydyfA74d1?*6<8Le0|6 zG*d|RdSWMV6UfBOOnLeip{A$c_p2zd%mwgFg6|X3rcDdb&%Cvh0tsJq=^l5hn9dnW z6bC}paAe?KuW#r5>JI8TPy5fyX8TUF+1X5YciV}ZnkZ#@^tED}!T=3~9DeX+iE@8j zfr%|ytWQvC17GIgd41CXTy~dPVRt}bYhsG$P+aSh@jISf;DHy}p`AmaH(Z;)XB&SA z_G)_R{QdmWtF6oQzpr=w{$H=>ilFI;6*()TzpsqXiDcjAJY2HbJdvKpp4;BxjAwgw z!Ci)31T{P2#;3zJ-FELh7v&3>Jjw%GnIte|@wFKIp|4 zX8)Ic3gP)P-SlUs{?DBF+|3()Zr+reJGN}+%BMHC{LI^(yQS{umLs|O|J~cPFQAg6 z6fIm6MF@da$1J|p-GxD=$%;{m{m8*f{}m}O*nbzaT*|kY5!vO5ooB?+ON3L}>RX$| z-qh%c1yKyy%6^fNGAwG`#aa%&yx%SThfLcFF>{Mi7!|oy#R}Yk9#&fLEqRx6MTd~v z=gm}%{6!2TsC0*W)T$Jao#1h|7yOi&@yqMohA%5zpQ zLVpI3d=ZFWK*Q|M*yK)+LDnkY+i0#xGvA19M$N9;ba}OcxAXR|`iEN%Jony=mcfnK zjCzTWR%PZsrN?xfUVpysX?B!nQ0BD1-?V?_9DVGdsH#@9p|iLoElv&B_g z12*w{-mDbMvOOE0uUzq@_~^Ipx~%}drDGu=F=`xQGni&=aKggoIK?k7BlgY2Uv+;N zr*7w8uKRQO$kr=6;tra2YL#q@D3wVyNKx4P_Ji9GY|6Z3jGWAbcgGX!5x1GcW--!HoCe1Wza&|7T@93 z0(T^^%C|o;Nnwyrf|gxct>5e*k7-aXBKNY)DByu}>u^yl6EaBhy*X;la`bL7j#Bl& zK!D9bC;^jx5jjnz+r{#WD&X*#I6li_fMvl`Nx$!|T|*fb5C z{eJ%Fxyp`t#a0nj*2WjX=##Y@OtS5xYm z?nQS}$dGYAXj#Bgx3`W)s|*<0Wel8J@cLObfKWolU81sR5W|5SOhp?tYy|eyB z(As&aPg=JaCWjsH-ST7lmthL8fn91cKi?=d{OFQeubkgT>myFAI1zav-*`jhX(t^Y z+K-Rxh&o8K`qjtWY7B9j5YL*<$(3~rS{jT0>nSTME;NsA6?9KNUyyXBKZVAHNm~R> z8X7b`U{5-~V6NZn5q{4TxN!J-OUG1nUw3x z^{s-Vlq>P!rhy$7w@Ehl2E8t9v9WQEoU|_5<+%L%b@$^D=hNOIo*!l(RAzqm)0Z}O#yo6>=3pVL`r=Yl8iKJoCm_6gMT~>R zOZ7?qG!SMl{m-F(eUYFD)2SDt)N3OIAKfo(JlBmUy47<_o)y*J-|L3oonnivXHrQi zcfla@h@lo9>pe$&t5<$;P1P-j0|mrB+R^%|zB#AciML%Y3|HNDyEaP>s7I9m9ccYd*6 zowGbSE~&r5Q45&I?-;6STIkV#xMGp{yT(1S``;Zqu-*K9)6s+b-=ExK{;kf#LYq$n z63zu$MhsVcgV;m&QI;uIwmq8HVN4XQ-wzfU*c z*eXDqGAEQrh->@(QdUO~{0cmfa@=x=qQ8Bj+hp-L4PLQm?=J^S`#gJ7dge*i_#uXL z^o`~GFpNrUcejMC$A4slB6#&)I($t#dXFY&K&5cqfL3g>S(ivpGl~)>tdbdTYqN9^ z?y5(G!t&dcaPx5Fh7@QG$ArO`vW~lhij4L|m&@!|5$B%W-;XHdmr2JiHp0 z-=LS-2GdXGby{T`;1AVOQ@FNPcbcEDt^W~9SVpf1rBNI^D}&PDh{G#dBK2Gd4VV=) zxH~mTW<+g5U>QX|Q2}UOvKla;iHS6(*sFca;_RR{i;6E^)(D?(%IMW)TrAgzZo(5= zP(DVP@SQ12@ROw5*LGj?wPCg4=axVVgdD(h*^tkyUy2DAq8{w(fWc`@u#8uqoZXmY zQgVO+jUrG~K%m{||FHM5PF|CpRfc?T(B>2kftdqh5i|(&`c<5fCoyp5FF^n+^!z4@ zf%Oo|cTPhck*5UFZ4gZ@(4iVBKwY_V$H=Nm0iyxHLaGx7S<(cj{=%0nNCP4iLgI-$ z7VxEvi!3C@lMf{Fdlo-9zqgR?Z#kh1aMKsULkIh`E9biZmG+$4;?14946t0Dbdyj* z3g}IOIli zfXZrI6Cv}N14=xq0ECGGLPJ7quAiMAo&;h8<%n!yJW1pt!V16a%rI)85S86tk4B45 ze0>9t$qBM?go);BE=!C`I^~AqhRRi`OiUB+rl*mh*ll(X{@#q#s{nvqR90Gq%_=u? zr$m^xu+?-mdrrtMoHG}q`X(&Fkc3)@TZI$M_?xtAk>P@(nwQ%6A=3o0przB;A=L#R z@q~J|w`N+tTeLwJGYW zR%jxIW&%B0L&UCmWd;s3l}>wK`ATWB?YWNbHTFMuqPhgULYfjAq5vt(xcR5g0mKp; zy>vge`GXp%=gD0aS$Riv>=@;=8@qH#R5yDoNL3?%j`i>)0NxCT8lR;2w~Q&evh_u6}WNJr zs51G{Qo1(nU=#(rN8U+(!$j8(w;JtHa_p@HXcC<-e4P{IH9i3C)|#pV8ZZzSHVbNV zamf8b<=)ey70KmF`1)Ry&kw#0`GyqXoAjY%qD40sumzC@-zXzr=IAg)i-w|5^GJ86 z5)sa~qYw5h_=M6h44ey^8?e%WZ#8Hs zGHHkkl9lMf0niqhc*Utsx%b0=J(Z@$nE2x=HS)=(Zg>I3_<_Lux&k06(SJ+s$z*WW8qN06%P?y6DZBvy}7qez$$T-@fzl!BV}GEX(FQIe4{U7t68(cyv*R%&l-G zt1pM22E6n>OzPj{Q_R{07JN0;tw=NdL06wgblgRBzE7NMU^s8NGjU*k%HdL~BkZ;m zrgP7|fN3xcnolU&{nhYB^+_@KpKS+BF=}xT)NdUnzoH;bgx+5(Zua=EXyKEFRmLSy z8-+4FFuJlFZ8$h;c2{{-i=bvLVN%t>x||0%4l*vIV{sY_r+1o}~< z*D5n=t_XkapNl_qw#|#O3u58?HH4dY2d+L6{wX_Ecv1DIsT0<$HX8s<3YdP20F&*> zI;}d(XZdv@5IDqacWY?>bc%4{E`N1=cPYSbx}USlGwp7=gCT~ANxvO$Wtt}HxgGq>rh zbt45ItNtT>^C=YPu+z|c_X_WQyS?jnuTOYjXwgDuE)VWaf}wXB1&CpCfHcUm2p_e+ zs5Th3A(z=8kG-W=L;ve~&i~reAvw`Z(P^RR6pd!RQsOQuaZ{7P5Yr-3qF1loOzYjW zD1ENB;6KPBOGkB@mALDGaR+G59Lp)2GJo+EW%9s6EOX1OV9hWe?G^pKu87tXTb_73 zK3?{#{w$319ze0kLxSy1YMpu};|1E|XQs!cjKY8Jlx0<}=4!%|*Jh6(+#vtZBNg67 zLt%xiuxtmjt|+k%;Bvk2xg-wuBA|1TuTMl0#|?Gr`L;br$bF!>`6JvA(_CT035lC5 z+s!zzBJ6E-*oQ}9pN*Ck!+es(E`vpuP2Z@uq+#bpy5~0?zQ{LgFYXv&k;?>n)H~Eb zC5*VTy^q<$@rS*kkS7HlL#*~!Dyzu`%OSv0q})C@YN-aTCdW?Tr>(sJY`(~1NU;3B z*B1QIbkn_NK0saCG%i@s+wE8z{IjAz{ ziZE42J-@HiTRDGK)hIq95MBnDeid}68;*~NR*W@}=%9ri=z1mrvRvq^U#0s?uX)Mj$EsV$$*s#u6pg!_G|JaEh-q$rBm$bi+by(la3n zHH-L9KwJcunFCmo%B0MTL=a*0VDH7C$q4Xhks2e_j2e$94EMoN`Jky$gAdLh?yok; zZy@ajeP)$S4u?Hoh)5nHBdLuU^O6n@Sfp=DYBX7Y^hc_VO76*rTY;v1n{(4ec#rhF zg75JQewl}Z{&7zHT#4Yl1GY=^b!=gHHP93HR4)!e!l5osqwvfJeP^7N z6Tq>ul#5l{RVAD6<=QTyfL;);S&1MjV0a3s+?#7&hPlqyDN{m0xwbs4<=+fjpAUdK z_W`wo(JcYX)H=r$fF30?=|s|uTjtm}g~TjKyf6N~@0yFU!2V*=B4vTig~A)B*njTb z$1t$H{I4XS|N5zS2S;@P0COF{;53x&3vKs*eOhY9k9o8Y#H&mG129A;W~Dg)*CX!5 zr#o(t$~&XVZw{th`MJK8vF-Q~kG&`D8=pF8`D+@KzQP~=s>Xj+N5y5a>E~1Sv})OK z_Rf1Q6-RcPvTYH}vC4&qH{Zs>{Gf{adGg@HmDXlXwzcJR&34aQy?a6J?rk0AzO~?` zJgP}89)_)6X0~U=>OHG!_v{Ek|M zubp;`*gP8@N?y&r+S*hhSb4wFiFI9{Tf4+X44+xYqvbmdbCJ z9ffLCIOGtnMinU0=D$&4$~mN=h76#={)*EK8qEie?CVu*>QF2;R|M^ETr$*HyIQdl z=5A$RkXgc8i@Tut^}Ta!A^df5EFw_9R?I3IwG3}qw`am-3rK#T(%XB) zAzX=*gZU3^EYHZ|Rhpsy7F)Ekw}y3Jq1y7dUT?5`1bJM4YSIU;T4U!pe#J88+nH$b ziAgnKmSWa#)N;HdZ$eG*LR%he(CKtR9gz^y**hxI*+Er?Vr3*;p-5Wc;>_Y%c~Ec^HKm2EX#l9 zqN8zeFaE>&b8Q9|sH&}(chg{xAhQmU#c;#Ol{$M*B{s0f9BR1 zTibdpB5?SX|#x-?Ni!Q(4fnLfm7}skErOR#kAT*3W@9=Vs<^ zYFWYM6tWfsK`LjhdkXGk`uEr8m^Y7FTE#d_oix3x`kh4ZGI8$GkO$yv2NKtJ9s1OM z2u!1Y1oCXO*KOt_4c*2;nD>yWoJG=RAN-DfpwA-78;p7(+{Evmg|E;kl}U{a$!!!9 z(Q#AMj!Vd+QYktNkSK;fN%zOhs*Uq5n)a&$gPz@LsHYyD((RR)6^#-*01;b>Mu7$$ z>dF;>0ZE1PS(7kTFhd zRr*hlWEPfb8c@X6!o0Ck7piYl)20nQ+{6JZS)4tv(t8ENZpm-F&b}#Z7@qjjc9Ejf zoTAGTV={)c&%#E0ACDSeNCqK8V^f4WA1=NU(`HI+qUdz7+c)yz!vq6A`MVC-llQGp zxdnZyozNPx+6&W6739M=!(IMF!#y>TTHfQRNpk`#_($4I2SrQsQNlrjQF~0Pn)$w9 z$%Qc1nz(9%F1Aj+X;!P@a|YWtV#zR^J+R5Fh$M-5bvgO0sZvk(or9)^M@{qm@OzdB z2-VampbHyu684^8e6|J`;a$L-I$yt>Y(SbCOX1uveuw>^?6LVj%SDtbVVlbO+&ez6 zerz=Px#{()6~?vj+>lG2qo`vP_8&DVXr-nT_`?jI|d4*ew<#AfQPfoc07^f>zC=aS~E z&%^o&23=EnxfIQ;6n!y_(0SiS{^d2w>|@J?qci~=%Xk%h!6t(p)3RfdF?*xukbzHZ zu)|WVpf28f=c6Ra9&M+Wb^DDm{ncSN>1bW9I0gQG+xp&Z#K0wUiBOl6{kr}Rn2t-j z=cI-)roFv-N)Lt58$9r<2^Y7l>b2DHCmlC#o%pErKx)Fx?L*MDQJj6?#TWPdiSDht z=can=^18~g>Q*?tMhll;cFBXS*WdIC%vYU_xbuGofLrFP!8*L6Jo}^} z=5q4T-CJ|dM4JZAM&4`rG|{>vk?Lym@hw{7^9nr{H6+T<03x|7tv-(Cd?LY2)oKoT z?!I45ThuW<=)1GUP|#{>ZM4qUY*`{0bHQTOEkv<@j$`{!r%(wO_NF5O6IE?(M#{Zr z$bq!YUes?xUOUBtK#a*?G)C>fgIvJ+lOLoNsY#PiwN3mM*&5=8ib3s(b+llg=MJO8 zL9eN?0%*9vTtzL&`^ez3mr3#WN3e>LCsCG9jEYKq$A%xXBIF*k7D}$gGO1_Ux&=B$ zsu*B2(ohR2iyE+4fFW}IYE_)WO5E43jo*B0ZG1vBE0{Q2-74V{6VyWY;QVJTB5{VP zk-mw#V*Uo^?9+?q_HQG1+0RB)^hYb_#Ndnr-__67SLc14y(r|_eQc;ZzU||shWf^j zjZG~dKVH7^Y0O}=c=ubW#q-!&oKKi6C4QHtBIBhPmsMz}CSvka&;1r;m|9cAw=(_d zLRy#WbOQHPfbH31YWHCaa7q%LB8#>nh5O=Z{2sADfiJlvL7g*i*G>gl^(I z@TLfwHYWFaeXsN<=!=iydF&AIVTi#%-v`cYZ=DpL&4N* zSc&Ms(}49m-#w*9ktLhB?=3Pp7l;NKEWW;}rpU;h(Hk6U5 z+iSxur6u1YJp#qs7N<(AuP#oPd3|1dBUtJ5`)y@>_MOezHjn3#UcPbmUSyI4OL_-~ z;KpM_9SS_oFg{#u;_nl(;cWG{lABSQ(sCy(S+5gUBCNeabuPJ4Vb>)3T531Is8!J; z#xB+_?_2t<7{QCBnHC?eFr7H)^h6MZO8(1}u7hYq)V_bt4>a%xaeLbFc z7Y;GXY7IY7dwpIklrtR;AxeZLVdUwg}pWYNjwTevP4-h`+7jAuN44p~qJj z#?AEraKy`9iomKu6q9PBjBFL_GJR6h36}-fAl2osZY4hjH39uw4S4?=%_2=mNX*^tC!#2|R;iKpEe>6}d8<*Fd=#QmIJ|Jm_KH}hG zxBcmpG7nzKy30gKjX6?&T4wLOu=Mg=m!9uDcW4qeIKzJNk6vUH{!c&h0)*z_#O z$maVRZ$WgCjt`)k(jA0J*dz5!*=~=y^+0))ekivRGJCEYsxtyXiQ|E{XWkXt>|+2G z8JpA#WL%@H>-I^894tNyA`Tx+P8d`)+77SwSX`E!e(le7Aa8HvD3%sT-$e<&TvTKo zkuogq-Kd+sp7Se}syr!1t)Rl7yZfvi6BD4o|~h2{oVR1p0rmEibT( z*I&srh5iYA+=+EU)U9a)^}DysUa_3I$i1ARowpX`>-sE6V&cP$LrLqn;nDv>i4AzR z|F`F;n0K?5!wY3znv2MR#ZXUA+SGFLpZ`4*tF(ytk@KkrzOlR|GWz(TTUQ&)E5wXm zdjb9)T(QU1a{9Ukucn+H`_*L4sUmsH56)_GF2*>a{ot@$(jpJOhWstSou#zB zj*AJd2lTTdZXlbd^gfeCePR54;F782BFzjk1Y~!wVZAX*5ZTA97RiIQtmOWqiz+mP=TDMs}e1TJ? zDb(z>)I*dHE9aA?81-ugaDCR>o;ten%s7%ba*genCN=0H>W_@FkqjDFPa4&+*XCXR720i|!t4%;` zdaS$*r{PT)@GV`~owxJd6S$s=#`!9)Pb=52&qyM{%}nP%95cMJ3td<13K7A5V%$7k znJm=NCL=!sDpDC74nP<1Dj$v*dx^|n&@e;+phO2Y$}#r|E8Ns<##ky{awM6Uqy;*E z5}W@>)th6hU6R9441g$BY9qrVc^(ZhDi6r09ca^P3+yZbS4fA!X>bWmy zO=%?!a7#zhe_?e9 zdd4!Ci5zAig6-6ZDQ}`$r_7m~+yiDaYLrKy1W=?@O44-*Di+TFp z;gnqE6Zy=7SUH!jI!jZ!)xd55R6okkPRcib5@Uk%!kyo!fQ{%ey6QCoy!0zf{0(>i zlFGbXNr0rz?^JKU0Wg*zEi3 zU#3&0FTvcUH^sp)v(q{zzzv60Fk?(A*|xb-4b&fQ_O5j7jDRGoH8bKr_bLE8Wk}NZs+*k&P}|Xm$>S$oyMC*mxGkT*?OXoes@8*Zx69O853bVS3|JgF-CD3$??7g&U93vNy&EUywD%g^iN0}r z|Gl&4|LDrq?&jaS+ca_a>YuwJgL@?AEtbu_mc92{Pv5(H?_OJ`i1;15FpM2~dao<7 zt!Hmr-|4pgIeK3pB9VX?zS}n9dw(?X{@C98;|6x}XqXxqR&naS%%FYRxBYEm`@v|? zl7^qjY@eTK|NN(2ZqR`{*#3Q0$Jf0bi>EvOcduh9G5^P(j@gNhzkfQm!^A)B#pr4= zrcHccllaGg_}A%nxSxjlyck~~(XE!~7wBs{Xw1!tQ4tc2B#pU0s(?f1GQm)6;n(TD zAht5>G$=c4wA5+a)ag|9sfy(&u*I^PX9?1_!Yk4x$zCiQG<>&c3^pV8L6F{?Xu zNo-fv<2m28!ml@NvPb%}XHP+AfnguVudgMu*D^`M%IYg=>RZ1gDVy&t!e;UOx)_EJ zju$+rY7>2-u(`P%OiddhT39R%}Xw3 z4L)rfnw%U8`7xN_H#EJ}_sZeHi=>A$)ek>rc|XY-c(e47mDM@tmy+Q3=x4#B#U;B> zhC_0{hmO^cuq}PJvBU5U!^k09+2kWkWbgWdVNBd36{E-M{*N1u3@hIsejM>Q%(7qq z(#UjEuV>^+ zx0g@IMx!%JPn@nikvohsf=8+MMb}k$Q zjmC_yj}!g9hm*!K&WvRaKF&5B9`_pwUy^*qN*Ct)jOQOF`wwrs|7^M7<+FWPbYq5e z7yO=8H?{MIq>0tN%S)Z^*r$7!o(YVe9~~M^i?mbsdtPUx7>ez_V06{(Tlpr z!@O0XUS8|@GcOwNzi5nnfeI=&7r`QS-92}7aBt1CoT7<4H4{xQC))o`RK6M8J_ULc zp&oz8Nxtsy#}~~mJRf+}FKucmwfOr@(} zuF5!q$rxVyz8hT)8)Q3tWCwHZf>BehE;0fz6`3>f?Img6X!<5)dinW;POccemj(we zUQ1)3s{~4}<>&;WCa~`fNu}N}S*Fthh7yo_gec5aRDcY$Cv>WveN~t<jk2zKle6Lj zpk!i22cvR6$SDo7_n?pL1LmLd{(WyNFMo)fcHV0&*5Rcb%zlT=p2^?$p}Mk_BFjKt$jD__`1fpU6X)1MpSC}r?gF+x_cM2U96zM6+8Cu&0>W)uXHeY zBDa06?P|W206ek}R5hEm5`VB4csa?ypzOCX=^v~J^UKogS);S<9ogW&uX9BDr*f5f zNj7M-Zhkyz)>`n1K${Pp|CHYjd$eNy-HKW4nW5KzyW%Hbol<)}>-aMDP*)E2>9_3u zM@G|5O|NRB+BE4%0pZ$~Vbn3XQp)gauOo;!5zIvFt|o(52$c59>hHHN7@o^lR2qf~ zQJF+|gb>vsSB_^*zDUN~i$GK1{Cgp4r3^G>yp^+Ix@3s5?I^2E#2Su%jSpeLP@qLf*yFFkTIStwokbc)tD>j15N88f0ge4v{r-4d@x7N=8>ljWl zBZ5u@1jbmYgZ{fihR`Q^TF}7=!v8Ssi2p)C`fK0_U1iJ0Kgai<4>Ij%e(Bw@zdcK} z`|RY>i1V+U>R-E8zii2L0mB^MU?Oxg`u3 zVmi>jL-SuwO-iwnPJEPWK?7sCgsfpjBohxDSs!KN6k2AZ7CSR6TrM$o3?H@`sfC}k zE7o7z7*ij7DX#l}?w4s767O66-J^9W_FBx)*^tw5pVqf*f7xDa5dS%;)ifL1*cFC3 zfQQ>AM0ah)t1HLY61?9ktu9r|H45MvuKSwSf6Q@XPxZQQ=?~BN??)P~|DG{&A@W@4 zne{)mja}K$Q6B+vbW8S>;Js77p3pJUMIR*`=|rqF1^ub?7%r)R!#`4|diG&G4Q$ucS!G`h`%cq`QLkkz+e8G(XUJ9%EYU zyyB9D3W`*BJ=9=Fm&;0{{I}Ovn(T+WQcd|5H>l>dW;N{jeUByPI_-&l#mf8s@VQgk z+j0mO)-WaB&S#!n@l$h{ZV3C}^uLhvn6rKl!gShbtA+bB?tNLMlhe<(()swtro;Ir z)-({UmnLY!yi*rZluXKqjrA)2qYWXw=SRt*ckXJ&Tr7Xv9Mf#WIDa%k-pUSMy*k9> z|8KxlXYggljDQLIvg-c*?|cZZrjsieqtTH-qeGfbfKD|n zdf%V!VR8LGkI}|(10#|wbQ#ea$4{vhmQY-y(@M2WdPtiNdA)DlbT|O%opxkp-rSfg zVua00M(D#x_7kIQ?rSQ8jhG8vZ}Vd7(}5AzA&YJ5{o79arH)&DlHTz={Qh3WmehFJ zjS%+SnHOt@(1xU`g1=8+e2lR6(|uCpwl*Q==%cfPpqacc?Wn5_**E*nhx&Wj_rCP_ z?zn#do6_RCe>bJ%P>-cft46G>#NRQDSi@dJ+?G+hZ=0?T=bZnxd{a`j=ANxOIkb#j zI@x`;U;F-SZMdkl9EUcAy%Y{p_;qUp>$4iwj1Ao2H(R{&ukPL0n#GbL?SEY_e4V%h zS5O62gb%lh$KPJO*uH1(TJMUzpKb@-*m2_Xx3!9`%vuHxr6XipO{V!=t`93+p(vk{$?oe5Cr4Sc=@A9eo zmY#dXriYm!Q^MzqmTkP9s@t{Y6hop!$z!R%$hjy5yO|WEKQ_$U9rXH7!7UK?)+*fP z4}ail(a|gzAFjT*ZdVDq*?AV>tL+yJAqMTIX$-cOeX>WF~X+^1p1oxBomED+qAg9ffj$#RD}(>W9(2iBXMV zb64M8CKqm}rMkRX_xb5@)t~l7I@@aD_q6?#f4Wv-Z_-)X&l^?6GVJ+M2!qCU=c2Ob#IN@eK+Rp&t}&djSqqQqVIkMju8CX zMpjkH!~bA+TXeK;sR#^X9sIsY$w?$`@yQ9-0T`DRW8bT)?+V_Rh~f6KCvTHP>pSsF+~ zdo;Fu9hE2vbB4B4f|LGrtqapscRXkN7Go?SZynnC)M{bJ$e<`t*aNeD2H!QTK3Lc^(=z;r6yYKL*Q)n{v+PSu4uiqB|g(M>Spg7tf z^#7{_(+Uslj`%qe9!|gb^!Kw>t=@qMJ--D1R=O$YKqArO-rE{$12Wz%DPq_KG|+{v=jGf z_3FKyO+h08QNsDNJm&ZpUVhs<{~de2G+ScSAV>4Q>|63g+snR`x;y^z0gH(V_=%=_ zbN3lMugNJ@e(Ot5`5k*EMeM@@KH-f|(087G`LDf9t#@cc@yf}!)+_((U)!Eza!5RB z9DN*_aP?l|qsjMPz5hMj-M;G%(|(mc4K&ji?>evZa%SbqJtN2dsdD+`_ny-p>z8@w z!;m!L=51Ryf&@AHNX+~0Gq(T5x{Co+f^hDd5)3jUP;nP_&hFsvoqV?TW+#0{9OeGr4U5Nk-=0J?mw|p34gnoi=6ZrTXpc~=?>jWiC&#V zAAVh(4x}z38B_)HhRmd+{&I`W=#u;9MHq#!nJ?l6*+_7Ae7~7~5Kx6q7Ebvd9UU_n%lBN+@V z!>F=Y;!Hrfq|+82#36QvWU(Y}2P3e{;;7(|Sv3qs7>t&)+(#OO!z^S%7uDThgFB}6 zKyc@2JWjxh)kH8w2n!MroRZ*!T zLXEOvJ63`HdppyELspJnhPhwz8SO26+q*B~j_(pLhX5iode99;+v)t(1kS}LiX$q> zp2e1yaQ&+w3zBrdoK+GH`H3KRDhDF8$;LTOR8XB%>VW2&(^~LiwrwA1Uj^C{K*1kA zn#Fb&DI(gSNrvKA7;=Hyb-I%4FM#ZYtWPl*1uSY$2s=FpD&p#%izw?Q6itci)W(VH)ucnp-l7Pl)F320i|`R z!!-f98;wM|mny8VbY`)a5K0yx|8a}EPxb3Cp+p60yNFB|6?+Y{ganwb4KI~m{L+=| zj7O$3p;doSN`Z z!VOk3nHPrUhT#?Ue8^BatYz+C7*#<&BApw^+V}AHMBG?9FN?&Nzg3{ScnlMfCWHGj zi|3jZXd?G{F3X$w$mBb6JDrzGyA^^wVte{QDyYMVniVZS!5sVZ| z<%UJ6wrr#Tq}m`AFyS^EBsHOLUl`!W;>FX8;t4TZWyPLCBbFKnI3iQ<$YeSAvkapo z07G?=TS+K}fEO>|rn)?q{fV5;9bH*GO8sm9rgBZ`QNUGU`spH(4ls2R5K@B5B=EME z@N;CyJQjZyk%ecnNdjcP!lJ8M<`J5az8Nf~|JW%cKEsC7wHLu)@*U7#N>$u1OT1kf z{A9HM1rf{4rZ|_uSE!u3$o#D~{Bv1q_Gn%{LArUImv6&gol#cT3}i0yHxqdI3OWsl z+fCzW{bm`=6z7ro`56#WHuUx@U@GDquuIbLC+c8)B3DSB8a5G_RewwbtT|CaCb2l<+|CFmks|v6;>4)&50!!^m7Z zGFZSR&2VF75GMjm&){#R6}gh25IOIt7Dx$)xuf|zXhoN}NCpe}Ul-NXhD*xerlMbL zwnRf!+*}$enGU&%Avz7Uvnud@EkKwl&L8H5k+{wRDBgz85JIzC&ux_<6$E(vIF}@V zLWU8xmL<$vh}=cw?$&1oyYZ@v>|`dwH-qa;f0?$(%Vlu(9RSk%q}$}&{WNZh47vBh znRH7?F`!B(qf%#}p6%S8Ic1kDltPS6rg2?K@Jteav!GWfT2^N0Cg1CZH2;Gq&J4rF zMPEWj_h)cZ02EUMt%*f37Ll<8$hE3yD>Y8FX_c-J^rmxHQu$kj+ymRIG||Xh8&s^q zRv|$?tYSK0q9S!Pbn}D>a+;t$eF&x^z1hK<1kK2xJ)N7D@B(Yq1}DLHD-3D@7e`{j zO8_$}2Poj~mm}lGSz1eL#^UW6f(7|g6oC;CPOLzz^5P%ErKk%^!JC>A20g&5gj z9L?l!qd_o2FA2@hywItg0!{pdV{{cGseqY6$z~!i|G_EalXoVNk#rVBfZ5VU_m@0N zW})&*_}=39=^L21TO2cjA}O%U0ttY_qQd5cHyFL%K}Pw|xuB<4R$@9o9h2HaaFcD@{0I67T3&0l(uyj0syAVt<1Y8q% z`!gOQ)8M~$2j@h*P8NX zN{-JQ2tBr<;X$0{b@PA7L~?OFo|n@QuSgaGM^gWuhHJC}vPD2y2&e*_RSf=?)@R3` zvn&)xh`KyITbPCjArA&CDuJYNg>lQdysBT72uqS}8rcry?c=YOvtJ$stkKBb^zMg2 z#R+SdiyRkazy3yTm%|!x$=Nn2`$bj{fvr{o%>HI+ilOMfqSZo$xYy9U3LpqMPBxJ1 zB4>w;7tbh7Lh=p9uPmaGc??7&EnL?|aT_C|EHRnbXE1cBY9A-RN-WE-hOwmOr&RYq9^>QS*DSF|rzAsJ8e7r7u1YQic4 zEg`g`Cx?LCDdTNz;3?ncZA+kKqq)oIR|+h04dozI#8$u9;QORhoo*b3My4x3;J$=J zbXGdRSFE_zZ2MfO!g`&YWEdn`poW*_r-cBRO)beEfsjCH48lM?Ae#K zN)yv*ArXpySOmazvUA`_sI4?E z)dWM+L%z>#yF2(j@=Gq-uGlD;gFz#=DY z)>n`3aYbi->q=wbmw7%>${W6SCFlNJ6~QJlQQ0=UASUzA!yy<_15(K{AcNjGY9{>mY+WZN|sQCAM*FFe6wGK^q`fZ`#7AHh!giP z#V2^LKcD#4HC}RV(fbsGcIHR9xPryttiJL-Ao2Y@#W^a$Vkh3Xwkp9jzJsM zMteWP3fXVQh_C z+HJ__B51iv-QxO%GwwdhO2>;RWfLt17IvN%+rHZEjRkaZzgTQOC@m4lkOwJ-e}e?x*8qYtDy}E1AEXUbXG{_4U)-FK3yU)3IJL zC(4QEsFW7kpXdT(YAsX@bF3pHp<3etLXOu^IeWk93R-k8PB-=7aC_uLt>c+fnttba z1onVYQ?F%sxX2Zof20^!tr>HoECQ|?V0V3Qj}cAd?EB2);(u5ol9D74&2t6oP`}6pI7fjp$4XSAoH9L{#+MqJcnZjR( zq0Oxo_}pdPB0(T(Mf0KHmFwsT_jlvdP>6N`UD@Y#mdlf{`9)I-+LAaN>ise4#>k$r zmz7VV?i~SwY+n~>@DUc3nqb)x+aJQUAK#HC=+WWcmdDnv|IhOHx@~tXPi)xp+p;R9 z)Z6Oh=2MsAQ}~u~ovDZX>(fFi*5<8C4?dKR^qu|=b_J+wO8UK*=cCW;t|)*Wx=ykn zE=qM90S3nf(+2{s;&%dYJX0pYosS^(p`hPKqP%-Uh-!N83fuhf`C+bgY7nLR8q&l(Nu5ASi4~I7NZ92N%kGTL{r3u(Aej6fu^}5UXBb zhOUG@g#J!1v1%#fo!L7_NZNF&|64j70q&Fhq8vtnsU*nups=8duXNb7 zMbq%4Zw-0YxcO@S=gxz&1qH*d*laGQ6qW>(h83Piyef8^v2yvBEOh zRI#wqXDoIE@jSLb;AH=<5{lH@Sm45UAHk=PVx!VG=REu|u|MG7@41eE<-dQH0|3ZI z+&Z5XiKX&8mv84Zms!9qjzs=luLDb{=YN5W94h$%Dw1oT9rZ>P(2Rj@VWHbPPvw(XU6Z>Xk zL=8(LyatyyOf>1F26h|LdCU?>P0O{!zm<(Xd*D6tBWa~`yXR@1n5D6|tT#ZmpqiP+ zK~t1!Ys&LSiN@V@9Yql}CeuO9I5G?6yriM^ zJEeFZ&=r73#{C0ZHFARL|ZIN#1_dZ$}N)FwELNmb9hRzF~t^+{14&$ zFS;zb#7r5*QV)`gOXI~H_|CUVh#NwsgtqhNt}=`5m;Wtb*3xQHH5-zgdDkEMSJvoM z2?D#r17YffPVM{DP#2D*G%U@u)XlcrURR>#z>^{PqHcS}b(dF;2du*A2x5r~Hjac) zv%U#f)1#FPy9Quo#0P)O6mRu})U&omT>;pYFgv-KR;JA~s(g6VGq}=>$VAwyTqkid z2=EeCG4bg2&=q1~BWxGS#g2V|PB7QKFdhg?e*>)$HlG9T+uP$^+K*8t}WNg3mwwT?VmqbqwVzcZFrlUg^QMjuZ(orZ4fKtQ9 z2=~)0HN!Y}EZ~@#IX84X+yxdQ=4b@oj7KJHcSTag{#SU(fyZRwWY8}2as_c7lpu;LdPQV>50js&uq;VxuMET1i^v; z?lpR!ab?}h{-dp3Rx4aeW16P5Znk#A-Ld9x)TdMOti2;s)e{2AFwAhNo&LDX(s{E$ z!+1pJyhl!~jGrdmQ(<=(Gf*~Fw<(YEPMpRP*ZN^n%~rjO)*NQ-d)>KNr{d0F`U{nqrs|J$8M`+g3bUiP!{_I(EkO8D+2HZvh^ zcORGUbFVXZ+?s*hGm>DIoBK(CO-wNDIsVVRA;|G#bj97#`W34#tj1NT1%!Yo=GDec zj&tjt+#PFa_b81ylzC6|Kijnv9wM&ee2T`s@t%K2ufpE2jdyHzH(`3-{QY%)i?gq@ zX~WO!H?Mr!zU$t^tA8z3N4Fo#+)?WJ)^k9$K)|_LCq@MTU|S)B)6x9rC7JrG?UOoa z2uvvsl&tR54jtRIBU~n1LF&}FDlc{`h?uVLM@<%f*?$m;{JD>P{Qg&%nI`v%Ne>25 zFFv>#U#mN4)2+s7IkC%?yR6$q=h;;P8}5);8r@>G{~&Pz zJ|h)Zzh7`W zSq%+sYL*<@6|u=;_nl;y7e_FwRq%25(JOuD3HsOCgvx)m@_j~+;DUAAX3O{cy)}3K zFFRm^of@7ec%jDEj3|P&QXl&Y%(X?grTTeh}MQb*%V#GhnuVr6nj~ z#*vC7Ed^FVhLg+a`=3$!kKsqHQtMa#jnH3)DJQXjMjC4VixUI>)I?+GLE&2Wv+)r{ zC^7lVU*n}?2Y~Dl1sv&C1bMYejV(;#Gyd;A$t!{DL>x821`%oJeijSS!>$OWdEh7STv2Wthk}wy@?R%hs?uKKLDO!Oc=q0h?c%X~B z)aexaYca5e9Hj|ax* zD85|k-oW)+U!p$4@j)LD)G3HeiP;*2Qf~OdRx45jSG|c<;6iq(mbxZzlX9f%K@Qzc z)jXm^Z&VLb0Iz;hgVB=+0)<#7&Fr-DD&e@MBM?~>*R~+N?-KVmZn)EHoSd?&Xg~#H z5tV*1FWWjl??ci|T}*?}qgvwH45=;0f+TULwI5_-7PIiz*kH}xnsgB7FYJ{duFhE^md*JkN7q6Caz4>^cC-IpU5pqU3Jacqa=FGxFP#o7$b81p4A3b;CfH zSjer7qt3LhTMliki?X{Ah+uLa{@N+U!MX2o&@Qmkx-=QI0e!})KhWx0Fs?>y1U!v` zy5E^AAseE%#QlS?tyW&Sl&1wOt+ZZ)S;L~^ma)|r%$m7giqfBL#i|KVRwFy+D1c~Y z+u$iZVWwK|-;u-FW@Rx?HIYPNkZTsDJAtfL7vwqGP#|Hk-)BT$MUt3nQWP4nkn3km zwjAvzE%?XsaUL;E9w1vYOOoVOny{L6EH#BA^M*^q7)wE*Dy12UkEy)(~}isIVncQ z;-GLr6}U=FGV&#_&jg*RPF5sOF#mX!$y}wFW%gFZGIb|uE}M` zS=#x5MBN4tLyCd+mA|i?|GjtaT*p#hVi!atPNWuNa-_qKkm6kG>^yALY$bfL$F~xc zdx)FPO3mfkJ4KLF-5PUK&?oJkatS91g#5QYv9~Do5x{Df%+^`e#5A1!KWcV~^>A~s z{|}B=HCJ_}_G@KEERChw0JCTSoyI$fm0S;-K&jyJow(13ld{(=G)#u7AqvNW zQMk#jqgvqz$oUvY)dJ9qmAVmw^v+$^^EJ127c1Lz5{|;IWQm`z3sPCWO3H%Nbybwg z8a;_yzG~Zl`^P=)D*a{#v)%?dMX>oU2G}|m{pEnK#KBLnwoao}Yy=Vb9cYcPVi_fH z&G+Z%nR8$S%5OI0Mxs2O1T3mdoCZbz+Fc!bZ#bMdg}}qiVnK_yt`^j^`Q01qll#}U z1Q`Ugz}puIh$GZbYat<}BCZog1+>!OW%>_(w6T4da$?_wbWGTvMrhp+-J%y)VrSxi zW*7T!-AbF0Po-vtF~!Q`6wfRuKKrHz5ropz)FPZTF3)+1>=6zbJ^)2?D_LD3vhG;} zVgn12Gq1C6`pg8X>$3F4QqTDBHRvE{Qv7f|q~5jD#lm6r-_O5;=TH2EjUJ~+ZFcy= zzY_Llq00dMRw+9@Na0=@xsz8eC#gPK@9wofNX?yPMCJN+Np_cA6P{vCHAML~JFn&k z*=my2;6dKQGf!VssP=7kYyIl5!y`WbR{ZOA55{V6V>{MjiE2c#2{p*0=!A&_1OE2C zTbqB~jTOguat0*OE_`V1a}J~9wj+b13NIlk0INj_VVOLbOvRLEfeDefjPeHmG-44!to59077oPl1({y>U8M?SbdXsU1s5z>UeD{o$g;*3@Hb~tDDZ$?G zl5{DO-rDrY=gKpm(vv?HMdt{&ckc~nX*vwqXRHddARCGxM55?9oEuYmUUf1vu9IwK zIHTFHu|mhxi!M3qN!A$;w5#OkCDg1PuW%yQYb3nk=5V%FQqCNM!*eP4wIC!q=lg{+ zd$Ofi6SjXEd?Wz0NY{~KI(J2#ejf?+WI^px(@EgR58eOuU(IL(2$c#?7j`9<<(@{T z`Zke@xT4jemJ05}tg{Sr(B>6+z3bhWh+v!@Tk%nM0!7nf>9@*WVwsiKva)SfoI~&d z-r$_iw?fP#d8r3efp_1%V&XqyeSgGW2d1=lG@tnOKP1 zqfFg_tPy~sST8(3&Tjn9K@687)54oASvD-GZx#id*`s_BFssTWB{js4$C!xgoib`N z$gGaF&+R(6db+^;KL}m~>!<_~fh={h)I06>aSgV|(opy)(vEZ;C1QJ22iegl12oCD zat|>43X2M9!EQi$0 z4POd^5-2WpQ2$bKz-BCFtwa#)0EFU|rDdEEP2qMVkJ*0F3r!%vu>Syel&v*ARs} z-~8-{bKzd$Kg^E)KZ?%9pXu+9-~JD8$+BQ-d%fZm(mCV z70f+(=Er+aj^3@i`!4@zy}4vE6} z2*>CMMJknXLb2O1sd6_S6$IK3>}Nql$p)oGjf&nZ&eS_JwK^ z-BlD7HcFRfM;qLZ<{$X|bNT(#n@0-@WHJy|&Pqg?i$xFxf5sq8Em1s((5+w$p-j$- zhcIi$8MknbAyh82PH$-75LtR$J!g#1cF;>qEzyWCb00aJ)-$-PuVjCEoCdjR+E6Rm z?!#D-N&a(QQ*@bc`=vxSlG8!76m4it>D<$XA9Zf^{*z7P0{}p-!~^}`-&{ckJy*gV`88_rw6uOW6P>iZl5+( zi|KTK-<(EFrx$84IZB7umoKcwicaQF zU!+fL3VWG3o%Hl&ww#yvYTv@Sr>}CC{|noR(WkYyW)!g|*TCT*BOROMJWPG|iy)uY zY~dbAM1u!yPANw->y$ce4pnlzt!#d{mG?Nx=z$-LJh5hZhvR5#_Gg7*#Lq15ZSCy2 z+1tQhCjD4rCOzv^t8boEXpCkX!&)0YMZu5+!MhW!S$@3HLk^3Mr(}xbcKUByD=rU4 z?+snqYf|iZV^5=24!)^ zZci`eTGg(q$NA&08a3bJd+IgTJa#|zCdF`J?@cKBew=_*(QZ{lI4gdqmG!9YT7%)w zb1#29Pkpfc=gWOdFMrN(2s>70ORfIhydp53gB^2~wjm9YS%e6k76;E7*R#N}GYZCb zvv8w%#+!0ICO!XMo4i@9)QS{Tg#U^#LPt=J_{h`e!ID>NzJJjd{XYu3mT)q1w0*k^>7Y>p$hiRN^?>dG@EQ) zx%<0_2GQ?`LE8%M4k;HRiIg{P#I2;=hq`5EI?Ua6%D%pvJ(Ox!P#m3mjyeHD62o)1 zUpvpL1@60l@W}U`_v@FN0uTJdZ);i=xeavuS8xNtesw#l$NFKQjAYAS4w^p*M{5J{ z9%EVmtmoUG4=BOkwy9g(wN-*J7UJuUlO7tc{aHBin^u0}cgDiTDD}-v_v_l%U0&Ff zdU$i|dFr~iLPMQw^^i7veaD7%AA)KQhn%#mKdqwY4nCql*i9TfwCVDPEf)`OIhS02 zX8ZRKVS`S(iH?KlfE;(HTZcn0pRYfcl=(4YRz2+M9A=wp2LNL@g$;bJzi{CD$DJUJ z@Z3W}D0kgrltOd(u;rnPm6?gxk-rH;-ajtZ%Pud*u5I4>U-F?#ds`RdFweJ6Jj3^R zgFeOiG;e!+{?O%f+ZXp3ecU$f5!&6Mg-+b)9P#q=p(_L5&jqAzoSwlqc=QbZfrYa?G`FJ#|Z`qag;Nu0gPo9e-;ESCngL@U4lcFQ6wHGXHL1b?RCw%LzG zo~km)e@J-K_Uc>Y?u!;`$TXo`g>g+x@s` zrTH=l(k!PN*p;{bP23aM{LFvLkM6?7kGmsQpFQU7=^4;UPOZ*uAISgSd(r=MgLnAL zPgy^&&rByJ7KA^aZ@2GXnvTy~YM%Ma`+V;GrdLbPG#>tIKh=+u9bpw)MeaaeuaLwuld%84HHWfCnp=0RiOYLqk-d5^%5t;)#*(*R zR=aN`;aT5DTHde!x%yz%@hgM_KuHj*96x-1LgYG%-U?rpP^y$LT55S}5`0u}7E+;2;y?@aMGDO2h zy2@ODD9BzP;&aeqR_mEx@=AfSfk~-c^gU?kz;@sA^~k>e9`0XSzGIE_WO6-j>yfe`9H2o}N;fvFA5Cojlp>scT=Qplr$}5kJ6y zi!ubxtvle;^*fX1xe6n=$;DleI!%f90Pn;H?jebOXsYhFRYx9<)GIOmLv(TXYXG- zR{b5lxV|i~U$g7iiv)3FDc;omkKwG+GiF(&9#{^Id?P|v(a^7G3Z@{XHx#g6*Ko7p}=3XN)s(f2=H1WyiTff z$Y{Zjf`0t@FIRw=z0kj+2Rlqe)(~s)<`6fA?6oQJ!5<8^-0BIj3;&gcPxlww(r}bE z#k>@P>8#Qi1qOvjSTZ55OsJg*RK`}Yjv}xF5f;meH5J8mLL$(H&SPTHx}?xHB2lzT z7eRxC$Ud4%p1TTK7v4#Q(%Il&LgEv)lyCWs$t0j>(Ro6todnUtRzPzwP>#Ht3*sO_ zYY;!R2#KNYq^lCpSt(q*jaVTp^tJ8XFf8;+aG) zwLv+7mDXD82UWrn@5y^Cx~Q9;g8f9_)e;g01)mND6~z6MDj0raMnIw18Kr{g9U8`_tLh1*|$BXRLMwH)M zS<+B>x<u1akhAuHiDw3{+e{_H5E{Gk^Yuom1Ap3wu7qyG|US{l1G|> zvpdS44WY6zX|;+Ek$&hlC8sE?9RQ&T!9{?4a8DLUatsZhH{X+gb&fg~!**hk(!+Y#6Jn&~6QW^X1vG zbC%9Ts|V$l)3_&Zi0^yMp~*~LD|fUvjcLH9tOXHkX={Bcu>SX0Ymm}B&|-YaT`T0e zLokMUNr|V3%o8CxnOLR>oW(XcBTr^B5uG%{>^7t+07_=sCrH4qB1k?{HF{8$C$V)G zq6>tzMK&6k2Y*dPXzw)R=>;7FTaw=(ludJ3D_YGb{xcR4)4I|A6p+|PrH>7_>_K{S zz8y(BK4PQ7v{B#*z|68d6h-h~F zqSEdRh&pYZvo3C40qP)v+5rwb(~UO?^=&DNzJVC@0-P;E-R=hG3*|p7_h*wrqp-C~ z>o;BiH&Tq;+t4mU2rnxmkglb#&~8Drv7{SpxDL*ssWmA~ggjUen!J~IW}xLzQhBh8eL5Fmi6g z=gGmkG>6MVQfYFu6#ysedN(i0AY}pIcAf5Oqw0utB&3)1cup zc%EW(fFoDrIbZqW-v-+~&_i6w40fcc`BLtkAVl6PA8bsFG_u&!hTr~Bc`}lO`ynA{ zw=wn*fVdfe03%8&d7cMZ25Q%zbL{wMsA&#VD)|Z6|_z*D7|>)*Gon zg>d)|Wxt2>I_gX(qYRUKHYDLAgm*WwOvrQ|^mx#Vv}7x!rFrONn_RU9uJ_1ufS|54 zwKLrj1DRG<;wJ)?4CkLWGphE?_B@m)5^u1Ts35`@+k`0lEVGXg5|a)a1c6!67V?Pz zvctF&Jrr{aRb_r>sGuF2LsG1bF0*5=u9Ml)zEPi$WbWWUcBDQDo@;M_(ZvbB!4=&N zooV(*Nk*RTDACs(CHI`-D{^TSMw^}Xll|>Bd&|eH=;unyKW^Qwdb0Fp^QIYb#`~`i z+m+#C5+%7Ruw_G*at?=3o~846KZLpMWO8O1#jxg~Jg5t2QQ+Dlc))2>txSV6-*P?M zR_%U*JOP-cO6Wi-R8NTBAErV@!lFe8hn2-nD!k8zbmGe{w_awp#1_(~6g`V(OF*Wj zg;4;k_96PZElJNV+wtdDo=U;3$CDna_kTUzBnz7lc>2hghVp7td_>`>tyD~eU-+C! ze<+lJ(bdtr*ZG|33O0Kj7k3bnOyOOoI1l!q*D|-E5@1KNzvb!f`gs9OYg5XL+H7>W zYIO_7D`%A*ocG%y%2QXRhl%(%2t7O%XVeSsV}Cm@B7I8#HI)GgR4X6OEWr8iF(a~9 z1y6<=Nn=wL4_6MQZavrggL74q;EsfbOVD|$Dq)$BPANG48^lfsfzEDBPs`uLwyRY9 z=T+_TJ-Fd5_3NKn`ech<*^aykso&Tnb`@3Il@%vb@Gi4#9qR_IUu{>*vPx`;B+;sIyUe?s zW zo3)~yxj(}S(>+Fo5IX>7DrANYBGEz+T!f^ykw<8!(zA|yY?}XkwTp889ltmJVcqk{ zt2zdCP`fvOFc$7=I%wO}t$bP3k?_-@X>*=)lya{!BvIHD+l^iyY*~DI~2^Muu8a@)sNry9x298_zubRyO*qATz>hO@FmQ1)x09mK|1IU*6|>`4y>))n?sE71qz0t`&KG{Cl!hCbNuVSN zV(e-E!m9j6ra5l#2%C+ka(-It-ZGg)`HMa`{=Vg&ca#o*vMB!L!eb|!yPTQG3MO`ijkzsE zSFjsDhJvz0$T|r#@FCh=PK&3b*!}1_5vm0kJ19Z)K8IRL?4I9j+Btg_ zePLj9U^UL@^1in9_pt zcJ+rRYcvjA$klu{q4mA%T0V|Cdr=V*|MgjYs_eS%k@?*R?KVG~b-eNVV9(sif&9(; zw>^DZzUn!JaDBUF$J>vpkkWwHAD@;xY0p~ic)sh#>yM$_)EmzSw!hi61ErOuocT8vq*Ts8lVC-l6^y^%j^IbRw5{=$vfmA~mJ8ViH2i(1!^&uA&y zw?8OAKb~6r`2F~q;eVfI^Everon+{Fl^1TGT|a-%Us^qKbV1M++329|cg&mudh!eI z?Db%M;Idn%R7tX|Bsx@Dw*33X7Yo@9tccJ%XgiMI z0t*0zXA*?aYT4xIJMW!N!89~c_ou=vaftG5kEv|Q%59~%;3~2l+*Pe4II2XMCEk!g z^h7`R6#Q^Y$n=}laCJX_d{^c(iWWBtGk#<{+fBIqns|3s!&XmY4F2n;#h;R!e_!tG zMcxCI>1qz?YH1p3c5}!KU6iqK0W^11#DQYa<{WCwTAvuJ(bv*5*f;UUw+^yVM1}Z=S*6Z!Tf^^IpSs`blKTs~b?)e$qh96e>&t9U zPoDH|b~=Dw*ZJsl$eC>eW$Vs7ITv|-|6jD-*{O>$_vFR9P$Lic?He3@yNW5>tcA&0 zr{Iv-fP)HNvCRfvo?{gmk~R8Dx}S#HyuNqJEK)sv6^)+X`0h8$xcF|g!anyO)~RQH z;>5;g*Gi|$A0D5LxSo%5{t;3n52Y%VjFc*yXB?^D<#Wo5&rw&WONm^MLMY0Z9P-b~ z9fEF>xwC06V~|K3ROcH7G{n&hDLX+<7DJ%#aONb}mPXF3n zr)egy26}H(7#KQ=>evbS4x3^i;oYY|MbIRl*(^-HDhQ^ZcJUslwFh$+2SCtZ{_E1MeGCp9Q|o7WC+1*)>uL3*-g-|c z1nx~OwOizS6lJSxy7QE&amum}=%PPK>z0i`YbzNrt<(q5-z}y@Cmn z1jdJETr5@&AugYC$BSqq+WCT6PmN_!i2{sT#6eIp65Tm40}_d=9Am5i!fsz&JEo!U zkS%})3*5a`-2gJB!sQ?2h;jy?=%a{FoG2z7eJ2NmHR3&dR8<&H1yBP8 z$9K`-i~4nNoeI_v+G<=bp?AZk-d43+R{ttFnaM(7NLD+So~ zW$1EfR^t=pwz8Q#2+k^9{0k%pm+jh^h1^HvQOEn2hggao6Bz5^#c?_lwnhLox|64b zx2cbu!=LQq(KeXeiAk?oH%#%kjliLJ<7;AB(a-HC{jJY1GIk7Mt?v|pI3B-35faL+ z5Tz>H-u|F*YD&>_wz7KN?{@P^7T4 z{56l?bd~gnO1FC0a%q#zg_s&H;_F<*g&Wsr{3c)h{w(JmwVp(>mLG#=F7zw85e|Ht z3=BN*{mIVi13z$Kk@pqU*$gf;#-K1@^id6qttSij9JgDpJHE!{peAwX-jlxL_ifWp z9{f*RhJ$|RMzugR>41)h9ZV28GWxc#*ql8_8`1p zF$ES%;W@vEs*Fi|t@YNp7=`ozW5SPX-lLDWJ-diw^?Pdhbpal(EJ$R}am}T82;`fg zOVOhgf`ox^J`z=#O@nB?rQPmwm7i%_UTaM=M;sr??Lz=(i#h-{%0O1d#UI!DMByoS z#)2sRdRmLd2%Fwzugq|{9U|e*hr5?+i2z7xhK+Ej)ve6x*H;VfqJISpUEbpS4Qdv( zZu0Hxww;@=G53o$YC1K*C`+q5VSdsiu=H+7r=s5rC2*Dj1@KDr)H-SGQ7o2aBQwX- z)C!ol)TA`DYq&3JJbu&$Sgy7LxO*pwL#$v1kCj)bkn2I0Z*B1LE26|c#UWKOn-|>y zQBl_9gXX0hBI}|sX#mgZc4}iagN+=d&FVk70}rXw*UX^>qM{ve$?>j4W_mor~+6&RsdLbFnh0g&YY<;bhj9YF)sH%e7vrw=jpxr%- zXNqSrF^mn4FWOM#c}q})gO5|KLWxC(yYk}7i0wO(>EoI+nM6Ofo@k;fY%B`1lXlxi zvW$*Mo7@qh+_)58>$Pz%;aJl*)3EDhcix;!JC~SrCSnHtRMvMl^E_UEuuHU!`z-t{ zW`mq}@TLo!+OO}B0p4nPZ@I!DQUYN4fI=1Poa3KDjZQg zv0PxQTw<9w%!cNPP*!v#kpm)R-QI=wF*w6wO5xe@$4N344ax>8tMb3;aL>XW&ejyI z)PdCHh7Uz^IZU(9Lu-a#2q81r2H%FXwDzzO$wGd1_%0$`Y@ys2RCU~NolimHOPVVU zIzxh>hP6Z>hHh0>5eF2%{>YNc);Z-ZGV5U@)R|@fNPU%Dd+&^M7b{aLUTc2L8Fl%* zyy2I$8hHZ0M)}gXS)wlX=nV)t$CnOHJ6+||C;?~v6?MA+(6j43asRh%*|DMjw{78x zWvCr%ZPu^pP<>8AC@!LJ5gGy2E{peW>NH+#|7#_CX&bafjL8)FKs;#0PMynqYGc$y zQqG8d&upP4h%^-1B|i1qdJO`&gdRbRaa@0+LjtT$`h%pY^SQdJ04?a z{tUaFRc!Z4w}hCu-%IA=_p#zZrT*NV9B(trBjFP`Kb?EIufCnXGO$#+l-FR0608il zF~1*smO;{9<|AAtb#Va>gKU|LNVjYg0x}On^~R4)y({2H%FHt?1%SSZq($LRI4J*#c4~ z*P*b+xsAD^Hpk?BlC6RgMO0`iOf*Ns*XxL1gL%svI_!l#|Li#XbaTcE-mbkQ%m zXbK`Ai;7!fBZfG{>z8q#iP?8-H=bkx`<}u-i?j24LLNt9UI6%Yb@}r?*l_^qD$01X zJM{h~=LST|=N~z%+~^P9)W(K=%ZB^c&lkEOi`^(_8H;AJ5)D_(4QFC0H%VP5A=l;H_YIzkw7INIEzGo8qC7cpG%K#hk=jRI?rPXoU^-i#!K${Vq_Qq4|!2WCNePht=a4iUKm z+&l$gMJ2+dXbBr1!UQQ$U6&XrT2~H&hFB2dOW28_UD(eO^w=`-=s~yISmGHQ>{T*I zK->^OC3+YVk->$PS1PFO(eK`I7vAN39H}Ues&_^fPSX#??l}}!dT0-7|8s|!oZ+Ik zQ2jUYRfcj#7aOS^kARDI=+IyvL^zRvjEVw@nIQ#2+yWb}0yll48eyah3Y8?FV{>s5 z=p9Nte-`A%Kz#;qslosgMJw5DS8GALFWFhql?+Rjg+KpbR>^CBn`6+#@(*Os|x1 zUMjqH5`=h%np=m|VFE@hX%Lx2C6)>5SwKvR@TX}|6(U%jhMpJT<(It(imRb5wi!~A zA;C)kjF*()+J*SDChFN%tdtI?No`uPAW0y++35(B1hSP0CtrykA%~tRDg3&x<8YX7 zO;I$+^z=c$)Af5#H#}2^TvLL5pv$=eSAB=}h>R+iC57YEG&_&!z| zdTnM55HK6!n!|v{GvJ(5U^mO{o){6qLW&WAF;WFvBlKqqepm>PWx|sH%zFU$YB}&k zX^kn|tBWnC2M2lkh3ZHky+V8n2f>%%B!cD=K$p*4J5E7VS|54Oh5>1D@iIV8G{%)l zVQGxOd6wM#W27L-{UpL&qahloH193thEd>jDdRa6mD7cIml~HQsMQ`m6C*;F7TNDG z*;jY!sPt;b_NI>bEl1}^Dr|YDEk1TzVJ@vTyF_n0T|Efg6XBPbLNl&w8I$l_3`eO` zC^YbzB0LyGkTURtLik`-n@ZQ(4-))NVy27&N@wAJ$`xQ@{JaFe%q09|czv3M6c9Ho zF<6gjSg91NtxMFPL0|EDeG^zSBJ_teb)nxlBYzoPx6Ip?wtmXDLA{ z#C3@G7IqoQ0Iwzy?h})>Ea6m$6Wu{2IaF0Rg0Lj(!gWZX`)=)#Q*3Vu@agxkiodWa zw7qzZ;Ac_-GnbG~OHh^~?#WByCB4gH{5TC}k>1UB>aKg#aSz#j_h9$(9p_JWmnO^x z9&Q|XtRY=2*>HrM0W@GcRm8DgNz0QoV{y+qY67AllgGT@0g$v}6A_B6SJ zLRqK|%FW+q#10Dj+7H4ZYs3dAv3J4xazCAna`Q9|R{Dhi?Xv5lU_HjsN5z(| zzqTB_qTgQ_ws*Mj)9!uZm3p%X>JzikbpO%J#L-{8ft(FsIrSRO9IQ|!!C8RoW~#nu z8TE@ViXnpQw@xzj8#N#T6`C+A_4Y0g7>c?UP*C#59zl>g6MLLFl%dV9?^gbZh%3< zMO8AHRh0}NQGMM{BpSixTK9Th4VIt#$$w8<`500RV<053B7?_%~ff2eS2 zjMkIg>$ZN<5Bf^a9)Iw6@qr90K2tXu1bVRVBWRv`#iXr&c1+BASABg%N3{*4NCO#7 z_WyiQZ{Q9s(Th=FL+^-iPgr{h79f>P`;^Y@d1vk6LxZ`B06Y`4lY)B-V8h}He?}4! znVm;)*`q2c^_g#ot5h_I9;>Eug$$;_c2lvRn7CX?&qntL&~1;(oDTV0JWb#9G&AYx`gf0>Y##9oa?23n z4{c<965!4QkO22|ffS#vL70G}x`&^*wJIkaczSTtbbZov18)7k?dzSsJn^mpZD3Z$X4zuKVEN_FSAm@N|#ZRwy@^E>t_&E z64ZG~?A968)R~_+Q-Z6+xd!YZg_xgKvXVl)M6+H}$Tm#_H`Z*>0f+|+V*Xf(aNgNy zuOxYko0|kexgoI$c)c$9_3;L1A@!w!?s-j1=r&ETy?AzmCy9Ir+b4ismTgibQDFmJ z*mbwDrv*?YxQ43;(i-%@p-W(FLLh@gy;NPcO zzE65A!6<-EGjP)^oR9Dbj*6U=X6~RIc6A4D6>Z1?-s!o6;sw}eqSp5mT(iD`pBO(Q z|3sZr(v^bbs>315LQ_7(=NPufnhLlbA3hIeZLX>JNW;!BrX^7hlyciIMa2&Maqhw-RSVob2u=P@3t z@h1HtEuW~I#fmM^;$vgGK6Rh}{PF(hPx%HtJBSHWL7g&nGN}u8rz?GlxTva^JO@|& zdqg3WwpfanLXu;ZX+WnCfB*BlKLMYbJ}#D8s=Q8~IysaDXtuhKk^s%>SeD7 zJCu^8&;(2w8)|a%tNYQf%1fU&2Y%m@@;w-|1l3*A8uru>01e_Gbl(zW8Eh|s*aHwF z>MWJ{BhUv1Ia;^70Aj`Z&^V4>kYYo{A7INFRGRaEo z1ELj>*=o3=@ZSn|Ny&ur`%1wN@(p5T;P1G=ggmRC_UzT}ol|hmAK2hZw@wvh`PU6A zVo`xY{?R{S)qkfi{C!SP+^SPQD8)UX9+_+a2H5yC(BiUgvJVwG$gn>tfdSfJ9{@Eh z#-0_!!8>uo0joX$v24GuS-bC@@&c5yp^M1$jsW)vW#Q zO7GtDj&9t#BPV=**ZniQ#}k{}8yR5bp!`K_LKdH{5hJD?kjETi$aG)bwP`~^wfd9*C+T#uSb1>s4lc0TKx7u=g1@}HoT zdy!g9^wKYHs}26D19d(IR+tcqZ4H}tVt5N2-4)VL(q`|0Db$a_ZimI}PQ13NJm!^65Sv!20MFk$x+4}S{Y)P}H z>zHL5QfN{_-YshT+PtoQV+Y5s5!K@t)gcrOkW6O{HC+-hO91^q(vZc!{BF@;J?tu8A5J#w9e@<}}XH8&y)fB~dUiwWzuYHSM`=Y8dYTu3ot^21t2u`>^ zxWT+iasF*9vsT7Bj_UbQ>9FlSIU2_J-m!gYqp}*5it~EKSnlk@lVw&^}X{*7c4#vLE z=$`LrE7AL4?6=|BYr-?5=s)TQ#J1qMfcg zqG-ig|4i0)Nj;LWl@}M95jf_a*}J+vhsnRQn|yq{FI|Ia%{h7a`aQaC5z;gXp{R3X zqePJLXi%Ti6VFESk=|Ck5v;9vV`^Sk{kj}Z=?)iyrXQIDtDVK|S)uuogdS^OrSdh5 zO=9#7qEMT1JV@<~VzZbi%=Q%z@(6a4q{P~?VX2T9=9Xq+^4cz&mw~DJ2gz=A3FWB|etLupY?3W>I`&YOV zMWOdg%iDd^#$a+e&9V2Y1?V)f#OWUkg7E^7XBj1S&qTnD0Z)xwDxme^Vxg^PqQfGTLg};lb;sEHM9mH=~k!CO)KaUtiuCuPcH%t@~b0 z5Yb3W^bu9kJO~p`!Arxv!K!l{z3~OLfU!4-8?;l=CnS)Q;t@wSqmFb!&W)BU>D!m9 z%%@m9o0EGsCGFqb@-F0*^V>av2Yx+Nd(stS@?}u}Y)$25T@c|hAPa&Tv!LN!5cL?j zNJXyD@pSn@MCI%~cPNO546jGtHuh23%r4PguLp}i4N&{q@Oo#1b>kkX*9EhY*;TJA z-|K?(eqKPerN~Y^VMkyvF?SdUOF-T)$wBBS3h4V3gxK~WPf&-nDz0ZR zBQ6zewBAvHaSVdw{uPB!yQB5Y$9F!=i#1Pb41V!W<%$jmWU2YR!=hz)-L=P`BGuaP z*_v};o*zx~MNpNQ?!jz{+){2Tu~L#Agqlzx4*gLWrIuKzSL2AiFmV;@++GzWiH?h&+sXV-90E8nUeV<4K1eV_u_r3GBJahnfH8sa?GrGRMUs4X?# z#+_&oSOxSP`-UFG5o_=Xe+C(GoWUPAW{)}8289#FMbt$p7s{X0c-zJG=j`95`96Hq z`CV%Dfj_$_h^=D_YFoEV=tW8;0u3+vkhLfXzhi|-@W%x~&r&P0>-2gLmfdo^zs!d~ z&yg2J!=TB@sDH7`u#>b2Y9a>{DFv&J=Om~xS+h1ycl5QT9Hlw|bjy)ZXlJ+vmL?sb zy1ee%wHMGn5mXf;nfouza>T?cwGc86(!N9S1lctQKp65epwLrYHd~aQ@#SFMCEoLY zsQ|OfQ*}ch>!>TMG3hMy=bEizF5Xcui?Uw_7ac1|C<7 zi5J-qP9R?T0+>lgiP_@w`zhGhjasv}TX~@O4zGvyE#`RE8c2&{`i?8QiA5kH2cI!M zn2T2H;8~PKQKs}X9rmZU>~nvg63&6zcZ@Vdv3%&NgMfTLzShAhMu^xx?`gDuqB1|@ zgi-6f3S~&wbS7LhrZBw z)V6!{Wv6$#4DPfdI8iJUZ_(3sw649k3p`qSOH2;n9#d!r=rNv28QXMPA1#;ZlW7l! z=eeM}V*Ku&Ss;W_V!P5MEjG~A>hw-JUOW2%x=1AdcbJY$ZcW%4;D=kHPaIDSG>SU= z(ERUzpH;0@t1PJ_pfOg+C!H<7)8k{FKXEWP*41kbKS?Ba?bFz_b|aMC zR+%Ao0u55sYpPQIrT4eZJbnn*%0Qf{&}eDxorBFAfh&?ubS!88;yDp(Zia1!Wj6B6 z;{hEyEStI>E)MsgTsc_EzH^6dpF9a+u;i>tH7ZO?O3ecO@5h zlE1rhqA()NG98HMc_^;^ED|<6ltY(bCc+Z2xK#n4zgyH z?3L6Mb!#MxiZ(V5nbdh~5^^KA)s~1a{i1TBr&RkrJM`tW%J^miogEmi5iW2tt@8-V zf%wavC)fMOpZDMY?NUWtKY6glTNfTyxGpn%;Nvg;(}(MtyX5e~<}gSC$O?C&|Cfvd7t8Qo)RXE$4*a3anj3jr#F6(l$%Ymd| zH3A#h5bovuV%WQ=I9N>jun&>II2EGF%aRmpgs+iK@PY-WFHv|0?m$h?4sGnJa{gT+ zgEFB>fC4xk5}$+cnpc8jK?jekwx8jpbiwTsZ*3Go*HAbZv0+jlXkQ4z+PE;5k1!W_ zsVw>w{PAI9=^RZu*L>^`YjDwze)EzOdaE^t3L?kj?hFkgDTOgP@?Nds^q|6j&d%W+ z-j*8I;U1mXJbB%=vRqT8Tb^tIeZWIHtF;Btu3^apbl>&ts_@|npkZ52L|tLZV&UxtQgmlobZEN|*xh??^tjdDF}aC&U2} z&*E;oG-)8&KOjV|6NZ9FaXz&yv}(=4F||6blTdhC8QN@+6s?JG@cOxXkr@~Qj)#Gg_1kO zeP<^0O9re7N>kuuDKAQ%b3}q5LV?Q{07v6~ZGoEr14JQ!VwS=WFr4b{I-k8;&>^0@ z&Nv@3a3OI3e|fD`x&=)x-|@Xr<_zK~C|7Uy(Bm8foLPue@`Htl4O5Xw6Cxs+29F&F zXZXV@E5Rvq6Ttut&4Aoog)S}l#}9+`P$mn$=BSnOzZZFFNM0;k4jl}|{${5cTvg>4 zN+%8$i-CXx%6BJtX*op-@;tFgNl5%bC*0N=t*x~dTMw?^%I@D>JhoZySK&2%xT!Hf zb|_-yxa|J~PB!D2P}v$e#Vje${8x#Fz&<&rScA_-(g7PJFM5UZ!KFdN9I;yn(F3>% z{(NJ1=*Luj2fgY`IdHwGVgm{{gwek()`TvaitYj<_-r`@Ie4r;Klg6bWzWt(+9xX6 zdi2ZdSpbr@P3E<5i2?&5!{DM>IVW!G!qfK_GkpIYlB+z@bVo zrLpIZL>{vXyR=auo6dzwpu_1Uj(ywe26q1WZ>KzQ^zYM7rQqoz=5#^Mqc9dCS-^{l z=Or4Oxr95kmro|qnDJBaW2kLPEU?csJf6;jdXMgvv#3w%M0C~f74Q-n(5hR{Wb2+i z3#mL#m;$E&CCK|mC!8X3XJHXF@ZEguo+%!yvG8i9*s;Rz`rm%MCsd9AVs2JnlMIhw zR@|AmJNU_u86SGM)Gl74rxk#u;0bODJk}UIdh=Xj<3*;F^VHEY1-WZCoj2oN;?s2_ zwQ{1=0kiQhFEM`Cp2oG&$U&{k+Noo&V+3%0h2l>2S95Rq3N-oTSAl+Jx&&}XhrNSn z@@ZJ|x$gEU)8f61xi4i*IjnX!v#2tBOD0f~m;=Wr^JezIM^;pit1IetjCrS)z`pH_ zydS&$RqT$>u{*u1k;c3%Izo2^11Ce1$4acj`{dlv;CMtP9g&fPkU@Xx)tZ3=au9M( zX;vf8m5*RGh7<$b9S+Ab=8yW^r7QS73PF}+u@JeEqQOc4>a( zm%JWD?#0d5`w$6y2&9Xfv%+&{0dBKJIV^-A6d@10 z3r1Y-RIvAo`rXWVIb`^JF`K&LE%+B#n}taFQCMSEUK9*XU5OKHMr6v1D=SutnTXl7 z@yV75FR6RXF>tOi!asid;_sL70rA=5?x^X)>~P+aO;DCYi7%P+Aw!TuD+%tHEOsb& zTl-!=tt5qZwwMmMPVut35YBY{2Pj^37UJ;vJ+jPs?P5ANN?vnQ*^}S^y(eW`2+tb- zmLt63IY@-*-`Kn76Yt$f9KWA9pSW9(!fotP)idV8E_Z4ebFCRg>seqOHVD(_s?-NE z;6pZuz&gfBls?W!4Ump8*J1^-fnTWCm-JxGCo!C>C*>5If6{aKd};HtG+$5J+xbkxp{GE~ncI>48vnUd+3GbMYzE_YUalar zIX`wRNp^gW!B$`D1HIl|=$Zp{>H_Qafd>6{W#_={L<@J{YH0en}p! z5r4KZ=7R5i$Y#Tx!nbTNE_`-G&j06e#M&=Z3^+I`h$7;;GNAG-=jYubjrl|ZVU{FZ z`ulJB{tcK-rU$ zD(me`wkpp}NzHw_P_o1?u2@NYkW)F6Q?-;+jj*cjoq{tqweNJMieKd_6wU%{)*X{#S9OWGaj}_4Cgox9R_u z@}A#3@M`J6jO;Jy^nr=@$f<(A&vpu4A3Y!;Oiw-d+s*p-wmN^|X#NK`!tBg}Y1My4 zefiUIf2OnlezN-aM3(>l=D(4hNU8n5*BA0hk+LdQ!H?>K)uRP7_62XlWN+*XmI$)h zk^=UM5sO)>2*&8yu2|`M7NQZBG00`6XOWUs^ms?A{%Do98y9PmW^kw0Fz}fF>9jTX z4jG$m>qmZVyC*wrmohhgI^F2O5!V7R&NRb#;+S`}-lonBlZWjAM?ES{AHN-MB*q1w zy~b$YP#U2hJ+SRECA@L#tt0E4GcBI?CeQrSELX62aV=|U?!PnHRx>y9WnjE{4s~{D z(}H4%^OL>LhPMqn9W_I!)}Fmi~Y6>lkI`W1J3RLzT5O8GSsH`}VBzjkxbWmeTX^dB3v%{F6b*LN-J(T*%SBc%?D> z+kYcEg;;HJRL-x*?_`v%iqVa2JdL!ewh|rfVeJgu))h%1CM!0&fYP1wtW4l|f>~}e z8GgLdeopRgBWd5>S^Cl>LvPdC!zbs;o%B$LGkmS5PaF*NP&-*?Um8DK-BO91N!h7Z z`m%0ka<4(-uG+2bO>xIcch;vVPivK333~LpK5<(^d+UqReW#A(ewjXXw7|(nwUrqB z{#nuA?rM0U>dp&?A=~ig>_O{lS=7|W%C?OcZq^O$8Jbzu({Nr@S$po_ za;v&`r5A2Bd@x*o`S=FCKQTw!k~Sz3Ke`+=d-Uha(Cx>9hUM{zw>#F|d>D=$jyt0o zIlyez^rTg{1RT^|aGZ$V5b90bPQKVI+xKy!$mZpXgeaY|;ycf6YKFf=n1y=VWK+@T zMGqHW&5$(4N+<7hy2I(UGS3^|?7MtSFV=Ric05`1$lsHGw|)*E&YFh{`X~_nUjLr82#;a2s%=Y$!(ub{2EI>xc>7~(^HEu#=~qMr%oTw=lZ(IMnBwbLV})= zZE_eSjClwTV|8^{Dct2BxmidnhZ34mm%k<^S5}+aK3@AUc9qTanwfukQA76QD0hg1 zOMjZDKQBiw^)-T1C)qJVHk|Fea)ou6G?)eLf&VhZWb>unSg)NfS>7v3K?I#IM%;ct z^ODpx5gKGWWA{el-H+YX%;6jLSf&!UOs+88p*+T}iu@be{Wx{SLd(0U=l+$$oEQ9C zv>f|cKvJ@>?hL8G;4^@46CC$z7a}&MFbrPAdHV?&2p9DgUcy#M4;Gt%Z*FYr^OAF% zLwQJM3xrvn+(eEd>|0c>c$bou*G~w{axV8?QJIitgzCynFCQZj?qB|oUVY?Su*pBm z)6Xhg1NW~U4&=D<;com=?c#wnlB-yYz*T6UX-lW$lAmlEbvSp}PaVLNueJ?W0v44c zn#*_~y|`4OUQ3m0w4n8dljH-&cjL_i3d)HhA zcNW-w?v}#(xdpZ%Vt>3rn`o{&HJyP-tZXqevOm67)gndTYRp1r368BM%BmxYOZM{Ew2$u9FWfY`C2$ zY;wH7%bd)~ToK|y-j*yxS!lzw(-k_|-1IfuvtPZ1EvRs z1+_Kj&2qeT12`w+xMjH0H)wsnY~ge_sM^za*oc<03Z?@nH2M#3*?VBnpCl3>T*S>* zkD%fAfn(`rasmC~P`It@9!VHgip!RTYX_A*I$gs=StMs$&u?vfT@lW>T_Aq>PtzWC zA;KN`eeHphYihs;uQSS=yWSk`X)bF&m6=gtW$^hc!w`a*vOZ(fRWjJ4l`RXZltTL; z9xjLLMVnL}Kc5>|@3+OFKqFdU6)ppxe>Xz$co>boF@vj00k(XTW(x1V(bvglf*mhF znaj}G7+&2f;DAc(ak@dv2 zDg4wb2!e;zK<*P9{0>Xg_H8Ojq(uA5b^Oua&9vN$6})*<8;~4qom5@9N&9uvljvq+ zVZ!Y-n{T!z%Q4w=r8;iv1x;rKsjv{CyTeA^L%}1KvOTqa^P}G`SvJ^xDd~WEQ}FU7 zSfx4@LhSj2@owsZ?G4#sY|}RJA^R5@LEpc^eKz_j)^`YrZ$vB zPv0=|JPW1y>qC052=?lvt721iU;N&s{iNMjGFcq1@F;JYbayB!WBH28jVCax$-1ke zSNrc=doH=fQt$q?wevejX~{>K8sDF;zd2o<4x!U3Tg;0YPg2!o=UGq-GoL+mR6Uw6 zo%7T>qC6J6;QV0FWfxWNiC3?90l)SxU|lDQ_)=WXp=%RcEF7e32xj4~8K3IpR>^a# zZRhr+%HFxuUllZwe`vqp|1{SQC`luoW+NVcGdKOJvFg~*zvuRU(>Hvkuy#t%cW-W>($3gxI1j9e;Vl)eEsPqf1oy)b{Lj#mEck zaI1)Sy>%lxYQWvfJImm#M|y}a_yUhRg>D3>r(yIt0Rkg^#eDq*s~~AJBV7&pzWbyI z1?XftZJEHx{LDaav%`G|nfTT%8g$Bd`}J24=3CHI6&pjM;CY}?3U#sI!rN^p|7;Ku zi%CB-dTfBt*a1r1PcYezXzlpmw`h zjwxcCK%Snu$#|9%YU&q)+B33kbLrolqWQ*43wD>{tWPJ#japd*BK^`4(Vzu8Ro6>^ znwNjpRVfyZM%guF+>NAiS0Va}1!zVoF&P*UQG-9Ln~R2x>vYgL0KB-#4ax&1*{IV1 z8W?dW4d^=?4t?jkzI$`-R}ePjRXliU*%^UhUXxob9d}=bf*|U?vW5&cl6Qd^2cY8s zlL@Vqgs66VEpv;IRw!AR=MV77?ig&&CL2%Z_U!% zs%z%KWos#gmJ$$~B0!Sg)|>?Fr=nIjjISoP_I)q?*4omaqpmNFqIj1$e&+TiQr$kn zjkvjv9$T@m^-F(U?h6r&pAj8hRrdB|u(Nh4Q7ljet}E>=A-+-kWC64=?xPK={&Up@ zC<=o%B|uJ&v5o+d8H^i|;^=ifK235?QglUFsn?UIHx6L29_5F|-)#yipWa}$CAHMb zue3g-$9sGJE+@5F1}<2WN(= zq{ZriVIeyK)xBxkwj=A7=ea>n}$6@0S zCmGcQ?eyC7{AE*7r(VmY*(szGwWq@7K~#L-5(CVfc5so3N<#E%6nk7*cj*z@@3QFivf%cY~3~Mp);a4 z9sMKS=aK7TH~gmGB${?S!hYC%>*>_hZj{Ac%a{c}Y_A<({c=n6fh4OGiMz%QMxUG!mw#ry?%gpnGkVK^S@`Rj_!WY9Ofi65T!fsNDS879j##?Y#;^FeIjAGP zXl7zQa*HdL2SrMQ_q-fH?8Xx8CXo3nVhlfTbiyN)RYHS=IQL3ZkQ_j@8H@A z!!;k@40rCCJ=663z1zY&u$vQkx2B73Mb_P__1-QS+4i?VW&W{gRdfoV1;DK3LTvHY z*&sf0sli-5lN6`KPHADXh~s2XTfiEZ5bt4InBEi`1N>DXV2dD}Z*JfQ^Lg=G<`K?e z{{Xz>tM9yNtQ7EXvP}7|J$|5rzytNLei$qxX0Jz({KMJfHjd?=Yu zhzN{#i~whGfqZ*qo|=-`>?g;sYF_YRCZ;v>g2$^{yUdo?0z*aAMO5;x6sCFazs z3o-ra(2{2M>dQOxKl}H4b+e1vz7>!Lzt&}cjWV$V8+OKRlMcF8@(y!qT|6n)?^}@L zzTiccyonl@dlElSFL1lox)WZ$?;S%gs3w#G#drQ<)2p??1^YH!_}*|x$7O>vEjq_EnoM=>Pe~J_VF}+@N|;6mYhgawL$tLO5X=}Jt0`F zj5!NZC(^O`0;Cx`CN>F?oQ_}tNH02)#YVJPrP98wii6^AS8OSaKIjF&*@7U)AG==F zz3^qjXb{^;fN*k9tr_1Mk&dPe`K1d`r|Z1O_tFQXT9WAZU#@zW3&`vy5y8NKao5{d zU@#}tZDel`7U<%eXc#G9quk>h0%;~?6bdy{pv{f8yN^O3jSb@h2e^O%-h(QK68e*l z{<+r@2N`kd$yqG0Ft22F9pEQ19)G751F&X6;7{O;?3+^ zxYY{-0Vb!LmkQDrM>pF*i%pLT7N)>0a+Z40AcnxxJ`s$)P-mob57{nV2BhgmCvUFY zM+;B2mZ#cO!c2!RC5zZFNt0R||MYkNnN7bQ`vMlbn%&Er-BZ$>7-O(R6e< z`--C{CDFwP0G$|~ROjW-%Tbm)&*#%$v&Eo{x#3m%oWS+gAn>`!v_WZtiquGcH z>hUSGd|3n0uO_c-X# z0`|p4i03yNJAOWW;lX~k{~$~>?=_qPpJOjBPBS^Jo;U!{UZrn5;o9v9C2UfyKn`$R z$)0*-sOResuQ&j~7Cf{PYI=1)8*}Z8HRbfU{#TX~<9MfTM+hcNfGmXS&;2=3d6!KV z>X5*7_x?OM$Ju?kc1?Xy*Ex1aY|>rLmf=(L8_NQQkM+dIE;(=v>Tm?`YouBb`%pys z*eTa`&-54lOQ$aU^Dk%XS9)fj!VvqOubo83PZBKtpeo9J+INVp3K5qJV z+7mIg;BR%o5g7TfH|cQvDz|Y@L|eqe4$br?$3`6|sQ1+2mP4waFP^vT^jw}IoLvBr z22#~}y4r_5uaS;W)3F~xlQ|Am?OnI827d#FAB84BOUV*9?fF0JQ&nDi4t~Cr`Ja)i z&zoBLhKZxDU<|yDWQ9$pPLlFci7VKQZWPJHC4doU88{k|MU8GFCCFM&l`dnOIXP99 zuQ70W-69PNev)HoV#fQoQ$*@yu1s!&;@I6jdX8~^)rYQ3o-lCS#7k#|nXJrXZGIG1 zJqq`FRbx(@V~nA-F0u41ofdL9*dklwlv?mLGBf=gI$}vuOW zG;@!~>|=P=@QNGTNvFsfdM4+T^0GDlXs;1VnAa1*T9jM6GB7cYsE0OYP-_{jIcGGD ztHy`n>6{7ufVPyW{8ns^W}fOm7S}5vfE`~>W_@6#hb~ZIiw6Q*e4b^_3{UmnTdP{k zO6Z#m5zB?QwM1FA!t+YDSH&VXF~dOvMy+Cr9{CETe{As}%y@z_ey@k-+{wf-3O$HJ zBT8oKFT7tK&ZT^`S^Z0(coBjYRdamF5PvKnRkJ}1H*?LMQyOa%Wk`CQ0Ei+ERWV9D zG%AYopIhH-)P7-mcR2rr-NSk9c2+B`pxvRvRj0$LH@u)@$(t0Nm(K5s3tqa+H0pG^ zejhGa>$WOOt`k3KHI`1wnU6Z3SeRG3=xREzoU*g&^_BDMo4C8GwZns&&u+W3?EQrp zu6=WbHjiXs5MWX!J{QBduYjZcBA@6*Kf0fJMzuQo*TjYO#UhA-+Y(pS``^oJ-i0o^ z`BTQY{J1L=UkWFN$`>D4ncWt%ZNlJrRU~S7$Ask#1hz?5Ubv%a*@6qvVUaxyOalpJ z7*q8tle!(sxN^?S$=TP@w~%9@hFiCrrpx@|7$=U3o>|a#iWFWLO`bIq^b%JiwL;3l z_ta?AFX8K_YwU9EgRN@X$79};o+zRUBh#br6S?IVV?(6xF7M$UQoOCPj@ga2pdDvG|}KtqMbNqlzn-N%c@k4o_vps|DCmuM5OsL6!3ehE*>$&Xv@8#C?}@J ze`(sz(PO#pBNpe`0?hB{B#-2=GxuMCPYomIlbH@!xn7JRcj>H2#!GX_Xny2%@Yv>! zi{8DImTGY}PQ@2`(_z+LR^CN>O=dGr>El;uUyL$3u(GIP2I923b+{Y<{ni_C`R|W6 zM~(l@y}Nw*-|v~n#;W=6onJcHXn$rTa{#cD33Khd*um_=mZc+F#B0@_^maxwXgDUM z%0R=JxMPd6?FsuOX}XZZI_D;>oTtmm4X2Yiw7A|Y|r;f%wwQ*ig^Qvq% zRPlXm3HbyUC$SZ`6y{o=hu_{}O7CMoT`rP}_08Z$$Je0j)e-kZiO2FKV;Sr7?c4uL zZl)`Y%8*)CI~nYLk*q3V;Xyr2cfZQjeO5{Ua;J*kD!D3aOI zE2MIOFg@@@WpitfF%D5iR}MUJ$gVz_R9U9)RVf4A>|gx1i)&ao>`jX~ZC+a9DQ*qR zbe8AgtF}#`FY_4A`JeGgjcEpYKnthaeNxD2s| zR1)J*n5X^&^`fV1(6TEDf!liu=zRkoi9h<+-9DmQ6{-6n?AgZ9noGJjx35z}qt+Gw zu-EZG$|^7{khnix3Yt4Zv^!n7yf#o{le}eF=mGeNzbkRQ>P0+a*V#ofP``pFdj2o+ z{FA??Fqt#jR^8FXkArK*`+6^H>guqVz>6OkyADnDul1a1krRE=|&E^jv~ehu?Mj1U}~Y)f5}rz0ytq zp_jW8Ntv86xAKJ<{No&31$u}?36Kqxm%H{fs1eDVa32R&1(bWz29sO#BqD5ly{C@& zn_0|6>7Bq!AK_jDFoWkJ{Ju&LOhx``7yK8j?L3@>GRV{(MpanVrcvJxpiEwJQA;d6 z$N^hdT92|(_f9h@L&-ktO!fksPLDy2Vo$D8l)dQmtJDzjvju}fyn~mRvl41uAS0n{ zcue9m;Jgl-C(`sCqso&rX?4nsNPZbT4&a@S-jkIW?Wy&*TodX18K-g)aq1!jE0>H$ z9{ZY&(g8-E2&x5G&hb&?#T!AGEy}FDai%)k>c1Eeg_ywuxmx<`kkng$j>R@M>-q4w z@KH!(WysIx*_GbQL$h3Js?*jFbG=SP*kv=eQa(W#sk>WiA_Z^dbF8c(e{ zG}R5+f{{k{FV>tEfZB18tdeCMc;_SI{6e&CSRud@r%~AIBHIBeegVMKRti>XoABWQ zjbjE0mXLbSN8m6ISA!Q$^@ZI%k48T49qhj}c0u}T9*0GgbdN-*lCXxPH-IY^N_ zU6Tw_@|AMECrk% zFvmdaNs(WnEYDwM` z%?99BBq5-_Rm|Sx=IZ{5hV$%v3@k}PxEM5?N=6XL3oSI~0p0iVwWp`|)|=Hn_zF`> zSp$(LOeSXl;g&yyC8rSKZ5L-%*B+=jvtx4@F9>8YV5_oa_;k~fF?CwVD&%P!V#I45`k>Z{?z5MW~&un~xUWYVy~i_!4Zz7X(uJK`B;#4Z#o)2NX0T zVQOZkfh>}e4Lsix#gRW_e3^|x_#OHDi|E<{$ z%?Q<;c#2r*W;m9R&!FGg{h`5=FnvwCc8oz2>&Il_C}uOfN<0zR^G`wAvQy*vwQVlf zoISR0`}Q)Lfku)1l!na=GKby+YSvqWZNP-2P|f!iYuu0F0tFpVMG_wB>+VJAQ;g92L{*LEQ<{xknso z5D(E~Z_v%uJtF?qH2&+LBCH44_t6xFlcP>o5$@zs8lGZ9>}5S5A;t`0Ehi0X>D=_P z5O7-O#Tab{8059b641nV>5a1q7I*MlIMk6yqAz4?3juCy>?24^)gi!FD9+MMV0v6y zmI7rh_GMi4;0g4TTh%sW!apg@L{NXlnjV&FwTd$|xNlOSCN~_t!DAF=DCUvvCzmE{>Grh?H)rZk8Ab zDWRu}01GKSQ;5T}3FSITYRb?v-c3|!xuGU3Y=7r6a?=k@D9)5UkTY-?#j4Le+24z6Sr*{ zMST>LGeN^U9I7RjmI-3W1X`;Qm-@=hLk^#l(}(livUsF0;X#1B^u9uOPOJT_qTH*D zBID>gRIRzxsayUZaXiP3CnvZvDdiUGYo39fw#-2t@z7d+w_s_t8FExiXJ_gHLd^!= zTbc*VS$fJvXH|{Ra->8%z-M0-pv`9*Tvsf)57MrKnmAmIo{Y+iH245Vos}9dgceMW z!KbYL{wo3OZc&2l7rrG2jD-ZeKOOL)C*Tu#u+L#9UVLlzIY^Nc+~P_6FXn~-;di!< zr6tVJo3@1s8kXwaRGOD<8ZWaVEboBED07FR665^f^Sy!bzzq^zyg>eWIE2^ab zQ|JT)JGyA;gaw}p|Ek3+SgtK5IQW(nDnb@b8MKR+s-9_|V47_jvv=;&5eCA&BB|Yx zI7S-iC48M5;N%=xo%_*T8`6{u4eDR%{Y{lZj{2>y?Au=Hcj`FspBN4bZv0a}2&wYa zOt*U+azJpT6HmKn)kWMDN^K-tqlcM-r(faV$hE%>zj0z0d8Np8yFnwp6BG-*2!|fV z@6QIErl6aX7u8`+w1-wIR*UQ8V8|o=o~Bm`OH3+gXF1-@x9L}yX4N`IXE|Xt<0uOS zBnORDFH0!%Y-|8y%dV1*XN8nC-$TwRG(&8_2EafYM=Oksy3CYI3E-&5ePrDxnoBNIi0wVzJ2!Jy}#z%)+jiL&0Xj zJmNoI=m1C`6zcnG!NNJz9^oqw{Y1`w6DK(;h`DVwlelL;jvRUR2hXg|Y3Bka7))-j zQlw9B-4!_C>!7$RTeADXz=_9{oaV5cr-eDMV|P;_oLiz{?(V?jQo5HA<7W=`i1REW zvDesz2P3sR?^^MoQ>jw>-Hft3GC5=Yp7{Db?%y3=2n<}GPLF8jtE?E2eoLtVKh2}| zQA78W;&s>4n=mC(I$4S!06(7{!@c1(`ziJM8y?{io0{BK=z< z*zvueJ(FZW4E3Y*aFEG+vLL-4={60)n@3xP3x621>O7a~d70O5sDy}0h&U(zSU=wK zsDxrEzvJ8FOyN+~SDN3%e?sP+9Sg$b1BEiOibnLGL)1|>$_k(qR0mTCS>|9*Tc>Z@n zu;s5rN7H?d8@j&L7(Q3%_*O^javtR3bLzyDZswV;X4nLKd58G;reEe;3@Dy}#=j!6 z6@bbF+u9DeRB#U7zZ;YG>)^3p=8Zq7*O@R|_P&k34y_YnvfvI|o;l;2faikdkPL$b z*NOt4Sba7}x-snP*WHKCAMJ`X=>F!`ejrkn77P~w2E{C}t{Ltt*S6$dn%c0{l(J8o z5&c#{|HvWMl2^N`QSax5+(U<{0NSt##*I{`h)mgX1fEBvEcI3)W40xgZW!3V@(yUo zhWkRdGywhj6583C4KlW2kC42D;Ww8H{>uO-#D*iFrZ!|t0d93k4daR|<2O>p18zZV zaxzkL+|kicy!Td^cTMsMrW{!Z5kInVJOO@EKrDyQJrHq}hpW`Qaj*ErgW(sCY3C{z;sKi73n`}|z+o8OCkVODGHB#b zs~}KYj>!aB;E+g#zOYAw8e+;rkicv|A;w|&<~2E?3NmL<_pQ_4K<6cghrSgzfIoPK zjGq`oF_13Mt%|Lsr-JPaqojG`OGRx4%|ypWwG6+x(79QMgraED4sxG>C5FS`t1jZE zgrRd+_usqub5`>6-htoLsBuIPDf7%>l7YeTpq;rhlu)IaBnKa`mjyMVk?lsf{zp%~^Q#-uXomr4j~8PrltXgV%j zq}Oib+&?wMbUT*ca*Z&zd>>C;GBCd;L>36~=22RS&NTWlAY z#198AJ7?clmrer_D5z4#f0z@+M^On>+eC#6?qF*z=|1^(-^%`hQ(hoWw3-CgXmdw;LiGB zsjZy+N})T>AWkrry9!_;x#wdJc~p#_zD|Q84ee+(4T8zX9t7367>^G+wMBrNkQ=E4 zu+0ji8v8I*Nvs&ultG%~N}4O(LaaY{)PNzkw|OOxIG%=48F(dg6;0X}qvAhxCku?( zzP|Hc1?3$Vmh3rOLan>%Ph0HaH1GNC)6iocZdLW4pU;nFWRS1az6iYrdZt^ot*J#- z`d`>K^+;$l(VW%{uahmjU?MG9r|H(zc3kHw`9Z9xC*`yUh`O}@ZJ{D?>(z}xyKlQ$ z4l`zkBvdBZ!ZI^pz27k`af8lJ|IHUtLv?Hd=0Vi0q|qzP(T&sLb!3$rw+ppuGj2 zZuGe2mCDg<+q%io6RaneV>wQJabqW)Co0EsU4J;6V6{#M<+`X^UIi@co7DEfEwv&y zVG>-M16-BdX9VkD*+e-uSZ+de{n4ni)>Y0L9X#SjDhOEqIo>d3JKNS#4P9Xxe&_ zc_&s#%{ah<&$e4vBFuexD;K?O`MUPZkNV(~#z@sWa_6#&xeyNwd%hsoGL-&}qYnwb z=C1fL-i+CzBCDegp9H@&7qviTCk;1RM}wqeYaHLL_!Yf%<+`vl`I^^0SC$bA%R|35 z9bttu5iYEI^tGMo7RPOJN1fL0T+&4+53J~}43w?ycRMZez?_#u3kEA+O{~}p0Wf4z z?Ox4mGo)41D?WMs)HM5?VoJzcxv`>)L*_=VT~-|S`xRQR-oeaOIsYoxQeK~iCk0p~ z0<6z#Ok2+%H+bGI`2m&XF8@5dcdcuM8C$9eRl;wsc$?Lf>++CvPrCG@S=zKamZhV~ zIy#l%>pZ*03LQnwXM1Q-YFsT`rx0ly4!=|xEw^^P7WOsQNp0i`EI;!-GtZ)d{7$Eu zNJ;VVz5lc!d==jq;nI17?8m z_~P004cnI2wQn$HDZ|FnkC;X8)N~9(U{+tCFyWoc3(TY)%cr7E?w@M>Ir~Sgzb%?q zw&?#i|G90!?fEb5OFzwjmDzZ4Xy^D*ht0ETBEB3+EhvTRkKx3gCd zC@@RA04+Z$6-SHSP21%eMeGJtHkM5Xi!E1Dc%pNpaslxg@Prlg8EY;oA&V#*qAdAo z%Xq0e=jRY6+49q*MlqqZ&C7y|X)!l}IhxA^Sb&-RM^Q>nV6XKwRHA5?W*H;~+=dkC zyr<;Df{U={3~R7utuN@PE;TkQY-?E??t#_I5*YZEU|b|#%mV1FC$SVXJ6)yhW+}HtE2NZyBTF?`m7C&*_*cyMO?u6fNDCC0wwB*SZ21Mz zz-rqJFGgxgW$0TIcIK)qlZ?l|Nk|jE$7dv5?+hc&b7Bc*eVd3}tOPBzIEXXO;u9in z>XB?6)H+L5s;z+^hiaFXy@dp)Nb1uKEJgY^$P9de?@CtC@$6N#AbO>l)aa0X&U${S zMsQ`U{`IIECh7bOcdG@+AJB21-+MKz+B6V97}-7{!OZaV2yHVt+$F1&91S!vyqGvg z5~y7Sc~LQj56?Dyt6-hHwkFo^Rng$LE6yF)0`?yaM$_b1+1ntbp6TM!Ut(Oq00d^b zG-<2ZQKBVGuUM1{591+1k3*n{ht#3T;b;~B|Kg#}0YacD1BAEu8TX4jVdzS>Ruv0L zAR_ zIGWg3gLV$XN;ZOKyb=tS$KLn?Iq-0!fO)HW+Q7hJXm9V?fXtf$PfO_aNJEml*1!!o zPN`|rGr^$F-GI0CijG3P=-|SpwP$t+-ps__jJSIe-9EVKrHkMWnFo-n1nIDpeYf%A zU5AMx!LMGQs+nO;tQo0KVp8jA2Hn(@u#m>=UTaG%Tf3^7r+{r)JK5nu6*E8;jDlpKdTs^}|@-VAEi?Ecf zXdSP9aUyc}UZ28q3)5aRS5_=MTd@RIW&H#m`UBW$(-YIaYUU*+pdIt2Z58F@0r#it zzMg*e9n`g%=!^}?L1mubHsnp{Ox}`%s&g%IiHLh{cHIGKl%k811bZ8ap|gLgHU}O( zXwPgLoA-8_^7r}GE6KfE73=?DZa*&k!B8A5e=b<~_ld9yRJ?0#1(u{I;? zuL*C_g*)R>Nrsv$-YZrOE$P3quWotWy>zh>iFO`|g=M|(=^(_mG zCUykRk5W48pDca(Irq@~7-i45j3c8Uq4@O@ChI`TTC*7H@nH|Ee&{(oK0)hYN*yk6 zS=;`XUoZWcf6vxzkR>FNuExnHeb3d@EKOJDIU;O4l$;LTtu3bWj8aSOuiYEcy|0(e zBfUsX8ZiMgH}_Y5@P8PBQ}1K9w^dFVbpP%-7VxuS=v<$zgXqwwafq zYuWkz0(Hymp;He(#;*M{IP~ua&7_0{fw}xSH|n!`gzgrG>V0>?5s$TNIg3W6C(I-x z)=c#TWK^0Xi+%Iuzy5pZavAD+{zEWE@N@|&@=e!+e;=>-_h2DnJ&5`^mruk-~5aV4IxS$H%-|5cc#v(`Ygk&4GoAi82)*?oVC^J1IrW|BS4g~DU*pZZRK^5FWojIdwR+F=(~Q;nX{O_5eBb2WqzqJ7z{X@d zD>S@9{jkUp>%go9g{d}$z<j;MrkIc^dpC%-&JbB0hX6A7-wExd8|_0RCq0 zLYA78RKlNCCcZPtdEsHVQ~>XoBv}FQCJel6-CnyyxJn6EiC}6REFN=M#fLwggfHdo z!f{Tf?}xh!)Pwgu-ex(?aS8q1dx8pKZps|+na5GR9NSvkw#k#&JXjM3aZO2VXxycwjl&fyts#&Rm^~{0z<2i1mh#fwsBKE^sBG{8c(S&}E<@uN$KR6$fbFc=- z$W7VI{h=+F9f_d<<)?O(pG3Y12oMT}N#Mm8tIPa`}s2JN05GrKI zM841>OeVDCFYC;?NHngfARC z;KS@N@R--Ar7~m%Kd?p~a zvXGT~fh<5%CdRd@DL9BQ%2jWj1LktjkA&}&5@;KVt!yuI8Ksv*9AYd|8>%7+K^+~n z{iaER(1h+oGXjm5=)+_-TJ6kQY$SF=`cuhNcQIy$Pb7o1K_2QxrcocC*u=%Xl{1F9 z#J3_u@i%ZOq~SA4j2EnT$U1DqK)etW-$4W$ zJmR}K@+tM5TUKg;BhEk?zPxLCd_)7wP|hdz@zB}i%Vq%l7>O8uouI~x7bRRuI96~Y zD+%3D)jnAD@^=;WocNtQ1wRcWDK%GLt2E~tACnOga|9WHZ8Sojv<$zT9Qe60=yrHXvt$$2sG+hEQzv=*agJP7<~Z#Jb)i!8&cwoj0Es3 zaY?6OO#_c`QHc1Qp)%@Lsu>{SYYG0RBjJ?@F@(4h7)aSxlvGuCW7=%Oy z*s)Lj`NtkCk`%J;_HpsFy;W_$FJH&p6jATzFTa2K&+hIbgqb*B7toj#6SHOHkv*7c zCE?5%oJayKl*mY~?k2vORAi+EAYL$ty<$`g2O)ox$j5@8)gVI5-QaGR zs2v3eiTp4x7JgERzj5sDQqhB91|dw$)nX&C6c`B*Oo>rPg4O>W!ZZWtCAZIEJ(Q_C z9^N4qf5peMsrG)LJ`Z{F_dVez*h-S1Pl^2X0ocLEuDM#U>~;MaYHN^dYe;zOshU-gk%ZGl09=%;$g|z zV-G440r>fqFjM|k8x;IDboU+GW*hp@C0PE&;b#jI%qO)$=MzM>XoE3;XjN)f-6#Fp zmi0-jaWyTrKQ(nmK&<2frZUP7Ik8ji-=|p7KVI1(3f)fYFeCYNa*54sgdVrOQAFFs zXtw!^)&*duA|OH5ULf0mVJ^0iAUXK@cR?^KLB+5bW5I*{iG)$PFF&t3iauF@dDw}G zZzcYfk?398hh6UuTyONL9OkQtiR=`|WZ+E^afD-M$VF7ji7l)HsL!AmNze*4TgcJW z->41V;HL%x?Q3k;{EKMl5sP!LB_^_sTKV8h;KSM zzX|7nQga>{pd_l~=-)XV_m>mCaqRS1=vQLmKhNav99+>CC@xu}VEZ$Dz;b2_LAePXoLm#@cVyJfWkS_x#>}m0dD;<&$hIxce z=(H}N8Z^3Dk|=uZu7=M^_>Tboaeb*5iy)Wa?c!l}OuSYFqK``~73e$r!(1-5sj2cI z`Kxa^x><}uEjGAH-kNTBO-aAjCqo&tde;#M>*Hg$?}BC34c^OxMJlV;8eXGjYusLH_>w2Pi$1d z=GR|4fTD}Y7qZuvH+Po)y_X$G7?IU{`7l^@b8yAv+q?8}54UkIqx*UyM4BXgenW!S z2BI$?1Q#yun&`?ku^TTPeg-*)q2GAF!26BdxbnADkAYLS`vsniWAfUv8hKcO3jJ2D zelwYjHuUsN|IlB2HW!gYefBzV+L>=?QS8=f-7M41wp;6t} zBI`3(+N%KkprK;l3dML+<*BUOM;|Jt&vi7gj!D*Giwlq^LqkuA2}&-?X4bN%}?@qY(6Q3-Y^39pnVLat6MKN*<7CAgg&Hk89f-1n>4c+=`I zD;`W`B-=4Oooa{AxOF_)Ikw9GagI{6PmJN-dV&jlT97M0Gpi!wFHK!AD%C#HuL(}u zT231t!K_QTc7LZvWiClqj_!kqOQr`@BJ5k%sLe~_uo7kG7PeW5cepk9&~32y$F0|_ zk1-)1y>D099y-$T=-ZmN-vZndJ8ucU_KzcMVuq)QgLd6)2suI?}>GKB+9mCy7tv(_8I1fX%?w_&6_s^Yl$!5cVH^{yirxGtJyjBw-PXS;j_&E?#q=;5qBxKdRXD z3K(-gW^P|(J0)zB?CH!-nbRMQs7`xm=*>gr4rrb**9L;ocr3C2ZSin*U#sw08u593 zO;VfOT_a#*Aq>ZUouitDt*74 zLYHmKZ#kRPJ?TsNwP@w#|K1+VV+5-5VYy^;hb>QRL-(#~zo_Lv$m#wX*InU%+56(g z?>qW#Zho9e-}GbG;NAGQPcClyxqIZ{VHL_Ke2zcbdeYeEQuwbu6CD@bj~Q)t*{z|* zk@zz*PW6B9^26%ezA1#Bv*p*ctbQBo#*daO?A1@~QobE0+>E34=>C)K7W@#va3=N8 z+5J4LQg!!96r{ONR*gIk8^m2Lj&6ej(#$StJuO=8MiL=hMN_S%X^i|V6U`Qn$uugD z^OU-;hsSfI(!Z$hv$EF{y2fSmTIROnIB%4GCVma`C!#>$lxq zw>~0cap;EFio2nk{%bvRZ~E4YTj?_mf9zaeKC$`K_|5B0+^PMKo}mom?x=T011%Zg zV{+B&wZ)!1jL;F+Zh6IUd->~$3-K*CGYu9ocqh&Y%Y|1A`Au5yJup!YLiOrh{+07F z<}SF7`!hwgAXKOWsJ8j~JYH1!{g}a}LbAoBNZkKOy7zb{-~SKb_s(5IVCzyNh+0yC~0#jl@KMJG>4>8t*BJ8 z-@cFEf7`#iANO_NyRO&!`LYX!IV6U>H_lzgRZr*kFs8Sg&rKk4bA26*Q(3te<<+^q zY!^Y-bi(w9kNHIMr5g zMM6JzCvq}rW1nAw%SiPgKf&p|+v=UsBgdcfi!u9t9KkJ>39ENKK~){A8i+w63t&6^ ze6ieAE|NrAq_24Q;BjiK8Jq%g?42Xm^fx*peuqlXqX(-~i`PaSJGjH+O|XU&0_kY6 zcwgm4RtaWS<8+P5T64!pjqHJW2gJX6`ifgeFa5PQ`jr7YBahySsv8JA(Z~r+7;e9xU%A$#E_lS= z9;SD7=MM);(8U=~San%oi(|@H^d&b!p*zuH=Wf! zX=~aYNxSvzs!rv}q+wxTlHYn!bj!sf`N{F79vdD;k2W3aO~zcAy4mld*?8qsa$7diHP#C~qrpiFv;9<>+YZ&EAyM-M2T5>lC!yIsXa;mheq#v2FJQ zQZtU;-aO;-yxnu@b7m$YS|uj@*7M%f?3UYGzGOeY9rk7}r`IF)d*$7a#uv0D`Ut*CvhcJaKqeTgQhu2FYO)= z8)$tJ-Os^oiZMyGJXpZU;z(LbK`kUpQ0Rn5ZejKqM6#zR_;e`Bl@5#To>0&E4PZqM zf?m%Ahhs1LcZ}8uR{L?>6VGZL6GJ!_Si!0au69WHs^lPIKASeBCXIM}^LV=YwY+oq z$iDduGFGr1yO;1PC{U-#_vF5xWP@Wws3=VnYAn301yrs^J4p*N74@)silYmETyboF zo2!Eo&n9-FK$HK%iG=pI2xskxy&I?Q3OFCn_eze_eKmI9_UQ3dnh+)%X7I7G>!31G z`HvXp*F<8RZD65Rp9_SA4e@O^+aJ!LPsyM5UsN~CohaNP+NQrn+Q7DSQ_ZO*kF-zR zSjoP=?L|~n`h!I%UtYr@cXV+?j$zPxaZ%O{m@XswF{;r1T2?L3Ks%?v#w9 z|30JP13kji(@1~mJ6feTPn#&vv)V2tZ}UZ~F?-cIOaauV&EKOFQbVBrbTX#j+b_KS zv&9aETdlL_^*isJThF(2QH)o^x%L!xJP)n)KLD6ieC+-bF?xob=cUO-E9iXHMzD3) zI8(_<3j9R0)Z5U3b+uD^(Q@qKcBdf#-FV1Fcs~Q0XQZi?ysR-t-P`fDT54-NcKZC* z|33U)y>E$p%5c@!pBpvq{&~v&^FbfD{@=kfSV&IQLTfe~t|$~YM{_pS+b)h)7cVZ6 z{h@V(eZP*K(MQ*FykF8$)(;1ct7-kO^NOokOFUqXg`Ca4e_;8?-2=;?biST`a{JdS zLG~>701=3$7wl+6R!uc1kQQ$ypAiEi0!5ERAQsJIFcmZx)I1S&{F96F5MU?fp_6%< z_`5JBV(>CIxLZ}(mFq%-IRoMfK-+p)U^v`62x`z%1e5Z!g?Dso0nE%;t$%M+RPQ>iOY%>ucm4`?5Rq(bzE#Gd z*j(hUc>;R8f{4ucRKmo=+Y~iu6yI}?(5-EJR+ZojHZWFR0@J0a zBoL8-GD2R6Al{W<h&_H)Xn~4j}@m zf}iz**jeu1O@~~A^5cPf8I6K?dcMA@kChmaKn+R=LRf%)zSHh1eJY+*WCC8GJ7!qB z3K=G}y0Z-#1m1rt1Mp0K&Jdy|zF>8{�mH5#bCi53li)Ts67I%Sn^MnFHBz6;>* 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%0DnH|Af6_j^>1k~~Fx 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

aaYXj1 z!#`i&K6Ucfhd%Mi-(TOIIwk&v6pG*W*%(?$!9Gb-A@CA1!bFgQE%LwV`A%zbw`9W! zJAc8Kj7RCB#apg_p`Iik&{mA6L)FRGrJVY&d5zERYzyQv_w2XRBBVfv_|og9 z_!68zvf(6NgW&$&a9)y=$Kr}pEy^ECMj1}Tz#{n0EDDVyGpr(dZX3q)NliO0c0_YCXd^CMdI)td%XZT(VgW0@qGTQJYBWk$ytl z&PlMeHK2D|^>5GWA7fqD*z9OpwB7Jb2B%p1zN1pVBhH1=U3@6{m9e-3Fn8!uza`Rg z`sapIS5@AT*Wp!4fF4}`LHX1EXSHp{Py>qLrm9rNJMb>{qDA>Ym(>bVr;@goVPLvp7=iK|9Ie`a*Gh|LPol;io`2fHdv(J zGL*I#K)P;(Ad}tRY1?uxDYtyjI6aTrXCVN!vviP(UoPz5Px4XB*F%&zil}1C{ zs8UJ);ADAxOX-&_vY)6dRaL6pl-+bM(4f%*{O#9?;mb%_65@H^MjB^{hg;}JDB5p1K0bycun!eMW#RbPlFjQQcH~VwL8}`|Jp(d={k7GmEnQ5XallT|vx3Tt z2;$YX7_)QM(p)!|XH`&^4=G4XB?(?_S}pA()7)k-L{?AM$&O0WUi~P{#iBcW$0JEp zpqb=i-4Eu3etdJ2wI2#A4|+Zwh0q~C#8AjVbuVK2tW8qD5!)r#TTM&6 zeP%GDGJ;Hhf5RExc!){}0Y5qh=Ykp|0Yei#1$Y;JR}dx$=2Wp3OtdKaoE;rD?txII*;`~Fh!V7|*b=g(&}uTFeC=z4tO=?1qihv>31bXVJg6ihhh zruwii6hU0W-NDgTpP}|zO>ECT?0*v%emMnOL%=j2gsMCZL)tNeU?U-bN*WSrS8z6) zHv3uX?J!?0%M2SHmOA&8!?LUdy+(?dGQ;UltunU%NT55Jn)ibi!DlcbO!5BGR@#=~ zcUP99FK_rhN_V!73`91azv(*c=DMz^1KIkk2Zh=fg{h=u(J)t4+PwNqnA~S4EjC;k zQckoU)5^*+SS8gN)<=4Ev`~q7U47c!)s}M>d*t%|Rd+1YS0%N2LD=!s^_fEYHc=am z&i0BxCQ+HSQmJpxBl7p&iK4QrAvk)LY|u(;^PaIOtLo8TLY*Jx6F=HTtFuYE>84CSkUO2GyOT=`p>|&{2-XB%^I)f18_ba zK~C95Lq;+ywFS%$X{P*pz;T5YZtE~*0X-x{`0&BpUG&v}9Id|!Ltw>HB&Ho2BVvTm z*aNCJr!%g%%OMQOHjW`g_@p$(%2+~wj`j!2du&n_is8VQW+96Ez3zufy|60 zBNrd*U4EaIKxP@G8-^FTM3SJLJ5r3O_96XMTMVvC&L$5LTvu$}4%s3@e4$S>w6wV` z%6N#LEhN_&ka8Om#~(6TUgy4+Qn!hWRV0J;hs^d9k->C`6a|2D>23Sjew#oHUrwee z#g)bm=Rgst`=50le6f7+bxP`s6zOh1!>T0JJ|F7MX+x}SPnd;k38a;5A-mj=m!FiW z3z)Pq#IB?Vkj;n~H>6%V=H?2EMuW6=f{Ju_;u!oyQDzSxmc$==ncn->nH_8kIpl<{ zd~BFH3&2SbbKg`4`hy4*JHU<6bSI0Nq_0b;$)JLkhb}={nMXa5gK&O29nwt0>a#vC&ioiL%+7OjlmY z9o@l>=-+Y{!jA1{?P_I3jj;|>*!DE^O$Byxkv5F37}U?$6P%*f1j9yeG&py|1m74) zp_As*)lp0zZgXHO3ju#Aun`NW?Xm)H zHZ9gopiFCyNs&N?r0iw zVA~6taTy@7i7D~)65;G90dvo?!dr$<;SSKFpM{@!>SfPPOu7})aSl%cPZl8T@m|~E z6I{iK>+1Cld!dP2Z{L+igrkt&yFm*a?52)NGSDQFcIiw zpv^iIhKRqCf}y7+P}>Q&N)Gl6P1>GTnQe@#O}m?HuuV$P-^{8SM$m|?q~+XPl23d^ zI;IH{l7AsoIPs~Bg~}b}uWa+i+ZgaiRc7fvW2{8qXE*^fmd5tG*{)7aOB~x_cWlqg z<7sjiZZ2!Hqj~VwW7mCz4!VLfekUGJm8Yk=-?o_r#CZo8_cL1Vewd*3vvyGYPGa<( z^Y3NM(gT+!56teVGDZaZBAiK(dmZO8+~J8y2&*x-8;UPK>%RQ5Ua#7`X1E;Tk)&cu zhj`{cXq19>r0yn7rr0-4h(i#uO$fu;F8lH>Lljh-n2u3q9k$(D@6?b$L>Q(UW(-h* zNW964Ng5vx<4iuFm0mA{9*f^syqTqEnXYm|Uz@9~^*m)q7=KsNCBuG(qucG#^r@%w zB|Gqq8*?Xzp0g6D5H&aQ7R52IINqb^y^qWx9!cy_(en&oIEoJ+SG?vEM)~zcIxB5w zX8Ldml*}3fox}KnNvUZLb%aeX(s-bO?+Y=`$@?K)g#!+vE=Tro(=}TyWNzS$uXd#;=F{SU2o;UE`u#^fNcX^G z9!rxpL%|(T82}cxQB&Q$O}SR7gP5xRU}#4*JrjQ#qG-fAAi%ZYi9 z0qg$&*`5&c#>hnZ+dXqSLYzo|E92#_iU3Vss-uMR%1_;AFvC%rJF7RhO4blF8=6#- zD&Oy8N@TegKVU{9L;ITxEEu5xQar_XwCzJ-4yq8Z<4Rhf8{QP8Du&R6=ao$)99;+s zdOe4@Y7#C{+gc*Eo__0%{umYwYEhYPm8r6s@55opu>MT1 zpDDKn5k~{l)%%~9`==WPLi=5w7*bhBlHhWj-HJl~VWZb+ZVXx{tYBw~wc9p3*aaoB zmZ67cp)Fl(JG)^sP=A$2*Wn?OXvmMthTv$r!E22euw9ES6;^R;lnY{!=LPSDX}Yr zB573k(NM#Y@ZlX}AZE-cwdI{4r^kro5*h|oB-7)ik;fyWQyug%aAKUZLR z4y3|f(zJcI52QL4x@kJo*b$u6dAS80DuO0t#VWIA5*Em-zB%fD`)M1ZKw$*9NdQ^6 z>-vtvOCrSe$sdPZf~YX>*`ip%%ql1SWDN7iOsbDaM_zAl95JH)2s>Cbw7)jhrkuw~ zs&%__FED-Gk>m%!bGTwn%9SVaZb=V%LPYqSN?a3jWHrJWb(*A%YAcI(eaalFwNZH+ zJZ3*G)1}9tf-Xt*p~_5qDl^je+wQ8nc9b5;*{XBWTr9bFG1A+G#*S2mIqeS~ji&4= zg>INFqR}A}H!NJS%up0NXer(`?UolfZ|pMN`-c_0^exs08H1k{X9z#i@N6GpYNiim ze_(1P1?giz@t`{>KJYB00fq!tA_Yzm&~GR&8~~89qQhjyNHcEGzPaAq8~_NC+BKmX5q*A z#N~z}osv;x5%L%b5hJh3I0;7-Ez{^svsd=JW?Qb_Mjj%<1xbq`M37;7b0fgfeZmuT7de z!aE*LPD`W>WB4^os*+#A6UThNKB9mQNpq!*$A^FYJ}YLUM9?Ed_IlKU!;jDe8assZ zvoKNogDpPmskb@9G*=$s-2`K;@Lt}|w1c8t3M|d;)UwnqEsR4*QE@j$biJFIDQjkR zk((4#EaB#zj3AbM!55-mKcyF==t6LM6kqzkxzvDr z-=Gf%)%8^-W`Q)XhuaF?5--R?UGsOeGF$J}Au{ybB6k_BSJ{tzR6+^0?5>V0GxmrK z?#?X@_Slwr>LgBJ@sqXO<6?tZiSeCWCmR^87G>}q|*{GeSCuPS+w31ej0SDI-$yjOEu zou)Ov%?j49*jmonUwilH|2Y6Rrh(R>i$G~>p`Zi1EBi!cNkywS*|qnGMBk(*9t!+ zOMja0nCbmwNe7`WjMTkT)h^NChc>^(0Zaly^H$8(+j4s9xsuC@5d1UN}H3<>?kj1gk#Acm#>O z3J(s@A^CwsGd-ODnq!aBB2IE4H+q6ZP{lyE?Rrx2sz1CS$6I#hsKGg+D@e2&Eec|& z*7Sb?z}?FeGK~DgFGv|+j{0Kk$ki-a^>}`#>QkmX2J!Ajyx(1JwXT5#fHQAzIRw865vri=u8u0t$Pb?J@5;C< zextEc({2XbA$3Xr+D1FzuHxzhJHUI@Cp&Q>Pl(b^I{v=_a1R-S!lqDcRJZP^^Os)L zBZRIojkkLDsyG|RF&2}z>wjC{ix5wWf-WrY8lNx-3Bs7Clvg9PQ*nnk=b59xG&!fD zdD_4@4`VYUKR9gqT#WMzkJHjob_CH;!MDlaHd{D}; z^<(h1wMTp}L4S#Vg#HD z-vPMyO5Y%A>6vg{2Q9Q$5(J&hM>^Spa9e7p!Xp~X+Iboqnck)Tp2xOZ(UM7-?IOs< zrMoD+!VFsKX)Wbm(FOQeLsBJJda!S-vPLYJzw))?-E!khA<9G0JzuAdY1nN!0q)J`6mFk@zR6; z-vV&*Wn(?&4b?d(j6$>x$M5fGsJYl`6lzg6K76R5_Udn=uuX;&56?B!70(;$T|YlD zU!G9^D14qb@_6|1qlSit6U3LVa)v{6n0EIib2%b7_p%&7Mv3ag zZse0`t>?L_Q#WKiPu85z^e>)HXd3Wt`|@Oi0|QwXEPpPE54ks$fzGEx4ShkRD*m)b zKLZKkyY*t?(j+09K5Z0P-8x9h3`WM(jKP!}a%UDKWyB6)HM(lo!(1&p<%*j&U2@@j z8120G=;DI+Lu+c-&ZuBnu%tuJ+VM0pnF?Ej2O)>Z=@c(=_h}6$z@5O5^%sKSJf`jv zhPBuB6&lNlkLozjMLWO3B~t3nuL}BTNje8pNNPZApn@n%GNeFy@m6iceDtc49#WGS zRBri**lXG;%g84~lA;*6l`*-q`FuHI(CKyjaS+DSx3CC=7WX>%Yq)7Y@R zm7q)#jjgZWf{+&iNEa%&meL{RN^q3xe3qu*3rtS^vF+dV=N{|?9l@Zb5>O9Ou11~M zH=%b|KO?_B-+me2`@&fpC41VkPAH`>{xOhU5mxvv1*u3%De9`#L&E^DFVqqXk(j7! zQE+0hv+5&JtP?c=rMyJ%+ibE}eg29-=XQsQdyv%T*A7n%M{5a6K!!K1U_QrX(Rhtx zs>2jx)Hc!ixq8Zn0DngaUqc3MOK04+2}Y`rZZnd}rzzXkjO3uc8;d*nATO`=>s9@A z53NZc#n$PKq0Nb!RcBf9I~fl>^}28Pn4oP0LUbni#9Tnttea5>*rqTXS# z3xU11A0eTeqn^uM9(!Z#2oT9IUphpAEI&Ig45!I7=eIy)oXN3U!~}Wk={VhfET4?6gA97`Vay4= zCu9VbFBt$z#nZDdL1Y~01ltKY&Yo4B0AvQNtau?m#n7cYN{5j9rnx-b7idzT%psXC zYc;h#0ubdOZ3;xjpD$;xwMOq%SiLVoIfYP^vf8&(GILXI>bQ~8@pYK2L4LKyvS2km zWxx+Ia4BCI1tA(tsM9;t^PNU+r6_ZOv9v4a;F6c-OnHh>F|8H zSJ-VD2%+(pATXv={Ud-tts*A@D)DPgdqF&%2er<)+_C;#WO(_ zd=!B!?a(1_dr2GCA=j_tVbTFJ;>#I167TIJT6f6796j}>I#0j)aWt6njEp4st=|zM zi|UYlvPR(}S$2v4xs;A)%^*254p)n|p49cd;eFkYe_MBtj^rC#;}5{-P=5eP z7qXpah;L|d=)I>BYZ{s^?wEl4;h6=i3491a9Yy5JxiPe-I-nx{8izet7++V5E?d5) z-Gi(m2SFZslnB1WuZ)|w1zg??k>YLf-m14{&GZ55H=!H!<1g+$=n3f3CR8eKtTl2( z(&?o^>HA(d$rFnv;Nyr{-)$KwSFC_Bt{#nE%3@5?(7e;TKxZ6F`5(SeXUQbP$c zMW8Yagi!gHI&P!g$*PuMW&<%ZCrpa0CS}=?ibzTQu98{oh;?Aol}gV1A@0__3en*! z1koYN{G?K`lKrL8{H#0($>+xtH>BsoB*~p<68{)8?|e+@`QSN5ROw9`0MGJ)te`ko z*A_%5c1LS<2LXi!bEe_wZbvmpx!VsKfT97Ap}EVddPmE{5j1);%Ahyu-Ny3MSDh{& z`&^p66kf2wph)jR$4_nteASPY9mL-+u6sV#t!7(qe;yMT7@M}E=;EEyt#_<{E5+XR zjt@D1+jCD@<$KF31{KflRJ<^#e0!&I!JumKPSqa+9-@qgGptrBtJW~A(JQMlF|4&N ztKDE&=TcVZX;|-FRv&2C5L(s{W7wEb)_BseiB;B=V|e#s+1;y#_lnEzRT?%olr^^* zw)B>@jED_epOv+~Fl>8U*0x~SzF5}&$B>UG=i`hzl*&6aj5_toJ57wbtjoJL7!1xCLbCqKeU;A?5+GbVj?LIn15li@V0Vc z!Q|6o<)=R;B822B$n>*P)n^UUFM3s9OiaI8SAE@J`pu>4o2Th_@2c;Cri-Cfi!r7@ z5~_ZjG+kmU=o<{mZ8@_FU>UGRcm}Q)BI5_`IrP`4ME0SYgLVwruiEEnl+~8 z+BP-X8_jiGYjnKKb$x1d_nGS*tkH`#*H5g`KV?p2*AUN`ug$Ajd(GV7c8x)mxnX0C zVY|6eUyacNbK}t(GwXjL7wK-*B%dWLOV_}z9Yj@4U{&uZ>mBqTo+I8&~4t?TU zhX)qxM{C!=wAk>jcEcx&jX!EPiY>^JIww=hO*VC#Hd;En);W7w zZuY6$ywB3*V4X{>rE6lH>nTe&cAeW9%Po0zTdrAdyS)NezNrXQRgMLq#)}lGFIDH)o<6d+M!>+!_;c0P5sV|R=Zs5cX?Uu_Nm{! z&&vB?y?3mYPh!2#DJx%gz3&+-zr1?CYgT)1*YBya+S^#ax82IW-4)$^r1By?;DJ@Z z==*@zM*>~n`+u@RijM5NJ-6@Wk2HpP<-5)M>ycd&X`2;d6)&U*gCA>Xb>w zC2Z73(tYP3#Q}yeAB$w5c4N$eY z7LhN8{!T8RI(a9>DZTr~-!}7yQQrPS9nhJJmh(FBA2u^TwcXefUoU$7x6OR_aQgl~ zZ}xomf~CJ3tBrg)(%Srkzosr(Vl%h3{QNrm_;t&l2i>gI?_UpI^J;JV{q@%RT;+~G zZGYR$^mAvaPO`hF2#}Qju$lWWz&9(@NU5*!=fE8GRvuqt5?KF8E~jsY@0&R^MBHpd z6cBMMT_9TTS=j4r+qcRDwBjx^DP#X9)*LOx*|2}u%pr#mfkLLzW(7M6iy&y4x#0Vk z&75lhP z*DE&oP+s>e;zLE#+dCgBTNdAcsNy3GKk~YjB0pC5>y>@18M6NHu~y(>IA8a~J955$ zEVOLCVJhLne4~(MxX?6nF>>MVY;oDby^jqa7Mex9hM!u#J&XL*y7ac}Q`^eohfnPQ z(n!RIt%?$Lp!CZ{ofw;sqAt9v(dTXjpQz70$_L9o_o^j+{M<)i8-3~5$&31OpLo0c z%Yaei$1j7VKBKQgmZMQ$hi%`Le;sl7pX4$ZvZ|l|Kgs2O_hR$B`$M7jUoQ!=iY;$% z8I}x?3dV+ttsCzT#~k}wD8$^h?b|Z)Kgne-wj#`R+r*=S#kvxYiU^;v`D~ zQ3tn8PKYNK8=8hIViE@@Uo0;+^0AdP_O_{4sy~|gJt`074Nkqa|8ZB4T^WCS+w=E( ze%u=yu1shge7g2Vl2em=+x?Bf-k$@$BQ+Nrhu)YR|2asN zOe6c;-;ofV{Yr-mZma(NMhP8g0%6D^M(G(ho=pWp7HulDTwa%F(?XmtM^3x@v-$W@ci&m$oO|;=lU45 zuTXPI$qhxMEXZJ5Kq)Rz{nY~^Bgx#MBpnVh^09IsSHHq@=t!l?dBrS(@I^yLk1+r< zZMlvM5>q-6dLvp0dlEWR<%inDpZk z$@I^m-MU_&t53Jz?m$RsIwH8d^mWbtJj~GDMfX%Bz*2bV3hpT(`_xH1bT#*w zJ5Bn7E4q*-oi{3#3&0c(LS%W87l$qcP6`vH&+?#>_Z_kTJdaGz;hutxNk!5j)_Jiw zKCD+DRRKu3h+>`|Jh7=GQj-TO6ri$sXi3pz4!|rFA~0l#ngGlZrDg*NF91R1owTD% zwx|%0fFh5fVnnd*O{hj5OqK*;eStL!P#1-$O|#5Gkpv@zsPJJId1(>0>}(+_m=5Ui zAZk3Q2Z|Xni^!y+6A3UD1QH`ky~snw(2$44Vdz{Q3?tCcBcIwvVP@me4ir#SoI1)r zK^7w9+)y4As1+W@#4~dVFbzIv%|mZ?L&@_1c@nq{4>RI``)Yu*K)QqIulHIGc$gJG zUIBn7(pXG9OrDmpnaGqn2l`OiOg_{>06RR3I?4f$r-Lc9quFHCHfr|h7;GIKloP-+ zMX8DWEGq$woFpC2fxPoREysfu1I%1X)|J`Qn;nx-Bp6RQ$BG2XkYLV9M}6pkiU1Nm zn@HusEbstS0H!-7wV={tcrYuv_NOsi^|fhdmJg!OQlN3? zQvWQ;18doNw~sRL7n|Rqj_^4uR@lF=qX{7~tIfK&ko8A*p?IS@lG z5G>+Q*P@R9xZuMD)B*VTECNdhb93GW=>T=SEyOL63iR z4~nUw%8lW}PUmG>mMz0wTC&7V0Ls+nsB}lK*)(ec^d2Pr5kJb=gCC0JVDQp z2ayB7xbaKHcv$GxVh3u*242y!HPnX>+a?C!26*B|dxaG{7?ZPrh)1^`eQSMpJZ9|%*H5VqwEtMA{!kbX;T*-FS<* zdiWl=Mg+7fGs9_6$-$)}0UpF9fP!1uR4J+?Xub^iP@wJ0aXMts9guo;3~dRNo>f(d zI}I9<(#T23Z8SJV3Xw}dx8GytauC5hnCmhulXPqLF2v96c;*0fn=qYeTc%8f#&FKu z{aHyVKosK9NIE#NvbD`~0=D z2xB^+#sM6JsKd%BWW$pZfnF0|?l@aaJH{IM39O<*q$8DV z0mr3dP_;UHfC z%H);9&pQfW*|yB}0K!24W)6a00$BHPa|i=YdkP1dhKhJzR}L`aMDQfefB&sxR|+Z_1dS7h#JQtR|2)Qew{90@uAi21=Y zdww?CIkM1fK!(Dx-~p({NP-ZQ5&&N!Gc19QbOXFT1*}^JEa~T7lmVQBx+~i|?)!0e z8|Ff)Yo%y_<7uKY2av)8SV6(47Ey_ii@n_8^b_2@Lw8*vQ0L1rpmeB;v!zHOd=VQWrO!X{iOc-Z>f_&&nW;}8^ePL$ z(dw3g$pWY>acOT)#7Yl_-5%lJ6P$GkUfrZZ=}U+7IK`b!7vG2lUA5opcN|oUYPV*r z7HYIbo_w*aC%tOzXCpp-N6i`t0{~<>#w?eq@Oj=w>U6` z7`*Qteb#@V+JErw)Bs;?sMBGn+kdDxd8q&L&_K)3(A3b#%8)>9_>sf#6aV37$-`rp zhbLNwr>2HqtPBg)Mqa7ykrM*NpsWIQM2jLjW)t((Ze)ur5JAKQNp4oca6{w! z@LE(bgM(`#z-39YS^zYigMGw--I@|OT?d`S0?d0F&h`XOVpdFZ9>3$_RMo*Dnj|R? z(`v=9PDC$~Fx~{v01G`&!%Yfd=Gh7o(N3kb}Rnz?%(n{9EdX=cJc}=Od?TBu=i{jDd5=306;t!)B?b7QvhN;{&2wPuJw4Cyz!%0g^wuVMAo`7}$ zyF`+MZg|p(343wSq@)z0fs_CXde%ilcXF^2P^6!PwBbGz17HvyBM@MQ0Bk827H5o~ z^TqbiB!%0Umm=&VzLY2T+4TzS&F4TY2{TN=x>CkpU==*^FB$}swZoVfB*}-u4M|!o zxDpW?HqiGn0FRlZVqbD`?(u#6~;p2pS>>bjZ zI1=_9ALGOuK`+2CROFDPp@4!|B^q&iA;0zHG-7(@Jq58EFR4g?5At!B#AMj7d77*c zI0MM=32)y7ynQ2jhz39s7xi9*2^Ga&kH)&vk&h|3aWW#O_1(sY@7xz=UJ9Y1UqD4X z<|81z8F&fUFwO&WyEu=ak|GG9gqVg`Ed5neA|NL=K}p#a|Z|ZiHce0@Sr&PQ?lp$vIedP zfJOZN^bs#QqrPzO&pc@XhpG}O31P%fA~F6`2Nz)={(}vpeO7Ll{~3sP8kS7r@dVQ^ zFjj=g{{27oL)%FsZnBZNm ziQbQVLA8Gql3wZXfolLxQe=Yg`EDQgef7)F{txB@#WJdtYe*W9g_q%TVNk)Cn6zkc z?b|`|m#4p9OW5Z7LhKwBsYU&I$W(p@VeEClkM*BE0cT+1VsNtvagv8Tj>l*OqLcW@ zBm!K4vf$b-3jOpY4o6cG!6$`J{b-O2Uh+Bw_-FhVU(-bib1&dL+prO{NXBdt#Y)-@ z#yK)SXfh%`?h{pJktXw*Bf?P;i((0H61ez-f>W$oDiGr4$WNPlfeboMMEJg|{g;6m z#F>lA5Fz9?;Fb8u3?A~&&`ZD!DR)Iv<4-u5@$T#z7FJQqDR(m@O^1U!a$WT48e8+c z$sPeJb!Zbo)v8#zDC`{mym3IA#Abf$USJjdqWjWc$>sGY{=igs%~Eds-zJxz>3p7+ z9IojEo^zuSI@lL6{i;uvwB~*99kKXxleAdrA|pA%BmFw#%&cC$=UD#W;)megZ1s&S zHNP(*0~d_<^0b-9R0F)y<+|2 z=XXzt5gPtWv{yaZnyy#j&QZq}z$>u&MD*}}tWG^EzU<|Wg@)9zhSt>?N=-4S zDUL|pI?5)Q&6eWrn^zsE+wQ8FX1QaF{;j$l+e~{bCCTMCbvwQO(`NpU(1djRA=-(`*8dzPr^Jc>Gh3&At;q-ZbtzC6=6kr6Bd1sHrk8 zwn1rs+srK6;M4lWlH{^!ujEAWzbBVn><(P;3B7wDZy(Dp^wPoNzmv-noB8eCgV#5saU*6t*y6&cq$K@?%8IN*w(f`!wco zK#x(f8C-sfAglVhW8?CBpL@ggD1U*|Hh9B?To0+CT8wuLwJ`J^{NizE4aqTVUvNG@ zJ|RYLj2yOeQf{PRu}T@}*eMQDK5z7_J`M_^sF8a+ME{tb2B-eo+d6Jd__zJqX~}*q z>;G)OR)djs`p@pu|F&P7;4ssq))?di9sj!we6a|=CLWVrN@F;WH~vcoPWt-(xpZA; zo`0X5;$8BEs=s95f9}`j&XrKoyoIaRNV)!Vzm}=tVQ+X^dPAM^9mw~6ryue54_@_X zZkV5Jn#&oZTyIP-)n&ZX@N8-N{MUZX6bFfrm0x3h8Ibi~`tsqQ`?V{obb)xSWvIdT z_b>m^eJYWGdknL{|Ha;$1~rlJZNJ@Fy0dh5I*5QE7!U$#wny*KbOWbo+;YF9VN^EMDqUV|`QK+m+e(4Av$7yI;$}*(Ms*+R?B= zX{o4AAs}(HBPy0G&)8UZbBdYhT>Ik~Cl`=5+U+&W*qgQ$U zpa*7nCjf=V320KkD*4K_iun`6gjxA1RKIpg>2CZe1NO7|yI-?88gJ}6Q1DN`HuSMm zS~vAmS9ELmr)P0}7d}1T{b^+A(+dLrWmuPNxOKQ&VRdo1C(ZWl@Jr>wUp~J&w0i63 z*EvBKKlkRwzWv;%lK(>0mf2gs3=|b!{4!X4(`;uzKdVqmVJ8r z^_>Qu_KmDIjQIAx-s;k~Kbmacefv|paN73|Pgh5L|En$N()W*DvG2Zr(#fa&7=D!< z@#AxU;iVs6-rRWi<11M=ZRFdB)`*es!+jJa^6k?*s^LXc0POJ-k|wBF=bwIUqw$|P z|MY9{;?Uz18p1IAME^i^`Cz2|NnlC zS_Y22|GWR!FRdD^L@i(XW~0g1wtBCUE7|wo1Ui0g*QS?TD_lAhy6$U7+k=vl8~2B{ z?)uuPGdKiW0tt|vhGvvU(EVQ-aa;v7W4yl9Txz*gPSED(&@GG-6u&$@ZGj7uEGnf* zdrd4E#zM+XBVjs`=4@lFhW}g#PdhE@K7@ftuM!FNU0~8Kb}P5~BY~%~7+W+Vs;p=K z0UF`mkY4Fxn&2`jy_P_kZt1g1D3fn-?qhxH%GnPNrbkQ}KPGk9-qlG-TVH+3&`Z3N zs$4kJFExU8kFdBVbC9iGVAt_Jb-eYw$L1c+CLIB&mnF#d1ZcJ69}|mKCh=Vr zvCea;psDSY(YpFu-j+IoCv<(bb6R~%^ZRsrq2SF6aoyxp<*jH^hwj+Mcx(h zha|F594WzYB`p5jO7N7rB>gw0e^TzOxiV)a{m?pERICENcVS1@_*Z{OU`NJW;-J2= z0(0_JK*bWdWv)i>Tg11QL-^+_Cr!0{L4^Ufob6tpz=Fv~BlG9#=(DeZJdHIxi`2^O zu2ryaZeV@BErDh#^AJx0eE<48eMXrxc1cBLB&=W@-iAY84EdHyz)1_qsc}UOOr6^I z``|bUZc?#w33i$mveg0xe44EoX(E~Lt#DM#X(wQ2VO*{zE*;*Hv2cg11@Mrv8aKhEj?wD%Z-F?%|k&;R0lFJ)+gHUBw9_S|E^`X%(Q93b9L! zE(%7=lngHgK2FFg*C3Q_u1|tCkQ^8B4phWEqmlKAu}%OjCbsjtK^Oo>1c}XRG*~>! zSP3K!^VnKo_Q)fkOp7Jy=w>(#)dJOqdnnUsMo>&j0q8=obvn#_H9Dxmv^We2aOa$4 zw|bN^{XHb9PmC3$!1dHA?PSUj!Sy6ka2%=qZF+MdFB8t2uodD$7Kw#OOO5vxWHvQuKUjnhzyRCb_}HZut36FW+k zSY{4jse|K4x|swhlJY)Nqe)U=H;H}Ha!+^!!$O$at}K^AUP9&p0X8V%&c`DxteGoF zW(k2cshKMz%oSpWRSs^hqpy@OeQ;z*!o6#UQ(>gnh=}P+vfnC^I4Z6aF};+;;yU&j zF=TxtQ>{YZ3E*ksQD7Z1q~eC^81`deIrabRabv4p^%_d*0lpn(!V9I$skZWUoOhzkb@oRwHMke&RY{nT0MyfL)!W8!)c}z4 z7#*ND5R{iIB`uECLSoT601<(P{d8MN9G16jjfP87;j)yKV#m&vpybcUkLIai4*V`#?Wt=H^>o!hu?HC!*{b_|E95m}`am;y6Ss;~wr zeY_xk^n1_};1;gQWH{5tNoZ8hP_1MZ2J!X8)Z>B~E`j54n34%r>9W`K!v#g$O(e*q z9u(q8);)YeHe;I*A(cNzRv&Az7gE+bsv{JEt|YTqb*h~>HK4-s3CM{A#|v;vGG76K zn?%SvG22$X7m+|Z0?P$db3W7QYgMuVoO4fA6oQ)x^7KRV4Byk@HJlm&+9@o2A;4;+ zjDCaY8V&YZjN}9C`XJz|A^)w65huXZ!)Td=X){8lkp&W-REEw zhqWY@DjG%Egf~ghw*rp;y}bb)iAKu{&|7C;78Z=&nWqne*+Oce8Lh#Q3RO}yQAp#1 z8vtYw;E~i?DYe|KImhGEPV9h=h_Slh!Z;v)XLg>CAeTx(UkeE@a%*M_5UfGoX;?Pu zy{B)XZ%FppFT8OA72{s9LHD_!Td|=INZ4BbN)pv6k!X_XBVc+ck;AEs(Qy$ga5zcB z)v2)hP>2oivpk?o0s3B?)+IuQl+&Ad=3C&9i zsR8V@1I@`%F^zaVCA4^TPAYzxUUBt($8|1vO}#TB4(Bz9pj1by0^xQ_F_C&Nq=uU%XBSE@ zu!&utCIX?7bGbTt-sfFH5}Mf#35B$`!8g~bSe;@-C}7^a4ZDc}wGxY$fUk zIM`earcnVZB}WzkltZyWgH=nIiG3HzNd*SZpk(#Vf|1W0kr2-K*^#j#2$D^3EZ zsS(OB9WK3j{|K96JH5Ct55km)9&{Hmt)jA^U{} ztKG?4b??waWeqB1b>h5_lH$F^Xez*HV)K_dC~N`lrO&Emlj3ob)j&cipLyj=LQWl_ zo|ZY~5^k1=GLhBN%oBr2R_8z|l$RZ^Vp08CcN%N?LR?Qu55*s(i7&kC)VEc`CpFw# zBufs^V^pkN>eEy688HC6NXyj#+$#H7*`%>O}}B zc2HpAol8Uc21+H2Kem|qSbYmLnfe%!T62a$HbD2e`N+U;r_og0U_=Ux1{j7r1V}Fb zZAl|L06cp1(cuD6zyHa2XBzC#w9J8Kx*uP1|Eb~hqx#yXcNae05%RRIq-kPa^E`{E zUJgx@Dw@0Jv~2Qg3Ea~Xe7q&Jyd~^e%hvBLQq$JRd9BfYtucFAw*}wY)9uSzG$|Hl=BM#=Q1Je(i_%wC5aeKU&_N`>g%M_jZ+O zNB+Ey(|#QVdpe4acbqHlD1O#)@q35bwDZcm&TD?1C3`wck9XcG?<{-PdFOkl#q%DbALbv^jrr8Rx_c;2(8e$QI=JZn4ttfTx{*RyBON4`JPnLh8C z_xzRL^WHtr`;R{#EPwvy+4HyGpOdE4`pb(CelI@mc`xE7EV2u{yh`p zd#q3NOuExE<$2F9KYD~_FK0NtoaO&=PW(%|6E7X^yqx>|rPGg>BC}U6POn`3U%AJ> z@;LEo(VbUIp1<%O8?hB@vnVPyk2|f_4?fPku8yMdk ze4;n>PH))r-mO1+rDlDRPJPk-eKGNUaVPqA-s#&`bN}p8P@vmYa-0#UWKI)xuIw_W zotGkYLgqx_=*!3ZPwBXKNalebR>dgoz(r;XIpJ=?!1*Do<>s{0@dIX$J1i-co|Jyz z4k%EYpRDXS>(7v>n3I69)Aa@g0@^7JC1mExSSJ}A<_{{onJF5kP-Q+g z(yZ#D)oK61iDK%?Z1C*RL>@YEbjEIt+3%hH%n=Q9jv6!(!6O3r-juh67sk}7nIiz> zln|HDI`5D?FX6ktoZcDYZ?4?IXWs9NJZ$Aj8$3PK{OJdeb+;q+3OE*ck1XpPE5_e? zk)hBa2>!PUOa$Hsn;HMdK>cEwx&OUf&#V8>z|XpYXEI4qB%vigDiohu^gn=lH?9a7 zbM8vT+19K7D^NdV)6;l){rO4jg^vFX)T_HI*Ss#;MDJ0SPN)7I_(lCbXU#^HV(-K`EZavbKfe7BP~XiPv6Bu1 zm8F0FJMi1pIM`DD+rNSO#`C8(JiJ2%ekA=<`cI(#>+qkgQz|yx{WnlQLTFwj{K+r+ zSKt?Jq9i1Hd4H?G0*zX&X{&7WWd92MzEr#MN5?57`=*ri_xvW@n7nb#C~u>mKz-5p zeNcSq-+|wzJ>&J;p3a|*oqd(DWX_IfK~4@fuMe&C8MAi(oV65Czy4n;Fq__g1%Cem z>PrTC|51Vc1JwT$_%;0#_z`HagOV1 zzZ{&j?pfoCab; zV8jX8nQGWa3PkjQA6lb?5=h$z3kBPG%R{tctWm`s)N;p5W3~l?-U6(P}4O$hrbY4To>PcY=FB&7!SQUbYk%kRb}E*|Dlnc4yB z&7y#_=Od5e3!`v^a+Gw7(fSb;+g5_3Dn>4WG>gMJ2_#d>2!i6*w*r(Cg2LpEN`ePI z@&dG6ts13#R1MU|h;HvVF>+tPiIQ+37^BF#`QkYCBOrT_f9 zsray1vajYa`cr}iB;umjCN;WW!A%0tN(pqo0Q4p~jl!*+TBNkr5G6T}Nlqq?WS62% z8rTjnMYT|a0DUY$b;8h}=_AQOtZ`#0opNQiljx$=lvN1UK3cwOq>Z~LXX{ETbpnt% z!#o=iG`^ogv5)~J)=hG@+EL#YW+{MC$z+2F=>m8y+NcrTK3gRa-A9RLxNg$GVIN4V z!QAbskBjL@&L1B5cq+!#P>CouM1`Lu_DY?BRRG}vR4YuY8Acuo&;|*NNfcCW(XOQ4 zWg|^W>~I}B#SYgak=G>BsKsKBWDf|K)>PmprKgfuqX_aLF-l&=mf}Oh>25B3wvz}N0Ww*5Ks*j;EFOj#HiI8v=~S?S0{84*nj}7&>-3n?r7a|`xS>dyL$R$3)kmHX z@Cs_Ij$jXvXcDoRHk}rC79A3@HxbNr0=P)TxI^XE0Ar<)8AgR7DlY7BS_GKtQ!*VT z)}qQ^K|s}|sJGTgpG0c zDSi4uKm%YsLNrpHe~wCig{)~Rkm7a^hcb(FSTztrCC6UcL-IP#fzR+t9fL}j;|bVM zb<(*`eyjlW#IYVF!p0ByNOsha3Hmx9T)Ml`aFjj{QMXz(LZ+SoIzw2 zO3sV399LX50MX;{<8mdy5L4Snj1C>zB+8$en%yI&{uSg)k`@9KwJC=QMhS@(iNVtg z!AxpgT8niN+;M=~fPnkdXc4(>%@_2wjvGq70>( zk(^_rN4i0Z^R<)!a~%Op#Uho+Cf#N#Z>JLIT}t5DAj8rgjZzugkjz&av`7tpSOgd< zkuCvdCk#2k$&aK?hNQqsqTq~}v7wj1B;a*JWQ7!Xc5c_jY(^u2RRMHJ1U~1`op7_! z*H6}@GG3M-mLw?Dz^_$koEm)NL0fwib;3uXQg(+93zpC_CmtC66`WJJeGo@VfQZw= z{0KHd)h$oN>?jEwLxo}_@`S~ZyPu-CUJu;-XlJsXbBY(ieW&E4EXL2@V-=aee8B-r z9sPPEGWPtL*Fxqv{J`Z$$yVoaimP51$hOwD%{Xq}P_2P%1ne5f-AJWoW1F@>>ZkB!e_!?6I(bwj8+RfUMAl*%?-h zLK5%C(RWkXt^~aVu;ohTj<3s!$v7_u8#w}ulhVtS_e4s$F@SU^vFS}frBt&>d6Jd4 z{k2pxV-2!K3Sf)C6?kR~j#LSdsjKf-X}LbS>NrnCsJp@2R_oIxEt*3;<07`w%y;{c zn&FBo#b+p@ef}Vhil9zWu3X64t6_JEvF0%`-RtV~w*izfZ%B2tL5Nh4NRJqe)&P7p zlUB@`KYSuoi+wVo*-4~b()(ufkZK7er0jHSu_kQ|Z5wd>TZ3;dEq_S`lYcr(kVTGA zCPD#{q-4yBTYfor>k3__Mhm2VU*baxY;jXjaFvZ(x6!gbX} zX{VquyBI6UX30{fw@6KQzOBJ)#+X0QOs*-Kc=ml+NNSk0g*^NY!KwteW0ru?y38J7 zgr^O5O98+5$^-oh`Jh3mH1_}wQALx7_$cNV<141hHBMx4PLu{4vxojB7xlth0>0B} z%O6`E51KTDo%p5^l8;ZP)i_D+<$3@eVpzp@%$y0zgCu zxQd{?I`m0S*G{|Q%DT<^lHK)vj146Tj_WxEA9+QxY^}0OPsnOfVY#|3DP<*(O}8}$ z0)}s~hbkyCwh@`&;$- zV1N*iKiWtAGMgvr_c4E%^9jvTxym1skF8*0{SxEp`1p4XV$qiZhLRz%A zs#3>jvZHOF_;oST-4L`=OvV1xvSUl=o#%8uZKbHONyKCVsd-H!qGT*mL5EwpCfST1bvRW2T!cL`Eu^|7kMrL1Z_pAY)-5tYn=3N;|%@;mq;JYA+mC!&E<)O7b9apx-BYj0Cb1 z{)Olm>MiKz;^lYc4Qf^DYf46_q^>L;*Z^#&Bgk$7{^BTg0q(#AOlv}^d)_#J1+_A* z;rJ)Lgp-s#B*iZ2=u7+QS=1M?0lwhK(hyjqr0MII%>F(6!Q(GJe8o(|sS4zUrAN!J zxqXiJ@!Pemw-U6Y^PNyjc8ED8Z|FthEon_uLC(E)n9+P5SA;*gMO9B4PB-u_zUydY z0rwq=R;gHL$*nKcf3`Ma{Q^`@z`ND3D~i2btMM2)*)#dUWBMZ?OkDL)`6*rtmG|%T z{&_FLzVJKs;sNW?a=+YK4y;CF#_-;&;;Km)NT{YX)65aDd*xfdxpD71M*sHbG*@T6 zaT4vC-Ut3w`zv$B!*Bri>hAolal@@ZgK$@$V9hX@z$yrPZ&cY?zyAp{X~aD@Y9RtC zeyYG`dsKL;cdI8EPuNyH`nC*h2FG8`D`JFGXI{?xR)#sV{LZzHcc0+$kmc1=zSzBj z#y^HUySXLkiT^SEU-QgF^!v{ob3g7JNVUS2(UMk3&Q^U+UsD+pHAS2Z_P5{OkG?$f zG zj*(&SonuYY>zAB9R3)}&@FuwTHzY66&pS13F!0!~8FMUWOiFIY&sHDycd}1Th0-2t zcy4cqio3msycrpD{P91=@sjP556<%@b&x9_aOvKpEb;Q2xQF1Bp6}L`n^J8AU~=kb z7qv>^Y_ww&KKq`u@5nD{D>4%1=zn(2_V-<0&715kI7oBU?|vy)3xa8G+q5{Oon9@yfl;>uHdU>~1K2XM#diuJdtbU(_h~qcxqiu;B1ZR?+AR%!=zK)=cEmZ-d zoIK@Y9__TKNT5rk8#w|aWj4d#(~EepH+`vScKTGoXP+R{#g;PE7SZ;Zyvn-%KY{w4 z{rtD{(v$g9sAGNqx<7~!+Rfqc2d_{Ig(T_huJ1?7c&~Q(6su3JyLI!-(mD3w{q9Ao zEvH@LD%dmQ)y;`Bifw{&=;_AY^z(ifFNPP4oFcYd$OtUkRyR&QH?qO1uq^V_QZFp3 zch<@Dp{vVYciq;`9NGEde!Kgkq;UdvpWe(S^{JegYX^UIQs16=+~VofzVg@?dts-z zZn@Q+xR>K8HMOfkbffS27oImY&biz-;mn~$Jw`h6 zZEMioJ)d64=f{8UJ9#2ex`G60+XwpY?j0GSYFWy|NsDaSG<`=)AE#6V&Cw?Ck|m4@ zcFr6hN(Dx}DwtjBjKye2lEyItSZ;PMdWW^iR;~e@Ri!QlCEAo}{{Z#>XF&Y~hvlh0 zPxB3Hg577|TAm*B^wc)#V7OlGFeYoW5nQ18@OEx>KINI{Gz_upD zYx}JgCq6zcoX-pur#P(4H)t+e=oadob!%n8oaVF3QbJdraaeWEr}^CKnoytrsKA(8 zd}|zht{iSI4szSFw)vJ%NlEjCh?FhsUpuV6)zW-1wq}d}U$<7@`Ph7EFSWzUbo8w> zXi>}E!Zwb+?OQviJVEmu!6!-L%%*FHYna;?xU zJapCVwJjwr*Ds}nhi!IT*U{2aa-$}E>-O90o_}n)ahJJOn&P;=$Dp;e&TVUC*6sDZ zb6RgcOxYTJ#?f!kr}b8A&DNOfxBdR30;_TK|Ko6LS)W_P&gR?xA4^)x-=#$Ce(kv7 zOH1pWPc;$of8E~j<74aH5vG)2&Xv#%+cdDdG;ws91hQ?b;K`)P6XphRR<~6e)=DWc zR{$2Z-Dh1~=MjrpdOYZJzt9acf(xZSA)7?Pb53eQK+l z4@D|d=5DeuY_DJF9+{CfQnqQLZF|EqS>&NJb2m>~-F|O%ZRFwWWt)GAZExHFMdj4Y z4V;nP-W22>b+oxGaL$eP`w_CJ+}Cr199r8S#MVZg_^T|)=~Mf|y->7@IWO47utO_% zkIo-m9_()0@#ugo`t*c(A&XXbJkG9-E|^^&;uYKR@;H}BNb`!-|)?!1%i4dS~y zN0@h+ycnKUG2d09xacCSfPeh>G|x>fl^v5XTs`eHV}7BHB7h$L-9BiE>OJcFt;gtw z6=bJ-e;{f1iB-ceOGtnRj(s~ZdbO%?fSss!NYwjzE_i=S{GU61sCpb;*gxzXL+XL^ z`dyY;IqNO|aMbo$ug7XDoRh!p)Hu_@-nq{Eek|WsxbFMlt62$bR|)=G?6coDz(H(x z(TBYh*SKo0L&qae{i`Sa-i9pO@oXsm)3%o5@7~PaCHh}(Hu&HZkj^asKi@=S*y@*w zaaVSZUDRM#!_~t7+s($&QPm36WJ!)<@RWkZUvf3{*}d!MTQ5nfQcV|^6t`cUwwTZX z`9m^`6tg{N$pZ}5wVyW||FwyhR+1cW-DpXg{oyT7!BIx6#V4o=_jO~=&rP&7F9WK= z-GcMn8kGuetmAqA`?s$D+(c_UF_pX;Fv@UiaNdg3iEP|5m^VvjyxHhi?y@)>+_TTRz(^7`>F)}+_CGfpRE7I8 zeeTEp|J-aCg#5jU_OrtMd9&gEcZD1B`d^!9|5UjDY@+>hvk~OkxVGbu!=+7Ueu-^p z^#AflwgxE>%02(7a4-E+;r?%LqNTqJ3XL*KO;&-D0wUPxgA;Wpyk2)DkFHv8V$X5s#gidkE-=C}lymJ-^j4Bk)IvsuVnC-4E>H(^@}T54!ASz*+_5X6}R#~5|kQtXTAIE zu!9GEwp24NdB|oJSNs{K54Mg1|8jNFC3!2x8m5t;c7(sp^@Gbxu{>p})SNTPRnr!3 z=5Zx!|0q2>f+Z5T+?n74PFRv}SSqXnQ#CAq-9`*=^E^AG#R4{U4^DUlV5!Q)%Z6_B zg+%p}@PnzI+6p%8>)=7Pcaqb;>P_>w>2>b`cRP_}(y4^T84-ML@-y1oi)p;0mr=Je z!3XS-hNoYFgltMOX*OaMa9wCNyOYL5sevbo6RA-|(inXLw91(U!R62hP z_g!FIBdO*#mH%~Y<%`$e9(A^N_-RLjOvh7Juo2swap}>gUz#q|?$K`lj-zGfCNF@6 zcGs3CAF8@-I3T$5W8YpZ}FJY2ubhj#g(Sqnp z0_?_WP$=NM(4e)3V-3WdPNnR9AJv#*?Etc|Fw$l99^2)H-qZ?QELWP~7yxb(pl4JJiM5`YCiT6FyGW4a%m-Jhk=GKm zN{zhGVFPMZtz@Lv^Z!MSACb~CZj5pgF`Ps&70kH=^UXyJ3gOR^Zt*Nlehnmbw*9Oy z50KbH9qgfGcnA(K--B)fvH%p_SxMs4)T zk9%m{nU9sS9wAk(F`NX7IctJ4An>Jis2NrGL5D`fnZEK=<|Ckyl!NW%2&w~T>HNI-!v1M_A8xNnz{Fuyr4;mikM4wAg zp#V1&b2>C=pNi$9V^jkewS)6m$JiKX#0ThpLRPkh6$LP0oYt~B+gQZhEo7er*ikw< zTRLj$XL&;Zb{{RYjf5fqdSnY=Cx+x2_5lg(D#+U9OFd~b0!b)J$uJNxlL)p_1W|)? z>pxQwHV%iY(6G;FBmsqsAP;N&hv&~rtW>gqO>Wt}h_QDP?2UuoIyfd2vJnKiEW{aW zP-#8&7(-k|8N1@Bc9@Yx$_B-3FCD{Emj||uo6`Vz5^$RMC!P^^57_^iXH0^D06T}O z$W#mp|A-VZ23OOl9ltfAGe21i0odyfx(MMYlIKR5Y}LhUBmg^u7N~_H#mL@a^a#mo z?_kyi89~yYuUG8{WWy8Za)BYE~mVQr3bn7`-fh4c={Pf$!H{kCE#P|2`a zcqvrMV0HsS5uB=FXA!Io>Ie$QcN1TVrurKZvUfxUeGFx~u=yL@8P>blnFLHVZY$aW zp%6|Z*wA9A-f-XjcCM}X$T$(yA;7dErj22+s}MdQX2;`@c_>beH2J9EOoHwH1=PpK z_OR1?`g3eWP?Q*Q(S=0E&?A&rWGiiF~YUbE^0|h!;RJzMT)L4@&Y$0ujFW0+oW_9m-6`Aj%;DR^Z?sKnOFJ& zCl#b1*m5l;IyqjS%`oCJp1Fe_B;+SLJgNfl5f>#%n6^UH^j5S!4sKq@rkVt*3bzRY zHJuQl{JX-6QeFrYF`j({g-S-C1llZu>Td7f1eC%OW>G53iv-`cWO@^DmblbSkToUg zRF_UERG)e-IB3g1z2GPoDWS2&jB1_y9RUsb(9}Mhdf@z2Ya|?}nS~hPI(jyBWv51K zV6;RFZHy_HHU&4OB%!&K`X`Z^x!=xH3+4pV4BD=>vvPrREJ8= zR8PWP@v0`^a2J41??QTaje>N{Vhv)n18vfB19V_<2M{Q%exhMVC=vB7w4Q*swVu0p z4>n?BRTRP^#Rgh8(^pgVn(VERWq?xv5ts_qxvu6^>UKtqv?W#$tlrwoM>R-UTax(=<~w4N1*wQO)gb!V0DC-42hTP17Px z1nWo(R05!#n#4vayXzwl(ZLsN(GC*rppX{;ZP&14+iuwc>`KvtZXDCrv8Rb~oT$35 zLi?zVG7XX|V6czk`r6zIqRarGA0V(!>bGDR81Y|_l9*#B!BJ)Sn6kvM-E0p*VEEz_ zC`r$zxE>XI<4D-y5goH!wDVth(n8^}|H6}+@V(7S&cGD@zT2hHqpfSS+!m=1RPwU5vd}qgs-)QgW)F%~;UIJ!3`B4r@VuJvEPM)SqiA9sN31XmFDI3!LJnF(m@aDj&srd@5SpY9CQ@asd z>LN}j!~*@OYMXXI@%@6DehLC2dGq~fs2Hl$rS?q41_0ELh&B5K9+0$b9nf85VJF1}3_ILF z%RLl~rV7y)T1;{7%>E;QTvwMQqP>OoonLzTMm@y=y>MI#HE#oQNwi0Ox?d#AGvZmD z$Xtgb-6U_akuKhjEmDDX_3%59jN)(l@x3DyWa1wEM%kTJk6K>rrWVX%&B16f+E4QO zb=X^-?u|AfzZcj{^4^a~d8xor#a3QxL$&l9f8XSX4^=2d69niIrX6FvCD9^D+t_1! z^TnnNwvM`vsuCj|)U^}&Kz0LRq2cA7J|Lc)C^?fr?1 zY2K{CW2f$+vqg;MZ?SSQW1~;#CJjQplGY0U#>D{c_U?1-0&My>iWRFPrI-itJNMDk z!TM4ff7=@1&X7deLSbH7?tJPF5PzZ-qI-)_#Oq;{xXNNL{frcQBfuI)gvb*T>&D^a z0lX|5Ytb@OS97RCz)jk1<0$?MrxwIeYOQRLpl-w%hj##($`65}95w+LKY;At;bVLs zyj3C(l^>$L+Hd)Den0Vs;?XGlCqNp+7QuhKc|gv6sI`UH1RtibfCo3wQ}yuYiHgST z_5n50A;ze#`Nl7Jzl_}}B5Tx0=ms=c(_$KBMBU(R7DF3IaDsrjiTpfKV)S_Fvx9Yj zQc_oD&Cn;oT-BZ)HHE^Vh9|HZB~worJ|=GH1-`!uujmtV{`7m{B}Q~4`i9_m2u6)v zhjgpIwrIHzMKTI)TdA&QYv4|+^ZhEUc?ADHh5#QKS%e_Bt zf3-yA#ndWk`V(_uyNL)^z}n!giD2@IlDS_G|FVR$ zAN5Z770#Mbkdx1GOKhl|$u2hPJ-%cvo_|Q%b~%Lw8{~@=n>)@z2W)cN@-w3EI9Jo| zo%`&5EM}5so5GuvPF?9F)iet z=j-3viviljy%yF?MO1Sc=yY%i^FqwNb85B6uD*mj~s{QL7UXQLjQZy)N?C$kYuXhch@f5;7Lkuh`)}f?3_c z3trjAd@D?_(^POwH}O8^5pShfT!>*jT0d%<9^F z$MWv-KXd?9;hxw9Z7Od`im}zu%{DrGoiZzY(M{nE6YYWp?to;a$Je zImW}lq~{esW)Oou#Kt&S!Bcwe{?m^&ATLKeur7G-kUqM8(u;Bfn zzPSU=l?x765dO>aCfAgLKgOz{Er(tvr?RVNY7ZilnkLf_ipJcnJj+DsW~ow_N%!*7 zSK|pOBdSzW>1hQ6R{=~Qan2oZ|HrAD=*{(u(hwtXLOBu9c7>lF?V9nTCeO5`D4AaD zOPDOFS~`yS4eEGJH+7;xe4#Fl;*_?O(RmNItlq3Ubm86-S7Tcby)lC{%F`=gxDhhD zbKS{1Of?**Niw}9(SV2@x?JXRC|{kGI43vBq==L-B%-w9^@DWP8g~a-Lh@ui0?5MU zj#~A2Jzo)xEu~G<9o!ew%{yQmV92l#Fk@bYuJ#=HW3+8$0+TcLiRYjsnKw&yBA_VA z$cs=-8%_1EO$l2D5`*TxwqLfh<;jUp)j>{oQbD7CTHX4c6Gu-BEW;V zZ<;1dpko60ksKrx6;wHvE>91@&A~r!0emH~P%k+xutRj;)@gY%I`%ZE?cQhMl$^X! z#WF4NaQP7Fb9Qr4h2NjIoQp5sn4{O!2)3xk*lyJUJei6SS()lc;*aQpjT48&j4PDV zp>X8|+LEjZc&@|KlsG`Ios>CbhykBCSJQ=x=g;P3*eVsSeyvp#ks>whCfcZXKy+@7 zn-O^P{ibuU%7sjJIYeJlxpC0LZ6r!5k_RcOqSge9R$cVQeDzf{UnzV)>`}H}{TBLJ z%{^PKG-1coX$*6Z+WFSLsRB)SxG%G4#@mZ8?HL!hA@o&YPTjtjqgGHl=CLHm)33W>Mu3x_2XH6&Hr_}(WX-1z z2Ii6p*xKqE=7@R15|#ewd9y_HDP%&B|M}$JHE-uXy^3xVp1LWdMkhY16D;=t^V{*? z=Z}@L!%G*S;{_p642~ozhmKwHx zJeLJEU6|F|f86#nIO*|7!2TumAa8apeP*x^!~Z+exWA|xH?IPSBXY#dngVd=y14HF zplH#;Ii&I|PgFQ|p@$06iqR=AB=qt~&EyB$(x(*dJCtC&G7rltayvK>TMWqOD20js zYXIE(`ew!(^0fb(1Z?&R`jl($)8~mE-O$f*nfCnszTSt@_fFeHZw+KZ>+qGj!GVPLE~u zZ*=`0(=d=rZbeC-azt@3y4=tmduk z%Vzg%M2-7v6Od9O*Rcbbogu9rzkS~LHBk!^J&~l2LBPT1+M4A28T846(!>ci0CG$6 z7RdEj=yw=Q+hh20bx)kkarUn1USok-tGl6T9$S`VGW!fhN6S%&@jyLm>6vhZxSRyaS8K+;o{O{Q~Q0fi_eW*)XA2* zC?F3gZ!xS|A&*uUN7l=x5!uJTuqJ&eyt~Fuw&jHU)ZJ15DzuXmxAhk2 zr0JNeBOR97W$wRH6>Tlw+s|>bBQ7*TZc>0NO`M6`zC1bM$|=>=nQSzNwow8{1IMC* z<{@^|Bqp?f)d%{qX5+#+#5VDOdS%6CAFD~EPMvU0`La~HA)&maFCJTk* z!!DOIR`5OwWbbZ*>pZSa%ELOB%X=0R5pzXSa*p8Gr8nENk z!OKKSq#AnOo+Otf=@VRzhB5kb;?ZNt;e?zu<&3CP;k@F^jN9O;t1?|uzGac@M#Z6* zzl}XNWzoiA`nG&*^f!hlo1>eo;q{6v#&B}6hwR*}r5nZ6F16c) zP4`=(@3$u3Zyj4bvDz?rSAw1qVc#u_A(Kpm#4;oP$oAkQ(}RSK;7FvkYzjf(ilp;J z0=n;wWXXb~d8LKw6rRy}NPR<;-bT>J1kTYR@aad)2T!5T+$aboi|`|>d*;A~@_fObH2 zBt%2ES0+`T<*rEsPQ5&0sd;c_i$iTsvi~(%6k}PiQnu0P!G)``g&qJ`ObgU^OeWl$ zT^ya40F%ii|9)x?7|kH?C4bf^Hyw)it?{8eJSE_bsiamBn!z7TqRKX;Wmi?J=$%(UVr%kpN9ed#KNuHB8Wp7@wu`Rf~xkN@$yhob#w`nzkrX z%^VeQgAokGX42x;K~`FEWE}m4O#);DH7=Li4bx@_*3M|7P068sFtYQofB0dgqCITc zg0XpYHM2Mvo;v5esf`Dfb7W)PDf8Dd$>Wt0HgseOOxQO5YltKq`ysl>*Nie9F zEn@mc*5f&G+76SaCXWe2f)TWoIU^Bt^O*H&=z#q=5;M355O z26=e+b3};};dCxwNzVYr8JqiTUnTV%A1+EBzha+%Tb^R04uVeq_&Pt>1K#lZUWyTT z_y1z=J)@dh_`c1ZWT%pZgx(1ddJ7gn^kC?S%881IjT03S3lanoq-}acz#vsc48022 z08ueO=*3V(K*gYlih{v{*kJa#%k#YNteG{l*8643{oM~P7iNe3zkb)X7NKu|k_%7T z6l&^kv3h;7_jP8%oROYQZep+?&gn-Il9|A9#TG8f?z2PL;}OzJaRifHO5%h7zUOOy zl(aAt$Begk9_m~l!H*Mr=tta%-0lM$B*Haj6W8X982k_qnJZB_5N1Oi zgmMKm>rkteGR|a}vde*0jp|3CTlwt?{G}uZE`U%15C#x^EKWy~QX-H0;&``d$Ns?J zKQFIy#K7}H)K)|z!jqYLMuH+Ko!j)`(G9fA*WeT>b|RmGwc*BDvrt=Qakh{w!Qe4n z3^u$3%e3-ts2JVfOhHuG#;wD zn6Sb1s$%M(ay#M1`GLvJ*SAB6xj>KAIP1TV(291K3a2j7RJ?z$Lg$^M#IVZkVZT!3 zeqh+F2FeoPIEIhd$HhSTGdE4+{FD6R^g6?^Yz}hrFrB7^34{`*0BKx#d_dP^@(JjI z3PPF(04xwTcG>1`m$7-F%05b<#i<}+)+uJyTf&fFzjmFD-%?CE7ud)W{7G9k3~8hq z6rL%MSG0!U`Q(}0L`wtc3NDX%BktW^+`~J}^N#7B>QnwV(u1v&+~7`)LG2X*!b!~g z19G3`?e20#eD8fjwbjD|76b~kx-Kz*4AWYB#59w&*8KC z?II4}@wm4o>bJZ_l+-HB){vH1AHSqO=L+At18c9p`r`TVt8YML<=By@+P=A)2+2u* zKq>@-Sa0i$w4%7p>_iR)dz@1?WEAUxyUyWZoW!V&qImyM^mxU%dzyiF?ztd?gvMZ* zUVM@pbkh!(7&>M@WAW#nn!{I(&+SWWq+Z+;%LH4T+8E91y^m0NLkp$RdN`$%9$-_>p7_HR$GzCY4~ah0Gph7u1@FpjyX z)eO`IT>dF`;z<9(*SpLtKhH=sM_)ULCj2s~KcKasow4r#nhVdjDmlE)Aag zVS*`GkMj2oG$f%ik>Lt~jfjYCNe)mnsESy}&tPfG zng4<1Ffn~MeQ-SFhS0d>II&8Bx?&=qS_7kgnX0N%!gLh-`MY;FGe8aBp64=>BR66E!jVjX{sgWbj$2K`b) z#PO<15WFrurnBqBC1jIpB7NzpX>Q`4R=L&h(LJ{=9W{qE{ZO_`ja|2QnI)E<`*Yvj ze3a*f6O5UYki6Fo0zwu_;8KVQ z&C72`*$gV4riAa>H-%!F+gdxsj_$MB7Gk zm!-KO)NJ>TT_k)$3LX=7XjckVgLyc@S{cMfbgWRkjMfa?W(!`Cc4q{J^Yi!6B6x`AiI<&2T!8Z?FEtX}i z;v8^ut6TM9f2pd5!BV-8Vz#uDip|6IIepUOc7h&@dr+XmodChfxBHJ@@jVh+ZEW}Q zRa+cZi92~?pu6+W+Mvfx2U8@KYE9nI60z`;w(ub;r?oqN^-+R_qE?=f=0Nc0E5%vvHPuB z1Of`4NZ&y=W3t~c6&@|^>^T#==`&e<#v)WVd-t)sx;gvLe%H-iIgq?g@6zGRVR|{z z+d!(b^fpPd&3qTWz*3-wbo5_|5Tn!|H5QR=0#C&y%My7K9@b{$D->bS-zpe{1vtCg`WVpA_m7{Liv~9W3;zZoG zesEx@@UEik$CTo1mrZop;~N(9K6kDEka-iiwYE6p%ld_Vgj6-*($E6isZZ0@TJ)C#lO5~+ zIJ9BM7Bxe5gCa4Qc|v+JS2`m*aj!|npN3W@BY=!xEQ3r}h!-O$Sw4rpKFNmo% zCL@RoeIunveEdT4MrtS+hvP1|DSKz%FTNY6O#iM-i8Byt$=u*NZ_t*>Xe{AY|4HJqKso6ttPQIL z>3bZ9wq;@*xk#nja!{Si*5&#MklR@xokJyhdbEK6 z53m;Mha!kx+(IMA^8I)tl#^=&B2HoV@bw8f0N{m^5Q)DFNC6?lr$D2Y2q_%H3D7}Nn#Pxi`IjOyrl4GmW zKUpVDAa3pT1wf6JmR^60Vq#pbqY-%SyuEvYOL;uK=B%Zo^fR`#L%18EUV_^zX|-TL zh02s~F($tXWNH9sbB`A8>R&~M%7FlNhUen6p^)^jWk`K0R(+vOfoxZ zQ?A`9QAVo{%`PdLy^@5~;kD_w4W9Srzodk6T5Bt9aE^UbXrG$`Dlq7_;TPXYt`Sm` zvrF~{isZPABi^dp>H082zzr2DupxCRgBWrK6Mg8RHI~M`7~y377sG6vLOKD|R0GaN zdNCLoQHCCq7iVA(zfjq7KqiV~@2~6_vn}wZT(Xk9P8Z zJY4=Aa3w--H~7P9QkizFB;DC-AE3F#Za2-hH%9u6 z+};DiPKEMp6sKArqt@7CZ7U~RmUS43D(G5a11P0az}aIoqCW>o)CNEsCQ9vvK_}Yb z1AyWJcn{ZDX(JBMy`B9CHU>D@!hc@XNT5lR#H^%4)HOc4Re@O9N*<_e-q>Q3?P_$1 zD14m2M>vHhtdE@nOJ@y{4^Z<6#|S`oy*Uy~v7?qU&@^iS;@fEre`WEZy+_W~<0Ub& zJl;#>tsk0HR{{Fq9C+A5JX${pUBJ%)v?FvcY$G63%83Kz_TIc7v|^ER)c^f5EJKBb zM_~D^yuFT@7oH8IUlpTJbZEOkd(FGvpo@kJfcR}%XJ3VhQzvBGEG)?ukmEGrK= zO)`-l_e&@~+vLPzXGN3eJgPx1?p6qZD&I<%QlquLtN|YEFVZE*hCMyI9CV&DH%s*i zZ^ejDJ6E3#N>iKY@g%QvAP~O@)%fFrQ+LYgCb3tdp+O+ZW~9jMYsHQSv-_11MQfYW z`^#%|junQ22E2eowt9i_OqVbGfiA7KX7hz-U5>eju8`s*KOF73=@S#dy8E>BgIxDT zv^Lar%wpR3ol>G61##X#!ogPHYR`dx>B6(vbBK!{@ZTK_2S8@!O@ z8oI_vFVSG1@=MU7wqAaYTrCadZ)~{RG<^5V_lZyHIy&XRYb##3+4tv`bfp+HoxQzG z^x)G?>;|+pZ9(T{zE0N#CYb$#T7CTL^=oCnJ}WySHTeY#kKWchN0~3(31$C2Sa=W9 z^zo@IVS8J zCck0oFCnh{~m_@X$D~=O3UMkA7s{`TQ$n-?o<)tI3I7 zQ;f1Uh(!d0#2S9~FIf8i*S*8yIpqT=0!5~EWke<)Pn`J+YpIoUpR2hqc1=9W`U@g% z{Kfe71j^!sOw<&5)l?313X!j+Qd*!=qorD3psGhjGh5eWwpEln*b&>bmVk=u=nD^~ zveX1xZ{r>}##v?}r@w1y>lKdt-fW8-fcoOKoeSyi+Pa>Fy58D)Dq<|%Za2GC-^X5e zL#vzzka}Q~rmwcc39b>hRX?ItQ_e28pwMKXF#7}Eh>O(wg&<~Xn=TfbFKaU}MGSIL z^fn-C_ocDt&&|IcOk8-XA)~WqyEYyY@U_O?JLy>Z7FnLuu?i`o&s8lnaM#`GS+dhx*VDJe^Q7*skdj?dx?YJTUTM0!vrBg8>+UHn*;Avtx4vX= zv+ll*l6?cZ`$tRmPwINllz7kU{0*Rn1fQ_3dm9Z)DeprLnAuk@gq-XY7B)J$fW^{)Wjzk2j6>EBR45D7&_AVDcFIgY$g(WRRzKLeEZAND zv}f6AZ~YM8vXGPdXF|%(MCpenmW8J2hh>+Ay{r#m$|15rj6!*ghC!@ed90a1oMm~OtwFqVdAz$pf@gVxw?U$B zdE!Zfq>%EYCb3^Ob%GHeYqohvfk4YNEevb+tmeJiq08s>yl zeE3Qr&=Fe2*&l_G_thlyp z$j4Oj$wmbVl?56`g?g2RW=2Jpl|{Bj#m<$*?nWh^l_lOrrM{J=CymNND$Amb$`dQg z(~K&zD=YGiDoZOXYmBPuE32A~syiyH2aK+dR$iYps+p;*nK!CktgKx&s>4*(k&SOC zRNc@pzNuGr)6DpmWz{WP)rsy}Jm5K`3;W!#up)tF{{H@oU? zzHw7&Ra1@ez51$q&BpgTs_qZ07(W=TdN66+JX6&?Z~Snv>fy4n08=d>o3toYw`iEO z>Q%RznY39}x7nHqovVfJCheZp?cOFGzSSKkO*%uWJEKgx605t?OuDnHyYo$YN~?Qn zOnU39dz(%AI;#5yO!`Nw`zK8XW~v9~O&%>)KUy{sVXlkFrh^LC2Q^HG^sWz?nGRcC zAGS3ealSs{Zu;2s`eSd?QQzyMCrzJ(Tz?W}I+l2SEX{O0`}%mk=|t)Ei5kR2{2qpK`vH-#{|MTpo0u90{YophtFkVt2mJ_lktrKL>NpTW<?A0Bxfes2mx3*237G!CW`r~T%>RxLP;q^c=SFzbk0bi-q(2J&~?4$4e*3?)eaf$2%?-8 zr{?t|zC#Xp191{PSiYlbrm@8_-AKEy2DSh%wvgNj*HwZhZq2! z1NXz&mD-h}!geQN;_HE1$9J6{ca%5Px9nPZ?%w>%>z2Hcu;XO&gYYuiWNhwAb93a< zhmY@HJbL(V3oxkQCx*Xz{(C}7aW?q(gw(fu>faMmgO^bWYvLKY(bz-4i=}7fLhuWDB3!StilTTgroD-kA4a)vA zA^m^qgfxwXBDofUUZn`F+XbZK{8)_V46ypdE9FsvBeLn@D$IQ?jVZq*BN)rd)Mb)B zik)q?9{{ov#HdhL9~-woAZwc#SMBPuE;j~)D<>lNL(c1Zwk4C)bPp$O!P;bR!(gnp zqoV4P*4rM4k+%MX_A_Xw*NcGc1h_A2EjZfe`v1iV=_)@R^F!x)g_So`>*7&tr%Stc zwIXbPyj0p~aLME4>b__(v|8uNajnNqve|)$X@?jw-6@|gXcL8XG}q%@!XFo7mY5s9 zTPS0_Iy#&5LJsQzts5nkUK!^ga+L^4wiRS#Y^}!?g;r4phQ`waVQ;_db#pkqk+CXW z&t@N#ieKEbio$jVZ=6fTYfG(?&1E)rlt}k5+5293CpFTpNC%blu6nn<;czb=_ur2Z zGq@f(^S@S)?8&=y6YRh8e{3S?2|jYJjOB0nKgs0(VIq)Mm7g8^pJeh^H(MPXFF*Z1 znh3TiP4B;z@L%;voy{kS@{Z%(|1c5Uz4ZoujHpIb#@OS8g**PsM36y8IP&o_e;$56 z*?+I$;|oDtgXtQ|9m&6C@o=T}a!b#wkHlaE5T;#47VK3;EMT?|vRzT!=O#NxX*TWAnu z$B#M4Fu;c`SG+Auv7GgDjCY1Jhnb$o{!x#7SDF_x`>yOi^~nF!BPS$@)_n!!GhJ;O zKO{*^Vj*QE$yKPWvcPrSQYe$tCDgN7ILAsUlq+*>H`=q1?A2GO(9qRxc6Q-Bn^>gO z>DsaC@sfVoyPy4(!6%j&xNPd#e)&^o`IZu+UEMvN zO`o#rQc6tzV7!i;Bs#`Ui9JQ|ig=~^z}3#d7Krn{|4QDaPO!}@ z4I4@?BKldKLGux5wQnMHx)*aZOO)y9bQ4}E!K`Ns+)f|=;DrIoxr=l4bfalB=4 z3s#|wDKk@t*4z^Lb~`Ihxrd1{uHK;4>Jotq1l%AjYhb-QP*_jCARt2e6gdd2t|N^KNbq(rP!fOCDq_2Jq(3~F zgN*=is*F#XfXLosR62m_gVnKKupogn%OT&FAa~>dtq>XRS{8VbU`fGv9r|uV6zq70 zw{}l?MA$q&$|A=ago*?tSW0{X_HWY&<6?4_1SNe2DCCoe>d=|iI0-Cr5T(Gc2|U?o z2p;K)FvYHvZPp2`0C|>)-N8Vgg6+XP@~tlF9WTN)3I-N{Z->xL0@55DJ@`9_DfOBL zuPS-&5Me?>PGSYFFcaPh$mI;QI}=mShjpi^B@L->nOGefLKjxQt_Vo({4;OM(>{bI zMN85atSOpo1Qi}FOUU0FFQ5i5pbsE+Gf1x~M7Rb=W+6%>q?==5TIrx82f(ml-#5Ud zWgYE0rM#Q`fr-@w5LgDfO-!!ffO1SN_=VUb76uJ_!}*vOP^!2r^#wp?GLXmvK#73# zk%p#9r2n{^mZ_8}8B1AVB4Nq4CI{nIaRKm4#@HcvaJ5i^)|2QF1(-(=Zy#QU$_5-o zXqXucrD2~a5pAJtmEB}_QLYvR{)>?Xe6V&GrdLAF5{1K6#7%su7^Pf`@1$XN5*hkC zEO|f@aN&D~lHnx>!(c54bEP{IxiXarQV|t(q#UoEq15Y zpS$vwL0TV{TL{+&nP{99_VGI`nnqEP{OyQf;N#+Rhz*7mssKAICI$aVb%6fG*$Aolcg|J zL>)8Tkr$-&r10a>2of&Bp@XglQ+K2&4GKb5;R^SO%j7GaM0jM!3v{P>ulvHa8>aw!sr+_p&ZAM zaL}+!8TMPcA@OzCaS3r;fPHO5)#9KYK*0<);z>Hd<&icVtB&7Oj8s8*iV7QfpkGo_ zABUT6RPxk|T+0OUOyGcoI13QNlG2mwNOJ(*oB@~v_!lc2a?uazUzo_h0BLw#UimHd z)o$1tLJDGnhCHPDHw2T-yJ&y_dEiQ8R=*1p%g4cCg@K-8Sp=#AfED&Q1`oi%A5@Io z_T=;jKyl}6Zh{d%co%-C9Jj)}#p977!`qLWQpF;2p#U4qPyWcq=nGECKxjCH_!z=76M~*Wj#w4c;Sme0m>VT)YcqV2@kj$fD^Xo`v zo32lJB3}8ChA7e!@q^bZuo{LFtq9=Y>cdC2^dclBV1*ok&x}??IH?Gi6z9a`1?Iy= zk<tF9rM=Zn}^nJ<12S9|Wp7(tT{S-5Z1zrEzk-0G<^u&`6j3PAZ78$uw*r16MDQ z;?==g_qz&A5Y8n$;1e$VUAB$s{DH8QU{d%vue^4z6kMR>F6sa>l!Mz{4W7!$W5U5j zk&q__g8{rhJL$bXx(OoNHlR~?Q*9;KLV;8x9~TFpY)@d7F6RYFaNz)`@FYjDVjT1y zi#p80*Yl-vA?YCKY2Q0o8V3!5?kohJtq1pE6*zzu1I-iwEyn=7I4tKKfTi@_ z+|X-rilWK`Ztc5MLPV8EWD#L+yf~al!#?KlxNyaDH?<)G1}MSCUx>y$pnD7QVIGj= zf+P!ic1ratin|qgfIPo{-Zyjh2qk9|BKHJEhk?uLuqJRu>5U=-9iTf{6)Tyfb z1MIchf>;C|4gHHal(K*rj{v+=hRjkomZT5VEj&_QiS*Z^fo{<4b2oxC(vh1upyYGBT0Eruu3>p9(vd;DFF`Bh_){78`$R?YROA5`b~`6s#SSfzkRaOdV+BMX zh1?Ex#c8#*ainFR4arY|k*-*u)Dv2KL}=<0W&cq>5~w0ZoK2-bSD$DIM&{gVO%#hl z|9A{qj749k!Wl^%bv)r}WLD&p7}H=4Cc+%9u<{8`VosK6Y1$tXn1V4Y20lp)u1y`A zyZi)>PoDQ5vp72**FSc71_5&fP8{&w8B|LD6QLM&FA{VDG++PX*b1KB!-8(%6NWHX z3ZP)^ygmEbMyT7Q;n~>pnu9BEiu?A18=1(I2SL0iPaPS}m?_joM)NZ`BdLfqm%x-H z*div^G0<>QGWBZR)Nhm^lwvNJ6kbKD|CavnN3#_Ze7JwuqDkz^0`2QY4%)mJzK&?$ z4=z4AYA?dHiil4+ad9;8b=ato2S&gx7XgvW0qxJAJYc^Bi!=@qE0}@GbEj(g_yaUB zgp$<9$5SV27&Z8IxLqS4?3N(qW5Qh6*!v>lxQJNDMw`>ZP0oN3l)p3D4;Z+O;=mjM z;WQKEa;Dn_SbEJlUlyTSLTEQ3HS!46Y^ea|#ZRW_BzA)FG9d^;z0Ru(U=g&+@Hyg2 zG#u05F=t#DIHP=`j#;T84U7;;J?6xPP-b3lL4<|ky~VFu7_W06RP&Le?vXFn9fchk zCcH`qckR1q3((cY&JclVO8%EW#yDw%zv!Ak$b;-fk&!m&BL*B>^UiH_|Z?P*!p|K$`w8?i!as3CsY_0^odC> zR>Uj;VVIx07l@Cdk@_I1EI#fUGxZ~Yr}CrP=E<9|*XcyTfa1T0JFu_j)U;412f!|b{hKEe@>m(-DjJp3ituh2zY2cK{lxlaLN79h1S zLEa<@kdvUZXoO;Zveh;GHHhE`<-zh2SVQtaf=`C*6LPmrRhQFeyA<$6GJcZ~%i`@2+G|89x zD=f=Z)V{(5rv#)&Vi0H%AW-_F&30`IQ!nfjN$Sf#dD5{W&NWLomgjXv<96)YpL3ANW;?{>zJ`Z7sF7V5{H+L zGYRQ#c4aTM*pJX>tG^x{=ftf!DR#WXWi!*)o`xrBI7H0Orc>dzbZg*MMpHnr3?mro zc-|0D18)&HE$1%RNvm&!O$48Oda_La>d4#u*>~XTAJG`~JzxBWO155ezPjh@vC-@M zA112rT|6;yXT|?T$JM=`v9$Kqt;Wb#ZJg^Q9meNGau-@gGlF<1DVdv)pkR;-1-2zg zOGS(S*f9(ph&P+>p$2Vl5&j@4EcxxwX~mMf_^_b#IDSgPM-`H>$o9WAo_cjzcq7j+O51 zg5*xGi(P3-@a7!kdBhqz=Tgefp*DXqI9LKD**8wfa~ieulnywnV^mJ|XrU5ij5iC& z{*x`QpiUDSQa&U(@MUX0G&Xa^2Nz+e=eyl28N}E}v}2`j+7GIG#xLC{kh>@-%48=} z6E6j6fU^Y}EvNjd1M(N_3ZltM&gy&lr-2Jcdk#2{Y)jbGaXG|sLCeIncS;D@te~yg zF<8AucAT`c^??LM-^K$Y_Dt<7{(^N$dB>e2S{j)dh}LJQ?V#RZ^cqT`+^H^vzG_xN zo-=uK@2kX&hiW%vF9ld;dcF3)IoP4Pp6ykC6NNE!QD5&H)fG#JwjEJAtoRAQ9TkLO zR>p{T@y^(#0e_RaE_9xhL@4-IixyvR#s*_6Ao# z#=m*o_svz^Q9U)!G||q@Cu!-A5B#@GzSq2S!{@k7uG&gRtG}z}1xQ>GB2F?w`|X8s z{G}$)x`3nNt!F2c-ak^&@p_@>)(o{+`KIjUfZN-OLtmYbrk@)!-7Kb@?pb%%Q=hv{ z|2@CRH}P22p;>gI`rSp94+*w@As=q4zAd^MP>q<8al+WO8#^_fHkjv>eD}?5QgnlI zgTE{a5N0i;;Nq8*PGb$aND|9O&!~?swS8P;^*_txIV-FC?+P&WQ1Veu9HaMVXP|pd zQ$lskX_>e7783}fKHV3E9cx>E>f5R_UWcNtv?3Vy52O-K2)Hh54#t{gK(=tbFM>yN zFyVleaz(f&DElqh2iB6%hr;N#Bne;IVc2Ao$QNq@izw7F3Ih1}O-iNOHPU(8CSoxVaQGQF3&Epu8 zZN$2`HR3^xW0WJVnA1r<^Tff4jSsaF#9QCIk+AV}A|fC+alMJmnj}9lHj9m2ErPQ0 z<)+l0DPhpg6qA6^h4B5dhdkMW^Jf~7_@)))7G?ed*>R0K$~H7UPLA3hJ(8~Va!51! z$G3+MocN?Z4puu~;gY?^sf&M`2)^F^Giq`8+RE)Mgytm~uh2ME53hW}x^eqI_W+s0 zepv03b=8=@Db?4k*Y;+INsiV63&SP*b@di0Nw_tu<#?@g)dlMl{q*5sznvN;gRsC! zmVPI~7-fFHXclFW@-nC!QE81ni0mMWl-!z^5pDkQZAsH>^m+54sME870k@IP>uwGv z6fU9petWPNRdj*CDeJei+-ieDr%ye-+e1V{8Obe+U!|Bl23>bo0qA_4PkZ9zh&~e??!!rld6w-WBo>U`x9KS}VJ>d~2n4okXguU#Yxd2{;@N8`*)tbY6)s(FjgN7t{0?ADEeca29_5f;K zd7Nt8`z%ZAZ87Tm`|H`lIi(h*q?&On^~w#y=T_diQf=@dmveG_?60uryXho$1yi9?r8omnf&f8Au{b&jxI_Zze6&5qOo@AOe{!3YiEj@m;f*;1TpWwqB(2klp;a=y4l86Nx|xx(b2Nu7EeZAzgXbMC>_IeKHwj=bp0}}dZEM7>sBCcAykab zW4RPLS$%NM_@b%6b6zLudU&u71-%H$xo+M=@-#qPS&qSivi`pRl*ylIyz3vUY8^w0 z=Eupi>+%!tgP5@WxRA-`ysvUvwSx+D?Y<>I-Y(7j${YqSYWVS!i zHm?AOFZ)K~F|iw_RmDNm4V;kalOgMU{!n%ay|;-Ozxo40N@r=QNfmi2`}6wR`NWo0 zuTnX3Mu(>&xovF^^iRdtGM{b4o)sn71{bcr2pU3&(-vx+9NcZDYIGOQnRV%~&DD38 z3@Jle8K*;cm3r;6N*_5qPic~=8gVzNn7zC`>0+mok^g*_{v1jy6nwtxbyjaCl?*#FNRzhR(?O(+|TZzpYGudx(vaBy5a$ zsrX{4(&1^Jol%Q-9!AcedGYfFHhQUjW7Mad7r)-P zME`jFFlw>k#qWzadoJWhiPm4lui(-6> zQf7;Caf{0B7FA)3+DMD~bc@E97EQ2~CfBM(|F?<2qgB_ZRWGP;)#!Gs zv9Q%-q}6n~)$B{FIoQUKYqOxYtyr9yFZL_)EwqDq_ zVWjPk={DOhZ5u%$Q%-0{7uv58Iyed)J%mm^Lg!$iOT5rEQ@E*E=yqGUSt#5xBHTJH zbpIm!6E4ZgwQr-hZ(q~C!?E4NqkX4OyJv9wuK0GZ%=X>I?R##w?-jQ18)@G^-R}LR z{V%YCE!S~?-f?hE$05fKACHd1J{`Wn9Y^9j{4zU^7Iz%G-Emylabl#yf4bx3myQ6i zlOxv|Nbfwgrt@zTfk)?QpU#lr&NK0yp_!dw#hqtwcZLf)BStzSr#qv*bVh^lcbu*m zdROe4t~kf8c#p0GpRUBT`417sncC)U%D=U-8{MObb9y2 zHQgDG-I*TUSw7v_!QDCW-MN|Fmx{YD-|oI5?9LnMzB=8V|E2pH*u$6WDWLZhuIVXq z>?!u>De>tk4elw6?3uNW+x(^XA=oF7>uaI+wXW%FbLG(3<{X$NmwI{>T3|5sYQ_ zj~Dk(-0puW?0+`W|9rZC@=N~kcrP6IFfuSVJuv@e;3N1*BKK&4{^--1N1q+x#rdPJK93fIAAO5|w3PYid-0LgL)vSHbex9hJBM@+|7{}BPZ%=D8Zs;yGP*Nl+&*OTc*ykiklEKE zbM!Dne%L~Hc-7kB)lS1}b`GzsJv?lAde|yq*g9)?UCFS`9idF!j;q398Nu*|>zi!R zBeq|6Q0zlSXe(Fl0BZXMw+VP(BMHt+A2p~Wy*@#c~Y zhu0pN)g=kE$J_UJYc@hIJ0D-1hLV&}vXq!ze{3QOAQ`W$J$H6yIIh!dL~!3f&QOan z^-6GItutN1woX7hl}FP|s8mV9(cehx&j|?zu~MATBhS11_9yI?BpA{f9KCRwOG*B( zM^jQpwZ%x&a=_c4YvH!*^lvP+ZdbVcXxMMpJ@PSMyPnLR!bd)Ll^p{XDWlQyUMV1g z2*h}yy%L#E;_tXpyu9R+BXKfZuX7JvlTE2h9PoV!H*W zpnrfe^HfzMoZ_}S@qsV8GK~KkxPSNa8_}j%-X38*m!!{B+Nkm1-nWn9w(~G3<6VQH z1rt&$DkH?k_AdVnir2LApRD09(k8&i~m z9qgFS^zi&U*>N_L%iJSZyg!?rXgHJW16%5FnEkAo%O~pJ&0P6R!h?aR-TI;-D%mVcY>8wocd2thLD+wjjZ?=C?l_Yj8axyS~*); zT|YZpRoAg%^uGG`=&|?L8)qut*W6#6eP1iU7=Ne}DjffCqf4*q!_7X+_aAPFoQ>yh zk9Z!RyEEonHCO*E{N1;uRr5_B>fg`blXMt=y#HnN_{RrJGgTj( ze=WZM4{zCL_3_tdk&F57FC)7Get#W1Qu}-H*_n^OzloE~mzSn<0+zqOEvsGr@uA`4 z@=r;p`O2>^PXbo{pUPYQ2b3XIxVpFvUA+9I*kEgg+peCW?4~azjMR!PN8E-lPkbr0 z?yqn^(=(j^<4YNnRLM$m8!1%zTJE~Fa(hnCNU6=&3RY^RN15B>$~|8zz4|LX8+sns zoc&tGCRKTLx{cnv{I%L|Yt^17J)`yi0cG58B=72bsc>(poso7U<;a#-Do>X>tOsuV z{~nb2c=qYf$)$mY=5PHUqkjH;0Z2E(?srM7>Mt?w&&F280ZHQeUsIF|jY56*h2*_( zIP6hlhtr5-z}^L)hbjZ*sezP%@TIme-QvNlbw@o8Uh8dEqc&UdLyUc4gnw?3?% zkjWE+29y{r4T`-?6c3p>Ce+ecvXhDD#n%3%`(|}R*khNAv6==`IA+VejF3-@=i|j_ z7anrFJqmU2&teHQWkWW5iI5hHahsOHUtMWFtrhyf{-X3I+)2q9wFrS>tP5BC*<0t@ ztu)XU=WO01kdd}Vs5}^peIIQfYsqv_5rtybSO>-p>(h~3*A6X+9dR+9hBhCIw5Qc2 z`7mN}Ll1kXI%wt9x|aw|_%dG$wJaUJ7(2Jw4j+E4duj*oH%Oh-Ogv!LCVB4}Ui>^Wa z`0(>LH3X8;f<~Am3Zr(0L$SolUNjv06Y&Sfmh1w4EI?1U8#9 z{tj-mi&6bYC>l&;BL$9mgH$gWLlGv31NxUy*6$)L(umuEcrS~ywM;TBE*Hb+A^^W# zf<$&vRhS^WChDev{sywIk4X6#kj(kA)(mU_4OG-ZcnGB6J3E}l9;aZ55Y-%x1grqu z=mPK^K<2WkBnn0ZlL1Sl#}dqWIA<;jU!=jw4usrAFoTQJ7^A|6fA}oOa?p3odrH)lOpPp^#W!0!Uk(5mfaQZNW-3@U`Jt7H9sCt zMQXw(bOFHyirL`;J_V%nAXs>WRDtjx*ivq^GEeg&k$obu@UH&)WdLfyPJ*K5lUNYKz;_F%PRgZ37D_L-RzRn zoc%}Y_v0~anJ*6~n**&&K~ugY?eQ6nraZBdV6Ns4OsF zgmq%1PvNiDt;^S==0C+JgGQ9+-G$H271F6!OlJ#qRSIxZmo<4H(=b!su86fO)8!Jd zs;4k?UCQsHg@SWMic{dOqgicrVW@40!yH_a1owzW9_8U732rwJdH9me-=|zLiUDMS z7NyL((h~&GQG#TB&w}s9ju7Ywpw_A++p@~eOr#7ku>0}U_1{pAoYRgH)JuHwp;?sv z3I~usO_ljMk*&#P;b*~sro0t#scT*3 z?_9o|#n~2^=wN|~VL&t|^$i4uzC=Xs0;`hC!`>k(j@5`=kgiAakVhl5DAi1Hm6=U# zHUV5U7JO$GjpkO`c6kh?@M1Dx7LZT8cHRR`9NT=0_=bHnepjgvqX9 zvd)0i8%zoMHJ{Xr1viRrCKU(>17PV_H=vY@f zvAYWHgS5lQ8+=lqMLk?cx#L!92%wU*DZP85F8l}+j91^7y`dX(d%Eeyz>km}#&>+e zk!DThiBjOMCpTIz1+R#zt9lxfFW;a8jVBbNEfIBA9B`_RWNSoS-%vK(Q@K;Wc$9%7 z0*&fFPtX29eJ}#|g;lm3J1giZyS|4X)KhkG-EG`9{H{yHX8<|hh(c!~5|1Ju@X5VA zP(`J@EGQH{onIEk$jW_$C^?Y4=%F^L5%wohRs22seT@*A0q6gmCU(d9|(vheNr); zkcp$PzJXBBBfSt1Yx#r?&(IO!(OlYtJQg8Df*Lv_>&C#rNWqXm>NM@v#5hq@DmM;ghB$`0bT7OIL_TKC}YA^5%|U zjrv+))ZiMnwo4i50^n<5P;!&#RFXbA2SykGp*Qa~I0&4U5V*Y16j3{@5zy8bU1%IO$q!S0_v({IQK0ijwTWqpMxe%7a$muJOBm(;b6 z3W%54=z>0q3J0u)2&Y8=S_?eC0h{&#<6$gprzDv7t z{st>r1XvFidGB6&QW?mjb;F1L1C$QrAP^)Vlu(GH9I{YAs1Wrk8vG6VorZ*kD-do| zUAPv6DrB~vd)D5{#%j+M8uCFdrM+Jy8g>AtHE$7zxVt z2@oP7ybBMaP%yOs-cyXOWjC9d)N5MQ?xqb6@%l^PpOL+feIoF?+2|wtNws41u@Az1 zTLu+Kf@07x^NB$DKZeQR*bc0 zqjMz9?M%#1x84we)Xe$j*}c?0329h_g}VpBEfm9bxmFZn&w8{xtFrPl!j?yvW}Sx_ z+AJ@M9DpBZUijWkddVWs^9W?qd`|}PBjYBFdwir2-B-jx*566906F*RdKs1XG#z%8(0qJ{jTj`UJYZWDt{C4?tM`UOCG$AHt}LOv%1^j#LwK)JWX<{N#-vmP5yZ2QUMS zoHIBqC+*NVIoODLEP6X2g;ETp77B9v511E}31JZiKoaC}85fg8;D9NJ8-59=M312ieJH_%eh92{hb+s4j>}E`}Fqw1qGSZOT%2~m~9b}h9Q*?J#)!|6S=u- ztV21rocUyWIP~hTp%V&m0z9^EFX+RIp{$N3dMlqScDmn0HwBjoaZJ0 z?uZ{sCVKlu^7fM=O?8MYNiMv`LMn+WK4(ko&yb!{P^*evi~vM5>v^O69k@`s6WWY{ z@;9R2&*}ddpE#gSLA8mY95*4KhLb`OWC(t*_`PWXywWRH$yeZeSkqsw3_&)W$AC&> z@xS?Ur5w#q1~Q>25I}mW#1+yAgS5BazAzxH0t%*dhpy_bAeP?LTrhC|eH*6N80PLy zPmE+h+XXe^iW`Nga39H0fwJ=O} zX`g?YIG%XZKSZ6V^XD%r+qU&2`(3Sb?ngPdp+RfGPrPBK)IKDi9q_C78nOQb`L6Yb zGqE9N-k0+6a#)!a6(VeZ5Q2W~}tukMz_eDeA+@lpJY z&XEU)>9wETFOW^~^_AptjS%VZo}zMhwI#Sov)>;;#$e5R=WKh5M}G1x%RNg%sQK@O zmFyx<&Gn(f0{y}~tG0}E3kkgBz~vX?x!qqchEwrIpA`bnzGA^Ctifj~roG%&W~{D> z`*3zIt0whK%mY8)j7p}H^mL-QxcL#nj9XQ-j50rGOe%KXtIsxLj2Bznfgv4>-^^E* zMzJ9gW5g})-W=_cO!3Keb}uRxN?;nTk8wt;=V7Ndv((HC_q=iXT&4;N)k|Y~qnBD6 z?XfpK%c-pQ&Rr*bfnMy64p^}%o82MM-`B-8)7g}`MW9P@V^WF^6!|sZ!>^61(y@|U zXPx6n!_bBP!eO6t!FpK6rY#zvSIKTpP3!I5jR_lhF&bk2>d2tS5jt`5$t4?zsUcSD;Qifgde$dEVJcF9 zdsM=?tc%v#7W&2njw{Dj8txO+c$x1TIy9dCpdmn}%Im5Ib>pwk8E?zZBbc4rUEUGA zt>Vm{yHQma1TN7vRh4%aqOa7oyX?DqJ5a+>#Y6}S_csi`uB$VoyK=2gGXgVAJ%wO? z;uGiAR3r(6si$rDl@51Mz|1vZCVc>O&KCQSjCS1=pLCi=p9SqsN0}Fz`nb^5lAdgN zp9Lp5HESId=OP01FxSy!xCt#Ruij?MZ{rM${hc)HF*T`7&fzJ3glto_lh@2od9K)uc-xx_$i8YZY(tKe6L#M06p3pD6TvI=cfe*$Rs zrUKU!OJxgik`8E8DspJC}vQ0W|Q0AgkIM|RigF!iG#T)v^XZ(4C58(JQv z)hrTR4-zDSp4t%C{VS9Jk5e|o8l5AMnNqQP>h;`=4A7+ZMb4@sDGb}hU39$SD%Q!^ zaAcxQ_GCZuVC3kc_KO>{L|R<9$U}b;Y$aarsjx|VY`n|rWpTtf*OE}Kja=Z+QMGat zmwrps^LfF_p!Xn>%+(q16I}Ys;MGAewKk!z(M8NHRWEa7dLms{F-Opg#$(47=)ajC zz#tC7-~gaN=fOzv1;fzi4UmDy#HHfr(GBXV_O;+j^gNyPgwQL={N^8FnYD$_@^$VE z1|ZtI&Xi93Mu`vCu5%duGYf!v4%tb49yn9RYy268z}+NFXNq+?*`0z)<{)(X%7H}> z>g$gGsfHzr1g={{+|W`s-aAr^P_OiLAd5?-*a&SOb+}HSF`*c#j{w40^xv(1MhIW0 zQ3(v)I!9p6zo7fOh{sT9m1~5MiTmh<*l+Dliz8PKAw87?eA^rO6t9F z0TmnR?Ygx)2WWH*+wwY5-w0FGVIQ1g_A+hqnk@ z+A4*kd?c^~r#$wNx zq?nO;^osBgqW+DoxyLQbaXVzLxpX9a2SB9N0)~UxVz}Y}7Hh$Qef<6%y)fuwdHvwl z8_Y`vry3cn)(zOIXS0zPQXc(yMMVZSjOr#j0XRCHXV*BYU&{*k( z7$4^&)_lXl=%yI(RO#OzY&;?kBQJO|B7#-06gjx451DNO#v{$ZG?!ayXnO}Kp)=Cg zrcwdCE|E&H??uFWQo>k7Gca;c-3V)kGYU-(zOVFg&6CrYoc1)-LGLtP#u+m@M8SPj z2$q{b!JX_Gvd0(DG17N8OtlB+l+*4)xnfU#(GLsx66DD zWJkRIkZc{URLe0~N8iXkrpkARg{Q5q?e+6&7h|<=L8UEvTR2ob>NQNt4!NqwHVpTD)E2y1{|Zv59C7TU z=lZfDqRz?;C&;MUx})f1w^5?I2?MF)A8jO+E|a8i*C}zEvA7wRMde+qN--0sYRlMjcF6UIS3!VlOQbfYv z7l3o*C*2mTfR<{T9UkIoSUb-^RMYPSYXW{wPN^=H3`|xf4!womx-@k?A zS1AMY+*6^_9hq)HkUK85cUW}(oulo~(Vs&9)(2c1)Tyi+;$qQ}{1^_#TjD;+gqe`> zJ3=0OQJ^4_Hnjh<(I z_VIrpvhDTHMv>EFC8%Xbg_;VZI130!{s2Nz@2Nh$u#(xdcdN<4KKSK*@LOa9fuV=HL#R9S#CthB)3tD3%B_b&pq6LjJ0TYTaBE(@3K=LdQz)uX?B6~lr3_q85_(4#uI>tY#z)RttuYS1l7@2pMl%eGU_XP4pYDkbw8Mx&S-?W z->Z&MqW595&+FIh>c5sBq~oe|TR_wJDN0vXlZBO2>SiqZ^9{*f3ZIX=9PgC+eE^;U zqFq2RcDmjAFjhy5xH)hi#|7-!XXE8a^G28f6GqWos?A3R9L1+pqgOLaGy%9nBQjKH zb@C6vj>t#%^w0@T>3^GrXdz+`J$;n#_5OhSwxWse{(JBK z{|?GzmkgSoJzL<5XQ#n_A}NhvIurD4RFCTu#C8bU2GMC!)DkCfd9@&kjat^==^U9p z^YH=h1xO_e4hYrTL;Y7>=b1h>NbV3gDVy?`f+P!6k60}kGC=?nI}*M19|CuHI1}Bw-ASo*ZCeI1{KPoOX(Jc8f3vf0vRa1iU2ZWD6)CQi4oD z27B^1-XJHkFz)i!hl*x{r}Yu@u(VWISY&QnOlR9GbSxILI;9!GK_$us)}p5&#o8jS z_l{O6hj;6Q5@Z)OyqN>2Ote?%DI^D(zxq&eXa>B<|S7PRs-JZWbatH zLk+ilCtsLXjYhu^EZ*%On7c@7Hsh6+Q`rFZh$*FSlx+T zj|LZ`4-1nU8dr;afm+{FEssu&ptlJPZ_`mWnLvo*MSE@V+B77Ec`@xP`UQd@{C!94 zYMCq%I07r{yP4y%l0(C&7flz4$J+A7?j$}&yY9#0Lj0oUy;LmVDyD*s2e2CRaP*dY z_BbxS5h=i@CsHtB6#j|64XI_%3OccY4FX0-fhLw8Lk=){D=_$&W*+J`Mh^OLTyP}%^RKz9~QkHV?t?o8ola%L0?8i-$LfizO1*_>ddPTkOUR7aiJBj z&kyi!q=Yyjz3Kf0$5I^|Vdx27v>z&fz}2MlpN+Y1RY!w|1)HJq@;oAZ{>e-KhtVv= zzGWHVk(kymVE-$@n#KSl2`WJ(Fe!R8L~Tn40{^OSaqTlW_}0T*Y`TwvUe7{$v5*Nm z8=Y>@r(V$~C#0&cx=x52cXKeo6R#d5z@wPyY})hsL#S_wSRUs&F7J^(Ic={*FauyV zoAN@=l~A)N&G#AY^XPxOxnOGXB%H4w=yxO?d6isXh1v7gqZg=-rd^813QYN2vtMW* zW`AEA(vst&wlRILn5WUxPNk>Uln550fuX}a0!PJ4RUJXBQ@WUuXF^9C^nkW^C>x#n z`!*t(jVo0fTa&&uReN+ZLb}b~BI2@2EDFnKI^nSv=@9^O%DbPz2@xv0_ulhU1-X9o z!TreeBs$7ixct}`uCI=vT_cQ5#zeAqxb9ZtRM(~p!OeZ>RbNPl4^-l1KAsh16*@e3 zOE6S;j0-m>EW$9^@1}0@#GSz@W3LX4tvd3%@jAI@=YDl{+Q#5y!(+d#ovf}}%|Nnb1 z(wm$rm_Pfle@xKVAT?@S69t6!+g@B4rNdsmftT{*+3Ehs>|-sdiPeHtA-kbR)(0%M zu?8kP=^yv z{mDY=%XJGXUq|AL&>wF%UynuvP4k6 zeWoY-D4N}dO+O!7nG4v9@!KO~RT=?AO6ryy;k%!W>^<3QVj=i?v-bp(yOOf2LUxkK z0VsX^FiuvIBs%ffsD3GL_9Q4{r`E4WvRCfA-M6dl%P8l-;Bbpo3cbGb__*C)6>w4HTEd3iD-r%f0ThK3{#*7GV@3w}gO`Whwo?>RMd9dyzJ zDkSZNkwsdf!hZ`FfE~v0ZUW|5!N9UT&-^e4l7wgrL_8~f9lh?S24;t{DWDh~S+nP- z-Nmd2TUB1|fsehk1JTKx=T`z=Bw7eG4+v*_wUcg{Q{?B@NV(>>=?jN)wncfPl4%;( z#cD2x({wb>o)8GXYeo(&1%f*WZi-!PDTp1AvVo=p`#?9&4poUr^IMumxB)`r$HYb? z>eEb%F~Z(f8pTQX0~cX;6JP6?nh5iv#qhZR7?Xmvqa-eAp8Qc_M&X3-i!53rIvChT z+83#=3L?i&@(&aOtER-^4{%&RC7pY=e^LwxsY2yND6+7q@tJ24hW?~p~G1>A{ zJFs6@&Qq&o7CRbag-mb0rulJ!38%cN-ml7%ijX4W-y?S=k4C%}I>k|qDC{V}+fEYi-nIG9 zcj&?k5uSnxl<2BpROq@yB5s(`#>f|Mw|M$7 zbz9dws5y_&K9Z{S8|IBY=^JwMXW5r@$${no*j_3O!>UM<@ZIakK04U1@At>%M(QRA zog38?lw6{Pijn9lRu6|4@h*j2OvQy1dqv2*JX|1pCEJV|%sJFThI zu-yZW5j0IR|6JbKL&UXLt1fxKmUI^3EvfyRa{6FuramzstaD)H(ghDz{r6@4s_8`D zF;Cw$LbQrkV%gK)@d}T8ykSGa-dGkdRkOP3%E}IyAKCp$!qVLyW}%HZC3paHdJLm; z{7vk=S3t!k>AMGacnpvCehccEhSSC0Npcm{gxx%_%;&8l{;7e%CSmG;W2BAxVT$QY zsI7_7-zDU4S0Tajf`L5u^tC>%)ci%q8;8xe-}1FtJzvy*QlHXhRI0Q4bU_3=k9 z$Ul262FXURnvV3E!FNz%b|(C;3K?(=7ObWo(h7V7S?t$cbOWmm8*_^cdK z=6Rf;Iw+qwPWjITA&v&~18svllBAR!_hobsQjyy86$ij75z0@2A+0#^BV8RwvIsxv zdPGXuf=EBQp=(8ixDYU$iQxN&EHEV~x9;g-di?R~T|}x)8q~FXL<~}7EXZ%`=sj<2 zc})BqHPN$uA%y0=Wr6QSH=vCKkEVJCsUx=1Y|8yS;4KCD1oh8l^^E|1vptJ; zd#qhq^9=1eqsg^;Q_lCnN0G)oX;apw-iN@ghb=3MqwiW)ojd%~vbrqO#j2*Fi}2pviP6_VKOg0zQcr*yP1sG{Zr3(cGE4PZmeS0536T z#E<;-nN%18YiPN*dFiLVJg*9z1KHPUBxDx`ap=A=(Ug#)Y%!mV+_l!*k#?|jnW?4@ z!*0dr1VrtEMIQT##iy@!-pD@;y1-$Wz9Jpr*vAcY{P3RvD3A@;KR`nexpQzs$ zHwEZEEyxd85@@jg<7!QRnZI*yXkIh6)zXe=5*yoryV zTmYj%uRZ-oc?W${=ZNu=5wt!BzC!(Lnuf(VxtHlnD-{7#!b=8?FP>$5$B-h6WpGEj zJR$FZ4zVd*UqSIvCwanFU`PE+emzROe8AAREfqO97x>KO3v7-vx=5R*bNE%h2wUKx z4~<4OAxI29)mW#e0}jlL=DeOx-vFqSx#8WQ@8C6UCL7Qdt(Rc~sy%ueS%Q_X%2dmi z<2F#&|Gh|s*>mdjVnG>fTCt4NFLZFejy|RS`4VMj*hb3&4z=-4u1F!L4yNQ)H1-gD z$P5J8&)a2sKWI-J+P`ZCBUncV29mLTCmyD(FT@Z_6Nw^lPw4=;J(9{I$T=;gqttW@s~@M-iYOY-fBLMvoO@Chb16jCm}ma#MPR}n zv#r2aRfGUW5{K@(Fo8JJ7!QGED3yMD{rYq(xaSv*NY_JwnzR*G!(`q0V054#PLiPP&YiGI-mz)g{b>}X#ZgW+>Sf(OHPC3pk zw&@*^SGFc(pZ8u(S)<(Hjrl;N<`9Jkf>syLog-ifaQ zoj+eDRyH4U$YbW}|E%9vdCiGpk&DK*kumO%4iVAjr#-ZqfJl(9E7)c)M+lwk_syXyeDp!{c^+D-c^<@GuA%Hwp;rw zNf>eTaKFXX#0|b|zbfs|?-7NKd)@z;?54+j_Ofw8IyJ7x6?p-ADjNgfG4(Q;WWWAo zQLC!X+h-eZ-0it`+@W^YvX4Q_aO#uH2$P5Pj0YL5zHRcG*Aj@Nq}B}wNTQY%Pi&|5 z%1r9*(Y&kLR-|yb%n)7nDZ(8@ro~BkJJ}0quFVe1y&L&DcbVU_ufM=p?0t@(Ekax8 z&DEy;q`A_uf|V;fatgZC^d>sKU6ai{T}kgZPH23~o?l5=YJo$?7HyVHYUadCn>SIR z?xs>C^?Eao&dZ>G{Y&I*Ka)oa!^u>XtQ^J}gkFMF?}fn;`#fcARJDGq{r;;TIejBo z;;*Xn=w18$)0P=D-tw_yb5kFFMq_usad3%I3m6iCq}~qUwYC>3uRKy0&Ct>0?gE~* z*fX3?)3KtQ|F&lcd{h^SS;5M(RQL2W>}0}EXuuKc_z3JdV-FhT0b#28lKR|7CKAFu z?LM;0XONwC@6CW9Ir7rlT^WxyFZ5w|>Cl?>zNn|@PvmdCpK`@uS{~?TWYIy$aWr! z`3ar|9;J|_YW*I6RWmH3f{wIu>UAtAu9SkfNe`{IR(#nu=W>K@d9$l%{Tf2EYpGg+ zGpN_fx9@=IrvZdcM&KMAy*)G7q6?ko>CzyhHt_95Fb@S}n_`~&&2$U)G)6rkPQymI ze1}$8UfY%eI;h87DEx?erX@NfV4WZLgT2r2^Gk(2pqAQGxGPf;G)f87_qG*#+G#R| z%Dj*bF#Cofwtwle>7o-~(LG3170z=zQ--C|Z7lR9GbOIU&8paUwL}wRt&7HsO-#&8 z#3DLg3Yxl`P@ARGe>|x^Ci9|HTtv89DZ{8k*8OASUJC&ZVCX8i8W9&wGj|jSFKSq9 zP!nG?eURyO@R6>QRCAiK=qT_~mbKZ<17cJxF6H9Np}VO#uZz}yTWmL(P_NOs1XDE$ z!>ClY)JGgXDAk&V=^KpNtqJD}!>KNpWHeK%-CJ81n4w(OZF?@f+~nn*T~NkZOO0j%*Y!O|>YYt1(R--tY1)A8E^# znq~&OmH;lZ4BbI+XZ@(@Eq_tlMNjvOkEuvUE$+_suoZ(uLM=Kw>Y{zSY-uyyv&7eQ zB*G$`x^4&6)MQtcG~DWa`I-_?HNtdpunbQ&_3Mgo5}4R($+V}r9&j#BXUPlHa4rFU z%hHqpz|6yCM9uQ>Yyf&;Tbjce=Y_aIxvTc#0?uxn}HCDqh&+mZ*$5Cz|7J2f2dJp z?lOyk71L)bg(m8)vcW%6Ijjt|wP6=mh-{^ffQ zyDv%1M&hQC;e_|Qw`PVDDi1!{>mhpTN=N9?08@2co2>{_Cn>hb>zGUV5i{fwy*0eW z)nV2X$9T`FQ&s-e=42<68owO!l@5cn}aJo={9(zdQteQwJND%U?~pLA30!@ycd?(y*Y z$4AFabK9=e@4?rXOv~~v|Ch2OrbbzH;`^15Mt!cG_A{-E0rehkN?h0Xm@8aBH@Lvw z4Pmd-=32xUBFA2t3v|+HQ~M*;^|*SaKiCQxYe0xK7SQnx47XHIt5nP0|EBDyHI$n6 z@f{SZpPM1Zm5!MmXyFEJLd73F*voj4c&7R``Q#isnXZ(4pIdeOe} z+RAS;?@sRx`6(p=%g6t>vLo|D9snatfe$OsOvcSl?8yIR8~3qt4SpUVQ)SvtFtvFA zR~|QQ6&+G?P4(+?hhx&=qf<{CFDU<0*%ANcGjcBcBRU57LvB*@@8(kWZrGxfR`Z1wimVeF-9 zuVAK;%}ZV}w5Zaa#n7C9Yew_XVSrh5tHdK;eCEYBp$+>37OhtHTlHQvIg6B{ZIHDV01q9&h~ViUL^#q~i~+tq9sYeDO9DJ>gIlsgJZ-0C!~zU5k+D(}VP4)m z!+5&XpL;YFASpc@{5>5aiX8m;&fEBU!o^>k;P$PgD|AoG`2_>(=POpdzOm}v3imAh z3ns!%(qd2GpA2hX>Xd`--;NPCGKE}!>{_+B@h6PLy;JZ>ibttXR z6d1>H`1;#i`vSxYO|ECTRE;ImtY%bhY}RCQLx0g_5vO`8Jgr1rbtl-OR+%w{OZjde zZhkA=X5}sn&Bp{rHUMG%Nia&D<55-iLD`wl3p~hYj`X5iaXejEH<#dG%NsoH*f5wT z09A?&gDEDO03jFVDm|%6gBVhvNww!}K{|>hMNt@)GhCDxfXdGBpi9jo_^wB}2q!7Z z2?%PB*tPlg!JUptdvAXcfCvM+nn-2mXCPuEG{`G7x*L+dg8h&6!d8gX>SHFL9GEwa$XsgHZZfXP={B zZ=)dIDgA_%8r{Q&g2-9b>!^UsSb%j5-$ne+lghA_AfgkmA8LtvS8}vQjD_E!Gd@G%bg2Loy09|m=JK0L`K_8A+C{$gXnMr;Q9th zxsB@$$9p%P-{9Vd&r%t1I*4QeYN^g#mh|`)#G+0wT^i!3XBwhYwnB<9bgSQ6_v@xB zvg6Q#_xVd*=lL72X&*|07{pRgvw#bf{hIAc)ih`}wP>cMaIdd+Z8mRewsFHh{7Nfr z@u~H}dI9E7O5MGGLn~;^x`=qqQQ# z#;l05(BXNybu#A6kccKm*CB)p#iPP<)u`ix(bW%rm56nlS{&H~BZ7wmdjaj3a`>e@ z$~l;CMsMDFg1^%fh4YeX5?WkSTb2qPjY8oo8a$hB9Bn%C`02}EgBqUBsR(NV&xpWN zm-`~V!kxatO@zryn0%K={-Rp;u+i}m8~3qwtG{i2_$@hZ2Qw9Vk#2pS&h{~`*p{LP zpiywk_am##ghwoc55A0$MYSV-x2$$^mG1vE*v3y}@AAtxUtbw~CvW%KGd5xE1t_yo~dezya*n!&#AA0YfO^$!} zkc&x<;&N5ZeM!`L4%9Zfp02Oyq$q<@1@fVK-4{jdRD_n0$?#~VBZx>#+8N0U{^0`k zqDMxnL>_QuU^&2*(`VZ?zKw2M*9gN|%cTf4f0hiT8zYxtjI&wIcbM}aT;O8r~4Y{JFPo?5h{P#wUZj{VW|G^O1yV z1zJPhiOpZbAZ~oM-fvmYs}1V|tdPVp|DK-BVJA2CZi%|u)4MI<*~Zt~56$$v-pM6y z>I=(Q*4wu$H(*o$?&8?q{=H=!Bla&o;k1_G9MtyAv={h=Pk-Sl*}Ls|AJ(r|HJ^4W}FD zgp6cZUh5mlvh4~PJ?T8#H+qUe+A@~wx4eHWe|_MV@xm=}{o`lCa<;rLj=I+W{%k_m zmJjC+&Gvt|z$I;+D9c#>X5vzA;MU2C;)8_j_S@^Q zQ`^7yN7cRkK9KNy`#*0FeR})PJFe=E`QZ$kq509=bvu5H7sn6%_)xZRYRAvXn!2H% zAM2m*_%(Cq)6lO^GS!{G=N{X<`~Bs`x}AT%^~b;a^Uv_9oqvB!*1h}tYwr2Zg+D(& zK_DQQ4jl&d5m5FDm|77XwOj;6k`xGI9R@B?#9P#$K-m^Ch;bsm;a3HQq2r;JBT8Lj zKa5*n;LtEkOepd+oE4?7`Z}!2)$uYWB>8OvtfK$Lh;(| zvw3Ike;v2s>iUO~@{8K+-`nOE`|nWn%mu$QmS9oRnx2erCy-oEwg|)jKK5j|qvuY^GgHuG{*4I`~ zs71yqq>QB&45g}C?TF5!A|B3P^!na@yE+q{G@GMyC@DTkQi6oBZ?c3QLOPNgJ8i}Q z;A+9(^+I9{ZVjj3KTnD*fls69bhtcIE5Cdh&$vO%d(KO`S$i&G4{_kN6;wc>h+`vT zmp*PPVJ{NCZ4N)7A3FTE1-a1zsm-Rqd-mMA_2gJYnCr(as;LxY!_DQ?01EE}z^Gg3 z0|-Z@p*_d7n>Nm4v|}V(qI}qBe~}8O|0%P5@h+87LlmR+tj|v7&k>_Qy2?dU&9mFCw!oVUy;5o=76(Ap4Ce39zU`Dve z|EBV*1o~j{sJs6Mm7mUv=)wPw%5THv(8t#+o}QuY+G=flqw@dX!8A)!igjtt z|J%WIl1jHX{B^Uo|Gzt!?hZ;5Yd75aUuYRfYj%Rmoeta$2^)#onWP19)&@%CPrhmCK*vN(V&mR64S|%$?Bba#q z?zfNsI+(6~ncqJ9A845eO+UU&yu7mW`Gfnv{uf&2*Zi0NQThE3S|;wtc+uW#Ki-!n z&;IxzPG1hGt#gi=Y@eoocip8fez@@V<5>4w*Fzh)XgT>CZK^v~?CPg0D{Z)K}? z{O`FA^Sa-k{|7DeKMtn4MUx zox`Lf^DPuoz0lWxME&f1tHu8DJ+?DijlKVV;3sVGV(oAp`I4+ugUk%&9Rof0S zDv2i3yHBMeq3v-KuepqM1dMS`iYadFFCJGQIT_tIOf_b5$ww*Nlk_)Q z!({JUsv}%|>@Zr>0*9lr1ba#m1_KN8K6bUNgj5LF%Z(J+U(Y=mP2<59;b4T!dLmPy z81lezG34Bw9ZX|5CS$&J+j+7omVx!(IiVuVB_)R3H&D!@ooaJ(4zwbMF%#Y{=gU$> zOH1)n(-q!N0z0<>}kBc)AO7_Wh6viin zT0%TowHr8wFGGGHlhQ?Sf;XHBAekJbF9<1vAS4VSkivxqb%co{(kdib5sgzuE`JTw z^#bp-)h_wK&L;8B{-b*Od!(^E5(o0iefbVWyah7+k`_#jj-)H$I9onsv4F%LHWp<2 z$W*EY*{u&)Bu0Od5+c}uabK$XFziw<;7&e)E=wbFVA&9OMuEhTd9|C!Ym4}w&0uCB z{IefmS}cewK>DzktOwBtHt=`J)yRz|z@k+)jFNB|@dLYT`1I1b>m;1s2<2G2X4 zx|B&StWI0rn0&eyuwfxri{Otxqzag@y|lF5Y=8v7LL#FeTF5&o@dyiMjLkrE`9yIn zA~#)~9Usrknj8Zmc~NsDb%428EkVycpgofS3 ziq=qr@1bEJ9?q>K+(88*%89H=M;#!eZN#uGAhtxg4=2tsrlYtVTs{l4h7FYe10SA8 z$IH>N6eN}bgK+uBr8p6YSq-L5S->DO))}d24+mcG0p_ki9iU+#sZ);>7pp`cV58@? zGgd=A5=q`3C{RO>fk+7v^4umdsZ)$KU2w+i5XViL!~8((88I$j3Yj&4o7J#AH0+m1 zj17>BNB|C|q$6L%A`W4pYH|x51Mf%sf>{u$#zUGH!A5&aglHH{(Sa?M;gJKjUzlac@40JnTt@_P-5F?#IDDXtpRUs4hx1L95iCDGP73+smF=FTqE&m_HL5t}8L1DM!ACH^U!I3Xp<H>5xj$1%oMu6lcEXg1)I-DiOs1};6XZ%l4~6tj zf$20u-ck}@xe(^xkmR(uDGTucaJ4&{_z55-i2w*`0&z~@ziJjgz0jgS`W2Bi$rxo6 zcSec#r6oh`q|P4%{mhErQN)@B=|#2I=$1^V*Vka?%!7g1QKz1rYT!3%Ae@t(ib(;)&;< z5RHEkTEs|wGTa8lcPq*+yea#=g^2xGLqLiI${p2uSdWyb zSfCIi{?)kQA-U47yD=CFenL!~ma9b4QJYxkLN*%OZQL#%l@o=kRn$}lmq9_A|V%8 zx`Omvff-wi3Y6c@oj?Rp9=3`}wJhYD?~q@qxmrPLrD1GJk#142nvas>6v!Qh+V-!x zDppIXG7jnUd>$Nw5E3H%>&@hKDixFeAc7RgXbNFgtb#RYr;Ej^bD%>Lsv9I-khCG@ zu6IgFjUZaf4HZqp#%(?4B_)io2u|8?-n^w1`2u1_3vr=NV0#H)` zj!Nt_n!K-; zO}F`4WN3Lx>tvyEkgHDhYWucZX2hd2!?PH1z&27Qm4Qmz|53{khws|q=1-y zVcUIq(Fg0=HMc40VIi}HhC#ZWBUt4 z80^S)QlkWu1Y(ZTF!$MwPy|yFU9VCdJ1EF9X2bW>(jwWnwbc@&Qc|5H0hN2qn@9)- zk86pL5UZtIfmzK0Of3=-x$t~t<~6zED2Pdf03KlD{2afTa5@^kVv`weTu#4n||4rzympN|>LbQKW=HM6j#-h8D>E@5H1n@;iamu#Z}B zBLH`SI0AuPEXkO~JI3H;$O|smau-M%cw$_xLRgqp9Dq z_JAKA_6>Gflcg?1Uvn}F#6fC6>({^@3bCbzXn%&-s6v_+5rSB-4}XYHIfxuxSU$Tx z5O`;#OL`bfR;Quy&K@QVgs@LL3C|T|G~n{7n*Zj@?{Jnw6vf zxTG4mrxjmQGYK3qi+e#6jVz5Lhd#i}0VD@JPAEd5#IcrAmAZ~8``Zvjr*u||ITtvF zIW*??U@S2i5qSRf@9juP{P;mcs9@);W&=z1kr^kEQ*5G$2Iq73cd}uQqWz~tPmXUR zj7W*zG$AbHL-OqGk)aQm1)T~0axz(pvx}a&+C>}zR7+{Mq|>A~G)(9dAeyZDT#5em zEUXt_jO;?TJ+5_7C0fI%cb~@v%>mbQ3qc2o3ne3 zZ7-YcZW#NW#Nm=;3c5l@uR2V06Yew@Qj1(C{lX@LSuK}5nw&0;y58!yUd3FM+5F8J z^o3E&AVVRPmI7fKalN&Zv`0KlH9$8bKmlS}j|^I~k(#_rLa`r;>Ut{I2tV+O8l;pB zQCvRbdw?RKqE;At-H&>Rf6#tjp;I^B)sC>@vB#?JVWsSdr=QX*Y(zzNc}F%0SQGG! z6TkMjWKyxZ2X!zhLklJ{S~3!qhU_~Nb63>H5gczPl;Yx-lf2VQwtcNia3Fi!Ifadq z7?8{dipLEq#qo1?k5pKjTMNm|Bm(Qy+GZ0$b+WXh|SFRp&wc9D`&D5z4ct~jV|W^AUWzgSDpERTNf)ZLZ7z5CCkLr<<} zD3i)6shy_!v$T@SWQi~JH_IAIo_hyg>r2u@G4^{es;qWPN}u)=kDX70DM~HXSuRJ2 z+wu);Ifg4*{F|)TyipBwuOhv-H`iIhDap{CE{aWyvgyCIQ5#RzDo*>hD--*6;AOT; z_Lg7!C&oG-r|A3rKJWwW>paQ!Qy%*L>z9(i=70p$+GuzK+>xanJat$j;?kP<_{-M& zQZ%a!S=-J=v(f+z$rjz>!@o?BYlrZF%7>oC`<{?Uhkuym9-AKg^mNqzHC31-BQ8ca zoUfH(aBf#sngPY+sq;mmeZZ&daVnaLPD_Nr85DPTbMFqjpF^diB8MB4Tu<`bS}!XBhD!b$QjKa~=rViL z>!VGO(WDGZhPc(|qRgg_7c-7?UCsv-@2g3%Ecu?Vsv26o%F6TR0t@Q}%JJ`%7*Wph z{6c4ipv29RUmrjB(wd=D+QN6DK7PW$tEGyX84TYyE~bwn-mP|77TLId$D^=eJ zlj)O|Ris%)vmwTBv#UD3$E{f)_V;ivV}W5-R`I@C|JoD?FI+x7GD54QTNA7p#Vlzs zzk0@y$d{!1H|$HMW*FRZ+nS8J?y?^Kj4_zRq-IqgHLUm{!>?-qub$K=T63_u?9|!Z z?FLM-gH7?VbZt#mOx)7fIdndNm-p%xDA2EvvfGa*L8V?BYADrd0iGW~h*3d*tXD}p zQm;(6a(!c$%BF?+Y@-{spsr{R!B&P?k+_Kwt_De~hhK3wPOWV=EUU!&a2A|`{T1F0 zg1NFv@^otioDC2|B?(NQg|E@sh>Wn4)zh6^!G#|%nG0H;Ej@T$Z|wrBO01coo`hco zSjJQwui2(u7{pVwmBQf%W@x#&N+7=)V}9atrj@Xp(WOW+awYn-4eQ*tjh@{c`SwIM zwB5{UvAgH#whQD1Vj>YCA5bi30c&XCR4fx;Qtec$M)zk`oj&4&Us}N=)F!dtpdWuMa|imw<|Xx6QJAy(5WR}-Aot$_ zeXBZIwD~9B-{k3YX`#1L?y-2oGw-H5XKHr^T0GnkpheXE=vqh9*#r33R8RMeIR?5P zJGw)aYry0?%#<)0vE>P+9}DXA9A_4#8dXo9NOiH1jnkYYqEI|HY1tjYqvwedawXq| z-@{~ti?)&zW?Yyi&8bNCk;|x7xGq8K3HBYWUvWg3Mn@hVu*#XHF>fSY}IE0@XOl{Ho9)y29Ta>sRT3=Q<)}^X&#Hftg z2b5gAwM_bk!isna1h^(I2|9mt{ZHA7IV5M>U0}i27#TcXMnF1y=rM4Xu4gKM#aGhW zHclp_0#z(st7$w$t6}Fl04ZZP2f{mh32_rMF;V&BPoRsr_?`8vrX5M6WLxjjYM#I?j#H>o}0k z15vd;&!6HX^M?XXNwhczN4f%>nORcY+?fJ`5i8x?Tpn*-Dj?(^kO02&<;J`>l=Wu4 z3}4|z2TKWJ{>5LV-5ZCx*YX#f6;TnO#(;jCu=V^CjAu(i`PZ9aVKeNv8KokO2Kb|L zx!G1a$H(n=Vg|_vz^b2Z!Kx+a32TjHou?#8bG>p>ZF!)No~70T@kMKmKvVmQnPsaC<*~b z6%fz9*M>J(XX89M_?YMCyEY#N)P8XIPAe-j42$FM-y2JJ`GOV>4olR_UlwI7?qS9P zd-A?kL|1(4{1`|0X}+9ok2kvwdIk_7XhS|EdP;If1mJX0fS)&3M>5F)g~CLl4j`iY z{9I=wS!Zlyf018t4v#vu`MavA#fRq1JHf&kM(AOkF_%Ch zWEy)qnGKMr<^Ogt9bnM=*rJ3-ac0_N^si%9`D_Z$6A>wrd=(x0x2SelgfO@dl3fL= zWrDe!{znJXk<;C>#HCof zDWU*{#8=3ml{{!xmbK5n9Zb%yURPz~HB;i!zU7y;{oBFh%-B>N@{fb*9|zO_dk&^| zOKacRG`?Fl@Xq$@J3Cy%AN!JVgM&rGa;FBzbq!A28=NB>T#_1GPc^vZHMo~Ftf*~R z+1RjZpuyv7!)jb3SFLf4aigb2<65UiuXT;)TQUY(GQYMQ#kC66T8|mG z9=B*c;naF^UF)gst*0Yf&m^^GooYRs*Ltp`^?YsXg~ry41Fe_7wr1nnL~3n0#%-4^ z+O9aY<*sYX+uoKR*>*Llt>9GKwY;{%lD6x$Z8sX*ZVt5F`r1~6YZt4v-!^W)W6^%s zsl9kzd&&0p(#ZCEN$q8)+VAJJKPYK`SleFS*#0QvrHUC?G2jU+d?lT4r@S^#aqoPM3uC;y|$BSQqtM}tJ8?q)f4IYY+dSq6j1HKyaX>} ztN+U_A;NOee{TsryWsZUTSEIjS0|GVXJ!GFcMINJaXm3}^Rwb>@6eWzXE9JC%$cd3 z>fZURpty8lZahNyBk@?Qcf+6vd9jLMp<;w$tl3GlaoYQ6H(+|8xLImJO*&n|2#|EneB z=f34Z8pWzuYTlbw^HcekfXb+GeHBrk-_#loS;}PzuyYWLSP;sq!dEyI^d##3^4*bgRJ+_lIZq=7zJy>vMjl~Cf-%$>J1M9GZ`p*7it_z^8 z$5&bo8wv5Y<^%r{Pz7EaIK3%qc;L+60;$wBEKSZo;jR*@^1lE;c)(isF8mOsB%vSk6bJGM?m$hGiK=K zx2^-xX??1WzpO%pNz53d@`^OLSs8=+f zxYjNBM?m$Dfa-bYhyC9k%4kI~PgZn&I`^$yzN%<{^YgBW2j3nkGKvlit?2&I_N`)4 z?JUF+foBS8W~l@LxZl3VV65#pKyz0>j( z*o+kcLO4iLJEt66cqb=S{IhcI9|3K%ogEtRYyeO=paqnYjj0P zv!T0Tesbu6SvjDtf#Brb%2bUqA4~wRZn5NcMwn4GS%tU2-bR5j?BHNb`Tj(Nmk}A$ zi?>iubANyw2|Zb@`+-Za&gw}iU@y@e<2f-KbdJG7ggP$9>l(3-LqM-?V-WVz;!mJH zy6c%;1_}-yNpzE3R()-jvZ$0bXrf$Be;bpe+WVr42_gJ`o6Sqhy(FNxknYWQ?H{Kkc?IUVJ_$iAbE)FpOZ2KHNBFUA9VX1=nLM~xZ zDd#=$DgcjjoHeH3a-gAT5uFu(h2a1asXkabD;yGy!kUcbx@}6>iHY#BhATn!3%m@W z0o;q{ApLOVg47U?P=RJkADW4yKfp`m@`hknuyEb&;542V23ByGi2&A#vTulF_QP@4 z&5xFvKn*7O)9Ve(CgOc;Fj~JLFXC5$df>IzmBb-J*8 zxfusEp9EFTA&I)jc|iP)c4`>c0aJw#J)mCVaXUn1Qbcm*T++C2tj-Xd^8|PU9fxVD_3=tV?8?E~ryDK$a113Cs==F&>Jq)N0X^mj=E2&43X z90ggJ*TN1@a}ps+FZfQn$U2R zibnfw2z{+46D{nZxmlx_HpHdvW$p81(dvB?Ya}#vDYkG86WbRv^U~F zUTmBnk2b(1WvL5Fx%6IEh=&Y1ixvnJM4WOGMyofMoT+rK;SG(G>aCQae4@7u@`8_! zu?dU6!%QAd3=q9pIJ9&SE~X9(sfMjbIDC4CgjUTziCV_G_;hbJjAK(}B6>Lc#2y9p zs%GZ%Xvmv`i!D$0nFL2J245Y`sO0YlXKBsq+%e1S{1a{Xl{Wf zIbz&vCF=PQpJKcTaphz2;!6-8*sh?z1 z4Iy^`na|GbMYDFM823?lCU!CWUY*)4qB-#aCI@^ljK!v8q3*C-07R7mGf<dm?8IVDJK3T;SlCZSbNNx{OVwaxkbjrUs@4OsCo^7zQi?zkpc!oxy~uGA`YN zmqzaaHAkR89sv!Xj|$Oh3NgzqyMsd|aSg4wL8qktsGH@nvJ^K6$F^c$v3LF-_X-1vaw5Qrx-zh%)6iPO;wp|6-W#wFtc%&h%q&wjt$COM0L6H@;4 zxOIB!9xK!`hlv9iwcKNKa&sS%(n}F~Ba(;l2TmyH4nMAw?GsQ3M5&Ui#$JKJ_kDZ~Uw@;amxbd5dQ`6kUjWK=;{U2-VyoN9mD)7`g`srgAes%I-2M0S}4zBNtWOQ6-|oO>EL<5>zlr4iCg6C6m3? z!AD~Bmr0nrg!(}yKAnCI4u;t>R6s{pC`$UAabLc{o6gX}6-U?d?mbXouesn(xm}-2 zzH)yA`_TOy&fu<&_KoU|H*^j=EN(xJ9Y1fg6i15&&Y~tPB;8d8-q?${kr}>gKcH!EuQC|Ag+H$FAY0yJ_0T0$nW%SEJKu^iX zpv}N?xc&?;Uiy$$#CjAOvR$1=XcE%VJb~m5q$)yeMqyi>+jx6_lTr~RBcolO*{72U z;YY_5#OYE$yaG2Yr04O0b+d830KJFaaB%6RDq7P_2KNxI)hU)M3?*vTQ zB(#5ULV?YD0ITr+cw|s%Ae{@aMZ^Jq(H!cd4jDNl_UT+QYFVOfT?u$_sY8~}$V?24 zRY>CD7=?H&cQ57`CW1|Hgtw9as8aTD-TNGI5ZV%A0~`tY13=ru3XJig*UM0t3Jl=U zx_B?v>1-{3alVuKR(SzP<%{!JI5v`>cMb@L8STOXJiE{|0Cz}6NPwU90@M_sDH6fz zvtGUCJ+N!9qmRO<3&)R58)eap5aJ;|32g=r^RaEu2?JcZ6d^XAp^ZprYZb5cW3cI{ z%ZW=(K%1_jTf)impyxC({H7sfyO9Jq#ZRwf6L~T8UPLq_4MyvwXnoah4tYjB`G5?4 zW7~htoYpEK-x(teWT6h82ktk}&q%s3lyF0lQ_4F}NF#kjJ!J?Xg+omVZSaz`31A}X zb*$tzC2$G0+(K0)0#ynts@SA6BK)fF3|N7)m`y_~sRA~^f#0URh<}vFmPPjc@!tkRjNNIyU6&) zXN&{EGY&B(*wlmHFtp4bdKdjE7oYSVCWwd=l8bU4V~rlwiz|F7hh8Y?A7I9Y-^6iX z*XerVw~X!&qV5SHV;F%Hfj|Jz8F-0N%7Xfbu(52~2VVDgmMrmxJvIfGq7=&0E99~8 zL8cU+DkikP&ks-#qqtD|OZdDMETODNd@aR+=+5{!uu5euc10uj+qwoPR|W(FHq z@QPBv8sUhDhytg9VT4bVyrF+zfm5RT@`2x~>f5;E3TK@=mDqbvf6Mht+jYygPw zUddm3{PFAgDhNMs5x1jas*Ru(ACE{rrf>-3p$@G#UaG!sz>L31pUrQ*0DS6vqrwNM z2;{-9nl?L!1cQz&oGtruZw0(I{gVd(`6;i0mzUHTaJD`)fsI&&#!AK_26jFJWU?dZ z?8B8)Z`4+gFJ8SD)rxuzV@X08b9{Wm4uJC!i{sqX(*@l`7t%L?qUL84O6yJ$qlI4u4a%$DDToV~ak=_`!QuPwMl&@$Dw5 z$0n0L-l32u)AgB$80e?SBvZKaz&!qu?#V>PH{!9$?`l6T+x^J(`;i~_qagc7;o~1S zx_{hK{t)X=-Lac0_M0k=n<~qmdhmFvynCubIVI8mS!MUL#_wlc+|T;#pU)oue9`^$ zmGY-l|JPf)Uk!f0n&N)7WdCY={HsIR{i{p)OQ!$3*Y0<}-|xY=-}3C=BaeTNcK`mM z{H@SeezH@3@l#I3DJQd)KOQT8b}NDL)iN}br|CInasRZ0bZrwg*YrB3tIgR`leMPL zIa7DpAxO)!-}Sihs!NV%JqO%R&)Hm&sI_)*bPx9+|7t<8@P;k3O+eeP_3dCBR#_t?hL(9Vh^?e!lv zJ%}9Zsy)B{I*uG|BI+&CqwbwCVev z!Iu~9QuH?eh!|G$N)=BcO;osZ%O`dfa+eEL6V2^onwScW6p9;Xo?wkPN(vK>gK zxnc*(yc+g$npMAeIl~T`@5pp9y6re^wc~szweFlz+;KC_PF&z_el_=w`>djx1uN#<>%X&N-eYLt%K1-> z?yg+;+Hv73i{^m4tE{>c7kVrn%DwBc^kdD!)yuy1-(78|gcfn_3C6|T6Tepy&G3dx@?8n94(^X+lyxsg-)kW1*FXf3=(PSt^ou3 zb7Qmyeca|6$W=Hk9B2;tO?+b9!OZXaIVrzIJi)5eET`eDY?HJ8sWU#b2Cu(uA{a@w zl1a7~`PD87N?S3=*?RZ&ZndBrruq9q%N~39${(J8b-w>m+=rXt)tq;V(L1$QcyGau3+u;fAPl~PO$wir>iqHI9Zu5AKv@eElHs0dz8mi zwrbBjVhP6I8XuBgS&{AWhd(xQ*)=J>khpjB-~4gR`E5a&|M17<6C>}7B=}jQXiG0- z^!7je@juDJKgmM+#xIvOUlur9J$sY6|H~EDKgq)XX|nLL=+L+4-M@c)dkoP3|IHt3 zyp%gH{qaVaS)6OSYS`WP$J?w|#rak*hdp9{yc5w&3S3r=c%J{!P~cHgxc=pc_ro73 ze_V27$Ex=m+kZ5by(+mC{qp^msUOV}dZ{>N)#z63sg`<=(mQ8fjs`BBYL#Y|7GGU8 z7VJCK*79n?$`}A?qmCGwh(lyu7VwX1FVsU2=+(`$@FD=C#|?u<5#p?JR+q^*P{G(L zSj_3AS@FI(81itg#gzp8GAiykkhT~w=pnxOw#`PCu!3bs(r;O{Z#j^#b=Ni(J4KY6 z0}C>61q_%<*x54C06I3$2-3H9T(aLj>BM>yNG}GRdt)XOjU0(~;`_V;erDi{O3ZZA zFyd}0HCoi$W8zk|AaNX@Xbor$x#F3u-=CPADwGqBe;ww5LC3tN2WmdF&zBtW7x{N1 zl@3d92ngidW=wfZo!)NA*JCRU(2?u}31QDye$b??`*&B=S-2iR5il_o9cY|=j{on{2xZw8d#w#C6T z4lvbk`ulrM(Nw&uK8A)4St8<}AD8-J)^bxU`h^IwU+)9v*zOhrn9zLS#`*)VO%H&Y zhicFV@^5g1DW4gHydMPViv3Ig!T29+xe8tw+Q*n=G@U`luI`7q2b(nxwwZ1+a={1k z@N<2jYc7AR=V(r0w1aSlPYM)b3|e4wAr76YOb1X*ksKyW+^fJo+!2G~Qint&ArE)c z<$!;XS!=xExRg^>6c0nwNAy1d+H*RUvM#42S8#2}Pt-1(qhnP-37+Ht7PJ z=p_xs+J}dU@Gc503IiWOg+AhV8VmXzMG`1^D7KyeD;R+iA}W7BBE?&=)38j;JPvMS z5PmxkXT{ODRG++8LPY7V0%4+?9E zzHFBSJsw`5IJ{SgndOtQdy=t*mzK(cNbH2_?cgB^74ww(RzxJazyyHQB%z#=QknpI zhk|;91I;Rc^#JG*oA!=JL$Cf#qGKqpy37ntvZ7vKQ=53PFL-E$d=HvFNLVx!rS+Z~k@H?v02}oe&f6=b)$>uD zcRvaip_uD6DWy?#yg-4)Xn>&ris_2(i{3Ge1c;8MbAW~Nv~V8nsgz)K4K{+oG8V0za}1?zQFs!)GP&@gNo*nt*=F%5?*Mw2 zf_j1l)lV{1&=anN+Kyg>7n6p7cq~c<@hH!gDC`R#TVxuK24s22$tW)QIdZNIICby4 zFPdISc{Ii~^lB)?h68z0I+{rgE2ytoC{IfZ<4t2QF}4yiN+-XQ9&6%=qyTL*FGb0Z zl%X87klwce#aC$_lC*}Me<0H)^l;9ldUG-jgqSdZKFk(L#MA*Py$}H1zQH6ZWrUkG zETy-JXk$`(s04i}VG~fnw=AayJynTmsc@_+8~0H`Yv+s5=n2K(ibNvJ8yuQ+ePGj2 znhmvnKaw6tIWt=Yc}VgX49lgh5607^2iyTlJD0ZM88wh|S&su1akAbiXnJlrFL=0z zN+!me`zIr7L zEEPqED@Yg0kU|gipS+dc&Jr<#MKTEiFPer%X6N|yVbnX%qa7!o95aJG+0-G$pWyJF zjNXq>9e`+p6kXt>+MoMFe>$JLTBC-sW8u8SI4OF7lVoFhvIoRx4~Zam1+iU5&*o!q zr^Dt5G&-G7YDF4#$9eIw4^vLP72(mC>=qi6A%t(G0xL8V*N?JG-UXLLaBqL!PZ~x+Uw|46-`&n8xoph- zD59l`L`>lyaQTr0fY+Rnmm&v;&k*2)NNqHJ4n7#fRSm!r|v-38A{zU=JB1E8u5FcDKn;G%;rMIZP? zG=n1`P^l8#W)KxJ>@jFeCVP4&QUgR;*3qcQndx|K7$kB3#4?wqdoIR+bQnZWz`83k zEhedQfNCfN)Fc&bguiqICP^r$1il<)cL6kO10AKOY`NqQ66y|=um!5NbLnyx8P6^r zW6__>ASxHsKyY#~tx^_hB!g0)Q8^q?RS2MG=mGw<@jBr0cY3%CprhlrY>X{{eZ|E5 z)CSRW_OAD(`uqxY_QNI)VNOSdmTA1JLim~sp&=as!M#A}HQWoo(#lX|*N2Ow-jc|pr;6Z{}2`j#9FUsGIXx) zkby%@`-e;a3JXNU2$W;x5KeHPlmgf?*J7E3vU8H*Mn;F3X`&s34h0QCrYYGNRYh($ za9t?@>eJ|D3Y;DnXeGQNFwsjdLBXyi`r{&25N3uXg`)wFh`2=)e8ep}d9Q9*LXQ=J zQ~7VxCb6d!^rsyBu`G1jc_kXZJi9}#7tMO`*}XoQN*Y1vq#q1@7>t1#^&GsZ9I6(V zvEi`YGsy$8i)=OtK1&{cL5SfIYS8$Mha;wykMi*PNLcTMO+`A-TYbqtnsM8rfdqgt zf9yE}6*9425Z1&h znDAEev{g)N6}J`)(`&`o*Nt4y^sMY#;KwU$gLGSDCeIh8cE3A z0NsUq_CATyA*H*q_NXdwRT4Czq>plGMWVFn#J$y>r5YFC)IU0imK5YNNOQk5k9FIN zeUZQ??RCM+gW*Xl>X?LLE5lxv(4TW~$1cK`eChEW?*@OpyQtiOAN$ocu3HQZHHt-| zc^mPgL1603lO5tdn^%36TxyUk=}E}Tcb%JPbD#gdMt{xfDbQ}-yNao0`=Y$Lr(mk5 zlGS3ky9Iw6YzD-zSL=ZIMD7^ipG|TC7b0+E?}F{b%Ffx$lUHf~)c_RGJ zn{QHo<+kzfz3v+Il3|Tx9pxhWEFF2>x{;8KkwPWCdCw|*#28$3srhzAq#nKZNrfP3 zRWE+cZWRvX2N1hq^aBt3q8YC3`gA%2k7hXO!q_X(Uyo&FI8M<@`BjE7*r&oa(;b*N z>B&$eN3xjeHtz!_{Gi1q{Glm&DsriN=tE5??8Ewq>j7hAZz5z#c!UzWcqIJyM{qSv z=i$(TOc59VkxNUE+-J`3dLen&S4T;iJN}k4t_U5saHWn)DBA4ZD^iHVvVE=utotq6 z=CrTtKi-_h`1%U>nKAcs*vk>i)l4VJnWOA%omZdl(tAriT4w0Ie5!eHJPIW7u{C_O zcLT9s!L_fbc7B;|5(v9-t8~I>UgYzWJ}qbeE6GCW zcxXIUU3jhfWR*k!>HXF<%loiF{X~(HP`Sc6KS~B$y$zie)h|)xV0BrPGe=xsVN2VL z=j;}M!`RebaPI=(1DEEY$hyAetvK;Vve_o) zD|ZfQhv0K00L8?7hqfzZSedf3tkpRKPe%mPLOT5WlS|ErSjH?fbgGA;+KRul+(!5w zODG7LaVg+|bS{`q`~;*%m4VJgZ0QUlKClAZk%>_X`m5ZL`r#6^FYR^}Uc|Yg%YXJg z|0D)K!vNz`=0;#ph(MM4ZejdU^Q$7m;KITdcl*rfQWRyy%$6iPyPa$(AcjCEmt)JQ zu2pnfp76cJgVTa}%0>U{WPvsZGM`k;5ZdRO@6dGosacb$Z-cC|Y{M^+m2QvFzHx8s zTX0Ctj=Rnf*C$+?xp*jk&E@#GMP^$wIovTPOOHv-M8?cTLe^n^?)^lDEvC{~H=O4t zGOTRbJ8#WlL)Z8-(N#UQj8Fr&eBD*_Nung|*;72z7Pfb}5S+@-NM!uxnCb*weiU#% zqS$^b)@KFDRP*3>UZPfHseSeJZGxa}u$P~k%Q;Wcz>FikzpsU#jVSZSZL~YdlE*K3 zEXi+NQi@R<-;L1_^W>I7+4CY%bZGAAe>G@sjFXnd{U z&WJwgI4fT_#Qk;xb7w=(;Hx-S7RZQn-sPLplkwOOxBH+z zk-%lTq2k9Ag!jP>Z%eEwFv)(>=Rc(TT|upihXh69y$3Pn4%;*YpjK)Qy|J~Aw#-+XO0UfLUOPi+5K|@yA#O!HJGN;D z1R+}-0PNDTD>{!@f-jhDm^El|^w-@d#+P~wCpBd%6F|!JIv3TY{WG+~G`q>hM8?O1 zv-EltD)uX7DLXo(2`G-bB&H|9Va+@}qwwtB8f)hTr{5ge;ka#jW0|w%apsIe){Z&@ znl4U1{iB%d1j8R(i0S>F8RLo>gFb^~UJe5hUQyk$HD$RBG{vS#v{mg>^kbk65!@P` zA!6zrM;X?ZmteR6r0^t|X|cj8EN%w4*sO}qfpa|2H|!-ghH8%_PR73_$*sp;PtOj@ zo9i>4vQS3?(OMA_3VM3W<5klq<8fPef~GtbwQ{9AX{H{Npufls>nO}M86c)ExG<`( zFGhJwq~3Zan1ERbnyh<6@iMzi)pmW$G2-H#M?q42#9KlG!0FQ(#JILBH;))6IU;+G zi+{R64@5*eXb-DCp+-;TE2!er!z_?G8OxExB_0N+wOu7zfPl1FVW@^OsA@c^kXU2S zjNy1{M?P44X`iTvkI(vk%ICU2->`wFK+w_*zfU2JH(^5IpN%i8Jj!C;C z@|JEM@os+5T>Ig2OX=nh=^?CLdr2|VsyA0fG?#a6J})tYL9&9n5OWuZ{p?mzu>^or zCvP~(4*Pxi)Q?T9`AGb6zUy<8RXM(iwB-9z+2ceO&Vl2&G{rgMvfAby zWG<^D;WOvT_Oc-N^=)s@)J5c5%((`yJjXJycHkXcSGL-{hnUzFQMm3=u=l;T#vAlX zil;(;_zp(vf<$ojmosSLHABta?DO@cWxKX&w6{Fja+@*ACKwhxF=iskv8*L!uu#I7 zsDF9s*rU+h(e3Tscq`crn6ZZ%-^AoOTc^(ttz37Wp6hfTLUMmv-wD_SHMt ze%d-EBRH_C7vBj_)d%c}b}^tm)q|=d;Sk-dF?3s2_2F&~(ZxC*c9>LDlnwS zMg^)r0lCX0_-xZ<0Rj7qz?LkxS#m4%cy#A`KSFFvi4I1e+N)MHNwPZLL-rQ;s(A<( zze(+Z?5H!eUvO)f-ZEjFs(?{0PPRy_Bp7Z=WM_9cn5X7s1gj>{o%o&G!#K&F?CR-H zU7a+zt6-W$LM;+HTllO=w&QnDR;k2}tb4q_>7MNaJ(k0QDo}MdA8U5cDxpmJi?-EA z*=MyjHf2sKa?fK&j^>zkishX(^cXbauKYlOJ>zGE?CR5b{YL8KDM<~J&D55;x-9)E z`V#-M5ANqavEoO4k5KLVaw{e7=YU<@k9$-2s7c6_2hw%ItCSZwn9gnZFd!wAnC!;E z1<6EnS*)4XwjuH)7X;#olcQ6oZG1<$%fS`z!+UcR-DS9QW#CaEVB=#O#KpPtaXW?j z3q=rbo#Kgr zcot$?kQ^10s4uf3N+Hrz0+U6XmW9qAqLW8?6)e!4L)aaYY|gr=e6<9NUX726kgWhA z!YqNpM?eKOgqPxFjUf|3QW+Etr&wzO1h!x~hoE!7julbk@`pcmgs;TMRbx$T&VY^t zeF=p@Bt>zO9$q`Wl}q4>F`B5#Ws z!q3T6L$jo)di&tS`qY#4Y5k?{P?_?3umj&U`NIB;Ej$8G^9f`Pg^HX)Tar(7B<~XA z`Qjua#Mbn_Ae6g2)JDUx3|`<0-giaZWugT^2-K1g8bh#=YBCW0%+J>8UeEFZp5;3h zhZH9-v%VMMYc;5F6&{)8ES`Kzj(d=8t{6);lpki_xead4dhX$<3a(@=TXf?iurf5%qvmK zUuMU%&i@iGs9I{O?}`s^!JEQFiYT766+bg*k&ze|m8Et9K`e;`=Z4A&=nbs)hB>fE zA0U8h5>S)+n$IsIudnXWaZv%D1zQt##v}-&fN4xpXJYN6NkEe;36mwMtr8fS;r;7N zE^%<7)+xNnYV@(0&nGOYf7%Qr?%@)Axfr}WKERs5Fn+^UdpF;B?Q=P8wd`^GRI;)o z#37uOyiTB2mpCUumRLNQe6j=2`kvgRdPKDabGCR{Xu+c}bm=u=*;dzgy9$iL4d`QsAeG(_N1fN#f=EibONN_y7}Bzq>_ED1-fW0G63Y_*a<43DX=Y!MC=3|x@G5Sa?L^0=e^RL9f2j%Otu&ucqgH2wjLUw!R( zjq8-Eb-pp~d~4D9&Z)CuU1#I=&ZfxD=A_P+Q=P4Oooy&@T-({v*x5PI+4Z$k*^TRx zsde=jclBCy^*MF*uj?Av-ZdE6HI&pPKh-sy*ELeo^}e=iw6SY!pzFieu8+8GgdNh)IG*9VRcXm_noWb6?6TS2BeQfo<`6hh}Ec+HZ_bC^7_gMt?Sw{6) zCHGmM?pvJSx1_XhX3+BTe)rP;6?Oe9oBCG`_Iph9uf`8>)d$v?40u`&taTpn@*Y?hIN%*Mus(Uf=k&ma z{DF<71HN?wo0rFzEE)&iujP z(!r3r!Cg&*p@W0FCkDgtLwxn2aFd}umP31;ha$X(A_Iq_qK2ZAhhk0-?aLq9Upf?9 zH*}zB=-}Ycp^2e5yc|)N3rytkmhuE=d7`&GDNvpqB~M9~r=FHirsd1iOXY{_(5j%RA_mNk#(@BKW|`TSl{_g|QO`RQFGIC0v)WgKcZhB<0JjAZ zN#qZ|wzVFF)PrOKqKUN{$wYNcEzNKfM;fGT$dx5&2L8e90|V@tNjDr^5?xgn@lwq4 z3wqOMzgl0ZabIVlI};=?(j}Od7W8G>OvtYU8+mbS&5HRTWWVX>@^eXcmc#ugxXw>C z5;UxHoR|Rl3y%6>zWKo4nEi@trWnNJ=Zvaz0j0x(=lON_Rfsco0aZb&yLlM=o{7IO z`(T*J;&IFfCVVzGGyX5k{*$Xb_k?rsa9&p6KbU=M(AAq0ZM*J`O|uT*Oix5&eYeKEE!MZ9=WV~)wOo!#_@EY7nlDj!~Ii+lV;qC zxVoZqWaGC7EiZ3H-TS8u_y1%WuC(;t%dy?DQ)mU^UfGjXANHJ|>X3Wfd(iyyL)62m zPDSRu@}X59_qR`VO}@H^uEBjgG&R)?Fv`$TG)27jPZ@D_S(U~sMe@?0J@C=88dHz) zbl;!7ny<_1tX_?0#{TSMG49v9czim3{%60La`pG!4w5}bQzY1Vh&|axG7d}rtkx%J z@pu{;YbB(YF;A9?{Bh)l?*r3am%OC)f{d10tXnhZH6{K_!P1K(t5P1|gY+^50UBHu^f7jDiY2zjG%cihQ6B*)utd{E*yQ+gs}B2p+oCx~&Q0Oqt1CE?;TnXsRaLf0Q)9}4h;H0&v9 zn8rbfIT2Yv#Z7SW56PG_G`0crS{xY%#@NSbxC$cDMiL4Qf?WVo ziwa4K^fe^G^8i&4R00XHIW9gxcHM+XnBhhT$?-E1LMbT>ERE0O5lE|5p5|Ws( zY-KhOB?G@rkP^YlbHY1X{G1GnArtKZOxghc8jmnTMrjs7_K-0%)P!t#>@x-uB^2~Wui-kV3J?;Iu&Bb1a5*P6bOj`glQp8$OWMt zocrv}6dB<;7k8VDt_1Me#t0*#8kpNIrN(&mvnW3#u#Cfxlp9%1@vxFKdToDATV-x1$;*JgC=h!L^AeTZX zK;n{TE7HdR6@tW9M}lyfP_Y5CZnAB&LVOPi0?cKC0ei4b9!bW4Wdk>9Y)u9-2!Nr$ z%TER9R2(Qoa3n!=<_Kd%6qJhkDn|hf1eiegB0==22p0>SJuL@3LMFxIR91-UROA3D z$t)hjreX)hIDc6>frbQ48VNFlGZk40A}u6B2Ny7u!oa}mECrt_!;G<$!&sU6ptFR+ z5h~fJ5;A^P4wjx?_qmiMmElSOm1}6iC>e#PLL6l1bT;;x6#vsKHl2py3Xq$D6rVDP zoec9qh6@H@HWI-xG9F|!vX4R`bNDHut^pN3LL+1fSP6-)vc<^??xNDxQ@;8&@L zlc`0g0GJULP8K5O=!9-Apq-2N_QT)g0$TvgnUy@UOjVPFo23&{m@u$6pU2La6JzX& zkiQ1;VEq6BfE6<1Cdp+=Da0%RY%c#54Ai2C5OpOZIMBBcv`>JTS`V$Vm-5P~ds`k5nK?N_ZqjBEb>@8SWYv zI4n^Cbq>AM%1n3Aoq?ZXAkMg55H-#Grxqvc;iwwX+LU_tRp}6qJAX`eU-`ob4ZAAG4YG!^aZwK&R#6+YTRFjJ8 z9w_uS&VEV5*-#-z1qAN_ob8IL30RV0Ot_>2d6`!9uEz!09%ka#W- zD$AHAqfum{rT~srVI>dws_H_{2-6=)QE>uvVw)%dK--g{poT+Cj)v~LyCd|j5`c6t z2~#qhP==0`pn3&_5h9WxzP&%7fl}RonQw3aaa9E>P9jRGM#s|NL@x-HS_Aex{0KCH ztga6Y|7HlUy^0$VH1z{;&>deb@i%PZLRg6 zGA0lkBq4NV{r`AGJTjjLlJwsj6HR2$LpYtE!v8pHu;!xj?oMuZKk5F%XAO>vq1X?)z=E$bnfQ72~{wo$$}l)T-DiZW5y@ zk|icg(XfV!Ffwo#n5$p&xc^<~eb7g9T^fcLqhA2kE>q$fmF`-rZX5vnSpcHU*uO#t ziWD_|PMOoQux%meQ6dUY>oIjBw6o#lJdE_*pbZ;4E+ygdncqCoI`qF0L4?+D632S%@7DvK& zQ+Z&1ek1fQ1c!g8lqKwu0AZ4zauvw9(}Sr%6i#M1m5r}t55!udAJcHnb0B05bK)m! z{1y9*oQD@9UjmuB|b`~@!Ny$q*Xohl>aTp0~AG46t(;iII1e`h-tz@5d9 z4U$peNkp30lZSuflu}0^`S4oFJvFRKpZGWT5g?H+NJMz%B)6P^8qwflZu0ZN zKhM3F7~q~@q^M8iOho85y+nkV!Sfza8F~D~-GuYo0jb;DesczbMMb%ip>Nj0OvtY} z=U!Vt^@12Eds+Xp5B+3niMMVQZTFi*DC`Uy#bP6N3ZG~kgqjE;&TLQ!f|$=U+6ln@ zg(z1cfOu2w@A*bWmWW_6%1;V6m-c(*L76rr&B-@1CHn0zozOT> z;xAXAW`b8%!=#&@@9n~Qdy*PQ9kyfWw4Id4X4 z$=E#$+NuWFxG*8Y8Nf(L*$<_E@I2?ruRybF=Xcb;iE#pqI2!N#>4=R6v8kFK+GWvAr$cV5YO~>2YvE}17L57Swi#AZb zwxF=JIn(A(YcD=+Y>CgJg&m@B{+ibsVKmTQC_!r~CFQ#2zc1?fTt^7hZSlFkuUD$tq;fL@AO5uWK z*Mjx*f{k*4YOrW$yJ&xY@ksdMvBE{iu0^NmMQ7zA&EV@P+plNNe{~K2N-zBC-u3m| z^jA;iSBAlox9yV8`6b`*CBMQY|E{IL=_N2`&oo%RYP%eKe))R%GOKVoq-*)+^m3ST znQb7Cw3SDnmvh49afR}PE;*Q}Pgcsg1}kZ{D;eikvcgw*g)6yTD|yo^1}@VJqqqERlf9;9kR93QKgR4m8qMq)(RJnjj@e(lJRRn5 z*NAz6?C|d2`tO+i^O|^kJ742DiP>;<{$DZs2@;ttC6N_W;ttWjWgKI3-4byW2!lK?-qLE|X zF*U=ug#SzgZPQ-yKSa<&dGYo37 zW^Wi>bg6J^@CSp~0S;Tyvxc@KbzfBR zkvpT?4C`ik<1{W_R)M9ohWkErKlGY3*Q>s{hP#ej;WuCPWt!^W8ijMPKOHfA^d|8* z3|I2g!-5n1zrpuSi!c4Psr)gSIh|$kM4S~N{CS3xnX_#uR}|>#fBYTV4xSbsBhnm7 z&UdZ-$3IMODtXSJ2)Z3iXC2C}I*3s{%2{u?j)vOf{Yv7GUw?fFgU$?GaMrt=f01-Z zH;@sDChv;N++3{Jdl;e1Wd3vad@K!RZahjbPtlW%sRRofPMF}S_7J173L_M5<0RXj z`~gUh=1?}SK``6nNIj9;)=opVJdoT*#B6?B@jA_Er)G~Ws~zUN1H}a`4ha?MCw7=v z+S|b^{hkuk`_@nQK974^3?C`?}L8=}46Xc1C?cifl1 z1*6G5Nua!78WH~PbB3gbxO(QAGuehFJqU^IdqdF9_qTG78O{RJ0BTnu(de;BGnsgQ zP+aWyZv?Pp$~@eB0HXdI8z-uvNAwv=*sFvN_;;=|F6LXQKD&b}us!Zu%WL*IV1m`0 zE&FbQ%?9V$8ic?5TPui&%YLVae~^&VAK#o5YH(m??|y-xNN3r7`SH=srb7;AFMoen zQ!m2NN+R*&k(H-_Cw3AMjAKEntq^6r?@1LD>qeo&0%m~vhmS>dGU4ODs z!(6!Q_NUH!?CD?=#lEZ8ocCgmX+kmfntKnc9|L_omSZ(0B3D}zdfc8)zaTbdC9Jk} zUM+a9f97ns!yi$&W33t@HEB_1ctedp{sB0cECwD&na@?fnIS;%428c#>SGr z?9h%+GR|%;l?_AJ=}oiyCv+lnb~!=8#|gGZ?rFlMV+WysyqtE3e66W|PJoUX=r``9 z7Tvr+i!wg98PQ3@|KeAy)g(T=w=b38D;J!4)f=@x>xl|O(@1xgdQ?|=j9Q~v5N)?L zSX{Y%u@29Z#LioNfU6;HN~?b{Q1RKp=}V^o{?NtG+o<4Mov1(elM+ zH^sg~Kdi73H_vJaao4P`ukAScrQb*+kO6m|E8SP_@c2@$5Z+W%_Cxc^!;)j^d?~J+ z^1xyEYVJbbtW&w=AA`f!TNm97aMW7YgK$%59bhl_Oz_g+c&dK}9)AB6Su8 z=o1xoTZSYY%f%w%tqS|^9G`sKJ^!D(=T{+j+g94&{@Q)q<#SqgfeuSErO)ccLfL7U z9nEfKEWmTQGac#;^y_eFHbhxP`iI7!EelFJ6!oO zLTxXYbDrZnxdx;kMT2=JUfKN5lOg<&vacH9TZfe&bN;VE?ElZZ=a!+f!(X!6*4~g) zS{_|=UdWwVdrKK<8UA&6pB z>+|%H*0JW{ueG7;e=$_s#veE@-Q};p_j75R{9|~jscroOGo|hMJLl!rsr8Snk+v7h z!^@qk>z~-F?NXGByhnFK7U$Cba?6PPzSYKOZc6*>?_5@fJT|`YM%v$+kE{%bZY&5? zJ7$l%C`S1kixn;%^JhmCV{IE>g()5HFS@KwPHilSMmj$JIaU(gM`{*sGM-V0!FzRxFDb8zPFmIUXA( zk7aAcfq+spJ&wbQi{r&5h~kpQ3)XEctT8VcliTCJ!_@<=>JOIFWT_C5x$@ebpj6 z*e(0|jcis;%z#49tX*3 z@XGP+@l2ajPl{LPS*Yb>oYH(udapZIyAm@jh=rAEl{a{$Cc0UbIn@}Ax*YX}8`?QH zaz{_{;ZJg3zCO{K!~a^Ev$fkZ^9DceV9wn^{+=2B`G`DRUmo&hUXOO}6g(ek$S-lo z7Yyci#OJe$@*XNL<(tmr8+sMgn&iLh&Yzt-E^f)GnB%>2$eXClzwefxRg_<~V&1+| z@F7R7(xULpwZc?P0ivpKy0U;_FPPF6ymBiX9V~3ju`D&=P1_f)#tXEug&zk6Dqfz@ z`J!j>h4Q(=(dZ()B1ct`x7k#n+nTGRlW&%LTQ8Sr>{!H|yNz)yB4Rb`Tk^I~3ak{x z)XC!46DO1_w+-D(_P3UN!IW6~-`=KBGqo&qOvw4WX|dT*N!ztzRh`>shj^~@B^?>X zXl&Ub%iN*p+YcPdoaW1xDhp3m6&sx_^{^~<4bk3hT8i~A_QaM350&mvl=wInpKz>j zbH7dV2~1K>RwOGbxH^?-mX*o#8W|y#Y5tYG*2=ue$^u2DK&R@qWmSoL6~C&oEVn9e z$X1Y0Ri&sZny)G~trmtq ztxTuxi)G!Sd)-ndUv00!+xuV zACw*ql+XrCeuH&egVn0)0o{8xX7}u^?j7;CcP#XtBmbUL+db#0d$iSir*s?7Sb^1M zjTR3BKEX`SO*MM1HZpXZyjNAdJ(_$&n|wl>{M(uWr<$&;HZgUZuUdg9Zu9lfW){CW z#N+r{adRNQDa@mZtt*Q55OG39aePrin%@;Y^k&zZJe?kjf)sSxS5jq=;ZtU7uhwuR=F#$(&>PjtAynJ?-0 z==dYDUComJ(Cqfl^X((Y%iBUbY=#6ftFD%*{6^o-K+_IjUT|8cb2-Q9QDtX%Ras9? z!J>BY=lIg!ERTQut7|N@;*w*R`g8FoE5T!a7qPty`@HM&e5q9e5xT4EsJl4Kv|LNC z?2>}tHPtQSci*?_Cbx@GI(eJ>I}IGg0j)je)?H`)OZKkyJ~1oVd7;-l$@!pOcb`=W z$vV&)*SAmaw0)q9(R;BAyc0y9t|;>NIJMbs>fiLNQ1883t4GftR=oY^PPv@RL$~*- zI-Q~HI(xk87tO$5T=RZ8y5p^1Z9ha01yB`gN [!WARNING] +> **Early support** +> +> A2A support is functional but still evolving. Tool calls, artifacts, and memory features have limited A2A integration. See limitations below. + +## Usage + +```bash +# Start A2A server for an agent +$ docker agent serve a2a ./agent.yaml + +# Specify a custom address +$ docker agent serve a2a ./agent.yaml --listen 127.0.0.1:9000 + +# Use an agent from the catalog +$ docker agent serve a2a agentcatalog/pirate +``` + +## Flags + +| Flag | Default | Description | +| --------------------------------- | ---------------- | -------------------------------------------------------------------------------------------------------------------- | +| `-l, --listen ` | `127.0.0.1:8082` | Address to listen on. | +| `-a, --agent ` | (first agent) | Name of the agent to expose when the config contains multiple agents. Defaults to the team's first agent. | +| `--working-dir ` | current dir | Working directory the agent runs in. | +| `--env-from-file ` | (none) | Load additional environment variables from a `.env` file (repeatable). | +| `--models-gateway ` | (none) | Route all provider traffic through a models gateway URL. | +| `--code-mode-tools` | `false` | Expose tools as a single "code" toolset that accepts a JavaScript snippet to run. | +| `--hook-pre-tool-use ` | (none) | Add a pre-tool-use hook (repeatable). See [Hooks](../../configuration/hooks/index.md). | +| `--hook-post-tool-use ` | (none) | Add a post-tool-use hook (repeatable). | +| `--hook-session-start ` | (none) | Add a session-start hook (repeatable). | +| `--hook-session-end ` | (none) | Add a session-end hook (repeatable). | +| `--hook-on-user-input ` | (none) | Add an on-user-input hook (repeatable). | +| `--hook-stop ` | (none) | Add a stop hook, fired when the model finishes responding (repeatable). | + +## Features + +- **Auto port selection** — Picks an available port if not specified +- **Agent card** — Provides standard A2A agent metadata +- **Full docker-agent features** — Supports all tools, models, and gateway features +- **Multiple sources** — Load agents from files or the agent catalog + +> [!TIP] +> **See also** +> +> For exposing agents via MCP instead, see [MCP Mode](../mcp-mode/index.md). For stdio-based integration, see [ACP](../acp/index.md). For the HTTP API, see [API Server](../api-server/index.md). + +## Current Limitations + +- Tool calls are handled internally, not exposed as separate A2A events +- A2A artifact support not yet integrated +- A2A memory features not yet integrated +- Multi-agent (sub-agent) scenarios need further work diff --git a/_vendor/github.com/docker/docker-agent/docs/features/acp/index.md b/_vendor/github.com/docker/docker-agent/docs/features/acp/index.md new file mode 100644 index 0000000000..5152353abe --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/features/acp/index.md @@ -0,0 +1,116 @@ +--- +title: "ACP (Agent Client Protocol)" +description: "Expose docker-agent agents via the Agent Client Protocol for integration with ACP-compatible hosts like VS Code, IDEs, and other developer tools." +keywords: docker agent, ai agents, features, acp (agent client protocol) +linkTitle: "ACP" +weight: 70 +aliases: + - /ai/docker-agent/integrations/acp/ +--- + +_Expose docker-agent agents via the Agent Client Protocol for integration with ACP-compatible hosts like VS Code, IDEs, and other developer tools._ + +## Overview + +The `docker agent serve acp` command starts an ACP server that communicates over **stdio** (standard input/output). This makes it ideal for integration with editors, IDEs, and other tools that spawn agent processes — the host sends JSON-RPC messages to docker-agent's stdin and reads responses from stdout. + +ACP is built on the [ACP Go SDK](https://github.com/coder/acp-go-sdk) and provides a standardized way for client applications to interact with AI agents. + +> [!NOTE] +> **ACP vs A2A vs MCP** +> +> **ACP** connects an agent to a *host application* (IDE, CLI tool) via stdio. **A2A** connects *agents to other agents* over HTTP. **MCP** exposes agents as *tools* for other MCP clients. Choose based on your integration target. + +## Usage + +```bash +# Start ACP server on stdio +$ docker agent serve acp ./agent.yaml + +# With a multi-agent team config +$ docker agent serve acp ./team.yaml + +# From the agent catalog +$ docker agent serve acp agentcatalog/pirate + +# With a custom session database +$ docker agent serve acp ./agent.yaml --session-db ./my-sessions.db +``` + +## How It Works + +1. The host application spawns `docker agent serve acp agent.yaml` as a child process +2. Communication happens over **stdin/stdout** using the ACP protocol +3. The host sends user messages, docker-agent processes them through the agent +4. Agent responses, tool calls, and events stream back to the host +5. Sessions are persisted in a SQLite database for continuity + +```bash +# Conceptual flow: +Host Application + └── spawns: docker agent serve acp agent.yaml + ├── stdin ← JSON-RPC requests from host + └── stdout → JSON-RPC responses to host +``` + +## Features + +- **Stdio transport** — No network ports needed; ideal for subprocess integration +- **Session persistence** — SQLite-backed sessions survive process restarts +- **Full agent support** — All docker-agent features work: tools, multi-agent, model fallbacks +- **Multi-agent configs** — Team configurations with sub-agents work transparently +- **Filesystem operations** — Agents can read/write files relative to the host's working directory + +## CLI Flags + +```bash +docker agent serve acp | [flags] +``` + +| Flag | Default | Description | +| --------------------------------- | ---------------------- | -------------------------------------------------------------------------------------------------------------------- | +| `-s, --session-db ` | `~/.cagent/session.db` | Path to the SQLite session database. | +| `--working-dir ` | current dir | Working directory the agent runs in. | +| `--env-from-file ` | (none) | Load additional environment variables from a `.env` file (repeatable). | +| `--models-gateway ` | (none) | Route all provider traffic through a models gateway URL. | +| `--code-mode-tools` | `false` | Expose tools as a single "code" toolset that accepts a JavaScript snippet to run. | +| `--hook-pre-tool-use ` | (none) | Add a pre-tool-use hook (repeatable). See [Hooks](../../configuration/hooks/index.md). | +| `--hook-post-tool-use ` | (none) | Add a post-tool-use hook (repeatable). | +| `--hook-session-start ` | (none) | Add a session-start hook (repeatable). | +| `--hook-session-end ` | (none) | Add a session-end hook (repeatable). | +| `--hook-on-user-input ` | (none) | Add an on-user-input hook (repeatable). | +| `--hook-stop ` | (none) | Add a stop hook, fired when the model finishes responding (repeatable). | + +## Integration Example + +A host application would spawn docker-agent as a subprocess and communicate via the ACP protocol: + +```javascript +// Pseudocode for an IDE extension +const child = spawn("docker", ["agent", "serve", "acp", "./agent.yaml"]); + +// Send a message to the agent +child.stdin.write( + JSON.stringify({ + jsonrpc: "2.0", + method: "agent/run", + params: { message: "Explain this code" }, + }), +); + +// Read responses +child.stdout.on("data", (data) => { + const response = JSON.parse(data); + // Handle agent response, tool calls, etc. +}); +``` + +> [!TIP] +> **When to use ACP** +> +> Use ACP when building **IDE integrations**, **editor plugins**, or any tool that wants to embed a docker-agent agent as a subprocess. For HTTP-based integrations, use the [API Server](../api-server/index.md) instead. + +> [!NOTE] +> **See also** +> +> For HTTP-based agent access, see the [API Server](../api-server/index.md). For agent-to-agent communication, see [A2A Protocol](../a2a/index.md). For exposing agents as MCP tools, see [MCP Mode](../mcp-mode/index.md). diff --git a/_vendor/github.com/docker/docker-agent/docs/features/api-server/index.md b/_vendor/github.com/docker/docker-agent/docs/features/api-server/index.md new file mode 100644 index 0000000000..f5da934988 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/features/api-server/index.md @@ -0,0 +1,355 @@ +--- +title: "API Server" +description: "Expose your agents via an HTTP API for programmatic access, web frontends, and integrations." +keywords: docker agent, ai agents, features, api server +weight: 80 +--- + +_Expose your agents via an HTTP API for programmatic access, web frontends, and integrations._ + +## Overview + +The `docker agent serve api` command starts an HTTP server that exposes your agents through a REST-style API with Server-Sent Events (SSE) streaming. Use it to build web UIs, integrate with CI/CD pipelines, or connect agents to other services. + +```bash +# Start the API server +$ docker agent serve api agent.yaml + +# Custom listen address +$ docker agent serve api agent.yaml --listen 0.0.0.0:8080 + +# With session persistence +$ docker agent serve api agent.yaml --session-db ./sessions.db + +# Auto-refresh from OCI registry every 10 minutes +$ docker agent serve api agentcatalog/coder --pull-interval 10 +``` + +## Endpoints + +All endpoints are under the `/api` prefix. + +### Agents + +| Method | Path | Description | +| ------ | ----------------- | --------------------------------- | +| `GET` | `/api/agents` | List all available agents | +| `GET` | `/api/agents/:id` | Get an agent's full configuration | + +### Sessions + +| Method | Path | Description | +| -------- | ----------------------------------- | ------------------------------------------------------- | +| `GET` | `/api/sessions` | List all sessions | +| `POST` | `/api/sessions` | Create a new session. Accepts an optional `title` field — when set, it is stored and LLM title generation is skipped. | +| `GET` | `/api/sessions/:id` | Get a session by ID (messages, tokens, permissions) | +| `GET` | `/api/sessions/:id/status` | Lightweight runtime state (streaming, title, agent, tokens). Requires an attached runtime. | +| `GET` | `/api/sessions/:id/snapshot` | Full state in one call (stored fields + runtime state + `last_event_seq`) for gapless resync — see [Reconnecting without gaps](#reconnecting-without-gaps). | +| `GET` | `/api/sessions/:id/events` | Live session event stream (SSE) with sequence numbers and replay. Available for a run attached via [`--listen`](#listen). | +| `DELETE` | `/api/sessions/:id` | Delete a session | +| `PATCH` | `/api/sessions/:id/title` | Update session title | +| `PATCH` | `/api/sessions/:id/permissions` | Update session permissions | +| `POST` | `/api/sessions/:id/fork` | Fork a session at a user message — creates a new session with messages `[0, message_index)` of the parent (see [Session Forking](#session-forking)) | +| `POST` | `/api/sessions/:id/resume` | Resume a paused session (after tool confirmation) | +| `POST` | `/api/sessions/:id/tools/toggle` | Toggle auto-approve (YOLO) mode | +| `POST` | `/api/sessions/:id/elicitation` | Respond to an MCP tool elicitation request | +| `POST` | `/api/sessions/:id/steer` | Inject messages into a running turn (pre-empts current) | +| `POST` | `/api/sessions/:id/followup` | Enqueue messages to run after the current turn finishes (supports an `Idempotency-Key` — see [Idempotent follow-ups](#idempotent-follow-ups)). | +| `GET` | `/api/sessions/:id/models` | List available models for the session's current agent | + +### Agent Execution + +| Method | Path | Description | +| ------ | ------------------------------------------ | ------------------------------------------------------------------------------------ | +| `POST` | `/api/sessions/:id/agent/:agent` | Run the root agent for a session (SSE stream) | +| `POST` | `/api/sessions/:id/agent/:agent/:name` | Run a specific named agent (SSE stream) | +| `GET` | `/api/agents/:id/:agent_name/tools/count` | Count tools currently available to `:agent_name` (accounts for deferred toolsets). | + +**Path parameters:** + +- **`:agent`** — The agent identifier, which is the **config filename without the `.yaml` extension**. This must match the filename passed to `docker agent serve api`. For example, if you start the server with `docker agent serve api my-assistant.yaml`, the agent identifier is `my-assistant`. When serving a directory of YAML files, each file becomes a separate agent identified by its filename without the extension. +- **`:name`** _(optional)_ — The name of a specific sub-agent defined in a multi-agent configuration. If omitted, the request targets the `root` agent. For example, in a config that defines agents named `root`, `coder`, and `reviewer`, use `/api/sessions/:id/agent/my-config/coder` to run the `coder` sub-agent directly. + +**Examples:** + +```bash +# Single-agent config: my-assistant.yaml +# Start: docker agent serve api my-assistant.yaml +# Run the root agent: +curl -N -X POST http://localhost:8080/api/sessions/$SID/agent/my-assistant \ + -H "Content-Type: application/json" \ + -d '{"messages":[{"role": "user", "content": "Hello!"}]}' + +# Multi-agent config: team.yaml (defines agents: root, coder, reviewer) +# Start: docker agent serve api team.yaml +# Run the root agent: +curl -N -X POST http://localhost:8080/api/sessions/$SID/agent/team \ + -H "Content-Type: application/json" \ + -d '{"messages":[{"role": "user", "content": "Review this PR"}]}' + +# Run a specific sub-agent (reviewer): +curl -N -X POST http://localhost:8080/api/sessions/$SID/agent/team/reviewer \ + -H "Content-Type: application/json" \ + -d '{"messages":[{"role": "user", "content": "Review this PR"}]}' +``` + +### Health + +| Method | Path | Description | +| ------ | ----------- | ----------------------------------------- | +| `GET` | `/api/ping` | Health check — returns `{"status": "ok"}` | + +### OAuth + +| Method | Path | Description | +| ------ | ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `POST` | `/api/mcp-oauth/callback` | Deliver an OAuth deeplink callback to a pending unmanaged OAuth flow. Success path: `?state=&code=`; authorization-server error path: `?state=&error=&error_description=`. Returns 400 if `state` is missing or neither `code` nor `error` is provided; 404 if no flow is awaiting that `state`. See [Remote MCP OAuth](../remote-mcp/index.md) for details. | + +## Streaming Responses + +The agent execution endpoints (`POST /api/sessions/:id/agent/:agent`) return **Server-Sent Events (SSE)**. The request body is a JSON object with a `messages` array and an optional `model` field. Setting `model` applies a persistent per-agent override on the session before the turn starts (subsequent turns reuse it). An empty or omitted `model` leaves the existing override untouched. (Each event is a JSON object representing a runtime event — remember that `:agent` is the config filename without the `.yaml` extension.): + +```bash +# Send a message and stream the response +# (assuming the server was started with: docker agent serve api my-agent.yaml) +$ curl -N -X POST http://localhost:8080/api/sessions/$SID/agent/my-agent \ + -H "Content-Type: application/json" \ + -d '{"messages":[{"role": "user", "content": "Hello!"}]}' + +# Same call, but switch the agent's model for this turn (and persist it): +$ curl -N -X POST http://localhost:8080/api/sessions/$SID/agent/my-agent \ + -H "Content-Type: application/json" \ + -d '{"messages":[{"role":"user","content":"Hello!"}],"model":"openai/gpt-4o"}' + +# Response (SSE stream): +data: {"type":"stream_started","session_id":"...","agent":"root"} +data: {"type":"agent_choice","content":"Hello! How","agent":"root"} +data: {"type":"agent_choice","content":" can I help","agent":"root"} +data: {"type":"agent_choice","content":" you today?","agent":"root"} +data: {"type":"stream_stopped","session_id":"...","agent":"root"} +``` + +Event types include: + +- `stream_started` / `stream_stopped` — Agent execution lifecycle +- `agent_choice` — Streamed text content (partial responses) +- `tool_call` — Agent requesting tool execution +- `tool_call_confirmation` — Tool call waiting for user approval +- `tool_call_response` — Tool execution result +- `error` — Error during execution + +## Typical Workflow + +1. **List agents** — `GET /api/agents` to discover available agents +2. **Create session** — `POST /api/sessions` to start a conversation +3. **Send message** — `POST /api/sessions/:id/agent/:agent` with user messages +4. **Stream response** — Read SSE events as the agent processes +5. **Handle confirmations** — If a tool call needs approval, `POST /api/sessions/:id/resume` +6. **Continue** — Send follow-up messages to the same session + +```bash +# 1. List available agents +$ curl http://localhost:8080/api/agents +[{"name":"my-agent","multi":false,"description":"A helpful assistant"}] + +# 2. Create a session +$ curl -X POST http://localhost:8080/api/sessions \ + -H "Content-Type: application/json" -d '{}' +{"id":"abc-123","title":"","created_at":"..."} + +# Create a session with a pre-supplied title (skips LLM title generation) +$ curl -X POST http://localhost:8080/api/sessions \ + -H "Content-Type: application/json" -d '{"title":"deploy check"}' +{"id":"def-456","title":"deploy check","created_at":"..."} +# title preserved; LLM title generation skipped + +# 3. Run the agent with a message +$ curl -N -X POST http://localhost:8080/api/sessions/abc-123/agent/my-agent \ + -H "Content-Type: application/json" \ + -d '{"messages":[{"role":"user","content":"What files are in the current directory?"}]}' +``` + +## CLI Flags + +```bash +docker agent serve api | [flags] +``` + +| Flag | Default | Description | +| ------------------ | ---------------- | ------------------------------------------------ | +| `-l, --listen` | `127.0.0.1:8080` | Address to listen on | +| `--auth-token` | (none) | Bearer token required for all API requests. Leave empty to disable authentication (safe when listening on loopback interfaces only). Recommended when `--listen` binds to a network-reachable interface. | +| `-s, --session-db` | `session.db` | Path to the SQLite session database | +| `--pull-interval` | `0` (disabled) | Auto-pull OCI reference every N minutes | +| `--fake` | (none) | Replay AI responses from cassette file (testing) | +| `--record` | (none) | Record AI API interactions to cassette file | +| `--mcp-oauth-redirect-uri` | (none) | Public HTTPS URL advertised as the OAuth `redirect_uri` for unmanaged MCP OAuth flows. When set, docker-agent drives PKCE and code exchange in-process and sends the full authorize URL to the client via elicitation. See [Remote MCP](../remote-mcp/index.md) for details. | + +> [!TIP] +> **Live profiling (advanced)** +> +> For production diagnostics, set the `CAGENT_PPROF_ADDR` environment variable (or the hidden `--pprof-addr` flag) to a TCP address such as `127.0.0.1:6060`. docker-agent will start a Go pprof HTTP server at `/debug/pprof/`, which you can query with `go tool pprof`. Use a loopback address — a non-loopback binding logs a security warning. This flag is intentionally hidden from `--help`. + +> [!TIP] +> **Multi-agent configs** +> +> You can point `docker agent serve api` at a directory containing multiple agent YAML files. Each becomes a separate agent accessible via `/api/agents`. Combine with `--pull-interval` to auto-refresh agents from an OCI registry. + +## Session Persistence + +Sessions are stored in a SQLite database (default: `session.db` in the current directory). This means: + +- Sessions survive server restarts +- Multiple server instances can share a database +- Use `--session-db` to specify a custom path + +## Tool Call Approval + +By default, tool calls require approval. In the API workflow: + +1. Agent makes a tool call → server emits a `tool_call_confirmation` event +2. Client reviews and sends `POST /api/sessions/:id/resume` with the decision +3. Execution continues based on approval/denial + +Toggle auto-approve with `POST /api/sessions/:id/tools/toggle` for automated workflows. + +## Driving a running TUI with `--listen` {#listen} + +The same session API can be exposed by an **interactive run** so an external +process can drive it — send follow-up prompts, observe progress, read the +title — without scraping the terminal. Start a normal run and add `--listen`: + +```bash +# Expose this run's control plane on a TCP port... +$ docker agent run agent.yaml --listen 127.0.0.1:8080 + +# ...or on a unix socket (no port to allocate; access is gated by file +# permissions). npipe:// (Windows) and fd:// are also accepted. +$ docker agent run agent.yaml --listen unix:///tmp/my-run.sock +``` + +The run keeps its interactive TUI; the control plane runs alongside it. A +follow-up delivered over HTTP is processed exactly as if it had been typed +into the TUI: it starts a turn even when the agent is idle, generates the +session title on the first turn, and streams the resulting events to both the +terminal and every connected API client. + +```bash +# Send a follow-up to the attached run (SID is the --session id): +$ curl -X POST http://127.0.0.1:8080/api/sessions/$SID/followup \ + -H 'Content-Type: application/json' \ + -d '{"messages":[{"content":"Now add tests"}]}' +``` + +> [!NOTE] +> **Discovering a run** +> +> Each run started with `--listen` writes a discovery record to `/runs/.json` containing its address and session id, so a supervising process can find a live run by session id, pid, or address. + +## Session event stream and reconnection + +`GET /api/sessions/:id/events` is a **Server-Sent Events** stream of the +session's runtime events — `stream_started`, `agent_choice`, `tool_call`, +`session_title`, `token_usage`, `stream_stopped`, and so on. Unlike the +per-request stream returned by the agent-execution endpoint, it is +session-scoped and survives across turns, so a client can watch a session for +its whole lifetime. It is available for a run attached via +[`--listen`](#listen). + +Each event carries a monotonic **sequence number** in the SSE `id:` field, and +the server buffers recent events. This makes the stream resumable: + +- **Resume after a drop** — reconnect with the standard `Last-Event-ID` header + (sent automatically by browser `EventSource` clients) or a `?since=` + query parameter. Buffered events newer than that point are replayed before + live tailing resumes, so nothing is missed. +- **Gap signal** — if the resume point has already fallen out of the buffer, the + server sends a single `{"type":"gap"}` event (with no id) before the replay. + The client should re-fetch the snapshot to resync, then continue tailing. +- **End of session** — when the session is ended server-side (for example via + `DELETE /api/sessions/:id`) the server sends a terminal + `{"type":"session_exited"}` event and closes the stream; a client that + receives it should stop. A stream that closes **without** `session_exited` is + a dropped connection — including the run process itself exiting — so reconnect + with the last id; if the run is gone the reconnection simply fails. + +### Reconnecting without gaps + +`GET /api/sessions/:id/snapshot` returns the session's full state in one +response — stored fields (messages, tokens, permissions), live runtime state +(`streaming`, current `agent`), and `last_event_seq`: the sequence number of +the most recent event. Pair it with the event stream for an exact, gapless +resync: + +```bash +# 1. Read the full state and the stream position it corresponds to. +$ SEQ=$(curl -s http://127.0.0.1:8080/api/sessions/$SID/snapshot | jq .last_event_seq) + +# 2. Tail everything that happens after that point (replaying anything that +# occurred between the two calls). +$ curl -N "http://127.0.0.1:8080/api/sessions/$SID/events?since=$SEQ" +``` + +This snapshot-then-tail pattern lets a client (or a client that just +restarted) rebuild a session's state and keep it correct without polling. + +### Waiting for readiness + +`GET /api/sessions/:id/status` reports a session's runtime state. Add +`?wait=` (e.g. `?wait=10s`) to block until that specific session's +runtime is attached and ready to accept follow-ups, then return its status, or +`503` on timeout. This is session-scoped, unlike `GET /api/ready`, which fires +as soon as any session is ready. + +## Session Forking + +`POST /api/sessions/:id/fork` creates a new session whose history is a copy of the parent up to (but **excluding**) a specified user message. This lets a client "branch" a conversation — e.g. rewind to an earlier question and try a different prompt — without losing the shared history that came before. + +**Request body:** + +```json +{ "user_message_index": 1 } +``` + +`user_message_index` is a **0-based ordinal** that counts only user-role messages in the parent's flat, user-visible message list. The targeted user message is **excluded** from the fork so clients can prefill it into their chat input for the user to edit and resubmit. + +**Example:** + +```bash +# Fork a session before the second user message (ordinal 1) +$ curl -X POST http://localhost:8080/api/sessions/$SID/fork \ + -H 'Content-Type: application/json' \ + -d '{"user_message_index": 1}' +# Returns: api.SessionResponse for the new forked session +# New session title: " (fork 1)", "(fork 2)", etc. +``` + +**Validation:** + +- Out-of-range ordinals (negative, or at/past the user-message count) return `400 Bad Request`. +- An ordinal that resolves to a user message inside a sub-session returns `400 Bad Request`. A sub-session is a nested session created when a multi-agent config delegates work to a child agent; its messages are embedded within the parent session's message list and cannot be used as a fork boundary. + +## Idempotent follow-ups + +`POST /api/sessions/:id/followup` accepts an optional `Idempotency-Key` +header, making the request safe to retry after a network timeout. A repeat +with a key already seen for the session is acknowledged without delivering the +follow-up again: + +```bash +$ curl -X POST http://127.0.0.1:8080/api/sessions/$SID/followup \ + -H 'Content-Type: application/json' \ + -H 'Idempotency-Key: 7f3a-...' \ + -d '{"messages":[{"content":"Ship it"}]}' +# => {"status":"queued_streaming","duplicate":false} +# A retry with the same key => {"status":"duplicate","duplicate":true} +``` + +The response `status` is `queued_streaming` (a turn is running or starting), +`queued_idle` (delivered to an idle headless session, runs on the next turn), +or `duplicate`. + +> [!NOTE] +> **See also** +> +> For interactive use, see the [Terminal UI](../tui/index.md). For agent-to-agent communication, see [A2A Protocol](../a2a/index.md) and [ACP](../acp/index.md). For MCP integration, see [MCP Mode](../mcp-mode/index.md). For an OpenAI-compatible chat-completions API, see the [Chat Server](../chat-server/index.md). diff --git a/_vendor/github.com/docker/docker-agent/docs/features/chat-server/index.md b/_vendor/github.com/docker/docker-agent/docs/features/chat-server/index.md new file mode 100644 index 0000000000..f88377550a --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/features/chat-server/index.md @@ -0,0 +1,231 @@ +--- +title: "Chat Server" +description: "Expose your agents through an OpenAI-compatible Chat Completions API so any tool that already speaks OpenAI can drive a docker-agent agent." +keywords: docker agent, ai agents, features, chat server +weight: 90 +--- + +_Expose your agents through an OpenAI-compatible Chat Completions API so any tool that already speaks OpenAI can drive a docker-agent agent._ + +## Overview + +The `docker agent serve chat` command starts an HTTP server that exposes one or +more agents through an **OpenAI-compatible Chat Completions API** at +`/v1/chat/completions` and `/v1/models`. Any client that already speaks the +OpenAI protocol — for example +[Open WebUI](https://github.com/open-webui/open-webui), `curl`, the OpenAI +Python SDK, or LangChain — can drive a docker-agent agent without any custom +integration. + +```bash +# Single agent — exposed as the model `root` +$ docker agent serve chat agent.yaml + +# Multi-agent config — every agent in the team becomes a model +$ docker agent serve chat ./team.yaml + +# Pick a specific agent from a multi-agent config +$ docker agent serve chat ./team.yaml --agent reviewer + +# Run an agent straight from the registry +$ docker agent serve chat agentcatalog/pirate --listen 127.0.0.1:9090 + +# Require a Bearer token, sourced from an env var +$ docker agent serve chat agent.yaml --api-key-env CHAT_BEARER_TOKEN +``` + +> [!TIP] +> **When to use chat server vs. API server** +> +> Use the **chat server** when you want to plug docker-agent into existing OpenAI-compatible tooling (chat UIs, IDE integrations, OpenAI SDK clients). Use the [API server](../api-server/index.md) when you want full control over sessions, agent execution, tool-call confirmations, and streamed runtime events. + +## Endpoints + +The OpenAI-compatible endpoints live under the `/v1` prefix to match the +OpenAI API surface. The OpenAPI specification is served at the top level so it +can be discovered without authentication. + +| Method | Path | Description | +| ------ | ---------------------- | ---------------------------------------------------------------------- | +| `GET` | `/v1/models` | List the agents that this server exposes as models | +| `POST` | `/v1/chat/completions` | Send messages and receive a completion (regular or streaming) | +| `GET` | `/openapi.json` | OpenAPI specification for the chat server | + +The model identifier in `POST /v1/chat/completions` is the **agent name**. +For a single-agent config that's typically `root`; for a multi-agent config, +each named agent becomes its own selectable model. + +## Quick Start + +```bash +# 1. Start the server +$ docker agent serve chat agent.yaml +Listening on 127.0.0.1:8083 +OpenAI-compatible chat completions endpoint: http://127.0.0.1:8083/v1/chat/completions + +# 2. List exposed agents (models) +$ curl http://127.0.0.1:8083/v1/models +{"object":"list","data":[{"id":"root","object":"model","owned_by":"docker-agent"}]} + +# 3. Send a chat request +$ curl http://127.0.0.1:8083/v1/chat/completions \ + -H 'Content-Type: application/json' \ + -d '{ + "model": "root", + "messages": [{"role": "user", "content": "Hello!"}] + }' +``` + +### Streaming + +Set `"stream": true` in the request body to receive a Server-Sent Events +(SSE) stream of OpenAI-format `chat.completion.chunk` deltas: + +```bash +$ curl -N http://127.0.0.1:8083/v1/chat/completions \ + -H 'Content-Type: application/json' \ + -d '{ + "model": "root", + "stream": true, + "messages": [{"role": "user", "content": "Stream a poem"}] + }' +``` + +### Drive it from the OpenAI Python SDK + +Because the wire format is OpenAI-compatible, point any OpenAI client at the +chat server's `base_url` and use the agent name as the model: + +```python +from openai import OpenAI + +client = OpenAI( + base_url="http://127.0.0.1:8083/v1", + api_key="not-needed-when-no-api-key-flag", # required by the SDK, ignored if no auth +) + +resp = client.chat.completions.create( + model="root", + messages=[{"role": "user", "content": "Hello!"}], +) +print(resp.choices[0].message.content) +``` + +## Server-side Conversation Caching + +By default the server is **stateless**: every request must contain the full +message history, exactly like OpenAI's API. Enable server-side caching by +setting `--conversations-max` to a positive value, then send a stable +`X-Conversation-Id` header on each request: + +```bash +$ docker agent serve chat agent.yaml --conversations-max 100 --conversation-ttl 30m +``` + +```bash +$ curl http://127.0.0.1:8083/v1/chat/completions \ + -H 'Content-Type: application/json' \ + -H 'X-Conversation-Id: my-thread-1' \ + -d '{ + "model": "root", + "messages": [{"role": "user", "content": "Remember my name is Alice"}] + }' + +$ curl http://127.0.0.1:8083/v1/chat/completions \ + -H 'Content-Type: application/json' \ + -H 'X-Conversation-Id: my-thread-1' \ + -d '{ + "model": "root", + "messages": [{"role": "user", "content": "What is my name?"}] + }' +``` + +Cached conversations are evicted after `--conversation-ttl` of inactivity, or +when the cache hits `--conversations-max` items (oldest entries are evicted +first). + +### Failure-safe caching + +When a request fails — for example because the model returns an error or the `--request-timeout` expires — the conversation cache is **not updated**. The server clones the cached session before processing each request and only commits the updated session when the turn completes successfully. This means: + +- A failed turn leaves the conversation in the same state it was before the request. +- Clients can safely retry with the same `X-Conversation-Id` after a failure. +- Transient errors do not corrupt the conversation history. + +## Authentication + +The chat server has **no authentication by default**. To require a Bearer +token, pass `--api-key` (literal value) or `--api-key-env` (name of an +environment variable that holds the value): + +```bash +$ docker agent serve chat agent.yaml --api-key-env CHAT_BEARER_TOKEN +``` + +Clients must then send an `Authorization: Bearer ` header on every +request to `/v1/*`. Both `/v1/models` and `/v1/chat/completions` are +protected once a key is set. + +> [!WARNING] +> **Public exposure** +> +> The default listen address is `127.0.0.1:8083`. If you bind to a non-loopback address, always set `--api-key` or `--api-key-env` — there is no other authentication layer. + +## CORS + +CORS is **disabled by default**. To allow a browser-based client to call the +server, set `--cors-origin` to the exact origin (scheme + host + port) that +should be allowed: + +```bash +$ docker agent serve chat agent.yaml --cors-origin https://my-ui.example.com +``` + +## CLI Flags + +```bash +docker agent serve chat | [flags] +``` + +| Flag | Default | Description | +| ----------------------------- | ------------------ | ----------------------------------------------------------------------------------------------------------------- | +| `-a, --agent ` | (all agents) | Name of the agent to expose. If omitted, every agent in the config is exposed as a separate model. | +| `-l, --listen ` | `127.0.0.1:8083` | Address to listen on. | +| `--cors-origin ` | (none) | Allowed CORS origin (e.g. `https://example.com`). Empty disables CORS. | +| `--api-key ` | (none) | Required Bearer token clients must present (`Authorization: Bearer `). Empty disables auth. | +| `--api-key-env ` | (none) | Read the API key from this environment variable instead of the command line. | +| `--max-request-size ` | `1048576` (1 MiB) | Maximum request body size. | +| `--request-timeout ` | `5m` | Per-request timeout (covers model + tool calls + streaming). | +| `--conversations-max ` | `0` | Cache up to N conversations server-side, keyed by `X-Conversation-Id`. `0` disables — clients must resend history. | +| `--conversation-ttl ` | `30m` | Idle TTL after which a cached conversation is evicted. | +| `--max-idle-runtimes ` | `4` | Maximum number of idle runtimes pooled per agent. `0` disables pooling. | + +All [runtime configuration flags](../cli/index.md#runtime-configuration-flags) +(`--working-dir`, `--env-from-file`, `--models-gateway`, `--hook-*`, …) are +also accepted. + +## Open WebUI Integration + +Open WebUI can talk to any OpenAI-compatible endpoint. To plug docker-agent +in: + +1. Start the chat server, optionally with auth: + + ```bash + $ docker agent serve chat agent.yaml \ + --listen 127.0.0.1:8083 \ + --cors-origin http://localhost:3000 \ + --api-key-env OPEN_WEBUI_TOKEN + ``` + +2. In Open WebUI, add an OpenAI-compatible connection: + + - **API Base URL:** `http://127.0.0.1:8083/v1` + - **API Key:** the value of `OPEN_WEBUI_TOKEN` + +3. Each agent in your config appears as a selectable model. + +> [!NOTE] +> **See also** +> +> For the docker-agent–native HTTP API (sessions, tool-call confirmation, runtime events), see the [API Server](../api-server/index.md). For full CLI flag documentation, see the [CLI Reference](../cli/index.md#docker-agent-serve-chat). diff --git a/_vendor/github.com/docker/docker-agent/docs/features/cli/index.md b/_vendor/github.com/docker/docker-agent/docs/features/cli/index.md new file mode 100644 index 0000000000..66e6954ed8 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/features/cli/index.md @@ -0,0 +1,570 @@ +--- +title: "CLI Reference" +description: "Complete reference for all docker-agent command-line commands and flags." +keywords: docker agent, ai agents, features, cli reference +weight: 30 +aliases: + - /ai/docker-agent/reference/cli/ +--- + +_Complete reference for all docker-agent command-line commands and flags._ + +> [!TIP] +> **No config needed** +> +> Running `docker agent run` without a config file uses a built-in default agent. Perfect for quick experimentation. + +## Commands + +### `docker agent run` + +Launch the interactive TUI with an agent configuration (`.yaml`, `.yml`, or `.hcl`). + +```bash +$ docker agent run [config] [message...] [flags] +``` + +| Flag | Description | +| --------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | +| `-a, --agent ` | Run a specific agent from the config | +| `--yolo` | Auto-approve all tool calls | +| `--model ` | Override model(s). Use `provider/model` for all agents, or `agent=provider/model` for specific agents. Comma-separate multiple overrides. | +| `--session ` | Resume a previous session. Supports relative refs (`-1` = last, `-2` = second to last). An explicit ID that does not exist yet is created with that ID, so a supervisor can own the session ID upfront and reuse it across runs. | +| `-s, --session-db ` | Path to the SQLite session database (default: `~/.cagent/session.db`) | +| `--session-read-only` | Open the TUI in read-only mode: conversation history is displayed but no new messages can be sent to the LLM. Cannot be used with `--exec`. | +| `--prompt-file ` | Include file contents as additional system context (repeatable) | +| `--attach ` | Attach an image file to the initial message | +| `--dry-run` | Initialize the agent without executing anything (useful for validating a config) | +| `--remote ` | Use a remote runtime at the given address instead of running the agent locally | +| `--listen ` | Expose this run's control plane over HTTP so an external process can drive the running TUI (send follow-ups, stream events, read the title). Accepts `host:port` or `unix://`, `npipe://`, `fd://`. See the [API Server](../api-server/index.md#listen). | +| `--lean` | Use a simplified, non-alternate-screen TUI. Unlike the default full-screen TUI, this renders inline in the normal terminal buffer — useful in environments where an alternate screen is unwanted (e.g. inside tmux panes, CI with a tty, or log-friendly pipelines). Displays an ASCII art banner on startup. | +| `--app-name ` | Override the application name label shown in the TUI (status bar, window title, "/exit" notifications). | +| `--sidebar` | Control sidebar visibility. Set to `--sidebar=false` to hide the sidebar and disable the Ctrl+B toggle (default: `true`). | +| `--disable-commands ` | Hide and disable specific slash commands in the TUI. Accepts a comma-separated list of command names (leading slash optional, case-insensitive). E.g. `--disable-commands="/cost,/eval,/model"`. | +| `--theme ` | Preselect a TUI theme by name (overrides the theme from user config; ignored outside the interactive TUI) | +| `--on-event =` | Run a shell command when an event of the given type fires (`*=` matches any event). Repeatable. | +| `--json` | Output results as newline-delimited JSON (use with `--exec`) | +| `--hide-tool-calls` | Hide tool calls in the output | +| `--hide-tool-results` | Hide tool call results in the output | +| `--sandbox` | Run the agent inside a Docker sandbox (see [Sandbox](../../configuration/sandbox/index.md)) | +| `--template ` | Template image for the sandbox (default: `docker/sandbox-templates:docker-agent`) | +| `--sbx` | Prefer the `sbx` CLI backend when available (default `true`; set `--sbx=false` to force `docker sandbox`) | +| `--no-kit` | Disable the [auto-kit](../../configuration/sandbox/index.md#auto-kit): do not stage skills or prompt files into the sandbox | +| `--agent-picker [refs]` | Show a full-screen interactive picker before launching, letting you browse and select an agent. Accepts an optional comma-separated list of agent references to show (defaults to `default,coder`). Arrow keys navigate; `?` toggles the YAML preview panel; Enter confirms. Not available in `--exec` or non-TTY modes. | +| `-w, --worktree [name]` | Run the agent in a fresh git worktree of the working directory, isolating its changes from your checkout. Optionally name it (`--worktree=my-feature`); otherwise a name is generated. Requires the working directory to be inside a git repository. Every tool (the shell included) runs inside the worktree. Combine with `--working-dir` to branch from another repository, and with `--session` to resume into the same worktree later. Cannot be combined with `--remote` or `--sandbox`. When the session ends, a clean worktree is removed automatically; one with work prompts to keep or remove (never in `--exec`). | +| `--worktree-base ` | Branch the `--worktree` from `` (a branch, tag, commit, or remote-tracking ref like `origin/main`) instead of the current `HEAD`. A remote-tracking ref is fetched first so the worktree starts from the latest remote state. Requires `--worktree`; cannot be combined with `--worktree-pr`, `--remote`, or `--sandbox`. | +| `--worktree-pr ` | Run the agent in a git worktree checked out on an existing GitHub pull request (PR number, `#123`, or PR URL). Continues the PR's branch so commits push back to it. Requires the [GitHub CLI](https://cli.github.com/) (`gh`). Cannot be combined with `--worktree`, `--remote`, or `--sandbox`. | +| `--working-dir ` | Set the working directory for the session (applies to tools and relative paths) | +| `--env-from-file ` | Load environment variables from file (repeatable) | +| `--code-mode-tools` | Provide a single tool to call other tools via JavaScript (forces code-mode tools globally) | +| `--models-gateway ` | Route model traffic through a gateway. Also reads `DOCKER_AGENT_MODELS_GATEWAY` (legacy `CAGENT_MODELS_GATEWAY`) env var. | +| `--hook-pre-tool-use ` | Add a pre-tool-use hook command (repeatable). See [Hooks](../../configuration/hooks/index.md). | +| `--hook-post-tool-use ` | Add a post-tool-use hook command (repeatable) | +| `--hook-session-start ` | Add a session-start hook command (repeatable) | +| `--hook-session-end ` | Add a session-end hook command (repeatable) | +| `--hook-on-user-input ` | Add an on-user-input hook command (repeatable) | +| `--hook-stop ` | Add a stop hook command, fired when the model finishes responding (repeatable) | +| `--fake ` | Replay AI responses from a cassette file (for testing). Mutually exclusive with `--record`. | +| `--fake-stream [ms]` | When replaying with `--fake`, simulate streaming with a delay between chunks (defaults to 15ms when given without a value). | +| `--record [path]` | Record AI API interactions to a cassette file (auto-generates filename if no path given) | +| `-d, --debug` | Enable debug logging | +| `--log-file ` | Custom debug log location | +| `-o, --otel` | Enable OpenTelemetry observability: traces, metrics, and logs. Requires `OTEL_EXPORTER_OTLP_ENDPOINT` to export to a collector. | + +```bash +# Examples +$ docker agent run agent.yaml +$ docker agent run agent.yaml "Fix the bug in auth.go" +$ docker agent run agent.yaml -a developer --yolo +$ docker agent run agent.yaml --model anthropic/claude-sonnet-4-5 +$ docker agent run agent.yaml --model "dev=openai/gpt-4o,reviewer=anthropic/claude-sonnet-4-5" +$ docker agent run agent.yaml --session -1 # resume last session +$ docker agent run agent.yaml --session -1 --session-read-only # review last session without sending messages +$ docker agent run agent.yaml --prompt-file ./context.md # include file as context + +# Add hooks from the command line +$ docker agent run agent.yaml --hook-session-start "./scripts/setup-env.sh" +$ docker agent run agent.yaml --hook-pre-tool-use "./scripts/validate.sh" --hook-post-tool-use "./scripts/log.sh" + +# Queue multiple messages (processed in sequence) +$ docker agent run agent.yaml "question 1" "question 2" "question 3" + +# Customize TUI display +$ docker agent run agent.yaml --app-name "My Project" +$ docker agent run agent.yaml --sidebar=false +$ docker agent run agent.yaml --disable-commands="/cost,/eval,/model" + +# Browse and pick an agent interactively +$ docker agent run --agent-picker +$ docker agent run --agent-picker=agentcatalog/coder,agentcatalog/researcher +``` + +> [!TIP] +> **Lean, inline TUI** +> +> Pass `--lean` to get a lightweight TUI that renders inline in your terminal (no alternate screen). It displays an ASCII art banner on startup and supports the same slash commands and streaming output as the full TUI, making it handy inside tmux, scripts, or any context where a full-screen takeover is unwanted. + +> [!TIP] +> **Isolate a run in a git worktree** +> +> When the working directory is inside a git repository, `--worktree` creates a fresh [git worktree](https://git-scm.com/docs/git-worktree) and points the session at it, so the agent's edits land on a separate branch and never touch your checkout. Every tool — the shell included — runs inside the worktree. The worktree is stored under `/worktrees/` on a branch named `worktree-`. + +```bash +# Run in an isolated worktree with a generated name (e.g. "focused_turing") +$ docker agent run agent.yaml --worktree +$ docker agent run agent.yaml -w "Refactor the auth package" + +# Give the worktree (and its branch) an explicit name +$ docker agent run agent.yaml --worktree=auth-refactor + +# Branch the worktree from another ref instead of the current HEAD. +# A remote-tracking ref is fetched first, so the worktree starts from the +# latest remote state. +$ docker agent run agent.yaml --worktree=auth-refactor --worktree-base origin/main + +# Resume a worktree run later: the session remembers its worktree, so you +# don't pass --worktree again (which would fail — the worktree already exists). +$ docker agent run agent.yaml --worktree=auth-refactor # first run, creates it +$ docker agent run agent.yaml --session -1 # resumes into the same worktree + +# Check out an existing GitHub pull request to continue it (requires gh) +$ docker agent run agent.yaml --worktree-pr 123 +$ docker agent run agent.yaml --worktree-pr https://github.com/owner/repo/pull/123 +``` + +With `--worktree-pr`, the PR's head branch is checked out tracking its remote (via the [GitHub CLI](https://cli.github.com/)), so commits made during the run push straight back to the pull request. The worktree is stored under `/worktrees/pr-`. + +When the interactive session ends, the worktree is cleaned up based on its state: + +- **Clean** (no uncommitted changes, untracked files, or new commits): the worktree and its branch are removed automatically. +- **Has work** (uncommitted changes, untracked files, or new commits): you're prompted to keep or remove it. Keeping preserves the directory and branch so you can return later; removing discards the worktree, its branch, and all that work. +- **Non-interactive runs** (`--exec`): the worktree is never cleaned up — it's left in place for inspection. + +A worktree is only ever removed if `--worktree` created it for this run; a pre-existing worktree is never touched. + +A kept worktree can be resumed: pass `--session` (a relative ref like `-1`, or the session id) and the run reattaches to the same worktree directory and branch automatically. Don't re-pass `--worktree` on resume — that would try to create a new worktree and fail because it already exists. + +### `docker agent run --exec` + +Run an agent in non-interactive (headless) mode. No TUI — output goes to stdout. + +```bash +$ docker agent run --exec [config] [message...] [flags] +``` + +```bash +# One-shot task +$ docker agent run --exec agent.yaml "Create a Dockerfile for a Python Flask app" + +# With auto-approve +$ docker agent run --exec agent.yaml --yolo "Set up CI/CD pipeline" + +# Multi-turn conversation +$ docker agent run --exec agent.yaml "question 1" "question 2" "question 3" +``` + +### `docker agent new` + +Interactively generate a new agent configuration file. + +```bash +$ docker agent new [flags] + +# Examples +$ docker agent new +$ docker agent new --model openai/gpt-5 +$ docker agent new --model dmr/ai/gemma3-qat:12B --max-iterations 15 +``` + +### `docker agent models` + +List models available for use with `--model`. By default only shows models for providers you have credentials for. Aliases: `docker agent models list`, `docker agent models ls`. + +```bash +$ docker agent models [flags] +``` + +| Flag | Default | Description | +| ---------------------- | ------- | ---------------------------------------------------------------------------------- | +| `-p, --provider ` | (none) | Filter models by provider name (e.g. `openai`, `anthropic`, `dmr`, `ollama`, …). | +| `--format ` | `table` | Output format: `table` or `json`. | +| `-a, --all` | `false` | Include models from all providers, not just those you have credentials for. | + +```bash +# Examples +$ docker agent models # only providers you can use +$ docker agent models --all # every provider the catalog knows about +$ docker agent models --provider openai +$ docker agent models --format json | jq +``` + +### `docker agent serve api` + +Start the HTTP API server for programmatic access. The argument can be a single agent file, a registry reference, or a directory — when given a directory, every `.yaml`/`.yml`/`.hcl` file in it is exposed as a separate entry under `/api/agents`. + +```bash +$ docker agent serve api || [flags] +``` + +| Flag | Default | Description | +| -------------------------- | ------------------ | ---------------------------------------------------------------------------------------------------------- | +| `-l, --listen ` | `127.0.0.1:8080` | Address to listen on. | +| `--auth-token ` | (none) | Bearer token required for all API requests. When set, every request must include `Authorization: Bearer `. Leave empty to disable authentication (safe when listening on loopback interfaces only). | +| `-s, --session-db ` | `session.db` | Path to the SQLite session database (relative paths resolve against the working directory). | +| `--pull-interval `| `0` | Periodically re-pull OCI/URL references and refresh the agent definition. `0` disables auto-pull. | +| `--fake ` | (none) | Replay AI responses from a cassette file (for testing). Mutually exclusive with `--record`. | +| `--record [path]` | (none) | Record AI API interactions to a cassette file. | +| `--mcp-oauth-redirect-uri ` | (none) | OAuth redirect URI for the unmanaged MCP OAuth flow in server mode. When set, the runtime drives PKCE and code exchange in-process and sends the full authorize URL to the client via elicitation. See [Remote MCP](../remote-mcp/index.md) for details. | + +> **Diagnostics:** Set `CAGENT_PPROF_ADDR=127.0.0.1:6060` (or `--pprof-addr`, a hidden flag) to start a live Go pprof server at `/debug/pprof/`. Use a loopback address; a non-loopback binding logs a security warning. + +All [runtime configuration flags](#runtime-configuration-flags) (`--working-dir`, `--env-from-file`, `--models-gateway`, `--hook-*`, …) are also accepted. + +```bash +# Examples +$ docker agent serve api agent.yaml +$ docker agent serve api agent.yaml --listen :8080 +$ docker agent serve api ./agents/ # directory of agent YAML/HCL configs +$ docker agent serve api ociReference --pull-interval 10 # auto-refresh +``` + +See [API Server](../api-server/index.md) for the full HTTP API reference. + +### `docker agent serve mcp` + +Expose agents as MCP tools for use in Claude Desktop, Claude Code, or other MCP clients. Defaults to stdio transport; use `--http` to start a streaming HTTP server instead. + +```bash +$ docker agent serve mcp [flags] +``` + +| Flag | Default | Description | +| ---------------------- | ------------------ | ------------------------------------------------------------------------------------------------- | +| `-a, --agent ` | (all agents) | Name of the agent to expose. If omitted, every agent in the config is exposed as a separate tool. | +| `--tool-name ` | (agent name) | Override the MCP tool identifier clients call; only valid when exposing a single agent. | +| `--http` | `false` | Use streaming HTTP transport instead of stdio. | +| `-l, --listen ` | `127.0.0.1:8081` | Address to listen on (only used with `--http`). | +| `--mcp-keepalive `| `0` (disabled) | Interval between MCP keep-alive pings (e.g. `30s`). | +| `--attach [target]` | (none) | Attach to a running TUI run by pid, address, or session id; given without a value, selects the most recent run. | + +All [runtime configuration flags](#runtime-configuration-flags) are also accepted. + +```bash +# Examples +$ docker agent serve mcp agent.yaml # stdio transport +$ docker agent serve mcp agent.yaml --http --listen 127.0.0.1:9090 # streaming HTTP +$ docker agent serve mcp agent.yaml --working-dir /path/to/project +$ docker agent serve mcp agentcatalog/coder +``` + +See [MCP Mode](../mcp-mode/index.md) for detailed setup. + +### `docker agent serve a2a` + +Start an A2A (Agent-to-Agent) protocol server. + +```bash +$ docker agent serve a2a [flags] +``` + +| Flag | Default | Description | +| ---------------------- | ------------------ | ------------------------------------------------------------------------------------------ | +| `-a, --agent ` | (team default) | Name of the agent to run. Defaults to the team's first agent if not specified. | +| `-l, --listen ` | `127.0.0.1:8082` | Address to listen on. | + +All [runtime configuration flags](#runtime-configuration-flags) are also accepted. + +```bash +# Examples +$ docker agent serve a2a agent.yaml +$ docker agent serve a2a agent.yaml --listen 127.0.0.1:9000 +$ docker agent serve a2a agentcatalog/pirate +``` + +### `docker agent serve acp` + +Start an ACP (Agent Client Protocol) server over stdio. This allows external clients to interact with your agents using the ACP protocol. + +```bash +$ docker agent serve acp [flags] +``` + +| Flag | Default | Description | +| ------------------------- | --------------------------- | ------------------------------------------------- | +| `-s, --session-db ` | `~/.cagent/session.db` | Path to the SQLite session database. | + +All [runtime configuration flags](#runtime-configuration-flags) are also accepted. + +```bash +# Examples +$ docker agent serve acp agent.yaml +$ docker agent serve acp ./team.yaml +$ docker agent serve acp agentcatalog/pirate +``` + +See [ACP](../acp/index.md) for details on the Agent Client Protocol. + +### `docker agent serve chat` + +Start an HTTP server that exposes one or more agents through an **OpenAI-compatible Chat Completions API** at `/v1/chat/completions` and `/v1/models`. This lets any tool that already speaks the OpenAI protocol — for example [Open WebUI](https://github.com/open-webui/open-webui), `curl`, the OpenAI Python SDK, or LangChain — drive a docker-agent agent without any custom integration. + +```bash +$ docker agent serve chat [flags] +``` + +| Flag | Default | Description | +| ----------------------------- | ------------------ | ----------------------------------------------------------------------------------------------------------------- | +| `-a, --agent ` | (all agents) | Name of the agent to expose. If omitted, every agent in the config is exposed as a separate model. | +| `-l, --listen ` | `127.0.0.1:8083` | Address to listen on. | +| `--cors-origin ` | (none) | Allowed CORS origin (e.g. `https://example.com`). Empty disables CORS. | +| `--api-key ` | (none) | Required Bearer token clients must present (`Authorization: Bearer `). Empty disables auth. | +| `--api-key-env ` | (none) | Read the API key from this environment variable instead of the command line. | +| `--max-request-size ` | `1048576` (1 MiB) | Maximum request body size. | +| `--request-timeout ` | `5m` | Per-request timeout (covers model + tool calls + streaming). | +| `--conversations-max ` | `0` | Cache up to N conversations server-side, keyed by `X-Conversation-Id`. `0` disables — clients must resend history. | +| `--conversation-ttl ` | `30m` | Idle TTL after which a cached conversation is evicted. | +| `--max-idle-runtimes ` | `4` | Maximum number of idle runtimes pooled per agent. `0` disables pooling. | + +```bash +# Examples +$ docker agent serve chat agent.yaml +$ docker agent serve chat ./team.yaml --agent reviewer +$ docker agent serve chat agentcatalog/pirate --listen 127.0.0.1:9090 +$ docker agent serve chat agent.yaml --api-key-env CHAT_BEARER_TOKEN + +# Drive it from any OpenAI-compatible client +$ curl http://127.0.0.1:8083/v1/chat/completions \ + -H 'Content-Type: application/json' \ + -d '{"model": "root", "messages": [{"role": "user", "content": "hello"}]}' +``` + +See [Chat Server](../chat-server/index.md) for the full feature reference. + +### `docker agent share push` / `docker agent share pull` + +Share agents via OCI registries. + +```bash +# Push an agent +$ docker agent share push ./agent.yaml docker.io/username/my-agent:latest + +# Pull an agent +$ docker agent share pull docker.io/username/my-agent:latest + +# Force pull, overwriting the local copy +$ docker agent share pull docker.io/username/my-agent:latest --force +``` + +| Flag | Applies to | Description | +| ---------- | ---------- | ---------------------------------------------------------- | +| `--force` | `pull` | Force pull even if the configuration already exists locally | + +See [Agent Distribution](../../concepts/distribution/index.md) for full registry workflow details. + +### `docker agent eval` + +Run agent evaluations against a directory of recorded sessions. + +```bash +$ docker agent eval | [|./evals] [flags] +``` + +| Flag | Default | Description | +| ------------------- | ------------------------------------ | -------------------------------------------------------------------------- | +| `-c, --concurrency` | num CPUs | Number of concurrent evaluation runs | +| `--judge-model` | `anthropic/claude-opus-4-5-20251101` | Model for LLM-as-a-judge relevance scoring (format: `provider/model`) | +| `--output

` | `/results` | Directory for results, logs, and session databases | +| `--only ` | (all) | Only run evals with file names matching these patterns (repeatable) | +| `--base-image` | (default) | Custom base Docker image for eval containers | +| `--keep-containers` | `false` | Keep containers after evaluation (don't remove with `--rm`) | +| `-e, --env` | (none) | Environment variables to pass to container (`KEY` or `KEY=VALUE`, repeatable) | +| `--repeat ` | `1` | Number of times to repeat each evaluation (useful for computing baselines) | + +All [runtime configuration flags](#runtime-configuration-flags) are also accepted. + +```bash +# Examples +$ docker agent eval agent.yaml # use ./evals +$ docker agent eval agent.yaml ./my-evals # custom directory +$ docker agent eval agent.yaml -c 8 # 8 concurrent evaluations +$ docker agent eval agent.yaml --keep-containers # keep containers for debugging +$ docker agent eval agent.yaml --only "auth*" # only run matching evals +$ docker agent eval agent.yaml --repeat 5 # repeat each eval 5 times +``` + +See [Evaluation](../evaluation/index.md) for details on creating eval sessions and interpreting results. + +### `docker agent version` + +Print the version and commit hash for your `docker-agent` install. + +```bash +$ docker agent version +docker agent version v1.54.0 +Commit: 1737035c +``` + +### `docker agent alias` + +Manage agent aliases for quick access. + +```bash +# List aliases +$ docker agent alias ls + +# List aliases as JSON +$ docker agent alias list --json + +# Add an alias +$ docker agent alias add pirate /path/to/pirate.yaml +$ docker agent alias add other ociReference + +# Add an alias with runtime options +$ docker agent alias add yolo-coder agentcatalog/coder --yolo +$ docker agent alias add fast-coder agentcatalog/coder --model openai/gpt-4o-mini +$ docker agent alias add safe-coder agentcatalog/coder --sandbox +$ docker agent alias add turbo agentcatalog/coder --yolo --model anthropic/claude-sonnet-4-5 + +# Use an alias +$ docker agent run pirate +$ docker agent run yolo-coder +``` + +**Alias Options:** Aliases can include runtime options that apply automatically when used: + +- `--yolo` — Auto-approve all tool calls when running the alias +- `--model ` — Override the model for the alias +- `--hide-tool-results` — Hide tool call results in the TUI when running the alias +- `--sandbox` — Always run the alias inside a [Docker sandbox](../../configuration/sandbox/index.md) + +When listing aliases, options are shown in brackets: + +```bash +$ docker agent alias ls +Registered aliases (3): + + fast-coder → agentcatalog/coder [model=openai/gpt-4o-mini] + turbo → agentcatalog/coder [yolo, model=anthropic/claude-sonnet-4-5] + yolo-coder → agentcatalog/coder [yolo] + +Run an alias with: docker agent run +``` + +Pass `--json` to output aliases as a JSON array instead of the formatted table. Each entry includes the alias `name` and its options: + +```bash +$ docker agent alias list --json +[ + { + "name": "fast-coder", + "path": "agentcatalog/coder", + "model": "openai/gpt-4o-mini" + }, + { + "name": "turbo", + "path": "agentcatalog/coder", + "yolo": true, + "model": "anthropic/claude-sonnet-4-5" + }, + { + "name": "yolo-coder", + "path": "agentcatalog/coder", + "yolo": true + } +] +``` + +JSON output is sorted by name and omits false/zero-valued fields. This is useful for scripting and automation. + +> [!TIP] +> **Override alias options** +> +> Command-line flags override alias options. For example, `docker agent run yolo-coder --yolo=false` disables yolo mode even though the alias has it enabled. + +> [!TIP] +> **Set a default agent** +> +> Create a `default` alias to customize what `docker agent` starts with no arguments: +> +> ```console +> $ docker agent alias add default /my/default/agent.yaml +> ``` +> +> Then simply run `docker agent` — it will launch that agent automatically. + +### `docker agent sandbox` + +Manage settings shared by every [`--sandbox`](../../configuration/sandbox/index.md) run — today, the persistent network allowlist that turns a `Blocked by network policy` 403 into a one-line, durable fix: + +```bash +# Allow a host on every subsequent --sandbox run. +$ docker agent sandbox allow api.example.com + +# Or several at once. +$ docker agent sandbox allow api.example.com registry.npmjs.org:443 + +# See what's persisted in ~/.config/cagent/config.yaml. +$ docker agent sandbox list + +# Drop a host you no longer need. +$ docker agent sandbox deny api.example.com +``` + +Entries are unioned with the gateway, the kit-resolved tool install hosts, and any `runtime.network_allowlist` declared by the agent. The launch summary lists every source separately so you can see which holes were punched by which layer. + +## Global Flags + +These flags are available on every `docker agent` command: + +| Flag | Description | +| ------------------------- | -------------------------------------------------------------------------------------- | +| `-d, --debug` | Enable debug logging (default location: `~/.cagent/cagent.debug.log`) | +| `--log-file ` | Custom debug log location (only used with `--debug`) | +| `-o, --otel` | Enable OpenTelemetry observability: traces, metrics, and logs. Requires `OTEL_EXPORTER_OTLP_ENDPOINT` to export to a collector. | +| `--cache-dir ` | Override the cache directory (default: `~/Library/Caches/cagent` on macOS) | +| `--config-dir ` | Override the config directory (default: `~/.config/cagent`) | +| `--data-dir ` | Override the data directory (default: `~/.cagent`) | +| `--help` | Show help for any command | + +### OpenTelemetry environment variables + +When `--otel` is enabled, the standard [OTel SDK env vars](https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/) are honored (`OTEL_EXPORTER_OTLP_ENDPOINT`, `OTEL_RESOURCE_ATTRIBUTES`, etc.). Two additional docker-agent-specific variables control GenAI instrumentation: + +| Variable | Default | Description | +| -------- | ------- | ----------- | +| `OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT` | `false` | Set to `true` to capture prompt text, model responses, tool arguments, and tool results as span attributes. Off by default because these fields may contain PII. | +| `OTEL_SEMCONV_STABILITY_OPT_IN` | (dual-emit) | Set to `gen_ai_latest_experimental` to emit only the spec-defined `gen_ai.*` keys from the [GenAI semantic conventions](https://opentelemetry.io/docs/specs/semconv/gen-ai/). The default dual-emit mode emits both `gen_ai.*` and legacy keys so existing dashboards continue working. | + +## Runtime Configuration Flags + +These flags are accepted by every command that loads an agent (`run`, `run --exec`, `new`, `eval`, `serve api`, `serve mcp`, `serve a2a`, `serve acp`, `serve chat`). They are listed once here to avoid repetition in the per-command tables above. + +| Flag | Description | +| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | +| `--working-dir ` | Set the working directory for the session (applies to tools and relative paths). | +| `--env-from-file ` | Load environment variables from file (repeatable). | +| `--code-mode-tools` | Provide a single tool to call other tools via JavaScript (forces code-mode tools globally). | +| `--models-gateway ` | Route model traffic through a gateway. Reads `DOCKER_AGENT_MODELS_GATEWAY` (legacy `CAGENT_MODELS_GATEWAY`) env var. | +| `--hook-pre-tool-use ` | Add a pre-tool-use hook command (repeatable). See [Hooks](../../configuration/hooks/index.md). | +| `--hook-post-tool-use ` | Add a post-tool-use hook command (repeatable). | +| `--hook-session-start ` | Add a session-start hook command (repeatable). | +| `--hook-session-end ` | Add a session-end hook command (repeatable). | +| `--hook-on-user-input ` | Add an on-user-input hook command (repeatable). | +| `--hook-stop ` | Add a stop hook command, fired when the model finishes responding (repeatable). | + +## Agent References + +Commands that accept a config support multiple reference types: + +| Type | Example | +| ------------- | ------------------------------------------- | +| Local file | `./agent.yaml` | +| OCI registry | `docker.io/username/agent:latest` | +| Agent catalog | `agentcatalog/pirate` | +| Alias | `pirate` (after `docker agent alias add`) | +| Default | (no argument) — uses built-in default agent | + +> [!NOTE] +> **Debugging** +> +> Having issues? See [Troubleshooting](../../community/troubleshooting/index.md) for debug mode, log analysis, and common solutions. diff --git a/_vendor/github.com/docker/docker-agent/docs/features/evaluation/index.md b/_vendor/github.com/docker/docker-agent/docs/features/evaluation/index.md new file mode 100644 index 0000000000..3cd6421725 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/features/evaluation/index.md @@ -0,0 +1,238 @@ +--- +title: "Evaluation" +description: "Measure agent quality with automated evaluations — tool call accuracy, response relevance, output size, and more." +keywords: docker agent, ai agents, features, evaluation +weight: 100 +aliases: + - /ai/docker-agent/evals/ +--- + +_Measure agent quality with automated evaluations — tool call accuracy, response relevance, output size, and more._ + +## Overview + +The `docker agent eval` command runs your agent against a set of recorded sessions and scores the results. Each eval session captures a user question, the expected tool calls, and criteria the response must satisfy. docker-agent replays the question, compares the agent's behavior to expectations, and produces a report. + +> [!NOTE] +> **Docker required** +> +> Evaluations run inside Docker containers for isolation. Each eval gets a clean environment with optional setup scripts. Docker Desktop (or Docker Engine) must be running. + +## Quick Start + +```bash +# Run evaluations for an agent +$ docker agent eval agent.yaml + +# Specify a custom evals directory +$ docker agent eval agent.yaml ./my-evals + +# Run with 8 concurrent evaluations +$ docker agent eval agent.yaml -c 8 + +# Only run evals matching a pattern +$ docker agent eval agent.yaml --only "auth*" + +# Repeat each eval 5 times to compute a baseline +$ docker agent eval agent.yaml --repeat 5 + +# Repeat a specific eval 5 times +$ docker agent eval agent.yaml --only "auth*" --repeat 5 +``` + +## Eval Directory Structure + +By default, docker-agent looks for eval sessions in an `evals/` directory next to your agent config: + +```bash +my-agent/ +├── agent.yaml +└── evals/ + ├── 41b179a2-....json # Eval session 1 + ├── 5d83e247-....json # Eval session 2 + └── results/ # Output (auto-created) + ├── adjective-noun-1234.json + ├── adjective-noun-1234.log + ├── adjective-noun-1234.db + └── adjective-noun-1234-sessions.json +``` + +## Eval Session Format + +Each eval file is a JSON session that captures a complete conversation. The key fields for evaluation are the user message, the expected tool calls (recorded from a real session), and optional eval criteria: + +```json +{ + "id": "41b179a2-ed19-4ae2-a45d-95775aaa90f7", + "title": "Counting Files in Local Folder", + "messages": [ + { + "message": { + "agentFilename": "./agent.yaml", + "message": { + "role": "user", + "content": "How many files in the local folder?" + } + } + }, + { + "message": { + "agentName": "root", + "message": { + "role": "assistant", + "tool_calls": [ + { + "id": "call_abc123", + "type": "function", + "function": { + "name": "list_directory", + "arguments": "{\"path\":\"./\"}" + } + } + ] + } + } + }, + { + "message": { + "agentName": "root", + "message": { + "role": "assistant", + "content": "There are 2 files in the local folder..." + } + } + } + ], + "evals": { + "relevance": [ + "The response mentions exactly 2 files", + "The response lists README.md and agent.yaml" + ], + "size": "S", + "working_dir": "my-project", + "setup": "echo 'hello' > test.txt" + } +} +``` + +## Eval Criteria + +The `evals` object inside each session controls what gets scored: + +| Field | Type | Description | +| ------------- | -------- | ----------------------------------------------------------------------------------------- | +| `relevance` | string[] | Statements that must be true about the agent's response. Scored by an LLM judge. | +| `size` | string | Expected response size: `S`, `M`, `L`, or `XL`. Compared against actual output length. | +| `working_dir` | string | Subdirectory under `evals/working_dirs/` to mount as the container's working directory. | +| `setup` | string | Shell script to run in the container before the agent executes (e.g., create test files). | + +## Scoring Metrics + +docker-agent evaluates agents across three dimensions: + +| Metric | How It's Measured | +| ------------------- | ------------------------------------------------------------------------------------------------------------------------- | +| **Tool Calls (F1)** | F1 score between the expected tool call sequence (from the recorded session) and the actual tool calls made by the agent. | +| **Relevance** | An LLM judge (configurable via `--judge-model`) evaluates whether each relevance statement is satisfied by the response. | +| **Size** | Whether the response length matches the expected size category (S/M/L/XL). | + +## Creating Eval Sessions + +The easiest way to create eval sessions is from real conversations: + +1. Run your agent interactively: `docker agent run agent.yaml` +2. Have a conversation that tests the behavior you care about +3. Use the `/eval` slash command in the TUI to save the session as an eval file +4. Edit the generated JSON to add `evals` criteria (relevance, size, etc.) + +> [!TIP] +> Start with tool call scoring (automatic from recorded sessions), then add relevance criteria for the responses you care most about. + +## CLI Flags + +```bash +$ docker agent eval | [|./evals] +``` + +| Flag | Default | Description | +| ------------------- | --------------------------- | ----------------------------------------------------------------- | +| `-c, --concurrency` | num CPUs | Number of concurrent evaluation runs | +| `--judge-model` | `anthropic/claude-opus-4-5-20251101` | Model for LLM-as-a-judge relevance scoring | +| `--output` | `/results` | Directory for results, logs, and session databases | +| `--only` | (all) | Only run evals with file names matching these patterns | +| `--base-image` | (default) | Custom base Docker image for eval containers (see [Custom Base Images](#custom-base-images)) | +| `--keep-containers` | `false` | Keep containers after evaluation (don't remove with `--rm`) | +| `-e, --env` | (none) | Environment variables to pass to container (`KEY` or `KEY=VALUE`) | +| `--repeat` | `1` | Number of times to repeat each evaluation (useful for computing baselines) | + +### Custom Base Images + +When `--base-image` is set, the eval harness builds a derived image on top of your base image at evaluation time. Two things happen automatically: + +1. **The docker-agent binary is injected** — it is copied from `docker/docker-agent:edge` into the derived image at build time, so you don't need to include it in your base image. +2. **The entrypoint is overridden** — docker-agent replaces your base image's entrypoint with its own `/run.sh` wrapper. + +Your base image therefore only needs to provide the runtime environment: language runtimes, installed dependencies, test fixtures, the appropriate working directory, and so on. Any `ENTRYPOINT` or `CMD` defined in your base image is ignored. + +## Output + +After a run completes, docker-agent produces: + +- **Console summary** — Pass/fail status per eval with metric breakdowns +- **JSON results** — Full structured results for programmatic analysis +- **SQLite database** — Complete sessions for detailed investigation and debugging +- **Sessions JSON** — Exported session data for analysis +- **Log file** — Debug-level log of the entire evaluation run + +> [!TIP] +> **Debugging Failed Evals** +> +> Use `--keep-containers` to preserve containers after evaluation. You can then inspect them with `docker exec` to understand why an eval failed. The session database (`.db` file) contains the full conversation history for each eval. + +```bash +$ docker agent eval demo.yaml ./evals + + ✓ Counting Files in Local Folder + ✓ tool calls ✓ relevance 2/2 + ✓ Checking the Content of README.md File + ✓ tool calls ✓ relevance 1/1 + +✅ Tool Calls: 100.0% avg F1 (2 evals) +✅ Relevance: 3/3 passed (100.0%) + +Total Cost: $0.012345 +Total Time: 12s + +Sessions DB: ./evals/results/happy-panda-1234.db +Sessions JSON: ./evals/results/happy-panda-1234-sessions.json +Log: ./evals/results/happy-panda-1234.log +``` + +## Example + +Here's a minimal evaluation setup: + +```yaml +# agent.yaml +agents: + root: + model: openai/gpt-4o + description: Test agent + instruction: You know how to read/write and list files. + toolsets: + - type: filesystem +``` + +```bash +# Create evals from interactive sessions +$ docker agent run agent.yaml +# ... have conversations, then use /eval to save them + +# Run the evaluations +$ docker agent eval agent.yaml ./evals +``` + +> [!NOTE] +> **See also** +> +> Use `/eval` in the [TUI](../tui/index.md) to create eval sessions from conversations. See the [CLI Reference](../cli/index.md) for all `docker agent eval` flags. Example eval configs are in [examples/eval](https://github.com/docker/docker-agent/tree/main/examples/eval) on GitHub. diff --git a/_vendor/github.com/docker/docker-agent/docs/features/harnesses/index.md b/_vendor/github.com/docker/docker-agent/docs/features/harnesses/index.md new file mode 100644 index 0000000000..356be97ef2 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/features/harnesses/index.md @@ -0,0 +1,200 @@ +--- +title: "Coding Harnesses" +description: "Delegate coding tasks to external AI coding CLIs (Claude Code, Codex, opencode) as sub-agents." +keywords: docker agent, ai agents, features, coding harnesses +weight: 50 +--- + +_Delegate coding tasks to external AI coding CLIs (Claude Code, Codex, opencode) as sub-agents._ + +## Overview + +A **harness** agent delegates its work to an external coding CLI — `claude` (Claude Code), `codex` (OpenAI Codex), `opencode`, or `pi` — instead of calling a model API directly. The external CLI drives the coding loop while Docker Agent provides orchestration, hooks, permissions, and distribution. + +This pattern gives you the best of both worlds: + +- **External CLI strengths** — deep IDE integration, specialized coding workflows, CLI-native tool access +- **Docker Agent strengths** — multi-agent coordination, hook-based auditing and policy enforcement, permission controls, OCI distribution, and the full agent config schema + +> [!NOTE] +> **When to use harnesses** +> +> Use a harness when you want a Claude Code / Codex / opencode session to act as a sub-agent inside a larger Docker Agent workflow — for example, an orchestrator that plans work and delegates coding tasks to specialized harness agents. + +## Prerequisites + +The external CLI must be installed and available on `PATH` before starting Docker Agent: + +| Harness type | Required binary | Install | +| --- | --- | --- | +| `claude-code` | `claude` | [docs.anthropic.com/en/docs/claude-code](https://docs.anthropic.com/en/docs/claude-code) | +| `codex` | `codex` | [github.com/openai/codex](https://github.com/openai/codex) | +| `opencode` | `opencode` | [opencode.ai](https://opencode.ai) | +| `pi` | `pi` | Refer to the `pi` CLI documentation for installation instructions. | + +Docker Agent will report an error at session start if the required binary is not found. + +## Configuration + +Add a `harness:` block to any agent definition to make it harness-backed: + +```yaml +agents: + coder: + description: A Claude Code harness agent + harness: + type: claude-code +``` + +Harness agents do **not** need a `model:` field — the external CLI manages its own model selection. + +### Field Reference + +| Field | Applies to | Type | Description | +| --- | --- | --- | --- | +| `type` | all | string | **Required.** One of `claude-code`, `codex`, `opencode`, `pi` | +| `model` | all | string | Optional model override forwarded to the CLI | +| `effort` | `claude-code` | string | Reasoning effort: `low` \| `medium` \| `high` \| `max` — forwarded as `--effort` | +| `agent` | `opencode` | string | opencode agent profile name | +| `thinking` | `opencode` | boolean | Enable extended thinking — forwarded as `--thinking` | + +### Claude Code + +```yaml +agents: + coder: + description: Claude Code coding agent + harness: + type: claude-code + effort: high # low | medium | high | max +``` + +### Codex + +```yaml +agents: + coder: + description: Codex coding agent + harness: + type: codex + model: o4-mini # optional model override +``` + +### opencode + +```yaml +agents: + coder: + description: opencode coding agent + harness: + type: opencode + agent: my-profile # optional agent profile + thinking: true # enable extended thinking +``` + +## What Does NOT Work + +Harness agents bypass the Docker Agent model pipeline entirely. As a result: + +- **Docker Agent toolsets are inactive.** The external CLI provides its own tools — filesystem, shell, etc. Any `toolsets:` defined on a harness agent are silently ignored. +- **`model:` routing is unavailable.** The harness CLI manages model selection; Docker Agent's `models:` configuration and routing rules do not apply to harness agents. +- **Token usage tracking depends on the external CLI.** Docker Agent records usage when the CLI reports it (Claude Code and Codex both report usage data). If the CLI does not emit usage data, the session will show zero token usage. + +> [!WARNING] +> **No Docker Agent toolsets inside a harness** +> +> Do not configure `toolsets:` on a harness agent — they are silently ignored. If you need Docker Agent toolsets alongside external coding capabilities, use a standard sub-agent with `transfer_task` rather than a harness. + +## Hook Behavior + +Hooks work normally on harness agents, including `before_llm_call` and `after_llm_call`. `before_llm_call` runs before the prompt is forwarded to the external CLI and can block or rewrite the run; `after_llm_call` fires after the CLI returns its final response. + +The `model_id` field in hook payloads is set to the harness label (e.g. `claude-code`) rather than a canonical `provider/model` string. This applies to `before_llm_call`, `after_llm_call`, and any other event that carries `model_id`. + +See [Hooks](../../configuration/hooks/index.md) for the full hook reference. + +## Recipe: Orchestrator + Harness Sub-Agents (Sequential) + +An orchestrator plans the work and delegates to specialized harness agents one at a time. Each coding agent runs in its own sub-session and reports results back. + +```yaml +# examples/coding_harnesses.yaml + +models: + claude: + provider: anthropic + model: claude-sonnet-4-5 + +agents: + root: + model: claude + description: Orchestrator that plans and delegates coding tasks + instruction: | + You are a project orchestrator. Break down coding requests into + focused tasks and delegate each task to the most appropriate + coding agent. Collect results and synthesize a final summary. + sub_agents: + - claude-coder + - codex-coder + + claude-coder: + description: Claude Code specialist for complex refactors + harness: + type: claude-code + effort: high + + codex-coder: + description: Codex specialist for code generation + harness: + type: codex +``` + +The root agent calls `transfer_task` to send work to a harness sub-agent, waits for the result, and continues. See the [full example on GitHub](https://github.com/docker/docker-agent/blob/main/examples/coding_harnesses.yaml). + +## Recipe: Parallel Harness Dispatch + +Combine the `background_agents` toolset with harness sub-agents to dispatch multiple coding tasks simultaneously: + +```yaml +# examples/coding_harness_background_agents.yaml + +models: + claude: + provider: anthropic + model: claude-sonnet-4-5 + +agents: + root: + model: claude + description: Orchestrator that fans out coding tasks in parallel + instruction: | + Use background agents to run multiple coding tasks at once. + Dispatch all tasks, then collect results when each finishes. + sub_agents: + - claude-coder + - codex-coder + toolsets: + - type: background_agents + + claude-coder: + description: Frontend specialist (Claude Code) + harness: + type: claude-code + effort: medium + + codex-coder: + description: Backend specialist (Codex) + harness: + type: codex +``` + +The orchestrator calls `run_background_agent` for each task, monitors progress with `list_background_agents`, and collects results with `view_background_agent`. See the [full example on GitHub](https://github.com/docker/docker-agent/blob/main/examples/coding_harness_background_agents.yaml). + +For the general background agents reference, see [Background Agents](../../tools/background-agents/index.md). + +## See Also + +- [Multi-Agent Systems](../../concepts/multi-agent/index.md) — orchestration patterns +- [Background Agents](../../tools/background-agents/index.md) — parallel task dispatch +- [Hooks](../../configuration/hooks/index.md) — auditing and policy enforcement +- [Agent Configuration](../../configuration/agents/index.md) — full agent schema reference diff --git a/_vendor/github.com/docker/docker-agent/docs/features/mcp-mode/index.md b/_vendor/github.com/docker/docker-agent/docs/features/mcp-mode/index.md new file mode 100644 index 0000000000..1f9f312d7e --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/features/mcp-mode/index.md @@ -0,0 +1,126 @@ +--- +title: "MCP Mode" +description: "Expose your docker-agent agents as MCP tools for use in Claude Desktop, Claude Code, and other MCP-compatible applications." +keywords: docker agent, ai agents, features, mcp mode +weight: 40 +--- + +_Expose your docker-agent agents as MCP tools for use in Claude Desktop, Claude Code, and other MCP-compatible applications._ + +## Why MCP Mode? + +The `docker agent serve mcp` command makes your agents available to any application that supports the [Model Context Protocol](https://modelcontextprotocol.io/). This means you can: + +- Use custom agents directly within **Claude Desktop** or **Claude Code** +- Share specialized agents across different applications +- Build reusable agent teams consumable from any MCP client +- Integrate domain-specific agents into existing workflows + +> [!NOTE] +> **What is MCP?** +> +> The [Model Context Protocol](https://modelcontextprotocol.io/) is an open standard for connecting AI tools. See also [Remote MCP Servers](../remote-mcp/index.md) for connecting to cloud services. + +## Basic Usage + +```bash +# Expose a local config (stdio transport, the default) +$ docker agent serve mcp ./agent.yaml + +# Expose from a registry +$ docker agent serve mcp agentcatalog/pirate + +# Set the working directory +$ docker agent serve mcp ./agent.yaml --working-dir /path/to/project +``` + +## Transports + +By default, `serve mcp` uses the stdio transport — ideal for clients that spawn the server as a subprocess (Claude Desktop, Claude Code, Cursor, …). + +To expose the MCP server over streaming HTTP instead, pass `--http`: + +```bash +# Streaming HTTP transport on the default 127.0.0.1:8081 +$ docker agent serve mcp ./agent.yaml --http + +# Override the listen address / port +$ docker agent serve mcp ./agent.yaml --http --listen 0.0.0.0:9090 +``` + +| Flag | Default | Description | +| ---------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------ | +| `--http` | `false` | Use streaming HTTP transport instead of stdio. | +| `-l`, `--listen` | `127.0.0.1:8081` | Address to listen on when `--http` is enabled. | +| `-a`, `--agent` | all agents | Expose a single named agent instead of every agent in the config. | +| `--tool-name` | (none) | Override the MCP tool identifier clients call (defaults to agent name); only valid when exposing one agent. | +| `--mcp-keepalive` | `0` | Interval between MCP keep-alive pings (e.g. `30s`); `0` disables keep-alive. | + +Runtime configuration flags such as `--working-dir`, `--env-from-file`, `--models-gateway`, and hook flags are also available — see the [CLI reference](../cli/index.md). + +## Using with Claude Desktop + +Add a configuration to your Claude Desktop MCP settings file: + +- **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json` +- **Windows:** `%APPDATA%\Claude\claude_desktop_config.json` + +```json +{ + "mcpServers": { + "myagent": { + "command": "/usr/local/bin/docker", + "args": [ + "agent", + "serve", + "mcp", + "agentcatalog/coder", + "--working-dir", + "/home/user/projects" + ], + "env": { + "ANTHROPIC_API_KEY": "your_key_here", + "OPENAI_API_KEY": "your_key_here" + } + } + } +} +``` + +Restart Claude Desktop after updating the configuration. + +## Using with Claude Code + +```bash +$ claude mcp add --transport stdio myagent \ + --env OPENAI_API_KEY=$OPENAI_API_KEY \ + --env ANTHROPIC_API_KEY=$ANTHROPIC_API_KEY \ + -- docker agent serve mcp agentcatalog/pirate --working-dir $(pwd) +``` + +## Multi-Agent in MCP Mode + +When you expose a multi-agent configuration via MCP, each agent becomes a separate tool in the MCP client: + +```yaml +agents: + root: + model: anthropic/claude-sonnet-4-5 + description: Main coordinator + sub_agents: [designer, engineer] + designer: + model: openai/gpt-5-mini + description: UI/UX design specialist + engineer: + model: anthropic/claude-sonnet-4-5 + description: Software engineer +``` + +All three agents (`root`, `designer`, `engineer`) appear as separate tools in Claude Desktop or Claude Code. + +## Troubleshooting + +- **Agents not appearing:** Verify the `docker-agent` binary path and restart the MCP client +- **Permission errors:** Ensure `docker-agent` has execute permissions (`chmod +x`) +- **Missing API keys:** Pass all required keys in the `env` section +- **Working directory issues:** Verify the `--working-dir` path exists and is accessible diff --git a/_vendor/github.com/docker/docker-agent/docs/features/remote-mcp/index.md b/_vendor/github.com/docker/docker-agent/docs/features/remote-mcp/index.md new file mode 100644 index 0000000000..87d29c7b0f --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/features/remote-mcp/index.md @@ -0,0 +1,279 @@ +--- +title: "Remote MCP Servers" +description: "Connect docker-agent to cloud services via remote MCP servers with built-in OAuth authentication." +keywords: docker agent, ai agents, features, remote mcp servers +weight: 120 +--- + +_Connect docker-agent to cloud services via remote MCP servers with built-in OAuth authentication._ + +## Overview + +Docker Agent supports connecting to remote MCP servers over **Streamable HTTP** and **SSE** (Server-Sent Events) transports. Streamable HTTP is the current recommended transport for most hosted MCP servers. Many popular services offer MCP endpoints with OAuth — docker-agent handles the authentication flow automatically. + +```yaml +toolsets: + - type: mcp + remote: + url: "https://mcp.linear.app/mcp" + transport_type: "streamable" +``` + +> [!TIP] +> **OAuth flow** +> +> When you connect to a remote MCP server that requires OAuth, docker-agent opens your browser automatically for authentication. Tokens are cached for subsequent sessions. + +> [!TIP] +> **Cancelling the authorization dialog** +> +> If you dismiss the OAuth authorization dialog, the request is cancelled cleanly — no repeated prompts appear. The agent will report that authorization was declined. To try again, simply re-enable the server or repeat the request that triggered the flow. + +## Configuration + +```yaml +toolsets: + - type: mcp + remote: + url: "https://mcp.example.com/mcp" + transport_type: "streamable" # or "sse" for legacy servers + headers: + Authorization: "Bearer token" # optional: static auth + # Optional: use only for trusted internal/private MCP or OAuth endpoints. + allow_private_ips: true +``` + +For full configuration details, see the [Tool Config](../../configuration/tools/index.md) page. + +Set `allow_private_ips: true` on a remote MCP toolset only when the MCP server or its OAuth registration/token endpoints intentionally resolve to private, loopback, or link-local addresses. The default blocks those OAuth helper requests to reduce SSRF risk. + +> [!NOTE] +> **Headers forwarded during OAuth discovery** +> +> Configured `headers` are forwarded to OAuth protected-resource-metadata discovery requests directed at the MCP server's own host — not to third-party authorization servers. This allows services like Grafana Cloud that require a routing header (e.g. `X-Grafana-URL`) on the discovery request to scope the OAuth flow correctly. Headers are never sent to a different host than the one in `remote.url`. + +> [!NOTE] +> **Automatic reconnection after idle timeouts** +> +> Remote MCP connections (Streamable HTTP / SSE) automatically reconnect after the server closes an idle connection — no configuration needed. Services like Notion and Linear close idle connections periodically; docker-agent detects the clean close and reconnects with exponential backoff. To tune reconnect behaviour or disable reconnection entirely, use the [`lifecycle` block](../../configuration/tools/index.md#toolset-lifecycle). + +> [!NOTE] +> **Automatic recovery from revoked or rotated OAuth tokens** +> +> If a remote MCP server rejects the cached token with a `401 invalid_token` error (for example, because the token was revoked or rotated server-side), docker-agent handles the failure automatically: +> +> - **Silent refresh:** when a refresh token is available, docker-agent silently exchanges it for a new access token and replays the request — no user interaction required. +> - **Re-authentication prompt:** when the refresh token is absent or has also expired, the toolset transitions to a "needs re-auth" state and surfaces an OAuth prompt on your next message (exactly like the first-time flow). +> +> Either way, the agent never burns 5 reconnect attempts on an auth failure — it fails fast and either refreshes silently or defers to interactive re-auth. If you want to trigger re-auth immediately without waiting for the next message, run `/toolset-restart ` from the TUI. + +### OAuth for servers without Dynamic Client Registration + +Most remote MCP servers that require OAuth support [Dynamic Client Registration (RFC 7591)](https://datatracker.ietf.org/doc/html/rfc7591) — no configuration is needed, docker-agent handles the flow for you. + +For servers that do **not** support DCR, provide explicit OAuth credentials with the `oauth:` block: + +```yaml +toolsets: + - type: mcp + remote: + url: "https://mcp.example.com/mcp" + transport_type: "streamable" + oauth: + clientId: "my-app-client-id" + clientSecret: "my-app-client-secret" # optional (public clients may omit) + callbackPort: 8765 # optional; picks a free port otherwise + scopes: # optional; server-specific + - read + - write +``` + +| Field | Type | Required | Description | +| -------------- | --------------- | -------- | ------------------------------------------------------------------------------------------------ | +| `clientId` | string | ✓ | OAuth client ID registered with the remote MCP server. | +| `clientSecret` | string | ✗ | OAuth client secret. Omit for public clients using PKCE. | +| `callbackPort` | integer | ✗ | Local port to receive the OAuth redirect. If omitted, docker-agent picks a random free port. | +| `scopes` | array[string] | ✗ | Scopes to request during the authorization step. Values are server-specific. | +| `callbackRedirectURL` | string | ✗ | Custom OAuth redirect URI. Useful when the auth server requires HTTPS or a pre-registered URL. The literal placeholder `${callbackPort}` is replaced with the actual local callback port. See below. | + +Secrets should be stored in a credential helper or environment variable rather than committed — see [Secrets](../../guides/secrets/index.md) for interpolation patterns. + +### Custom redirect URI (`callbackRedirectURL`) + +Some authorization servers require the OAuth `redirect_uri` to be HTTPS or to match a URL that was pre-registered during app creation — neither of which plays nicely with a locally-bound loopback address such as `http://127.0.0.1:8765/callback`. + +To work around this, set `callbackRedirectURL` to a public URL that redirects back to the local callback server. The literal placeholder `${callbackPort}` is substituted with the actual port the local callback server is listening on (either `callbackPort` when set, or the randomly-assigned port otherwise). + +```yaml +toolsets: + - type: mcp + remote: + url: "https://mcp.example.com/mcp" + transport_type: "streamable" + oauth: + clientId: "my-app-client-id" + callbackPort: 8765 + # Advertise this URL to the authorization server. The external + # service at redirect.example.com is expected to 302-redirect the + # browser to http://127.0.0.1:8765/callback preserving the query + # string (code, state, …). + callbackRedirectURL: "https://redirect.example.com/cb?port=${callbackPort}" +``` + +The local callback server still listens on the loopback interface on `callbackPort`; only the `redirect_uri` advertised to the authorization server changes. + +**Validation rules:** + +- The URL must be absolute (scheme + host) once `${callbackPort}` has been substituted. +- Only `http` and `https` schemes are accepted. +- `http` is only allowed when the host is a loopback address (`127.0.0.1`, `::1`, `localhost`); any other host must use `https` to avoid exposing the authorization `code` on the wire (RFC 8252 §7.3). + +### Unmanaged OAuth flow (server mode) + +When running `docker-agent serve api` (no local browser, no callback server), the runtime delegates the OAuth dance to the connected client via an MCP elicitation. There are two sub-behaviors, selected by the `--mcp-oauth-redirect-uri` flag: + +- **`--mcp-oauth-redirect-uri=` set** (recommended for hosts like Docker Desktop): the runtime generates `state` + PKCE + (optional) Dynamic Client Registration in-process, builds the full authorize URL, and emits an elicitation whose `Meta` includes: + + | Key | Value | + | ---------------------------- | ---------------------------------------------------------------- | + | `docker-agent/type` | `"oauth_flow"` | + | `docker-agent/server_url` | The MCP server URL (for display / favicon) | + | `docker-agent/authorize_url` | The full URL the client should open in the user's browser | + | `docker-agent/state` | The `state` value the client must echo back when replying | + | `auth_server` | Issuer of the authorization server | + | `auth_server_metadata` | RFC 8414 authorization-server metadata document | + | `resource_metadata` | RFC 9728 protected-resource metadata document | + + The client opens the browser at the URL provided in the `docker-agent/authorize_url` meta field, receives the OAuth callback at whatever endpoint the configured `redirect_uri` resolves to (typically a host-controlled bouncer that 302s into a deeplink), and replies to the elicitation with `accept` and `Content = {"code": "...", "state": "..."}`. The runtime verifies the `state`, exchanges the `code` at the token endpoint (using the same `redirect_uri` for RFC 6749 §4.1.3 binding), stores the token, and replays the original MCP request with `Authorization: Bearer ...`. + +- **Flag not set** (client-driven): the runtime emits the elicitation meta below and expects the client to drive the OAuth flow itself (PKCE, DCR, token exchange) and reply with `Content = {"access_token": "...", "refresh_token": "...", ...}`: + + | Key | Value | + | ---------------------------- | ---------------------------------------------------------------- | + | `docker-agent/type` | `"oauth_flow"` | + | `docker-agent/server_url` | The MCP server URL (for display / favicon) | + | `auth_server` | Issuer of the authorization server | + | `auth_server_metadata` | RFC 8414 authorization-server metadata document | + | `resource_metadata` | RFC 9728 protected-resource metadata document | + +The client-driven `{access_token, ...}` reply shape is still accepted on the `--mcp-oauth-redirect-uri` path too: a client that prefers to do the exchange itself can ignore the `docker-agent/authorize_url`/`docker-agent/state` keys. + +A per-toolset `callbackRedirectURL` (in the YAML) overrides the runtime-wide `--mcp-oauth-redirect-uri` for that toolset. + +> [!WARNING] +> **Security note** +> +> The `POST /api/mcp-oauth/callback` route is open by default (no auth required) when `--auth-token` is unset. State values are 128-bit opaque tokens, so brute-force is infeasible, but a state value that leaks (e.g. via debug logs or a compromised host) could be exploited by an attacker to inject a code. Set `--auth-token` when `docker agent serve api` listens on a network-reachable interface. When set, `--auth-token` enforces Bearer-token authentication on all API routes including this callback endpoint. + +## Project Management & Collaboration + +| Service | URL | Transport | Description | +| ---------- | ---------------------------------- | --------- | ------------------------------------- | +| Asana | `https://mcp.asana.com/sse` | sse | Task and project management | +| Atlassian | `https://mcp.atlassian.com/v1/mcp/authv2` | streamable | Jira, Confluence integration | +| Linear | `https://mcp.linear.app/mcp` | streamable | Issue tracking and project management | +| Monday.com | `https://mcp.monday.com/sse` | sse | Work management platform | +| Intercom | `https://mcp.intercom.com/sse` | sse | Customer communication platform | + +## Development & Infrastructure + +| Service | URL | Transport | Description | +| ------------------------ | ---------------------------------------------- | ---------- | --------------------------------- | +| GitHub | `https://api.githubcopilot.com/mcp` | sse | Version control and collaboration | +| Buildkite | `https://mcp.buildkite.com/mcp` | streamable | CI/CD platform | +| Netlify | `https://netlify-mcp.netlify.app/mcp` | streamable | Web hosting and deployment | +| Vercel | `https://mcp.vercel.com/` | sse | Web deployment platform | +| Cloudflare Bindings | `https://bindings.mcp.cloudflare.com/sse` | sse | Edge computing resources | +| Cloudflare Observability | `https://observability.mcp.cloudflare.com/sse` | sse | Monitoring and analytics | +| Grafbase | `https://api.grafbase.com/mcp` | streamable | GraphQL backend platform | +| Neon | `https://mcp.neon.tech/sse` | sse | Serverless Postgres database | +| Prisma | `https://mcp.prisma.io/mcp` | streamable | Database ORM and toolkit | +| Sentry | `https://mcp.sentry.dev/sse` | sse | Error tracking and monitoring | + +## Content & Media + +| Service | URL | Transport | Description | +| ---------- | ------------------------------------------------- | ---------- | --------------------------------- | +| Canva | `https://mcp.canva.com/mcp` | streamable | Design and graphics platform | +| Miro | `https://mcp.miro.com/` | streamable | Collaborative whiteboard platform (Enterprise plan required; see [official docs](https://developers.miro.com/docs/miro-mcp)) | +| Cloudinary | `https://asset-management.mcp.cloudinary.com/sse` | sse | Media management and optimization | +| InVideo | `https://mcp.invideo.io/sse` | sse | Video creation platform | +| Webflow | `https://mcp.webflow.com/sse` | sse | Website builder and CMS | +| Wix | `https://mcp.wix.com/sse` | sse | Website builder platform | +| Notion | `https://mcp.notion.com/mcp` | streamable | Documentation and knowledge base | + +## Communication & Voice + +| Service | URL | Transport | Description | +| ----------- | ----------------------------------- | ---------- | --------------------------- | +| Fireflies | `https://api.fireflies.ai/mcp` | streamable | Meeting transcription | +| Listenetic | `https://mcp.listenetic.com/v1/mcp` | streamable | Audio intelligence platform | +| Carbonvoice | `https://mcp.carbonvoice.app` | sse | Voice communication tools | +| Telnyx | `https://api.telnyx.com/v2/mcp` | streamable | Communications platform | +| Dialer | `https://getdialer.app/sse` | sse | Phone communication tools | + +## Storage & File Management + +| Service | URL | Transport | Description | +| ------- | ----------------------------------- | --------- | ------------------------ | +| Box | `https://mcp.box.com` | sse | Cloud content management | +| Egnyte | `https://mcp-server.egnyte.com/sse` | sse | Enterprise file sharing | + +## Business & Finance + +| Service | URL | Transport | Description | +| ------------- | ----------------------------------------- | ---------- | -------------------------- | +| PayPal | `https://mcp.paypal.com/sse` | sse | Payment processing | +| Plaid | `https://api.dashboard.plaid.com/mcp/sse` | sse | Financial data integration | +| Square | `https://mcp.squareup.com/sse` | sse | Payment processing | +| Close | `https://mcp.close.com/mcp` | streamable | CRM platform | +| Dodo Payments | `https://mcp.dodopayments.com/sse` | sse | Payment processing | + +## Analytics & Data + +| Service | URL | Transport | Description | +| ----------- | --------------------------------------- | ---------- | ------------------------------ | +| ThoughtSpot | `https://agent.thoughtspot.app/mcp` | streamable | Analytics and BI platform | +| Meta Ads | `https://mcp.pipeboard.co/meta-ads-mcp` | streamable | Facebook advertising analytics | + +## Utilities & Tools + +| Service | URL | Transport | Description | +| ------------- | ---------------------------------- | ---------- | ------------------------------- | +| Apify | `https://mcp.apify.com` | sse | Web scraping and automation | +| SimpleScraper | `https://mcp.simplescraper.io/mcp` | streamable | Web scraping tool | +| GlobalPing | `https://mcp.globalping.dev/sse` | sse | Network diagnostics | +| Jam | `https://mcp.jam.dev/mcp` | streamable | Bug reporting and collaboration | + +## Example: Multi-Service Agent + +Combine multiple remote MCP servers in a single agent: + +```yaml +agents: + root: + model: anthropic/claude-sonnet-4-5 + instruction: | + You help manage projects and deployments. + toolsets: + - type: mcp + remote: + url: "https://mcp.linear.app/mcp" + transport_type: "streamable" + instruction: Use Linear for issue tracking. + - type: mcp + remote: + url: "https://api.githubcopilot.com/mcp" + transport_type: "sse" + instruction: Use GitHub for code and PRs. + - type: mcp + remote: + url: "https://mcp.vercel.com/" + transport_type: "sse" + instruction: Use Vercel for deployments. +``` + +> [!NOTE] +> **Growing list** +> +> This list is updated as more services add MCP support. If a service you use isn't listed, check their documentation — many providers are adding MCP endpoints regularly. diff --git a/_vendor/github.com/docker/docker-agent/docs/features/skills/index.md b/_vendor/github.com/docker/docker-agent/docs/features/skills/index.md new file mode 100644 index 0000000000..c76101ea7c --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/features/skills/index.md @@ -0,0 +1,375 @@ +--- +title: "Skills" +description: "Skills provide specialized instructions that agents can load on demand when a task matches a skill's description." +keywords: docker agent, ai agents, features, skills +weight: 110 +--- + +_Skills provide specialized instructions that agents can load on demand when a task matches a skill's description._ + +## How Skills Work + +1. docker-agent scans standard directories for `SKILL.md` files +2. Skill metadata (name, description) is injected into the agent's system prompt +3. When a user request matches a skill, the agent reads the full instructions +4. The agent follows the skill's detailed instructions to complete the task + +## Enabling Skills + +```yaml +agents: + root: + model: openai/gpt-4o + instruction: You are a helpful assistant. + skills: true + toolsets: + - type: filesystem # required for reading skill files +``` + +> [!TIP] +> Skills are perfect for encoding team-specific workflows (PR review, deployment, coding standards) that apply across projects. + +## Filtering Skills + +The `skills` field also accepts a list, letting you restrict the agent to a specific subset of skills instead of exposing every discovered one. List items are classified automatically: + +- `"local"` or any `http://` / `https://` URL → a **source** to load skills from +- any other string → the **name** of a skill to include + +When only names are given, local sources are used by default. + +```yaml +agents: + # Load every discovered local skill (same as `skills: true`). + full: + skills: true + + # Load local skills, but only expose "commit" and "poem". + scoped: + skills: + - commit + - poem + + # Combine an explicit source with a name filter. + remote_filtered: + skills: + - https://skills.example.com + - commit + + # Disable skills entirely. + none: + skills: false +``` + +A name that doesn't match any discovered skill is logged as a warning at startup but is otherwise ignored. + +## Inline Skills + +Instead of (or alongside) loading skills from files and URLs, you can define skills directly in the agent config. An inline skill is a mapping item in the `skills` list, freely mixed with the string items above: + +```yaml +agents: + root: + model: openai/gpt-4o + instruction: You are a helpful assistant. + skills: + - name: changelog + description: Write a concise changelog entry from a diff or description. + instructions: | + Produce a single changelog entry in Keep a Changelog style. + Pick the right category (Added, Changed, Fixed, Removed) and write + one imperative sentence summarising the user-visible change. + + # A fork-mode inline skill runs in an isolated sub-agent. + - name: triage + description: Triage a bug report in an isolated context. + context: fork + instructions: | + Restate the problem, list likely root causes most-probable-first, + and propose the smallest reproduction and next concrete action. + + # Inline skills mix freely with sources and name filters. + - local + toolsets: + - type: filesystem +``` + +Inline skills carry their body in the config itself, so they need no `SKILL.md` file and require no filesystem source. They are **always exposed** — the name filter only applies to file- and URL-based skills. Because inline skills travel inside the agent YAML, they also work in `--sandbox` mode without any kit staging, and they can be shared with the agent via `share push`. + +### Inline Skill Fields + +| Field | Required | Description | +| --------------- | -------- | -------------------------------------------------------------------------- | +| `name` | Yes | Skill identifier used by `read_skill` / `run_skill` and the `/` command | +| `description` | Yes | Short description shown to the agent for skill matching | +| `instructions` | Yes | The skill body (what a `SKILL.md` would contain below its frontmatter) | +| `context` | No | Set to `fork` to run the skill as an isolated sub-agent | +| `model` | No | Override the model used while running a fork-mode skill | +| `allowed_tools` | No | For a fork-mode skill, restricts the sub-session to the parent tools whose names match an entry (glob or exact). See [Scoping a fork skill's tools](#scoping-a-fork-skills-tools). | +| `toolsets` | No | For a fork-mode skill, names of top-level [`toolsets`](../../configuration/overview/index.md#reusable-toolsets-toolsets) to expose in the sub-session on top of the inherited tools. | + +> [!NOTE] +> **Inline vs. file-based skills** +> +> Inline skills support the subset of the SKILL.md format that fits in YAML. They cannot bundle supporting files (no `read_skill_file`) or use `` !`command` `` expansion. For skills that need bundled resources or executable helpers, use a `SKILL.md` directory instead. + +## SKILL.md Format + + +```yaml +--- +name: create-dockerfile +description: Create optimized Dockerfiles for applications +license: Apache-2.0 +metadata: + author: my-org + version: "1.0" +--- + +# Creating Dockerfiles + +When asked to create a Dockerfile: + +1. Analyze the application type and language +2. Use multi-stage builds for compiled languages +3. Minimize image size by using slim base images +4. Follow security best practices (non-root user, etc.) +``` + +### Frontmatter Fields + +| Field | Required | Description | +| ---------------- | -------- | --------------------------------------------------------------------------- | +| `name` | Yes | Unique skill identifier | +| `description` | Yes | Short description shown to the agent for skill matching | +| `context` | No | Set to `fork` to run the skill as an isolated sub-agent (see below) | +| `model` | No | Override the model used while running the skill as a sub-agent (fork only) | +| `allowed-tools` | No | For a fork-mode skill, restricts the sub-session to the parent tools whose names match an entry (YAML list or comma-separated string). See [Scoping a fork skill's tools](#scoping-a-fork-skills-tools). | +| `toolsets` | No | For a fork-mode skill, names of top-level [`toolsets`](../../configuration/overview/index.md#reusable-toolsets-toolsets) to expose in the sub-session (YAML list or comma-separated string). | +| `license` | No | License identifier (e.g. `Apache-2.0`) | +| `compatibility` | No | Free-text compatibility notes | +| `metadata` | No | Arbitrary key-value pairs (e.g. `author`, `version`) | + +## Running a Skill as a Sub-Agent + +By default, when an agent invokes a skill it reads the instructions inline into its own conversation. For complex, multi-step skills this can consume a large portion of the agent's context window and pollute the parent conversation with intermediate tool calls. + +Adding `context: fork` to the SKILL.md frontmatter tells the agent to run the skill in an **isolated sub-agent** instead: + + +```yaml +--- +name: bump-go-dependencies +description: Update Go module dependencies one by one +context: fork +--- + +# Bump Dependencies + +1. List outdated deps +2. Update each one, run tests, commit or revert +3. Produce a summary table +``` + +When the agent encounters a task that matches a `context: fork` skill, it uses the `run_skill` tool instead of `read_skill`. This: + +- **Spawns a child session** with the skill content as the system prompt and the caller's task as the user message +- **Isolates the context window** — the sub-agent has its own conversation history, so lengthy tool-call chains don't eat into the parent's token budget +- **Folds the result** — only the sub-agent's final answer is returned to the parent as the tool result +- **Inherits the parent's model and tools** — the sub-agent can use all tools available to the parent agent (scope this with `allowed_tools` / `toolsets`, see [Scoping a fork skill's tools](#scoping-a-fork-skills-tools)) + +> [!TIP] +> **When to use context: fork** +> +> Use `context: fork` for skills that involve many steps, heavy tool usage, or that should not clutter the main conversation — for example dependency bumping, large refactors, or code generation pipelines. + +### Overriding the model for a fork skill + +Fork skills can declare a `model` field in their frontmatter to use a +different model than the parent agent for the duration of the sub-session. +This is useful when a skill is best handled by a faster, cheaper, or more +specialised model — for example a powerful reasoning model for refactors, +or a fast model for routine bookkeeping work. The override only applies +while the skill is running; the parent agent keeps its own model. + +The `model` value accepts either a named model from the agent config or +an inline `provider/model` reference (and the same comma-separated alloy +syntax as the rest of the agent config): + + +```yaml +--- +name: bump-go-dependencies +description: Update Go module dependencies one by one +context: fork +model: openai/gpt-4o-mini +--- + +# Bump Dependencies + +1. ... +``` + +If the model reference cannot be resolved (unknown name, missing +credentials, runtime not configured for model switching, …) the skill +falls back to the agent's currently-active model (its configured +default, or any override the user previously set via the model picker) +and a warning is logged. + +When the skill completes, the agent's previous model is restored — but +only if no one else changed the model in the meantime. If the user +switches the model via the TUI model picker while the fork skill is +running, their choice is preserved (the deferred restore becomes a +no-op). + +### Scoping a fork skill's tools + +By default a fork skill inherits the parent agent's entire tool set. Two +optional fields let you scope what the sub-session can use. Both apply +**only to fork-mode skills** and work the same whether the skill is +inline or loaded from a `SKILL.md` file. + +`allowed_tools` (frontmatter: `allowed-tools`) is an **allow-list** over +the inherited tools: only tools whose names match an entry are kept, +everything else is hidden from the sub-session. Entries support glob +patterns (e.g. `read_*`) and otherwise match exactly. This is the +Claude-Code-compatible `allowed-tools` field, now enforced for fork +skills rather than merely recorded. + +`toolsets` references reusable [top-level toolsets](../../configuration/overview/index.md#reusable-toolsets-toolsets) +by name. The referenced toolsets are exposed in the sub-session **in +addition to** the inherited tools, and they bypass the `allowed_tools` +filter (the skill explicitly asked for them). + +```yaml +toolsets: + web: + type: fetch + +agents: + root: + model: openai/gpt-4o + instruction: You are a helpful assistant. + toolsets: + - type: filesystem + - type: shell + skills: + # Inherits the parent tools but is restricted to read-only filesystem + # access while it runs — shell and write tools are hidden. + - name: audit + description: Review the repository layout without modifying anything. + context: fork + allowed_tools: + - read_file + - list_directory + - directory_tree + instructions: Inspect the repository structure and summarise it. + + # Brings in the top-level `web` toolset on top of the parent's tools. + - name: research + description: Research a topic using web fetches in an isolated context. + context: fork + toolsets: + - web + instructions: Research the requested topic and summarise with links. +``` + +The equivalent in a `SKILL.md` file uses frontmatter lists: + + +```yaml +--- +name: research +description: Research a topic using web fetches +context: fork +allowed-tools: + - fetch +toolsets: + - web +--- +``` + +> [!NOTE] +> **Fork only** +> +> Both fields are rejected by config validation when set on a non-fork skill, and a `toolsets` entry that doesn't resolve to a top-level toolset is a load-time error. + +## Search Paths + +Skills are discovered from these locations (later overrides earlier): + +### Global + +| Path | Search Type | +| ------------------- | --------------------------------------- | +| `~/.codex/skills/` | Recursive (searches all subdirectories) | +| `~/.claude/skills/` | Flat (immediate children only) | +| `~/.agents/skills/` | Recursive (searches all subdirectories) | + +### Project (from git root to current directory) + +| Path | Search Type | +| ----------------- | ------------------------------------------ | +| `.claude/skills/` | Flat (cwd only) | +| `.agents/skills/` | Flat (each directory from git root to cwd) | + +## Invoking Skills + +Skills can be invoked in multiple ways: + +- **Automatic:** The agent detects when your request matches a skill's description and loads it automatically +- **Explicit:** Reference the skill name in your prompt: "Use the create-dockerfile skill to..." +- **Slash command:** Use `/{skill-name}` to invoke a skill directly + +```bash +# In the TUI, invoke skill directly: +/create-dockerfile + +# Or mention it in your message: +"Create a dockerfile for my Python app (use the create-dockerfile skill)" +``` + +## Precedence + +When multiple skills share the same name: + +1. Global skills load first +2. Project skills load next, from git root toward current directory +3. Skills closer to the current directory override those further away + +## Skills in Sandbox Mode + +When you run an agent with [`--sandbox`](../../configuration/sandbox/index.md), the sandbox VM has its own filesystem with no access to your host's skill directories. docker-agent handles this transparently via the [auto-kit](../../configuration/sandbox/index.md#auto-kit): every discovered local skill is staged into a per-agent kit on the host, run through best-effort secret redaction (see the [auto-kit](../../configuration/sandbox/index.md#secret-redaction) docs), and bind-mounted read-only into the sandbox so the agent sees the same skills inside the VM as on the host. No configuration is required — use `--no-kit` only if you explicitly want to run the sandbox without any host skills. + +## Creating a Skill + +```bash +# Create the skill directory +$ mkdir -p ~/.agents/skills/create-dockerfile + +# Write the SKILL.md file +$ cat > ~/.agents/skills/create-dockerfile/SKILL.md << 'EOF' +--- +name: create-dockerfile +description: Create optimized Dockerfiles for applications +--- + +# Creating Dockerfiles + +When asked to create a Dockerfile: + +1. Analyze the application type and language +2. Use multi-stage builds for compiled languages +3. Use slim base images to minimize size +4. Run as non-root user for security +EOF +``` + +The skill will automatically be available to any agent with skills enabled (`skills: true`, or a list that targets its name — see [Filtering Skills](#filtering-skills)). + +> [!NOTE] +> **See also** +> +> Skills are enabled in the [Agent Config](../../configuration/agents/index.md) with the `skills` property (boolean or list). For tool-based capabilities, see [Tools](../../concepts/tools/index.md). +> +> Example configs: [`examples/skills_inline.yaml`](https://github.com/docker/docker-agent/blob/main/examples/skills_inline.yaml) (inline skill definition), [`examples/skills_fork_toolsets.yaml`](https://github.com/docker/docker-agent/blob/main/examples/skills_fork_toolsets.yaml) (scoping a fork skill's tools), [`examples/skills_filter.yaml`](https://github.com/docker/docker-agent/blob/main/examples/skills_filter.yaml) (filtering which skills load). diff --git a/_vendor/github.com/docker/docker-agent/docs/features/snapshots/index.md b/_vendor/github.com/docker/docker-agent/docs/features/snapshots/index.md new file mode 100644 index 0000000000..1f152baca8 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/features/snapshots/index.md @@ -0,0 +1,111 @@ +--- +title: "Snapshots" +description: "Shadow-git snapshots capture your workspace at turn boundaries so you can review what an agent changed and undo it without touching your real git history." +keywords: docker agent, ai agents, features, snapshots +weight: 20 +--- + +_Shadow-git snapshots capture your workspace at turn boundaries so you can review what an agent changed and undo it without touching your real git history._ + +## Overview + +When snapshots are enabled, docker-agent records the state of your working +directory as the agent runs. Each checkpoint is stored in a **shadow git +repository** kept under the docker-agent data directory — completely separate +from your project's own `.git`. This lets you: + +- **Review** exactly which files an agent touched on a given turn. +- **Undo** the most recent change with `/undo`. +- **Reset** the workspace back to any earlier checkpoint — or all the way to + its pre-agent state. + +Snapshots only ever touch files on disk. They never write commits to your +repository, never move your `HEAD`, and never appear in `git log` or +`git status`. + +> [!NOTE] +> **Git repositories only** +> +> The snapshot machinery is a no-op outside a git worktree. It needs a git +> repository to scope which files belong to your project and to mirror the +> repository's ignore rules. + +## Enabling Snapshots + +The simplest way is to enable snapshots globally for every agent in your user +config: + +```yaml +# ~/.config/cagent/config.yaml +settings: + snapshot: true +``` + +Omit `snapshot` or set it to `false` to leave automatic snapshots off. + +You can also wire the [`snapshot` built-in hook](../../configuration/hooks/index.md#available-built-ins) +into a single agent instead of enabling it globally: + +```yaml +hooks: + turn_start: + - type: builtin + command: snapshot + turn_end: + - type: builtin + command: snapshot + session_end: + - type: builtin + command: snapshot +``` + +Manually configured snapshot hooks always run, even when `settings.snapshot` +is unset. See [`examples/snapshot_hooks.yaml`](https://github.com/docker/docker-agent/blob/main/examples/snapshot_hooks.yaml) +for a complete configuration. + +## Using Snapshots in the TUI + +When snapshots are enabled, the [TUI](../tui/index.md) +exposes two slash commands: + +- **`/undo`** restores files from the most recent snapshot (one step back). +- **`/snapshots`** opens a dialog listing every captured snapshot and the + number of files in each. Use ↑/↓ (or + j/k) to highlight an entry, then press r to + reset the workspace to that point. Pick `` to revert every snapshot + and bring the workspace back to its pre-agent state. Esc closes the + dialog without changing anything. + +Neither command removes messages from the session transcript — they only touch +files on disk. Both commands (and their command-palette entries) are hidden +when snapshots are turned off. + +## How It Works + +- **Shadow repository.** The first time a snapshot is taken for a worktree, + docker-agent initializes a separate shadow git directory under the data + directory (`~/.cagent/snapshot/...` by default), keyed by a hash of the + worktree path. The shadow repo stores tree objects only — it never writes + commits and never touches your source repository's `.git`. +- **Ignore rules are mirrored.** Before each capture, the source repository's + `.gitignore` and `info/exclude` rules are mirrored into the shadow repo so + ignored files never appear in snapshots. +- **Large files are skipped.** Newly-added files larger than 2 MiB are excluded + from snapshots to keep the shadow repo small. +- **Checkpoints only on change.** A checkpoint is recorded only when files + actually changed, so a final no-op model response does not hide the last + meaningful snapshot. +- **Scoped to the working directory.** Snapshot operations are scoped to the + agent's working directory within the worktree, so a sub-directory agent only + captures and restores files under that directory. +- **Garbage collection.** Wiring `snapshot` into `session_end` (or enabling it + globally) runs `git gc` against the shadow repo so old, unreferenced objects + are pruned over time. + +## See Also + +- [Hooks](../../configuration/hooks/index.md) — the `snapshot` + built-in and the events it can run on. +- [Terminal UI](../tui/index.md) — the `/undo` and + `/snapshots` commands. +- [`examples/snapshot_hooks.yaml`](https://github.com/docker/docker-agent/blob/main/examples/snapshot_hooks.yaml) — a complete snapshot hook configuration. diff --git a/_vendor/github.com/docker/docker-agent/docs/features/tui/index.md b/_vendor/github.com/docker/docker-agent/docs/features/tui/index.md new file mode 100644 index 0000000000..922b110595 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/features/tui/index.md @@ -0,0 +1,416 @@ +--- +title: "Terminal UI (TUI)" +description: "docker-agent's default interface is a rich, interactive terminal UI with file attachments, themes, session management, and more." +keywords: docker agent, ai agents, features, terminal ui (tui) +linkTitle: "Terminal UI" +weight: 10 +--- + +_docker-agent's default interface is a rich, interactive terminal UI with file attachments, themes, session management, and more._ + +![docker-agent TUI in action showing an interactive agent session](../../demo.gif) + +## Launching the TUI + +```bash +# Launch with a config +$ docker agent run agent.yaml + +# Start with an initial message +$ docker agent run agent.yaml "Help me refactor this code" + +# Auto-approve all tool calls +$ docker agent run agent.yaml --yolo + +# Enable debug logging +$ docker agent run agent.yaml --debug + +# Override the application name shown in the status bar and window title +$ docker agent run agent.yaml --app-name "My Project" + +# Preselect a color theme +$ docker agent run agent.yaml --theme dracula + +# Hide the sidebar (cannot be re-enabled via Ctrl+B) +$ docker agent run agent.yaml --sidebar=false + +# Disable specific slash commands +$ docker agent run agent.yaml --disable-commands="/cost,/eval,/model" + +# Open in read-only mode to review a past session without sending new messages +$ docker agent run agent.yaml --session -1 --session-read-only + +# Use the lean TUI for this run +$ docker agent run agent.yaml --lean +``` + +### Lean TUI + +The lean TUI uses a simplified terminal interface with minimal chrome. To make it the default for interactive runs, set `lean` in your user config: + +```yaml +# ~/.config/cagent/config.yaml +settings: + lean: true +``` + +Omit `lean` or set it to `false` to keep the full TUI as the default. You can still use `--lean` for a single run, or `--lean=false` to use the full TUI when `settings.lean` is enabled. + +## Slash Commands + +Type `/` during a session to see available commands, or press Ctrl+K for the command palette: + +| Command | Description | +| ------------------ | ------------------------------------------------------------------------------------ | +| `/new` | Start a new conversation | +| `/clear` | Clear the current conversation (keep session, drop messages) | +| `/compact` | Summarize and compact the conversation history | +| `/fork` | Fork the current session into a new branch | +| `/copy` | Copy the entire conversation to clipboard | +| `/copy-last` | Copy only the last assistant message to clipboard | +| `/undo` | Restore file changes from the latest snapshot (only when snapshots are enabled) | +| `/snapshots` | List captured snapshots (only when snapshots are enabled) | +| `/export` | Export the session as HTML | +| `/sessions` | Browse and load past sessions | +| `/model` | Change the model for the current agent | +| `/effort` | Set the current model's reasoning-effort level (`/effort `, reasoning models only) | +| `/theme` | Change the color theme | +| `/yolo` | Toggle automatic tool call approval | +| `/title` | Set or regenerate session title | +| `/attach` | Attach a file to your message | +| `/shell` | Open a shell | +| `/star` | Star/unstar the current session | +| `/cost` | Show cost breakdown for this session | +| `/eval` | Create an evaluation report | +| `/pause` | Pause/resume the runtime loop. While the agent is mid-request, the resize handle shows "Pausing…" until the in-flight request completes; once the loop is blocked the indicator changes to "⏸ Paused". Run `/pause` again to resume. | +| `/tools` | Show every toolset (with lifecycle state) and the tools they expose | +| `/skills` | List skills available to the current agent | +| `/toolset-restart` | Force a supervisor-driven reconnect of the named toolset (`/toolset-restart `) | +| `/permissions` | Inspect and edit tool permission rules | +| `/split-diff` | Toggle split-diff view for file edits | +| `/speak` | Voice input via system speech-to-text (macOS only) | +| `/exit` | Exit the application (aliases: `/quit`, `/q`) | + +Slash commands (both built-in and named) execute immediately when entered. Regular chat messages are queued and processed in order. This means you can invoke a slash command to interrupt or direct the agent even while it is mid-response. + +### Agents Panel + +The sidebar's **Agents** section lists every agent in the team. The current agent is shown as a focus **card** (rendered in place at its position in the list) with its name, a wrapped description, its full `provider/model`, and a thinking line. Every other agent is shown as a compact **two-line row** — line 1 is the shortcut/spinner, the agent name (in its accent color), and a right-aligned thinking **gauge**; line 2 is the indented full `provider/model` — so a large team stays scannable while still showing each model. Agents are separated by a blank line so the two-line rows stay visually distinct. The effort **gauge** is the only visual language for thinking; the focus card and the Agent Inspector spell out the exact level alongside it. Left-click any agent to switch to it. + +#### Agent inspector + +Open a read-only **Agent Inspector** to inspect any agent's full configuration combined with its live state. The instruction/system prompt is deliberately omitted; everything else the agent declares is shown: + +- **Right-click any agent** (card or row) to open the inspector without switching to it. +- **Ctrl+left-click any agent** does the same — a fallback for terminals that don't forward right-clicks. +- **Left-click** always switches to the agent. + +The title is rendered in the agent's accent color. Sections appear in this order, and any empty section is omitted: + +- **Description** — the agent's wrapped description. +- **Live state** — a `● current agent` line when the inspected agent is the one currently running. +- **Model / Fallback / Thinking** — the `provider/model`, any fallback models, and the gauge + value thinking line (omitted for models with no selectable thinking, e.g. harness-backed agents). +- **Sub-agents (N) / Handoffs (N) / Skills (N)** — compact, inline, comma-separated lists wrapped to the dialog width. +- **Limits** — the configured per-agent limits that are set, e.g. `Limits: max-iter 50 · history 40 · max-tool-calls 5`. +- **Options** — the enabled option flags, e.g. `Options: add-date · add-environment-info · redact-secrets`. +- **Toolsets (N)** — one line per toolset with a status marker, its name, kind, and tool count, followed by the indented tool names. +- **Commands (N)** — the slash commands the agent defines, each with its description. + +Each toolset carries a single-width status marker reflecting its **live** lifecycle: `●` started (serving), `○` stopped (not yet started), or `⚠` error. The tools listed under a toolset are the **live** tool names when it has started; for a toolset that has not started, the inspector instead shows its declared `tools:` allow-list prefixed with `declared:` (and shows nothing when the toolset declares no allow-list and therefore serves every tool). This lets you see both what an agent is configured with and what is actually running, even before the agent has been used. + +The dialog scrolls when the content is long; press Esc to close it. Remote runtimes (which hold no local team config) degrade gracefully — the config-derived sections are simply omitted. + +Model identifiers on line 2 are truncated **from the left** (e.g. `…claude-sonnet-4-6`) only when they overflow, so the informative tail (variant/version) is preserved. As the sidebar narrows the model keeps its own line, and near the minimum width line 1's gauge collapses to a single cell to keep the name readable. + +The thinking state of each model is shown with a gauge + value on the card and a gauge or badge on the row (no `✻` glyph): + +| Model state | Card line | Row badge | +| ---------------------- | ------------------------------ | ---------------------- | +| Effort level | `thinking ▰▰▰▰▱▱ high` | `▰▰▰▰▱▱` (effort gauge) | +| Adaptive budget | `thinking auto adaptive` | `auto` | +| Token budget | `thinking ◉ 8.2K tokens` | `◉ 8.2K` | +| Disabled (capable) | `thinking ▱▱▱▱▱▱ off` (dimmed) | `▱▱▱▱▱▱` (empty gauge) | +| Not reasoning-capable | _(omitted)_ | _(omitted)_ | + +The **effort gauge** is a fixed-width six-cell indicator (`▰` filled, `▱` empty) so the badge column stays aligned. It maps the six selectable levels one-to-one onto filled-cell counts — `minimal` → `▰▱▱▱▱▱`, `low` → `▰▰▱▱▱▱`, `medium` → `▰▰▰▱▱▱`, `high` → `▰▰▰▰▱▱`, `xhigh` → `▰▰▰▰▰▱`, `max` → `▰▰▰▰▰▰` — so the cell count alone is lossless, with a low→high color ramp as a secondary cue. A capable-but-disabled model shows a dim empty gauge (`▱▱▱▱▱▱` `off`), adaptive budgets show `auto`, and token budgets keep `◉ `. The same gauge + value renders on the focus card, the Agent Inspector, and the row. + +Harness-backed agents (e.g. `claude-code`) show the harness type as their model and no thinking gauge. Press **Shift+Tab** to cycle the current model's thinking-effort level; a `✻ Thinking: ` toast confirms the change (useful when the sidebar is hidden). + +### Thinking and Tool Details + +Reasoning/thinking blocks are collapsed by default and carry a `Thinking` header badge. When collapsed, the TUI shows a short preview and compact tool summaries. Expand a block to see the full thinking content and the real tool renderers, including detailed tool output such as file edit diffs. + +To start new sessions with thinking/tool blocks expanded by default, set `expand_thinking` in your user config: + +```yaml +# ~/.config/cagent/config.yaml +settings: + expand_thinking: true +``` + +Set it to `false` or omit it to keep the default collapsed behavior. + +### Snapshots, `/undo`, and `/snapshots` + +Enable shadow-git snapshots globally in `~/.config/cagent/config.yaml`: + +```yaml +settings: + snapshot: true +``` + +When enabled, docker-agent records filesystem snapshots at turn boundaries. The TUI exposes two slash commands that operate on those snapshots: + +- **`/undo`** restores files from the most recent snapshot (one step back). +- **`/snapshots`** opens a dialog showing how many snapshots have been captured and the number of files in each one. Use ↑/↓ (or j/k) to highlight an entry, then press r to reset the workspace to that point. Pick `` to revert every snapshot and bring the workspace back to its pre-agent state. Esc closes the dialog without changing anything. + +Neither command removes messages from the session transcript — they only touch files on disk. Both commands (and the matching command-palette entries) are hidden when snapshots are turned off. Omit `snapshot` or set it to `false` to leave automatic snapshots off; agents can still configure snapshot hooks manually. + +See [Snapshots](../snapshots/index.md) for how the shadow-git machinery works and how to wire it per-agent. + +## File Attachments + +Attach file contents to your messages using the `@` trigger: + +1. Type `@` to open the file completion menu +2. Start typing to filter files (respects `.gitignore`) +3. Select a file to insert the reference + +```bash +# In the chat input: +Explain what the code in @pkg/agent/agent.go does +``` + +The agent receives the full file contents in a structured `` block, while the UI shows just the reference. + +## Runtime Model Switching + +Change the AI model during a session with `/model` or Ctrl+M: + +1. Press Ctrl+M or type `/model` +2. Select from config models or type a custom `provider/model` +3. The model switch is saved with the session and restored on reload + +When a models gateway is configured (`--models-gateway`) and it exposes an OpenAI-style `/v1/models` endpoint, the picker lists the models actually served by the gateway (merged with the models defined in the agent config). When the gateway doesn't expose `/v1/models`, the picker falls back to the regular catalog. + +> [!TIP] +> Use model switching to try a more capable model for complex tasks, or a cheaper one for simple queries — without modifying your YAML config. + +## Editable Messages + +Edit any previous user message to branch the conversation. Click on a past message to modify it — the agent will re-process from that point, while the original session history is preserved. This is great for exploring alternative approaches without losing your work. + +## Error Recovery + +When an agent turn fails (fatal model error, hook block, loop detection, tool-setup failure), the TUI displays the error in the message stream and persists it to the session store. Errors survive a reload and are shown exactly where they occurred, making them visible in shared or remote sessions. + +Each error message includes a clickable **↻ retry** button. Clicking it resumes the conversation from the point of failure — without retyping your last message. This lets you recover from transient failures (rate limits, network blips, model API errors) in one click. + +## Session Management + +docker-agent automatically saves your sessions. Use `/sessions` to browse past conversations: + +- **Browse** past sessions with search and filtering +- **Star** important sessions with `/star` +- **Branch** conversations by editing any previous user message — preserving the original session history +- **Resume** sessions with `docker agent run config.yaml --session ` +- **Relative refs**: `--session -1` for the last session, `-2` for the one before + +### Session Title Editing + +Customize session titles to make them more meaningful and easier to find. By default, docker-agent auto-generates titles based on your first message, but you can override or regenerate them at any time. + +**Using the `/title` command:** + +```bash +/title # Regenerate title using AI (based on recent messages) +/title My Custom Title # Set a specific title +``` + +**Using the sidebar:** + +1. Click the pencil icon (✎) next to the session title in the sidebar +2. Type your new title +3. Press Enter to save, or Escape to cancel + +> [!NOTE] +> Manually set titles are preserved and won’t be overwritten by auto-generation. Title changes are persisted immediately to the session. + +## Keyboard Shortcuts + +| Shortcut | Action | +| ---------- | ----------------------------------------------- | +| Ctrl+K | Open command palette | +| Ctrl+M | Switch model | +| Ctrl+R | Reverse history search (search previous inputs) | +| Ctrl+G | Cancel reverse history search | +| Ctrl+S | Cycle to next agent in the team | +| Shift+Tab | Cycle the current model's thinking-effort level (shows a `✻ Thinking: ` toast) | +| Ctrl+1 – 9 | Switch directly to agent _N_ in the team list | +| Ctrl+T | Open a new tab (additional agent session) | +| Ctrl+W | Close the current tab | +| Ctrl+N | Next tab | +| Ctrl+P | Previous tab | +| Ctrl+B | Toggle the sidebar (full-UI mode only; disabled when --sidebar=false) | +| Ctrl+Y | Toggle YOLO mode (auto-approve tool calls) | +| Ctrl+O | Toggle hide tool results | +| Ctrl+Z | Suspend TUI to background (resume with `fg`) | +| Ctrl+X | Clear queued messages | +| Escape | Cancel current operation | +| Enter | Send message (or newline with Shift+Enter) | +| Up/Down | Navigate message history | + +Press Ctrl+H to view the complete list of all available keyboard shortcuts. + +### Custom Keybindings + +You can remap the shortcuts above by adding a `keybindings` list to the `settings` block of your `~/.config/cagent/config.yaml`. Each entry maps an action to one or more key combinations in [Bubbles key format](https://github.com/charmbracelet/bubbles) (for example `ctrl+q`, `alt+enter`, `f2`). Unlisted actions keep their defaults. + +This is the recommended way to replace the `Ctrl+J` newline fallback, which conflicts with common editor/terminal shortcuts (for example inside VS Code). + +```yaml +settings: + keybindings: + # Insert a newline with Alt+Enter instead of Ctrl+J. Shift+Enter still + # works automatically on terminals that report it. + - action: "editor_newline" + keys: ["alt+enter"] + # Allow several keys for one action. + - action: "commands" + keys: ["f2", "ctrl+k"] + - action: "quit" + keys: ["ctrl+q"] +``` + +**Valid actions:** + +| Action | Default | Description | +| -------------------------- | ------------ | -------------------------------------- | +| `editor_send` | `enter` | Send the current message | +| `editor_newline` | `ctrl+j` | Insert a newline in the input | +| `quit` | `ctrl+c` | Quit (opens the exit confirmation) | +| `switch_focus` | `tab` | Switch focus between panels | +| `commands` | `ctrl+k` | Open the command palette | +| `help` | `ctrl+h` | Show the help dialog | +| `toggle_yolo` | `ctrl+y` | Toggle YOLO mode | +| `toggle_hide_tool_results` | `ctrl+o` | Toggle hiding tool results | +| `cycle_agent` | `ctrl+s` | Cycle to the next agent | +| `model_picker` | `ctrl+m` | Open the model picker | +| `clear_queue` | `ctrl+x` | Clear queued messages | +| `suspend` | `ctrl+z` | Suspend the TUI | +| `toggle_sidebar` | `ctrl+b` | Toggle the sidebar | +| `edit_external` | `ctrl+g` | Edit input in an external editor | +| `history_search` | `ctrl+r` | Incremental history search | + +`Shift+Enter` for newline is detected from your terminal's capabilities and is always available where supported, independent of `editor_newline`. + +Invalid entries are ignored with a warning (visible with `--debug`) so a bad config never breaks the TUI: unknown actions, empty or malformed keys, and keys that would collide with another action are dropped while every other binding keeps working. + +## History Search + +Press Ctrl+R to enter incremental history search mode. Start typing to filter through your previous inputs. Press Enter to select a match, or Escape to cancel. + +## Theming + +Customize the TUI appearance with built-in or custom themes: + +```bash +# Switch themes interactively +/theme +``` + +### Built-in Themes + +`default`, `catppuccin-latte`, `catppuccin-mocha`, `dracula`, `gruvbox-dark`, `gruvbox-light`, `nord`, `one-dark`, `solarized-dark`, `tokyo-night` + +### Custom Themes + +Create theme files in `~/.cagent/themes/` as YAML. Theme files are **partial overrides** — you only need to specify the colors you want to change. Any omitted keys fall back to the built-in default theme values. + +```yaml +# ~/.cagent/themes/my-theme.yaml +name: "My Custom Theme" + +colors: + # Backgrounds + background: "#1a1a2e" + background_alt: "#16213e" + + # Text colors + text_bright: "#ffffff" + text_primary: "#e8e8e8" + text_secondary: "#b0b0b0" + text_muted: "#707070" + + # Accent colors + accent: "#4fc3f7" + brand: "#1d96f3" + + # Status colors + success: "#4caf50" + error: "#f44336" + warning: "#ff9800" + info: "#00bcd4" + +# Optional: Customize syntax highlighting colors +chroma: + comment: "#6a9955" + keyword: "#569cd6" + literal_string: "#ce9178" + +# Optional: Customize markdown rendering colors +markdown: + heading: "#4fc3f7" + link: "#569cd6" + code: "#ce9178" +``` + +### Applying Themes + +**In user config** (`~/.config/cagent/config.yaml`): + +```yaml +settings: + theme: my-theme # References ~/.cagent/themes/my-theme.yaml +``` + +**At launch:** Pass `--theme ` to `docker agent run` to preselect a theme for that session. This overrides `settings.theme` in your config but is not saved. Invalid theme names print an error at startup listing the available options. Has no effect in `--exec` mode. + +**At runtime:** Use the `/theme` command to open the theme picker and select from available themes. Your selection is saved globally in `~/.config/cagent/config.yaml` under `settings.theme` and persists across sessions. + +> [!TIP] +> **Hot Reload** +> +> Custom themes auto-reload when you save changes to the file — no restart needed. This makes it easy to tweak colors in real-time. + +> [!WARNING] +> **Partial overrides** +> +> All user themes are applied on top of the `default` theme. If you want to customize a built-in theme (e.g., `dracula`), copy its full YAML from the [built-in themes on GitHub](https://github.com/docker/docker-agent/tree/main/pkg/tui/styles/themes) into `~/.cagent/themes/` and edit the copy. Otherwise, omitted values will use `default` colors, not the original theme's colors. + +## Tool Permissions + +When an agent calls a tool, docker-agent shows a confirmation dialog by default. You can: + +- **Approve once** — Allow this specific call +- **Always allow** — Permanently approve this tool/command for the session +- **Deny** — Reject the tool call + +**Granular permissions:** The permission system supports pattern-based matching. When you “Always allow” a specific tool command, only that exact pattern is auto-approved — other commands from the same tool still require confirmation. This lets you auto-approve safe, read-only operations while maintaining control over destructive ones. + +> [!TIP] +> **YOLO mode** +> +> Use `--yolo` or the `/yolo` command to auto-approve all tool calls. You can also toggle this mid-session. For aliases, set `--yolo` when creating the alias: `docker agent alias add fast agentcatalog/coder --yolo`. + +## Notifications + +The TUI displays transient notification banners for agent warnings, errors, and other runtime events. Notifications auto-dismiss after a short delay unless the mouse is hovering over them — hovering pauses the timer so you have time to read the message. + +| Interaction | Behaviour | +| ----------- | --------- | +| Hover | Pauses auto-dismiss; the notification stays visible until the mouse moves away | +| Click | Copies the notification text to the clipboard | +| × (close) | Dismisses immediately; the glyph turns red when hovered | + +Hint text in the top-left corner of the notification border shows the available actions at a glance. diff --git a/_vendor/github.com/docker/docker-agent/docs/getting-started/_index.md b/_vendor/github.com/docker/docker-agent/docs/getting-started/_index.md new file mode 100644 index 0000000000..46eeae8989 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/getting-started/_index.md @@ -0,0 +1,5 @@ +--- +title: "Getting Started" +description: "Install Docker Agent and build your first agent." +weight: 10 +--- diff --git a/_vendor/github.com/docker/docker-agent/docs/getting-started/installation/index.md b/_vendor/github.com/docker/docker-agent/docs/getting-started/installation/index.md new file mode 100644 index 0000000000..6d1e6da812 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/getting-started/installation/index.md @@ -0,0 +1,148 @@ +--- +title: "Installation" +description: "Get docker-agent running on your system in minutes." +keywords: docker agent, ai agents, getting started, installation +weight: 20 +--- + +_Get docker-agent running on your system in minutes._ + +## Prerequisites + +- An API key for at least one AI provider (OpenAI, Anthropic, Google, etc.) +- **Optional:** [Docker Desktop](https://www.docker.com/products/docker-desktop/) — for running containerized MCP tools and Docker Model Runner + +## Docker Desktop (Pre-installed) + +Starting with [Docker Desktop 4.63](https://docs.docker.com/desktop/release-notes/#4630), **docker-agent is already available**. No separate installation needed — just open a terminal and run: + +```bash +$ docker agent version +``` + +> [!TIP] +> Docker Desktop bundles docker-agent and keeps it up to date. This is the easiest way to get started, especially if you want to use Docker MCP tools and Docker Model Runner. + +## Homebrew (macOS / Linux) + +Install docker-agent using [Homebrew](https://brew.sh/): + +```bash +# Install +$ brew install docker-agent + +# Verify +$ docker-agent version +``` + +You can also install docker-agent as a docker CLI plugin, by copying `docker-agent` binary in `~/.docker/cli-plugins`. You can then run `docker agent version`. + +## Download Binary Releases + +Download [prebuilt binary releases](https://github.com/docker/docker-agent/releases) for Windows, macOS, and Linux from the GitHub Releases page. + +### macOS / Linux + +```bash +# Download the latest release +OS=$(uname -s | tr '[:upper:]' '[:lower:]') +ARCH=$(uname -m); case "$ARCH" in x86_64) ARCH=amd64;; aarch64) ARCH=arm64;; esac +curl -L "https://github.com/docker/docker-agent/releases/latest/download/docker-agent-${OS}-${ARCH}" -o docker-agent +chmod +x docker-agent +sudo mv docker-agent /usr/local/bin/ +docker-agent version + +# or alternatively, instead of moving to /usr/local/bin: +mkdir -p ~/.docker/cli-plugins +sudo mv docker-agent ~/.docker/cli-plugins +docker agent version +``` + +### Windows + +Download `docker-agent-windows-amd64.exe` from the [releases page](https://github.com/docker/docker-agent/releases), rename it to `docker-agent.exe` and add it to your PATH. Alternatively you can move it to `~/.docker/cli-plugins` + +## Optional Self-Updates + +When docker-agent is installed from a standalone GitHub release binary, you can opt in to automatic self-updates by setting `DOCKER_AGENT_AUTO_UPDATE` to a truthy value (`1`, `true`, `yes`, or `on`): + +```bash +# Enable for one command +DOCKER_AGENT_AUTO_UPDATE=1 docker agent run + +# Or enable for the current shell session +export DOCKER_AGENT_AUTO_UPDATE=1 +docker agent run +``` + +With self-updates enabled, docker-agent checks the latest GitHub release before normal commands run. If a newer release exists and your session is interactive, docker-agent asks whether you want to install it or keep running your current version. When the answer is yes (or the session is non-interactive, such as CI or piped input, in which case the update proceeds automatically), it downloads the asset for your OS and architecture, verifies the release-provided SHA-256 digest/checksum, replaces the current binary, and restarts the command with the same arguments. + +Self-updates are fail-safe: if checking, downloading, verifying, installing, or restarting fails, docker-agent keeps running the current binary. Version/help/completion commands and Docker CLI plugin metadata handshakes do not trigger self-updates. + +> [!NOTE] +> **Package-manager installs** +> +> Docker Desktop and Homebrew already manage docker-agent updates. Prefer those update mechanisms when you installed docker-agent that way. Self-updates are mainly intended for standalone release binaries. + +## Build from Source + +For the latest features, or to contribute, build from source: + +### Prerequisites + +- [Go 1.26](https://go.dev/dl/) or higher +- [Task](https://taskfile.dev/installation/) (build tool) +- [golangci-lint](https://golangci-lint.run/docs/welcome/install/local/) (for linting) + +```bash +# Clone the repository +git clone https://github.com/docker/docker-agent.git +cd docker-agent + +# Build the binary +task build + +# The binary is at ./bin/docker-agent +./bin/docker-agent --help +``` + +> [!TIP] +> **Building on Windows** +> +> On Windows, use `task build-local` instead of `task build`. This builds the binary inside a Docker container using Docker Buildx, which avoids issues with Windows-specific toolchain setup and CGo cross-compilation. The output goes to the `./dist` directory. + +## Set Up API Keys + +docker-agent needs API keys for the model providers you want to use. Set them as environment variables: + +```bash +# Pick one (or more) depending on your provider +export OPENAI_API_KEY="sk-..." # OpenAI +export ANTHROPIC_API_KEY="sk-ant-..." # Anthropic +export GOOGLE_API_KEY="AI..." # Google Gemini (or GEMINI_API_KEY) +export MISTRAL_API_KEY="..." # Mistral +export OPENROUTER_API_KEY="..." # OpenRouter +``` + +See [Configuration Overview](../../configuration/overview/index.md#environment-variables) for the full list of supported providers and environment variables. + +> [!NOTE] +> You only need the key(s) for the provider(s) you configure in your agent YAML. If you use Docker Model Runner (DMR), no API key is needed — models run locally. + +## Verify Installation + +```bash +# Check the version +$ docker agent version + +# Run the default agent +$ docker agent run + +# Or try a built-in example +$ docker agent run agentcatalog/pirate +``` + +## What's Next? + +- [**Quick Start**](../quickstart/index.md) — create and run your first agent in under 5 minutes. +- [**Troubleshooting**](../../community/troubleshooting/index.md) — something not working? Debug mode, common issues, and solutions. diff --git a/_vendor/github.com/docker/docker-agent/docs/getting-started/introduction/index.md b/_vendor/github.com/docker/docker-agent/docs/getting-started/introduction/index.md new file mode 100644 index 0000000000..8b95a6f866 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/getting-started/introduction/index.md @@ -0,0 +1,73 @@ +--- +title: "Introduction" +description: "Docker Agent is a multi-agent runtime that lets you build, run, and share AI agents with a YAML or HCL config — no glue code required." +keywords: docker agent, ai agents, getting started, introduction +weight: 10 +--- + +_Docker Agent is a multi-agent runtime that lets you build, run, and share AI agents with a YAML or HCL config — no glue code required._ + +## What is Docker Agent? + +Docker Agent is an open-source tool from Docker that orchestrates AI +agents with specialized capabilities and tools. Instead of writing +code to wire up LLMs, tools, and workflows, you **declare** your +agents in YAML or HCL — their model, personality, tools, and how they +collaborate — and Docker Agent handles the rest. + +- **Multi-Agent Architecture** — build hierarchical teams of agents that specialize in different tasks and delegate work to each other. +- **Rich Tool Ecosystem** — built-in tools for files, shell, memory, and todos. Extend with any MCP server from [Docker's MCP catalog](https://hub.docker.com/u/mcp). +- **Multi-Model Support** — OpenAI, Anthropic, Google Gemini, AWS Bedrock, Docker Model Runner, and reusable provider definitions with shared defaults. +- **Package & Share** — push agents to OCI registries and pull them anywhere, just like Docker images. +- **Multiple Interfaces** — interactive TUI, headless CLI, HTTP API server, MCP mode, and A2A protocol support. +- **Security-First Design** — tool confirmation prompts, containerized MCP tools via Docker, client isolation, and resource scoping. + +## Why Docker Agent? + +After spending years building AI agents using various frameworks, the +Docker team kept asking the same questions: + +- **How do we make building agents less of a hassle?** — Most agents + use the same building blocks. Docker Agent provides them out of the + box. +- **Can we reuse those building blocks?** — Declarative YAML or HCL + configs mean you can mix and match agents, models, and tools without + rewriting code. +- **How can we share agents easily?** — Push agents to any OCI + registry and run them anywhere with a single command. + +Docker Agent is built in the open so the community can make use of +this work and contribute to its future. + +## How it works + +At its core, Docker Agent follows a simple loop: + +1. **You define agents** in YAML or HCL — their model, instructions, tools, and sub-agents. +2. **You run an agent** via the TUI, CLI, or API. +3. **The agent processes your request** — calling tools, delegating to sub-agents, and reasoning step by step. +4. **Results stream back in real-time** via an event-driven architecture. + +```yaml +# A minimal agent definition +agents: + root: + model: openai/gpt-5 + description: A helpful assistant + instruction: You are a helpful assistant. + toolsets: + - type: think +``` + +```bash +# Run it +$ docker agent run agent.yaml +``` + +> [!TIP] +> Jump straight to the [Quick Start](../quickstart/index.md) if you want to build your first agent right away. + +## What's next? + +- [**Installation**](../installation/index.md) — install Docker Agent on macOS, Linux, or Windows. +- [**Quick Start**](../quickstart/index.md) — build your first agent in under 5 minutes. diff --git a/_vendor/github.com/docker/docker-agent/docs/getting-started/quickstart/index.md b/_vendor/github.com/docker/docker-agent/docs/getting-started/quickstart/index.md new file mode 100644 index 0000000000..c0f7dc4a04 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/getting-started/quickstart/index.md @@ -0,0 +1,144 @@ +--- +title: "Quick Start" +description: "Get up and running with Docker Agent in under 5 minutes. Pick whichever path suits you best." +keywords: docker agent, ai agents, getting started, quick start +weight: 30 +aliases: + - /ai/docker-agent/tutorial/ +--- + +_Get up and running with Docker Agent in under 5 minutes. Pick whichever path suits you best._ + +## Option A: Run the Default Agent + +The fastest way to try Docker Agent — no config file needed: + +```bash +# Launch the default agent with the interactive TUI +$ docker agent run +``` + +This starts a general-purpose assistant with sensible defaults. Just start chatting. + +## Option B: Run a Pre-Built Agent from the Registry + +Try a ready-made agent from the [agent catalog](https://hub.docker.com/u/agentcatalog) — no YAML needed: + +```bash +# Run a pirate-themed assistant +$ docker agent run agentcatalog/pirate + +# Run a coding agent +$ docker agent run agentcatalog/coder +``` + +## Option C: Generate a Config Interactively + +Use the `docker agent new` command to scaffold a config file through prompts: + +```bash +# Interactive wizard +$ docker agent new + +# Or specify options directly +$ docker agent new --model openai/gpt-5 + +# Override iteration limits +$ docker agent new --model dmr/ai/gemma3-qat:12B --max-iterations 15 +``` + +This generates an `agent.yaml` in the current directory. Then run it: + +```bash +$ docker agent run agent.yaml +``` + +## Option D: Write Your Own Config + +Create an `agent.yaml` by hand for full control. Here's a minimal example: + +```yaml +agents: + root: + model: anthropic/claude-sonnet-4-5 + description: A helpful coding assistant + instruction: | + You are an expert software developer. Help users write + clean, efficient code. Explain your reasoning. + toolsets: + - type: filesystem + - type: shell + - type: think +``` + +This gives your agent: + +- **Claude Sonnet 4.5** as the underlying model +- **Filesystem access** to read and write files +- **Shell access** to run commands +- **Think tool** for step-by-step reasoning + +```bash +# Launch the interactive terminal UI +$ docker agent run agent.yaml +``` + +> [!TIP] +> **Prefer HCL?** +> +> You can write the same config as `agent.hcl` using labeled blocks and heredocs. See [HCL Configuration](../../configuration/hcl/index.md). + +## Try It Out + +Once your agent is running, try asking it to: + +- _"List the files in the current directory"_ +- _"Create a Python script that fetches weather data"_ +- _"Explain what the code in main.go does"_ + +> [!TIP] +> Add `--yolo` to auto-approve all tool calls: `docker agent run agent.yaml --yolo` + +## Non-Interactive Mode + +Use `docker agent run --exec` for one-shot tasks: + +```bash +# Ask a single question +$ docker agent run --exec agent.yaml "Create a Dockerfile for a Node.js app" + +# Pipe input +$ cat error.log | docker agent run --exec agent.yaml "What's wrong in this log?" +``` + +## Add More Power + +Give your agent persistent memory and web search: + +```yaml +agents: + root: + model: anthropic/claude-sonnet-4-5 + description: Research assistant with memory + instruction: | + You are a research assistant. Search the web for information, + remember important findings, and provide thorough analysis. + toolsets: + - type: think + - type: memory + path: ./research.db + - type: mcp + ref: docker:duckduckgo +``` + +> [!NOTE] +> **Docker MCP Tools** +> +> The `ref: docker:duckduckgo` syntax runs the DuckDuckGo MCP server in a Docker container. This is the recommended way to use MCP tools — secure, isolated, and easy to configure. Requires Docker Desktop. + +## What's Next? + +- [**Understand Agents**](../../concepts/agents/index.md) — learn how agents work and what you can configure. +- [**Multi-Agent Systems**](../../concepts/multi-agent/index.md) — build teams of collaborating agents. +- [**Configuration Reference**](../../configuration/overview/index.md) — full reference for all YAML and HCL options. +- [**Troubleshooting**](../../community/troubleshooting/index.md) — something not working? Debug tips and common fixes. diff --git a/_vendor/github.com/docker/docker-agent/docs/guides/_index.md b/_vendor/github.com/docker/docker-agent/docs/guides/_index.md new file mode 100644 index 0000000000..3e7b3780ad --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/guides/_index.md @@ -0,0 +1,5 @@ +--- +title: "Guides" +description: "Practical guides for building and running agents." +weight: 70 +--- diff --git a/_vendor/github.com/docker/docker-agent/docs/guides/go-sdk/index.md b/_vendor/github.com/docker/docker-agent/docs/guides/go-sdk/index.md new file mode 100644 index 0000000000..ede2272bc2 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/guides/go-sdk/index.md @@ -0,0 +1,615 @@ +--- +title: "Go SDK" +description: "Use docker-agent as a Go library to embed AI agents in your applications." +keywords: docker agent, ai agents, guides, go sdk +weight: 40 +--- + +_Use docker-agent as a Go library to embed AI agents in your applications._ + +## Overview + +docker-agent can be used as a Go library, allowing you to build AI agents directly into your Go applications. This gives you full programmatic control over agent creation, tool integration, and execution. + +> [!NOTE] +> **Import Path** +> +> ```go +> import "github.com/docker/docker-agent/pkg/..." +> ``` + +## Core Packages + +| Package | Purpose | +| ---------------------- | ---------------------------------------- | +| `pkg/agent` | Agent creation and configuration | +| `pkg/runtime` | Agent execution and event streaming | +| `pkg/session` | Conversation state management | +| `pkg/team` | Multi-agent team composition | +| `pkg/tools` | Tool interface and utilities | +| `pkg/tools/builtin` | Built-in tools (shell, filesystem, etc.) | +| `pkg/model/provider/*` | Model provider clients | +| `pkg/config/latest` | Configuration types | +| `pkg/environment` | Environment and secrets | +| `pkg/embeddedchat` | Headless chat session for embedding the agent runtime in a custom UI | +| `pkg/tui/components/toolconfirm` | Tool-confirmation policy: `Decision` enum, `BuildPermissionPattern`, key bindings, and rejection-reason presets. Share this instead of copying the permission-pattern logic. | +| `pkg/tui/service` | `StaticSessionState` — a `SessionStateReader` with conservative fixed values, for rendering message/tool views outside the full TUI app. Replaces hand-rolled nine-method stubs. | +| `pkg/tui/animation` | `Stopper` / `StopView` — animation lifecycle contract. Call `StopAnimation` on views removed from the UI to prevent leaked tick subscriptions. | +| `pkg/tui/components/transcript` | Embedded transcript view with read-only `Messages()` accessor for observing conversation structure in host tests and persistence layers. | + +## Embedding TUI Components + +When building custom UIs on top of docker-agent's TUI primitives, four packages define the contracts that keep the runtime and the UI in sync: + +- **`pkg/tui/components/toolconfirm`** — import this package for the permission-decision policy rather than copying the pattern-building logic. The `Decision` enum, `BuildPermissionPattern` helper, and rejection-reason presets are the canonical source of truth: whatever pattern is shown to the user in the confirmation dialog is exactly the pattern granted to the runtime. +- **`pkg/tui/service`** — use `StaticSessionState` as a stub `SessionStateReader` when rendering individual message or tool views outside the full TUI app. It returns conservative fixed values for all nine interface methods, eliminating the need for hand-rolled stubs. +- **`pkg/tui/animation`** — implement `animation.Stopper` on any view that owns a tick-based animation. Call `StopAnimation` whenever a view is removed from the UI hierarchy to prevent leaked `time.Tick` subscriptions from firing against a dead view. +- **`pkg/tui/components/transcript`** — embed the transcript view for displaying conversation history. Use the `Messages()` method to read the current slice of transcript messages (treat as read-only — mutations desync renders). This is useful for host-side tests asserting on chat history, and for persistence layers that need to snapshot conversation state. + +## Headless Embedded Chat (`pkg/embeddedchat`) + +`pkg/embeddedchat` is a thin wrapper around the docker-agent runtime that lets you drive an agent from your own UI instead of running docker-agent's Bubble Tea application. It handles runtime construction, event projection, and conversation state, exposing a simple `Send` / `Confirm` / `Restart` / `Close` API. + +### Creating a session + +```go +import ( + "context" + "fmt" + "strings" + + dagentcfg "github.com/docker/docker-agent/pkg/config" + dagentruntime "github.com/docker/docker-agent/pkg/runtime" + "github.com/docker/docker-agent/pkg/embeddedchat" +) + +chat, err := embeddedchat.New(ctx, embeddedchat.Config{ + // AgentSource can be a file path, raw YAML bytes, or an OCI reference. + AgentSource: dagentcfg.NewBytesSource("agent", []byte(agentYAML)), +}) +if err != nil { + return err +} +defer chat.Close() +``` + +### Sending a message and reading events + +`Send` appends the user message to the conversation and returns a channel of `Event` values. Drain the channel until it closes. + +```go +events, err := chat.Send(ctx, "Hello! What can you do?") +if err != nil { + return err +} + +var response strings.Builder +for ev := range events { + switch { + case ev.Text != "": + response.WriteString(ev.Text) + case ev.Tool != nil && ev.Tool.NeedsConfirmation: + // Approve the pending tool call (use ResumeApproveSession to allow all). + if err := chat.Confirm(ctx, dagentruntime.ResumeApprove()); err != nil { + return err + } + case ev.Tool != nil && ev.Tool.Finished: + fmt.Printf("[tool %s finished]\n", ev.Tool.Def.Name) + case ev.Err != nil: + fmt.Printf("error: %v\n", ev.Err) + case ev.Done: + fmt.Println("\n[turn complete]") + } +} +fmt.Print(response.String()) +``` + +### Restarting the conversation + +To start a fresh conversation without recreating the runtime: + +```go +if err := chat.Restart(); err != nil { + return err +} +``` + +### Event types + +| Field | When set | +| -------------- | ------------------------------------------------------------------------ | +| `Text` | Assistant text delta; accumulate into a string for the full reply. | +| `Tool` | A tool call started, needs confirmation, or finished. | +| `Tool.NeedsConfirmation` | Runtime is blocked until `Confirm` is called. | +| `Tool.Finished` | Tool call completed; `Tool.IsError` is true if it errored. | +| `Err` | A user-facing runtime error; no further content events follow. | +| `Done` | Clean end of turn; no more events. | +| `RuntimeEvent` | The original `runtime.Event` for callers that need the full stream. | + +For advanced use (custom elicitation, raw event inspection), call `chat.Runtime()` to access the underlying `runtime.Runtime` directly. + +## Optional Provider Build Tags + +By default docker-agent includes all four cloud providers (OpenAI, Anthropic, Google, Amazon Bedrock). When embedding docker-agent in your own binary you can compile out unneeded providers — together with their transitive SDK dependencies — to reduce binary size. + +Each provider is gated by a negative build tag prefixed `docker_agent_` to avoid collisions with your own project's tags: + +| Build tag | Provider dropped | Major dependency removed | +| ---------------------------- | ------------------------ | ------------------------------------------------- | +| `docker_agent_no_openai` | OpenAI | `github.com/openai/openai-go` | +| `docker_agent_no_anthropic` | Anthropic | `github.com/anthropics/anthropic-sdk-go` (partial — see note) | +| `docker_agent_no_google` | Google / Vertex AI | `google.golang.org/genai`, Vertex auth stack, and indirectly the Anthropic and OpenAI SDKs via Vertex Model Garden | +| `docker_agent_no_bedrock` | Amazon Bedrock | `github.com/aws/aws-sdk-go-v2` stack (the largest provider dependency tree) | + +To build without Bedrock and OpenAI: + +```bash +go build -tags 'docker_agent_no_bedrock docker_agent_no_openai' ./... +``` + +Requesting a model whose provider was compiled out fails at construction time with a clear `"not compiled into this build"` error. The `dmr` (Docker Model Runner) provider and the rule-based router are always compiled in. + +> [!WARNING] +> **Anthropic + Google dependency** +> +> The Google provider's Vertex Model Garden support also imports the Anthropic SDK, so the Anthropic dependency is only fully removed when _both_ `docker_agent_no_anthropic` and `docker_agent_no_google` are set. + +## RAG Toolset (opt-out) + +The RAG toolset (`type: rag`) is included in `NewDefaultToolsetRegistry()` (from `pkg/teamloader/toolsets`) and `loaderdefaults.Opts()` (from `pkg/teamloader/defaults`, using the conventional import alias `loaderdefaults`). + +The underlying tree-sitter code parser uses cgo, but build-tag guards in `pkg/rag/treesitter` mean importing the package is safe regardless of `CGO_ENABLED`: with `CGO_ENABLED=0` the parser stub compiles in and returns a runtime error on first use rather than failing at compile time. + +If you want to exclude the RAG toolset from your binary entirely — surfacing a load-time warning on the agent rather than a deferred runtime error from the `!cgo` stub — remove it from the registry before passing it to `teamloader.Load`: + +```go +import ( + "github.com/docker/docker-agent/pkg/teamloader" + loadertoolsets "github.com/docker/docker-agent/pkg/teamloader/toolsets" +) + +// Opt out of the RAG toolset; a config that declares type: rag attaches +// a load-time warning to the agent instead of failing at document processing. +creators := loadertoolsets.DefaultToolsetCreators() +delete(creators, "rag") +registry := teamloader.NewToolsetRegistry(creators) +``` + +Pass the custom registry via `teamloader.WithToolsetRegistry(registry)` when calling `teamloader.Load`. Note that `teamloader.Load()` does not return an error for unknown toolset types — the failure is recorded as a load-time warning and can be retrieved with `agent.DrainWarnings()`; it is also surfaced via logging and TUI notifications. + +## Registering Custom Built-in Themes + +When embedding docker-agent, you can contribute your own built-in themes via `styles.RegisterBuiltinThemes`. Registered themes integrate seamlessly with the existing theme picker, `/theme` command, and `settings.theme` config key — they behave exactly like docker-agent's own bundled themes. + +```go +import ( + "embed" + + "github.com/docker/docker-agent/pkg/tui/styles" +) + +//go:embed themes/*.yaml +var brandThemes embed.FS + +// Call at startup, before applying any persisted theme: +if err := styles.RegisterBuiltinThemes(brandThemes); err != nil { + return err +} +``` + +Each theme file lives at `themes/.yaml` inside the embedded filesystem and is a **partial override** — only the colors you want to change are required; everything else falls back to `DefaultTheme()`. + +```yaml +# themes/brand.yaml +name: Brand +colors: + accent: "#FF6A00" + background: "#1A0F0A" +``` + +If `name:` is omitted, docker-agent uses the filename stem as the display name in the theme picker (e.g. `brand` from `themes/brand.yaml`). + +To replace docker-agent's default theme entirely, ship the file as `themes/default.yaml` — it masks the bundled default while inheriting any colors you don't set. + +**Semantics:** + +- Registered sources take precedence over bundled themes; a registered ref overrides a bundled theme of the same name. +- Among multiple registered sources, last-registered wins on a collision. +- `RegisterBuiltinThemes` validates eagerly (nil fs, missing `themes/` dir) so errors surface at registration time, not at picker time. + +## MCP OAuth Token Persistence + +By default, MCP OAuth tokens are stored in-memory only and are not persisted across process restarts. The CLI registers a keyring-backed store automatically at startup; when embedding docker-agent as a library you must do this yourself if you want tokens to survive restarts. + +Call `keyringstore.Register()` **before** any MCP toolset is initialised to enable the OS keyring-backed token store: + +```go +import "github.com/docker/docker-agent/pkg/tools/mcp/keyringstore" + +func main() { + // Must be called before teamloader.Load() on configs with remote MCP + // toolsets; calling it after the store is created panics. + keyringstore.Register() + // ... rest of your startup code +} +``` + +> [!WARNING] +> **Call order matters** +> +> If `keyringstore.Register()` is called after the default token store has already been lazily initialised, docker-agent panics. The store is initialised when any remote MCP toolset is constructed — which happens inside `teamloader.Load()`. Always call `keyringstore.Register()` before calling `teamloader.Load()` on a config that includes remote MCP toolsets. + +If you do not need persistent OAuth tokens (for example, in short-lived batch jobs or tests), omit the call and tokens will be kept in-memory for the process lifetime. + +## Basic Example + +Create a simple agent and run it: + +```go +package main + +import ( + "context" + "fmt" + "log" + "os/signal" + "syscall" + + "github.com/docker/docker-agent/pkg/agent" + "github.com/docker/docker-agent/pkg/config/latest" + "github.com/docker/docker-agent/pkg/environment" + "github.com/docker/docker-agent/pkg/model/provider/openai" + "github.com/docker/docker-agent/pkg/runtime" + "github.com/docker/docker-agent/pkg/session" + "github.com/docker/docker-agent/pkg/team" +) + +func main() { + ctx, cancel := signal.NotifyContext(context.Background(), + syscall.SIGINT, syscall.SIGTERM) + defer cancel() + + if err := run(ctx); err != nil { + log.Fatal(err) + } +} + +func run(ctx context.Context) error { + // Create model provider + llm, err := openai.NewClient( + ctx, + &latest.ModelConfig{ + Provider: "openai", + Model: "gpt-4o", + }, + environment.NewDefaultProvider(), + ) + if err != nil { + return err + } + + // Create agent + assistant := agent.New( + "root", + "You are a helpful assistant.", + agent.WithModel(llm), + agent.WithDescription("A helpful assistant"), + ) + + // Create team and runtime + t := team.New(team.WithAgents(assistant)) + rt, err := runtime.New(t) + if err != nil { + return err + } + + // Run with a user message + sess := session.New( + session.WithUserMessage("What is 2 + 2?"), + ) + + messages, err := rt.Run(ctx, sess) + if err != nil { + return err + } + + // Print the response + fmt.Println(messages[len(messages)-1].Message.Content) + return nil +} +``` + +## Custom Tools + +Define custom tools for your agent: + +```go +package main + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/docker/docker-agent/pkg/tools" +) + +// Define the tool's input schema +type AddNumbersArgs struct { + A int `json:"a"` + B int `json:"b"` +} + +// Implement the tool handler +func addNumbers(_ context.Context, toolCall tools.ToolCall) (*tools.ToolCallResult, error) { + var args AddNumbersArgs + if err := json.Unmarshal([]byte(toolCall.Function.Arguments), &args); err != nil { + return nil, err + } + + result := args.A + args.B + return tools.ResultSuccess(fmt.Sprintf("%d", result)), nil +} + +func main() { + // Create the tool definition + addTool := tools.Tool{ + Name: "add", + Category: "math", + Description: "Add two numbers together", + Parameters: tools.MustSchemaFor[AddNumbersArgs](), + Handler: addNumbers, + } + + // Use with an agent + calculator := agent.New( + "root", + "You are a calculator. Use the add tool for arithmetic.", + agent.WithModel(llm), + agent.WithTools(addTool), + ) + // ... +} +``` + +## Streaming Responses + +Process events as they happen: + +```go +func runStreaming(ctx context.Context, rt runtime.Runtime, sess *session.Session) error { + events := rt.RunStream(ctx, sess) + + for event := range events { + switch e := event.(type) { + case *runtime.StreamStartedEvent: + fmt.Println("Stream started") + + case *runtime.AgentChoiceEvent: + // Print response chunks as they arrive + fmt.Print(e.Content) + + case *runtime.ToolCallEvent: + fmt.Printf("\n[Tool call: %s]\n", e.ToolCall.Function.Name) + + case *runtime.ToolCallConfirmationEvent: + // Auto-approve tool calls + rt.Resume(ctx, runtime.ResumeRequest{ + Type: runtime.ResumeTypeApproveSession, + }) + + case *runtime.ToolCallResponseEvent: + fmt.Printf("[Tool response: %s]\n", e.Response) + + case *runtime.StreamStoppedEvent: + fmt.Println("\nStream stopped") + + case *runtime.ErrorEvent: + return fmt.Errorf("error: %s", e.Error) + } + } + + return nil +} +``` + +## Multi-Agent Teams + +Create agents that delegate to sub-agents: + +```go +package main + +import ( + "github.com/docker/docker-agent/pkg/agent" + "github.com/docker/docker-agent/pkg/team" + "github.com/docker/docker-agent/pkg/tools/builtin" +) + +func createTeam(llm provider.Provider) *team.Team { + // Create a child agent + researcher := agent.New( + "researcher", + "You research topics thoroughly.", + agent.WithModel(llm), + agent.WithDescription("Research specialist"), + ) + + // Create root agent with sub-agents + coordinator := agent.New( + "root", + "You coordinate research tasks.", + agent.WithModel(llm), + agent.WithDescription("Team coordinator"), + agent.WithSubAgents(researcher), + agent.WithToolSets(builtin.NewTransferTaskTool()), + ) + + return team.New(team.WithAgents(coordinator, researcher)) +} +``` + +## Built-in Tools + +Use docker-agent's built-in tools: + +```go +import ( + "github.com/docker/docker-agent/pkg/config" + "github.com/docker/docker-agent/pkg/tools/builtin" +) + +func createAgentWithBuiltinTools(llm provider.Provider) *agent.Agent { + // Runtime config for tools that need it + rtConfig := &config.RuntimeConfig{ + Config: config.Config{ + WorkingDir: "/path/to/workdir", + }, + } + + return agent.New( + "root", + "You are a developer assistant.", + agent.WithModel(llm), + agent.WithToolSets( + // Shell tool for running commands + builtin.NewShellTool(os.Environ(), rtConfig), + // Filesystem tools + builtin.NewFilesystemTool(rtConfig.Config.WorkingDir), + // Think tool for reasoning + builtin.NewThinkTool(), + // Todo tool for task tracking + builtin.NewTodoTool(), + ), + ) +} +``` + +## HTTP Middleware / Transport Wrappers + +Use `options.WithHTTPTransportWrapper` to inject HTTP middleware into the transport chain of all provider clients built by docker-agent. This is useful for request tracing, injecting custom headers, collecting metrics, or any other cross-cutting concern at the HTTP layer. + +```go +import ( + "net/http" + + "github.com/docker/docker-agent/pkg/model/provider/options" +) + +type headerTransport struct { + base http.RoundTripper +} + +func (t *headerTransport) RoundTrip(req *http.Request) (*http.Response, error) { + req = req.Clone(req.Context()) + req.Header.Set("X-Request-Source", "my-app") + return t.base.RoundTrip(req) +} + +// Example: add a custom header to every outbound LLM request +wrapper := options.WithHTTPTransportWrapper( + func(base http.RoundTripper) http.RoundTripper { + return &headerTransport{base: base} + }, +) + +client, err := openai.NewClient(ctx, &latest.ModelConfig{ + Provider: "openai", + Model: "gpt-4o", +}, env, wrapper) +``` + +The wrapper receives the already-instrumented transport (OpenTelemetry, SSE decompression, Desktop proxy support) as its `base` argument, so wrapping it preserves all built-in behaviour. + +**Supported providers:** Anthropic, OpenAI, Gemini (GeminiAPI backend), Bedrock. Works in both direct and gateway/proxy mode. + +> [!WARNING] +> **Vertex AI not supported** +> +> Vertex AI uses an ADC-managed HTTP client that docker-agent cannot intercept. When a transport wrapper is set, docker-agent falls back to the GeminiAPI backend instead of Vertex AI — a debug message is logged. + +In **gateway mode** the wrapper is called on every LLM request because gateway clients are rebuilt each call for short-lived auth tokens. In **direct mode** it is called once at client construction. Rate-limit responses (HTTP 429) are classified as non-retryable by the runtime and cause the model chain to skip to the next fallback, so wrappers that track per-request outcomes will observe these as failures rather than retried calls. + +Returning `nil` from your wrapper function is not allowed; docker-agent logs a warning and keeps the original transport instead. + +## Using Different Providers + +```go +import ( + "github.com/docker/docker-agent/pkg/model/provider/anthropic" + "github.com/docker/docker-agent/pkg/model/provider/gemini" + "github.com/docker/docker-agent/pkg/model/provider/openai" +) + +// OpenAI +openaiClient, _ := openai.NewClient(ctx, &latest.ModelConfig{ + Provider: "openai", + Model: "gpt-4o", +}, env) + +// Anthropic +anthropicClient, _ := anthropic.NewClient(ctx, &latest.ModelConfig{ + Provider: "anthropic", + Model: "claude-sonnet-4-5", +}, env) + +// Google Gemini +geminiClient, _ := gemini.NewClient(ctx, &latest.ModelConfig{ + Provider: "google", + Model: "gemini-3.5-flash", +}, env) +``` + +## Session Options + +```go +import "github.com/docker/docker-agent/pkg/session" + +sess := session.New( + // Set a title for the session + session.WithTitle("Code Review Task"), + + // Add user message + session.WithUserMessage("Review this code for bugs"), + + // Limit iterations + session.WithMaxIterations(20), +) +``` + +## Error Handling + +```go +messages, err := rt.Run(ctx, sess) +if err != nil { + if errors.Is(err, context.Canceled) { + // User cancelled + log.Println("Operation cancelled") + return nil + } + if errors.Is(err, context.DeadlineExceeded) { + // Timeout + log.Println("Operation timed out") + return nil + } + // Other error + return fmt.Errorf("runtime error: %w", err) +} + +// Check for errors in the event stream +for event := range rt.RunStream(ctx, sess) { + if errEvent, ok := event.(*runtime.ErrorEvent); ok { + return fmt.Errorf("stream error: %s", errEvent.Error) + } +} +``` + +## Complete Example + +See the [examples/golibrary](https://github.com/docker/docker-agent/tree/main/examples/golibrary) directory for complete working examples: + +- `simple/` — Basic agent with no tools +- `tool/` — Custom tool implementation +- `stream/` — Streaming event handling +- `multi/` — Multi-agent with sub-agents +- `builtintool/` — Using built-in tools diff --git a/_vendor/github.com/docker/docker-agent/docs/guides/secrets/index.md b/_vendor/github.com/docker/docker-agent/docs/guides/secrets/index.md new file mode 100644 index 0000000000..1ebc7cb106 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/guides/secrets/index.md @@ -0,0 +1,271 @@ +--- +title: "Managing Secrets" +description: "How to securely provide API keys and credentials to docker-agent using environment variables, env files, Docker Compose secrets, macOS Keychain, pass, and 1Password references." +keywords: docker agent, ai agents, guides, managing secrets +weight: 30 +--- + +_How to securely provide API keys and credentials to docker-agent._ + +## Overview + +docker-agent needs API keys to talk to model providers (OpenAI, Anthropic, etc.) and MCP tool servers (GitHub, Slack, etc.). These keys are **never stored in config files**. Instead, docker-agent resolves them at runtime through a chain of secret providers, checked in order (see `pkg/environment/default.go`): + +| Priority | Provider | Description | +| --- | --- | --- | +| 1 | [Environment variables](#environment-variables) | `export OPENAI_API_KEY=sk-...` | +| 2 | [Docker Compose secrets](#docker-compose-secrets) | Files in `/run/secrets/` | +| 3 | [Credential helper](#credential-helper) | Custom command declared in `~/.config/cagent/config.yaml` under `credential_helper:` | +| 4 | [Docker Desktop](#docker-desktop) | Secrets stored by the Docker Desktop backend (no setup on a Desktop install) | +| 5 | [`pass` password manager](#pass-password-manager) | `pass insert OPENAI_API_KEY` | +| 6 | [macOS Keychain](#macos-keychain) | `security add-generic-password` | + +The first provider that has a value wins. You can mix and match — for example, use environment variables for one key and Keychain for another. + +Whatever provider returns the value, if that value looks like a [1Password secret reference](#1password-references) (it starts with `op://`), docker-agent resolves it through the `op` CLI before handing it to a model provider or tool. + +When docker-agent runs inside a Docker sandbox (detected via `SANDBOX_VM_ID`), a sandbox token provider is prepended to the chain so that `DOCKER_TOKEN` is read from a continuously-refreshed file instead of a stale environment variable. + +## Environment Variables + +The simplest approach. Set variables in your shell before running docker-agent: + +```bash +export OPENAI_API_KEY=sk-... +export ANTHROPIC_API_KEY=sk-ant-... +docker agent run agent.yaml +``` + +Common variables: + +| Variable | Provider | +| --- | --- | +| `OPENAI_API_KEY` | OpenAI | +| `ANTHROPIC_API_KEY` | Anthropic | +| `GOOGLE_API_KEY` | Google Gemini | +| `MISTRAL_API_KEY` | Mistral | +| `OPENROUTER_API_KEY` | OpenRouter | +| `XAI_API_KEY` | xAI | +| `NEBIUS_API_KEY` | Nebius | + +MCP tools may require additional variables. For example, the GitHub MCP server needs `GITHUB_PERSONAL_ACCESS_TOKEN`. These are passed to tools via the `env` field in your config: + +```yaml +toolsets: + - type: mcp + ref: docker:github-official + env: + GITHUB_PERSONAL_ACCESS_TOKEN: $GITHUB_PERSONAL_ACCESS_TOKEN +``` + +## Env Files + +For convenience, you can store secrets in a `.env` file and pass it to docker-agent with `--env-from-file`: + +```bash +# .env +OPENAI_API_KEY=sk-... +ANTHROPIC_API_KEY=sk-ant-... +GITHUB_PERSONAL_ACCESS_TOKEN=ghp_... +``` + +```bash +docker agent run agent.yaml --env-from-file .env +``` + +The file format supports: + +- `KEY=VALUE` pairs, one per line +- Comments starting with `#` +- Quoted values: `KEY="value with spaces"` +- Blank lines are ignored + +> [!IMPORTANT] +> Add `.env` to your `.gitignore` to avoid committing secrets to version control. + +## Docker Compose Secrets + +When running docker-agent in a container with Docker Compose, you can use [Compose secrets](https://docs.docker.com/compose/how-tos/use-secrets/) to inject credentials securely. Compose mounts secrets as files under `/run/secrets/`, and docker-agent reads from this location automatically. + +### From a file + +Store each secret in its own file, then reference it in `compose.yaml`: + +```bash +echo -n "sk-ant-your-key-here" > .anthropic_api_key +``` + +```yaml +# compose.yaml +services: + agent: + image: docker/docker-agent + command: run --exec /app/agent.yaml "Hello!" + secrets: + - ANTHROPIC_API_KEY + volumes: + - ./agent.yaml:/app/agent.yaml:ro + +secrets: + ANTHROPIC_API_KEY: + file: ./.anthropic_api_key +``` + +Docker Compose mounts the file as `/run/secrets/ANTHROPIC_API_KEY`. docker-agent picks it up with no extra configuration. + +### From a host environment variable + +In CI/CD pipelines, secrets are often injected as environment variables. Compose can forward these to `/run/secrets/`: + +```yaml +secrets: + ANTHROPIC_API_KEY: + environment: "ANTHROPIC_API_KEY" +``` + +### Multiple secrets + +```yaml +services: + agent: + image: docker/docker-agent + command: run --exec /app/agent.yaml "Summarize my GitHub issues" + secrets: + - ANTHROPIC_API_KEY + - GITHUB_PERSONAL_ACCESS_TOKEN + volumes: + - ./agent.yaml:/app/agent.yaml:ro + +secrets: + ANTHROPIC_API_KEY: + file: ./.anthropic_api_key + GITHUB_PERSONAL_ACCESS_TOKEN: + file: ./.github_token +``` + +### Why use Compose secrets over environment variables? + +| Aspect | Environment Variables | Compose Secrets | +| --- | --- | --- | +| Storage | In memory, visible via `docker inspect` | Mounted as tmpfs files under `/run/secrets/` | +| Visibility | Shown in process list and inspect output | Not exposed in `docker inspect` | +| Best for | Development | Production and CI/CD | + +## Credential Helper + +docker-agent can shell out to an external credential helper you define in your user config. This is useful when your organisation already has a secrets daemon you want to reuse (HashiCorp Vault, 1Password CLI, `bitwarden-cli`, etc.). + +Declare the helper in `~/.config/cagent/config.yaml`: + +```yaml +# ~/.config/cagent/config.yaml +credential_helper: + command: op + args: ["read", "op://Personal/docker-agent"] +``` + +The command is invoked with the variable name appended as the final argument, and must print the secret value to stdout. + +## Docker Desktop + +On machines where Docker Desktop is installed, docker-agent queries Docker Desktop's backend for secrets stored against your signed-in Docker account. This is transparent — no extra configuration — and it is how signed-in Docker users get provider API keys without setting any environment variables. + +## `pass` Password Manager + +docker-agent integrates with [`pass`](https://www.passwordstore.org/), the standard Unix password manager. Secrets are stored as GPG-encrypted files in `~/.password-store/`. + +### Store a secret + +```bash +pass insert ANTHROPIC_API_KEY +``` + +The entry name must match the environment variable name that docker-agent expects. + +### Verify it works + +```bash +pass show ANTHROPIC_API_KEY +``` + +Once `pass` is set up, docker-agent resolves secrets from it automatically. + +## macOS Keychain + +On macOS, docker-agent can read secrets from the system Keychain. This is useful for local development — you store the key once and it's available across all your projects. + +### Store a secret + +```bash +security add-generic-password -a "$USER" -s ANTHROPIC_API_KEY -w "sk-ant-your-key-here" +``` + +The `-s` (service name) must match the environment variable name that docker-agent expects. + +### Verify it works + +```bash +security find-generic-password -s ANTHROPIC_API_KEY -w +``` + +### Delete a secret + +```bash +security delete-generic-password -s ANTHROPIC_API_KEY +``` + +Once stored, docker-agent finds the secret automatically — no flags or config needed. + +## 1Password References + +Any secret value resolved through the chain above can be a **1Password secret reference** instead of the literal secret. If the value starts with `op://`, docker-agent resolves it by invoking the [1Password CLI](https://developer.1password.com/docs/cli/) (`op read `) and uses the result. + +This works with every provider — most commonly an environment variable or env file: + +```bash +export OPENAI_API_KEY="op://Personal/OpenAI/api-key" +docker agent run agent.yaml +``` + +References follow the `op:////` format. Make sure the `op` CLI is installed and you are signed in (`op signin`) so that non-interactive reads succeed. + +> [!WARNING] +> **Behaviour when resolution fails** +> +> If the value starts with `op://` but the `op` CLI is not installed, or the reference cannot be read (not signed in, wrong path, locked vault), docker-agent logs a warning and uses an **empty value** — it never forwards the raw `op://` reference to a model provider or tool. Resolved references (and deterministic failures) are cached for the lifetime of the run; transient failures such as a cancelled lookup are not cached, so a later attempt can retry. + +## Choosing a Method + +| Method | Best for | Setup effort | +| --- | --- | --- | +| Environment variables | Quick local development, scripts | Low | +| Env files | Team projects, multiple keys | Low | +| Docker Compose secrets | Containerized deployments, CI/CD | Medium | +| `pass` | Linux/macOS, GPG-based workflows | Medium | +| macOS Keychain | macOS local development | Low | +| 1Password references (`op://`) | Teams already using 1Password | Low | + +You can combine methods. For example, store long-lived provider keys in macOS Keychain and pass project-specific MCP tokens via env files. + +## Preventing Secret Leaks + +Provider keys live in the secret store and are passed to docker-agent through the chain above — the agent itself never receives them as input. But the **content of a conversation** can still leak credentials: a user pasting a token, a tool returning a config file with embedded keys, a transcript dumped into a prompt. + +For that defense-in-depth case, set `redact_secrets: true` on an agent. It scrubs detected secrets out of: + +- the arguments of every outgoing tool call (before the tool sees them), +- every outgoing chat message (before the model provider sees them), and +- every tool's output (before it reaches event consumers, the persisted session file, the `post_tool_use` hook input, or the next LLM call). + +```yaml +agents: + root: + model: openai/gpt-5 + description: A helpful assistant + instruction: You are a helpful assistant. + redact_secrets: true + toolsets: + - type: shell +``` + +The ruleset covers GitHub PATs, AWS / GCP / Azure credentials, Stripe / Slack / GitLab / Hugging Face tokens, JWTs, PEM-encoded private keys, Docker Hub PATs, and many others. Each detected span is replaced with the literal `[REDACTED]`. See the [Redacting Secrets](../../configuration/agents/index.md#redacting-secrets) section in the agent configuration reference for the full picture and important caveats about false negatives. diff --git a/_vendor/github.com/docker/docker-agent/docs/guides/thinking/index.md b/_vendor/github.com/docker/docker-agent/docs/guides/thinking/index.md new file mode 100644 index 0000000000..0464aece63 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/guides/thinking/index.md @@ -0,0 +1,360 @@ +--- +title: "Thinking / Reasoning" +description: "Control how much a model reasons before responding. Works across OpenAI, Anthropic, Google Gemini, AWS Bedrock, and Docker Model Runner." +keywords: docker agent, ai agents, guides, thinking / reasoning +weight: 20 +--- + +_Control how much a model reasons before responding. Works across OpenAI, Anthropic, Google Gemini, AWS Bedrock, and Docker Model Runner._ + +## What Is Thinking? + +Several modern models support an extended reasoning phase that happens before they produce visible output. During this phase the model plans, evaluates options, and works through the problem — internally, not shown in the response by default. This typically improves accuracy on complex tasks like coding, math, and multi-step planning, at the cost of higher token usage and latency. + +docker-agent exposes this through a single `thinking_budget` field on any named model. The value format differs slightly by provider, but the semantics are the same: higher effort means more thorough reasoning. + +> [!NOTE] +> **Think tool vs. thinking budget** +> +> The [think tool](../../tools/think/index.md) is a scratchpad for models that lack native reasoning. If your model supports `thinking_budget`, you do not need the think tool. + +## Quick Reference + +| Provider | Format | Values | Default | +| ------------------- | ---------- | --------------------------------------------------------------------------------------- | ------------------ | +| OpenAI | string | `minimal`, `low`, `medium`, `high`, `none`; `xhigh` on gpt-5.2+ only | `medium` (API default) | +| Anthropic | int or str | 1024–32768 tokens, or `minimal`–`max`, `adaptive`, `adaptive/`, `none` | off | +| Gemini 2.5 | int | `0` (off), `-1` (dynamic), or token count (max 24576 / 32768) | `-1` (dynamic) | +| Gemini 3 | string | `minimal`, `low`, `medium`, `high` | API default (model-dependent) | +| AWS Bedrock | int or str | 1024–32768 tokens (`minimal`–`max` mapped to tokens); `adaptive`, `adaptive/` for Opus 4.6+ (rejected by older Claude models) | off | +| Docker Model Runner | int or str | token count, `minimal`–`max` (mapped to tokens), `adaptive` (unlimited), `none` | engine default | + +String values are case-insensitive. The full set of accepted strings is `none`, `minimal`, `low`, `medium`, `high`, `xhigh`, `max`, `adaptive`, and `adaptive/` — but each provider only honors the subset listed above. Unsupported values either fail at request time (OpenAI) or are mapped/ignored as described per provider below. + +> `thinking_budget` is only applied by the providers listed above. Other OpenAI-compatible providers (xAI, Mistral, Ollama, …) currently ignore it — see [xAI and Mistral](#xai-grok-and-mistral). + +## OpenAI + +OpenAI reasoning models (o-series, gpt-5, gpt-5-mini) use a string effort level that maps to their `reasoning_effort` API parameter. The `xhigh` level is only accepted by gpt-5.2 and later minor versions; o-series and earlier gpt-5 releases top out at `high`. + +```yaml +models: + gpt-thinker: + provider: openai + model: gpt-5-mini + thinking_budget: high # minimal | low | medium | high | xhigh +``` + +**Effort levels:** + +| Level | Description | +| --------- | -------------------------------------------------------- | +| `none` | Don't request extra reasoning (alias for `0`); the API's own default still applies. | +| `minimal` | Fastest; lightest reasoning pass. | +| `low` | Quick reasoning for straightforward tasks. | +| `medium` | Balanced default. | +| `high` | More thorough; recommended for complex tasks. | +| `xhigh` | Near-maximum effort; slower but most accurate. | + +These effort levels (`minimal`–`xhigh`) are the **only** values accepted for OpenAI. Token counts, `max`, `adaptive`, and `adaptive/` are rejected with a configuration error at request time. The `xhigh` level is only supported by gpt-5.2 and later minor versions (e.g. gpt-5.2, gpt-5.4-mini); o-series and earlier gpt-5 releases top out at `high`. Older models (o1, o3-mini) only accept `low`/`medium`/`high` — sending an unsupported level returns an API error. + +> [!WARNING] +> **Tokens and max_tokens** +> +> OpenAI reasoning models always reason internally — even with `thinking_budget: none` there are hidden reasoning tokens that count against `max_tokens`. docker-agent automatically raises the output-token floor for its internal low-effort calls (e.g. title generation) so hidden reasoning cannot starve visible text output. + +## Anthropic + +Anthropic Claude supports two thinking modes: a **token budget** (older models) and **adaptive / effort-based** thinking (newer models). + +### Token budget (Claude 4 and earlier) + +Set an explicit number of thinking tokens (1024–32768). This must be less than `max_tokens`: + +```yaml +models: + claude-thinker: + provider: anthropic + model: claude-sonnet-4-5 + thinking_budget: 16384 # tokens reserved for internal reasoning +``` + +docker-agent auto-adjusts `max_tokens` when you set a thinking budget but leave `max_tokens` at its default. If you set `max_tokens` explicitly, it must be greater than `thinking_budget`. + +### Adaptive thinking (Opus 4.6+ and Sonnet 4.6) + +Newer Claude models support adaptive thinking, where the model decides how much to think. **Claude Opus 4.6, 4.7, 4.8, and Sonnet 4.6 only support adaptive thinking** — they reject token-based budgets. Use `adaptive`, `adaptive/`, or a bare effort level — on Anthropic, a bare effort level like `high` is shorthand for adaptive thinking at that effort: + +```yaml +models: + claude-adaptive: + provider: anthropic + model: claude-opus-4-6 + thinking_budget: adaptive # model decides effort (defaults to high) + + claude-adaptive-low: + provider: anthropic + model: claude-opus-4-6 + thinking_budget: low # same as adaptive/low + + claude-adaptive-max: + provider: anthropic + model: claude-opus-4-6 + thinking_budget: adaptive/max # adaptive/low | adaptive/medium | adaptive/high | adaptive/xhigh | adaptive/max +``` + +**Adaptive effort levels and per-model support:** + +| Level | Opus 4.5 | Sonnet 4.5 / Haiku | Sonnet 4.6 | Opus 4.6 | Opus 4.7 / 4.8 | Fable 5 | Mythos 5 | Mythos preview | +| --------- | :------: | :----------------: | :--------: | :------: | :------------: | :-----: | :------: | :------------: | +| `low` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| `medium` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| `high` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| `xhigh` | — | — | — | — | ✓ | ✓ | ✓ | — | +| `max` | — | — | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | + +`minimal` is treated as `low` (bare form only). `high` is the default when `adaptive` is used without an effort level. + +> [!WARNING] +> **Effort strings require adaptive-capable models** +> +> Every string effort value on Anthropic is sent as adaptive thinking (`output_config.effort`), which only newer Claude models (Opus 4.6+, Sonnet 4.6) accept. For older models like Sonnet 4.5, use an integer token budget instead. Conversely, models that _only_ support adaptive thinking (Opus 4.6, 4.7, 4.8, Sonnet 4.6) automatically have token budgets coerced to `adaptive` (a warning is logged). + +### Disabling thinking + +```yaml +thinking_budget: none # or 0 +``` + +### Interleaved thinking + +Interleaved thinking lets the model reason between tool calls — useful for complex agentic tasks. docker-agent auto-enables it whenever a thinking budget is configured on a Claude model, so you only need to set it explicitly to turn it off: + +```yaml +models: + claude-interleaved: + provider: anthropic + model: claude-sonnet-4-5 + thinking_budget: 16384 + # interleaved_thinking is auto-enabled; disable it explicitly if needed: + provider_opts: + interleaved_thinking: false +``` + +> [!NOTE] +> **Temperature and top_p** +> +> When extended thinking is enabled, Anthropic requires `temperature=1.0`. docker-agent automatically suppresses any `temperature` or `top_p` settings you have configured — they are silently ignored while thinking is active. + +### Thinking display + +Newer Claude models (Opus 4.7+, Fable 5) hide thinking content by default at the API level. To keep reasoning visible, docker-agent requests `summarized` thinking whenever adaptive/effort-based thinking is used without an explicit `thinking_display`. Use `thinking_display` in `provider_opts` to override: + +```yaml +models: + opus-47: + provider: anthropic + model: claude-opus-4-7 + thinking_budget: adaptive + provider_opts: + thinking_display: omitted # summarized | display | omitted +``` + +| Value | Behavior | +| ------------ | ------------------------------------------------------------------------------------- | +| `summarized` | Thinking blocks returned with a text summary (docker-agent default for adaptive thinking). | +| `display` | Full thinking blocks returned for display. | +| `omitted` | Thinking blocks hidden — only the signature is returned. | + +Full thinking tokens are billed regardless of `thinking_display`. + +### Task budget (Anthropic) + +`task_budget` caps total tokens across an entire multi-step agentic task (thinking + tool calls + output combined): + +```yaml +models: + opus-bounded: + provider: anthropic + model: claude-opus-4-7 + thinking_budget: adaptive + task_budget: 128000 # total token ceiling for the whole task +``` + +See the [Anthropic provider page](../../providers/anthropic/index.md#task-budget) for details. + +## Google Gemini + +Gemini 2.5 and Gemini 3 use different formats. + +### Gemini 2.5 (token budget) + +```yaml +models: + gemini-off: + provider: google + model: gemini-2.5-flash + thinking_budget: 0 # disable thinking + + gemini-dynamic: + provider: google + model: gemini-2.5-flash + thinking_budget: -1 # let the model decide (default) + + gemini-fixed: + provider: google + model: gemini-2.5-flash + thinking_budget: 8192 # fixed token budget (max 24576 for Flash, 32768 for Pro) +``` + +### Gemini 3 (level-based) + +```yaml +models: + gemini3-flash: + provider: google + model: gemini-3-flash + thinking_budget: medium # minimal | low | medium | high + + gemini3-pro: + provider: google + model: gemini-3-pro + thinking_budget: high # low | high (Pro supports fewer levels) +``` + +## AWS Bedrock (Claude) + +Bedrock Claude uses a token budget like Anthropic. String effort levels (`minimal`–`max`) are mapped automatically: + +| Effort level | Token budget | +| ------------ | ------------ | +| `minimal` | 1,024 | +| `low` | 2,048 | +| `medium` | 8,192 | +| `high` | 16,384 | +| `xhigh`/`max`| 32,768 | + +```yaml +models: + bedrock-claude-thinker: + provider: amazon-bedrock + model: global.anthropic.claude-sonnet-4-5-20250929-v1:0 + thinking_budget: 8192 # or use an effort level: medium + provider_opts: + region: us-east-1 + + bedrock-claude-interleaved: + provider: amazon-bedrock + model: global.anthropic.claude-sonnet-4-5-20250929-v1:0 + thinking_budget: high + provider_opts: + region: us-east-1 + # interleaved_thinking is auto-enabled when thinking_budget is set +``` + +**Claude Opus 4.6+ on Bedrock requires adaptive thinking** — these models reject `thinking.type=enabled` (token budgets). Configure them with `adaptive` or `adaptive/`; docker-agent auto-coerces token budgets and effort levels on these models with a warning: + +```yaml +models: + bedrock-opus-adaptive: + provider: amazon-bedrock + model: global.anthropic.claude-opus-4-8 + thinking_budget: adaptive/high + provider_opts: + region: us-east-1 +``` + +> [!WARNING] +> **Bedrock thinking requirements** +> +> Bedrock Claude requires token-based `thinking_budget` values to be ≥ 1024 and less than `max_tokens`. docker-agent logs a warning and ignores the budget if either condition is violated. Interleaved thinking requires the `interleaved-thinking-2025-05-14` beta header, which docker-agent adds automatically; it is auto-enabled whenever a token thinking budget is set on a Bedrock-hosted Claude model (adaptive thinking interleaves on its own). + +## Docker Model Runner (local models) + +For local models, `thinking_budget` is forwarded to the inference engine. Both token counts and effort strings work; effort strings map to the same token scale as Bedrock (`minimal`=1024 … `xhigh`/`max`=32768), and `adaptive` means unlimited: + +```yaml +models: + local: + provider: dmr + model: ai/qwen3 + thinking_budget: medium # llama.cpp: reasoning-budget=8192; vLLM: thinking_token_budget=8192 +``` + +- **llama.cpp**: sent as `reasoning-budget` at model-configure time. +- **vLLM**: sent as `thinking_token_budget` on each request. +- **MLX / SGLang**: no reasoning-budget knob; the value is silently ignored. + +See the [Docker Model Runner provider page](../../providers/dmr/index.md) for details. + +## xAI (Grok) and Mistral + +xAI and Mistral run through docker-agent's OpenAI-compatible client, but the `reasoning_effort` parameter is only sent for OpenAI reasoning model names (o-series, gpt-5). **Setting `thinking_budget` on Grok or Mistral models currently has no effect** — the value is accepted by config validation but never sent to the API. + +Grok and Mistral reasoning models (e.g. `grok-3-mini`, `magistral`) manage reasoning on their own; for non-reasoning models, consider the [think tool](../../tools/think/index.md) instead. + +## Disabling Thinking + +Use `none` or `0` to disable thinking on any provider: + +```yaml +models: + fast-model: + provider: openai + model: gpt-5-mini + thinking_budget: none + + gemini-no-think: + provider: google + model: gemini-2.5-flash + thinking_budget: 0 +``` + +`none` and `0` clear docker-agent's thinking configuration — no thinking parameter is sent. Models that always reason (OpenAI o-series, gpt-5, Gemini 3) then fall back to the API's default behavior and still reason internally; only models with optional thinking (Gemini 2.5, Claude, local models) are fully disabled. + +## Choosing an Effort Level + +| Task complexity | Recommended level | +| -------------------------------- | ----------------------- | +| Simple factual Q&A | `none` / `minimal` | +| General-purpose chat | `low` / `medium` | +| Coding, debugging, analysis | `medium` / `high` | +| Complex reasoning, planning | `high` / `xhigh` | +| Research, difficult math/logic | `xhigh` / `max` | +| Long agentic tasks (Anthropic) | `adaptive` | + +## Changing Thinking Level at Runtime + +While running in the TUI, press **Shift+Tab** to cycle the thinking effort level for the current model without editing your YAML config, or type `/effort ` to jump straight to a specific level (e.g. `/effort high`): + +- The level steps through the model's supported range (model-specific), wrapping around — for example `none → minimal → low → medium → high → none` on OpenAI gpt-5/o-series, `none → minimal → low → medium → high → xhigh → none` on gpt-5.2+, `none → low → medium → high → max → none` on Anthropic Opus 4.6 and Sonnet 4.6, and `none → low → medium → high → xhigh → max → none` on Anthropic Opus 4.7+, Fable 5, and Mythos 5. For older Anthropic models (e.g. Sonnet 4.5) that only accept token budgets, effort-string cycling has no effect — use an integer `thinking_budget` in your YAML config instead. +- The current level is shown in the sidebar next to the model name (e.g. `openai/gpt-5 • high`). +- This applies as a session override — it is **not** saved to the config file. The next session starts from the level defined in your YAML. +- For models that don't support reasoning, and for remote runtimes, Shift+Tab is a no-op and an informational message is displayed. +- `/effort` only accepts levels the current model supports; requesting an unsupported level shows the model's supported list. Like Shift+Tab, it is unavailable for non-reasoning models and remote runtimes. + +## Sharing Thinking Config Across Models + +Define a provider with a default `thinking_budget` and all models that reference it inherit it: + +```yaml +providers: + deep-anthropic: + provider: anthropic + thinking_budget: adaptive/high + max_tokens: 32768 + +models: + claude-smart: + provider: deep-anthropic + model: claude-opus-4-6 # inherits thinking_budget: adaptive/high + + claude-faster: + provider: deep-anthropic + model: claude-opus-4-6 + thinking_budget: low # overrides to adaptive/low +``` + +## Full Example + +See [`examples/thinking_budget.yaml`](https://github.com/docker/docker-agent/blob/main/examples/thinking_budget.yaml) for a runnable config covering all providers. diff --git a/_vendor/github.com/docker/docker-agent/docs/guides/tips/index.md b/_vendor/github.com/docker/docker-agent/docs/guides/tips/index.md new file mode 100644 index 0000000000..b51de422dc --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/guides/tips/index.md @@ -0,0 +1,423 @@ +--- +title: "Tips & Best Practices" +description: "Expert guidance for building effective, efficient, and secure agents." +keywords: docker agent, ai agents, guides, tips & best practices +weight: 10 +aliases: + - /ai/docker-agent/best-practices/ +--- + +_Expert guidance for building effective, efficient, and secure agents._ + +## Configuration Tips + +### Auto Mode for Quick Start + +Don't have a config file? docker-agent can automatically detect your available API keys and use an appropriate model: + +```bash +# Automatically uses the best available provider +$ docker agent run + +# Provider priority: Anthropic → OpenAI → Google → Mistral → Amazon Bedrock → DMR +``` + +The special `auto` model value also works in configs: + +```yaml +agents: + root: + model: auto # Uses best available provider + description: Adaptive assistant + instruction: You are a helpful assistant. +``` + +### Environment Variable Interpolation + +Commands support JavaScript template literal syntax for environment variables: + +```yaml +agents: + root: + model: openai/gpt-4o + description: Deployment assistant + instruction: You help with deployments. + commands: + # Simple variable + greet: "Hello ${env.USER}!" + + # With default value + deploy: "Deploy to ${env.ENV || 'staging'}" + + # Multiple variables + release: "Release ${env.PROJECT} v${env.VERSION || '1.0.0'}" +``` + +### Model Aliases Are Auto-Pinned + +docker-agent automatically resolves model aliases to their latest pinned versions. This ensures reproducible behavior: + +```yaml +# You write: +model: anthropic/claude-sonnet-4-5 + +# docker-agent resolves to: +# anthropic/claude-sonnet-4-5-20250929 (or latest available) +``` + +To use a specific version, specify it explicitly in your config. + +## Performance Tips + +### Defer Tools for Faster Startup + +Large MCP toolsets can slow down agent startup. Use `defer` to load tools on-demand: + +```yaml +agents: + root: + model: openai/gpt-4o + description: Multi-tool assistant + instruction: You have many tools available. + toolsets: + - type: mcp + ref: docker:github-official + defer: true + - type: mcp + ref: docker:slack + defer: true + - type: mcp + ref: docker:linear + defer: true +``` + +Or defer specific tools within a toolset: + +```yaml +toolsets: + - type: mcp + ref: docker:github-official + defer: + - "list_issues" + - "search_repos" + - type: mcp + ref: docker:slack + defer: + - "list_channels" +``` + +### Filter MCP Tools + +Many MCP servers expose dozens of tools. Filter to only what you need: + +```yaml +toolsets: + - type: mcp + ref: docker:github-official + # Only expose these specific tools + tools: + - list_issues + - create_issue + - get_pull_request + - create_pull_request +``` + +Fewer tools means faster tool selection and less confusion for the model. + +### Set max_iterations + +Always set `max_iterations` for agents with powerful tools to prevent infinite loops: + +```yaml +agents: + developer: + model: anthropic/claude-sonnet-4-5 + description: Development assistant + instruction: You are a developer. + max_iterations: 30 # Reasonable limit for development tasks + toolsets: + - type: filesystem + - type: shell +``` + +Typical values: 20-30 for development agents, 10-15 for simple tasks. + +## Reliability Tips + +### Use Fallback Models + +Configure fallback models for resilience against provider outages or rate limits: + +```yaml +agents: + root: + model: anthropic/claude-sonnet-4-5 + description: Reliable assistant + instruction: You are a helpful assistant. + fallback: + models: + # Different provider for resilience + - openai/gpt-4o + # Cheaper model as last resort + - openai/gpt-4o-mini + retries: 2 # Retry 5xx errors twice + cooldown: 1m # Stick with fallback for 1 min after rate limit +``` + +**Best practices for fallback chains:** + +- Use different providers for true redundancy +- Order by preference (best first) +- Include a cheaper/faster model as last resort + +### Use Think Tool for Non-Reasoning Models + +The `think` tool provides a reasoning scratchpad for models that lack built-in thinking capabilities: + +```yaml +toolsets: + - type: think # Useful for models without native reasoning +``` + +The agent uses it as a scratchpad for planning and decision-making. If your model already supports a [thinking budget](../../configuration/models/index.md#thinking-budget) (e.g., Claude with extended thinking, OpenAI o-series, Gemini with thinking enabled), you don't need this tool — the model can reason internally. + +## Security Tips + +### Use --yolo Mode Carefully + +The `--yolo` flag auto-approves all tool calls without confirmation: + +```bash +# Auto-approve everything (use with caution!) +$ docker agent run agent.yaml --yolo +``` + +**When it's appropriate:** + +- CI/CD pipelines with controlled inputs +- Automated testing +- Agents with only safe, read-only tools + +**When to avoid:** + +- Interactive sessions with untested prompts +- Agents with shell or filesystem write access +- Any situation where unreviewed actions could cause harm + +### Combine Permissions with Sandbox + +For defense in depth, use both permissions and [sandbox mode](../../configuration/sandbox/index.md): + +```yaml +agents: + secure_dev: + model: anthropic/claude-sonnet-4-5 + description: Secure development assistant + instruction: You are a secure coding assistant. + toolsets: + - type: filesystem + - type: shell + +permissions: + allow: + - "read_*" + - "shell:cmd=go*" + - "shell:cmd=npm*" + deny: + - "shell:cmd=sudo*" + - "shell:cmd=rm*-rf*" +``` + +```bash +# Run with sandbox enabled +docker-agent run --sandbox agent.yaml +``` + +### Set Global Permission Guardrails + +Use [global permissions](../../configuration/permissions/index.md#global-permissions) in your user config to enforce safety rules across every agent: + +```yaml +# ~/.config/cagent/config.yaml +settings: + permissions: + deny: + - "shell:cmd=sudo*" + - "shell:cmd=rm*-rf*" + - "shell:cmd=git push --force*" + allow: + - "read_*" + - "shell:cmd=ls*" + - "shell:cmd=cat*" +``` + +These rules merge with any agent-level permissions. Deny patterns from your global config cannot be overridden by agent configs, so you can trust that dangerous commands stay blocked regardless of which agent you run. + +### Use Hooks for Audit Logging + +Log all tool calls for compliance or debugging: + +```yaml +agents: + audited: + model: openai/gpt-4o + description: Audited assistant + instruction: You are a helpful assistant. + hooks: + post_tool_use: + - matcher: "*" + hooks: + - type: command + command: "./scripts/audit-log.sh" +``` + +## Multi-Agent Tips + +### Handoffs vs Sub-Agents + +Understand the difference between `sub_agents` and `handoffs`: + +- **`sub_agents` (transfer_task)** — delegates a task to a child in a sub-session, waits for the result, then continues. Hierarchical: the parent remains in control. + + ```yaml + sub_agents: [researcher, writer] + ``` + +- **`handoffs` (peer-to-peer)** — hands off the entire conversation to another agent in the same session. The active agent switches and sees the full history. Agents can form cycles. + + ```yaml + handoffs: + - specialist + - summarizer + ``` + +See [Multi-Agent Systems](../../concepts/multi-agent/index.md) for a detailed comparison. + +### Give Sub-Agents Clear Descriptions + +The root agent uses descriptions to decide which sub-agent to delegate to: + +```yaml +agents: + root: + model: anthropic/claude-sonnet-4-5 + description: Technical lead + instruction: Delegate to specialists based on the task. + sub_agents: [frontend, backend, devops] + + frontend: + model: openai/gpt-4o + # Good: specific and actionable + description: | + Frontend specialist. Handles React, TypeScript, CSS, + UI components, and browser-related issues. + + backend: + model: openai/gpt-4o + # Good: clear domain boundaries + description: | + Backend specialist. Handles APIs, databases, + server logic, and Go/Python code. + + devops: + model: openai/gpt-4o + description: | + DevOps specialist. Handles CI/CD, Docker, Kubernetes, + infrastructure, and deployment pipelines. +``` + +## Debugging Tips + +### Enable Debug Logging + +Use the `--debug` flag to see detailed execution logs: + +```bash +# Default log location: ~/.cagent/cagent.debug.log +$ docker agent run agent.yaml --debug + +# Custom log location +$ docker agent run agent.yaml --debug --log-file ./debug.log +``` + +### Check Token Usage + +Use the `/cost` command during a session to see token consumption: + +```text +/cost + +Token Usage: + Input: 12,456 tokens + Output: 3,789 tokens + Total: 16,245 tokens +``` + +### Compact Long Sessions + +If a session gets too long, use `/compact` to summarize and reduce context: + +```text +/compact + +Session compacted. Summary generated and history trimmed. +``` + +## More Tips + +### User-Defined Default Model + +Set your preferred default model in `~/.config/cagent/config.yaml`: + +```yaml +settings: + default_model: anthropic/claude-sonnet-4-5 +``` + +This model is used when you run `docker agent run` without a config file. + +### GitHub PR Reviewer Example + +Use docker-agent as a GitHub Actions PR reviewer: + +```yaml +# .github/workflows/pr-review.yml +name: PR Review +on: + pull_request: + types: [opened, synchronize] + +jobs: + review: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Run docker-agent review + env: + ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + # Install docker-agent + curl -fsSL https://get.docker-agent.dev | sh + + # Run the review + docker agent run --exec reviewer.yaml --yolo \ + "Review PR #${{ github.event.pull_request.number }}" +``` + +With a simple reviewer agent: + +```yaml +# reviewer.yaml +agents: + root: + model: anthropic/claude-sonnet-4-5 + description: PR reviewer + instruction: | + Review pull requests for code quality, bugs, and security issues. + Be constructive and specific in your feedback. + toolsets: + - type: mcp + ref: docker:github-official + - type: think +``` diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/_index.md b/_vendor/github.com/docker/docker-agent/docs/providers/_index.md new file mode 100644 index 0000000000..22c440cfe7 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/_index.md @@ -0,0 +1,5 @@ +--- +title: "Model Providers" +description: "Model providers supported by Docker Agent." +weight: 60 +--- diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/anthropic/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/anthropic/index.md new file mode 100644 index 0000000000..c9d8107fde --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/anthropic/index.md @@ -0,0 +1,239 @@ +--- +title: "Anthropic" +description: "Use Claude Sonnet 4, Claude Sonnet 4.5, and other Anthropic models with docker-agent." +keywords: docker agent, ai agents, model providers, llm, anthropic +weight: 20 +--- + +_Use Claude Sonnet 4, Claude Sonnet 4.5, and other Anthropic models with docker-agent._ + +## Setup + +```bash +# Set your API key +export ANTHROPIC_API_KEY="sk-ant-..." +``` + +### Workload Identity Federation (no API key) + +Authenticate with short-lived tokens minted from your own OIDC identity +provider instead of a long-lived API key. See Anthropic's +[Workload Identity Federation guide](https://platform.claude.com/docs/en/build-with-claude/workload-identity-federation) +to provision a Federation Rule, then configure docker-agent with a typed +`auth:` block: + +```yaml +providers: + anthropic-wif: + provider: anthropic + auth: + type: workload_identity_federation + workload_identity_federation: + federation_rule_id: fdrl_REPLACE_ME + organization_id: 00000000-0000-0000-0000-000000000000 + # Optional: only required for target_type=SERVICE_ACCOUNT rules. + service_account_id: svac_REPLACE_ME + identity_token: + # Pick exactly one of: file, env, command, url + file: /var/run/secrets/anthropic.com/token + +models: + claude: + provider: anthropic-wif + model: claude-sonnet-4-5 +``` + +`identity_token` accepts four mutually exclusive sources: + +| Source | When to use | +| --------- | ------------------------------------------------------------------------------------------------------------------------ | +| `file` | Kubernetes projected service-account tokens, SPIFFE/SPIRE helpers, Vault sidecars — anything that rotates a file on disk | +| `env` | The token is already exported in an environment variable | +| `command` | Shell out to a CLI on every refresh (`gcloud auth print-identity-token`, `az account get-access-token`, ...) | +| `url` | Fetch from an HTTP(S) endpoint (cloud metadata servers, GitHub Actions OIDC token URL, ...) | + +For `url`, both the URL and any header values support `${env.VAR}` expansion +against the runtime environment (the legacy `${VAR}` form is also accepted), +which lets you wire the GitHub Actions OIDC +token endpoint without putting secrets in YAML: + +```yaml +identity_token: + url: ${env.ACTIONS_ID_TOKEN_REQUEST_URL}&audience=https://api.anthropic.com + headers: + Authorization: bearer ${env.ACTIONS_ID_TOKEN_REQUEST_TOKEN} + response_field: value +``` + +`auth:` is mutually exclusive with `--gateway`. Token-refresh failures are +surfaced through the normal error path with a clear `anthropic workload +identity federation: failed to refresh identity token from source +(federation_rule=fdrl_…): ...` message in the TUI. + +A complete walkthrough of all four sources lives in +[`examples/anthropic_wif.yaml`](https://github.com/docker/docker-agent/blob/main/examples/anthropic_wif.yaml). + +## Configuration + +### Inline + +```yaml +agents: + root: + model: anthropic/claude-sonnet-4-5 +``` + +### Named Model + +```yaml +models: + claude: + provider: anthropic + model: claude-sonnet-4-5 + max_tokens: 64000 +``` + +## Available Models + +| Model ID | Description | +| ------------------- | --------------------------------------------------- | +| `claude-opus-4-7` | Highest-capability Opus model; supports task budget | +| `claude-sonnet-4-5` | Most capable Sonnet; supports extended thinking | +| `claude-sonnet-4-0` | Previous Sonnet generation, still supported | +| `claude-haiku-4-5` | Fast and inexpensive, good for tight loops | + +## Thinking Budget + +Anthropic accepts either an integer token budget or a string effort value. Thinking is off unless you set `thinking_budget`; when set, interleaved thinking is auto-enabled. + +**Token budget** (1024–32768; works on all extended-thinking Claude models): + +```yaml +models: + claude-deep: + provider: anthropic + model: claude-sonnet-4-5 + thinking_budget: 16384 # must be < max_tokens +``` + +**Adaptive / effort-based** (Claude Opus 4.6+, Sonnet 4.6 — every string value is sent as adaptive thinking via `output_config.effort`): + +```yaml +models: + opus-adaptive: + provider: anthropic + model: claude-opus-4-6 + thinking_budget: adaptive # model decides effort (defaults to high) + + opus-effort: + provider: anthropic + model: claude-opus-4-6 + thinking_budget: high # low | medium | high | xhigh | max (same as adaptive/) +``` + +On models that reject token-based thinking (Opus 4.6, 4.7, 4.8, Sonnet 4.6), an integer budget is automatically coerced to `adaptive` with a logged warning. See the [Thinking / Reasoning guide](../../guides/thinking/index.md) for the full cross-provider reference. + +## Interleaved Thinking + +Auto-enabled whenever a thinking budget is configured on a Claude model. Allows tool calls during model reasoning for more integrated problem-solving: + +```yaml +models: + claude: + provider: anthropic + model: claude-sonnet-4-5 + provider_opts: + interleaved_thinking: false # disable if needed +``` + +## Task Budget + +`task_budget` caps the **total** number of tokens the model may spend across a +multi-step agentic task — combined thinking, tool calls, and final output. It +is forwarded as +[`output_config.task_budget`](https://platform.claude.com/docs/en/about-claude/models/whats-new-claude-4-7) +and is ideal for letting long-running agents self-regulate effort without +tightening `max_tokens` on every call. + +docker-agent automatically attaches the required `task-budgets-2026-03-13` +beta header whenever this field is set. You can configure `task_budget` on +**any** Claude model — docker-agent never gates it by model name. At the time +of writing, only **Claude Opus 4.7** actually honors the field; other Claude +models (Sonnet 4.5, Opus 4.5 / 4.6, etc.) are expected to reject requests +that include it. Check the Anthropic release notes linked above for the +current list of supported models. + +```yaml +models: + opus: + provider: anthropic + model: claude-opus-4-7 + task_budget: 128000 # integer shorthand → { type: tokens, total: 128000 } + thinking_budget: adaptive +``` + +Object form (forward-compatible with future budget types): + +```yaml + opus: + provider: anthropic + model: claude-opus-4-7 + task_budget: + type: tokens + total: 128000 +``` + +See the full schema on the [Model Configuration](../../configuration/models/index.md#task-budget) page. + +## Server-Side Fallbacks + +When the primary model refuses a request (e.g. Claude Fable 5's safety +classifiers ending the turn with stop reason `refusal`), Anthropic can retry +the request with backup models in a single round trip. Set `fallbacks` in +`provider_opts` to a list of model IDs, in priority order: + +```yaml +models: + fable: + provider: anthropic + model: claude-fable-5 + provider_opts: + fallbacks: + - claude-opus-4-8 + - claude-sonnet-4-6 +``` + +docker-agent automatically attaches the required +`server-side-fallback-2026-06-01` beta header and forwards the option as +`fallbacks: [{"model": "..."}]`. The response's `model` field reports which +model actually served the request. + +Fallback models receive the exact same request as the primary model +(thinking configuration, task budget, beta features, ...), so list only +models that accept the same request shape. Not available on Bedrock, Vertex +AI, or the Message Batches API. + +## Thinking Display + +Controls whether thinking blocks are returned in responses when thinking is enabled. Newer Claude models (Opus 4.7+, Fable 5) hide thinking content by default (`omitted`); docker-agent counters this by requesting `summarized` thinking whenever an adaptive/effort-based budget is used without an explicit `thinking_display`, so reasoning stays visible in the UI. Set `thinking_display` in `provider_opts` to override: + +```yaml +models: + claude-opus-4-7: + provider: anthropic + model: claude-opus-4-7 + thinking_budget: adaptive + provider_opts: + thinking_display: omitted # "summarized", "display", or "omitted" +``` + +Valid values: + +- `summarized`: thinking blocks are returned with summarized thinking text (docker-agent's default for adaptive/effort-based budgets). +- `display`: thinking blocks are returned for display. +- `omitted`: thinking blocks are returned with an empty thinking field; the signature is still returned for multi-turn continuity. Useful to reduce time-to-first-text-token when streaming. + +Note: `thinking_display` applies to both `thinking_budget` with token counts and adaptive/effort-based budgets. For token-count budgets no default is applied (the API already defaults to `summarized`). Full thinking tokens are billed regardless of the `thinking_display` value. + +> [!NOTE] +> Anthropic thinking budget values below 1024 or greater than or equal to `max_tokens` are ignored (a warning is logged). diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/baseten/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/baseten/index.md new file mode 100644 index 0000000000..38c36a1811 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/baseten/index.md @@ -0,0 +1,90 @@ +--- +title: "Baseten" +description: "Use Baseten AI models with docker-agent." +keywords: docker agent, ai agents, model providers, llm, baseten +weight: 40 +--- + +_Use Baseten AI models with docker-agent._ + +## Overview + +Baseten provides AI models through an OpenAI-compatible API. docker-agent includes built-in support for Baseten as an alias provider. + +## Setup + +1. Get an API key from [Baseten](https://www.baseten.co/) +2. Set the environment variable: + + ```bash + export BASETEN_API_KEY=your-api-key + ``` + +## Usage + +### Inline Syntax + +The simplest way to use Baseten: + +```yaml +agents: + root: + model: baseten/deepseek-ai/DeepSeek-V3.1 + description: Assistant using Baseten + instruction: You are a helpful assistant. +``` + +### Named Model + +For more control over parameters: + +```yaml +models: + baseten_model: + provider: baseten + model: deepseek-ai/DeepSeek-V3.1 + temperature: 0.7 + max_tokens: 8192 + +agents: + root: + model: baseten_model + description: Assistant using Baseten + instruction: You are a helpful assistant. +``` + +## Available Models + +Baseten hosts various open models through its Model APIs. Check the [Baseten documentation](https://docs.baseten.co/) for the current model catalog. + +| Model | Description | +| ------------------------------ | ------------------------------ | +| `deepseek-ai/DeepSeek-V3.1` | DeepSeek V3.1 model | +| `moonshotai/Kimi-K2.5` | Moonshot Kimi K2.5 model | +| `openai/gpt-oss-120b` | GPT-OSS 120B model | +| `zai-org/GLM-5` | GLM-5 model | + +## How It Works + +Baseten is implemented as a built-in alias in docker-agent: + +- **API Type:** OpenAI-compatible (`openai_chatcompletions`) +- **Base URL:** `https://inference.baseten.co/v1` +- **Token Variable:** `BASETEN_API_KEY` + +## Example: Code Assistant + +```yaml +agents: + coder: + model: baseten/deepseek-ai/DeepSeek-V3.1 + description: Code assistant using DeepSeek + instruction: | + You are an expert programmer using DeepSeek V3.1. + Write clean, well-documented code. + Follow best practices for the language being used. + toolsets: + - type: filesystem + - type: shell + - type: think +``` diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/bedrock/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/bedrock/index.md new file mode 100644 index 0000000000..1641bf4866 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/bedrock/index.md @@ -0,0 +1,174 @@ +--- +title: "AWS Bedrock" +description: "Access Claude, Nova, Llama, and more through AWS infrastructure with enterprise-grade security and compliance." +keywords: docker agent, ai agents, model providers, llm, aws bedrock +weight: 30 +--- + +_Access Claude, Nova, Llama, and more through AWS infrastructure with enterprise-grade security and compliance._ + +## Prerequisites + +- AWS account with Bedrock enabled in your region +- Model access granted in the [Bedrock Console](https://console.aws.amazon.com/bedrock/) (some models require approval) +- AWS credentials configured (see authentication below) + +## Configuration + +```yaml +models: + bedrock-claude: + provider: amazon-bedrock + model: global.anthropic.claude-sonnet-4-5-20250929-v1:0 + max_tokens: 64000 + provider_opts: + region: us-east-1 +``` + +## Authentication + +### Option 1: Bedrock API Key (Simplest) + +```bash +export AWS_BEARER_TOKEN_BEDROCK="your-key" +``` + +```yaml +models: + bedrock: + provider: amazon-bedrock + model: global.anthropic.claude-sonnet-4-5-20250929-v1:0 + token_key: AWS_BEARER_TOKEN_BEDROCK # env var name + provider_opts: + region: us-east-1 +``` + +### Option 2: AWS Credentials (Default) + +Uses the standard AWS SDK credential chain: env vars → shared credentials → config → IAM roles. + +```yaml +models: + bedrock: + provider: amazon-bedrock + model: global.anthropic.claude-sonnet-4-5-20250929-v1:0 + provider_opts: + profile: my-aws-profile + region: us-east-1 +``` + +### With IAM Role Assumption + +```yaml +models: + bedrock: + provider: amazon-bedrock + model: global.anthropic.claude-sonnet-4-5-20250929-v1:0 + provider_opts: + role_arn: "arn:aws:iam::123456789012:role/BedrockAccessRole" + external_id: "my-external-id" +``` + +## Provider Options + +| Option | Type | Default | Description | +| ------------------------ | ------ | ---------------------- | ------------------------------------ | +| `region` | string | us-east-1 | AWS region | +| `profile` | string | — | AWS profile name | +| `role_arn` | string | — | IAM role ARN for assume role | +| `role_session_name` | string | docker-agent-bedrock-session | Session name for assumed role | +| `external_id` | string | — | External ID for role assumption | +| `endpoint_url` | string | — | Custom endpoint (VPC/testing) | +| `interleaved_thinking` | bool | auto | Allow reasoning between tool calls (Claude); auto-enabled when a thinking budget is set on a Claude model; adds the required beta header automatically | +| `disable_prompt_caching` | bool | false | Disable automatic prompt caching | + +## Inference Profiles + +Use inference profile prefixes for optimal routing: + +| Prefix | Routes To | +| --------- | ---------------------------------------- | +| `global.` | All commercial AWS regions (recommended) | +| `us.` | US regions only | +| `eu.` | EU regions only (GDPR compliance) | +| `apac.` | Asia Pacific regions only | + +> [!TIP] +> **Inference profiles** +> +> Use `global.` prefix on model IDs for automatic cross-region routing. Use `eu.` prefix for GDPR compliance. + +## Thinking Budget (Claude on Bedrock) + +Bedrock Claude models support extended thinking — an internal reasoning phase before the model produces its response. Set `thinking_budget` to a token count (1024–32768) or an effort level string that maps automatically: + +| Effort level | Token budget | +| ------------ | ------------ | +| `minimal` | 1,024 | +| `low` | 2,048 | +| `medium` | 8,192 | +| `high` | 16,384 | +| `xhigh`/`max`| 32,768 | + +```yaml +models: + bedrock-claude-thinking: + provider: amazon-bedrock + model: global.anthropic.claude-sonnet-4-5-20250929-v1:0 + thinking_budget: 8192 # tokens, or use an effort string like "medium" + max_tokens: 16384 # must be > thinking_budget + provider_opts: + region: us-east-1 +``` + +`thinking_budget` must be ≥ 1024 and less than `max_tokens`. Values outside this range are logged as a warning and ignored. + +### Adaptive thinking (Opus 4.6+) + +Newer Claude Opus models (4.6, 4.7, 4.8) **reject token-based thinking** — Bedrock returns a `ValidationException` asking for `thinking.type=adaptive`. For these models, use adaptive thinking: + +```yaml +models: + bedrock-opus-adaptive: + provider: amazon-bedrock + model: global.anthropic.claude-opus-4-8 + thinking_budget: adaptive/high # adaptive | adaptive/low | adaptive/medium | adaptive/high | adaptive/xhigh | adaptive/max + provider_opts: + region: us-east-1 +``` + +docker-agent recognizes these models (including Bedrock-style IDs) and transparently coerces a configured token budget or effort level to adaptive thinking, logging a warning — so `thinking_budget: 32768` on Opus 4.8 won't fail, but `adaptive` or `adaptive/` is the recommended configuration. On older models that still use token-based thinking (e.g. Sonnet 4.5), `adaptive` is forwarded as-is and rejected by Bedrock — use a token count or effort level there instead. + +> [!NOTE] +> **Temperature and top_p** +> +> Bedrock Claude suppresses `temperature` and `top_p` while extended thinking is active — Anthropic requires `temperature=1.0` internally. + +## Interleaved Thinking (Claude on Bedrock) + +Interleaved thinking lets the model reason between tool calls, not just at the start. This is useful for complex agentic tasks. Enable it alongside a thinking budget: + +```yaml +models: + bedrock-claude-interleaved: + provider: amazon-bedrock + model: global.anthropic.claude-sonnet-4-5-20250929-v1:0 + thinking_budget: high + provider_opts: + region: us-east-1 + # interleaved_thinking is auto-enabled when thinking_budget is set +``` + +docker-agent auto-enables `interleaved_thinking` whenever a thinking budget is configured on a Bedrock-hosted Claude model and automatically adds the `interleaved-thinking-2025-05-14` beta header. If you set `interleaved_thinking: false` while a thinking budget is active, a warning is logged because the budget may be ignored by Bedrock without the beta header. + +See the [Thinking / Reasoning guide](../../guides/thinking/index.md) for a full cross-provider overview. + +## Prompt Caching + +Automatically enabled for supported models to reduce latency and costs. System prompts, tool definitions, and recent messages are cached with a 5-minute TTL. + +```bash +# Disable if needed +provider_opts: + disable_prompt_caching: true +``` diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/cerebras/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/cerebras/index.md new file mode 100644 index 0000000000..cd3bd715f0 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/cerebras/index.md @@ -0,0 +1,102 @@ +--- +title: "Cerebras" +description: "Use Cerebras models with docker-agent." +keywords: docker agent, ai agents, model providers, llm, cerebras +weight: 50 +--- + +_Use Cerebras models with docker-agent._ + +## Overview + +[Cerebras](https://www.cerebras.ai/) serves open-weight models such as GPT-OSS +and GLM through an OpenAI-compatible API on its wafer-scale hardware, delivering +some of the highest tokens/sec available. That speed makes it a strong fit for +latency-sensitive coding workflows. docker-agent includes built-in support for +Cerebras as an alias provider. + +## Setup + +1. Create an API key from the [Cerebras Cloud console](https://cloud.cerebras.ai/). +2. Set the environment variable: + + ```bash + export CEREBRAS_API_KEY=your-api-key + ``` + +## Usage + +### Inline Syntax + +The simplest way to use Cerebras: + +```yaml +agents: + root: + model: cerebras/gpt-oss-120b + description: Assistant using Cerebras + instruction: You are a helpful assistant. +``` + +### Named Model + +For more control over parameters: + +```yaml +models: + cerebras_model: + provider: cerebras + model: gpt-oss-120b + temperature: 0.7 + max_tokens: 8192 + +agents: + root: + model: cerebras_model + description: Assistant using Cerebras + instruction: You are a helpful assistant. +``` + +## Available Models + +Cerebras hosts a curated set of open-weight models. Check the +[Cerebras models documentation](https://inference-docs.cerebras.ai/models/overview) +for current model IDs, context limits, and pricing. + +| Model | Description | +| --- | --- | +| `gpt-oss-120b` | Open-weight GPT-OSS reasoning model with tool calling | +| `zai-glm-4.7` | Z.AI GLM-4.7 reasoning model with tool calling | + +> Model IDs are case-sensitive and must be passed exactly as the catalogue lists +> them. Cerebras may serve additional models not in the built-in catalog; those +> still work but resolve to default capability metadata locally. + +## How It Works + +Cerebras is implemented as a built-in alias in docker-agent: + +- **API Type:** OpenAI-compatible (`openai_chatcompletions`) +- **Base URL:** `https://api.cerebras.ai/v1` +- **Token Variable:** `CEREBRAS_API_KEY` + +Because Cerebras fronts open-weight models whose chat templates may only accept +a single leading system message, docker-agent coalesces its per-source system +messages (agent instruction plus each toolset's instructions) into one before +sending the request. + +## Example: Code Assistant + +```yaml +agents: + coder: + model: cerebras/gpt-oss-120b + description: Fast code assistant using Cerebras + instruction: | + You are an expert programmer. + Write clean, well-documented code and follow language best practices. + toolsets: + - type: filesystem + - type: shell + - type: think +``` diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/cloudflare-ai-gateway/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/cloudflare-ai-gateway/index.md new file mode 100644 index 0000000000..b4ddc559e3 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/cloudflare-ai-gateway/index.md @@ -0,0 +1,114 @@ +--- +title: "Cloudflare AI Gateway" +description: "Use Cloudflare AI Gateway models with docker-agent." +keywords: docker agent, ai agents, model providers, llm, cloudflare ai gateway +weight: 60 +--- + +_Use Cloudflare AI Gateway models with docker-agent._ + +## Overview + +[Cloudflare AI Gateway](https://developers.cloudflare.com/ai-gateway/) is a +single OpenAI-compatible endpoint that routes to models from OpenAI, Anthropic, +Workers AI and more, with caching, rate limiting and observability. docker-agent +includes built-in support for AI Gateway as an alias provider. + +The alias sends your token in the standard `Authorization: Bearer` header, so it +works out of the box with a gateway that has **authentication disabled** (the +default), typically to route to your own Workers AI models through a gateway you +own. See [Authentication](#authentication) below for the unified-billing / +authenticated-gateway caveat. + +## Setup + +The gateway endpoint is account- and gateway-scoped, so its base URL is resolved +from your account ID and gateway ID. Three environment variables are required: + +```bash +export CLOUDFLARE_ACCOUNT_ID=your-account-id +export CLOUDFLARE_GATEWAY_ID=your-gateway-id +export CLOUDFLARE_API_TOKEN=your-api-token +``` + +Create a gateway from the +[AI Gateway dashboard](https://dash.cloudflare.com/?to=/:account/ai/ai-gateway) +and an API token with the appropriate permissions. + +## Usage + +AI Gateway model IDs use the gateway's `provider/model` form (for example +`workers-ai/@cf/meta/llama-3.1-8b-instruct` or `openai/gpt-4o`); the gateway +routes each request to the underlying provider. + +### Inline Syntax + +```yaml +agents: + root: + model: cloudflare-ai-gateway/workers-ai/@cf/meta/llama-3.1-8b-instruct + description: Assistant using Cloudflare AI Gateway + instruction: You are a helpful assistant. +``` + +### Named Model + +For more control over parameters: + +```yaml +models: + cloudflare_model: + provider: cloudflare-ai-gateway + model: "workers-ai/@cf/meta/llama-3.1-8b-instruct" + temperature: 0.7 + max_tokens: 8192 + +agents: + root: + model: cloudflare_model + description: Assistant using Cloudflare AI Gateway + instruction: You are a helpful assistant. +``` + +## Available Models + +AI Gateway exposes models from many providers behind one endpoint. Check the +[AI Gateway documentation](https://developers.cloudflare.com/ai-gateway/) for +the current provider list, model IDs, and how billing works. + +> Model IDs are case-sensitive and must be passed exactly as the gateway lists +> them, including the `provider/` prefix. + +## How It Works + +Cloudflare AI Gateway is implemented as a built-in alias in docker-agent: + +- **API Type:** OpenAI-compatible (`openai_chatcompletions`) +- **Base URL:** `https://gateway.ai.cloudflare.com/v1/${CLOUDFLARE_ACCOUNT_ID}/${CLOUDFLARE_GATEWAY_ID}/compat` +- **Token Variable:** `CLOUDFLARE_API_TOKEN` + +The base URL is templated: `${CLOUDFLARE_ACCOUNT_ID}` and +`${CLOUDFLARE_GATEWAY_ID}` are substituted from the environment when the provider +is built, so both must be set in addition to `CLOUDFLARE_API_TOKEN`. Because the +gateway can route to open-weight models with strict chat templates, docker-agent +coalesces consecutive system messages into a single leading one for this +provider. + +## Authentication + +docker-agent authenticates by sending `CLOUDFLARE_API_TOKEN` in the standard +`Authorization: Bearer` header. On the `.../compat` endpoint that header is +treated as the **provider** key, so this alias works when: + +- the gateway has **authentication disabled** (the default), and +- the routed models accept that token as their provider key, which is the case + for **Workers AI** models (`workers-ai/@cf/...`). + +A gateway with **authentication enabled** (required for +[unified billing](https://developers.cloudflare.com/ai-gateway/features/unified-billing/)) +instead expects the token in Cloudflare's `cf-aig-authorization` header. The +alias does not send that header, and custom `provider_opts.http_headers` values +are not environment-expanded, so an authenticated gateway is **not supported out +of the box** today. For that setup, use an unauthenticated gateway, or configure +a [custom provider](../custom/index.md) against the +Cloudflare AI Gateway REST API. diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/cloudflare-workers-ai/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/cloudflare-workers-ai/index.md new file mode 100644 index 0000000000..16ab3e156b --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/cloudflare-workers-ai/index.md @@ -0,0 +1,90 @@ +--- +title: "Cloudflare Workers AI" +description: "Use Cloudflare Workers AI models with docker-agent." +keywords: docker agent, ai agents, model providers, llm, cloudflare workers ai +weight: 70 +--- + +_Use Cloudflare Workers AI models with docker-agent._ + +## Overview + +[Cloudflare Workers AI](https://developers.cloudflare.com/workers-ai/) runs +open-weight models (Llama, Mistral, Qwen, Gemma, and more) on Cloudflare's +global edge network through an OpenAI-compatible endpoint. No separate provider +accounts are needed for the supported models. docker-agent includes built-in +support for Workers AI as an alias provider. + +## Setup + +Workers AI is account-scoped, so its base URL is resolved from your account ID. +Two environment variables are required: + +```bash +export CLOUDFLARE_ACCOUNT_ID=your-account-id +export CLOUDFLARE_API_TOKEN=your-api-token +``` + +Create an API token with the `Workers AI` permission from the +[Cloudflare dashboard](https://dash.cloudflare.com/profile/api-tokens). Your +account ID is shown on the Workers AI page. + +## Usage + +Workers AI model IDs use the `@cf/...` form (for example +`@cf/meta/llama-3.1-8b-instruct`). + +### Inline Syntax + +```yaml +agents: + root: + model: cloudflare-workers-ai/@cf/meta/llama-3.1-8b-instruct + description: Assistant using Cloudflare Workers AI + instruction: You are a helpful assistant. +``` + +### Named Model + +For more control over parameters: + +```yaml +models: + cloudflare_model: + provider: cloudflare-workers-ai + model: "@cf/meta/llama-3.1-8b-instruct" + temperature: 0.7 + max_tokens: 8192 + +agents: + root: + model: cloudflare_model + description: Assistant using Cloudflare Workers AI + instruction: You are a helpful assistant. +``` + +## Available Models + +Check the +[Workers AI models catalog](https://developers.cloudflare.com/workers-ai/models/) +for the current list, IDs, and pricing. + +| Model | Description | +| --- | --- | +| `@cf/meta/llama-3.1-8b-instruct` | Meta Llama 3.1 8B Instruct | +| `@cf/mistralai/mistral-small-3.1-24b-instruct` | Mistral Small 3.1 24B Instruct | +| `@cf/qwen/qwen2.5-coder-32b-instruct` | Qwen 2.5 Coder 32B Instruct | + +## How It Works + +Cloudflare Workers AI is implemented as a built-in alias in docker-agent: + +- **API Type:** OpenAI-compatible (`openai_chatcompletions`) +- **Base URL:** `https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1` +- **Token Variable:** `CLOUDFLARE_API_TOKEN` + +The base URL is templated: `${CLOUDFLARE_ACCOUNT_ID}` is substituted from the +environment when the provider is built, so `CLOUDFLARE_ACCOUNT_ID` must be set in +addition to `CLOUDFLARE_API_TOKEN`. Because Workers AI serves open-weight models +with strict chat templates, docker-agent coalesces consecutive system messages +into a single leading one for this provider. diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/custom/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/custom/index.md new file mode 100644 index 0000000000..240acddb60 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/custom/index.md @@ -0,0 +1,265 @@ +--- +title: "Provider Definitions" +description: "Define reusable provider configurations with shared defaults for any provider type — OpenAI, Anthropic, Google, Bedrock, and more." +keywords: docker agent, ai agents, model providers, llm, provider definitions +weight: 280 +--- + +_Define reusable provider configurations with shared defaults for any provider type — OpenAI, Anthropic, Google, Bedrock, and more._ + +## Overview + +The `providers` section in your agent YAML lets you define named provider configurations that models can reference. This is useful for: + +- **Grouping shared defaults** — Set temperature, max_tokens, thinking_budget once and share across models +- **Custom endpoints** — Connect to self-hosted models, API proxies, or gateways +- **Centralizing credentials** — Define token_key once for all models using a provider +- **Any provider type** — Works with OpenAI, Anthropic, Google, Bedrock, and any OpenAI-compatible API + +> [!NOTE] +> **Works with any provider** +> +> The `providers` section supports all provider types: `openai`, `anthropic`, `google`, `amazon-bedrock`, `dmr`, and any built-in alias. When the `provider` field is not set, it defaults to `openai` for backward compatibility. + +## Configuration + +### OpenAI-compatible endpoint + +```yaml +providers: + my_gateway: + base_url: https://api.example.com/v1 + token_key: MY_API_KEY + +models: + my_model: + provider: my_gateway + model: gpt-4o + +agents: + root: + model: my_model + instruction: You are a helpful assistant. +``` + +### Anthropic with shared defaults + +```yaml +providers: + my_anthropic: + provider: anthropic + token_key: MY_ANTHROPIC_KEY + max_tokens: 16384 + thinking_budget: 8192 + +models: + claude_smart: + provider: my_anthropic + model: claude-sonnet-4-5 + # Inherits max_tokens: 16384, thinking_budget: 8192 + + claude_fast: + provider: my_anthropic + model: claude-haiku-4-5 + thinking_budget: 1024 # Overrides provider default + +agents: + root: + model: claude_smart + instruction: You are a helpful assistant. +``` + +### Google with shared temperature + +```yaml +providers: + my_google: + provider: google + temperature: 0.3 + +models: + gemini: + provider: my_google + model: gemini-2.5-flash + # Inherits temperature: 0.3 + +agents: + root: + model: gemini + instruction: You are a helpful assistant. +``` + +## Provider Properties + +| Property | Type | Description | Default | +| --------------------- | ---------- | ------------------------------------------------------------------------------------- | ------------------------ | +| `provider` | string | Underlying provider type: `openai`, `anthropic`, `google`, `amazon-bedrock`, `dmr`, etc. | `openai` | +| `api_type` | string | API schema: `openai_chatcompletions` or `openai_responses`. Only for OpenAI-compatible providers. When omitted, the API type is selected automatically based on the model name: newer models (gpt-4.1, o-series, gpt-5, Codex) default to `openai_responses`; all others default to `openai_chatcompletions`. | `auto (model-dependent)` | +| `base_url` | string | Base URL for the API endpoint. Required for OpenAI-compatible providers, optional for native providers. | — | +| `token_key` | string | Environment variable name containing the API token. | — | +| `unload_api` | string | Optional path (or absolute URL) to the provider's model-unload endpoint. Used by the [`unload`](../../configuration/hooks/index.md#available-built-ins) built-in hook to release model resources between agent switches. Relative paths resolve against `base_url`'s scheme + host; absolute URLs are used verbatim. Today only Docker Model Runner ships a provider that calls this endpoint; cloud providers don't implement the underlying interface and the hook silently skips them. | — | +| `temperature` | float | Default sampling temperature (0.0–2.0). | — | +| `max_tokens` | int | Default maximum response tokens. | — | +| `top_p` | float | Default nucleus sampling threshold (0.0–1.0). | — | +| `frequency_penalty` | float | Default frequency penalty (-2.0–2.0). | — | +| `presence_penalty` | float | Default presence penalty (-2.0–2.0). | — | +| `parallel_tool_calls` | boolean | Whether to enable parallel tool calls by default. | — | +| `track_usage` | boolean | Whether to track token usage by default. | — | +| `thinking_budget` | string/int | Default reasoning effort/budget. | — | +| `task_budget` | int/object | Default total token budget for an agentic task (forwarded to Anthropic; honored by Claude Opus 4.7 today). Integer shorthand or `{type: tokens, total: N}`. | — | +| `provider_opts` | object | Provider-specific options passed through to the client. | — | + +## Default Inheritance + +Models referencing a provider inherit all its defaults. Model-level settings always take precedence: + +```yaml +providers: + my_anthropic: + provider: anthropic + token_key: MY_ANTHROPIC_KEY + max_tokens: 16384 + temperature: 0.7 + thinking_budget: high + +models: + # Inherits everything from provider + claude_default: + provider: my_anthropic + model: claude-sonnet-4-5 + + # Overrides temperature and thinking_budget, inherits the rest + claude_custom: + provider: my_anthropic + model: claude-sonnet-4-5 + temperature: 0.2 + thinking_budget: low +``` + +## Shorthand Syntax + +Once a provider is defined, you can use the shorthand `provider_name/model` syntax: + +```yaml +agents: + root: + model: my_gateway/gpt-4o-mini # uses the provider's defaults + researcher: + model: my_anthropic/claude-sonnet-4-5 # uses anthropic provider defaults +``` + +## API Types + +Only applicable for OpenAI-compatible providers (when `provider` is `openai` or unset): + +- **`openai_chatcompletions`** — Standard OpenAI Chat Completions API. Works with most OpenAI-compatible endpoints. +- **`openai_responses`** — OpenAI Responses API. For newer models that require the Responses API format. + +> If `api_type` is not set, docker-agent automatically selects the API type based on the model name. You only need to set `api_type` explicitly to override the detected default. + +## Examples + +### vLLM / Ollama + +```yaml +providers: + local_llm: + base_url: http://localhost:8000/v1 + +agents: + root: + model: local_llm/llama-3.1-8b +``` + +> [!NOTE] +> **Reasoning tokens from OpenAI-compatible providers** +> +> Models that stream reasoning under `delta.reasoning` (e.g. Qwen3 served via OVHcloud AI Endpoints, OpenRouter, or a self-hosted vLLM / SGLang deployment) are fully supported. Docker Agent reads both the `delta.reasoning_content` and `delta.reasoning` fields from the stream, so thinking blocks are captured and shown in the TUI regardless of which field the server uses. + +### API Router (Requesty, LiteLLM) + +```yaml +providers: + router: + base_url: https://router.requesty.ai/v1 + token_key: REQUESTY_API_KEY + +agents: + root: + model: router/anthropic/claude-sonnet-4-5 +``` + +### Azure OpenAI + +```yaml +models: + azure_model: + provider: azure + model: gpt-4o + base_url: https://your-llm.openai.azure.com + provider_opts: + api_version: 2024-12-01-preview +``` + +### Anthropic Team Setup + +```yaml +providers: + team_anthropic: + provider: anthropic + token_key: TEAM_ANTHROPIC_KEY + max_tokens: 32768 + thinking_budget: high + temperature: 0.5 + +models: + architect: + provider: team_anthropic + model: claude-sonnet-4-5 + + reviewer: + provider: team_anthropic + model: claude-haiku-4-5 + thinking_budget: low # faster reviews + +agents: + root: + model: architect + sub_agents: [code_reviewer] + code_reviewer: + model: reviewer +``` + +### Multi-Provider with Shared Defaults + +```yaml +providers: + fast_openai: + base_url: https://api.openai.com/v1 + token_key: OPENAI_API_KEY + temperature: 0.3 + max_tokens: 8192 + + smart_anthropic: + provider: anthropic + token_key: ANTHROPIC_API_KEY + max_tokens: 64000 + thinking_budget: high + +agents: + root: + model: smart_anthropic/claude-sonnet-4-5 + sub_agents: [helper] + helper: + model: fast_openai/gpt-4o-mini +``` + +## How It Works + +When you reference a provider: + +1. The provider's `provider` field determines which API client to use (defaults to `openai`) +2. The provider's `base_url` and `token_key` are applied to the model (if not already set on the model) +3. All model-level defaults (temperature, max_tokens, thinking_budget, etc.) are inherited (model settings take precedence) +4. For OpenAI-compatible providers, the `api_type` is stored in `provider_opts.api_type` +5. The model is used with the appropriate API client diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/deepseek/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/deepseek/index.md new file mode 100644 index 0000000000..75c922afda --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/deepseek/index.md @@ -0,0 +1,95 @@ +--- +title: "DeepSeek" +description: "Use DeepSeek models with docker-agent." +keywords: docker agent, ai agents, model providers, llm, deepseek +weight: 80 +--- + +_Use DeepSeek models with docker-agent._ + +## Overview + +[DeepSeek](https://www.deepseek.com/) serves its frontier chat and reasoning +models through an OpenAI-compatible API, with strong price/performance on coding +and reasoning tasks. docker-agent includes built-in support for DeepSeek as an +alias provider. + +## Setup + +1. Create an API key from the [DeepSeek Platform](https://platform.deepseek.com/api_keys). +2. Set the environment variable: + + ```bash + export DEEPSEEK_API_KEY=your-api-key + ``` + +## Usage + +### Inline Syntax + +The simplest way to use DeepSeek: + +```yaml +agents: + root: + model: deepseek/deepseek-chat + description: Assistant using DeepSeek + instruction: You are a helpful assistant. +``` + +### Named Model + +For more control over parameters: + +```yaml +models: + deepseek_model: + provider: deepseek + model: deepseek-chat + temperature: 0.7 + max_tokens: 8192 + +agents: + root: + model: deepseek_model + description: Assistant using DeepSeek + instruction: You are a helpful assistant. +``` + +## Available Models + +DeepSeek exposes a small, vendor-controlled model lineup. Check the +[DeepSeek models documentation](https://api-docs.deepseek.com/quick_start/pricing) +for current model IDs, context limits, and pricing. + +| Model | Description | +| --- | --- | +| `deepseek-chat` | DeepSeek-V3, general-purpose chat and tool calling | +| `deepseek-reasoner` | DeepSeek-R1, extended-reasoning model | + +> Model IDs are case-sensitive and must be passed exactly as the catalogue lists +> them. + +## How It Works + +DeepSeek is implemented as a built-in alias in docker-agent: + +- **API Type:** OpenAI-compatible (`openai_chatcompletions`) +- **Base URL:** `https://api.deepseek.com/v1` +- **Token Variable:** `DEEPSEEK_API_KEY` + +## Example: Code Assistant + +```yaml +agents: + coder: + model: deepseek/deepseek-chat + description: Code assistant using DeepSeek-V3 + instruction: | + You are an expert programmer. + Write clean, well-documented code and follow language best practices. + toolsets: + - type: filesystem + - type: shell + - type: think +``` diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/dmr/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/dmr/index.md new file mode 100644 index 0000000000..b245ef914e --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/dmr/index.md @@ -0,0 +1,252 @@ +--- +title: "Docker Model Runner" +description: "Run AI models locally with Docker — no API keys, no costs, full data privacy." +keywords: docker agent, ai agents, model providers, llm, docker model runner +weight: 90 +--- + +_Run AI models locally with Docker — no API keys, no costs, full data privacy._ + +## Overview + +Docker Model Runner (DMR) lets you run open-source AI models directly on your machine. Models run in Docker, so there's no API key needed and no data leaves your computer. + +docker-agent automatically discovers models you have already pulled from DMR. When no model is explicitly configured, auto-selection prefers a locally-installed model (choosing the model specified via the `model:` key in the agent YAML if it is already pulled locally, or otherwise the first available non-embedding model) rather than always defaulting to `ai/qwen3:latest` and triggering a pull prompt. + +> [!TIP] +> **No API key needed** +> +> DMR runs models locally — your data never leaves your machine. Great for development, sensitive data, or offline use. + +## Prerequisites + +- [Docker Desktop](https://www.docker.com/products/docker-desktop/) with the Model Runner feature enabled +- Verify with: `docker model status --json` + +## Configuration + +### Inline + +```yaml +agents: + root: + model: dmr/ai/qwen3 +``` + +### Named Model + +```yaml +models: + local: + provider: dmr + model: ai/qwen3 + max_tokens: 8192 +``` + +## Available Models + +Any model available through Docker Model Runner can be used. Common options: + +| Model | Description | +| ------------- | ----------------------------------------------------- | +| `ai/qwen3` | Qwen 3 — versatile, good for coding and general tasks | +| `ai/llama3.2` | Llama 3.2 — Meta's open-source model | + +## Runtime Flags + +Pass flags to the underlying inference runtime (e.g., llama.cpp) using `provider_opts.runtime_flags`: + +```yaml +models: + local: + provider: dmr + model: ai/qwen3 + max_tokens: 8192 + provider_opts: + runtime_flags: ["--threads", "8"] +``` + +Runtime flags also accept a single string: + +```yaml +provider_opts: + runtime_flags: "--threads 8" +``` + +Use only flags your Model Runner backend allows (see `docker model configure --help` and backend docs). **Do not** put sampling parameters (`temperature`, `top_p`, penalties) in `runtime_flags` — set them on the model (`temperature`, `top_p`, etc.); they are sent **per request** via the OpenAI-compatible chat API. + +## Context size + +`max_tokens` controls the **maximum output tokens** per chat completion request. To set the engine's **total context window**, use `provider_opts.context_size`: + +```yaml +models: + local: + provider: dmr + model: ai/qwen3 + max_tokens: 4096 # max output tokens (per-request) + provider_opts: + context_size: 32768 # total context window (sent via _configure) +``` + +If `context_size` is omitted, Model Runner uses its default. `max_tokens` is **not** used as the context window. + +docker-agent's auto-compaction scales its summary and keep-tail token budgets proportionally to `context_size`. This ensures compaction works correctly even for small context windows — for example, an 8k-token local model will not have its session history wiped during compaction. + +## Thinking / reasoning budget + +When using the **llama.cpp** backend, `thinking_budget` is sent as structured `llamacpp.reasoning-budget` on `_configure` (maps to `--reasoning-budget`). String efforts use the same token mapping as other providers; `adaptive` maps to unlimited (`-1`). + +When using the **vLLM** backend, `thinking_budget` is sent as `thinking_token_budget` in each chat completion request. Effort levels map to token counts using the same scale as other providers; `adaptive` maps to unlimited (`-1`). + +```yaml +models: + local: + provider: dmr + model: ai/qwen3 + thinking_budget: medium # llama.cpp: reasoning-budget=8192; vLLM: thinking_token_budget=8192 +``` + +On **MLX** and **SGLang** backends, `thinking_budget` is silently ignored — those engines do not currently expose a per-request reasoning token budget knob. + +## vLLM-specific configuration + +When running a model on the **vLLM** backend, additional engine-level settings can be passed via `provider_opts` and are forwarded to model-runner's `_configure` endpoint: + +- `gpu_memory_utilization` — fraction of GPU memory (0.0–1.0) vLLM may use. Values outside this range are rejected. +- `hf_overrides` — map of Hugging Face config overrides applied when vLLM loads the model. + +```yaml +models: + vllm-local: + provider: dmr + model: ai/some-model-safetensors + provider_opts: + gpu_memory_utilization: 0.9 + hf_overrides: + max_model_len: 8192 + dtype: bfloat16 +``` + +`hf_overrides` keys (including nested ones) must match `^[a-zA-Z_][a-zA-Z0-9_]*$` — the same rule model-runner enforces server-side to block injection via flags. Invalid keys are rejected at client creation time so you fail fast instead of after a round-trip. + +These options are ignored on non-vLLM backends. + +## Keeping models resident in memory (`keep_alive`) + +By default model-runner unloads idle models after a few minutes. Override the idle timeout via `provider_opts.keep_alive`: + +```yaml +models: + sticky: + provider: dmr + model: ai/qwen3 + provider_opts: + keep_alive: "30m" # duration string + # keep_alive: "0" # unload immediately after each request + # keep_alive: "-1" # keep loaded forever +``` + +Accepted values: any Go duration string (`"30s"`, `"5m"`, `"1h"`, `"2h30m"`), `"0"` (immediate unload), or `"-1"` (never unload). Invalid values are rejected before the configure request is sent. + +## Unloading models on agent switch + +In multi-agent setups where two DMR models can't fit in GPU memory simultaneously, wire the [`unload`](../../configuration/hooks/index.md#available-built-ins) built-in hook into each agent's `on_agent_switch` chain. Every time the active agent transfers control, the runtime POSTs to the engine's `_unload` endpoint to free the previous model's resources before the next one is loaded: + +```yaml +agents: + coder: + model: qwen3-large + handoffs: [reviewer] + hooks: + on_agent_switch: + - type: builtin + command: unload + reviewer: + model: qwen3-coder + handoffs: [coder] + hooks: + on_agent_switch: + - type: builtin + command: unload +``` + +The unload URL is derived from `base_url` by replacing the trailing `/v1` segment (e.g. `http://127.0.0.1:12434/engines/llama.cpp/v1/` → `http://127.0.0.1:12434/engines/llama.cpp/_unload`). Override it explicitly via the provider-level `unload_api` field when running against a non-standard model-runner deployment: + +```yaml +providers: + my_dmr: + provider: dmr + base_url: http://model-runner.docker.internal/engines/v1 + unload_api: /engines/_unload # default; absolute URLs also work + +models: + big: + provider: my_dmr + model: ai/qwen3 +``` + +Unload errors are logged and swallowed — a stuck or unreachable engine never blocks an agent transfer (each call is bounded to 10 s). Pair this with [`keep_alive`](#keeping-models-resident-in-memory-keep_alive) only when you want the model to *also* survive idle periods within a single agent's run; the hook controls **between-agent** unloads independently. + +> [!WARNING] +> **Single-tenant assumption** +> +> The `_unload` endpoint is engine-level: it evicts the model from DMR's memory regardless of who is using it. If two concurrent sessions on the same runtime (e.g. an API server serving multiple users) hit the same agent, switching away in session A will yank the model out from under session B's in-flight request, which then has to wait for a reload. Wire `unload` only when the agents using these models are not run concurrently — typically a single TUI/CLI session. + +See [`examples/unload_on_switch.yaml`](https://github.com/docker/docker-agent/blob/main/examples/unload_on_switch.yaml) for the full example. + +## Operating mode (`mode`) + +Model-runner normally infers the backend mode from the request path. You can pin it explicitly via `provider_opts.mode`: + +```yaml +provider_opts: + mode: embedding # one of: completion, embedding, reranking, image-generation +``` + +Most agents don't need this — leave it unset unless you know you need it. + +## Raw runtime flags (`raw_runtime_flags`) + +`runtime_flags` (a list) is the preferred way to pass flags. If you have a pre-built command-line string you'd rather ship verbatim, use `raw_runtime_flags` instead: + +```yaml +provider_opts: + raw_runtime_flags: "--threads 8 --batch-size 512" +``` + +Model-runner parses the string with shell-style word splitting. `runtime_flags` and `raw_runtime_flags` are mutually exclusive — setting both is an error. + +## Speculative Decoding + +Use a smaller draft model to predict tokens ahead for faster inference: + +```yaml +models: + fast-local: + provider: dmr + model: ai/qwen3:14B + max_tokens: 8192 + provider_opts: + speculative_draft_model: ai/qwen3:0.6B-F16 + speculative_num_tokens: 16 + speculative_acceptance_rate: 0.8 +``` + +## Custom Endpoint + +If `base_url` is omitted, docker-agent auto-discovers the DMR endpoint. To set manually: + +```yaml +models: + local: + provider: dmr + model: ai/qwen3 + base_url: http://127.0.0.1:12434/engines/llama.cpp/v1 +``` + +## Troubleshooting + +- **Plugin not found:** Ensure Docker Model Runner is enabled in Docker Desktop. docker-agent will fall back to the default URL. +- **Endpoint empty:** Verify the Model Runner is running with `docker model status --json`. +- **Performance:** Use `runtime_flags` to tune GPU layers (`--ngl`) and thread count (`--threads`). diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/fireworks/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/fireworks/index.md new file mode 100644 index 0000000000..85417b0c30 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/fireworks/index.md @@ -0,0 +1,101 @@ +--- +title: "Fireworks AI" +description: "Use Fireworks AI models with docker-agent." +keywords: docker agent, ai agents, model providers, llm, fireworks ai +weight: 100 +--- + +_Use Fireworks AI models with docker-agent._ + +## Overview + +[Fireworks AI](https://fireworks.ai/) is a fast inference host for open-weight +models, serving Kimi K2, Llama, Qwen, DeepSeek, GLM and others through an +OpenAI-compatible API. docker-agent includes built-in support for Fireworks AI +as an alias provider. + +## Setup + +1. Create an API key from the [Fireworks dashboard](https://fireworks.ai/account/api-keys). +2. Set the environment variable: + + ```bash + export FIREWORKS_API_KEY=your-api-key + ``` + +## Usage + +### Inline Syntax + +The simplest way to use Fireworks AI: + +```yaml +agents: + root: + model: fireworks/accounts/fireworks/models/kimi-k2-instruct + description: Assistant using Fireworks AI + instruction: You are a helpful assistant. +``` + +### Named Model + +For more control over parameters: + +```yaml +models: + fireworks_model: + provider: fireworks + model: accounts/fireworks/models/kimi-k2-instruct + temperature: 0.7 + max_tokens: 8192 + +agents: + root: + model: fireworks_model + description: Assistant using Fireworks AI + instruction: You are a helpful assistant. +``` + +## Available Models + +Fireworks serves a broad, changing catalog of open-weight models. Model IDs use +the `accounts/fireworks/models/` form. Check the +[Fireworks model library](https://fireworks.ai/models) for current IDs, context +limits, and pricing. + +| Model | Description | +| --- | --- | +| `accounts/fireworks/models/kimi-k2-instruct` | Kimi K2, large open MoE chat and tool-calling model | +| `accounts/fireworks/models/llama-v3p3-70b-instruct` | Llama 3.3 70B instruct | +| `accounts/fireworks/models/qwen3-235b-a22b` | Qwen 3 235B MoE | + +> Model IDs are case-sensitive and must be passed exactly as the catalogue lists +> them. + +## How It Works + +Fireworks AI is implemented as a built-in alias in docker-agent: + +- **API Type:** OpenAI-compatible (`openai_chatcompletions`) +- **Base URL:** `https://api.fireworks.ai/inference/v1` +- **Token Variable:** `FIREWORKS_API_KEY` + +Because Fireworks fronts open-weight models whose chat templates may reject more +than one leading system message, docker-agent coalesces its per-source system +messages into a single one for this provider. + +## Example: Code Assistant + +```yaml +agents: + coder: + model: fireworks/accounts/fireworks/models/kimi-k2-instruct + description: Code assistant using Kimi K2 on Fireworks AI + instruction: | + You are an expert programmer. + Write clean, well-documented code and follow language best practices. + toolsets: + - type: filesystem + - type: shell + - type: think +``` diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/github-copilot/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/github-copilot/index.md new file mode 100644 index 0000000000..6ce5fe3446 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/github-copilot/index.md @@ -0,0 +1,146 @@ +--- +title: "GitHub Copilot" +description: "Use GitHub Copilot's hosted models (GPT-4o, Claude, Gemini, and more) with docker-agent through your GitHub subscription." +keywords: docker agent, ai agents, model providers, llm, github copilot +weight: 110 +--- + +_Use GitHub Copilot's hosted models with docker-agent through your existing GitHub subscription._ + +## Overview + +GitHub Copilot exposes an OpenAI-compatible Chat Completions API at +`https://api.githubcopilot.com`. docker-agent ships with built-in support for +it as the `github-copilot` provider, so any user with a paid GitHub Copilot +subscription can reuse their entitlement from docker-agent. + +## Prerequisites + +- An active **GitHub Copilot** subscription (Individual, Business, or Enterprise). +- A **personal access token** with the `copilot` scope, exported as `GITHUB_TOKEN`. + +```bash +export GITHUB_TOKEN="ghp_..." +``` + +## Configuration + +### Inline + +```yaml +agents: + root: + model: github-copilot/gpt-4o + instruction: You are a helpful assistant. +``` + +### Named model + +```yaml +models: + copilot: + provider: github-copilot + model: gpt-4o + temperature: 0.7 + max_tokens: 4000 + +agents: + root: + model: copilot +``` + +## Available Models + +The exact set of models you can call depends on your Copilot plan. The most +commonly available ones today are: + +| Model | Best For | +| ------------------------ | ----------------------------------- | +| `gpt-4o` | Multimodal, balanced performance | +| `gpt-4o-mini` | Fast and cheap | +| `claude-sonnet-4` | Strong coding and analysis | +| `gemini-2.5-pro` | Google's flagship, large context | +| `o3-mini` | Reasoning-focused | + +Check the +[GitHub Copilot documentation](https://docs.github.com/en/copilot) +for the current model list. + +## `Copilot-Integration-Id` Header + +GitHub's Copilot API rejects requests that don't carry a +`Copilot-Integration-Id` header with a `Bad Request` error. docker-agent +automatically sends `copilot-developer-cli` for the `github-copilot` +provider, so PAT-based usage works out of the box. + +We specifically chose `copilot-developer-cli` (instead of, say, +`vscode-chat`) because it is the integration id accepted by the Copilot +API for **both** OAuth tokens and Personal Access Tokens. Most +docker-agent users authenticate with a PAT exported as `GITHUB_TOKEN`, +and `vscode-chat` is rejected for those tokens. + +If you need to send a different integration id — for example if your +organization allows-lists a specific value — you can override it via +`provider_opts.http_headers`: + +```yaml +models: + copilot: + provider: github-copilot + model: gpt-4o + provider_opts: + http_headers: + Copilot-Integration-Id: my-custom-integration +``` + +Header names are matched case-insensitively, so `copilot-integration-id` +works too. + +## Chat Completions vs. Responses API + +GitHub Copilot proxies OpenAI models behind two endpoints: the legacy +`/chat/completions` and the newer `/responses`. Newer models (the `gpt-5` +family, Codex variants, etc.) are only served via `/responses` and reject +`/chat/completions` with a `400 Bad Request`. docker-agent auto-selects the +right endpoint per model, so no configuration is needed in the common case. + +If you ever need to force one or the other, set `api_type` explicitly: + +```yaml +models: + copilot: + provider: github-copilot + model: gpt-5 + provider_opts: + api_type: openai_responses # or openai_chatcompletions +``` + +## Custom HTTP Headers + +`provider_opts.http_headers` is a generic escape hatch that works for any +OpenAI-compatible provider, not just GitHub Copilot. Every key/value pair +is added to every outgoing request: + +```yaml +models: + my_model: + provider: openai + model: gpt-4o + provider_opts: + http_headers: + X-Request-Source: docker-agent + X-Tenant-Id: my-team +``` + +## How It Works + +GitHub Copilot is implemented as a built-in alias in docker-agent: + +- **API type:** OpenAI-compatible (Chat Completions) +- **Base URL:** `https://api.githubcopilot.com` +- **Token variable:** `GITHUB_TOKEN` +- **Default headers:** `Copilot-Integration-Id: copilot-developer-cli` + +This means the same client as OpenAI is used, so every OpenAI feature +supported by docker-agent (tool calling, structured output, multimodal +inputs, etc.) is available when the underlying model supports it. diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/google/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/google/index.md new file mode 100644 index 0000000000..bbe071c46b --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/google/index.md @@ -0,0 +1,173 @@ +--- +title: "Google Gemini" +description: "Use Gemini 2.5 Flash, Gemini 3 Pro, and other Google models with docker-agent." +keywords: docker agent, ai agents, model providers, llm, google gemini +weight: 120 +--- + +_Use Gemini 2.5 Flash, Gemini 3 Pro, and other Google models with docker-agent._ + +## Setup + +docker-agent reads the first credential it finds from these environment variables (see `pkg/model/provider/gemini/client.go`): + +| Variable | Purpose | +| --------------------------- | ----------------------------------------------------------------------------------- | +| `GOOGLE_API_KEY` | Primary Gemini API key. | +| `GEMINI_API_KEY` | Alternative name for the Gemini API key (also used by the official Google SDK). | +| `GOOGLE_GENAI_USE_VERTEXAI` | When set (any value), routes through Vertex AI instead of the Gemini Developer API. | +| `GOOGLE_CLOUD_PROJECT` | GCP project used when `GOOGLE_GENAI_USE_VERTEXAI` is set or for Vertex AI Model Garden. | +| `GOOGLE_CLOUD_LOCATION` | GCP region for Vertex AI (defaults to the SDK default). | + +```bash +# Gemini Developer API +export GOOGLE_API_KEY="AI..." # or GEMINI_API_KEY + +# Vertex AI (no API key; uses Application Default Credentials) +gcloud auth application-default login +export GOOGLE_GENAI_USE_VERTEXAI=1 +export GOOGLE_CLOUD_PROJECT="my-gcp-project" +export GOOGLE_CLOUD_LOCATION="us-central1" +``` + +## Configuration + +### Inline + +```yaml +agents: + root: + model: google/gemini-3.5-flash +``` + +### Named Model + +```yaml +models: + gemini: + provider: google + model: gemini-3.5-flash + temperature: 0.5 +``` + +## Available Models + +| Model | Best For | +| ------------------ | ------------------------------- | +| `gemini-3-pro` | Most capable Gemini model | +| `gemini-3-flash` | Fast, efficient, good balance | +| `gemini-2.5-flash` | Fast inference, cost-effective | +| `gemini-2.5-pro` | Strong reasoning, large context | + +## Thinking Budget + +Gemini supports two approaches depending on the model version: + +> [!WARNING] +> **Different thinking formats** +> +> Gemini 2.5 uses **token-based** budgets (integers). Gemini 3 uses **level-based** budgets (strings like `low`, `high`). Make sure you use the right format for your model version. + +### Gemini 2.5 (Token-based) + +```yaml +models: + gemini-no-thinking: + provider: google + model: gemini-2.5-flash + thinking_budget: 0 # disable thinking + + gemini-dynamic: + provider: google + model: gemini-2.5-flash + thinking_budget: -1 # dynamic (model decides) — default + + gemini-fixed: + provider: google + model: gemini-2.5-flash + thinking_budget: 8192 # fixed token budget +``` + +### Gemini 3 (Level-based) + +```yaml +models: + gemini-3-pro: + provider: google + model: gemini-3-pro + thinking_budget: high # default for Pro: low | high + + gemini-3-flash: + provider: google + model: gemini-3-flash + thinking_budget: medium # default for Flash: minimal | low | medium | high +``` + +## Built-in Tools (Grounding) + +Gemini models support built-in tools that let the model access Google Search and Google Maps +directly during generation. Enable them via `provider_opts`: + +```yaml +models: + gemini-grounded: + provider: google + model: gemini-2.5-flash + provider_opts: + google_search: true + google_maps: true + code_execution: true +``` + +| Option | Description | +| ---------------- | ---------------------------------------------------- | +| `google_search` | Enables Google Search grounding for up-to-date info | +| `google_maps` | Enables Google Maps grounding for location queries | +| `code_execution` | Enables server-side code execution for computations | + +## Vertex AI Model Garden + +You can use non-Gemini models (e.g. Claude, Llama) hosted on Google Cloud's +[Vertex AI Model Garden](https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/use-partner-models) +through the `google` provider. When a `publisher` is specified in `provider_opts`, +requests are routed through the appropriate Vertex AI endpoint instead of the +Gemini SDK: + +- **Anthropic Claude** (`publisher: anthropic`) uses the Anthropic-native + `:rawPredict` / `:streamRawPredict` endpoints. Claude models on Vertex AI do + not support the OpenAI `/chat/completions` path. +- **Other publishers** (e.g. `meta`, `mistral`) use Vertex AI's + OpenAI-compatible `/chat/completions` endpoint. + +### Authentication + +Vertex AI uses Google Cloud Application Default Credentials (ADC). Make sure you +are authenticated: + +```bash +gcloud auth application-default login +``` + +### Configuration + +```yaml +models: + claude-on-vertex: + provider: google + model: claude-sonnet-4-20250514 + provider_opts: + project: my-gcp-project # GCP project ID (or set GOOGLE_CLOUD_PROJECT) + location: us-east5 # GCP region (or set GOOGLE_CLOUD_LOCATION) + publisher: anthropic # Model publisher (anthropic, meta, etc.) +``` + +| Option | Description | +| ----------- | ------------------------------------------------------------------------------------ | +| `project` | GCP project ID. Falls back to `GOOGLE_CLOUD_PROJECT` env var | +| `location` | GCP region (e.g. `us-east5`, `us-central1`). Falls back to `GOOGLE_CLOUD_LOCATION` | +| `publisher` | Model publisher (e.g. `anthropic`, `meta`, `mistral`). Must not be `google` | + +> [!NOTE] +> **Gemini models on Vertex AI** +> +> Setting `publisher: google` (or omitting `publisher`) uses the native Gemini SDK path. The Model Garden endpoint is only used for non-Google publishers. diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/groq/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/groq/index.md new file mode 100644 index 0000000000..50464afcfd --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/groq/index.md @@ -0,0 +1,98 @@ +--- +title: "Groq" +description: "Use Groq fast-inference models with docker-agent." +keywords: docker agent, ai agents, model providers, llm, groq +weight: 130 +--- + +_Use Groq models with docker-agent._ + +## Overview + +[Groq](https://groq.com/) serves open-weight models on its LPU inference engine +through an OpenAI-compatible API, with a focus on very low latency. docker-agent +includes built-in support for Groq as an alias provider. + +## Setup + +1. Create an API key from the [Groq Console](https://console.groq.com/keys). +2. Set the environment variable: + + ```bash + export GROQ_API_KEY=your-api-key + ``` + +## Usage + +### Inline Syntax + +The simplest way to use Groq: + +```yaml +agents: + root: + model: groq/llama-3.3-70b-versatile + description: Assistant using Groq + instruction: You are a helpful assistant. +``` + +### Named Model + +For more control over parameters: + +```yaml +models: + groq_model: + provider: groq + model: llama-3.3-70b-versatile + temperature: 0.7 + max_tokens: 8192 + +agents: + root: + model: groq_model + description: Assistant using Groq + instruction: You are a helpful assistant. +``` + +## Available Models + +Groq hosts a rotating catalogue of open-weight models. Check the +[Groq models documentation](https://console.groq.com/docs/models) for current +model IDs, context limits, and rate limits. + +| Model | Description | +| --- | --- | +| `llama-3.3-70b-versatile` | Llama 3.3 70B, reliable general-purpose chat and tool calling | +| `llama-3.1-8b-instant` | Llama 3.1 8B, fastest and cheapest | +| `openai/gpt-oss-120b` | GPT-OSS 120B, strong reasoning and tool calling | +| `openai/gpt-oss-20b` | GPT-OSS 20B, compact reasoning model | +| `qwen/qwen3-32b` | Qwen3 32B, reasoning and tool calling | +| `meta-llama/llama-4-scout-17b-16e-instruct` | Llama 4 Scout MoE | + +> Model IDs are case-sensitive and must be passed exactly as the catalogue lists +> them. + +## How It Works + +Groq is implemented as a built-in alias in docker-agent: + +- **API Type:** OpenAI-compatible (`openai_chatcompletions`) +- **Base URL:** `https://api.groq.com/openai/v1` +- **Token Variable:** `GROQ_API_KEY` + +## Example: Code Assistant + +```yaml +agents: + coder: + model: groq/llama-3.3-70b-versatile + description: Code assistant using Llama 3.3 + instruction: | + You are an expert programmer. + Write clean, well-documented code and follow language best practices. + toolsets: + - type: filesystem + - type: shell + - type: think +``` diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/huggingface/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/huggingface/index.md new file mode 100644 index 0000000000..685b4899df --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/huggingface/index.md @@ -0,0 +1,100 @@ +--- +title: "Hugging Face" +description: "Use Hugging Face Inference Providers with docker-agent." +keywords: docker agent, ai agents, model providers, llm, hugging face +weight: 140 +--- + +_Use Hugging Face Inference Providers with docker-agent._ + +## Overview + +[Hugging Face Inference Providers](https://huggingface.co/docs/inference-providers/index) +routes requests to open models (Llama, Qwen, DeepSeek, Kimi, GLM and others) +across many backends through a single OpenAI-compatible endpoint. docker-agent +includes built-in support for Hugging Face as an alias provider. + +## Setup + +1. Create a token from the [Hugging Face token settings](https://huggingface.co/settings/tokens). +2. Set the environment variable: + + ```bash + export HF_TOKEN=your-token + ``` + +## Usage + +### Inline Syntax + +The simplest way to use Hugging Face: + +```yaml +agents: + root: + model: huggingface/meta-llama/Llama-3.3-70B-Instruct + description: Assistant using Hugging Face Inference Providers + instruction: You are a helpful assistant. +``` + +### Named Model + +For more control over parameters: + +```yaml +models: + huggingface_model: + provider: huggingface + model: meta-llama/Llama-3.3-70B-Instruct + temperature: 0.7 + max_tokens: 8192 + +agents: + root: + model: huggingface_model + description: Assistant using Hugging Face Inference Providers + instruction: You are a helpful assistant. +``` + +## Available Models + +Hugging Face routes to a broad, changing catalog of open-weight models. Check the +[Hugging Face models page](https://huggingface.co/models?inference_provider=all) +for current model IDs, context limits, and pricing. + +| Model | Description | +| --- | --- | +| `meta-llama/Llama-3.3-70B-Instruct` | Llama 3.3 70B, general-purpose chat and tool calling | +| `Qwen/Qwen3-235B-A22B` | Qwen3 235B mixture-of-experts instruct model | +| `deepseek-ai/DeepSeek-V3.2` | DeepSeek, strong coding and reasoning | + +> Model IDs are case-sensitive and must be passed exactly as the catalogue lists +> them. + +## How It Works + +Hugging Face is implemented as a built-in alias in docker-agent: + +- **API Type:** OpenAI-compatible (`openai_chatcompletions`) +- **Base URL:** `https://router.huggingface.co/v1` +- **Token Variable:** `HF_TOKEN` + +Because Hugging Face fronts open-weight models whose chat templates may reject +more than one leading system message, docker-agent coalesces its per-source +system messages into a single one for this provider. + +## Example: Code Assistant + +```yaml +agents: + coder: + model: huggingface/Qwen/Qwen3-Coder-480B-A35B-Instruct + description: Code assistant using Qwen3 Coder on Hugging Face + instruction: | + You are an expert programmer. + Write clean, well-documented code and follow language best practices. + toolsets: + - type: filesystem + - type: shell + - type: think +``` diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/local/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/local/index.md new file mode 100644 index 0000000000..ad11fcc949 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/local/index.md @@ -0,0 +1,221 @@ +--- +title: "Local Models (Ollama, vLLM, LocalAI)" +description: "Run docker-agent with locally hosted models for privacy, offline use, or cost savings." +keywords: docker agent, ai agents, model providers, llm, local models (ollama, vllm, localai) +linkTitle: "Local Models" +weight: 150 +aliases: + - /ai/docker-agent/local-models/ +--- + +_Run docker-agent with locally hosted models for privacy, offline use, or cost savings._ + +## Overview + +docker-agent can connect to any OpenAI-compatible local model server. This guide covers the most popular options: + +- **Ollama** — Easy-to-use local model runner +- **vLLM** — High-performance inference server +- **LocalAI** — OpenAI-compatible API for various backends + +> [!TIP] +> **Docker Model Runner** +> +> For the easiest local model experience, consider [Docker Model Runner](../dmr/index.md) which is built into Docker Desktop and requires no additional setup. + +## Ollama + +Ollama is a popular tool for running LLMs locally. docker-agent includes a built-in `ollama` alias for easy configuration. + +### Setup + +1. Install Ollama from [ollama.ai](https://ollama.ai/) +2. Pull a model: + + ```bash + ollama pull llama3.2 + ollama pull qwen2.5-coder + ``` + +3. Start the Ollama server (usually runs automatically): + + ```bash + ollama serve + ``` + +### Configuration + +Use the built-in `ollama` alias: + +```yaml +agents: + root: + model: ollama/llama3.2 + description: Local assistant + instruction: You are a helpful assistant. +``` + +The `ollama` alias automatically uses: + +- **Base URL:** `http://localhost:11434/v1` +- **API Type:** OpenAI-compatible +- **No API key required** + +### Custom Port or Host + +If Ollama runs on a different host or port: + +```yaml +models: + my_ollama: + provider: ollama + model: llama3.2 + base_url: http://192.168.1.100:11434/v1 + +agents: + root: + model: my_ollama + description: Remote Ollama assistant + instruction: You are a helpful assistant. +``` + +### Popular Ollama Models + +| Model | Size | Best For | +| ---------------- | ---- | --------------------- | +| `llama3.2` | 3B | General purpose, fast | +| `llama3.1` | 8B | Better reasoning | +| `qwen2.5-coder` | 7B | Code generation | +| `mistral` | 7B | General purpose | +| `codellama` | 7B | Code tasks | +| `deepseek-coder` | 6.7B | Code generation | + +## vLLM + +vLLM is a high-performance inference server optimized for throughput. + +### Setup + +```bash +# Install vLLM +pip install vllm + +# Start the server +python -m vllm.entrypoints.openai.api_server \ + --model meta-llama/Llama-3.2-3B-Instruct \ + --port 8000 +``` + +### Configuration + +```yaml +providers: + vllm: + api_type: openai_chatcompletions + base_url: http://localhost:8000/v1 + +agents: + root: + model: vllm/meta-llama/Llama-3.2-3B-Instruct + description: vLLM-powered assistant + instruction: You are a helpful assistant. +``` + +## LocalAI + +LocalAI provides an OpenAI-compatible API that works with various backends. + +### Setup + +```bash +# Run with Docker +docker run -p 8080:8080 --name local-ai \ + -v ./models:/models \ + localai/localai:latest-cpu +``` + +### Configuration + +```yaml +providers: + localai: + api_type: openai_chatcompletions + base_url: http://localhost:8080/v1 + +agents: + root: + model: localai/gpt4all-j + description: LocalAI assistant + instruction: You are a helpful assistant. +``` + +## Generic Custom Provider + +For any OpenAI-compatible server: + +```yaml +providers: + my_server: + api_type: openai_chatcompletions + base_url: http://localhost:8000/v1 + # token_key: MY_API_KEY # if auth required + +agents: + root: + model: my_server/model-name + description: Custom server assistant + instruction: You are a helpful assistant. +``` + +## Performance Tips + +> [!NOTE] +> **Local Model Considerations** +> +> - **Memory:** Larger models need more RAM/VRAM. A 7B model typically needs 8-16GB RAM. +> - **GPU:** GPU acceleration dramatically improves speed. Check your server's GPU support. +> - **Context length:** Local models often have smaller context windows than cloud models. +> - **Tool calling:** Not all local models support function/tool calling. Test your model's capabilities. + +## Example: Offline Development Agent + +```yaml +agents: + developer: + model: ollama/qwen2.5-coder + description: Offline code assistant + instruction: | + You are a software developer working offline. + Focus on code quality and clear explanations. + max_iterations: 20 + toolsets: + - type: filesystem + - type: shell + - type: think + - type: todo +``` + +## Troubleshooting + +### Connection Refused + +Ensure your model server is running and accessible: + +```bash +curl http://localhost:11434/v1/models # Ollama +curl http://localhost:8000/v1/models # vLLM +``` + +### Model Not Found + +Verify the model is downloaded/available: + +```bash +ollama list # List available Ollama models +``` + +### Slow Responses + +- Check if GPU acceleration is enabled +- Try a smaller model +- Reduce `max_tokens` in your config diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/minimax/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/minimax/index.md new file mode 100644 index 0000000000..1f62da3677 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/minimax/index.md @@ -0,0 +1,91 @@ +--- +title: "MiniMax" +description: "Use MiniMax AI models with docker-agent." +keywords: docker agent, ai agents, model providers, llm, minimax +weight: 160 +--- + +_Use MiniMax AI models with docker-agent._ + +## Overview + +MiniMax provides AI models through an OpenAI-compatible API. docker-agent includes built-in support for MiniMax as an alias provider. + +## Setup + +1. Get an API key from [MiniMax](https://www.minimaxi.com/) +2. Set the environment variable: + + ```bash + export MINIMAX_API_KEY=your-api-key + ``` + +## Usage + +### Inline Syntax + +The simplest way to use MiniMax: + +```yaml +agents: + root: + model: minimax/MiniMax-M2.5 + description: Assistant using MiniMax + instruction: You are a helpful assistant. +``` + +### Named Model + +For more control over parameters: + +```yaml +models: + minimax_model: + provider: minimax + model: MiniMax-M2.5 + temperature: 0.7 + max_tokens: 8192 + +agents: + root: + model: minimax_model + description: Assistant using MiniMax + instruction: You are a helpful assistant. +``` + +## Available Models + +Check the [MiniMax documentation](https://www.minimaxi.com/document/introduction) for the current model catalog. + +| Model | Description | +| ------------------------ | ----------------------------------------------- | +| `MiniMax-M2.5` | Peak performance, 204K context | +| `MiniMax-M2.5-highspeed` | Same as M2.5 but faster (~100 tps) | +| `MiniMax-M2.1` | Multi-language programming capabilities | +| `MiniMax-M2.1-highspeed` | Faster variant of M2.1 (~100 tps) | +| `MiniMax-M2` | Agentic capabilities, advanced reasoning | + +## How It Works + +MiniMax is implemented as a built-in alias in docker-agent: + +- **API Type:** OpenAI-compatible (`openai`) +- **Base URL:** `https://api.minimax.io/v1` +- **Token Variable:** `MINIMAX_API_KEY` + +## Example: Code Assistant + +```yaml +agents: + coder: + model: minimax/MiniMax-M2.5 + description: Code assistant using MiniMax + instruction: | + You are an expert programmer using MiniMax M2.5. + Write clean, well-documented code. + Follow best practices for the language being used. + toolsets: + - type: filesystem + - type: shell + - type: think +``` diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/mistral/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/mistral/index.md new file mode 100644 index 0000000000..92b70f5d2a --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/mistral/index.md @@ -0,0 +1,105 @@ +--- +title: "Mistral" +description: "Use Mistral AI models with docker-agent." +keywords: docker agent, ai agents, model providers, llm, mistral +weight: 170 +--- + +_Use Mistral AI models with docker-agent._ + +## Overview + +Mistral AI provides powerful language models through an OpenAI-compatible API. docker-agent includes built-in support for Mistral as an alias provider. + +## Setup + +1. Get an API key from [Mistral Console](https://console.mistral.ai/) +2. Set the environment variable: + + ```bash + export MISTRAL_API_KEY=your-api-key + ``` + +## Usage + +### Inline Syntax + +The simplest way to use Mistral: + +```yaml +agents: + root: + model: mistral/mistral-large-latest + description: Assistant using Mistral + instruction: You are a helpful assistant. +``` + +### Named Model + +For more control over parameters: + +```yaml +models: + mistral: + provider: mistral + model: mistral-large-latest + temperature: 0.7 + max_tokens: 8192 + +agents: + root: + model: mistral + description: Assistant using Mistral + instruction: You are a helpful assistant. +``` + +## Available Models + +| Model | Description | Context | +| ----------------------- | --------------------------------- | ------- | +| `mistral-large-latest` | Most capable Mistral model | 128K | +| `mistral-medium-latest` | Balanced performance and cost | 128K | +| `mistral-small-latest` | Fast and cost-effective (default) | 128K | +| `codestral-latest` | Optimized for code generation | 32K | +| `open-mistral-nemo` | Open-weight model | 128K | +| `ministral-8b-latest` | Compact 8B parameter model | 128K | +| `ministral-3b-latest` | Smallest Mistral model | 128K | + +Check the [Mistral Models documentation](https://docs.mistral.ai/getting-started/models/) for the latest available models. + +## Auto-Detection + +When you run `docker agent run` without specifying a config, docker-agent automatically detects available providers. If `MISTRAL_API_KEY` is set and higher-priority providers (OpenAI, Anthropic, Google) are not available, Mistral will be used with `mistral-small-latest` as the default model. + +## Extended Thinking + +docker-agent's `thinking_budget` field is **not applied** to Mistral models: the underlying OpenAI-compatible client only sends `reasoning_effort` for OpenAI reasoning model names (o-series, gpt-5). Setting `thinking_budget` on a Mistral model passes config validation but has no effect on the request. + +Mistral reasoning models (e.g. `magistral`) reason on their own without configuration. For non-reasoning models, use the [think tool](../../tools/think/index.md) instead. + +## How It Works + +Mistral is implemented as a built-in alias in docker-agent: + +- **API Type:** OpenAI-compatible (`openai_chatcompletions`) +- **Base URL:** `https://api.mistral.ai/v1` +- **Token Variable:** `MISTRAL_API_KEY` + +This means Mistral uses the same client as OpenAI, making it fully compatible with all OpenAI features supported by docker-agent. + +## Example: Code Assistant + +```yaml +agents: + coder: + model: mistral/codestral-latest + description: Expert code assistant + instruction: | + You are an expert programmer using Codestral. + Write clean, efficient, well-documented code. + Explain your reasoning when helpful. + toolsets: + - type: filesystem + - type: shell + - type: think +``` diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/moonshot/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/moonshot/index.md new file mode 100644 index 0000000000..b48684481a --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/moonshot/index.md @@ -0,0 +1,96 @@ +--- +title: "Moonshot AI" +description: "Use Moonshot AI (Kimi) models with docker-agent." +keywords: docker agent, ai agents, model providers, llm, moonshot ai +weight: 180 +--- + +_Use Moonshot AI (Kimi) models with docker-agent._ + +## Overview + +[Moonshot AI](https://www.moonshot.ai/) serves its Kimi model family through an +OpenAI-compatible API. The Kimi K2 models have strong momentum for coding and +agentic tasks. docker-agent includes built-in support for Moonshot AI as an +alias provider. + +## Setup + +1. Create an API key from the [Moonshot AI console](https://platform.moonshot.ai/console/api-keys). +2. Set the environment variable: + + ```bash + export MOONSHOT_API_KEY=your-api-key + ``` + +## Usage + +### Inline Syntax + +The simplest way to use Moonshot AI: + +```yaml +agents: + root: + model: moonshot/kimi-k2-0905-preview + description: Assistant using Moonshot AI + instruction: You are a helpful assistant. +``` + +### Named Model + +For more control over parameters: + +```yaml +models: + moonshot_model: + provider: moonshot + model: kimi-k2-0905-preview + temperature: 0.7 + max_tokens: 8192 + +agents: + root: + model: moonshot_model + description: Assistant using Moonshot AI + instruction: You are a helpful assistant. +``` + +## Available Models + +Moonshot AI exposes a vendor-controlled Kimi model lineup. Check the +[Moonshot API documentation](https://platform.moonshot.ai/docs/api) for current +model IDs, context limits, and pricing. + +| Model | Description | +| --- | --- | +| `kimi-k2-0905-preview` | Kimi K2, general-purpose chat, coding, and tool calling | +| `kimi-k2-turbo-preview` | Kimi K2 optimized for higher throughput | +| `kimi-k2-thinking` | Kimi K2 extended-reasoning model | + +> Model IDs are case-sensitive and must be passed exactly as the catalogue lists +> them. + +## How It Works + +Moonshot AI is implemented as a built-in alias in docker-agent: + +- **API Type:** OpenAI-compatible (`openai_chatcompletions`) +- **Base URL:** `https://api.moonshot.ai/v1` +- **Token Variable:** `MOONSHOT_API_KEY` + +## Example: Code Assistant + +```yaml +agents: + coder: + model: moonshot/kimi-k2-0905-preview + description: Code assistant using Kimi K2 + instruction: | + You are an expert programmer. + Write clean, well-documented code and follow language best practices. + toolsets: + - type: filesystem + - type: shell + - type: think +``` diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/nebius/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/nebius/index.md new file mode 100644 index 0000000000..295efa2bfd --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/nebius/index.md @@ -0,0 +1,89 @@ +--- +title: "Nebius" +description: "Use Nebius AI models with docker-agent." +keywords: docker agent, ai agents, model providers, llm, nebius +weight: 190 +--- + +_Use Nebius AI models with docker-agent._ + +## Overview + +Nebius provides AI models through an OpenAI-compatible API. docker-agent includes built-in support for Nebius as an alias provider. + +## Setup + +1. Get an API key from [Nebius AI](https://nebius.ai/) +2. Set the environment variable: + + ```bash + export NEBIUS_API_KEY=your-api-key + ``` + +## Usage + +### Inline Syntax + +The simplest way to use Nebius: + +```yaml +agents: + root: + model: nebius/deepseek-ai/DeepSeek-V3 + description: Assistant using Nebius + instruction: You are a helpful assistant. +``` + +### Named Model + +For more control over parameters: + +```yaml +models: + nebius_model: + provider: nebius + model: deepseek-ai/DeepSeek-V3 + temperature: 0.7 + max_tokens: 8192 + +agents: + root: + model: nebius_model + description: Assistant using Nebius + instruction: You are a helpful assistant. +``` + +## Available Models + +Nebius hosts various open models. Check the [Nebius documentation](https://nebius.ai/docs) for the current model catalog. + +| Model | Description | +| ----------------------------------- | ------------------------------- | +| `deepseek-ai/DeepSeek-V3` | DeepSeek V3 model | +| `Qwen/Qwen2.5-72B-Instruct` | Qwen 2.5 72B instruction-tuned | +| `meta-llama/Llama-3.3-70B-Instruct` | Llama 3.3 70B instruction-tuned | + +## How It Works + +Nebius is implemented as a built-in alias in docker-agent: + +- **API Type:** OpenAI-compatible (`openai_chatcompletions`) +- **Base URL:** `https://api.studio.nebius.com/v1` +- **Token Variable:** `NEBIUS_API_KEY` + +## Example: Code Assistant + +```yaml +agents: + coder: + model: nebius/deepseek-ai/DeepSeek-V3 + description: Code assistant using DeepSeek + instruction: | + You are an expert programmer using DeepSeek V3. + Write clean, well-documented code. + Follow best practices for the language being used. + toolsets: + - type: filesystem + - type: shell + - type: think +``` diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/openai/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/openai/index.md new file mode 100644 index 0000000000..2ef18bbbdd --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/openai/index.md @@ -0,0 +1,126 @@ +--- +title: "OpenAI" +description: "Use GPT-4o, GPT-5, GPT-5-mini, and other OpenAI models with docker-agent." +keywords: docker agent, ai agents, model providers, llm, openai +weight: 200 +--- + +_Use GPT-4o, GPT-5, GPT-5-mini, and other OpenAI models with docker-agent._ + +## Setup + +```bash +# Set your API key +export OPENAI_API_KEY="sk-..." +``` + +## Configuration + +### Inline + +```yaml +agents: + root: + model: openai/gpt-5 +``` + +### Named Model + +```yaml +models: + gpt: + provider: openai + model: gpt-5 + temperature: 0.7 + max_tokens: 4000 +``` + +## Available Models + +| Model | Best For | +| ------------- | ------------------------------------ | +| `gpt-5` | Most capable, complex reasoning | +| `gpt-5-mini` | Fast, cost-effective, good reasoning | +| `gpt-4o` | Multimodal, balanced performance | +| `gpt-4o-mini` | Cheapest, fast for simple tasks | + +Find more model names at [modelnames.ai](https://modelnames.ai/) or in the [official OpenAI docs](https://platform.openai.com/docs/models). + +## Thinking Budget + +OpenAI reasoning models (o-series, gpt-5, gpt-5-mini) support extended thinking through the `reasoning_effort` API parameter. Set `thinking_budget` to control the effort level: + +```yaml +models: + gpt-thinker: + provider: openai + model: gpt-5-mini + thinking_budget: high # minimal | low | medium | high | xhigh +``` + +**Effort levels:** + +| Level | Description | +| --------- | -------------------------------------------------------- | +| `none` | Don't request extra reasoning (alias for `0`); the API's own default still applies. | +| `minimal` | Fastest; lightest reasoning pass. | +| `low` | Quick reasoning for straightforward tasks. | +| `medium` | Balanced default. | +| `high` | More thorough; recommended for complex tasks. | +| `xhigh` | Near-maximum effort; slower but most accurate. | + +These are the **only** values OpenAI accepts — token counts, `max`, `adaptive`, and `adaptive/` are rejected with a configuration error at request time. Older models (o1, o3-mini) only accept `low`/`medium`/`high`. + +> [!WARNING] +> **Hidden reasoning tokens** +> +> OpenAI reasoning models always produce hidden reasoning tokens that count against `max_tokens` — even with `thinking_budget: none`. docker-agent automatically raises the output-token floor for its internal low-effort calls so reasoning cannot starve visible text output. + +See the [Thinking / Reasoning guide](../../guides/thinking/index.md) for a cross-provider overview. + +> [!TIP] +> **Custom endpoints** +> +> Use `base_url` for proxies and OpenAI-compatible services. See [Custom Providers](../custom/index.md) for full setup. + +## Custom Endpoint + +Use `base_url` to connect to OpenAI-compatible APIs: + +```yaml +models: + custom: + provider: openai + model: gpt-5-mini + base_url: https://your-proxy.example.com/v1 +``` + +## WebSocket Transport + +For OpenAI Responses API models (gpt-4.1+, o-series, gpt-5), you can use WebSocket streaming instead of the default SSE (Server-Sent Events): + +```yaml +models: + fast-gpt: + provider: openai + model: gpt-4.1 + provider_opts: + transport: websocket # Use WebSocket instead of SSE +``` + +### Benefits + +- **~40% faster** for workflows with 20+ tool calls +- **Persistent connection** reduces per-turn overhead +- **Server-side caching** of connection state +- **Automatic fallback** to SSE if WebSocket fails + +### Requirements + +- Only works with Responses API models: `gpt-4.1+`, `o1`, `o3`, `o4`, `gpt-5` +- NOT compatible with the `--models-gateway` flag (automatically falls back to SSE when a gateway is configured) +- Requires `OPENAI_API_KEY` environment variable + +### Example + +See [`examples/websocket_transport.yaml`](https://github.com/docker/docker-agent/blob/main/examples/websocket_transport.yaml) for a complete example. diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/opencode-go/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/opencode-go/index.md new file mode 100644 index 0000000000..8c6f2bb0bc --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/opencode-go/index.md @@ -0,0 +1,159 @@ +--- +title: "OpenCode Go" +description: "Use OpenCode Go models with docker-agent." +keywords: docker agent, ai agents, model providers, llm, opencode go +weight: 210 +--- + +_Use OpenCode Go models with docker-agent._ + +## Overview + +[OpenCode Go](https://opencode.ai/docs/go) is a low-cost subscription service ($5 first month, then $10/month) that provides reliable access to popular open-source coding models. It serves models through both OpenAI-compatible and Anthropic-compatible APIs from globally distributed endpoints. + +docker-agent includes built-in support for OpenCode Go as an alias provider. + +## Setup + +1. Subscribe to OpenCode Go at [opencode.ai/auth](https://opencode.ai/auth) +2. Copy your API key from the console +3. Set the environment variable: + + ```bash + export OPENCODE_API_KEY=your-api-key + ``` + +## Usage + +### Inline Syntax + +The simplest way to use OpenCode Go: + +```yaml +agents: + root: + model: opencode-go/deepseek-v4-flash + description: Assistant using OpenCode Go + instruction: You are a helpful assistant. +``` + +### Named Model + +For more control over parameters: + +```yaml +models: + my_model: + provider: opencode-go + model: deepseek-v4-pro + temperature: 0.7 + max_tokens: 8192 + +agents: + root: + model: my_model + description: Assistant using OpenCode Go + instruction: You are a helpful assistant. +``` + +## Available Models + +You can retrieve the full, up-to-date model list at any time: + +```bash +curl https://opencode.ai/zen/go/v1/models +``` + +### OpenAI-Compatible + +These models use the `/v1/chat/completions` endpoint and work directly with the `opencode-go` alias: + +| Model | Description | +| ------------------- | ------------------------------------- | +| `deepseek-v4-flash` | Fast and cost-effective DeepSeek model | +| `deepseek-v4-pro` | Most capable DeepSeek model | +| `kimi-k2.7-code` | Kimi K2.7 optimized for code | +| `kimi-k2.6` | Kimi K2.6 model | +| `kimi-k2.5` | Kimi K2.5 model | +| `glm-5.2` | GLM 5.2 flagship model | +| `glm-5.1` | GLM 5.1 model | +| `glm-5` | GLM 5 model | +| `mimo-v2.5` | MiMo V2.5 efficient model | +| `mimo-v2.5-pro` | MiMo V2.5 Pro model | +| `mimo-v2-pro` | MiMo V2 Pro model | +| `mimo-v2-omni` | MiMo V2 Omni model | +| `hy3-preview` | HY3 preview model | + +### Anthropic-Compatible + +These models use the `/v1/messages` endpoint and require a [custom provider definition](../custom/index.md): + +| Model | Description | +| ----------------- | ------------------------ | +| `minimax-m3` | MiniMax M3 model | +| `minimax-m2.7` | MiniMax M2.7 model | +| `minimax-m2.5` | MiniMax M2.5 model | +| `qwen3.7-max` | Qwen 3.7 Max model | +| `qwen3.7-plus` | Qwen 3.7 Plus model | +| `qwen3.6-plus` | Qwen 3.6 Plus model | +| `qwen3.5-plus` | Qwen 3.5 Plus model | + +To use an Anthropic-compatible model, define a custom provider: + +```yaml +providers: + opengo-ant: + provider: anthropic + base_url: https://opencode.ai/zen/go + token_key: OPENCODE_API_KEY + +models: + qwen: + provider: opengo-ant + model: qwen3.7-max + +agents: + root: + model: qwen + description: Assistant using Qwen through OpenCode Go + instruction: You are a helpful assistant. +``` + +## How It Works + +OpenCode Go is implemented as a built-in alias in docker-agent: + +- **API Type:** OpenAI-compatible (`openai_chatcompletions`) +- **Base URL:** `https://opencode.ai/zen/go/v1` +- **Token Variable:** `OPENCODE_API_KEY` + +This means OpenCode Go uses the same client as OpenAI, making it fully compatible with all OpenAI features supported by docker-agent. + +For Anthropic-compatible models (MiniMax, Qwen), docker-agent uses a custom provider pointing to the Anthropic client at `https://opencode.ai/zen/go` with the same token. + +## Example: Code Assistant + +```yaml +agents: + coder: + model: opencode-go/deepseek-v4-flash + description: Expert code assistant + instruction: | + You are an expert programmer using DeepSeek V4 Flash. + Write clean, efficient, well-documented code. + Explain your reasoning when helpful. + toolsets: + - type: filesystem + - type: shell + - type: think +``` + +## Usage Limits + +OpenCode Go subscriptions include the following limits: + +- **5-hour rolling limit** — $12 of usage +- **Weekly limit** — $30 of usage +- **Monthly limit** — $60 of usage + +Limits are defined as dollar values. More expensive models allow fewer requests per limit period. You can also [add Zen balance](https://opencode.ai/auth) to continue usage beyond the limits. diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/opencode-zen/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/opencode-zen/index.md new file mode 100644 index 0000000000..545bc3e2c4 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/opencode-zen/index.md @@ -0,0 +1,223 @@ +--- +title: "OpenCode Zen" +description: "Use OpenCode Zen models with docker-agent." +keywords: docker agent, ai agents, model providers, llm, opencode zen +weight: 220 +--- + +_Use OpenCode Zen models with docker-agent._ + +## Overview + +[OpenCode Zen](https://opencode.ai/docs/zen) is a curated gateway of tested and verified AI models provided by the OpenCode team. It offers pay-per-use access to a wide range of models — from GPT and Claude to open-source models — all through a single API key. Several free models are also available. + +docker-agent includes built-in support for OpenCode Zen as an alias provider for OpenAI-compatible models. Anthropic and Google models are supported via custom provider definitions. + +## Setup + +1. Sign in to [OpenCode Zen](https://opencode.ai/auth), add billing information, and copy your API key +2. Set the environment variable: + + ```bash + export OPENCODE_API_KEY=your-api-key + ``` + +3. Verify available models: + + ```bash + curl https://opencode.ai/zen/v1/models + ``` + +## Usage + +### Inline Syntax + +The simplest way to use OpenCode Zen with a free model: + +```yaml +agents: + root: + model: opencode-zen/deepseek-v4-flash-free + description: Assistant using OpenCode Zen (free) + instruction: You are a helpful assistant. +``` + +### Named Model + +For more control over parameters: + +```yaml +models: + zen_model: + provider: opencode-zen + model: gpt-5.5 + temperature: 0.7 + max_tokens: 16384 + +agents: + root: + model: zen_model + description: Assistant using OpenCode Zen + instruction: You are a helpful assistant. +``` + +## Available Models + +### Free Models + +These models are available at no cost: + +| Model | Description | +| ------------------------- | ---------------------------------- | +| `deepseek-v4-flash-free` | Free DeepSeek V4 Flash | +| `mimo-v2.5-free` | Free MiMo V2.5 model | +| `qwen3.6-plus-free` | Free Qwen 3.6 Plus model | +| `minimax-m3-free` | Free MiniMax M3 model | +| `nemotron-3-ultra-free` | Free Nemotron 3 Ultra model | +| `north-mini-code-free` | Free North Mini Code model | +| `big-pickle` | Free stealth model | + +### OpenAI-Compatible (Chat Completions) + +These models use the `/v1/chat/completions` endpoint and work directly with the `opencode-zen` alias: + +| Model | Description | +| --------------------- | ---------------------------------- | +| `deepseek-v4-pro` | DeepSeek V4 Pro model | +| `deepseek-v4-flash` | Fast DeepSeek V4 model | +| `glm-5.2` | GLM 5.2 model | +| `glm-5.1` | GLM 5.1 model | +| `glm-5` | GLM 5 model | +| `kimi-k2.6` | Kimi K2.6 model | +| `kimi-k2.5` | Kimi K2.5 model | +| `minimax-m2.7` | MiniMax M2.7 model | +| `minimax-m2.5` | MiniMax M2.5 model | +| `grok-build-0.1` | Grok Build 0.1 model | + +### OpenAI-Compatible (Responses API) + +These models use the `/v1/responses` endpoint and are auto-detected by docker-agent based on the model name: + +| Model | Description | +| ---------------------- | --------------------------------- | +| `gpt-5.5` | Latest GPT model | +| `gpt-5.5-pro` | GPT 5.5 Pro, highest capability | +| `gpt-5.4` | GPT 5.4 model | +| `gpt-5.4-pro` | GPT 5.4 Pro model | +| `gpt-5.4-mini` | GPT 5.4 Mini model | +| `gpt-5.4-nano` | GPT 5.4 Nano, fastest | +| `gpt-5.3-codex` | GPT 5.3 Codex for coding | +| `gpt-5.3-codex-spark` | GPT 5.3 Codex Spark | +| `gpt-5.2` | GPT 5.2 model | +| `gpt-5.2-codex` | GPT 5.2 Codex | +| `gpt-5.1` | GPT 5.1 model | +| `gpt-5.1-codex` | GPT 5.1 Codex | +| `gpt-5.1-codex-max` | GPT 5.1 Codex Max | +| `gpt-5.1-codex-mini` | GPT 5.1 Codex Mini | +| `gpt-5` | GPT 5 model | +| `gpt-5-codex` | GPT 5 Codex | +| `gpt-5-nano` | GPT 5 Nano | + +### Anthropic-Compatible (Messages API) + +These models use the `/v1/messages` endpoint and require a [custom provider definition](../custom/index.md): + +| Model | Description | +| ----------------------- | ----------------------------- | +| `claude-fable-5` | Claude Fable 5 model | +| `claude-opus-4-8` | Claude Opus 4.8 model | +| `claude-opus-4-7` | Claude Opus 4.7 model | +| `claude-opus-4-6` | Claude Opus 4.6 model | +| `claude-opus-4-5` | Claude Opus 4.5 model | +| `claude-opus-4-1` | Claude Opus 4.1 model | +| `claude-sonnet-4-6` | Claude Sonnet 4.6 model | +| `claude-sonnet-4-5` | Claude Sonnet 4.5 model | +| `claude-sonnet-4` | Claude Sonnet 4 model | +| `claude-haiku-4-5` | Claude Haiku 4.5 model | +| `qwen3.7-max` | Qwen 3.7 Max model | +| `qwen3.7-plus` | Qwen 3.7 Plus model | +| `qwen3.6-plus` | Qwen 3.6 Plus model | +| `qwen3.5-plus` | Qwen 3.5 Plus model | + +To use an Anthropic-compatible model: + +```yaml +providers: + opencode-zen-claude: + provider: anthropic + base_url: https://opencode.ai/zen + token_key: OPENCODE_API_KEY + +models: + claude: + provider: opencode-zen-claude + model: claude-sonnet-4-5 + +agents: + root: + model: claude + description: Assistant using Claude through OpenCode Zen + instruction: You are a helpful assistant. +``` + +### Google-Compatible + +These models require a [custom provider definition](../custom/index.md) with a Google-compatible client: + +| Model | Description | +| ------------------- | ------------------------ | +| `gemini-3.5-flash` | Gemini 3.5 Flash model | +| `gemini-3.1-pro` | Gemini 3.1 Pro model | +| `gemini-3-flash` | Gemini 3 Flash model | + +To use a Google model: + +```yaml +providers: + opencode-zen-gemini: + provider: google + base_url: https://opencode.ai/zen + token_key: OPENCODE_API_KEY + +models: + gemini: + provider: opencode-zen-gemini + model: gemini-3.5-flash + +agents: + root: + model: gemini + description: Assistant using Gemini through OpenCode Zen + instruction: You are a helpful assistant. +``` + +## How It Works + +OpenCode Zen is implemented as a built-in alias in docker-agent: + +- **API Type:** OpenAI-compatible (auto-detects Responses API for GPT models, Chat Completions for others) +- **Base URL:** `https://opencode.ai/zen/v1` +- **Token Variable:** `OPENCODE_API_KEY` + +The same API key works for both OpenCode Go and OpenCode Zen — they are part of the same platform. Zen uses a pay-per-use billing model, while Go uses a fixed subscription. + +For Anthropic-compatible models, docker-agent uses a custom provider pointing to the Anthropic client at `https://opencode.ai/zen` with the same token. For Google models, a custom provider points to the Google client at `https://opencode.ai/zen` (the Google SDK appends its own `/v1beta/models/...` path segment). + +### Differences from OpenCode Go + +| Aspect | OpenCode Zen | OpenCode Go | +|--------|-------------|-------------| +| Billing | Pay-per-use | $10/month subscription | +| Models | GPT-5.x, Claude, Gemini, open-source | Open-source only | +| Free models | Yes (7 models) | No | +| Base URL | `https://opencode.ai/zen/v1` | `https://opencode.ai/zen/go/v1` | + +## Usage Limits and Pricing + +OpenCode Zen uses a pay-per-use model. See the [OpenCode Zen documentation](https://opencode.ai/docs/zen) for current pricing. Automatic top-up and monthly usage limits are available from the console. + +You can retrieve the full model catalog at any time: + +```bash +curl https://opencode.ai/zen/v1/models +``` diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/openrouter/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/openrouter/index.md new file mode 100644 index 0000000000..d7664036e4 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/openrouter/index.md @@ -0,0 +1,87 @@ +--- +title: "OpenRouter" +description: "Use OpenRouter models with docker-agent." +keywords: docker agent, ai agents, model providers, llm, openrouter +weight: 230 +--- + +_Use OpenRouter models with docker-agent._ + +## Overview + +OpenRouter provides access to models from many providers through an OpenAI-compatible API. docker-agent includes built-in support for OpenRouter as an alias provider. + +## Setup + +1. Get an API key from [OpenRouter](https://openrouter.ai/settings/keys) +2. Set the environment variable: + + ```bash + export OPENROUTER_API_KEY=your-api-key + ``` + +## Usage + +### Inline Syntax + +The simplest way to use OpenRouter: + +```yaml +agents: + root: + model: openrouter/meta-llama/llama-3.3-70b-instruct + description: Assistant using OpenRouter + instruction: You are a helpful assistant. +``` + +OpenRouter model IDs usually include the upstream provider name, such as `anthropic/claude-sonnet-4-5` or `meta-llama/llama-3.3-70b-instruct`. docker-agent splits only the first slash, so the full upstream model ID is preserved. + +### Named Model + +For more control over parameters: + +```yaml +models: + openrouter_llama: + provider: openrouter + model: meta-llama/llama-3.3-70b-instruct + temperature: 0.7 + max_tokens: 8192 + +agents: + root: + model: openrouter_llama + description: Assistant using OpenRouter + instruction: You are a helpful assistant. +``` + +## Pricing and Model Metadata + +docker-agent fetches OpenRouter model metadata from [models.dev](https://models.dev/), including pricing per 1M input/output tokens, cache pricing when available, context limits, output limits, and modalities. This powers cost tracking and the model picker in the same way as other first-class providers. + +If models.dev is unavailable, docker-agent falls back to its embedded catalog snapshot. + +## How It Works + +OpenRouter is implemented as a built-in alias in docker-agent: + +- **API Type:** OpenAI-compatible (`openai`) +- **Base URL:** `https://openrouter.ai/api/v1` +- **Token Variable:** `OPENROUTER_API_KEY` + +## Example: Code Assistant + +```yaml +agents: + coder: + model: openrouter/meta-llama/llama-3.3-70b-instruct + description: Code assistant using OpenRouter + instruction: | + You are an expert programmer. + Write clean, maintainable code. + Explain trade-offs when helpful. + toolsets: + - type: filesystem + - type: shell + - type: think +``` diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/overview/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/overview/index.md new file mode 100644 index 0000000000..c3b09ee5d2 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/overview/index.md @@ -0,0 +1,99 @@ +--- +title: "Model Providers" +description: "docker-agent supports multiple AI model providers. Choose the right one for your use case, or use multiple providers in the same configuration." +keywords: docker agent, ai agents, model providers, llm +linkTitle: "Overview" +weight: 10 +aliases: + - /ai/docker-agent/model-providers/ +--- + +_docker-agent supports multiple AI model providers. Choose the right one for your use case, or use multiple providers in the same configuration._ + +## Supported Providers + +- [**OpenAI**](../openai/index.md) — GPT-5, GPT-5-mini, GPT-4o. The most widely used AI models. +- [**Anthropic**](../anthropic/index.md) — Claude Sonnet 4.5, Claude Opus 4.7. Excellent for coding and analysis. +- [**Google Gemini**](../google/index.md) — Gemini 2.5 Flash, Gemini 3 Pro. Fast and cost-effective. +- [**AWS Bedrock**](../bedrock/index.md) — access Claude, Nova, Llama, and more through AWS infrastructure. +- [**Docker Model Runner**](../dmr/index.md) — run models locally with Docker. No API keys, no costs. +- [**Provider Definitions**](../custom/index.md) — define reusable provider configurations with shared defaults for any provider type. + +## Quick Comparison + +| Provider | Key | Local? | Strengths | +| ------------------- | ---------------- | ------ | ----------------------------------------------------- | +| OpenAI | `openai` | No | Broad model selection, tool calling, multimodal | +| Anthropic | `anthropic` | No | Strong coding, extended thinking, large context | +| Google | `google` | No | Fast inference, competitive pricing, multimodal | +| AWS Bedrock | `amazon-bedrock` | No | Enterprise features, multiple models, AWS integration | +| Docker Model Runner | `dmr` | Yes | No API costs, data privacy, offline capable | + +## Additional Built-in Providers + +docker-agent also includes built-in aliases for these providers: + +| Provider | Alias | API Key / Env Variable | +| -------------- | ---------------- | ----------------------------------- | +| OpenCode Zen | `opencode-zen` | `OPENCODE_API_KEY` | +| OpenCode Go | `opencode-go` | `OPENCODE_API_KEY` | +| Mistral | `mistral` | `MISTRAL_API_KEY` | +| xAI (Grok) | `xai` | `XAI_API_KEY` | +| Nebius | `nebius` | `NEBIUS_API_KEY` | +| MiniMax | `minimax` | `MINIMAX_API_KEY` | +| Baseten | `baseten` | `BASETEN_API_KEY` | +| OVHcloud | `ovhcloud` | `OVH_AI_ENDPOINTS_ACCESS_TOKEN` | +| Groq | `groq` | `GROQ_API_KEY` | +| Fireworks AI | `fireworks` | `FIREWORKS_API_KEY` | +| DeepSeek | `deepseek` | `DEEPSEEK_API_KEY` | +| Cerebras | `cerebras` | `CEREBRAS_API_KEY` | +| Together AI | `together` | `TOGETHER_API_KEY` | +| Hugging Face | `huggingface` | `HF_TOKEN` | +| Cloudflare Workers AI | `cloudflare-workers-ai` | `CLOUDFLARE_API_TOKEN` + `CLOUDFLARE_ACCOUNT_ID` | +| Moonshot AI | `moonshot` | `MOONSHOT_API_KEY` | +| Vercel AI Gateway | `vercel` | `AI_GATEWAY_API_KEY` | +| Cloudflare AI Gateway | `cloudflare-ai-gateway` | `CLOUDFLARE_API_TOKEN` + `CLOUDFLARE_ACCOUNT_ID` + `CLOUDFLARE_GATEWAY_ID` | +| Requesty | `requesty` | `REQUESTY_API_KEY` | +| OpenRouter | `openrouter` | `OPENROUTER_API_KEY` | +| Azure OpenAI | `azure` | `AZURE_API_KEY` + `base_url` | +| Ollama | `ollama` | None (local; optional `base_url`) | +| GitHub Copilot | `github-copilot` | `GITHUB_TOKEN` (PAT with `copilot` scope) | + +```bash +# Use built-in providers inline +agents: + root: + model: mistral/mistral-large-latest +``` + +> [!TIP] +> **Multi-provider teams** +> +> Use expensive models for complex reasoning and cheaper/local models for routine tasks. See the example below. + +## Using Multiple Providers + +Different agents can use different providers in the same configuration: + +```yaml +models: + claude: + provider: anthropic + model: claude-sonnet-4-5 + max_tokens: 64000 + gpt: + provider: openai + model: gpt-5 + local: + provider: dmr + model: ai/qwen3 + +agents: + root: + model: claude # coordinator uses Claude + sub_agents: [coder, helper] + coder: + model: gpt # coder uses GPT-5 + helper: + model: local # helper runs locally for free +``` diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/ovhcloud/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/ovhcloud/index.md new file mode 100644 index 0000000000..bba906bc88 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/ovhcloud/index.md @@ -0,0 +1,107 @@ +--- +title: "OVHcloud" +description: "Use OVHcloud AI Endpoints models with docker-agent." +keywords: docker agent, ai agents, model providers, llm, ovhcloud +weight: 240 +--- + +_Use OVHcloud AI Endpoints models with docker-agent._ + +## Overview + +[OVHcloud AI Endpoints](https://endpoints.ai.cloud.ovh.net/) serves open-weight +models through an OpenAI-compatible API, hosted in the EU. docker-agent includes +built-in support for OVHcloud as an alias provider. + +## Setup + +1. Create an access token from the + [OVHcloud AI Endpoints portal](https://endpoints.ai.cloud.ovh.net/). +2. Set the environment variable: + + ```bash + export OVH_AI_ENDPOINTS_ACCESS_TOKEN=your-access-token + ``` + +## Usage + +### Inline Syntax + +```yaml +agents: + root: + model: ovhcloud/Qwen3.5-397B-A17B + description: Assistant using OVHcloud + instruction: You are a helpful assistant. +``` + +### Named Model + +```yaml +models: + ovhcloud_model: + provider: ovhcloud + model: Qwen3.5-397B-A17B + temperature: 0.7 + max_tokens: 8192 + +agents: + root: + model: ovhcloud_model + description: Assistant using OVHcloud + instruction: You are a helpful assistant. +``` + +## Available Models + +OVHcloud hosts a rotating catalogue of open-weight models. Check the +[AI Endpoints catalogue](https://endpoints.ai.cloud.ovh.net/) for current model +IDs, context limits, and free-tier availability. + +| Model | Description | +| --- | --- | +| `Qwen3.5-397B-A17B` | Large Qwen3.5 MoE — strong general, coding, and reasoning | +| `Qwen3-32B` | Mid-size Qwen3 — fast, tool-calling, reasoning | +| `Qwen3.6-27B` | Compact Qwen3.6 — fast and efficient | +| `Qwen3.5-9B` | Small Qwen3.5 — lightweight, free-tier friendly | +| `Qwen3-Coder-30B-A3B-Instruct` | Qwen3 Coder MoE — optimised for code generation | +| `Meta-Llama-3_3-70B-Instruct` | Llama 3.3 70B — reliable general-purpose chat | +| `Mistral-Small-3.2-24B-Instruct-2506` | Compact, fast, tool-calling | + +> Model IDs are case-sensitive and must be passed exactly as the catalogue lists +> them. + +## How It Works + +OVHcloud is implemented as a built-in alias in docker-agent: + +- **API Type:** OpenAI-compatible (`openai_chatcompletions`) +- **Base URL:** `https://oai.endpoints.kepler.ai.cloud.ovh.net/v1` +- **Token Variable:** `OVH_AI_ENDPOINTS_ACCESS_TOKEN` + +docker-agent automatically coalesces consecutive system messages into one for +OVHcloud, because some OVHcloud models return an empty stream when a request +carries more than one system message. + +## Free tier + +OVHcloud offers rate-limited free access to several models. Under heavy +rate-limiting the endpoint may return an empty response; docker-agent surfaces +this as a warning rather than failing. For sustained use, an access token with a +paid plan avoids the free-tier request-rate cap. + +## Example: Code Assistant + +```yaml +agents: + coder: + model: ovhcloud/Qwen3.5-397B-A17B + description: Code assistant using Qwen3.5 + instruction: | + You are an expert programmer. + Write clean, well-documented code and follow language best practices. + toolsets: + - type: filesystem + - type: shell + - type: think +``` diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/together/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/together/index.md new file mode 100644 index 0000000000..9cf541f216 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/together/index.md @@ -0,0 +1,100 @@ +--- +title: "Together AI" +description: "Use Together AI models with docker-agent." +keywords: docker agent, ai agents, model providers, llm, together ai +weight: 250 +--- + +_Use Together AI models with docker-agent._ + +## Overview + +[Together AI](https://www.together.ai/) is one of the largest hosts of open +models, serving Llama, Qwen, DeepSeek, Kimi, GLM and others through an +OpenAI-compatible API. docker-agent includes built-in support for Together AI as +an alias provider. + +## Setup + +1. Create an API key from the [Together AI settings](https://api.together.ai/settings/api-keys). +2. Set the environment variable: + + ```bash + export TOGETHER_API_KEY=your-api-key + ``` + +## Usage + +### Inline Syntax + +The simplest way to use Together AI: + +```yaml +agents: + root: + model: together/meta-llama/Llama-3.3-70B-Instruct-Turbo + description: Assistant using Together AI + instruction: You are a helpful assistant. +``` + +### Named Model + +For more control over parameters: + +```yaml +models: + together_model: + provider: together + model: meta-llama/Llama-3.3-70B-Instruct-Turbo + temperature: 0.7 + max_tokens: 8192 + +agents: + root: + model: together_model + description: Assistant using Together AI + instruction: You are a helpful assistant. +``` + +## Available Models + +Together AI serves a broad, changing catalog of open-weight models. Check the +[Together AI model library](https://docs.together.ai/docs/serverless-models) for +current model IDs, context limits, and pricing. + +| Model | Description | +| --- | --- | +| `meta-llama/Llama-3.3-70B-Instruct-Turbo` | Llama 3.3 70B, general-purpose chat and tool calling | +| `Qwen/Qwen3-235B-A22B-Instruct-2507-tput` | Qwen3 235B mixture-of-experts instruct model | +| `deepseek-ai/DeepSeek-V3` | DeepSeek-V3, strong coding and reasoning | + +> Model IDs are case-sensitive and must be passed exactly as the catalogue lists +> them. + +## How It Works + +Together AI is implemented as a built-in alias in docker-agent: + +- **API Type:** OpenAI-compatible (`openai_chatcompletions`) +- **Base URL:** `https://api.together.xyz/v1` +- **Token Variable:** `TOGETHER_API_KEY` + +Because Together AI fronts open-weight models whose chat templates may reject +more than one leading system message, docker-agent coalesces its per-source +system messages into a single one for this provider. + +## Example: Code Assistant + +```yaml +agents: + coder: + model: together/Qwen/Qwen3-235B-A22B-Instruct-2507-tput + description: Code assistant using Qwen3 on Together AI + instruction: | + You are an expert programmer. + Write clean, well-documented code and follow language best practices. + toolsets: + - type: filesystem + - type: shell + - type: think +``` diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/vercel/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/vercel/index.md new file mode 100644 index 0000000000..8db5d1163e --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/vercel/index.md @@ -0,0 +1,105 @@ +--- +title: "Vercel AI Gateway" +description: "Use Vercel AI Gateway models with docker-agent." +keywords: docker agent, ai agents, model providers, llm, vercel ai gateway +weight: 260 +--- + +_Use Vercel AI Gateway models with docker-agent._ + +## Overview + +[Vercel AI Gateway](https://vercel.com/docs/ai-gateway) is a single, unified +OpenAI-compatible endpoint that routes to models from OpenAI, Anthropic, Google, +xAI and more at list price with no markup, plus provider routing and failover. +It lets you reach many providers with one API key. docker-agent includes +built-in support for Vercel AI Gateway as an alias provider. + +## Setup + +1. Create an API key from the [Vercel AI Gateway dashboard](https://vercel.com/docs/ai-gateway). +2. Set the environment variable: + + ```bash + export AI_GATEWAY_API_KEY=your-api-key + ``` + +## Usage + +Vercel AI Gateway model IDs use a `creator/model` form (for example +`openai/gpt-5` or `anthropic/claude-sonnet-4.5`); the gateway routes each +request to the underlying provider. + +### Inline Syntax + +The simplest way to use Vercel AI Gateway: + +```yaml +agents: + root: + model: vercel/openai/gpt-5 + description: Assistant using Vercel AI Gateway + instruction: You are a helpful assistant. +``` + +### Named Model + +For more control over parameters: + +```yaml +models: + vercel_model: + provider: vercel + model: openai/gpt-5 + temperature: 0.7 + max_tokens: 8192 + +agents: + root: + model: vercel_model + description: Assistant using Vercel AI Gateway + instruction: You are a helpful assistant. +``` + +## Available Models + +Vercel AI Gateway exposes models from many providers behind one endpoint. Check +the [Vercel AI Gateway documentation](https://vercel.com/docs/ai-gateway) for +the current model list, IDs, and pricing. + +| Model | Description | +| --- | --- | +| `openai/gpt-5` | OpenAI GPT-5 routed through the gateway | +| `anthropic/claude-sonnet-4.5` | Anthropic Claude Sonnet routed through the gateway | +| `google/gemini-2.5-flash` | Google Gemini routed through the gateway | + +> Model IDs are case-sensitive and must be passed exactly as the gateway lists +> them, including the `creator/` prefix. + +## How It Works + +Vercel AI Gateway is implemented as a built-in alias in docker-agent: + +- **API Type:** OpenAI-compatible (`openai_chatcompletions`) +- **Base URL:** `https://ai-gateway.vercel.sh/v1` +- **Token Variable:** `AI_GATEWAY_API_KEY` + +Because the gateway can route to open-weight models with strict chat templates, +docker-agent coalesces consecutive system messages into a single leading one for +this provider. + +## Example: Code Assistant + +```yaml +agents: + coder: + model: vercel/anthropic/claude-sonnet-4.5 + description: Code assistant via Vercel AI Gateway + instruction: | + You are an expert programmer. + Write clean, well-documented code and follow language best practices. + toolsets: + - type: filesystem + - type: shell + - type: think +``` diff --git a/_vendor/github.com/docker/docker-agent/docs/providers/xai/index.md b/_vendor/github.com/docker/docker-agent/docs/providers/xai/index.md new file mode 100644 index 0000000000..efa4e15591 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/providers/xai/index.md @@ -0,0 +1,98 @@ +--- +title: "xAI (Grok)" +description: "Use xAI's Grok models with docker-agent." +keywords: docker agent, ai agents, model providers, llm, xai (grok) +weight: 270 +--- + +_Use xAI's Grok models with docker-agent._ + +## Overview + +xAI provides the Grok family of models through an OpenAI-compatible API. docker-agent includes built-in support for xAI as an alias provider. + +## Setup + +1. Get an API key from [xAI Console](https://console.x.ai/) +2. Set the environment variable: + + ```bash + export XAI_API_KEY=your-api-key + ``` + +## Usage + +### Inline Syntax + +The simplest way to use xAI: + +```yaml +agents: + root: + model: xai/grok-3 + description: Assistant using Grok + instruction: You are a helpful assistant. +``` + +### Named Model + +For more control over parameters: + +```yaml +models: + grok: + provider: xai + model: grok-3 + temperature: 0.7 + max_tokens: 8192 + +agents: + root: + model: grok + description: Assistant using Grok + instruction: You are a helpful assistant. +``` + +## Available Models + +| Model | Description | Context | +| ------------------ | ---------------------------------- | ------- | +| `grok-3` | Latest and most capable Grok model | 131K | +| `grok-3-fast` | Faster variant with lower latency | 131K | +| `grok-3-mini` | Compact model for simpler tasks | 131K | +| `grok-3-mini-fast` | Fast variant of the mini model | 131K | +| `grok-2` | Previous generation model | 128K | +| `grok-vision` | Vision-capable model | 32K | + +Check the [xAI documentation](https://docs.x.ai/docs) for the latest available models. + +## Extended Thinking + +docker-agent's `thinking_budget` field is **not applied** to xAI models: the underlying OpenAI-compatible client only sends `reasoning_effort` for OpenAI reasoning model names (o-series, gpt-5). Setting `thinking_budget` on a Grok model passes config validation but has no effect on the request. + +Grok reasoning models (e.g. `grok-3-mini`) reason on their own without configuration. For non-reasoning models, use the [think tool](../../tools/think/index.md) instead. + +## How It Works + +xAI is implemented as a built-in alias in docker-agent: + +- **API Type:** OpenAI-compatible (`openai_chatcompletions`) +- **Base URL:** `https://api.x.ai/v1` +- **Token Variable:** `XAI_API_KEY` + +## Example: Research Assistant + +```yaml +agents: + researcher: + model: xai/grok-3 + description: Research assistant with real-time knowledge + instruction: | + You are a research assistant using Grok. + Provide well-researched, factual responses. + Cite sources when available. + toolsets: + - type: mcp + ref: docker:duckduckgo + - type: think +``` diff --git a/_vendor/github.com/docker/docker-agent/docs/tools/_index.md b/_vendor/github.com/docker/docker-agent/docs/tools/_index.md new file mode 100644 index 0000000000..ca9847f9a2 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/tools/_index.md @@ -0,0 +1,5 @@ +--- +title: "Built-in Tools" +description: "Built-in toolsets agents can use out of the box." +weight: 40 +--- diff --git a/_vendor/github.com/docker/docker-agent/docs/tools/a2a/index.md b/_vendor/github.com/docker/docker-agent/docs/tools/a2a/index.md new file mode 100644 index 0000000000..3d26bfbf8d --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/tools/a2a/index.md @@ -0,0 +1,40 @@ +--- +title: "A2A Tool" +description: "Connect to remote agents via the Agent-to-Agent protocol." +keywords: docker agent, ai agents, tools, toolsets, a2a tool +linkTitle: "A2A" +weight: 60 +--- + +_Connect to remote agents via the Agent-to-Agent protocol._ + +## Overview + +The A2A tool connects to a remote agent exposed over the A2A (Agent-to-Agent) protocol. Unlike [`handoff`](../handoff/index.md), which only targets local agents declared in the same config, `a2a` reaches out to an agent running on the network. + +## Configuration + +```yaml +toolsets: + - type: a2a + url: "http://localhost:8080/a2a" + # Optional: custom tool name (defaults to a sanitized form of the URL / agent card name) + name: research_agent + # Optional: custom HTTP headers (typically for auth) + headers: + Authorization: "Bearer ${env.A2A_TOKEN}" + X-Tenant: "acme" +``` + +## Properties + +| Property | Type | Required | Description | +| ---------- | ---------------- | -------- | -------------------------------------------------------------------------------------------------------- | +| `url` | string | ✓ | A2A server endpoint URL (must include scheme). | +| `name` | string | ✗ | Tool name registered for the remote agent. Defaults to a name derived from the server's agent card. | +| `headers` | map\[string\]string | ✗ | Extra HTTP headers sent with every request (useful for `Authorization`, tenant selection, tracing, \u2026). | + +> [!TIP] +> **See also** +> +> For full details on the A2A protocol and serving agents as A2A endpoints, see [A2A Protocol](../../features/a2a/index.md). diff --git a/_vendor/github.com/docker/docker-agent/docs/tools/api/index.md b/_vendor/github.com/docker/docker-agent/docs/tools/api/index.md new file mode 100644 index 0000000000..ba3a2bcb75 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/tools/api/index.md @@ -0,0 +1,251 @@ +--- +title: "API Tool" +description: "Create custom tools that call HTTP APIs." +keywords: docker agent, ai agents, tools, toolsets, api tool +linkTitle: "API" +weight: 240 +--- + +_Create custom tools that call HTTP APIs._ + +## Overview + +The API tool type lets you define custom tools that make HTTP requests to external APIs. This is useful for integrating agents with REST APIs, webhooks, or any HTTP-based service without writing code. + +> [!NOTE] +> **When to Use** +> +> - Integrating with REST APIs that don't have an MCP server +> - Simple HTTP operations (GET, POST) +> - Quick prototyping before building a full MCP server + +## Configuration + +```yaml +agents: + assistant: + model: openai/gpt-4o + description: Assistant with API access + instruction: You can look up weather information. + toolsets: + - type: api + api_config: + name: get_weather + method: GET + endpoint: "https://api.weather.example/v1/current?city=${city}" + instruction: Get current weather for a city + args: + city: + type: string + description: City name to get weather for + required: ["city"] + headers: + Authorization: "Bearer ${env.WEATHER_API_KEY}" +``` + +## Properties + +The `api` toolset accepts the following toolset-level fields in addition to the `api_config` block: + +| Property | Type | Required | Description | +| ------------------- | ------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `api_config` | object | ✓ | The HTTP tool definition. See the table below. | +| `timeout` | int | ✗ | HTTP client timeout in seconds (default: `30`). Applies to every call the generated tool makes. | +| `allow_private_ips` | boolean | ✗ | Opt in to dialling **non-public** IP addresses (loopback, RFC1918, link-local — including the cloud-metadata endpoint at `169.254.169.254` — multicast and the unspecified address). Set to `true` only when the configured endpoint legitimately targets internal services. See [Reaching internal services](#reaching-internal-services). | + +### `api_config` + +| Property | Type | Required | Description | +| --------------- | ------ | -------- | ------------------------------------------------ | +| `name` | string | ✓ | Tool name (how the agent references it) | +| `method` | string | ✓ | HTTP method: `GET` or `POST` | +| `endpoint` | string | ✓ | URL endpoint (supports `${param}` interpolation) | +| `instruction` | string | ✗ | Description shown to the agent | +| `args` | object | ✗ | Parameter definitions (JSON Schema properties) | +| `required` | array | ✗ | List of required parameter names | +| `headers` | object | ✗ | HTTP headers to include. Values support `${env.VAR}` and `${headers.NAME}` placeholders (the latter forwards a header from the caller's incoming request, useful when docker agent is itself exposed as an HTTP server). | +| `output_schema` | object | ✗ | JSON Schema for the response. Used by MCP / Code Mode consumers; tool responses are still returned to the model as raw strings. | + +## HTTP Methods + +### GET Requests + +For GET requests, parameters are interpolated into the URL: + +```yaml +toolsets: + - type: api + api_config: + name: search_users + method: GET + endpoint: "https://api.example.com/users?q=${query}&limit=${limit}" + instruction: Search for users by name + args: + query: + type: string + description: Search query + limit: + type: integer + description: Maximum results (default 10) + required: ["query"] +``` + +### POST Requests + +For POST requests, parameters are sent as JSON in the request body: + +```yaml +toolsets: + - type: api + api_config: + name: create_task + method: POST + endpoint: "https://api.example.com/tasks" + instruction: Create a new task + args: + title: + type: string + description: Task title + description: + type: string + description: Task description + priority: + type: string + enum: ["low", "medium", "high"] + description: Task priority + required: ["title"] + headers: + Content-Type: "application/json" + Authorization: "Bearer ${env.API_TOKEN}" +``` + +## URL Interpolation + +Use `${param}` syntax to insert parameter values into URLs: + +```yaml +endpoint: "https://api.example.com/users/${user_id}/posts/${post_id}" +``` + +Parameter values are inserted as strings by the template expansion. Add URL encoding in the template when needed (for example, `${encodeURIComponent(city)}`). + +## Headers + +Headers can include environment variables: + +```yaml +headers: + Authorization: "Bearer ${env.API_KEY}" + X-Custom-Header: "static-value" + Content-Type: "application/json" +``` + +## Output Schema + +Optionally document the expected response format: + +```yaml +toolsets: + - type: api + api_config: + name: get_user + method: GET + endpoint: "https://api.example.com/users/${id}" + instruction: Get user details by ID + args: + id: + type: string + description: User ID + required: ["id"] + output_schema: + type: object + properties: + id: + type: string + name: + type: string + email: + type: string + created_at: + type: string +``` + +## Example: GitHub API + +```yaml +agents: + github_assistant: + model: openai/gpt-4o + description: Assistant that can query GitHub + instruction: You can look up GitHub repositories and users. + toolsets: + - type: api + api_config: + name: get_repo + method: GET + endpoint: "https://api.github.com/repos/${owner}/${repo}" + instruction: Get information about a GitHub repository + args: + owner: + type: string + description: Repository owner (user or org) + repo: + type: string + description: Repository name + required: ["owner", "repo"] + headers: + Accept: "application/vnd.github.v3+json" + Authorization: "Bearer ${env.GITHUB_TOKEN}" + + - type: api + api_config: + name: get_user + method: GET + endpoint: "https://api.github.com/users/${username}" + instruction: Get information about a GitHub user + args: + username: + type: string + description: GitHub username + required: ["username"] + headers: + Accept: "application/vnd.github.v3+json" +``` + +## Limitations + +- Only supports GET and POST methods +- Response body is limited to 1MB +- Default 30-second timeout per request (override with the `timeout` field) +- Only HTTP and HTTPS URLs are supported +- No support for file uploads or multipart forms +- By default, requests to non-public IP ranges (loopback, RFC1918, link-local, the cloud-metadata endpoint, multicast, the unspecified address) are refused at dial time — even when DNS for an otherwise-public host resolves there. Set `allow_private_ips: true` to disable that check. + +## Reaching internal services + +```yaml +toolsets: + - type: api + timeout: 60 + allow_private_ips: true + api_config: + name: get_local_status + method: GET + endpoint: "http://localhost:8080/health" + instruction: Check the local service health +``` + +> [!WARNING] +> **SSRF** +> +> Setting `allow_private_ips: true` re-exposes the SSRF surface for this tool. Only enable it when the configured `endpoint` is a trusted internal service — a prompt-injected agent cannot redirect the call elsewhere because the endpoint is fixed in config, but redirects from the configured host can still reach unexpected places. + +> [!TIP] +> **For Complex APIs** +> +> For APIs that need authentication flows, pagination, or complex request/response handling, consider using an MCP server instead. The API tool is best for simple, stateless HTTP operations. + +> [!WARNING] +> **Security** +> +> API keys and tokens in headers are visible in debug logs. Use environment variables (`${env.VAR}`) rather than hardcoding secrets in configuration files. diff --git a/_vendor/github.com/docker/docker-agent/docs/tools/background-agents/index.md b/_vendor/github.com/docker/docker-agent/docs/tools/background-agents/index.md new file mode 100644 index 0000000000..93ed5d021c --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/tools/background-agents/index.md @@ -0,0 +1,115 @@ +--- +title: "Background Agents Tool" +description: "Dispatch work to sub-agents concurrently and collect results asynchronously." +keywords: docker agent, ai agents, tools, toolsets, background agents tool +linkTitle: "Background Agents" +weight: 90 +--- + +_Dispatch work to sub-agents concurrently and collect results asynchronously._ + +## Overview + +The background agents tool lets an orchestrator dispatch work to sub-agents concurrently and collect results asynchronously. Unlike [transfer_task](../transfer-task/index.md) (which blocks until the sub-agent finishes), background agent tasks run in parallel — the orchestrator can start several tasks, do other work, and check on them later. + +## Available Tools + +| Tool | Description | +| ------------------------ | --------------------------------------------------------------- | +| `run_background_agent` | Start a sub-agent task in the background; returns a task ID | +| `list_background_agents` | List all background tasks with their status and runtime | +| `view_background_agent` | View live output or final result of a task by ID | +| `stop_background_agent` | Cancel a running task by ID | + +### `run_background_agent` parameters + +| Parameter | Type | Required | Description | +| ----------------- | ------ | -------- | --------------------------------------------------------------------------- | +| `agent` | string | ✓ | Name of the sub-agent to run. Must be listed under the caller's `sub_agents`. | +| `task` | string | ✓ | Clear, concise description of the task the sub-agent should achieve. | +| `expected_output` | string | ✗ | Optional description of the result format the caller expects. | + +`run_background_agent` returns a **task ID** string. Tools run by the sub-agent are pre-approved, so only dispatch to trusted sub-agents with well-scoped tasks. + +### `view_background_agent` and `stop_background_agent` parameters + +| Parameter | Type | Required | Description | +| --------- | ------ | -------- | -------------------------------------------------------------- | +| `task_id` | string | ✓ | Task ID returned by `run_background_agent` or `list_background_agents`. | + +`list_background_agents` takes no parameters. + +## Configuration + +```yaml +toolsets: + - type: background_agents +``` + +No configuration options. Requires the agent to have `sub_agents` configured so the background tasks have agents to dispatch to. + +## Example + +```yaml +agents: + coordinator: + model: openai/gpt-4o + description: Orchestrates parallel research + instruction: Fan out research tasks and synthesize results. + sub_agents: [researcher] + toolsets: + - type: background_agents + - type: think + + researcher: + model: openai/gpt-4o + description: Web researcher + instruction: Research topics thoroughly. + toolsets: + - type: mcp + ref: docker:duckduckgo +``` + +> [!TIP] +> **When to Use** +> +> Use `background_agents` when your orchestrator needs to fan out work to multiple specialists in parallel — for example, researching several topics simultaneously or running independent code analyses side by side. + +## Using Harness Sub-Agents + +Background agents work equally well with [harness-backed sub-agents](../../features/harnesses/index.md) — sub-agents driven by external coding CLIs such as Claude Code or Codex. This lets you dispatch multiple independent coding tasks in parallel: + +```yaml +agents: + root: + model: anthropic/claude-sonnet-4-5 + description: Orchestrator that fans out coding tasks + instruction: | + Dispatch the frontend and backend tasks in parallel, + then collect results and produce a summary. + sub_agents: + - claude-coder + - codex-coder + toolsets: + - type: background_agents + + claude-coder: + description: Frontend specialist (Claude Code) + harness: + type: claude-code + effort: medium + + codex-coder: + description: Backend specialist (Codex) + harness: + type: codex +``` + +The orchestrator calls `run_background_agent` for each coding task, then uses `list_background_agents` and `view_background_agent` to collect results when they finish. + +> [!NOTE] +> **Harness toolsets are ignored** +> +> Harness agents use the external CLI's own tools — any `toolsets:` configured on the harness agent are silently ignored. See [Coding Harnesses](../../features/harnesses/index.md) for details and caveats. + +See [`examples/coding_harness_background_agents.yaml`](https://github.com/docker/docker-agent/blob/main/examples/coding_harness_background_agents.yaml) for a complete configuration. diff --git a/_vendor/github.com/docker/docker-agent/docs/tools/fetch/index.md b/_vendor/github.com/docker/docker-agent/docs/tools/fetch/index.md new file mode 100644 index 0000000000..dcc8b53377 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/tools/fetch/index.md @@ -0,0 +1,172 @@ +--- +title: "Fetch Tool" +description: "Read content from HTTP/HTTPS URLs." +keywords: docker agent, ai agents, tools, toolsets, fetch tool +linkTitle: "Fetch" +weight: 50 +--- + +_Read content from HTTP/HTTPS URLs._ + +## Overview + +The fetch tool lets agents retrieve content from one or more HTTP/HTTPS URLs. It is **read-only** — only `GET` requests are supported. The tool respects `robots.txt`, limits response size (1 MB per URL), and can return content as plain text, Markdown (converted from HTML), or raw HTML. + +> [!NOTE] +> **GET only** +> +> The fetch tool does **not** support `POST`, `PUT`, `DELETE` or other methods, and does not expose request bodies or per-call custom headers (the toolset can still attach static [credential headers](#custom-headers) to every request). To call REST endpoints with other verbs, use the [API tool](../api/index.md) or an [OpenAPI toolset](../openapi/index.md). + +## Configuration + +```yaml +toolsets: + - type: fetch +``` + +### Options + +| Property | Type | Default | Description | +| ------------------- | ------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `timeout` | int | `30` | Default request timeout in seconds (overridable per tool call). | +| `allowed_domains` | array[string] | _none_ | Allow-list of hosts the tool may fetch. When set, every URL whose host is **not** in the list is rejected before any network call is made. Mutually exclusive with `blocked_domains`. | +| `blocked_domains` | array[string] | _none_ | Deny-list of hosts the tool must not fetch. URLs whose host matches one of these patterns are rejected before any network call (including `robots.txt`) is made. Mutually exclusive with `allowed_domains`. | +| `allow_private_ips` | boolean | `false` | Opt in to dialling **non-public** IP addresses (loopback, RFC1918, link-local — including the cloud-metadata endpoint at `169.254.169.254` — multicast, and the unspecified address). Required to reach `localhost` / internal services. See [SSRF protection](#ssrf-protection-and-reaching-localhost) below. | +| `headers` | map[string]string | _none_ | Static HTTP headers attached to **every** request the toolset issues (including `robots.txt`). Values support `${env.VAR}` for secrets. Caller-supplied entries override the default `User-Agent` and the format-driven `Accept` header. Headers are stripped on cross-host redirects so credentials never leak to a third-party host. See [Custom headers](#custom-headers) below. | + +### Domain matching + +Domain patterns in `allowed_domains` and `blocked_domains` use the following rules (case-insensitive): + +- **Bare domain** — `example.com` matches the host `example.com` _and_ any subdomain such as `docs.example.com`. It does **not** match unrelated hosts that share a suffix (e.g. `badexample.com`). +- **Leading dot** — `.example.com` matches **only** strict subdomains (`docs.example.com`, `a.b.example.com`), not the apex `example.com`. +- **Wildcard glob** — `*.example.com` is an alias for the leading-dot form; the apex is excluded. The `*` is only valid as a leading `*.` token (entries like `foo.*`, `*.*.example.com`, or a bare `*` are rejected at config-load time). +- **IP literal** — IP addresses are matched exactly (`169.254.169.254`). +- **CIDR range** — `169.254.0.0/16`, `10.0.0.0/8`, `::1/128`, `fc00::/7`. Matches when the URL's host parses as an IP inside the network. Hostname hosts never match a CIDR pattern. Malformed CIDRs are rejected at config-load time. +- **Trailing dots** in FQDN-form URLs (`http://example.com./`) are stripped before matching, so they cannot bypass a deny-list entry. + +The lists are mutually exclusive: a single fetch toolset may set either `allowed_domains` or `blocked_domains`, but not both. + +When a list is configured, every redirect target is re-checked against the same list. A request to an allowed origin that redirects to a forbidden host is rejected before any data is read from the redirect. + +> [!WARNING] +> **Limitations** +> +> Matching is purely string-based on the URL host. It does **not** perform DNS resolution and does **not** normalise alternative IP encodings (decimal `2852039166`, hex `0xa9.0xfe.0xa9.0xfe`, octal, etc. IPv4-mapped IPv6 addresses ARE normalized to their IPv4 form). If you need to deny access to a specific IP, also list its alternative encodings, or block at the network layer. + +### Custom Timeout + +```yaml +toolsets: + - type: fetch + timeout: 60 +``` + +### Custom headers + +Attach static headers — typically credentials — to every request. Values support `${env.VAR}` interpolation so secrets stay out of YAML, and headers are dropped on cross-host redirects so a redirect chain cannot leak them to a third-party host: + +```yaml +toolsets: + - type: fetch + allowed_domains: + - docs.internal.example.com + headers: + Authorization: "Bearer ${env.INTERNAL_DOCS_TOKEN}" + X-Internal-Client: "docker-agent" +``` + +> [!WARNING] +> **Pair credential headers with an allow-list** +> +> When `headers` carries credentials (e.g. `Authorization`), set `allowed_domains` to the specific hosts that should receive them. Stdlib already strips a small allow-list (`Authorization`, `Cookie`, `WWW-Authenticate`) on cross-domain redirects, and the fetch tool additionally strips every operator-supplied header on cross-host redirects — but an allow-list is the strongest guarantee against accidental exfiltration. + +### Restrict to specific domains + +```yaml +toolsets: + - type: fetch + allowed_domains: + - docker.com # docker.com and *.docker.com + - github.com # github.com and *.github.com + - .githubusercontent.com # only subdomains, e.g. raw.githubusercontent.com +``` + +### Block sensitive hosts + +```yaml +toolsets: + - type: fetch + blocked_domains: + - 169.254.169.254 # cloud metadata endpoint (literal IP) + - 169.254.0.0/16 # entire link-local range (CIDR) + - 10.0.0.0/8 # RFC1918 private range + - "*.internal.example.com" # any subdomain (wildcard) + - internal.example.com # internal corporate hostname +``` + +> [!NOTE] +> **Already blocked by default** +> +> You do **not** need to add loopback, RFC1918, link-local (incl. `169.254.169.254`), multicast or the unspecified address to `blocked_domains` to be safe — the fetch tool already refuses connections to those ranges at dial time, after DNS resolution. The example above is only useful if you also want to reject those hosts _before_ any network call (and to surface a clearer error message to the agent), or if you have set `allow_private_ips: true` and want to deny a specific subset. + +### SSRF protection and reaching localhost + +By default, the fetch tool refuses connections to **non-public IP addresses** — even when DNS for an otherwise-public host resolves to one of them (so DNS rebinding is also blocked). The check happens at dial time, after DNS resolution, and rejects: + +- **Loopback** — `127.0.0.0/8`, `::1` (this is what blocks `http://localhost/...` and `http://127.0.0.1/...`) +- **RFC1918 private ranges** — `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16` +- **Link-local** — `169.254.0.0/16` (IPv4, including the cloud-metadata endpoint `169.254.169.254`) and `fe80::/10` (IPv6) +- **Multicast** and the **unspecified** address (`0.0.0.0`, `::`) +- **IPv4-mapped IPv6** — addresses like `::ffff:127.0.0.1` or `::ffff:169.254.169.254` are normalized to their IPv4 form and blocked accordingly + +This is the default because LLM-driven fetches are a classic Server-Side Request Forgery (SSRF) vector: a prompt-injected URL can otherwise reach internal services, cloud metadata, or admin interfaces on the host running the agent. + +If an agent legitimately needs to call **localhost** or an **internal service**, opt in with `allow_private_ips: true`: + +```yaml +toolsets: + - type: fetch + allow_private_ips: true + allowed_domains: + - localhost + - 127.0.0.1 + - 10.0.0.0/8 # internal corporate range +``` + +> [!WARNING] +> **Pair with an allow-list** +> +> Setting `allow_private_ips: true` alone re-exposes the SSRF surface. We strongly recommend combining it with an `allowed_domains` entry that restricts the tool to the specific internal hosts or CIDRs the agent actually needs (e.g. `localhost`, `127.0.0.1`, or your internal CIDR). +> +> **Note:** `allowed_domains` is checked _before_ DNS resolution (string-based on hostname), while the SSRF check happens _after_ DNS resolution (on the resolved IP). This means `allowed_domains` and `blocked_domains` are evaluated independently of `allow_private_ips` and continue to apply. A public hostname in `allowed_domains` that resolves to a private IP will still be blocked unless `allow_private_ips: true` is set. + +## Tool Interface + +The toolset exposes a single tool, `fetch`, with the following parameters: + +| Parameter | Type | Required | Description | +| --------- | -------------- | -------- | ----------------------------------------------------------------------------------------------------------- | +| `urls` | array[string] | ✓ | One or more HTTP/HTTPS URLs to fetch (all via `GET`). | +| `format` | string | ✓ | Output format: `text`, `markdown`, or `html`. HTML responses are converted to text/markdown when requested. | +| `timeout` | integer | ✗ | Per-call request timeout in seconds. Overrides the toolset default. Valid range: `1`–`300`. | + +Responses are capped at **1 MB** per URL. Hosts that disallow the agent's user-agent via `robots.txt` are skipped with a clear error. + +> [!TIP] +> **Fetch vs. API Tool** +> +> Use `fetch` when the agent needs to read arbitrary public URLs at runtime. Use the [API tool](../api/index.md) to expose specific, structured HTTP endpoints (including non-`GET` verbs) as named tools. + +## Domain Filtering + +The `allowed_domains`, `blocked_domains`, and `allow_private_ips` options let you control which hosts the fetch tool may reach. The complete reference is in the [Options](#options) table and [Domain matching](#domain-matching) section above. + +**Key points:** + +- `allowed_domains` — allow-list; only listed hosts (and their subdomains for bare-domain entries) are reachable +- `blocked_domains` — deny-list; mutually exclusive with `allowed_domains` (a config error is thrown if both are set) +- `allow_private_ips` — defaults to `false`; set to `true` to reach loopback / RFC-1918 / link-local addresses +- The same `allow_private_ips` flag is also supported on `api`, `openapi`, `a2a`, and remote `mcp` toolsets + +See [`examples/fetch_domain_filtering.yaml`](https://github.com/docker/docker-agent/blob/main/examples/fetch_domain_filtering.yaml) for a complete filtering example, and [`examples/remote_mcp_allow_private_ips.yaml`](https://github.com/docker/docker-agent/blob/main/examples/remote_mcp_allow_private_ips.yaml) for the equivalent pattern on remote MCP toolsets. diff --git a/_vendor/github.com/docker/docker-agent/docs/tools/filesystem/index.md b/_vendor/github.com/docker/docker-agent/docs/tools/filesystem/index.md new file mode 100644 index 0000000000..c0e372879a --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/tools/filesystem/index.md @@ -0,0 +1,112 @@ +--- +title: "Filesystem Tool" +description: "Read, write, list, search, and navigate files and directories." +keywords: docker agent, ai agents, tools, toolsets, filesystem tool +linkTitle: "Filesystem" +weight: 10 +--- + +_Read, write, list, search, and navigate files and directories._ + +## Overview + +The filesystem tool gives agents the ability to explore codebases, read and edit files, create new files, search across files, and navigate directory structures. Paths are resolved relative to the working directory, though agents can also use absolute paths. + +## Available Tools + +| Tool | Description | +| ---------------------- | ------------------------------------------------------------------------- | +| `read_file` | Read the complete contents of a file | +| `read_multiple_files` | Read several files in one call (more efficient than multiple `read_file`) | +| `write_file` | Create or overwrite a file with new content | +| `edit_file` | Make line-based edits (find-and-replace) in an existing file | +| `list_directory` | List files and directories at a given path | +| `directory_tree` | Recursive tree view of a directory | +| `create_directory` | Create a new directory (creates parent directories as needed) | +| `remove_directory` | Remove an empty directory | +| `search_files_content` | Search for text or regex patterns across files | + +## Configuration + +```yaml +toolsets: + - type: filesystem +``` + +### Options + +| Property | Type | Default | Description | +| --- | --- | --- | --- | +| `ignore_vcs` | boolean | `true` | When `true` (default), `.git` directories and `.gitignore` patterns are excluded from listings and searches. Set to `false` to include them. | +| `post_edit` | array | `[]` | Commands to run after editing files matching a path pattern | +| `post_edit[].path` | string | — | Glob pattern for files (e.g., `*.go`, `src/**/*.ts`) | +| `post_edit[].cmd` | string | — | Command to run (use `${file}` for the edited file path) | +| `allow_list` | array | `[]` | Directories the tools may access. Empty = unrestricted (default). | +| `deny_list` | array | `[]` | Directories the tools must not access. Takes precedence over `allow_list`. | + +### Path access control + +By default the filesystem tools are unrestricted: relative paths resolve +from the working directory, but absolute paths and `..` traversals can +reach anywhere the agent process can. Configure `allow_list` and/or +`deny_list` to sandbox the toolset. + +Entries in either list are expanded as follows: + +- `"."` — the agent's working directory +- `"~"` or `"~/..."` — the user's home directory +- `"$VAR"` / `"${VAR}"` / `"${env.VAR}"` — environment variable expansion +- absolute paths — used as-is +- relative paths — anchored at the working directory + +Symlinks are resolved before the containment check, so a symlink inside an +allowed root cannot be used to escape it. When an `allow_list` is set, +each entry is opened as a Go [`*os.Root`](https://pkg.go.dev/os#Root) so +that the kernel's rooted-lookup semantics also reject `..` and symlink +escapes at I/O time, not just at resolve time. + +```yaml +toolsets: + - type: filesystem + # Restrict every operation to the working directory and the user's + # home folder, then carve credentials out of the home folder. + allow_list: + - "." + - "~" + deny_list: + - "~/.ssh" + - "~/.aws" +``` + +When the path supplied by the agent is rejected, the tool returns a +structured error rather than performing any filesystem I/O. This makes the +restriction visible to the model so it can adjust its plan. + +### Post-Edit Hooks + +Automatically run formatting, linting, or other commands after the agent edits a file. The command fires once per file after each edit operation (`write_file` and `edit_file`). Use `${file}` as a placeholder for the absolute path of the edited file. + +```yaml +toolsets: + - type: filesystem + ignore_vcs: false + post_edit: + - path: "*.go" + cmd: "gofmt -w ${file}" + - path: "*.ts" + cmd: "prettier --write ${file}" + - path: "src/**/*.py" + cmd: "black ${file}" +``` + +| Property | Type | Description | +| --- | --- | --- | +| `path` | string | Glob pattern matched against the file path. `*.go` matches any `.go` file; `src/**/*.ts` matches `.ts` files anywhere under `src/`. | +| `cmd` | string | Shell command to run. `${file}` expands to the absolute path of the just-edited file. | + +Post-edit commands run with the same working directory as the agent. If a command exits non-zero, the error is logged and surfaced to the model as a warning, but the edit is not rolled back. + +See [`examples/post_edit.yaml`](https://github.com/docker/docker-agent/blob/main/examples/post_edit.yaml) for a complete example. + +> [!TIP] +> The filesystem tool resolves paths relative to the working directory. Agents can also use absolute paths. diff --git a/_vendor/github.com/docker/docker-agent/docs/tools/handoff/index.md b/_vendor/github.com/docker/docker-agent/docs/tools/handoff/index.md new file mode 100644 index 0000000000..c3922c15c4 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/tools/handoff/index.md @@ -0,0 +1,62 @@ +--- +title: "Handoff Tool" +description: "Hand off the active conversation to another local agent defined in the same config." +keywords: docker agent, ai agents, tools, toolsets, handoff tool +linkTitle: "Handoff" +weight: 70 +--- + +_Hand off the active conversation to another local agent defined in the same config._ + +## Overview + +The `handoff` tool lets an agent transfer control of the **current conversation** to another agent in the **same config file**. Unlike [`transfer_task`](../transfer-task/index.md), which delegates a sub-task and collects the result, `handoff` rewires the session so the receiving agent continues the conversation directly with the user. + +This is the core mechanism for **handoffs routing** — a pattern where a router agent classifies the user's request and hands it off to a specialist, which then owns the rest of the session. + +> [!NOTE] +> **Local only** +> +> The `handoff` tool only targets agents declared in the **same** config file by their local name. It does **not** open network connections. To delegate to a remote agent over the network, use the [A2A toolset](../a2a/index.md) instead. + +## Configuration + +The tool is enabled implicitly when an agent declares a non-empty `handoffs:` list. You do **not** add `- type: handoff` under `toolsets:` — it is not a toolset type. + +```yaml +agents: + router: + model: openai/gpt-4o + description: Routes questions to the right specialist + instruction: | + Classify the user's question and hand off to the most appropriate + specialist. If unsure, ask a clarifying question first. + handoffs: [billing, support] + + billing: + model: openai/gpt-4o + description: Billing specialist + instruction: Answer billing questions. + + support: + model: openai/gpt-4o + description: Technical support specialist + instruction: Help with technical issues. +``` + +The router agent automatically gets a `handoff` tool it can call to switch the conversation to `billing` or `support`. + +## Tool Interface + +The `handoff` tool takes a single parameter: + +| Parameter | Type | Required | Description | +| --------- | ------ | -------- | ----------------------------------------------------------------- | +| `agent` | string | ✓ | The local name of the agent to hand off the conversation to. | + +Only names listed in the current agent's `handoffs:` field are valid targets. + +> [!TIP] +> **See also** +> +> For sub-task delegation (caller stays in control, waits for the result), see [Transfer Task](../transfer-task/index.md). For remote agent connections over the network, see the [A2A toolset](../a2a/index.md). For the broader pattern, see [Handoffs Routing](../../concepts/multi-agent/index.md#handoffs-routing). diff --git a/_vendor/github.com/docker/docker-agent/docs/tools/lsp/index.md b/_vendor/github.com/docker/docker-agent/docs/tools/lsp/index.md new file mode 100644 index 0000000000..84329f24a6 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/tools/lsp/index.md @@ -0,0 +1,226 @@ +--- +title: "LSP Tool" +description: "Connect to Language Server Protocol servers for code intelligence." +keywords: docker agent, ai agents, tools, toolsets, lsp tool +linkTitle: "LSP" +weight: 220 +--- + +_Connect to Language Server Protocol servers for code intelligence._ + +## Overview + +The LSP tool connects your agent to any Language Server Protocol (LSP) server, providing comprehensive code intelligence capabilities like go-to-definition, find references, diagnostics, and more. + +> [!NOTE] +> **What is LSP?** +> +> The [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) is a standard for providing language features like autocomplete, go-to-definition, and diagnostics. Most programming languages have LSP servers available. + +## Available Tools + +The LSP toolset provides these tools to the agent: + +| Tool | Description | Read-Only | +| ----------------------- | --------------------------------------------- | --------- | +| `lsp_workspace` | Get workspace info and available capabilities | ✓ | +| `lsp_hover` | Get type info and documentation for a symbol | ✓ | +| `lsp_definition` | Find where a symbol is defined | ✓ | +| `lsp_references` | Find all references to a symbol | ✓ | +| `lsp_document_symbols` | List all symbols in a file | ✓ | +| `lsp_workspace_symbols` | Search symbols across the workspace | ✓ | +| `lsp_diagnostics` | Get errors and warnings for a file | ✓ | +| `lsp_code_actions` | Get available quick fixes and refactorings | ✓ | +| `lsp_rename` | Rename a symbol across the workspace | ✗ | +| `lsp_format` | Format a file | ✗ | +| `lsp_call_hierarchy` | Find incoming/outgoing calls | ✓ | +| `lsp_type_hierarchy` | Find supertypes/subtypes | ✓ | +| `lsp_implementations` | Find interface implementations | ✓ | +| `lsp_signature_help` | Get function signature at call site | ✓ | +| `lsp_inlay_hints` | Get type annotations and parameter names | ✓ | + +## Configuration + +```yaml +agents: + developer: + model: anthropic/claude-sonnet-4-5 + description: Code developer with LSP support + instruction: You are a software developer. + toolsets: + - type: lsp + command: gopls + args: [] + file_types: [".go"] + - type: filesystem + - type: shell +``` + +## Properties + +| Property | Type | Required | Description | +| ------------- | ------ | -------- | ---------------------------------------------------------------------------------------------------------------------------- | +| `command` | string | ✓ | LSP server executable command | +| `args` | array | ✗ | Command-line arguments for the LSP server | +| `env` | object | ✗ | Environment variables for the LSP process | +| `file_types` | array | ✗ | File extensions this LSP handles (e.g., `[".go", ".mod"]`) | +| `working_dir` | string | ✗ | Working directory for the LSP server process. Relative paths are resolved against the agent's working directory. Defaults to the agent's working directory when omitted. | +| `version` | string | ✗ | Package reference for [auto-installing](../../configuration/tools/index.md#auto-installing-tools) the command binary | + +## Common LSP Servers + +Here are configurations for popular languages: + +### Go (gopls) + +```yaml +toolsets: + - type: lsp + command: gopls + version: "golang/tools@v0.21.0" # optional: auto-install if not in PATH + file_types: [".go"] +``` + +If your Go module lives in a subdirectory (e.g. a monorepo where `go.mod` is under `./backend`), set `working_dir` so `gopls` is started from the module root: + +```yaml +toolsets: + - type: lsp + command: gopls + file_types: [".go"] + working_dir: ./backend # gopls must be started from the module root +``` + +### TypeScript/JavaScript (typescript-language-server) + +```yaml +toolsets: + - type: lsp + command: typescript-language-server + args: ["--stdio"] + file_types: [".ts", ".tsx", ".js", ".jsx"] +``` + +### Python (pylsp) + +```yaml +toolsets: + - type: lsp + command: pylsp + file_types: [".py"] +``` + +### Rust (rust-analyzer) + +```yaml +toolsets: + - type: lsp + command: rust-analyzer + file_types: [".rs"] +``` + +### C/C++ (clangd) + +```yaml +toolsets: + - type: lsp + command: clangd + file_types: [".c", ".cpp", ".h", ".hpp"] +``` + +## Multiple LSP Servers + +You can configure multiple LSP servers for different file types: + +```yaml +agents: + polyglot: + model: anthropic/claude-sonnet-4-5 + description: Multi-language developer + instruction: You are a full-stack developer. + toolsets: + - type: lsp + command: gopls + file_types: [".go"] + - type: lsp + command: typescript-language-server + args: ["--stdio"] + file_types: [".ts", ".tsx", ".js", ".jsx"] + - type: lsp + command: pylsp + file_types: [".py"] + - type: filesystem + - type: shell +``` + +## Workflow Instructions + +The LSP tool includes built-in instructions that guide the agent on how to use it effectively. The agent learns to: + +1. Start with `lsp_workspace` to understand available capabilities +2. Use `lsp_workspace_symbols` to find relevant code +3. Use `lsp_references` before modifying any symbol +4. Check `lsp_diagnostics` after every code change +5. Apply `lsp_format` after edits are complete + +> [!TIP] +> **Best Practice** +> +> Always include the `filesystem` tool alongside LSP. The agent needs filesystem access to read and write code files, while LSP provides intelligence about the code. + +## Capability Detection + +Not all LSP servers support all features. During the `initialize` handshake, docker-agent reads the server's `ServerCapabilities` and **filters out the `lsp_*` tools the server does not advertise**. The model never sees, for example, `lsp_inlay_hints` against a server that doesn't support it, so it can't waste a turn calling a tool that would only fail. + +The agent uses `lsp_workspace` to discover what's available: + +```text +Workspace Information: +- Root: /path/to/project +- Server: gopls v0.14.0 +- File types: .go + +Available Capabilities: +- Hover: Yes +- Go to Definition: Yes +- Find References: Yes +- Rename: Yes +- Code Actions: Yes +- Formatting: Yes +- Call Hierarchy: Yes +- Type Hierarchy: Yes +... +``` + +## Auto-Restart and Lifecycle + +LSP toolsets are managed by the same supervisor as MCP toolsets, so a crashed `gopls` (or any other language server) is reconnected automatically with exponential backoff. Use the [`lifecycle`](../../configuration/tools/index.md#toolset-lifecycle) block to tune the policy per toolset — for example, mark `gopls` as `strict` if your CI flow requires it to be available, or use `/toolset-restart gopls` from the TUI to force a reconnect when the server gets stuck. + +```yaml +toolsets: + - type: lsp + command: gopls + file_types: [".go"] + lifecycle: + profile: resilient # default: auto-restart on crash with exponential backoff +``` + +## Position Format + +All LSP tools use **1-based** line and character positions: + +- Line 1 is the first line of the file +- Character 1 is the first character on a line + +```json +{ + "file": "/path/to/file.go", + "line": 42, + "character": 15 +} +``` + +> [!TIP] +> **Auto-Installation** +> +> docker-agent can automatically download and install LSP servers if they are not found in your PATH. Use the `version` property to specify a package, or let docker-agent auto-detect it from the command name. See [Auto-Installing Tools](../../configuration/tools/index.md#auto-installing-tools) for details. diff --git a/_vendor/github.com/docker/docker-agent/docs/tools/mcp-catalog/index.md b/_vendor/github.com/docker/docker-agent/docs/tools/mcp-catalog/index.md new file mode 100644 index 0000000000..28d7c0aec5 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/tools/mcp-catalog/index.md @@ -0,0 +1,112 @@ +--- +title: "MCP Catalog Tool" +description: "Let the agent discover and activate remote MCP servers from the Docker MCP Catalog on demand." +keywords: docker agent, ai agents, tools, toolsets, mcp catalog tool +linkTitle: "MCP Catalog" +weight: 120 +--- + +_Let the agent discover and activate remote MCP servers from the Docker MCP Catalog on demand._ + +## Overview + +The `mcp_catalog` toolset gives an agent access to a curated subset of the [Docker MCP Catalog](https://hub.docker.com/search?q=&type=mcp) — every server in this subset is reachable over the **streamable-http** transport, so docker-agent can talk to it directly without the MCP gateway or a local subprocess. + +Servers are **not** active by default. Instead, the toolset exposes a small set of meta-tools the agent uses to search, enable, and disable servers as a turn unfolds. Tools from un-enabled servers stay hidden, so the prompt is not flooded with hundreds of tool definitions the agent will never use. + +> [!NOTE] +> **When to use it** +> +> Use `mcp_catalog` when you want the agent to _decide at runtime_ which third-party services it needs (Notion, Stripe, Brave Search, …) instead of pinning that decision in YAML up front. For a fixed set of servers, declare each one with [`type: mcp`](../../configuration/tools/index.md#mcp-tools) directly — the catalog adds an extra layer of meta-tools that pure `type: mcp` entries do not need. + +## Configuration + +```yaml +toolsets: + - type: mcp_catalog +``` + +The catalog is embedded in the docker-agent binary and refreshed with each release. By default every server in the embedded subset is offered. + +### Restricting the offered servers + +Two optional lists narrow what the toolset offers, so an agent sees a focused, predictable menu instead of the full catalog: + +- **`allowed_servers`** — when non-empty, **only** these catalog server ids are searchable and enableable; every other entry is hidden. +- **`blocked_servers`** — removes individual ids from the offered set. It is applied **after** `allowed_servers`, so a server listed in both is blocked (block wins over allow). + +Both take server ids (the `id` field returned by `search_remote_mcp_servers`). An empty or omitted list disables that filter. + +```yaml +toolsets: + - type: mcp_catalog + allowed_servers: + - docker-docs + - microsoft-learn + - hugging-face + blocked_servers: + - gitmcp +``` + +## Meta-Tools + +Up to five tools are exposed to the model. The disable / reset-auth pair only appears once at least one server is enabled, so the meta-tool surface stays minimal until the agent activates something. + +| Tool | When visible | Description | +| ------------------------------- | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | +| `search_remote_mcp_servers` | Always | Case-insensitive fuzzy search over id, title, description, category and tags. Returns id, auth requirements (`oauth` / `none`) and URL. | +| `enable_remote_mcp_server` | Always | Activate a server by id. **Blocks** until the connection (and any required OAuth handshake) completes; on success the server's tools are immediately live and the model continues with the user's original request in the same turn. | +| `list_remote_mcp_servers` | Always | Show currently enabled servers and their connection state. | +| `disable_remote_mcp_server` | After first enable | Stop a server and remove its tools from the active set. | +| `reset_remote_mcp_server_auth` | After first enable | Drop persisted OAuth credentials so the next enable triggers a fresh authorization flow. No-op for `none` servers. | + +### Workflow + +1. The agent calls `search_remote_mcp_servers` with a keyword matching the user's intent (`"notion"`, `"stripe"`, `"docs"`, `"browser"`, `"grafana"`, …). +2. It picks a matching server id and calls `enable_remote_mcp_server`. **`enable` blocks** until the MCP handshake (and any required OAuth flow) completes: + - on success the server's tools are available **in the same turn** — the agent goes straight to the user's original request, no re-ask required; + - on failure (user dismissed the authorization dialog, server refused) the tool returns an error result naming the specific reason so the agent can recover instead of pretending the server is connected. +3. It uses the newly activated tools as it would any other. +4. When done, it calls `disable_remote_mcp_server` to remove the server from the active set. + +## Authentication + +The catalog only includes servers docker-agent can authenticate itself, so there are two auth flavours: + +- **`oauth`** — `enable_remote_mcp_server` surfaces an authorization URL through the elicitation pipeline (the same one used by YAML-declared remote MCP toolsets) and blocks until the user either authorizes or cancels. Once the user authorizes, tokens are persisted in the OS keyring and re-used on subsequent runs. Use `reset_remote_mcp_server_auth` to wipe them. If the user dismisses the dialog, `enable` returns an error result naming the decline so the agent can ask whether to retry. +- **`none`** — No authentication. The server is reachable as soon as it is enabled. + +Servers that require a caller-provided API key are intentionally excluded from the catalog. To use one, declare it explicitly with [`type: mcp`](../../configuration/tools/index.md#mcp-tools) and supply the key via an environment variable. + +## Example + +```yaml +agents: + root: + model: anthropic/claude-sonnet-4-5 + description: Agent that can on-demand connect to remote MCP servers from the Docker MCP Catalog. + instruction: | + You can discover and activate remote MCP servers on demand. + Use search_remote_mcp_servers to find a server matching the + user's intent, then enable_remote_mcp_server to activate it. + Be conservative: enable only the servers you actually need for + the task at hand. Disable a server with disable_remote_mcp_server + once you are done with it. + toolsets: + - type: mcp_catalog +``` + +A complete, runnable configuration lives in [`examples/mcp_catalog.yaml`](https://github.com/docker/docker-agent/blob/main/examples/mcp_catalog.yaml). A curated, allow/block-listed variant lives in [`examples/mcp_catalog_filtered.yaml`](https://github.com/docker/docker-agent/blob/main/examples/mcp_catalog_filtered.yaml). + +## Notes and Limitations + +- **Streamable-http only.** The catalog deliberately excludes servers that require a local subprocess or the MCP gateway — declare those with [`type: mcp`](../../configuration/tools/index.md#mcp-tools) instead. +- **Catalog membership changes between releases.** The set of available servers is updated with each docker-agent release as integrations are added or removed. Servers present in one release may not appear in the next. +- **Blocking enable.** DNS, TCP, MCP handshake and any OAuth flow happen synchronously inside `enable_remote_mcp_server` so the agent gets a deterministic result in the same turn. On startup, however, the runtime probes tools non-interactively (`mcp.WithoutInteractivePrompts`); OAuth-pending servers fail fast there and are silently deferred to the next interactive turn — including the sidebar-only tool-count pass, where a dialog would be impossible. +- **No prompt discovery.** MCP prompt lookups (`/prompts`) walk YAML-declared `mcp` toolsets directly; prompts exposed by servers activated through the catalog are not surfaced. Tools — the primary interface — work fine. +- **Frozen at build time.** The list of servers is embedded in the binary. New entries land with each docker-agent release. + +> [!TIP] +> **Pair with permissions** +> +> Because the agent decides which third-party services to talk to, this toolset works best with explicit [permissions](../../configuration/permissions/index.md) on the surrounding tools (filesystem writes, shell commands) so a misrouted server cannot exfiltrate data unnoticed. diff --git a/_vendor/github.com/docker/docker-agent/docs/tools/mcp/index.md b/_vendor/github.com/docker/docker-agent/docs/tools/mcp/index.md new file mode 100644 index 0000000000..dbc845b559 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/tools/mcp/index.md @@ -0,0 +1,287 @@ +--- +title: "MCP Tool" +description: "Extend agents with external tools via the Model Context Protocol." +keywords: docker agent, ai agents, tools, toolsets, mcp tool +linkTitle: "MCP" +weight: 130 +aliases: + - /ai/docker-agent/integrations/mcp/ +--- + +_Extend agents with external tools via the Model Context Protocol (MCP)._ + +## Overview + +The `mcp` toolset connects your agent to any MCP server — a process or remote service that exposes tools, resources, and prompts over the [Model Context Protocol](https://modelcontextprotocol.io/). Three flavours are supported: + +| Flavour | Transport | Best for | +| --- | --- | --- | +| **Docker MCP** | Container via the [MCP Gateway](https://github.com/docker/mcp-gateway) | Curated, sandboxed servers from the [Docker MCP Catalog](https://hub.docker.com/u/mcp) | +| **Local stdio** | Subprocess over stdin/stdout | Custom or community MCP servers run from a binary or `npx`/`pip` package | +| **Remote** | Streamable HTTP or SSE | Cloud services with hosted MCP endpoints (Linear, Notion, Atlassian, …) | + +> [!NOTE] +> **What is MCP?** +> +> The [Model Context Protocol](https://modelcontextprotocol.io/) is an open standard for connecting AI tools. Docker Agent can both _use_ MCP servers (this page) and _expose_ agents as MCP servers — see [MCP Mode](../../features/mcp-mode/index.md). + +## Docker MCP (Recommended) + +Run MCP servers as secure Docker containers via the MCP Gateway. The `ref: docker:` syntax pulls a curated definition from the Docker MCP Catalog: + +```yaml +toolsets: + - type: mcp + ref: docker:duckduckgo # web search + - type: mcp + ref: docker:github-official # GitHub integration + tools: ["list_issues", "create_issue"] +``` + +Browse available servers at the [Docker MCP Catalog](https://hub.docker.com/u/mcp). + +| Property | Type | Description | +| ------------- | ------ | ---------------------------------------------------------------- | +| `ref` | string | Docker MCP reference (`docker:name`) or a name from the [reusable `mcps:`](../../configuration/overview/index.md#reusable-mcp-servers-mcps) block. | +| `tools` | array | Optional whitelist — only expose these tools to the model. | +| `instruction` | string | Custom instructions injected into the agent's context. | +| `config` | any | MCP server-specific configuration passed during initialization. | +| `working_dir` | string | Working directory for the MCP gateway subprocess. Only applies when the catalog entry runs as a local process (not remote). Relative paths are resolved against the agent's working directory. Supports `${env.VAR}` (canonical), plus `~` and shell-style `$VAR`/`${VAR}` expansion ([details](../../configuration/overview/index.md#variable-expansion-in-config-fields)). | + +## Local MCP (stdio) + +Run MCP servers as local processes communicating over stdin/stdout: + +```yaml +toolsets: + - type: mcp + command: python + args: ["-m", "mcp_server"] + tools: ["search", "fetch"] + env: + API_KEY: value +``` + +| Property | Type | Description | +| ------------- | ------ | ----------- | +| `command` | string | Command to execute the MCP server. | +| `args` | array | Command arguments. | +| `tools` | array | Optional whitelist — only expose these tools. | +| `env` | object | Environment variables (key-value pairs). | +| `working_dir` | string | Working directory for the MCP server process. Relative paths are resolved against the agent's working directory. Defaults to the agent's working directory when omitted. Supports `${env.VAR}` (canonical), plus `~` and shell-style `$VAR`/`${VAR}` expansion ([details](../../configuration/overview/index.md#variable-expansion-in-config-fields)). | +| `instruction` | string | Custom instructions injected into the agent's context. | +| `version` | string | Package reference for [auto-installing](../../configuration/tools/index.md#auto-installing-tools) the command binary. | + +> [!TIP] +> **Auto-installation** +> +> If the `command` is not in your `PATH`, docker-agent looks it up in the [aqua registry](https://github.com/aquaproj/aqua-registry) and installs it for you. Use `version: "false"` to opt out, or set `DOCKER_AGENT_AUTO_INSTALL=false` globally. See [Auto-Installing Tools](../../configuration/tools/index.md#auto-installing-tools). + +## Remote MCP (Streamable HTTP / SSE) + +Connect to MCP servers over the network. OAuth flows (including [Dynamic Client Registration](https://datatracker.ietf.org/doc/html/rfc7591)) are handled automatically — docker-agent opens your browser when authentication is required and caches tokens for subsequent sessions. Tokens are refreshed silently when they expire or are revoked server-side; if a silent refresh is not possible, the OAuth prompt reappears on the next message. + +```yaml +toolsets: + - type: mcp + remote: + url: "https://mcp.linear.app/mcp" + transport_type: "streamable" # or "sse" for legacy servers + headers: + Authorization: "Bearer ${env.LINEAR_TOKEN}" + # Optional: allow OAuth helper requests to reach private/internal IPs. + allow_private_ips: false + tools: ["search_issues", "create_issue"] +``` + +| Property | Type | Description | +| ----------------------- | ------- | ----------- | +| `remote.url` | string | Base URL of the MCP server. | +| `remote.transport_type` | string | `streamable` or `sse`. | +| `remote.headers` | object | HTTP headers (typically for static auth tokens). | +| `remote.oauth` | object | Explicit OAuth client credentials for servers that don't support DCR. See [Remote MCP Servers](../../features/remote-mcp/index.md#oauth-for-servers-without-dynamic-client-registration). | +| `allow_private_ips` | boolean | Permit remote MCP OAuth helper requests to dial non-public IP addresses. Use only for trusted internal servers. | + +For a curated list of public remote MCP endpoints (Linear, GitHub, Vercel, Notion, …) and full OAuth configuration details, see [Remote MCP Servers](../../features/remote-mcp/index.md). + +## Embedded Resources + +MCP tool results can include embedded resources — images, PDFs, and text files returned directly in the tool response. Docker Agent preserves these as attachments and forwards them to the model as native content blocks: + +- **Anthropic** — images become `image` blocks in the `tool_result`; PDFs and other documents become `document` blocks. +- **OpenAI** — images are forwarded as `input_image` data URIs; PDFs as `input_file` data URIs in the tool result content. +- **Bedrock** and **Gemini** — receive equivalent provider-native representations. + +No configuration is required. When an MCP server returns an embedded resource alongside its text output, the resource is automatically attached and sent to the model on the next turn. This is useful for MCP servers that generate charts, export PDFs, or return binary data as part of their responses. + +## Reusable Definitions (`mcps:`) + +Repeated MCP server configurations can be hoisted into the top-level `mcps:` section and referenced by name with `{type: mcp, ref: }`: + +```yaml +mcps: + github: + remote: + url: https://api.githubcopilot.com/mcp + transport_type: sse + playwright: + command: npx + args: ["-y", "@modelcontextprotocol/server-playwright"] + +agents: + root: + model: openai/gpt-5 + toolsets: + - type: mcp + ref: github + - type: mcp + ref: playwright +``` + +See [Reusable MCP Servers](../../configuration/overview/index.md#reusable-mcp-servers-mcps) for the full reference. + +## Common Options + +These properties apply to every MCP toolset regardless of flavour: + +### Tool filtering + +```yaml +toolsets: + - type: mcp + ref: docker:github-official + tools: ["list_issues", "create_issue", "get_pull_request"] +``` + +Whitelisting tools improves model accuracy — fewer choices means less confusion. + +### Deferred loading + +Skip the toolset's startup cost until its tools are actually called: + +```yaml +toolsets: + - type: mcp + ref: docker:github-official + defer: true + # Or defer specific tools within a toolset: + - type: mcp + ref: docker:slack + defer: ["list_channels", "search_messages"] +``` + +### Custom instructions + +```yaml +toolsets: + - type: mcp + ref: docker:github-official + instruction: | + Use these tools to manage GitHub issues. + Always check for existing issues before creating new ones. + Label new issues with 'triage' by default. +``` + +### TOON-encoded outputs + +Re-encode verbose JSON outputs as the compact [TOON](https://github.com/alpkeskin/gotoon) format to save context budget. Typically yields 30–60% smaller payloads on list/search tools. + +`toon` is a regex string that is matched against tool names. Any tool whose name matches the pattern has its JSON output transparently re-encoded as TOON before it is shown to the model. The re-encoding reduces schema verbosity, which is especially useful when a model struggles with large or repetitive tool output. + +```yaml +toolsets: + - type: mcp + ref: docker:github-official + toon: ".*" # toonify every tool from this server + - type: mcp + command: my-server + toon: "list_.*,get_.*" # only toonify list_/get_ tools +``` + +The value is a comma-separated list of regexes (or a single regex). A tool name must match at least one pattern to be re-encoded. Setting `toon: ".*"` re-encodes all tools from that toolset. + +See [`examples/github-toon.yaml`](https://github.com/docker/docker-agent/blob/main/examples/github-toon.yaml) for a practical example using the GitHub MCP server. + +### Per-toolset model routing + +Process tool results from this toolset with a different (typically cheaper / faster) model. The override is one-shot — subsequent turns return to the agent's primary model: + +```yaml +toolsets: + - type: mcp + ref: docker:github-official + model: openai/gpt-4o-mini +``` + +See [Per-Toolset Model Routing](../../configuration/tools/index.md#per-toolset-model-routing). + +### Lifecycle (auto-restart, profiles) + +Local stdio and remote MCP servers are supervised: crashed servers reconnect automatically with exponential backoff. **Remote** MCP servers (Streamable HTTP / SSE) also reconnect after idle/clean connection closes — services like Notion and Linear periodically close idle connections, and docker-agent reconnects transparently. Tune the policy with the `lifecycle` block: + +```yaml +toolsets: + - type: mcp + ref: docker:duckduckgo + lifecycle: + profile: resilient # default; auto-restart with backoff + - type: mcp + command: docker + args: ["mcp", "gateway"] + lifecycle: + profile: strict # fail-fast: required, no retries +``` + +See [Toolset Lifecycle](../../configuration/tools/index.md#toolset-lifecycle) for all profiles and tuning knobs, and [`/toolset-restart`](../../features/tui/index.md) to force a reconnect from the TUI. + +## Combined Example + +```yaml +mcps: + github: + remote: + url: https://api.githubcopilot.com/mcp + transport_type: sse + +agents: + root: + model: anthropic/claude-sonnet-4-5 + description: Full-featured developer assistant + instruction: You are an expert developer. + toolsets: + # Docker MCP catalog entry + - type: mcp + ref: docker:duckduckgo + + # Reusable definition from the top-level mcps: block + - type: mcp + ref: github + tools: ["list_issues", "create_issue"] + toon: "list_.*" + + # Local stdio server with auto-install + - type: mcp + command: gopls + version: "golang/tools@v0.21.0" + args: ["mcp"] + + # Remote MCP with OAuth (handled automatically) + - type: mcp + remote: + url: "https://mcp.linear.app/mcp" + transport_type: "streamable" + instruction: Use Linear for issue tracking. +``` + +> [!WARNING] +> **Toolset order matters** +> +> If multiple toolsets provide a tool with the same name, the first one wins: the duplicate from the later toolset is ignored and a warning identifies both toolsets. Order your toolsets intentionally. To keep both tools callable, give the MCP toolset a unique `name:` (its tools are then exposed as `_`) or restrict the overlapping toolset with its `tools:` filter. + +## See Also + +- [Tool Configuration](../../configuration/tools/index.md) — full reference for every toolset type, plus shared options (lifecycle, TOON, model routing, …). +- [Reusable MCP Servers](../../configuration/overview/index.md#reusable-mcp-servers-mcps) — the top-level `mcps:` block. +- [Remote MCP Servers](../../features/remote-mcp/index.md) — catalog of public remote MCP endpoints + OAuth recipes. +- [MCP Mode](../../features/mcp-mode/index.md) — expose your own agents as MCP tools to Claude Desktop, Claude Code, etc. +- [Auto-Installing Tools](../../configuration/tools/index.md#auto-installing-tools) — automatic installation of MCP server binaries. diff --git a/_vendor/github.com/docker/docker-agent/docs/tools/memory/index.md b/_vendor/github.com/docker/docker-agent/docs/tools/memory/index.md new file mode 100644 index 0000000000..1bfb93fbd1 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/tools/memory/index.md @@ -0,0 +1,58 @@ +--- +title: "Memory Tool" +description: "Persistent key-value storage backed by SQLite for cross-session recall." +keywords: docker agent, ai agents, tools, toolsets, memory tool +linkTitle: "Memory" +weight: 100 +--- + +_Persistent key-value storage backed by SQLite for cross-session recall._ + +## Overview + +The memory tool provides persistent key-value storage backed by SQLite. Data survives across sessions, allowing agents to remember facts, user preferences, project context, and past decisions. Memories can be organized with categories and searched by keyword. + +By default, the database is stored at `~/.cagent/memory//memory.db`, where `` is derived from the loaded configuration (typically the YAML file name) and falls back to `default` when unavailable. When the agent is loaded from an OCI reference (e.g. `docker/my-agent:latest`), characters that are reserved in filesystem paths (such as `:`) are sanitised in the `` segment — the agent's display name elsewhere is unchanged. Agents declared in the same configuration share this database by default; set an explicit `path` per toolset to isolate them. + +## Available Tools + +| Tool | Description | +| ----------------- | -------------------------------------------------------------------------------- | +| `add_memory` | Store a new memory with optional category | +| `get_memories` | Retrieve all stored memories | +| `delete_memory` | Delete a specific memory by ID | +| `search_memories` | Search memories by keywords and/or category (more efficient than `get_memories`) | +| `update_memory` | Update an existing memory's content and/or category by ID | + +## Configuration + +```yaml +toolsets: + - type: memory +``` + +### Options + +| Property | Type | Default | Description | +| -------- | ------ | ----------------------------------------- | -------------------------------- | +| `path` | string | `~/.cagent/memory//memory.db` | Path to the SQLite database file | + +### Custom Database Path + +```yaml +toolsets: + - type: memory + path: ./agent_memory.db +``` + +## Categories + +Memories support an optional `category` field for organization and filtering. Common categories include: + +- `preference` — User preferences and settings +- `fact` — Factual information about the project or user +- `project` — Project-specific context +- `decision` — Past decisions and their rationale + +> [!TIP] +> Memory is especially useful for long-running assistants that need to recall information across conversations — like coding preferences, project conventions, or context discovered during previous sessions. diff --git a/_vendor/github.com/docker/docker-agent/docs/tools/model-picker/index.md b/_vendor/github.com/docker/docker-agent/docs/tools/model-picker/index.md new file mode 100644 index 0000000000..9ec4e55a6b --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/tools/model-picker/index.md @@ -0,0 +1,72 @@ +--- +title: "Model Picker Tool" +description: "Let the agent pick between several models per turn." +keywords: docker agent, ai agents, tools, toolsets, model picker tool +linkTitle: "Model Picker" +weight: 200 +--- + +_Let the agent pick between several models per turn._ + +## Overview + +The model picker tool gives an agent the ability to dynamically choose which model to use for each turn of the conversation. This is useful when you want the agent to route different types of requests to different models — for example, using a fast, inexpensive model for simple queries and a more capable model for complex reasoning tasks. + +## Configuration + +```yaml +toolsets: + - type: model_picker + models: + - openai/gpt-5-mini + - anthropic/claude-sonnet-4-5 + - openai/gpt-5 +``` + +### Options + +| Property | Type | Required | Description | +| -------- | -------------- | -------- | ------------------------------------------------------------ | +| `models` | array[string] | ✓ | List of model references the agent can choose from. Use `provider/model` format. | + +## How It Works + +When the model picker toolset is enabled, the agent gets two tools: `change_model` to switch to one of the configured models, and `revert_model` to return to its default model. The agent decides which model to use based on the complexity of the task, cost considerations, or other factors you describe in its instruction. + +## Example + +```yaml +agents: + root: + model: openai/gpt-5-mini # Default model + instruction: | + You are a helpful assistant. For simple questions, use gpt-5-mini. + For complex reasoning or coding tasks, switch to claude-sonnet-4-5 or gpt-5. + toolsets: + - type: model_picker + models: + - openai/gpt-5-mini + - anthropic/claude-sonnet-4-5 + - openai/gpt-5 +``` + +> [!TIP] +> **Cost optimization** +> +> The model picker tool is particularly useful for cost optimization: let the agent use a cheap model by default and only escalate to expensive models when necessary. + +## Tool Interface + +The toolset exposes two tools: + +### `change_model` + +| Parameter | Type | Required | Description | +| --------- | ------ | -------- | --------------------------------------------------------------------------- | +| `model` | string | ✓ | The model to switch to. Must be one of the configured models. | + +### `revert_model` + +Takes no parameters. Reverts the agent to its original/default model. + +The switch takes effect immediately: the next inference call — including the remainder of the current agentic loop — uses the new model. diff --git a/_vendor/github.com/docker/docker-agent/docs/tools/open-url/index.md b/_vendor/github.com/docker/docker-agent/docs/tools/open-url/index.md new file mode 100644 index 0000000000..93c1ab0290 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/tools/open-url/index.md @@ -0,0 +1,94 @@ +--- +title: "Open URL Tool" +description: "Open a fixed URL in the user's default browser." +keywords: docker agent, ai agents, tools, toolsets, open url tool +linkTitle: "Open URL" +weight: 40 +--- + +_Open a fixed URL in the user's default browser._ + +## Overview + +The `open_url` toolset exposes a single, argument-less tool that opens a URL +baked into the toolset definition in the user's default browser. The model +never supplies the URL — it just calls the tool by name. Launching the browser +is cross-platform: docker-agent uses `open` on macOS, `xdg-open` on Linux, and +`rundll32` on Windows. + +> [!NOTE] +> **When to Use** +> +> - Letting an agent open a dashboard, documentation page, or deep link on demand +> - Deep-linking into a desktop app via a custom URI scheme (e.g. `docker-desktop://`) +> - Any "take me there" action where the destination is fixed and known up front + +## Configuration + +```yaml +agents: + assistant: + model: openai/gpt-4o + description: Assistant that can open the dashboard + instruction: When the user asks to see the dashboard, call open_dashboard. + toolsets: + - type: open_url + name: open_dashboard + url: https://example.com/dashboard +``` + +## Properties + +| Property | Type | Required | Description | +| -------- | ------ | -------- | ---------------------------------------------------------------------------------------------------- | +| `url` | string | ✓ | URL to open. Supports `${env.VAR}` interpolation. Any scheme the OS can dispatch is allowed. | +| `name` | string | ✗ | Tool name the agent references. Defaults to `open_url`. Use a descriptive name when configuring several. | + +## Multiple URLs + +Add one toolset entry per destination, each with its own `name`: + +```yaml +toolsets: + - type: open_url + name: open_dashboard + url: https://example.com/dashboard + - type: open_url + name: open_docs + url: https://docs.example.com/${env.DOCS_VERSION} +``` + +## URL Interpolation + +The `url` field supports `${env.VAR}` placeholders, expanded at call time +against the runtime environment: + +```yaml +toolsets: + - type: open_url + name: open_docs + url: https://docs.example.com/${env.DOCS_VERSION} +``` + +## Custom URI Schemes + +Any scheme the operating system knows how to dispatch works, including deep +links into desktop applications: + +```yaml +toolsets: + - type: open_url + name: open_in_docker_desktop + url: docker-desktop://dashboard/apps +``` + +## Limitations + +- The URL must include a scheme (e.g. `https://`); bare paths are rejected. +- URLs that look like a command-line flag (starting with `-`) are refused to + prevent argument injection into the platform `open` helper. +- The tool opens the URL on the **host** running docker-agent; in headless or + remote environments where no browser/launcher is available, the call fails + gracefully and reports the error to the agent. + +See [`examples/open_url.yaml`](https://github.com/docker/docker-agent/blob/main/examples/open_url.yaml) for a complete configuration. diff --git a/_vendor/github.com/docker/docker-agent/docs/tools/openapi/index.md b/_vendor/github.com/docker/docker-agent/docs/tools/openapi/index.md new file mode 100644 index 0000000000..34dd64a643 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/tools/openapi/index.md @@ -0,0 +1,82 @@ +--- +title: "OpenAPI Tool" +description: "Automatically generate tools from an OpenAPI specification." +keywords: docker agent, ai agents, tools, toolsets, openapi tool +linkTitle: "OpenAPI" +weight: 230 +--- + +_Automatically generate tools from an OpenAPI specification._ + +## Overview + +The OpenAPI tool fetches an OpenAPI 3.x specification from a URL and creates one tool per API operation. Each endpoint's parameters, request body, and description are translated into a callable tool that the agent can invoke directly. + +## Configuration + +```yaml +toolsets: + - type: openapi + url: "https://petstore3.swagger.io/api/v3/openapi.json" +``` + +### With custom headers + +Pass custom headers to every HTTP request made by the generated tools (for example, for authentication): + +```yaml +toolsets: + - type: openapi + url: "https://api.example.com/openapi.json" + headers: + Authorization: "Bearer ${env.API_TOKEN}" + X-Custom-Header: "my-value" +``` + +### Custom timeout + +Override the default 30-second HTTP timeout (applies both to fetching the spec and to the generated tool calls): + +```yaml +toolsets: + - type: openapi + url: "https://api.example.com/openapi.json" + timeout: 60 +``` + +### Reaching internal services + +By default the OpenAPI tool refuses connections to non-public IP addresses, blocking SSRF attempts even when DNS resolves an otherwise-public host to an internal range. Opt in with `allow_private_ips` when the spec or its `servers` entries legitimately target localhost or your internal network: + +```yaml +toolsets: + - type: openapi + url: "http://localhost:8080/openapi.json" + allow_private_ips: true +``` + +## Properties + +| Property | Type | Required | Description | +| ------------------- | ----------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `url` | string | ✓ | URL of the OpenAPI specification (JSON format). Supports `${env.VAR}` interpolation. | +| `headers` | map[string]string | ✗ | Custom HTTP headers sent with every request — both the spec fetch and every generated tool call. Values support `${env.VAR}` and `${headers.NAME}` placeholders (the latter forwards a header from the caller's incoming request when docker agent is exposed as a server). | +| `timeout` | int | ✗ | HTTP client timeout in seconds (default: `30`). Applies to both the spec fetch and the generated tools' requests. | +| `allow_private_ips` | boolean | ✗ | Opt in to dialling **non-public** IP addresses (loopback, RFC1918, link-local — including the cloud-metadata endpoint at `169.254.169.254` — multicast and the unspecified address). Set to `true` only when the spec or its servers legitimately target internal services. By default such addresses are refused at dial time, after DNS resolution, so DNS rebinding cannot bypass the check. | + +## How it works + +1. The spec is fetched from the configured `url` at startup. +2. Each operation (GET, POST, PUT, …) becomes a separate tool named after its `operationId` (or `method_path` when no `operationId` is set). +3. Path and query parameters are exposed as tool parameters. Request body properties are prefixed with `body_`. +4. Read-only operations (GET, HEAD, OPTIONS) are annotated accordingly. +5. Responses are returned as text; errors include the HTTP status code. + +## Limits + +- The OpenAPI spec must be **10 MB or less**. +- Individual API responses are truncated at **1 MB**. + +## Example + +See the full [Pet Store example](https://github.com/docker/docker-agent/blob/main/examples/openapi-petstore.yaml) for a working agent configuration. diff --git a/_vendor/github.com/docker/docker-agent/docs/tools/plan/index.md b/_vendor/github.com/docker/docker-agent/docs/tools/plan/index.md new file mode 100644 index 0000000000..be388c96c7 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/tools/plan/index.md @@ -0,0 +1,132 @@ +--- +title: "Plan Tool" +description: "Shared persistent scratchpad for multi-agent collaboration." +keywords: docker agent, ai agents, tools, toolsets, plan tool +linkTitle: "Plan" +weight: 150 +--- + +_Shared persistent scratchpad for multi-agent collaboration._ + +## Overview + +The plan tool gives agents a shared, persistent scratchpad of named documents. Any agent in a multi-agent config that loads the `plan` toolset can read and write the same plans, and those plans survive across sessions. This makes it straightforward to wire a planner agent that sketches work and one or more executor agents that consume it without any custom tool wiring. + +Plans are stored as JSON files in the docker-agent data directory (`~/.cagent/plans/` by default). All agents that share a process serialize on a single mutex so concurrent reads and writes are safe. Writes are atomic (temp file + rename), so a reader never observes partial content. + +## Configuration + +```yaml +toolsets: + - type: plan +``` + +No additional options are required. All agents that include `type: plan` in their toolsets share the same plans. + +## Available Tools + +| Tool | Description | +| ----------------------- | ------------------------------------------------------------------------------------------------- | +| `write_plan` | Create or update a shared plan by name. Replaces the entire plan content — read it first to preserve what you want to keep. Each write bumps the revision number. | +| `read_plan` | Read a shared plan by name, including its title, content, author, status, revision number, and last-updated timestamp. | +| `list_plans` | List all shared plans with their name, title, author, status, revision, and last-updated timestamp. | +| `delete_plan` | Delete a shared plan by name. | +| `update_plan_from_file` | Create or update a plan, taking the new content from a file on disk instead of inline. Use it with `export_plan_to_file` to edit a large plan without re-sending its whole body. | +| `export_plan_to_file` | Write a plan's content to a file. The content goes to disk and is **not** returned as tool output, so materialising a plan costs no tokens. | +| `set_plan_status` | Set a plan's free-form status without rewriting its body. The plan must already exist. | +| `get_plan_status` | Read a plan's status and current revision without fetching its body. | + +### Cheap edits with file-based revisions + +Re-sending a whole plan on every revision is expensive. The file-based tools let +an agent edit a plan without paying input-token cost for its body: + +1. `export_plan_to_file` writes the current plan content to a path. The content + is written to disk and is **not** returned. +2. The agent edits that file in place with its filesystem tools. +3. `update_plan_from_file` commits the file's new contents as the next revision. + +### Free-form status + +Each plan carries a free-form `status` string. There is no fixed vocabulary: +define your own in the system prompt (e.g. `idle`, `in-progress`, `blocked`, +`done`, `canceled`). Read and write it independently of the body with +`get_plan_status` and `set_plan_status`, or pass `status` to `write_plan` and +`update_plan_from_file`. The TUI surfaces the status next to the plan title. + +### Optimistic locking + +When several sessions edit the same plan, concurrent writes could silently +overwrite each other. Every read returns a `revision` number; pass the value you +last read as `last_known_revision` to `write_plan`, `update_plan_from_file`, +`set_plan_status`, or `delete_plan`. If the plan changed since (its current +revision no longer matches), the write is rejected with a version-conflict +error and the caller should re-read the plan and retry. Omit +`last_known_revision` to write unconditionally (last writer wins). + +### Plan Names + +Plan names must match the pattern `[a-z0-9][a-z0-9_-]*` (lowercase letters, digits, `-`, `_`). This is enforced structurally so two different inputs can never collapse onto the same file and path-traversal is impossible by construction. + +### Plan Fields + +Each plan document contains: + +| Field | Description | +| ---------- | --------------------------------------------------------- | +| `name` | The plan's unique slug name | +| `title` | A short human-readable title (optional) | +| `content` | The full Markdown or free-form plan text | +| `author` | Free-form label identifying who last wrote the plan | +| `status` | Free-form lifecycle label (optional), e.g. `in-progress` | +| `revision` | Monotonically increasing version counter, bumped on every write | +| `updatedAt`| ISO 8601 timestamp of the last write | + +## Example + +Two agents collaborate on a shared plan — the architect drafts it and the builder refines it: + +```yaml +agents: + root: + model: anthropic/claude-sonnet-4-5 + description: Coordinator + instruction: | + Route work between the architect and the builder. + handoffs: [architect, builder] + + architect: + model: anthropic/claude-sonnet-4-5 + description: Drafts high-level plans + instruction: | + Use list_plans and read_plan to inspect existing plans, then write_plan + to create or revise one. Always read before writing. When done, hand off + to the builder. + toolsets: + - type: plan + handoffs: [builder] + + builder: + model: openai/gpt-4o + description: Adds implementation steps to plans + instruction: | + Read the architect's plan with read_plan, then use write_plan to append + concrete implementation steps. Always read before writing. When done, + hand off back to root. + toolsets: + - type: plan + handoffs: [root] +``` + +See [`examples/shared_plan.yaml`](https://github.com/docker/docker-agent/blob/main/examples/shared_plan.yaml) for a complete working example. + +## Error Handling + +- `read_plan` returns a distinct "not found" error when a plan does not exist, as opposed to any other I/O error, so callers can tell "plan missing" from "plan unreadable." +- `list_plans` skips corrupt entries but reports them in a `warnings` field so an agent can detect and recover from a bad state (e.g., by calling `delete_plan`). +- `delete_plan` can remove a corrupt plan to recover from a bad state. + +> [!TIP] +> **Plan vs. Todo vs. Tasks** +> +> Use **plan** for shared, free-form documents that multiple agents collaborate on (design docs, requirements, work items). Use [todo](../todo/index.md) for lightweight in-session task lists. Use [tasks](../tasks/index.md) for a structured, persistent task database with priorities and dependencies. diff --git a/_vendor/github.com/docker/docker-agent/docs/tools/rag/index.md b/_vendor/github.com/docker/docker-agent/docs/tools/rag/index.md new file mode 100644 index 0000000000..8d86c1ae01 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/tools/rag/index.md @@ -0,0 +1,264 @@ +--- +title: "RAG Tool" +description: "Give your agents access to document knowledge bases with background indexing, multiple retrieval strategies, and hybrid search." +keywords: docker agent, ai agents, tools, toolsets, rag tool +linkTitle: "RAG" +weight: 110 +aliases: + - /ai/docker-agent/rag/ +--- + +_Give your agents access to document knowledge bases with background indexing, multiple retrieval strategies, and hybrid search._ + +## Overview + +The `rag` toolset lets agents search through your documents to find relevant information before responding. Knowledge bases are declared once at the top of the config under `rag:` and then referenced from any agent via `type: rag, ref: `. docker-agent supports: + +- **Background indexing** — Files are indexed automatically and re-indexed on change +- **Multiple strategies** — Semantic embeddings, BM25 keyword search, and LLM-enhanced search +- **Hybrid search** — Combine strategies with result fusion for best results +- **Reranking** — Re-score results with specialized models for improved relevance + +## Quick Start + +```yaml +rag: + my_docs: + tool: + description: "Technical documentation" + docs: [./documents, ./some-doc.md] + strategies: + - type: chunked-embeddings + embedding_model: openai/text-embedding-3-small + database: ./docs.db + vector_dimensions: 1536 + +agents: + root: + model: openai/gpt-4o + instruction: | + You have access to a knowledge base. Use it to answer questions. + toolsets: + - type: rag + ref: my_docs +``` + +## Retrieval Strategies + +### Chunked Embeddings (Semantic Search) + +Uses embedding models to find semantically similar content. Best for understanding intent, synonyms, and paraphrasing. + +```yaml +strategies: + - type: chunked-embeddings + embedding_model: openai/text-embedding-3-small + database: ./vector.db + vector_dimensions: 1536 + similarity_metric: cosine_similarity + threshold: 0.5 + limit: 10 + embedding_batch_size: 50 + chunking: + size: 1000 + overlap: 100 +``` + +### Semantic Embeddings (LLM-Enhanced) + +Uses an LLM to generate semantic summaries of each chunk before embedding, capturing meaning and intent. Best for code search and understanding implementations. + +```yaml +strategies: + - type: semantic-embeddings + embedding_model: openai/text-embedding-3-small + vector_dimensions: 1536 + chat_model: openai/gpt-4o-mini + database: ./semantic.db + ast_context: true # include AST metadata + chunking: + size: 1000 + code_aware: true # AST-aware chunking +``` + +> [!NOTE] +> **Trade-offs** +> +> Semantic embeddings provide higher quality retrieval but slower indexing (LLM call per chunk) and additional API costs. + +### BM25 (Keyword Search) + +Traditional keyword matching using the BM25 algorithm. Best for exact terms, technical jargon, and code identifiers. + +```yaml +strategies: + - type: bm25 + database: ./bm25.db + k1: 1.5 # term frequency saturation + b: 0.75 # length normalization + threshold: 0.3 + limit: 10 + chunking: + size: 1000 + overlap: 100 +``` + +## Hybrid Search + +Combine multiple strategies for best results. Strategies run in parallel and results are fused together: + +```yaml +rag: + hybrid: + docs: [./docs] + strategies: + - type: chunked-embeddings + embedding_model: openai/text-embedding-3-small + database: ./vector.db + vector_dimensions: 1536 + limit: 20 + chunking: { size: 1000, overlap: 100 } + - type: bm25 + database: ./bm25.db + limit: 15 + chunking: { size: 1000, overlap: 100 } + results: + fusion: + strategy: rrf # Reciprocal Rank Fusion + k: 60 + deduplicate: true + limit: 5 +``` + +## Fusion Strategies + +| Strategy | Best For | Description | +| ---------- | --------------------------------- | ------------------------------------------------------------------ | +| `rrf` | General use (recommended) | Reciprocal Rank Fusion — rank-based, no score normalization needed | +| `weighted` | Known performance characteristics | Weight strategies differently (e.g., embeddings: 0.7, BM25: 0.3) | +| `max` | Same scoring scale | Takes the maximum score from any strategy | + +## Reranking + +Re-score retrieved documents with a specialized model to improve relevance: + +```yaml +results: + reranking: + model: openai/gpt-4o-mini + top_k: 10 # only rerank top 10 + threshold: 0.3 # minimum score after reranking + criteria: | + Prioritize official documentation over blog posts. + Prefer recent information and practical examples. + limit: 5 +``` + +Supported reranking providers: **DMR** (native `/rerank` endpoint), **OpenAI**, **Anthropic**, **Gemini**. + +## Code-Aware Chunking + +For source code, enable AST-based chunking to keep functions and methods intact: + +```yaml +chunking: + size: 2000 + code_aware: true # Uses tree-sitter for AST-based chunking +``` + +> [!NOTE] +> **Language Support** +> +> Currently supports Go (`.go`) files. More languages will be added. Falls back to plain text chunking for unsupported file types. + +## Debugging RAG + +Enable debug logging to see retrieval details: + +```bash +$ docker agent run config.yaml --debug --log-file debug.log +``` + +Look for log tags: `[RAG Manager]`, `[Chunked-Embeddings Strategy]`, `[BM25 Strategy]`, `[RRF Fusion]`, `[Reranker]`. + +**Permanent model errors abort early.** If the embedding model, semantic-LLM model, or reranking model returns a permanent error (HTTP 400, 401, 404, or 429 — invalid config, bad auth, unknown model, or rate limit), docker-agent treats the model configuration as invalid and stops immediately rather than retrying doomed requests: + +- **Indexing** — the entire indexing run is aborted after the first permanent failure (including 429). The error is surfaced in the logs so you know immediately if a model name or API key is wrong, rather than silently producing incomplete results. +- **Reranking** — a permanent error (including 429) permanently disables the reranker for the lifetime of the manager. Subsequent queries fall back to un-reranked results. Only transient errors (5xx, timeouts) fall back and retry on the next query. + +> [!TIP] +> **Examples** +> +> See the [RAG examples](https://github.com/docker/docker-agent/tree/main/examples/rag) in the GitHub repo for complete, runnable configurations. + +## Configuration Reference + +### Top-Level RAG Fields + +| Field | Type | Default | Description | +| ------------- | -------- | ------- | -------------------------------------------------------------- | +| `docs` | []string | — | Document paths/directories (shared across strategies) | +| `description` | string | — | Human-readable description of this RAG source | +| `respect_vcs` | boolean | `true` | Respect `.gitignore` files when indexing documents | +| `strategies` | []object | — | Array of retrieval strategy configurations | +| `results` | object | — | Post-processing: fusion, reranking, deduplication, final limit | + +### Chunked-Embeddings Strategy + +| Field | Type | Default | Description | +| --------------------------- | ------ | ------------------- | ------------------------------------------------------------ | +| `embedding_model` | string | — | **Required.** Embedding model reference | +| `database` | string | — | Path to local SQLite database | +| `vector_dimensions` | int | — | Embedding dimensions (e.g., 1536 for text-embedding-3-small) | +| `similarity_metric` | string | `cosine_similarity` | Similarity metric | +| `threshold` | float | `0.5` | Minimum similarity score (0–1) | +| `limit` | int | `5` | Max results from this strategy | +| `embedding_batch_size` | int | `50` | Chunks per embedding request | +| `max_embedding_concurrency` | int | `3` | Max concurrent embedding requests | +| `chunking.size` | int | `1500` | Chunk size in characters (`4000` when `code_aware` is set) | +| `chunking.overlap` | int | `75` | Overlap between chunks in characters | +| `chunking.code_aware` | bool | `false` | AST-based chunking (Go files only) | + +### Semantic-Embeddings Strategy + +| Field | Type | Default | Description | +| -------------------------- | ------ | ---------- | ------------------------------------------------------------------ | +| `embedding_model` | string | — | **Required.** Embedding model reference | +| `chat_model` | string | — | **Required.** LLM for generating semantic summaries | +| `vector_dimensions` | int | — | **Required.** Embedding dimensions | +| `database` | string | — | Path to local SQLite database | +| `semantic_prompt` | string | (built-in) | Custom prompt template (`${path}`, `${content}`, `${ast_context}`) | +| `ast_context` | bool | `false` | Include tree-sitter AST metadata in prompts | +| `threshold` | float | `0.5` | Minimum similarity score (0–1) | +| `limit` | int | `5` | Max results | +| `max_indexing_concurrency` | int | `3` | Max concurrent file indexing | +| `chunking.size` | int | `1500` | Chunk size in characters (`4000` when `code_aware` is set) | +| `chunking.overlap` | int | `75` | Overlap between chunks | +| `chunking.code_aware` | bool | `false` | AST-based chunking | + +### BM25 Strategy + +| Field | Type | Default | Description | +| ------------------ | ------ | ------- | ----------------------------------------------- | +| `database` | string | — | Path to local SQLite database | +| `k1` | float | `1.5` | Term frequency saturation (1.2–2.0 recommended) | +| `b` | float | `0.75` | Length normalization (0–1) | +| `threshold` | float | `0.0` | Minimum BM25 score | +| `limit` | int | `5` | Max results | +| `chunking.size` | int | `1500` | Chunk size in characters | +| `chunking.overlap` | int | `75` | Overlap between chunks | + +### Results (Post-Processing) + +| Field | Type | Default | Description | +| --------------------- | ------ | ------- | ----------------------------------------------------------- | +| `fusion.strategy` | string | `rrf` | Fusion method: `rrf`, `weighted`, or `max` | +| `fusion.k` | int | `60` | RRF rank constant | +| `deduplicate` | bool | `true` | Remove duplicate results | +| `limit` | int | `15` | Final number of results | +| `include_score` | bool | `false` | Include relevance scores in results | +| `return_full_content` | bool | `false` | Return full document content instead of just matched chunks | +| `reranking.model` | string | — | Reranking model reference | +| `reranking.top_k` | int | (`limit`) | Only rerank top K results. Defaults to the results `limit` when set. | +| `reranking.threshold` | float | `0.5` | Minimum relevance score after reranking | +| `reranking.criteria` | string | — | Custom relevance guidance for the reranking model | diff --git a/_vendor/github.com/docker/docker-agent/docs/tools/script/index.md b/_vendor/github.com/docker/docker-agent/docs/tools/script/index.md new file mode 100644 index 0000000000..89f7edc9fb --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/tools/script/index.md @@ -0,0 +1,63 @@ +--- +title: "Script Tool" +description: "Define custom shell scripts as named tools with typed parameters." +keywords: docker agent, ai agents, tools, toolsets, script tool +linkTitle: "Script" +weight: 30 +--- + +_Define custom shell scripts as named tools with typed parameters._ + +## Overview + +The script tool lets you define custom shell scripts as named tools. Unlike the generic [shell tool](../shell/index.md) where the agent writes the command, script tools execute predefined commands — ideal for exposing safe, well-scoped operations with descriptive names. + +## Configuration + +### Simple Scripts + +```yaml +toolsets: + - type: script + shell: + run_tests: + cmd: task test + description: Run the project test suite + lint: + cmd: task lint + description: Run the linter +``` + +### Scripts with Parameters + +Use `${param}` interpolation and JSON Schema to define typed arguments: + +```yaml +toolsets: + - type: script + shell: + deploy: + cmd: ./scripts/deploy.sh ${env} + description: Deploy to an environment + args: + env: + type: string + enum: [staging, production] + required: [env] +``` + +## Properties + +| Property | Type | Description | +| --------------------------------- | ------ | ---------------------------------------------------------- | +| `shell..cmd` | string | Shell command to execute (supports `${arg}` interpolation) | +| `shell..description` | string | Description shown to the model | +| `shell..args` | object | Parameter definitions (JSON Schema properties) | +| `shell..required` | array | Required parameter names | +| `shell..env` | object | Environment variables for this script | +| `shell..working_dir` | string | Working directory for script execution | + +> [!TIP] +> **Script vs. Shell** +> +> Use the [shell tool](../shell/index.md) when the agent needs to run arbitrary commands. Use the script tool when you want to expose specific, predefined operations with clear names and typed parameters — giving the agent less freedom but more safety. diff --git a/_vendor/github.com/docker/docker-agent/docs/tools/session_context/index.md b/_vendor/github.com/docker/docker-agent/docs/tools/session_context/index.md new file mode 100644 index 0000000000..0336972d6c --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/tools/session_context/index.md @@ -0,0 +1,66 @@ +--- +title: "Session Context Tool" +description: "Reference a previous session as context in the current one." +keywords: docker agent, ai agents, tools, toolsets, session context tool +linkTitle: "Session Context" +weight: 210 +--- + +_Reference a previous session as context, without manual export/import._ + +## Overview + +The `session_context` toolset lets an agent discover earlier sessions and pull one in as context for the current session. It removes the manual workaround of exporting a conversation to HTML and re-attaching it with an `@` mention. + +The tool surface is two read-only tools: + +| Tool | Description | +| --------------- | ------------------------------------------------------------------------------------------------------------ | +| `list_sessions` | List previous sessions (most recent first) with id, title, creation time and message count. | +| `read_session` | Return the transcript of a previous session, by id or by a relative reference like `-1`. | + +The session the agent is currently running in is never listed by `list_sessions` and cannot be read by `read_session` (a circular reference returns an error). + +## Configuration + +```yaml +toolsets: + - type: session_context +``` + +No configuration options. Both tools are read-only and operate against the same session store the runtime already uses for persistence. + +Restrict the toolset to a subset of tools the standard way: + +```yaml +# An agent that may browse but never pull a full transcript into context. +toolsets: + - type: session_context + tools: + - list_sessions +``` + +## Selecting a session + +`read_session` accepts either form: + +- A concrete id returned by `list_sessions`, e.g. `read_session("a1b2c3...")`. +- A relative reference: `-1` is the most recent session, `-2` the second most recent, and so on. Relative references resolve against the same ordering `list_sessions` uses (most recent first), excluding sub-sessions. + +## Transcript size + +A long session could overflow the current context window, so `read_session` caps the rendered transcript. When a transcript is larger than the budget, the oldest messages are dropped (the most recent are usually the most useful for continuing work) and a note records how many were omitted: + +```text +[12 earlier message(s) omitted to fit the context budget; showing the most recent 8] +``` + +## Notes + +- `list_sessions` defaults to 20 sessions and is capped at 100; pass `limit` to request fewer. +- `read_session` returns an error when the session is not found, when the reference cannot be resolved, or when it points at the current session. +- Both tools are read-only: they never modify, branch, or delete sessions. + +## Example + +See [`examples/session_context.yaml`](https://github.com/docker/docker-agent/blob/main/examples/session_context.yaml) for a complete working example. diff --git a/_vendor/github.com/docker/docker-agent/docs/tools/session_plan/index.md b/_vendor/github.com/docker/docker-agent/docs/tools/session_plan/index.md new file mode 100644 index 0000000000..450b607d33 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/tools/session_plan/index.md @@ -0,0 +1,126 @@ +--- +title: "Session Plan Tool" +description: "Per-session plan tracker for the draft, review, execute workflow." +keywords: docker agent, ai agents, tools, toolsets, session plan tool +linkTitle: "Session Plan" +weight: 160 +--- + +_Per-session plan tracker for the "draft, review, execute" workflow._ + +## Overview + +The `session_plan` toolset gives one agent a place to write a plan for the current session, signal that the plan is ready, and let the host route the next turn to an executing agent. + +Different from the [`plan` toolset](../plan/index.md) — `plan` is for shared, named plans multiple agents collaborate on over many sessions. `session_plan` is for one ephemeral plan per session, scoped to that session by ID. + +Plans live as Markdown files under: + +```text +~/.cagent/session_plans/.md +``` + +The tool surface is three tools: + +| Tool | Description | +| -------------------- | ---------------------------------------------------------------------------------------------------- | +| `write_session_plan` | Create or replace this session's plan as markdown. There's exactly one plan per session. | +| `read_session_plan` | Read the plan written for the current session and return it as markdown. | +| `exit_plan_mode` | Signal that the plan is ready for review. Does not switch agents on its own. | + +## Configuration + +```yaml +toolsets: + - type: session_plan +``` + +No configuration options. The plan path is derived from the session ID; the agent does not name plans. + +Restrict the toolset to a subset of tools the standard way: + +```yaml +# An agent that consumes a plan but should not be able to (re)write or finalize one. +toolsets: + - type: session_plan + tools: + - read_session_plan +``` + +## When to call exit_plan_mode + +Call `exit_plan_mode` once the plan is complete and you do not intend to change it on the next turn. It validates that a plan exists for the session and returns a "ready for review" tool result. It does **not** switch agents or solicit user approval on its own — the host application owns the next-turn routing (for example, by reading the tool result, by a UI affordance the user toggles, or by a `handoff` declared on the agent). + +This separation keeps the tool reusable across UIs: a CLI that prints tool results inline, a chat UI with a plan-mode toggle, and a server that auto-routes the next turn through a `handoff` can all consume the same signal without one stepping on another. + +## Storage and cleanup + +- Plans are markdown files written atomically (temp + rename), so concurrent readers — in this process or another — never observe a partial write. +- A best-effort sweep on first use of the toolset removes plan files older than 30 days under the plans directory. Stranded plans for long-gone sessions do not accumulate. +- The session ID identifies the file directly. There is no in-process mutex or revision counter, because two sessions cannot map to the same path. + +## Events + +A `session_plan_updated` event is emitted whenever `write_session_plan` succeeds: + +```json +{ + "type": "session_plan_updated", + "session_id": "...", + "path": "/Users/.../.cagent/session_plans/.md", + "content": "# my plan\n...", + "agent_name": "planner" +} +``` + +Embedders that render the plan inline can subscribe and update without re-reading the file. + +## Example + +A two-agent workflow: `root` executes, `planner` plans. `/plan` hands off to the planner; `exit_plan_mode` signals "ready", and the host decides what happens next. + +```yaml +agents: + root: + model: anthropic/claude-sonnet-4-5 + description: Executes approved plans + instruction: | + You execute plans the planner has handed off. When you see a message + that a plan has been approved, read it with read_session_plan and work + through its steps in order. + toolsets: + - type: session_plan + tools: + - read_session_plan + - type: filesystem + - type: shell + commands: + plan: + description: "Switch to the planner" + agent: planner + + planner: + model: anthropic/claude-sonnet-4-5 + description: Investigates and writes plans for review + instruction: | + Investigate the user's request, then write the plan with + write_session_plan. Iterate with the user until the plan is complete, + then call exit_plan_mode to mark it ready for review. + toolsets: + - type: session_plan + - type: filesystem + readonly: true + - type: user_prompt +``` + +See [`examples/session_plan.yaml`](https://github.com/docker/docker-agent/blob/main/examples/session_plan.yaml) for a complete working example. + +## Error Handling + +- `read_session_plan` and `exit_plan_mode` return a "no plan written yet" error when called before `write_session_plan`. +- `write_session_plan` validates the session ID and refuses to write anything that could escape the plans directory; in practice the runtime generates UUIDs so this only triggers if an embedder supplies a hand-crafted ID. + +> [!TIP] +> **session_plan vs. plan vs. todo vs. tasks** +> +> Use **session_plan** when one agent drafts an approach for the user to review before another agent executes it (ephemeral, one per session). Use [plan](../plan/index.md) for shared, named plans multiple agents collaborate on over many sessions. Use [todo](../todo/index.md) for lightweight in-session task lists. Use [tasks](../tasks/index.md) for a structured, persistent task database with priorities and dependencies. diff --git a/_vendor/github.com/docker/docker-agent/docs/tools/shell/index.md b/_vendor/github.com/docker/docker-agent/docs/tools/shell/index.md new file mode 100644 index 0000000000..cee6d14970 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/tools/shell/index.md @@ -0,0 +1,128 @@ +--- +title: "Shell Tool" +description: "Execute arbitrary shell commands in the user's environment." +keywords: docker agent, ai agents, tools, toolsets, shell tool +linkTitle: "Shell" +weight: 20 +--- + +_Execute arbitrary shell commands in the user's environment._ + +## Overview + +The shell tool allows agents to execute arbitrary shell commands. This is one of the most powerful tools — it lets agents run builds, install dependencies, query APIs, and interact with the system. Each call runs in a fresh, isolated shell session — no state persists between calls. + +Commands have a default 30-second timeout and require user confirmation unless `--yolo` is used. + +## Configuration + +```yaml +toolsets: + - type: shell +``` + +### Options + +| Property | Type | Description | +| -------------- | ------- | --------------------------------------------------------------------------------------------------- | +| `env` | object | Environment variables to set for all shell commands | +| `safer` | boolean | Detect destructive shell commands and force confirmation regardless of `--yolo` or permission rules (see [Safer mode](#safer-mode)). Default `false`. | +| `sudo_askpass` | boolean | Opt in to prompting for a `sudo` password (see [Sudo support](#sudo-support)). Default `false`. | + +### Custom Environment Variables + +```yaml +toolsets: + - type: shell + env: + MY_VAR: "value" + PATH: "${env.PATH}:/custom/bin" +``` + +### Safer mode + +Set `safer: true` to enable destructive-command detection for the shell toolset: + +```yaml +toolsets: + - type: shell + safer: true +``` + +This auto-registers the [`safer_shell`](../../configuration/hooks/index.md#built-in-hooks) builtin +under `pre_tool_use` with `preempt_yolo: true` so the entry fires +before `Decide()` / `--yolo`. Three behaviors: + +- **Destructive matches** (`rm -rf `, `docker volume rm`, `mkfs`, `dd if=… of=/dev/`, …) get a forced user confirmation carrying a `blast_radius` classification (`low` / `medium` / `high` / `unknown`) and a `category` tag. The TUI confirmation dialog renders the blast radius with a color badge. +- **Known-safe reads** (`ls`, `cat`, `git status`, `git diff`, `docker ps`, `docker logs`, `kubectl get`, …) flow through silently — they're treated as no-opinion and follow the regular approval pipeline (`--yolo`, permission rules, read-only hint). +- **Everything else** asks with `blast_radius=unknown`. Safer mode is conservative by default: unrecognised commands surface to the user before `--yolo` or permission allow-rules can auto-approve them. + +The verdict cannot be bypassed by `--yolo` or by a `permission_request` hook that returns `allow` — the `preempt_yolo` lane runs before both. Compound shell (`a && b`, `a; b`, `a | b`) is never matched against the safe allowlist; any destructive segment falls through to ask. The full taxonomy lives in [`pkg/hooks/builtins/safety_patterns.json`](https://github.com/docker/docker-agent/blob/main/pkg/hooks/builtins/safety_patterns.json). + +See [`examples/shell_safer.yaml`](https://github.com/docker/docker-agent/blob/main/examples/shell_safer.yaml) for a full example. Under the hood, `safer: true` is a sugar that appends one entry under `hooks.pre_tool_use` with `preempt_yolo: true`; writing the entry by hand achieves the same thing. + +### Sudo support + +By default a shell command has no controlling terminal, so a `sudo` command that needs a password hangs until it times out (the agent usually gives up and falls back to printing manual instructions). + +Set `sudo_askpass: true` to enable a sudo privilege escalation flow: + +```yaml +toolsets: + - type: shell + sudo_askpass: true +``` + +When enabled, `sudo` commands prompt you for your password through the host UI (the input is masked). The password is handed to `sudo` over a private, per-session socket via the standard `SUDO_ASKPASS` mechanism — it is never written to the command line, the logs, or stored by the agent. + +The bridge environment variables (`SUDO_ASKPASS`, `CAGENT_ASKPASS_SOCKET`, `CAGENT_ASKPASS_TOKEN`) are added only to commands that invoke `sudo`, but within such a command they are visible to every child process, not just `sudo`. They carry a socket path and a session token, not the password; the socket lives in a `0700` directory, so only your own user can reach it. + +Notes and limitations: + +- Unix only. The flag has no effect on Windows. +- Interactive UI only. In headless / non-interactive runs the prompt is declined automatically and `sudo` fails as before. +- Only a bare `sudo ...` invocation in a POSIX shell (`sh`, `bash`, `zsh`, ...) is handled. `sudo` called by absolute path (`/usr/bin/sudo`), via `env sudo`, from inside a nested script, or under a non-POSIX shell (e.g. `fish`) is not intercepted and behaves as before. +- Caching is `sudo`'s own. Because each shell tool call runs in a fresh shell with no controlling terminal, `sudo`'s credential cache does not persist across separate tool calls: you are prompted once per shell command that uses `sudo`. Within a single command, multiple `sudo` calls (e.g. `sudo a && sudo b`) usually share one prompt, subject to `sudo`'s own timestamp configuration. +- The prompt must be answered within the command's timeout; raise the `timeout` parameter for `sudo` commands that may wait on input. Background jobs (`run_background_job`) are wired too, but their prompt only works while the originating turn is still active. +- Prompts are serialized: if a single command runs two `sudo` calls in parallel (e.g. `sudo a & sudo b`), the second waits for the first prompt to be answered rather than opening two dialogs at once. + +## Available Tools + +The shell toolset exposes five tools: + +| Tool Name | Description | +| ---------------------- | ---------------------------------------------------------------------------------------------- | +| `shell` | Run a command synchronously and return its combined output when it finishes. | +| `run_background_job` | Start a command asynchronously and return a job ID immediately. Use for servers/watchers/etc. | +| `list_background_jobs` | List all background jobs with their status, runtime, and metadata. | +| `view_background_job` | View the buffered output and status of a specific background job by ID. | +| `stop_background_job` | Stop a running background job. Child processes are terminated too. | + +Background job output is captured up to 10 MB per job. All background jobs are automatically terminated when the agent session ends. + +### `shell` parameters + +| Parameter | Type | Required | Description | +| --------- | ------- | -------- | ------------------------------------------------------------------------- | +| `cmd` | string | ✓ | The shell command to execute. | +| `cwd` | string | ✗ | Working directory to run the command in (default: `.`). | +| `timeout` | integer | ✗ | Per-call execution timeout in seconds (default: `30`). | + +### `run_background_job` parameters + +| Parameter | Type | Required | Description | +| --------- | ------ | -------- | ----------------------------------------------------------------------- | +| `cmd` | string | ✓ | The shell command to execute in the background. | +| `cwd` | string | ✗ | Working directory to run the command in (default: `.`). | + +`view_background_job` and `stop_background_job` each take a single required `job_id` string returned by `run_background_job` or `list_background_jobs`. + +> [!WARNING] +> **Safety** +> +> The shell tool gives agents full access to the system shell. Always set `max_iterations` on agents that use the shell tool to prevent infinite loops. A value of 20–50 is typical for development agents. Use [Sandbox Mode](../../configuration/sandbox/index.md) for additional isolation. + +> [!NOTE] +> **Tool Confirmation** +> +> By default, docker-agent asks for user confirmation before executing shell commands. Use `--yolo` to auto-approve all tool calls. diff --git a/_vendor/github.com/docker/docker-agent/docs/tools/tasks/index.md b/_vendor/github.com/docker/docker-agent/docs/tools/tasks/index.md new file mode 100644 index 0000000000..c6cf8db5dd --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/tools/tasks/index.md @@ -0,0 +1,58 @@ +--- +title: "Tasks Tool" +description: "Persistent task database with priorities and dependencies, shared across sessions." +keywords: docker agent, ai agents, tools, toolsets, tasks tool +linkTitle: "Tasks" +weight: 180 +--- + +_Persistent task database with priorities and dependencies, shared across sessions._ + +## Overview + +The tasks tool provides a persistent task database that survives across agent sessions. Unlike the [Todo tool](../todo/index.md), which maintains an in-memory task list for the current session only, the tasks tool stores tasks in a JSON file on disk so they can be accessed and updated across multiple sessions. Tasks support priorities and dependencies — a task is _blocked_ until every task it depends on is `done`. + +## Configuration + +```yaml +toolsets: + - type: tasks + path: ./tasks.json # Optional: custom database path +``` + +### Options + +| Property | Type | Default | Description | +| -------- | ------ | ------------- | ---------------------------------------------------------------------------------------------------------------------------- | +| `path` | string | `tasks.json` | Path to the JSON task database. Relative paths resolve against the agent config directory (or `--working-dir` when set). | + +## Available Tools + +The tasks toolset exposes these tools: + +| Tool Name | Description | +| ------------------- | ------------------------------------------------------------------------------------------------------------------------ | +| `create_task` | Create a new task with a title, description (or markdown file path), optional priority, and optional dependencies. | +| `get_task` | Get full details of a single task by ID, including its effective status (`blocked` if any dependency is not `done`). | +| `update_task` | Update a task's title, description, priority, status, or dependency list. | +| `delete_task` | Delete a task by ID. Also removes it from other tasks' dependency lists. | +| `list_tasks` | List tasks sorted by priority (critical first) with blocked tasks last. Optionally filter by status or priority. | +| `next_task` | Return the highest-priority actionable task — one that is not blocked and not done. Great for "what should I work on?". | +| `add_dependency` | Add a dependency: a task is blocked until the task it depends on is `done`. | +| `remove_dependency` | Remove a dependency from a task. | + +## Example + +```yaml +agents: + root: + model: openai/gpt-4o + toolsets: + - type: tasks + path: ./project-tasks.json +``` + +> [!TIP] +> **Tasks vs. Todo** +> +> Use the **tasks** tool when you need persistence across sessions, priorities, or dependencies (e.g., long-running projects, recurring work). Use the [todo tool](../todo/index.md) for ephemeral, session-scoped task lists. diff --git a/_vendor/github.com/docker/docker-agent/docs/tools/think/index.md b/_vendor/github.com/docker/docker-agent/docs/tools/think/index.md new file mode 100644 index 0000000000..033b2020d1 --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/tools/think/index.md @@ -0,0 +1,29 @@ +--- +title: "Think Tool" +description: "Step-by-step reasoning scratchpad for planning and decision-making." +keywords: docker agent, ai agents, tools, toolsets, think tool +linkTitle: "Think" +weight: 140 +--- + +_Step-by-step reasoning scratchpad for planning and decision-making._ + +## Overview + +The think tool is a reasoning scratchpad that lets agents think step-by-step before acting. The agent can write its thoughts without producing visible output to the user — ideal for planning complex tasks, breaking down problems, and reasoning through multi-step solutions. + +This is a lightweight tool with no side effects. It is most useful for models that lack built-in reasoning or thinking capabilities (e.g., smaller or older models). For models that already support native thinking — such as Claude with extended thinking, OpenAI o-series, or Gemini with a thinking budget — this tool is unnecessary since the model can reason internally. + +## Configuration + +```yaml +toolsets: + - type: think +``` + +No configuration options. + +> [!TIP] +> **When to use** +> +> Use the think tool with models that don't have native reasoning capabilities. If your model already supports a [thinking budget](../../configuration/models/index.md#thinking-budget), you likely don't need this tool. diff --git a/_vendor/github.com/docker/docker-agent/docs/tools/todo/index.md b/_vendor/github.com/docker/docker-agent/docs/tools/todo/index.md new file mode 100644 index 0000000000..264d1657de --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/tools/todo/index.md @@ -0,0 +1,53 @@ +--- +title: "Todo Tool" +description: "Task list management for complex multi-step workflows." +keywords: docker agent, ai agents, tools, toolsets, todo tool +linkTitle: "Todo" +weight: 170 +--- + +_Task list management for complex multi-step workflows._ + +## Overview + +The todo tool provides task list management. Agents can create, update, list, and track progress on tasks with status tracking (pending, in-progress, completed). Useful for complex multi-step workflows where the agent needs to stay organized and ensure all steps are completed. + +## Available Tools + +| Tool | Description | +| -------------- | ---------------------------------------- | +| `create_todo` | Create a new task | +| `create_todos` | Create multiple tasks at once | +| `update_todos` | Update status of one or more tasks | +| `list_todos` | List all current tasks with their status | + +### Task Statuses + +| Status | Description | +| ------------- | ---------------------------- | +| `pending` | Task has not been started | +| `in-progress` | Task is currently being done | +| `completed` | Task is finished | + +## Configuration + +```yaml +toolsets: + - type: todo +``` + +### Options + +| Property | Type | Default | Description | +| -------- | ------- | ------- | ----------------------------------------------------------------------- | +| `shared` | boolean | `false` | When `true`, todos are shared across all agents in a multi-agent config | + +### Shared Todos + +In multi-agent setups, enable shared todos so all agents can see and update the same task list: + +```yaml +toolsets: + - type: todo + shared: true +``` diff --git a/_vendor/github.com/docker/docker-agent/docs/tools/transfer-task/index.md b/_vendor/github.com/docker/docker-agent/docs/tools/transfer-task/index.md new file mode 100644 index 0000000000..66bdd4e0eb --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/tools/transfer-task/index.md @@ -0,0 +1,63 @@ +--- +title: "Transfer Task Tool" +description: "Delegate tasks to sub-agents in multi-agent setups." +keywords: docker agent, ai agents, tools, toolsets, transfer task tool +linkTitle: "Transfer Task" +weight: 80 +--- + +_Delegate tasks to sub-agents in multi-agent setups._ + +## Overview + +The `transfer_task` tool allows an agent to delegate tasks to specialized sub-agents and receive their results. This is the core mechanism for multi-agent orchestration. + +**You don't need to add it manually** — it's automatically available when an agent has `sub_agents` configured. + +## Configuration + +The tool is enabled implicitly when `sub_agents` is set: + +```yaml +agents: + coordinator: + model: openai/gpt-4o + description: Coordinates work across specialists + instruction: Analyze requests and delegate to the right specialist. + sub_agents: [developer, researcher] + + developer: + model: anthropic/claude-sonnet-4-5 + description: Expert software developer + instruction: Write clean, production-ready code. + toolsets: + - type: filesystem + - type: shell + + researcher: + model: openai/gpt-4o + description: Web researcher + instruction: Search for information online. + toolsets: + - type: mcp + ref: docker:duckduckgo +``` + +The coordinator agent automatically gets a `transfer_task` tool that can delegate to `developer` or `researcher`. + +## Tool Interface + +The `transfer_task` tool takes three parameters: + +| Parameter | Type | Required | Description | +| ----------------- | ------ | -------- | ------------------------------------------------------------------------------------------- | +| `agent` | string | ✓ | Name of the sub-agent to delegate to. Must be listed under the caller's `sub_agents`. | +| `task` | string | ✓ | Clear, concise description of the task the sub-agent should achieve. | +| `expected_output` | string | ✓ | Description of the result/format the caller expects back. | + +The call blocks until the sub-agent returns its result, which becomes the tool's response. For non-blocking parallel delegation, use [`background_agents`](../background-agents/index.md) instead. + +> [!TIP] +> **See also** +> +> For parallel task delegation, see [Background Agents](../background-agents/index.md). For multi-agent patterns, see [Multi-Agent](../../concepts/multi-agent/index.md). diff --git a/_vendor/github.com/docker/docker-agent/docs/tools/user-prompt/index.md b/_vendor/github.com/docker/docker-agent/docs/tools/user-prompt/index.md new file mode 100644 index 0000000000..33f950cb5b --- /dev/null +++ b/_vendor/github.com/docker/docker-agent/docs/tools/user-prompt/index.md @@ -0,0 +1,185 @@ +--- +title: "User Prompt Tool" +description: "Ask the user questions and collect interactive input during agent execution." +keywords: docker agent, ai agents, tools, toolsets, user prompt tool +linkTitle: "User Prompt" +weight: 190 +--- + +_Ask the user questions and collect interactive input during agent execution._ + +## Overview + +The user prompt tool allows agents to ask questions and collect input from users during execution. This enables interactive workflows where the agent needs clarification, confirmation, or additional information before proceeding. + +> [!NOTE] +> **When to Use** +> +> - When the agent needs clarification before proceeding +> - Collecting credentials or configuration values +> - Presenting choices and getting user decisions +> - Confirming destructive or important actions + +## Configuration + +```yaml +agents: + assistant: + model: openai/gpt-4o + description: Interactive assistant + instruction: | + You are a helpful assistant. When you need information + from the user, use the user_prompt tool to ask them. + toolsets: + - type: user_prompt + - type: filesystem + - type: shell +``` + +## Tool Interface + +The `user_prompt` tool takes these parameters: + +| Parameter | Type | Required | Description | +| --------- | ------ | -------- | -------------------------------------------------------------------------------------------------- | +| `message` | string | ✓ | The question or prompt to display. | +| `title` | string | ✗ | Optional title for the dialog window in the TUI. Defaults to `"Question"` when not provided. | +| `schema` | object | ✗ | JSON Schema defining the expected response structure (object or primitive). | + +## Response Format + +The tool returns a JSON response: + +```json +{ + "action": "accept", + "content": { + "field1": "user value", + "field2": true + } +} +``` + +### Action Values + +| Action | Meaning | +| --------- | ------------------------------------------ | +| `accept` | User provided a response (check `content`) | +| `decline` | User declined to answer | +| `cancel` | User cancelled the prompt | + +## Schema Examples + +### Simple String Input + +```json +{ + "type": "string", + "title": "API Key", + "description": "Enter your API key" +} +``` + +### Multiple Choice + +```json +{ + "type": "string", + "enum": ["development", "staging", "production"], + "title": "Environment", + "description": "Select the target environment" +} +``` + +### Boolean Confirmation + +```json +{ + "type": "boolean", + "title": "Confirm", + "description": "Are you sure you want to proceed?" +} +``` + +### Object with Multiple Fields + +```json +{ + "type": "object", + "properties": { + "username": { + "type": "string", + "description": "Your username" + }, + "password": { + "type": "string", + "description": "Your password" + }, + "remember": { + "type": "boolean", + "description": "Remember credentials" + } + }, + "required": ["username", "password"] +} +``` + +### Number Input + +```json +{ + "type": "integer", + "title": "Port Number", + "description": "Enter the port number (1024-65535)", + "minimum": 1024, + "maximum": 65535 +} +``` + +## Example Usage + +Here's how an agent might use the user prompt tool: + +```text +Agent: I need to deploy this application. Let me ask which environment to target. + +[Calls user_prompt with message: "Which environment should I deploy to?" + and schema with enum: ["development", "staging", "production"]] + +User selects: "staging" + +Agent: Great, I'll deploy to staging. Let me confirm this action. + +[Calls user_prompt with message: "Deploy to staging? This will replace the current version." + and schema with type: "boolean"] + +User confirms: true + +Agent: Deploying to staging... +``` + +## UI Presentation + +How the prompt appears depends on the interface: + +- **TUI**: Displays an interactive dialog with appropriate input controls +- **CLI (exec mode)**: Prints the prompt and reads from stdin +- **API/MCP**: Returns an elicitation request to the client + +> [!TIP] +> **Best Practice** +> +> Provide clear, concise messages. Include context about why you're asking and what the information will be used for. Use schemas with descriptions to guide users on expected input format. + +## Handling Responses + +The agent should handle all possible actions: + +- **accept**: Process the `content` and continue +- **decline**: Acknowledge and try an alternative approach or explain what's needed +- **cancel**: Stop the current operation gracefully + +> [!WARNING] +> **Context Requirement** +> +> The user prompt tool requires an elicitation handler to be configured. It works in the TUI and CLI modes but may not be available in all contexts (e.g., some MCP client configurations). diff --git a/_vendor/modules.txt b/_vendor/modules.txt index 0ce69fa3b0..5ab27750d8 100644 --- a/_vendor/modules.txt +++ b/_vendor/modules.txt @@ -1,6 +1,7 @@ # github.com/moby/moby/api v1.55.0 # github.com/moby/buildkit v0.31.0 # github.com/docker/buildx v0.35.0 -# github.com/docker/cli v29.6.0+incompatible +# github.com/docker/cli v29.6.1+incompatible # github.com/docker/compose/v5 v5.3.0 # github.com/docker/model-runner v1.1.36 +# github.com/docker/docker-agent v1.96.0 diff --git a/content/manuals/ai/docker-agent/_index.md b/content/manuals/ai/docker-agent/_index.md index 060168ad81..bb69c0115d 100644 --- a/content/manuals/ai/docker-agent/_index.md +++ b/content/manuals/ai/docker-agent/_index.md @@ -5,6 +5,9 @@ weight: 60 aliases: - /ai/cagent/ - /manuals/ai/cagent/ + - /ai/docker-agent/integrations/ + - /ai/docker-agent/reference/ + - /ai/docker-agent/reference/examples/ params: sidebar: group: AI and agents @@ -134,7 +137,7 @@ agents: You can also configure model settings (like context limits), tools (including MCP servers), and more. See the [configuration -reference](./reference/config.md) +reference](./configuration/overview/index.md) for complete details. ## Share agent teams @@ -152,16 +155,12 @@ it doesn't exist yet. ## What's next -- Follow the [tutorial](./tutorial.md) to build your first coding agent -- Learn [best practices](./best-practices.md) for building effective agents -- Integrate Docker Agent with your [editor](./integrations/acp.md) or use agents as - [tools in MCP clients](./integrations/mcp.md) +- Follow the [quickstart](./getting-started/quickstart/index.md) to build your first agent +- Learn [best practices](./guides/tips/index.md) for building effective agents +- Integrate Docker Agent with your [editor](./features/acp/index.md) or use agents as + [tools in MCP clients](./tools/mcp/index.md) - Browse example agent configurations in the [Docker Agent repository](https://github.com/docker/docker-agent/tree/main/examples) -- Use `docker agent new` to generate agent teams with AI - Connect agents to external tools via the [Docker MCP Gateway](/manuals/ai/mcp-catalog-and-toolkit/mcp-gateway.md) -- Read the full [configuration - reference](https://github.com/docker/docker-agent?tab=readme-ov-file#-configuration-reference) - +- Read the full [configuration reference](./configuration/overview/index.md) diff --git a/content/manuals/ai/docker-agent/best-practices.md b/content/manuals/ai/docker-agent/best-practices.md deleted file mode 100644 index 80ffeb63dc..0000000000 --- a/content/manuals/ai/docker-agent/best-practices.md +++ /dev/null @@ -1,254 +0,0 @@ ---- -title: Best practices -description: Patterns and techniques for building effective agents -keywords: [docker agent, best practices, patterns, agent design, optimization] -weight: 40 ---- - -Patterns you learn from building and running agents with Docker Agent. These aren't -features or configuration options - they're approaches that work well in -practice. - -## Handling large command outputs - -Shell commands that produce large output can overflow your agent's context -window. Validation tools, test suites, and build logs often generate thousands -of lines. If you capture this output directly, it consumes all available context -and the agent fails. - -The solution: redirect output to a file, then read the file. The Read tool -automatically truncates large files to 2000 lines, and your agent can navigate -through it if needed. - -**Don't do this:** - -```yaml -reviewer: - instruction: | - Run validation: `docker buildx bake validate` - Check the output for errors. - toolsets: - - type: shell -``` - -The validation output goes directly into context. If it's large, the agent fails -with a context overflow error. - -**Do this:** - -```yaml -reviewer: - instruction: | - Run validation and save output: - `docker buildx bake validate > validation.log 2>&1` - - Read validation.log to check for errors. - The file can be large - read the first 2000 lines. - Errors usually appear at the beginning. - toolsets: - - type: filesystem - - type: shell -``` - -The output goes to a file, not context. The agent reads what it needs using the -filesystem toolset. - -## Structuring agent teams - -A single agent handling multiple responsibilities makes instructions complex and -behavior unpredictable. Breaking work across specialized agents produces better -results. - -The coordinator pattern works well: a root agent understands the overall task -and delegates to specialists. Each specialist focuses on one thing. - -**Example: Documentation writing team** - -```yaml -agents: - root: - description: Technical writing coordinator - instruction: | - Coordinate documentation work: - 1. Delegate to writer for content creation - 2. Delegate to editor for formatting polish - 3. Delegate to reviewer for validation - 4. Loop back through editor if reviewer finds issues - sub_agents: [writer, editor, reviewer] - toolsets: [filesystem, todo] - - writer: - description: Creates and edits documentation content - instruction: | - Write clear, practical documentation. - Focus on content quality - the editor handles formatting. - toolsets: [filesystem, think] - - editor: - description: Polishes formatting and style - instruction: | - Fix formatting issues, wrap lines, run prettier. - Remove AI-isms and polish style. - Don't change meaning or add content. - toolsets: [filesystem, shell] - - reviewer: - description: Runs validation tools - instruction: | - Run validation suite, report failures. - toolsets: [filesystem, shell] -``` - -Each agent has clear responsibilities. The writer doesn't worry about line -wrapping. The editor doesn't generate content. The reviewer just runs tools. - -This example uses `sub_agents` where root delegates discrete tasks and gets -results back. The root agent maintains control and coordinates all work. For -different coordination patterns where agents should transfer control to each -other, see the `handoffs` mechanism in the [configuration -reference](./reference/config.md#task-delegation-versus-conversation-handoff). - -**When to use teams:** - -- Multiple distinct steps in your workflow -- Different skills required (writing ↔ editing ↔ testing) -- One step might need to retry based on later feedback - -**When to use a single agent:** - -- Simple, focused tasks -- All work happens in one step -- Adding coordination overhead doesn't help - -## Optimizing RAG performance - -RAG indexing takes time when you have many files. A configuration that indexes -your entire codebase might take minutes to start. Optimize for what your agent -actually needs. - -**Narrow the scope:** - -Don't index everything. Index what's relevant for the agent's work. - -```yaml -# Too broad - indexes entire codebase -rag: - codebase: - docs: [./] - -# Better - indexes only relevant directories -rag: - codebase: - docs: [./src/api, ./docs, ./examples] -``` - -If your agent only works with API code, don't index tests, vendor directories, -or generated files. - -**Increase batching and concurrency:** - -Process more chunks per API call and make parallel requests. - -```yaml -strategies: - - type: chunked-embeddings - embedding_model: openai/text-embedding-3-small - batch_size: 50 # More chunks per API call - max_embedding_concurrency: 10 # Parallel requests - chunking: - size: 2000 # Larger chunks = fewer total chunks - overlap: 150 -``` - -This reduces both API calls and indexing time. - -**Consider BM25 for fast local search:** - -If you need exact term matching (function names, error messages, identifiers), -BM25 is fast and runs locally without API calls. - -```yaml -strategies: - - type: bm25 - database: ./bm25.db - chunking: - size: 1500 -``` - -Combine with embeddings using hybrid retrieval when you need both semantic -understanding and exact matching. - -## Preserving document scope - -When building agents that update documentation, a common problem: the agent -transforms minimal guides into tutorials. It adds prerequisites, -troubleshooting, best practices, examples, and detailed explanations to -everything. - -These additions might individually be good, but they change the document's -character. A focused 90-line how-to becomes a 200-line reference. - -**Build this into instructions:** - -```yaml -writer: - instruction: | - When updating documentation: - - 1. Understand the current document's scope and length - 2. Match that character - don't transform minimal guides into tutorials - 3. Add only what's genuinely missing - 4. Value brevity - not every topic needs comprehensive coverage - - Good additions fill gaps. Bad additions change the document's character. - When in doubt, add less rather than more. -``` - -Tell your agents explicitly to preserve the existing document's scope. Without -this guidance, they default to being comprehensive. - -## Model selection - -Choose models based on the agent's role and complexity. - -**Use larger models (Sonnet, GPT-5) for:** - -- Complex reasoning and planning -- Writing and editing content -- Coordinating multiple agents -- Tasks requiring judgment and creativity - -**Use smaller models (Haiku, GPT-5 Mini) for:** - -- Running validation tools -- Simple structured tasks -- Reading logs and reporting errors -- High-volume, low-complexity work - -Example from the documentation writing team: - -```yaml -agents: - root: - model: anthropic/claude-sonnet-4-5 # Complex coordination - writer: - model: anthropic/claude-sonnet-4-5 # Creative content work - editor: - model: anthropic/claude-sonnet-4-5 # Judgment about style - reviewer: - model: anthropic/claude-haiku-4-5 # Just runs validation -``` - -The reviewer uses Haiku because it runs commands and checks for errors. No -complex reasoning needed, and Haiku is faster and cheaper. - -## What's next - -- Review [configuration reference](./reference/config.md) for all available - options -- Check [toolsets reference](./reference/toolsets.md) to understand what tools - agents can use -- See [example - configurations](https://github.com/docker/docker-agent/tree/main/examples) for - complete working agents -- Read the [RAG guide](./rag.md) for detailed retrieval optimization diff --git a/content/manuals/ai/docker-agent/evals.md b/content/manuals/ai/docker-agent/evals.md deleted file mode 100644 index 3eeda1ab73..0000000000 --- a/content/manuals/ai/docker-agent/evals.md +++ /dev/null @@ -1,163 +0,0 @@ ---- -title: Evals -description: Test your agents with saved conversations -keywords: [docker agent, evaluations, testing, evals] -weight: 80 ---- - -Evaluations (evals) help you track how your agent's behavior changes over time. -When you save a conversation as an eval, you can replay it later to see if the -agent responds differently. Evals measure consistency, not correctness - they -tell you if behavior changed, not whether it's right or wrong. - -## What are evals - -An eval is a saved conversation you can replay. When you run evals, Docker Agent -replays the user messages and compares the new responses against the original -saved conversation. High scores mean the agent behaved similarly; low scores -mean behavior changed. - -What you do with that information depends on why you saved the conversation. -You might save successful conversations to catch regressions, or save failure -cases to document known issues and track whether they improve. - -## Common workflows - -How you use evals depends on what you're trying to accomplish: - -Regression testing: Save conversations where your agent performs well. When you -make changes later (upgrade models, update prompts, refactor code), run the -evals. High scores mean behavior stayed consistent, which is usually what you -want. Low scores mean something changed - examine the new behavior to see if -it's still correct. - -Tracking improvements: Save conversations where your agent struggles or fails. -As you make improvements, run these evals to see how behavior evolves. Low -scores indicate the agent now behaves differently, which might mean you fixed -the issue. You'll need to manually verify the new behavior is actually better. - -Documenting edge cases: Save interesting or unusual conversations regardless of -quality. Use them to understand how your agent handles edge cases and whether -that behavior changes over time. - -Evals measure whether behavior changed. You determine if that change is good or -bad. - -## Creating an eval - -Save a conversation from an interactive session: - -```console -$ docker agent run ./agent.yaml -``` - -Have a conversation with your agent, then save it as an eval: - -```console -> /eval test-case-name -Eval saved to evals/test-case-name.json -``` - -The conversation is saved to the `evals/` directory in your current working -directory. You can organize eval files in subdirectories if needed. - -## Running evals - -Run all evals in the default directory: - -```console -$ docker agent eval ./agent.yaml -``` - -Use a custom eval directory: - -```console -$ docker agent eval ./agent.yaml ./my-evals -``` - -Run evals against an agent from a registry: - -```console -$ docker agent eval agentcatalog/myagent -``` - -Example output: - -```console -$ docker agent eval ./agent.yaml ---- 0 -First message: tell me something interesting about kil -Eval file: c7e556c5-dae5-4898-a38c-73cc8e0e6abe -Tool trajectory score: 1.000000 -Rouge-1 score: 0.447368 -Cost: 0.00 -Output tokens: 177 -``` - -## Understanding results - -For each eval, Docker Agent shows: - -- **First message** - The initial user message from the saved conversation -- **Eval file** - The UUID of the eval file being run -- **Tool trajectory score** - How similarly the agent used tools (0-1 scale, - higher is better) -- **[ROUGE-1](https://en.wikipedia.org/wiki/ROUGE_(metric)) score** - Text - similarity between responses (0-1 scale, higher is better) -- **Cost** - The cost for this eval run -- **Output tokens** - Number of tokens generated - -Higher scores mean the agent behaved more similarly to the original recorded -conversation. A score of 1.0 means identical behavior. - -### What the scores mean - -**Tool trajectory score** measures whether the agent called the same tools in -the same order as the original conversation. Lower scores might indicate the -agent found a different approach to solve the problem, which isn't necessarily -wrong but worth investigating. - -**Rouge-1 score** measures how similar the response text is to the original. -This is a heuristic measure - different wording might still be correct, so use -this as a signal rather than absolute truth. - -### Interpreting your results - -Scores close to 1.0 mean your changes maintained consistent behavior - the -agent is using the same approach and producing similar responses. This is -generally good; your changes didn't break existing functionality. - -Lower scores mean behavior changed compared to the saved conversation. This -could be a regression where the agent now performs worse, or it could be an -improvement where the agent found a better approach. - -When scores drop, examine the actual behavior to determine if it's better or -worse. The eval files are stored as JSON in your evals directory - open the -file to see the original conversation. Then test your modified agent with the -same input to compare responses. If the new response is better, save a new -conversation to replace the eval. If it's worse, you found a regression. - -The scores guide you to what changed. Your judgment determines if the change is -good or bad. - -## When to use evals - -Evals help you track behavior changes over time. They're useful for catching -regressions when you upgrade models or dependencies, documenting known failure -cases you want to fix, and understanding how edge cases evolve as you iterate. - -Evals aren't appropriate for determining which agent configuration works best - -they measure similarity to a saved conversation, not correctness. Use manual -testing to evaluate different configurations and decide which works better. - -Save conversations worth tracking. Build a collection of important workflows, -interesting edge cases, and known issues. Run your evals when making changes to -see what shifted. - -## What's next - -- Check the [CLI reference](reference/cli.md#eval) for all `docker agent eval` - options -- Learn [best practices](best-practices.md) for building effective agents -- Review [example configurations](https://github.com/docker/docker-agent/tree/main/examples) - for different agent types diff --git a/content/manuals/ai/docker-agent/images/cagent-acp-zed.avif b/content/manuals/ai/docker-agent/images/cagent-acp-zed.avif deleted file mode 100644 index 258e751effaf74ad0f8abffbc90f58099a1c4656..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42442 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 AI > Enable Docker Model Runner**. See [Get started with - DMR](/manuals/ai/model-runner/get-started.md#enable-docker-model-runner) for - detailed instructions. -- Docker Engine (Linux) - Install with `sudo apt-get install -docker-model-plugin` or `sudo dnf install docker-model-plugin`. See [Get - started with DMR](/manuals/ai/model-runner/get-started.md#docker-engine). - -Verify Docker Model Runner is available: - -```console -$ docker model version -``` - -If the command returns version information, you're ready to use local models. - -## Using models with DMR - -Docker Model Runner can run any compatible model. Models can come from: - -- Docker Hub repositories (`docker.io/namespace/model-name`) -- Your own OCI artifacts packaged and pushed to any registry -- HuggingFace models directly (`hf.co/org/model-name`) -- The Docker Model catalog in Docker Desktop - -To see models available to the local Docker catalog, run: - -```console -$ docker model list --openai -``` - -To use a model, reference it in your configuration. DMR automatically pulls -models on first use if they're not already local. - -## Configuration - -Configure your agent to use Docker Model Runner with the `dmr` provider: - -```yaml -agents: - root: - model: dmr/ai/qwen3 - instruction: You are a helpful assistant - toolsets: - - type: filesystem -``` - -When you first run your agent, Docker Agent prompts you to pull the model if it's -not already available locally: - -```console -$ docker agent run agent.yaml -Model not found locally. Do you want to pull it now? ([y]es/[n]o) -``` - -## How it works - -When you configure an agent to use DMR, Docker Agent automatically connects to your -local Docker Model Runner and routes inference requests to it. If a model isn't -available locally, Docker Agent prompts you to pull it on first use. No API keys or -authentication are required. - -## Advanced configuration - -For more control over model behavior, define a model configuration: - -```yaml -models: - local-qwen: - provider: dmr - model: ai/qwen3:14B - temperature: 0.7 - max_tokens: 8192 - -agents: - root: - model: local-qwen - instruction: You are a helpful coding assistant -``` - -### Faster inference with speculative decoding - -Speed up model responses using speculative decoding with a smaller draft model: - -```yaml -models: - fast-qwen: - provider: dmr - model: ai/qwen3:14B - provider_opts: - speculative_draft_model: ai/qwen3:0.6B-Q4_K_M - speculative_num_tokens: 16 - speculative_acceptance_rate: 0.8 -``` - -The draft model generates token candidates, and the main model validates them. -This can significantly improve throughput for longer responses. - -### Runtime flags - -Pass engine-specific flags to optimize performance: - -```yaml -models: - optimized-qwen: - provider: dmr - model: ai/qwen3 - provider_opts: - runtime_flags: ["--ngl=33", "--threads=8"] -``` - -Common flags: - -- `--ngl` - Number of GPU layers -- `--threads` - CPU thread count -- `--repeat-penalty` - Repetition penalty - -## Using DMR for RAG - -Docker Model Runner supports both embeddings and reranking for RAG workflows. - -### Embedding with DMR - -Use local embeddings for indexing your knowledge base: - -```yaml -rag: - codebase: - docs: [./src] - strategies: - - type: chunked-embeddings - embedding_model: dmr/ai/embeddinggemma - database: ./code.db -``` - -### Reranking with DMR - -DMR provides native reranking for improved RAG results: - -```yaml -models: - reranker: - provider: dmr - model: hf.co/ggml-org/qwen3-reranker-0.6b-q8_0-gguf - -rag: - docs: - docs: [./documentation] - strategies: - - type: chunked-embeddings - embedding_model: dmr/ai/embeddinggemma - limit: 20 - results: - reranking: - model: reranker - threshold: 0.5 - limit: 5 -``` - -Native DMR reranking is the fastest option for reranking RAG results. - -## Troubleshooting - -If Docker Agent can't find Docker Model Runner: - -1. Verify Docker Model Runner status: - - ```console - $ docker model status - ``` - -2. Check available models: - - ```console - $ docker model list - ``` - -3. Check model logs for errors: - - ```console - $ docker model logs - ``` - -4. Ensure Docker Desktop has Model Runner enabled in settings (macOS/Windows) - -## What's next - -- Follow the [tutorial](tutorial.md) to build your first agent with local - models -- Learn about [RAG](rag.md) to give your agents access to codebases and - documentation -- See the [configuration reference](reference/config.md#docker-model-runner-dmr) - for all DMR options diff --git a/content/manuals/ai/docker-agent/model-providers.md b/content/manuals/ai/docker-agent/model-providers.md deleted file mode 100644 index 6ebe19f5ea..0000000000 --- a/content/manuals/ai/docker-agent/model-providers.md +++ /dev/null @@ -1,166 +0,0 @@ ---- -title: Model providers -description: Get API keys and configure cloud model providers for Docker Agent -keywords: [docker agent, model providers, api keys, anthropic, openai, google, gemini] -weight: 10 ---- - -To run Docker Agent, you need a model provider. You can either use a cloud provider -with an API key or run models locally with [Docker Model -Runner](local-models.md). - -This guide covers cloud providers. For the local alternative, see [Local -models with Docker Model Runner](local-models.md). - -## Supported providers - -Docker Agent supports these cloud model providers: - -- Anthropic - Claude models -- OpenAI - GPT models -- Google - Gemini models - -## Anthropic - -Anthropic provides the Claude family of models, including Claude Sonnet and -Claude Opus. - -To get an API key: - -1. Go to [console.anthropic.com](https://console.anthropic.com/). -2. Sign up or sign in to your account. -3. Navigate to the API Keys section. -4. Create a new API key. -5. Copy the key. - -Set your API key as an environment variable: - -```console -$ export ANTHROPIC_API_KEY=your_key_here -``` - -Use Anthropic models in your agent configuration: - -```yaml -agents: - root: - model: anthropic/claude-sonnet-4-5 - instruction: You are a helpful coding assistant -``` - -Available models include: - -- `anthropic/claude-sonnet-4-5` -- `anthropic/claude-opus-4-5` -- `anthropic/claude-haiku-4-5` - -## OpenAI - -OpenAI provides the GPT family of models, including GPT-5 and GPT-5 mini. - -To get an API key: - -1. Go to [platform.openai.com/api-keys](https://platform.openai.com/api-keys). -2. Sign up or sign in to your account. -3. Navigate to the API Keys section. -4. Create a new API key. -5. Copy the key. - -Set your API key as an environment variable: - -```console -$ export OPENAI_API_KEY=your_key_here -``` - -Use OpenAI models in your agent configuration: - -```yaml -agents: - root: - model: openai/gpt-5 - instruction: You are a helpful coding assistant -``` - -Available models include: - -- `openai/gpt-5` -- `openai/gpt-5-mini` - -## Google Gemini - -Google provides the Gemini family of models. - -To get an API key: - -1. Go to [aistudio.google.com/apikey](https://aistudio.google.com/apikey). -2. Sign in with your Google account. -3. Create an API key. -4. Copy the key. - -Set your API key as an environment variable: - -```console -$ export GOOGLE_API_KEY=your_key_here -``` - -Use Gemini models in your agent configuration: - -```yaml -agents: - root: - model: google/gemini-2.5-flash - instruction: You are a helpful coding assistant -``` - -Available models include: - -- `google/gemini-2.5-flash` -- `google/gemini-2.5-pro` - -## OpenAI-compatible providers - -You can use the `openai` provider type to connect to any model or provider that -implements the OpenAI API specification. This includes services like Azure -OpenAI, local inference servers, and other compatible endpoints. - -Define a named model in the `models` section with the `openai` provider and a -`base_url`, then reference it from your agent: - -```yaml -models: - my-model: - provider: openai - model: your-model-name - base_url: https://your-provider.example.com/v1 - -agents: - root: - model: my-model - instruction: You are a helpful coding assistant -``` - -By default, Docker Agent uses the `OPENAI_API_KEY` environment variable for -authentication. If your provider uses a different variable, specify it with -`token_key`: - -```yaml -models: - my-model: - provider: openai - model: your-model-name - base_url: https://your-provider.example.com/v1 - token_key: YOUR_PROVIDER_API_KEY - -agents: - root: - model: my-model - instruction: You are a helpful coding assistant -``` - -## What's next - -- Follow the [tutorial](tutorial.md) to build your first agent -- Learn about [local models with Docker Model Runner](local-models.md) as an - alternative to cloud providers -- Review the [configuration reference](reference/config.md) for advanced model - settings diff --git a/content/manuals/ai/docker-agent/rag.md b/content/manuals/ai/docker-agent/rag.md deleted file mode 100644 index d27b32d286..0000000000 --- a/content/manuals/ai/docker-agent/rag.md +++ /dev/null @@ -1,436 +0,0 @@ ---- -title: RAG -description: How RAG gives your agents access to codebases and documentation -keywords: [docker agent, rag, retrieval, embeddings, semantic search] -weight: 70 ---- - -When you configure a RAG source in Docker Agent, your agent automatically gains a -search tool for that knowledge base. The agent decides when to search, retrieves -only relevant information, and uses it to answer questions or complete tasks - -all without you manually managing what goes in the prompt. - -This guide explains how Docker Agent's RAG system works, when to use it, and how to -configure it effectively for your content. - -> [!NOTE] -> RAG is an advanced feature that requires configuration and tuning. The defaults -> work well for getting started, but tailoring the configuration to your specific -> content and use case significantly improves results. - -## The problem: too much context - -Your agent can work with your entire codebase, but it can't fit everything in -its context window. Even with 200K token limits, medium-sized projects are too -large. Finding relevant code buried in hundreds of files wastes context. - -Filesystem tools help agents read files, but the agent has to guess which files -to read. It can't search by meaning, only by filename. Ask "find the retry -logic" and the agent reads files hoping to stumble on the right code. - -Grep finds exact text matches but misses related concepts. Searching -"authentication" won't find code using "auth" or "login." You either get -hundreds of matches or zero, and grep doesn't understand code structure - it -just matches strings anywhere they appear. - -RAG indexes your content ahead of time and enables semantic search. The agent -searches pre-indexed content by meaning, not exact words. It retrieves only -relevant chunks that respect code structure. No wasted context on exploration. - -## How RAG works in Docker Agent - -Configure a RAG source in your Docker Agent config: - -```yaml -rag: - codebase: - docs: [./src, ./pkg] - strategies: - - type: chunked-embeddings - embedding_model: openai/text-embedding-3-small - vector_dimensions: 1536 - database: ./code.db - -agents: - root: - model: openai/gpt-5 - instruction: You are a coding assistant. Search the codebase when needed. - rag: [codebase] -``` - -When you reference `rag: [codebase]`, Docker Agent: - -1. **At startup** - Indexes your documents (first run only, blocks until complete) -2. **During conversation** - Gives the agent a search tool -3. **When the agent searches** - Retrieves relevant chunks and adds them to context -4. **On file changes** - Automatically re-indexes modified files - -The agent decides when to search based on the conversation. You don't manage -what goes in context - the agent does. - -### The indexing process - -On first run, Docker Agent: - -- Reads files from configured paths -- Respects `.gitignore` patterns (can be disabled) -- Splits documents into chunks -- Creates searchable representations using your chosen strategy -- Stores everything in a local database - -Subsequent runs reuse the index. If files change, Docker Agent detects this and -re-indexes only what changed, keeping your knowledge base up to date without -manual intervention. - -## Retrieval strategies - -Different content requires different retrieval approaches. Docker Agent supports -three strategies, each optimized for different use cases. The defaults work -well, but understanding the trade-offs helps you choose the right approach. - -### Semantic search (chunked-embeddings) - -Converts text to vectors that represent meaning, enabling search by concept -rather than exact words: - -```yaml -strategies: - - type: chunked-embeddings - embedding_model: openai/text-embedding-3-small - vector_dimensions: 1536 - database: ./docs.db - chunking: - size: 1000 - overlap: 100 -``` - -During indexing, documents are split into chunks and each chunk is converted -to a 1536-dimensional vector by the embedding model. These vectors are -essentially coordinates in a high-dimensional space where similar concepts are -positioned close together. - -When you search for "how do I authenticate users?", your query becomes a vector -and the database finds chunks with nearby vectors using cosine similarity -(measuring the angle between vectors). The embedding model learned that -"authentication," "auth," and "login" are related concepts, so searching for -one finds the others. - -Example: The query "how do I authenticate users?" finds both "User -authentication requires a valid API token" and "Token-based auth validates -requests" despite different wording. It won't find "The authentication tests -are failing" because that's a different meaning despite containing the word. - -This works well for documentation where users ask questions using different -terminology than your docs. The downside is it may miss exact technical terms -and sometimes you want literal matches, not semantic ones. Requires embedding -API calls during indexing. - -### Keyword search (BM25) - -Statistical algorithm that matches and ranks by term frequency and rarity: - -```yaml -strategies: - - type: bm25 - database: ./bm25.db - k1: 1.5 - b: 0.75 - chunking: - size: 1000 - overlap: 100 -``` - -During indexing, documents are tokenized and the algorithm calculates how often -each term appears (term frequency) and how rare it is across all documents -(inverse document frequency). The scoring index is stored in a local SQLite -database. - -When you search for "HandleRequest function", the algorithm finds chunks -containing these exact terms and scores them based on term frequency, term -rarity, and document length. Finding "HandleRequest" is scored as more -significant than finding common words like "function". Think of it as grep with -statistical ranking. - -Example: Searching "HandleRequest function" finds `func HandleRequest(w -http.ResponseWriter, r *http.Request)` and "The HandleRequest function -processes incoming requests", but not "process HTTP requests" despite that -being semantically similar. - -The `k1` parameter (default 1.5) controls how much repeated terms matter - -higher values emphasize repetition more. The `b` parameter (default 0.75) -controls length normalization - higher values penalize longer documents more. - -This is fast, local (no API costs), and predictable for finding function names, -class names, API endpoints, and any identifier that appears verbatim. The -trade-off is zero understanding of meaning - "RetryHandler" and "retry logic" -won't match despite being related. Essential complement to semantic search. - -### LLM-enhanced semantic search (semantic-embeddings) - -Generates semantic summaries with an LLM before embedding, enabling search by -what code does rather than what it's called: - -```yaml -strategies: - - type: semantic-embeddings - embedding_model: openai/text-embedding-3-small - chat_model: openai/gpt-5-mini - vector_dimensions: 1536 - database: ./code.db - ast_context: true - chunking: - size: 1000 - code_aware: true -``` - -During indexing, code is split using AST structure (functions stay intact), -then the `chat_model` generates a semantic summary of each chunk. The summary -gets embedded, not the raw code. When you search, your query matches against -these summaries, but the original code is returned. - -This solves a problem with regular embeddings: raw code embeddings are -dominated by variable names and implementation details. A function called -`processData` that implements retry logic won't semantically match "retry". But -when the LLM summarizes it first, the summary explicitly mentions "retry -logic," making it findable. - -Example: Consider this code: - -```go -func (c *Client) Do(req *Request) (*Response, error) { - for i := 0; i < 3; i++ { - resp, err := c.attempt(req) - if err == nil { return resp, nil } - time.Sleep(time.Duration(1< [!NOTE] -> Currently only Go is supported; support for additional languages is planned. - -For short, focused content like API references: - -```yaml -chunking: - size: 500 - overlap: 50 -``` - -Brief sections need less overlap since they're naturally self-contained. - -Experiment with these values. If retrieval misses context, increase chunk size -or overlap. If results are too broad, decrease chunk size. - -## Making decisions about RAG - -### When to use RAG - -Use RAG when: - -- Your content is too large for the context window -- You want targeted retrieval, not everything at once -- Content changes and needs to stay current -- Agent needs to search across many files - -Don't use RAG when: - -- Content is small enough to include in agent instructions -- Information rarely changes (consider prompt engineering instead) -- You need real-time data (RAG uses pre-indexed snapshots) -- Content is already in a searchable format the agent can query directly - -### Choosing retrieval strategies - -Use semantic search (chunked-embeddings) for user-facing documentation, content -with varied terminology, and conceptual searches where users phrase questions -differently than your docs. - -Use keyword search (BM25) for code identifiers, function names, API endpoints, -error messages, and any content where exact term matching matters. Essential -for technical jargon and proper nouns. - -Use LLM-enhanced semantic (semantic-embeddings) for code search by -functionality, finding implementations by behavior rather than name, or complex -technical content requiring deep understanding. Choose this when accuracy -matters more than indexing speed. - -Use hybrid (multiple strategies) for general-purpose search across mixed -content, when you're unsure which approach works best, or for production -systems where quality matters most. Maximum coverage at the cost of complexity. - -### Tuning for your project - -Start with defaults, then adjust based on results. - -If retrieval misses relevant content: - -- Increase `limit` in strategies to retrieve more candidates -- Adjust `threshold` to be less strict -- Increase chunk `size` to capture more context -- Add more retrieval strategies - -If retrieval returns irrelevant content: - -- Decrease `limit` to fewer candidates -- Increase `threshold` to be more strict -- Add reranking with specific criteria -- Decrease chunk `size` for more focused results - -If indexing is too slow: - -- Increase `batch_size` for fewer API calls -- Increase `max_embedding_concurrency` for parallelism -- Consider BM25 instead of embeddings (local, no API) -- Use smaller embedding models - -If results lack context: - -- Increase chunk `overlap` -- Increase chunk `size` -- Use `return_full_content: true` to return entire documents -- Add neighboring chunks to results - -## Further reading - -- [Configuration reference](reference/config.md#rag) - Complete RAG options and - parameters -- [RAG examples](https://github.com/docker/docker-agent/tree/main/examples/rag) - - Working configurations for different scenarios -- [Tools reference](reference/toolsets.md) - How RAG search tools work in agent workflows diff --git a/content/manuals/ai/docker-agent/reference/_index.md b/content/manuals/ai/docker-agent/reference/_index.md deleted file mode 100644 index 8403097afc..0000000000 --- a/content/manuals/ai/docker-agent/reference/_index.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -build: - render: never -title: Reference -weight: 60 ---- diff --git a/content/manuals/ai/docker-agent/reference/cli.md b/content/manuals/ai/docker-agent/reference/cli.md deleted file mode 100644 index e1817e9d41..0000000000 --- a/content/manuals/ai/docker-agent/reference/cli.md +++ /dev/null @@ -1,482 +0,0 @@ ---- -title: CLI reference -linkTitle: CLI -description: Complete reference for Docker Agent command-line interface -keywords: [ai, agent, docker agent, cli, command line] -weight: 30 ---- - -Command-line interface for running, managing, and deploying AI agents. - -For agent configuration file syntax, see the [Configuration file -reference](./config.md). For toolset capabilities, see the [Toolsets -reference](./toolsets.md). - -## Synopsis - -```console -$ docker agent [command] [flags] -``` - -## Global flags - -Work with all commands: - -| Flag | Type | Default | Description | -| --------------- | ------- | ------- | -------------------- | -| `-d`, `--debug` | boolean | false | Enable debug logging | -| `-o`, `--otel` | boolean | false | Enable OpenTelemetry | -| `--log-file` | string | - | Debug log file path | - -Debug logs write to `~/.cagent/cagent.debug.log` by default. Override with -`--log-file`. - -## Runtime flags - -Work with most commands. Supported commands link to this section. - -| Flag | Type | Default | Description | -| ------------------- | ------- | ------- | ------------------------------------ | -| `--models-gateway` | string | - | Models gateway address | -| `--env-from-file` | array | - | Load environment variables from file | -| `--code-mode-tools` | boolean | false | Enable JavaScript tool orchestration | -| `--working-dir` | string | - | Working directory for the session | - -Set `--models-gateway` via `CAGENT_MODELS_GATEWAY` environment variable. - -## Commands - -### a2a - -Expose agent via the Agent2Agent (A2A) protocol. Allows other A2A-compatible -systems to discover and interact with your agent. Auto-selects an available -port if not specified. - -```console -$ docker agent serve a2a agent-file|registry-ref -``` - -> [!NOTE] -> A2A support is experimental. Tool calls are -> handled internally and not exposed as separate ADK events. Some ADK features -> are not integrated. - -Arguments: - -- `agent-file|registry-ref` - Path to YAML or OCI registry reference (required) - -Flags: - -| Flag | Type | Default | Description | -| --------------- | ------- | ------- | ----------------- | -| `-a`, `--agent` | string | root | Agent name | -| `--port` | integer | 0 | Port (0 = random) | - -Supports [runtime flags](#runtime-flags). - -Examples: - -```console -$ docker agent serve a2a ./agent.yaml --port 8080 -$ docker agent serve a2a agentcatalog/pirate --port 9000 -``` - -### acp - -Start agent as ACP (Agent Client Protocol) server on stdio for editor integration. -See [ACP integration](../integrations/acp.md) for setup guides. - -```console -$ docker agent serve acp agent-file|registry-ref -``` - -Arguments: - -- `agent-file|registry-ref` - Path to YAML or OCI registry reference (required) - -Supports [runtime flags](#runtime-flags). - -### alias add - -Create alias for agent. - -```console -$ docker agent alias add name target -``` - -Arguments: - -- `name` - Alias name (required) -- `target` - Path to YAML or registry reference (required) - -Examples: - -```console -$ docker agent alias add dev ./dev-agent.yaml -$ docker agent alias add prod docker.io/user/prod-agent:latest -$ docker agent alias add default ./agent.yaml -``` - -Setting alias name to "default" lets you run `docker agent run` without arguments. - -### alias list - -List all aliases. - -```console -$ docker agent alias list -$ docker agent alias ls -``` - -### alias remove - -Remove alias. - -```console -$ docker agent alias remove name -$ docker agent alias rm name -``` - -Arguments: - -- `name` - Alias name (required) - -### api - -HTTP API server. - -```console -$ docker agent serve api agent-file|agents-dir -``` - -Arguments: - -- `agent-file|agents-dir` - Path to YAML or directory with agents (required) - -Flags: - -| Flag | Type | Default | Description | -| -------------------- | ------- | ---------- | --------------------------------- | -| `-l`, `--listen` | string | :8080 | Listen address | -| `-s`, `--session-db` | string | session.db | Session database path | -| `--pull-interval` | integer | 0 | Auto-pull OCI ref every N minutes | - -Supports [runtime flags](#runtime-flags). - -Examples: - -```console -$ docker agent serve api ./agent.yaml -$ docker agent serve api ./agents/ --listen :9000 -$ docker agent serve api docker.io/user/agent --pull-interval 10 -``` - -The `--pull-interval` flag works only with OCI references. Automatically pulls and reloads at the specified interval. - -### build - -Build Docker image for agent. - -```console -$ docker agent build agent-file|registry-ref [image-name] -``` - -Arguments: - -- `agent-file|registry-ref` - Path to YAML or OCI registry reference (required) -- `image-name` - Docker image name (optional) - -Flags: - -| Flag | Type | Default | Description | -| ------------ | ------- | ------- | -------------------------- | -| `--dry-run` | boolean | false | Print Dockerfile only | -| `--push` | boolean | false | Push image after build | -| `--no-cache` | boolean | false | Build without cache | -| `--pull` | boolean | false | Pull all referenced images | - -Example: - -```console -$ docker agent build ./agent.yaml myagent:latest -$ docker agent build ./agent.yaml --dry-run -``` - -### catalog list - -List catalog agents. - -```console -$ docker agent catalog list [org] -``` - -Arguments: - -- `org` - Organization name (optional, default: `agentcatalog`) - -Queries Docker Hub for agent repositories. - -### debug config - -Show resolved agent configuration. - -```console -$ docker agent debug config agent-file|registry-ref -``` - -Arguments: - -- `agent-file|registry-ref` - Path to YAML or OCI registry reference (required) - -Supports [runtime flags](#runtime-flags). - -Shows canonical configuration in YAML after all processing and defaults. - -### debug toolsets - -List agent tools. - -```console -$ docker agent debug toolsets agent-file|registry-ref -``` - -Arguments: - -- `agent-file|registry-ref` - Path to YAML or OCI registry reference (required) - -Supports [runtime flags](#runtime-flags). - -Lists all tools for each agent in the configuration. - -### eval - -Run evaluation tests. - -```console -$ docker agent eval agent-file|registry-ref [eval-dir] -``` - -Arguments: - -- `agent-file|registry-ref` - Path to YAML or OCI registry reference (required) -- `eval-dir` - Evaluation files directory (optional, default: `./evals`) - -Supports [runtime flags](#runtime-flags). - -### exec - -Single message execution without TUI. - -```console -$ docker agent exec agent-file|registry-ref [message|-] -``` - -Arguments: - -- `agent-file|registry-ref` - Path to YAML or OCI registry reference (required) -- `message` - Prompt, or `-` for stdin (optional) - -Same flags as [run](#run). - -Supports [runtime flags](#runtime-flags). - -Examples: - -```console -$ docker agent exec ./agent.yaml -$ docker agent exec ./agent.yaml "Check for security issues" -$ echo "Instructions" | docker agent exec ./agent.yaml - -``` - -### feedback - -Submit feedback. - -```console -$ docker agent feedback -``` - -Shows link to submit feedback. - -### mcp - -MCP (Model Context Protocol) server on stdio. Exposes agents as tools to MCP -clients. See [MCP integration](../integrations/mcp.md) for setup guides. - -```console -$ docker agent serve mcp agent-file|registry-ref -``` - -Arguments: - -- `agent-file|registry-ref` - Path to YAML or OCI registry reference (required) - -Supports [runtime flags](#runtime-flags). - -Examples: - -```console -$ docker agent serve mcp ./agent.yaml -$ docker agent serve mcp docker.io/user/agent:latest -``` - -### new - -Create agent configuration interactively. - -```console -$ docker agent new [message...] -``` - -Flags: - -| Flag | Type | Default | Description | -| ------------------ | ------- | ------- | ------------------------------- | -| `--model` | string | - | Model as `provider/model` | -| `--max-iterations` | integer | 0 | Maximum agentic loop iterations | - -Supports [runtime flags](#runtime-flags). - -Opens interactive TUI to configure and generate agent YAML. - -### pull - -Pull agent from OCI registry. - -```console -$ docker agent share pull registry-ref -``` - -Arguments: - -- `registry-ref` - OCI registry reference (required) - -Flags: - -| Flag | Type | Default | Description | -| --------- | ------- | ------- | --------------------------- | -| `--force` | boolean | false | Pull even if already exists | - -Example: - -```console -$ docker agent share pull docker.io/user/agent:latest -``` - -Saves to local YAML file. - -### push - -Push agent to OCI registry. - -```console -$ docker agent share push agent-file registry-ref -``` - -Arguments: - -- `agent-file` - Path to local YAML (required) -- `registry-ref` - OCI reference like `docker.io/user/agent:latest` (required) - -Example: - -```console -$ docker agent share push ./agent.yaml docker.io/myuser/myagent:latest -``` - -### run - -Interactive terminal UI for agent sessions. - -```console -$ docker agent run [agent-file|registry-ref] [message|-] -``` - -Arguments: - -- `agent-file|registry-ref` - Path to YAML or OCI registry reference (optional) -- `message` - Initial prompt, or `-` for stdin (optional) - -Flags: - -| Flag | Type | Default | Description | -| --------------- | ------- | ------- | ---------------------------- | -| `-a`, `--agent` | string | root | Agent name | -| `--yolo` | boolean | false | Auto-approve all tool calls | -| `--attach` | string | - | Attach image file | -| `--model` | array | - | Override model (repeatable) | -| `--dry-run` | boolean | false | Initialize without executing | -| `--remote` | string | - | Remote runtime address | - -Supports [runtime flags](#runtime-flags). - -Examples: - -```console -$ docker agent run ./agent.yaml -$ docker agent run ./agent.yaml "Analyze this codebase" -$ docker agent run ./agent.yaml --agent researcher -$ echo "Instructions" | docker agent run ./agent.yaml - -$ docker agent run -``` - -Running without arguments uses the default agent or a "default" alias if configured. - -Shows interactive TUI in a terminal. Falls back to exec mode otherwise. - -#### Interactive commands - -TUI slash commands: - -| Command | Description | -| ---------- | -------------------------------- | -| `/exit` | Exit | -| `/reset` | Clear history | -| `/eval` | Save conversation for evaluation | -| `/compact` | Compact conversation | -| `/yolo` | Toggle auto-approval | - -### version - -Print version information. - -```console -$ docker agent version -``` - -Shows Docker Agent version and commit hash. - -## Environment variables - -| Variable | Description | -| ------------------------------ | ------------------------------- | -| `CAGENT_MODELS_GATEWAY` | Models gateway address | -| `TELEMETRY_ENABLED` | Telemetry control (set `false`) | -| `CAGENT_HIDE_TELEMETRY_BANNER` | Hide telemetry banner (set `1`) | -| `OTEL_EXPORTER_OTLP_ENDPOINT` | OpenTelemetry endpoint | - -## Model overrides - -Override models specified in your configuration file using the `--model` flag. - -Format: `[agent=]provider/model` - -Without an agent name, the model applies to all agents. With an agent name, it applies only to that specific agent. - -Apply to all agents: - -```console -$ docker agent run ./agent.yaml --model gpt-5 -$ docker agent run ./agent.yaml --model anthropic/claude-sonnet-4-5 -``` - -Apply to specific agents only: - -```console -$ docker agent run ./agent.yaml --model researcher=gpt-5 -$ docker agent run ./agent.yaml --model "agent1=gpt-5,agent2=claude-sonnet-4-5" -``` - -Providers: `openai`, `anthropic`, `google`, `dmr` - -Omit provider for automatic selection based on model name. diff --git a/content/manuals/ai/docker-agent/reference/config.md b/content/manuals/ai/docker-agent/reference/config.md deleted file mode 100644 index a5447b86e5..0000000000 --- a/content/manuals/ai/docker-agent/reference/config.md +++ /dev/null @@ -1,621 +0,0 @@ ---- -title: Configuration file reference -linkTitle: Configuration file -description: Complete reference for the Docker Agent YAML configuration file format -keywords: [ai, agent, cagent, configuration, yaml] -weight: 10 ---- - -This reference documents the YAML configuration file format for agents using Docker Agent. -It covers file structure, agent parameters, model configuration, toolset setup, -and RAG sources. - -For detailed documentation of each toolset's capabilities and specific options, -see the [Toolsets reference](./toolsets.md). - -## File structure - -A configuration file has four top-level sections: - -```yaml -agents: # Required - agent definitions - root: - model: anthropic/claude-sonnet-4-5 - description: What this agent does - instruction: How it should behave - -models: # Optional - model configurations - custom_model: - provider: openai - model: gpt-5 - -rag: # Optional - RAG sources - docs: - docs: [./documents] - strategies: [...] - -metadata: # Optional - author, license, readme - author: Your Name -``` - -## Agents - -| Property | Type | Description | Required | -| ---------------------- | ------- | ---------------------------------------------- | -------- | -| `model` | string | Model reference or name | Yes | -| `description` | string | Brief description of agent's purpose | No | -| `instruction` | string | Detailed behavior instructions | Yes | -| `sub_agents` | array | Agent names for task delegation | No | -| `handoffs` | array | Agent names for conversation handoff | No | -| `toolsets` | array | Available tools | No | -| `welcome_message` | string | Message displayed on start | No | -| `add_date` | boolean | Include current date in context | No | -| `add_environment_info` | boolean | Include working directory, OS, Git info | No | -| `add_prompt_files` | array | Prompt file paths to include | No | -| `max_iterations` | integer | Maximum tool call loops (unlimited if not set) | No | -| `num_history_items` | integer | Conversation history limit | No | -| `code_mode_tools` | boolean | Enable Code Mode for tools | No | -| `commands` | object | Named prompts accessible via `/command_name` | No | -| `structured_output` | object | JSON schema for structured responses | No | -| `rag` | array | RAG source names | No | - -### Task delegation versus conversation handoff - -Agents support two different delegation mechanisms. Choose based on whether you -need task results or conversation control. - -#### Sub_agents: Hierarchical task delegation - -Use `sub_agents` for hierarchical task delegation. The parent agent assigns a -specific task to a child agent using the `transfer_task` tool. The child -executes in its own context and returns results. The parent maintains control -and can delegate to multiple agents in sequence. - -This works well for structured workflows where you need to combine results from -specialists, or when tasks have clear boundaries. Each delegated task runs -independently and reports back to the parent. - -**Example:** - -```yaml -agents: - root: - sub_agents: [researcher, analyst] - instruction: | - Delegate research to researcher. - Delegate analysis to analyst. - Combine results and present findings. -``` - -Root calls: `transfer_task(agent="researcher", task="Find pricing data")`. The -researcher completes the task and returns results to root. - -#### Handoffs: Conversation transfer - -Use `handoffs` to transfer conversation control to a different agent. When an -agent uses the `handoff` tool, the new agent takes over completely. The -original agent steps back until someone hands back to it. - -This works well when different agents should own different parts of an ongoing -conversation, or when specialists need to collaborate as peers without a -coordinator managing every step. - -**Example:** - -```yaml -agents: - generalist: - handoffs: [database_expert, security_expert] - instruction: | - Help with general development questions. - If the conversation moves to database optimization, - hand off to database_expert. - If security concerns arise, hand off to security_expert. - - database_expert: - handoffs: [generalist, security_expert] - instruction: Handle database design and optimization. - - security_expert: - handoffs: [generalist, database_expert] - instruction: Review code for security vulnerabilities. -``` - -When the user asks about query performance, generalist executes: -`handoff(agent="database_expert")`. The database expert now owns the -conversation and can continue working with the user directly, or hand off to -security_expert if the discussion shifts to SQL injection concerns. - -### Commands - -Named prompts users invoke with `/command_name`. Supports JavaScript template -literals with `${env.VARIABLE}` for environment variables: - -```yaml -commands: - greet: "Say hello to ${env.USER}" - analyze: "Analyze ${env.PROJECT_NAME || 'demo'}" -``` - -Run with: `docker agent run config.yaml /greet` - -### Structured output - -Constrain responses to a JSON schema (OpenAI and Gemini only): - -```yaml -structured_output: - name: code_analysis - strict: true - schema: - type: object - properties: - issues: - type: array - items: { ... } - required: [issues] -``` - -## Models - -| Property | Type | Description | Required | -| --------------------- | ------- | ---------------------------------------------- | -------- | -| `provider` | string | `openai`, `anthropic`, `google`, `dmr` | Yes | -| `model` | string | Model name | Yes | -| `temperature` | float | Randomness (0.0-2.0) | No | -| `max_tokens` | integer | Maximum response length | No | -| `top_p` | float | Nucleus sampling (0.0-1.0) | No | -| `frequency_penalty` | float | Repetition penalty (-2.0 to 2.0, OpenAI only) | No | -| `presence_penalty` | float | Topic penalty (-2.0 to 2.0, OpenAI only) | No | -| `base_url` | string | Custom API endpoint | No | -| `parallel_tool_calls` | boolean | Enable parallel tool execution (default: true) | No | -| `token_key` | string | Authentication token key | No | -| `track_usage` | boolean | Track token usage | No | -| `thinking_budget` | mixed | Reasoning effort (provider-specific) | No | -| `provider_opts` | object | Provider-specific options | No | - -### Alloy models - -Use multiple models in rotation by separating names with commas: - -```yaml -model: anthropic/claude-sonnet-4-5,openai/gpt-5 -``` - -### Thinking budget - -Controls reasoning depth. Configuration varies by provider: - -- **OpenAI**: String values - `minimal`, `low`, `medium`, `high` -- **Anthropic**: Integer token budget (1024-32768, must be less than - `max_tokens`) - - Set `provider_opts.interleaved_thinking: true` for tool use during reasoning -- **Gemini**: Integer token budget (0 to disable, -1 for dynamic, max 24576) - - Gemini 2.5 Pro: 128-32768, cannot disable (minimum 128) - -```yaml -# OpenAI -thinking_budget: low - -# Anthropic -thinking_budget: 8192 -provider_opts: - interleaved_thinking: true - -# Gemini -thinking_budget: 8192 # Fixed -thinking_budget: -1 # Dynamic -thinking_budget: 0 # Disabled -``` - -### Docker Model Runner (DMR) - -Run local models. If `base_url` is omitted, Docker Agent auto-discovers via Docker -Model plugin. - -```yaml -provider: dmr -model: ai/qwen3 -max_tokens: 8192 -base_url: http://localhost:12434/engines/llama.cpp/v1 # Optional -``` - -Pass llama.cpp options via `provider_opts.runtime_flags` (array, string, or -multiline): - -```yaml -provider_opts: - runtime_flags: ["--ngl=33", "--threads=8"] - # or: runtime_flags: "--ngl=33 --threads=8" -``` - -Model config fields auto-map to runtime flags: - -- `temperature` → `--temp` -- `top_p` → `--top-p` -- `max_tokens` → `--context-size` - -Explicit `runtime_flags` override auto-mapped flags. - -Speculative decoding for faster inference: - -```yaml -provider_opts: - speculative_draft_model: ai/qwen3:0.6B-F16 - speculative_num_tokens: 16 - speculative_acceptance_rate: 0.8 -``` - -## Tools - -Configure tools in the `toolsets` array. Three types: built-in, MCP -(local/remote), and Docker Gateway. - -> [!NOTE] This section covers toolset configuration syntax. For detailed -> documentation of each toolset's capabilities, available tools, and specific -> configuration options, see the [Toolsets reference](./toolsets.md). - -All toolsets support common properties like `tools` (whitelist), `defer` -(deferred loading), `toon` (output compression), `env` (environment variables), -and `instruction` (usage guidance). See the [Toolsets reference](./toolsets.md) -for details on these properties and what each toolset does. - -### Built-in tools - -```yaml -toolsets: - - type: filesystem - - type: shell - - type: think - - type: todo - shared: true - - type: memory - path: ./memory.db -``` - -### MCP tools - -Local process: - -```yaml -- type: mcp - command: npx - args: - ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/allowed/files"] - tools: ["read_file", "write_file"] # Optional: limit to specific tools - env: - NODE_OPTIONS: "--max-old-space-size=8192" -``` - -Remote server: - -```yaml -- type: mcp - remote: - url: https://mcp-server.example.com - transport_type: sse - headers: - Authorization: Bearer token -``` - -### Docker MCP Gateway - -Containerized tools from [Docker MCP -Catalog](/manuals/ai/mcp-catalog-and-toolkit/mcp-gateway.md): - -```yaml -- type: mcp - ref: docker:duckduckgo -``` - -## RAG - -Retrieval-augmented generation for document knowledge bases. Define sources at -the top level, reference in agents. - -```yaml -rag: - docs: - docs: [./documents, ./README.md] - strategies: - - type: chunked-embeddings - embedding_model: openai/text-embedding-3-small - vector_dimensions: 1536 - database: ./embeddings.db - -agents: - root: - rag: [docs] -``` - -### Retrieval strategies - -All strategies support chunking configuration. Chunk size and overlap are -measured in characters (Unicode code points), not tokens. - -#### Chunked-embeddings - -Direct semantic search using vector embeddings. Best for understanding intent, -synonyms, and paraphrasing. - -| Field | Type | Default | -| ---------------------------------- | ------- | ------- | -| `embedding_model` | string | - | -| `database` | string | - | -| `vector_dimensions` | integer | - | -| `similarity_metric` | string | cosine | -| `threshold` | float | 0.5 | -| `limit` | integer | 5 | -| `chunking.size` | integer | 1000 | -| `chunking.overlap` | integer | 75 | -| `chunking.respect_word_boundaries` | boolean | true | -| `chunking.code_aware` | boolean | false | - -```yaml -- type: chunked-embeddings - embedding_model: openai/text-embedding-3-small - vector_dimensions: 1536 - database: ./vector.db - similarity_metric: cosine_similarity - threshold: 0.5 - limit: 10 - chunking: - size: 1000 - overlap: 100 -``` - -#### Semantic-embeddings - -LLM-enhanced semantic search. Uses a language model to generate rich semantic -summaries of each chunk before embedding, capturing deeper meaning. Best for complex documents where context and relationships between concepts matter. - -| Field | Type | Default | -| ---------------------------------- | ------- | ------- | -| `embedding_model` | string | - | -| `chat_model` | string | - | -| `database` | string | - | -| `vector_dimensions` | integer | - | -| `similarity_metric` | string | cosine | -| `threshold` | float | 0.5 | -| `limit` | integer | 5 | -| `ast_context` | boolean | false | -| `semantic_prompt` | string | - | -| `chunking.size` | integer | 1000 | -| `chunking.overlap` | integer | 75 | -| `chunking.respect_word_boundaries` | boolean | true | -| `chunking.code_aware` | boolean | false | - -```yaml -- type: semantic-embeddings - embedding_model: openai/text-embedding-3-small - vector_dimensions: 1536 - chat_model: openai/gpt-5-mini - database: ./semantic.db - threshold: 0.3 - limit: 10 - chunking: - size: 1000 - overlap: 100 -``` - -#### BM25 - -Keyword-based search using BM25 algorithm. Best for exact terms, technical -jargon, and code identifiers. - -| Field | Type | Default | -| ---------------------------------- | ------- | ------- | -| `database` | string | - | -| `k1` | float | 1.5 | -| `b` | float | 0.75 | -| `threshold` | float | 0.0 | -| `limit` | integer | 5 | -| `chunking.size` | integer | 1000 | -| `chunking.overlap` | integer | 75 | -| `chunking.respect_word_boundaries` | boolean | true | -| `chunking.code_aware` | boolean | false | - -```yaml -- type: bm25 - database: ./bm25.db - k1: 1.5 - b: 0.75 - threshold: 0.3 - limit: 10 - chunking: - size: 1000 - overlap: 100 -``` - -### Hybrid retrieval - -Combine multiple strategies with fusion: - -```yaml -strategies: - - type: chunked-embeddings - embedding_model: openai/text-embedding-3-small - vector_dimensions: 1536 - database: ./vector.db - limit: 20 - - type: bm25 - database: ./bm25.db - limit: 15 - -results: - fusion: - strategy: rrf # Options: rrf, weighted, max - k: 60 # RRF smoothing parameter - deduplicate: true - limit: 5 -``` - -Fusion strategies: - -- `rrf`: Reciprocal Rank Fusion (recommended, rank-based, no normalization - needed) -- `weighted`: Weighted combination (`fusion.weights: {chunked-embeddings: 0.7, -bm25: 0.3}`) -- `max`: Maximum score across strategies - -### Reranking - -Re-score results with a specialized model for improved relevance: - -```yaml -results: - reranking: - model: openai/gpt-5-mini - top_k: 10 # Only rerank top K (0 = all) - threshold: 0.3 # Minimum score after reranking - criteria: | # Optional domain-specific guidance - Prioritize official docs over blog posts - limit: 5 -``` - -DMR native reranking: - -```yaml -models: - reranker: - provider: dmr - model: hf.co/ggml-org/qwen3-reranker-0.6b-q8_0-gguf - -results: - reranking: - model: reranker -``` - -### Code-aware chunking - -For source code, use AST-based chunking. With semantic-embeddings, you can -include AST metadata in the LLM prompts: - -```yaml -- type: semantic-embeddings - embedding_model: openai/text-embedding-3-small - vector_dimensions: 1536 - chat_model: openai/gpt-5-mini - database: ./code.db - ast_context: true # Include AST metadata in semantic prompts - chunking: - size: 2000 - code_aware: true # Enable AST-based chunking -``` - -### RAG properties - -Top-level RAG source: - -| Field | Type | Description | -| ------------ | -------- | --------------------------------------------------------------- | -| `docs` | []string | Document paths (supports glob patterns, respects `.gitignore`) | -| `tool` | object | Customize RAG tool name/description/instruction | -| `strategies` | []object | Retrieval strategies (see above for strategy-specific fields) | -| `results` | object | Post-processing (fusion, reranking, limits) | - -Results: - -| Field | Type | Default | -| --------------------- | ------- | ------- | -| `limit` | integer | 15 | -| `deduplicate` | boolean | true | -| `include_score` | boolean | false | -| `fusion.strategy` | string | - | -| `fusion.k` | integer | 60 | -| `fusion.weights` | object | - | -| `reranking.model` | string | - | -| `reranking.top_k` | integer | 0 | -| `reranking.threshold` | float | 0.5 | -| `reranking.criteria` | string | "" | -| `return_full_content` | boolean | false | - -## Metadata - -Documentation and sharing information: - -| Property | Type | Description | -| --------- | ------ | ------------------------------- | -| `author` | string | Author name | -| `license` | string | License (e.g., MIT, Apache-2.0) | -| `readme` | string | Usage documentation | - -```yaml -metadata: - author: Your Name - license: MIT - readme: | - Description and usage instructions -``` - -## Example configuration - -Complete configuration demonstrating key features: - -```yaml -agents: - root: - model: claude - description: Technical lead - instruction: Coordinate development tasks and delegate to specialists - sub_agents: [developer, reviewer] - toolsets: - - type: filesystem - - type: mcp - ref: docker:duckduckgo - rag: [readmes] - commands: - status: "Check project status" - - developer: - model: gpt - description: Software developer - instruction: Write clean, maintainable code - toolsets: - - type: filesystem - - type: shell - - reviewer: - model: claude - description: Code reviewer - instruction: Review for quality and security - toolsets: - - type: filesystem - -models: - gpt: - provider: openai - model: gpt-5 - - claude: - provider: anthropic - model: claude-sonnet-4-5 - max_tokens: 64000 - -rag: - readmes: - docs: ["**/README.md"] - strategies: - - type: chunked-embeddings - embedding_model: openai/text-embedding-3-small - vector_dimensions: 1536 - database: ./embeddings.db - limit: 10 - - type: bm25 - database: ./bm25.db - limit: 10 - results: - fusion: - strategy: rrf - k: 60 - limit: 5 -``` - -## What's next - -- Read the [Toolsets reference](./toolsets.md) for detailed toolset - documentation -- Review the [CLI reference](./cli.md) for command-line options -- Browse [example - configurations](https://github.com/docker/docker-agent/tree/main/examples) -- Learn about [sharing agents](../sharing-agents.md) diff --git a/content/manuals/ai/docker-agent/reference/examples.md b/content/manuals/ai/docker-agent/reference/examples.md deleted file mode 100644 index b626ab9d5f..0000000000 --- a/content/manuals/ai/docker-agent/reference/examples.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Examples -description: Get inspiration from agent examples -keywords: [ai, agent, cagent] -weight: 40 ---- - -Get inspiration from the following agent examples. -See more examples in the [Docker Agent GitHub repository](https://github.com/docker/docker-agent/tree/main/examples). - -## Development team - -{{% cagent-example.inline "dev-team.yaml" %}} -{{- $example := .Get 0 }} -{{- $baseUrl := "https://raw.githubusercontent.com/docker/docker-agent/refs/heads/main/examples" }} -{{- $url := fmt.Printf "%s/%s" $baseUrl $example }} -{{- with resources.GetRemote $url }} -{{ $data := .Content | transform.Unmarshal }} - -```yaml {collapse=true} -{{ .Content }} -``` - -{{ end }} -{{% /cagent-example.inline %}} - -## Go developer - -{{% cagent-example.inline "gopher.yaml" /%}} - -## Technical blog writer - -{{% cagent-example.inline "blog.yaml" /%}} diff --git a/content/manuals/ai/docker-agent/reference/toolsets.md b/content/manuals/ai/docker-agent/reference/toolsets.md deleted file mode 100644 index decc31fea6..0000000000 --- a/content/manuals/ai/docker-agent/reference/toolsets.md +++ /dev/null @@ -1,639 +0,0 @@ ---- -title: Toolsets reference -linkTitle: Toolsets -description: Complete reference for Docker Agent toolsets and their capabilities -keywords: [ai, agent, cagent, tools, toolsets] -weight: 20 ---- - -This reference documents the toolsets available in Docker Agent and what each one -does. Tools give agents the ability to take action—interacting with files, -executing commands, accessing external resources, and managing state. - -For configuration file syntax and how to set up toolsets in your agent YAML, -see the [Configuration file reference](./config.md). - -## How agents use tools - -When you configure toolsets for an agent, those tools become available in the -agent's context. The agent can invoke tools by name with appropriate parameters -based on the task at hand. - -Tool invocation flow: - -1. Agent analyzes the task and determines which tool to use -2. Agent constructs tool parameters based on requirements -3. Docker Agent executes the tool and returns results -4. Agent processes results and decides next steps - -Agents can call multiple tools in sequence or make decisions based on tool -results. Tool selection is automatic based on the agent's understanding of the -task and available capabilities. - -## Tool types - -Docker Agent supports three types of toolsets: - -Built-in toolsets -: Core functionality built directly into Docker Agent (`filesystem`, `shell`, -`memory`, etc.). These provide essential capabilities for file operations, -command execution, and state management. -MCP toolsets -: Tools provided by Model Context Protocol servers, either local processes -(stdio) or remote servers (HTTP/SSE). MCP enables access to a wide ecosystem -of standardized tools. -Custom toolsets -: Shell scripts wrapped as tools with typed parameters (`script`). This -lets you define domain-specific tools for your use case. - -## Configuration - -Toolsets are configured in your agent's YAML file under the `toolsets` array: - -```yaml -agents: - my_agent: - model: anthropic/claude-sonnet-4-5 - description: A helpful coding assistant - toolsets: - # Built-in toolset - - type: filesystem - - # Built-in toolset with configuration - - type: memory - path: ./memories.db - - # Local MCP server (stdio) - - type: mcp - command: npx - args: ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/dir"] - - # Remote MCP server (SSE) - - type: mcp - remote: - url: https://mcp.example.com/sse - transport_type: sse - headers: - Authorization: Bearer ${API_TOKEN} - - # Custom shell tools - - type: script - tools: - build: - cmd: npm run build - description: Build the project -``` - -### Common configuration options - -All toolset types support these optional properties: - -| Property | Type | Description | -| ------------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `instruction` | string | Additional instructions for using the toolset | -| `tools` | array | Specific tool names to enable (defaults to all) | -| `env` | object | Environment variables for the toolset | -| `toon` | string | Comma-delimited regex patterns matching tool names whose JSON outputs should be compressed. Reduces token usage by simplifying/compressing JSON responses from matched tools using automatic encoding. Example: `"search.*,list.*"` | -| `defer` | boolean or array | Control which tools load into initial context. Set to `true` to defer all tools, or array of tool names to defer specific tools. Deferred tools don't consume context until explicitly loaded via `search_tool`/`add_tool`. | - -### Tool selection - -By default, agents have access to all tools from their configured toolsets. You -can restrict this using the `tools` option: - -```yaml -toolsets: - - type: filesystem - tools: [read_file, write_file, list_directory] -``` - -This is useful for: - -- Limiting agent capabilities for security -- Reducing context size for smaller models -- Creating specialized agents with focused tool access - -### Deferred loading - -Deferred loading keeps tools out of the initial context window, loading them -only when explicitly requested. This is useful for large toolsets where most -tools won't be used, significantly reducing context consumption. - -Defer all tools in a toolset: - -```yaml -toolsets: - - type: mcp - command: npx - args: ["-y", "@modelcontextprotocol/server-filesystem", "/path"] - defer: true # All tools load on-demand -``` - -Or defer specific tools while loading others immediately: - -```yaml -toolsets: - - type: mcp - command: npx - args: ["-y", "@modelcontextprotocol/server-filesystem", "/path"] - defer: [search_files, list_directory] # Only these are deferred -``` - -Agents can discover deferred tools via `search_tool` and load them into context -via `add_tool` when needed. Best for toolsets with dozens of tools where only a -few are typically used. - -### Output compression - -The `toon` property compresses JSON outputs from matched tools to reduce token -usage. When a tool's output is JSON, it's automatically compressed using -efficient encoding before being returned to the agent: - -```yaml -toolsets: - - type: mcp - command: npx - args: ["-y", "@modelcontextprotocol/server-github"] - toon: "search.*,list.*" # Compress outputs from search/list tools -``` - -Useful for tools that return large JSON responses (API results, file listings, -search results). The compression is transparent to the agent but can -significantly reduce context consumption for verbose tool outputs. - -### Auto-installation of tool binaries - -MCP and LSP toolsets that require a binary command can be auto-installed if the -command isn't on your system. Docker Agent uses the -[aqua registry](https://github.com/aquaproj/aqua-registry), a curated index of -CLI tool packages, to resolve and download binaries. - -When a toolset with a `command` property is loaded, Docker Agent: - -1. Checks if the command exists in your `PATH`. -2. Checks the Docker Agent tools directory (`~/.cagent/tools/bin/`). -3. If still not found, looks up the command in the aqua registry and installs it. - -Installed binaries are stored under `~/.cagent/tools/`. You can override this -location with the `DOCKER_AGENT_TOOLS_DIR` environment variable. - -Use the `version` property to pin a specific package and version: - -```yaml -toolsets: - - type: lsp - command: gopls - version: "golang/tools@v0.21.0" - file_types: [".go"] - - - type: mcp - command: some-mcp-server - version: "owner/repo@v1.2.3" -``` - -The format is `owner/repo` or `owner/repo@version`. Without a version tag, -Docker Agent uses the latest release. Without the `version` property entirely, -Docker Agent tries to auto-detect the package from the command name. - -To disable auto-installation for a single toolset, set `version` to `"false"`: - -```yaml -toolsets: - - type: mcp - command: my-custom-server - version: "false" -``` - -To disable auto-installation globally, set the `DOCKER_AGENT_AUTO_INSTALL` -environment variable to `false`. - -### Per-agent tool configuration - -Different agents can have different toolsets: - -```yaml -agents: - coordinator: - model: anthropic/claude-sonnet-4-5 - sub_agents: [code_writer, code_reviewer] - toolsets: - - type: filesystem - tools: [read_file] - - code_writer: - model: openai/gpt-5-mini - toolsets: - - type: filesystem - - type: shell - - code_reviewer: - model: anthropic/claude-sonnet-4-5 - toolsets: - - type: filesystem - tools: [read_file, read_multiple_files] -``` - -This allows specialized agents with focused capabilities, security boundaries, -and optimized performance. - -## Built-in tools reference - -### Filesystem - -The `filesystem` toolset gives your agent the ability to work with -files and directories. Your agent can read files to understand -context, write new files, make targeted edits to existing files, -search for content, and explore directory structures. Essential for -code analysis, documentation updates, configuration management, and -any agent that needs to understand or modify project files. - -Access is restricted to the current working directory by default. Agents can -request access to additional directories at runtime, which requires your -approval. - -#### Configuration - -```yaml -toolsets: - - type: filesystem - - # Optional: restrict to specific tools - - type: filesystem - tools: [read_file, write_file, edit_file] -``` - -### LSP - -The `lsp` toolset connects your agent to -[Language Server Protocol](https://microsoft.github.io/language-server-protocol/) -servers, providing code intelligence like go-to-definition, find references, -diagnostics, rename, formatting, and more. - -You can configure multiple LSP servers for different programming languages, -giving your agent code intelligence across your project. - -#### Configuration - -```yaml -toolsets: - - type: lsp - command: gopls - file_types: [".go"] - - - type: lsp - command: typescript-language-server - args: ["--stdio"] - file_types: [".ts", ".tsx", ".js", ".jsx"] - - - type: lsp - command: pylsp - file_types: [".py"] -``` - -If an LSP server binary isn't in your PATH, Docker Agent can -[auto-install it](#auto-installation-of-tool-binaries) using the `version` -property. - -#### Properties - -| Property | Type | Required | Description | -| ------------ | ---------------- | -------- | ------------------------------------------------------------------------------------------------------------------- | -| `command` | string | Yes | LSP server executable command | -| `args` | array of strings | No | Command-line arguments for the LSP server | -| `env` | object | No | Environment variables for the LSP server process | -| `file_types` | array of strings | No | File extensions this server handles (e.g., `[".go", ".mod"]`) | -| `version` | string | No | Package reference for auto-installing the server binary (e.g., `"golang/tools@v0.21.0"`). Set `"false"` to disable. | - -#### Available tools - -| Tool | Description | Read-only | -| ----------------------- | --------------------------------------------- | --------- | -| `lsp_workspace` | Get workspace info and available capabilities | Yes | -| `lsp_hover` | Get type info and documentation for a symbol | Yes | -| `lsp_definition` | Find where a symbol is defined | Yes | -| `lsp_references` | Find all references to a symbol | Yes | -| `lsp_document_symbols` | List all symbols in a file | Yes | -| `lsp_workspace_symbols` | Search symbols across the workspace | Yes | -| `lsp_diagnostics` | Get errors and warnings for a file | Yes | -| `lsp_code_actions` | Get available quick fixes and refactorings | Yes | -| `lsp_rename` | Rename a symbol across the workspace | No | -| `lsp_format` | Format a file | No | -| `lsp_call_hierarchy` | Find incoming and outgoing calls | Yes | -| `lsp_type_hierarchy` | Find supertypes and subtypes | Yes | -| `lsp_implementations` | Find interface implementations | Yes | -| `lsp_signature_help` | Get function signature at call site | Yes | -| `lsp_inlay_hints` | Get type annotations and parameter names | Yes | - -Not all LSP servers support all features. The agent uses `lsp_workspace` to -discover the capabilities of each configured server. - -#### Language server examples - -The following examples show configurations for common languages: - -| Language | Command | `file_types` | -| --------------------- | ---------------------------- | -------------------------------- | -| Go | `gopls` | `[".go"]` | -| TypeScript/JavaScript | `typescript-language-server` | `[".ts", ".tsx", ".js", ".jsx"]` | -| Python | `pylsp` | `[".py"]` | -| Rust | `rust-analyzer` | `[".rs"]` | -| C/C++ | `clangd` | `[".c", ".cpp", ".h", ".hpp"]` | - -For TypeScript/JavaScript, pass `args: ["--stdio"]` to the language server. - -### Shell - -The `shell` toolset lets your agent execute commands in your system's shell -environment. Use this for agents that need to run builds, execute tests, manage -processes, interact with CLI tools, or perform system operations. The agent can -run commands in the foreground or background. - -Commands execute in the current working directory and inherit environment -variables from the Docker Agent process. This toolset is powerful but should be used -with appropriate security considerations. - -#### Configuration - -```yaml -toolsets: - - type: shell -``` - -### Think - -The `think` toolset provides your agent with a reasoning scratchpad. The agent -can record thoughts and reasoning steps without taking actions or modifying -data. Particularly useful for complex tasks where the agent needs to plan -multiple steps, verify requirements, or maintain context across a long -conversation. - -Agents use this to break down problems, list applicable rules, verify they have -all needed information, and document their reasoning process before acting. - -#### Configuration - -```yaml -toolsets: - - type: think -``` - -### Todo - -The `todo` toolset gives your agent task-tracking capabilities for managing -multi-step operations. Your agent can break down complex work into discrete -tasks, track progress through each step, and ensure nothing is missed before -completing a request. Especially valuable for agents handling complex -workflows with multiple dependencies. - -The `shared` option allows todos to persist across different agents in a -multi-agent system, enabling coordination. - -#### Configuration - -```yaml -toolsets: - - type: todo - - # Optional: share todos across agents - - type: todo - shared: true -``` - -### Tasks - -The `tasks` toolset is an advanced version of the `todo` toolset, and provides -task management with priorities, dependencies, and persistence. Your agent can -create tasks with different priority levels, establish prerequisite -relationships between tasks, and automatically track which tasks are blocked by -incomplete dependencies. Tasks are sorted by priority and blocking status, -making it easy to identify the next actionable work. - -Tasks are stored in a JSON file and persist across Docker Agent sessions. - -#### Configuration - -```yaml -toolsets: - - type: tasks - - # Optional: specify storage location - - type: tasks - path: ./project-tasks.json -``` - -#### Available tools - -The tasks toolset provides these tools: - -- **create_task**: Create a new task with title, description, priority, and - dependencies -- **get_task**: Retrieve full details of a task by ID, including effective - status -- **update_task**: Modify task fields (title, description, priority, status, - dependencies) -- **delete_task**: Remove a task and clean up its dependencies -- **list_tasks**: List all tasks sorted by priority, optionally filtered by - status or priority -- **next_task**: Get the highest-priority actionable task (not blocked or done) -- **add_dependency**: Add a dependency between tasks (with cycle detection) -- **remove_dependency**: Remove a dependency from a task - -#### Task statuses and priorities - -Tasks have four statuses: `pending`, `in_progress`, `done`, and `blocked`. The -agent automatically calculates the effective status. A task becomes `blocked` -if any of its dependencies are not `done`, regardless of its assigned status. - -Priority levels (from highest to lowest): `critical`, `high`, `medium` -(default), `low`. Tasks are sorted by blocking status first (unblocked tasks -first), then by priority, then by creation time. - -### Memory - -The `memory` toolset allows your agent to store and retrieve information across -conversations and sessions. Your agent can remember user preferences, project -context, previous decisions, and other information that should persist. Useful -for agents that interact with users over time or need to maintain state about -a project or environment. - -Memories are stored in a local database file and persist across Docker Agent -sessions. - -#### Configuration - -```yaml -toolsets: - - type: memory - - # Optional: specify database location - - type: memory - path: ./agent-memories.db -``` - -### Fetch - -The `fetch` toolset enables your agent to retrieve content from HTTP/HTTPS URLs. -Your agent can fetch documentation, API responses, web pages, or any content -accessible via HTTP GET requests. Useful for agents that need to access -external resources, check API documentation, or retrieve web content. - -The agent can specify custom HTTP headers when needed for authentication or -other purposes. - -#### Configuration - -```yaml -toolsets: - - type: fetch -``` - -### User Prompt - -The `user_prompt` toolset lets your agent ask you questions during task -execution. When the agent needs clarification, decisions, or additional -information it can't determine on its own, it displays a dialog and waits for -your response. - -You'll see a prompt with the agent's question. Depending on what the agent -needs, you might provide free-form text, select from options, or fill out a -form with multiple fields. You can accept and provide the information, decline -to answer, or cancel the operation entirely. - -#### Configuration - -```yaml -toolsets: - - type: user_prompt -``` - -No additional configuration is required. The tool becomes available to the -agent once configured. When the agent calls this tool, the user sees a dialog -with the prompt. The user can: - -- **Accept**: Provide the requested information -- **Decline**: Refuse to provide the information -- **Cancel**: Cancel the operation - -### API - -The `api` toolset lets you define custom tools that call HTTP APIs. Similar to -`script` but for web services, this allows you to expose REST APIs, -webhooks, or any HTTP endpoint as a tool your agent can use. The agent sees -these as typed tools with automatic parameter validation. - -Use this to integrate with external services, call internal APIs, trigger -webhooks, or interact with any HTTP-based system. - -#### Configuration - -Each API tool is defined with an `api_config` containing the endpoint, HTTP method, and optional typed parameters: - -```yaml -toolsets: - - type: api - api_config: - name: search_docs - endpoint: https://api.example.com/search - method: GET - instruction: Search the documentation database - headers: - Authorization: Bearer ${API_TOKEN} - args: - query: - type: string - description: Search query - limit: - type: number - description: Maximum results - required: [query] - - - type: api - api_config: - name: create_ticket - endpoint: https://api.example.com/tickets - method: POST - instruction: Create a support ticket - args: - title: - type: string - description: Ticket title - description: - type: string - description: Ticket description - required: [title, description] -``` - -For GET requests, parameters are interpolated into the endpoint URL. For POST -requests, parameters are sent as JSON in the request body. - -Supported argument types: `string`, `number`, `boolean`, `array`, `object`. - -### Script - -The `script` toolset lets you define custom tools by wrapping shell -commands with typed parameters. This allows you to expose domain-specific -operations to your agent as first-class tools. The agent sees these custom -tools just like built-in tools, with parameter validation and type checking -handled automatically. - -Use this to create tools for deployment scripts, build commands, test runners, -or any operation specific to your project or workflow. - -#### Configuration - -Each custom tool is defined with a command, description, and optional typed -parameters: - -```yaml -toolsets: - - type: script - tools: - deploy: - cmd: ./deploy.sh - description: Deploy the application to an environment - args: - environment: - type: string - description: Target environment (dev, staging, prod) - version: - type: string - description: Version to deploy - required: [environment] - - run_tests: - cmd: npm test - description: Run the test suite - args: - filter: - type: string - description: Test name filter pattern -``` - -Supported argument types: `string`, `number`, `boolean`, `array`, `object`. - -#### Tools - -The tools you define become available to your agent. In the previous example, -the agent would have access to `deploy` and `run_tests` tools. - -## Automatic tools - -Some tools are automatically added to agents based on their configuration. You -don't configure these explicitly—they appear when needed. - -### transfer_task - -Automatically available when your agent has `sub_agents` configured. Allows -the agent to delegate tasks to sub-agents and receive results back. - -### handoff - -Automatically available when your agent has `handoffs` configured. Allows the -agent to transfer the entire conversation to a different agent. - -## What's next - -- Read the [Configuration file reference](./config.md) for YAML file structure -- Review the [CLI reference](./cli.md) for running agents -- Explore [MCP servers](/manuals/ai/mcp-catalog-and-toolkit/mcp-gateway.md) for extended capabilities -- Browse [example configurations](https://github.com/docker/docker-agent/tree/main/examples) diff --git a/content/manuals/ai/docker-agent/sharing-agents.md b/content/manuals/ai/docker-agent/sharing-agents.md deleted file mode 100644 index 3dd282260a..0000000000 --- a/content/manuals/ai/docker-agent/sharing-agents.md +++ /dev/null @@ -1,96 +0,0 @@ ---- -title: Sharing agents -description: Distribute agent configurations through OCI registries -keywords: [docker agent, oci, registry, docker hub, sharing, distribution] -weight: 50 ---- - -Push your agent to a registry and share it by name. Your teammates -reference `agentcatalog/security-expert` instead of copying YAML files -around or asking you where your agent configuration lives. - -When you update the agent in the registry, everyone gets the new version -the next time they pull or restart their client. - -## Prerequisites - -To push agents to a registry, authenticate first: - -```console -$ docker login -``` - -For other registries, use their authentication method. - -## Publishing agents - -Push your agent configuration to a registry: - -```console -$ docker agent share push ./agent.yml myusername/agent-name -``` - -Push creates the repository if it doesn't exist yet. Use Docker Hub or -any OCI-compatible registry. - -Tag specific versions: - -```console -$ docker agent share push ./agent.yml myusername/agent-name:v1.0.0 -$ docker agent share push ./agent.yml myusername/agent-name:latest -``` - -## Using published agents - -Pull an agent to inspect it locally: - -```console -$ docker agent share pull agentcatalog/pirate -``` - -This saves the configuration as a local YAML file. - -Run agents directly from the registry: - -```console -$ docker agent run agentcatalog/pirate -``` - -Or reference it directly in integrations: - -### Editor integration (ACP) - -Use registry references in ACP configurations so your editor always uses -the latest version: - -```json -{ - "agent_servers": { - "myagent": { - "command": "docker", - "args": ["agent", "aserve", "acp", "agentcatalog/pirate"] - } - } -} -``` - -### MCP client integration - -Agents can be exposed as tools in MCP clients: - -```json -{ - "mcpServers": { - "myagent": { - "command": "docker", - "args": ["agent", "serve", "mcp", "agentcatalog/pirate"] - } - } -} -``` - -## What's next - -- Set up [ACP integration](./integrations/acp.md) with shared agents -- Configure [MCP integration](./integrations/mcp.md) with shared agents -- Browse the [agent catalog](https://hub.docker.com/u/agentcatalog) for examples diff --git a/content/manuals/ai/docker-agent/tutorial.md b/content/manuals/ai/docker-agent/tutorial.md deleted file mode 100644 index c8e23c538f..0000000000 --- a/content/manuals/ai/docker-agent/tutorial.md +++ /dev/null @@ -1,291 +0,0 @@ ---- -title: Building a coding agent -description: Create a coding agent that can read, write, and validate code changes in your projects -keywords: [docker agent, tutorial, coding agent, ai assistant] -weight: 30 ---- - -This tutorial teaches you how to build a coding agent that can help with -software development tasks. You'll start with a basic agent and progressively -add capabilities until you have a production-ready assistant that can read code, -make changes, run tests, and even look up documentation. - -By the end, you'll understand how to structure agent instructions, configure -tools, and compose multiple agents for complex workflows. - -## What you'll build - -A coding agent that can: - -- Read and modify files in your project -- Run commands like tests and linters -- Follow a structured development workflow -- Look up documentation when needed -- Track progress through multi-step tasks - -## What you'll learn - -- How to configure agents in YAML with Docker Agents -- How to give agents access to tools (filesystem, shell, etc.) -- How to write effective agent instructions -- How to compose multiple agents for specialized tasks -- How to adapt agents for your own projects - -## Prerequisites - -Before starting, you need: - -- **Docker Agent installed** - See the [installation guide](_index.md#installation) -- **API key configured** - Set `ANTHROPIC_API_KEY` or `OPENAI_API_KEY` in your - environment. Get keys from [Anthropic](https://console.anthropic.com/) or - [OpenAI](https://platform.openai.com/api-keys) -- **A project to work with** - Any codebase where you want agent assistance - -## Creating your first agent - -An agent is defined in a YAML configuration file. The minimal agent needs -just a model and instructions that define its purpose. - -Create a file named `agents.yml`: - -```yaml -agents: - root: - model: openai/gpt-5 - description: A basic coding assistant - instruction: | - You are a helpful coding assistant. - Help me write and understand code. -``` - -Run your agent: - -```console -$ docker agent run agents.yml -``` - -Try asking it: "How do I read a file in Python?" - -The agent can answer coding questions, but it can't see your files or run -commands yet. To make it useful for real development work, it needs access to -tools. - -## Adding tools - -A coding agent needs to interact with your project files and run commands. You -enable these capabilities by adding toolsets. - -Update `agents.yml` to add filesystem and shell access: - -```yaml -agents: - root: - model: openai/gpt-5 - description: A coding assistant with filesystem access - instruction: | - You are a helpful coding assistant. - You can read and write files to help me develop software. - Always check if code works before finishing a task. - toolsets: - - type: filesystem - - type: shell -``` - -Run the updated agent and try: "Read the README.md file and summarize it." - -Your agent can now: - -- Read and write files in the current directory -- Execute shell commands -- Explore your project structure - -> [!NOTE] By default, filesystem access is restricted to the current working -> directory. The agent will request permission if it needs to access other -> directories. - -The agent can now interact with your code, but its behavior is still generic. -Next, you'll teach it how to work effectively. - -## Structuring agent instructions - -Generic instructions produce generic results. For production use, you want your -agent to follow a specific workflow and understand your project's conventions. - -Update your agent with structured instructions. This example shows a Go -development agent, but you can adapt the pattern for any language: - -```yaml -agents: - root: - model: anthropic/claude-sonnet-4-5 - description: Expert Go developer - instruction: | - Your goal is to help with code-related tasks by examining, modifying, - and validating code changes. - - - # Workflow: - # 1. Analyze: Understand requirements and identify relevant code. - # 2. Examine: Search for files, analyze structure and dependencies. - # 3. Modify: Make changes following best practices. - # 4. Validate: Run linters/tests. If issues found, return to Modify. - - - Constraints: - - Be thorough in examination before making changes - - Always validate changes before considering the task complete - - Write code to files, don't show it in chat - - ## Development Workflow - - `go build ./...` - Build the application - - `go test ./...` - Run tests - - `golangci-lint run` - Check code quality - - add_date: true - add_environment_info: true - toolsets: - - type: filesystem - - type: shell - - type: todo -``` - -Try asking: "Add error handling to the `parseConfig` function in main.go" - -The structured instructions give your agent: - -- A clear workflow to follow (analyze, examine, modify, validate) -- Project-specific commands to run -- Constraints that prevent common mistakes -- Context about the environment (`add_date` and `add_environment_info`) - -The `todo` toolset helps the agent track progress through multi-step tasks. When -you ask for complex changes, the agent will break down the work and update its -progress as it goes. - -## Composing multiple agents - -Complex tasks often benefit from specialized agents. You can add sub-agents that -handle specific responsibilities, like researching documentation while your main -agent stays focused on coding. - -Add a librarian agent that can search for documentation: - -```yaml -agents: - root: - model: anthropic/claude-sonnet-4-5 - description: Expert Go developer - instruction: | - Your goal is to help with code-related tasks by examining, modifying, - and validating code changes. - - When you need to look up documentation or research how something works, - ask the librarian agent. - - (rest of instructions from previous section...) - toolsets: - - type: filesystem - - type: shell - - type: todo - sub_agents: - - librarian - - librarian: - model: anthropic/claude-haiku-4-5 - description: Documentation researcher - instruction: | - You are the librarian. Your job is to find relevant documentation, - articles, or resources to help the developer agent. - - Search the internet and fetch web pages as needed. - toolsets: - - type: mcp - ref: docker:duckduckgo - - type: fetch -``` - -Try asking: "How do I use `context.Context` in Go? Then add it to my server -code." - -Your main agent will delegate the research to the librarian, then use that -information to modify your code. This keeps the main agent's context focused on -the coding task while still having access to up-to-date documentation. - -Using a smaller, faster model (Haiku) for the librarian saves costs since -documentation lookup doesn't need the same reasoning depth as code changes. - -## Adapting for your project - -Now that you understand the core concepts, adapt the agent for your specific -project: - -### Update the development commands - -Replace the Go commands with your project's workflow: - -```yaml -## Development Workflow -- `npm test` - Run tests -- `npm run lint` - Check code quality -- `npm run build` - Build the application -``` - -### Add project-specific constraints - -If your agent keeps making the same mistakes, add explicit constraints: - -```yaml -Constraints: - - Always run tests before considering a task complete - - Follow the existing code style in src/ directories - - Never modify files in the generated/ directory - - Use TypeScript strict mode for new files -``` - -### Choose the right models - -For coding tasks, use reasoning-focused models: - -- `anthropic/claude-sonnet-4-5` - Strong reasoning, good for complex code -- `openai/gpt-5` - Fast, good general coding ability - -For auxiliary tasks like documentation lookup, smaller models work well: - -- `anthropic/claude-haiku-4-5` - Fast and cost-effective -- `openai/gpt-5-mini` - Good for simple tasks - -### Iterate based on usage - -The best way to improve your agent is to use it. When you notice issues: - -1. Add specific instructions to prevent the problem -2. Update constraints to guide behavior -3. Add relevant commands to the development workflow -4. Consider adding specialized sub-agents for complex areas - -## What you learned - -You now know how to: - -- Create a basic Docker Agent configuration -- Add tools to enable agent capabilities -- Write structured instructions for consistent behavior -- Compose multiple agents for specialized tasks -- Adapt agents for different programming languages and workflows - -## Next steps - -- Learn [best practices](best-practices.md) for handling large outputs, - structuring agent teams, and optimizing performance -- Integrate Docker Agent with your [editor](integrations/acp.md) or use agents as - [tools in MCP clients](integrations/mcp.md) -- Review the [Configuration reference](reference/config.md) for all available - options -- Explore the [Tools reference](reference/toolsets.md) to see what capabilities - you can enable -- Check out [example - configurations](https://github.com/docker/docker-agent/tree/main/examples) for - different use cases -- See the full - [golang_developer.yaml](https://github.com/docker/docker-agent/blob/main/golang_developer.yaml) - that the Docker Team uses to develop Docker Agent diff --git a/go.mod b/go.mod index 1bb70355a8..9df5b9ab3c 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/docker/docs -go 1.26.0 +go 1.26.4 // This go.mod file is used by hugo to vendor documentation from upstream // repositories. Use the "require" section to specify the version of the @@ -9,8 +9,9 @@ go 1.26.0 // Make sure to add an entry in the "tools" section when adding a new repository. require ( github.com/docker/buildx v0.35.0 - github.com/docker/cli v29.6.0+incompatible + github.com/docker/cli v29.6.1+incompatible github.com/docker/compose/v5 v5.3.0 + github.com/docker/docker-agent v1.96.0 github.com/docker/model-runner v1.1.36 github.com/moby/buildkit v0.31.0 github.com/moby/moby/api v1.55.0 @@ -20,6 +21,7 @@ tool ( github.com/docker/buildx github.com/docker/cli github.com/docker/compose/v5 + github.com/docker/docker-agent github.com/docker/model-runner github.com/docker/scout-cli github.com/moby/buildkit diff --git a/go.sum b/go.sum index b7ceb8b3e9..f3ac2b7f9d 100644 --- a/go.sum +++ b/go.sum @@ -106,6 +106,8 @@ github.com/docker/cli v29.5.3+incompatible h1:nbEFfz774vBwQ5KRYv7c/AghjReqnGISvr github.com/docker/cli v29.5.3+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/cli v29.6.0+incompatible h1:nw9himxMMZ7eIeherJNlKQq+acnlzGgHd+4uf10QRSc= github.com/docker/cli v29.6.0+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v29.6.1+incompatible h1:oO7F4nn3Ovr/5TlfTUWFbMwBSS/B7Xs6Epv26gBrUP8= +github.com/docker/cli v29.6.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/compose/v5 v5.0.0 h1:J2uMCzJ/5xLcoIVVXvMmPe6HBzVQpmJThKa7Qk7Xldc= github.com/docker/compose/v5 v5.0.0/go.mod h1:BurapGv8zmYnsbSmlpCz5EU2Pi3YFV/PjeUnoFpcw64= github.com/docker/compose/v5 v5.0.1 h1:5yCjDJbwUqcuI+6WNFHNWz2/3vyBDsNnfe8LlFjyxEc= @@ -124,6 +126,8 @@ github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBi github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaftjlSWt4AFexzM= github.com/docker/docker v28.5.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-agent v1.96.0 h1:wt018652ejWtHpMOdhvjwIxaeI46rc6o8snqb9QsmiI= +github.com/docker/docker-agent v1.96.0/go.mod h1:PJlLIntWPY0KPepCIeR4+WRo2fmQnmnONYBmb/ULorM= github.com/docker/docker-credential-helpers v0.9.3 h1:gAm/VtF9wgqJMoxzT3Gj5p4AqIjCBS4wrsOh9yRqcz8= github.com/docker/docker-credential-helpers v0.9.3/go.mod h1:x+4Gbw9aGmChi3qTLZj8Dfn0TD20M/fuWy0E5+WDeCo= github.com/docker/docker-credential-helpers v0.9.5 h1:EFNN8DHvaiK8zVqFA2DT6BjXE0GzfLOZ38ggPTKePkY= diff --git a/hugo.yaml b/hugo.yaml index c14073cd65..729943cd99 100644 --- a/hugo.yaml +++ b/hugo.yaml @@ -32,6 +32,14 @@ cascade: - target: path: /reference/cli/sbx/** layout: sbx-cli + # Docker Agent section indexes are mounted navigation stubs; skip + # rendering them so they don't produce empty pages (same pattern as + # gordon/concepts and other render:never section indexes) + - target: + path: /manuals/ai/docker-agent/** + kind: section + build: + render: never # Remove the /manuals prefix for content in the manuals section permalinks: @@ -385,3 +393,29 @@ module: - source: cmd/cli/docs/reference target: data/cli/model files: ["*.yaml"] + + # Docker Agent + # Single-sources https://docker.github.io/docker-agent/ content; + # bumped on each docker-agent release by sync-docker-agent-docs.yml. + # Sections are mounted individually so hugo mod vendor does not + # vendor the upstream Jekyll site files that also live in docs/. + - path: github.com/docker/docker-agent + mounts: + - source: docs/getting-started + target: content/manuals/ai/docker-agent/getting-started + - source: docs/concepts + target: content/manuals/ai/docker-agent/concepts + - source: docs/configuration + target: content/manuals/ai/docker-agent/configuration + - source: docs/tools + target: content/manuals/ai/docker-agent/tools + - source: docs/providers + target: content/manuals/ai/docker-agent/providers + - source: docs/features + target: content/manuals/ai/docker-agent/features + - source: docs/guides + target: content/manuals/ai/docker-agent/guides + - source: docs/community + target: content/manuals/ai/docker-agent/community + - source: docs/demo.gif + target: content/manuals/ai/docker-agent/demo.gif

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