From 1c02de130901ce42bcdbd7fec8fd9b4fb3f4dfd0 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 20 Jan 2026 10:06:42 +0000 Subject: [PATCH] chore: raise default agent concurrency --- CHANGELOG.md | 1 + docs/concepts/queue.md | 2 +- docs/gateway/configuration.md | 4 ++-- docs/tools/subagents.md | 2 +- src/gateway/server-lanes.ts | 4 ++-- src/gateway/server-reload-handlers.ts | 4 ++-- 6 files changed, 9 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 83959f86f..bda53398e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ Docs: https://docs.clawd.bot ### Changes - Repo: remove the Peekaboo git submodule now that the SPM release is used. +- Gateway: raise default lane concurrency for main and sub-agent runs. ### Fixes - Web search: infer Perplexity base URL from API key source (direct vs OpenRouter). diff --git a/docs/concepts/queue.md b/docs/concepts/queue.md index da6c32741..ca498d66b 100644 --- a/docs/concepts/queue.md +++ b/docs/concepts/queue.md @@ -12,7 +12,7 @@ We serialize inbound auto-reply runs (all channels) through a tiny in-process qu - Serializing avoids competing for shared resources (session files, logs, CLI stdin) and reduces the chance of upstream rate limits. ## How it works -- A lane-aware FIFO queue drains each lane with a configurable concurrency cap (default 1). +- A lane-aware FIFO queue drains each lane with a configurable concurrency cap (default 1 for unconfigured lanes; main defaults to 4, subagent to 8). - `runEmbeddedPiAgent` enqueues by **session key** (lane `session:`) to guarantee only one active run per session. - Each session run is then queued into a **global lane** (`main` by default) so overall parallelism is capped by `agents.defaults.maxConcurrent`. - When verbose logging is enabled, queued runs emit a short notice if they waited more than ~2s before starting. diff --git a/docs/gateway/configuration.md b/docs/gateway/configuration.md index d54c03dc8..99f6183f0 100644 --- a/docs/gateway/configuration.md +++ b/docs/gateway/configuration.md @@ -1840,7 +1840,7 @@ Example: `agents.defaults.subagents` configures sub-agent defaults: - `model`: default model for spawned sub-agents (string or `{ primary, fallbacks }`). If omitted, sub-agents inherit the caller’s model unless overridden per agent or per call. -- `maxConcurrent`: max concurrent sub-agent runs (default 1) +- `maxConcurrent`: max concurrent sub-agent runs (default 8) - `archiveAfterMinutes`: auto-archive sub-agent sessions after N minutes (default 60; set `0` to disable) - Per-subagent tool policy: `tools.subagents.tools.allow` / `tools.subagents.tools.deny` (deny wins) @@ -1974,7 +1974,7 @@ Notes: `agents.defaults.maxConcurrent` sets the maximum number of embedded agent runs that can execute in parallel across sessions. Each session is still serialized (one run -per session key at a time). Default: 1. +per session key at a time). Default: 4. ### `agents.defaults.sandbox` diff --git a/docs/tools/subagents.md b/docs/tools/subagents.md index 36b93d416..e7a7faec5 100644 --- a/docs/tools/subagents.md +++ b/docs/tools/subagents.md @@ -118,7 +118,7 @@ Override via config: Sub-agents use a dedicated in-process queue lane: - Lane name: `subagent` -- Concurrency: `agents.defaults.subagents.maxConcurrent` (default `1`) +- Concurrency: `agents.defaults.subagents.maxConcurrent` (default `8`) ## Stopping diff --git a/src/gateway/server-lanes.ts b/src/gateway/server-lanes.ts index 23e8e2657..d73167f05 100644 --- a/src/gateway/server-lanes.ts +++ b/src/gateway/server-lanes.ts @@ -3,6 +3,6 @@ import { setCommandLaneConcurrency } from "../process/command-queue.js"; export function applyGatewayLaneConcurrency(cfg: ReturnType) { setCommandLaneConcurrency("cron", cfg.cron?.maxConcurrentRuns ?? 1); - setCommandLaneConcurrency("main", cfg.agents?.defaults?.maxConcurrent ?? 1); - setCommandLaneConcurrency("subagent", cfg.agents?.defaults?.subagents?.maxConcurrent ?? 1); + setCommandLaneConcurrency("main", cfg.agents?.defaults?.maxConcurrent ?? 4); + setCommandLaneConcurrency("subagent", cfg.agents?.defaults?.subagents?.maxConcurrent ?? 8); } diff --git a/src/gateway/server-reload-handlers.ts b/src/gateway/server-reload-handlers.ts index 3d0826952..094a29640 100644 --- a/src/gateway/server-reload-handlers.ts +++ b/src/gateway/server-reload-handlers.ts @@ -127,10 +127,10 @@ export function createGatewayReloadHandlers(params: { } setCommandLaneConcurrency("cron", nextConfig.cron?.maxConcurrentRuns ?? 1); - setCommandLaneConcurrency("main", nextConfig.agents?.defaults?.maxConcurrent ?? 1); + setCommandLaneConcurrency("main", nextConfig.agents?.defaults?.maxConcurrent ?? 4); setCommandLaneConcurrency( "subagent", - nextConfig.agents?.defaults?.subagents?.maxConcurrent ?? 1, + nextConfig.agents?.defaults?.subagents?.maxConcurrent ?? 8, ); if (plan.hotReasons.length > 0) {