Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions manager/Dockerfile.qwenpaw
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# ============================================================
# AgentTeams Manager Agent - QwenPaw 2.0 Runtime
# AgentTeams Manager Agent - QwenPaw 2.2 Runtime
# ============================================================
# Lightweight Manager container with Python QwenPaw 2.0 runtime.
# Lightweight Manager container with Python QwenPaw 2.2 runtime.
# Does NOT include Higress, Tuwunel, MinIO, or Element Web.
# All infrastructure is provided by the controller (embedded)
# or K8s Pods (incluster). AGENTTEAMS_RUNTIME env var selects mode.
Expand All @@ -12,7 +12,7 @@
# Build args:
# HIGRESS_REGISTRY - base image registry (default: cn-hangzhou)
# AGENTTEAMS_CONTROLLER_IMAGE - pre-built controller image for agt CLI
# QWENPAW_PIP_SPEC - QwenPaw pip spec (default: qwenpaw==2.0.1)
# QWENPAW_PIP_SPEC - QwenPaw pip spec (default: qwenpaw==2.2.1)
# PIP_INDEX_URL - PyPI mirror (default: official pypi.org)
# APT_MIRROR - Debian APT mirror (default: empty; set to mirrors.aliyun.com for China)
# ============================================================
Expand Down Expand Up @@ -60,8 +60,8 @@ RUN npm config set registry ${NPM_REGISTRY} && \
npm install -g mcporter skills @nacos-group/cli && \
rm -rf /root/.npm

# ---- Python virtual environment (single QwenPaw 2.0 venv) ----
ARG QWENPAW_PIP_SPEC=qwenpaw==2.0.1
# ---- Python virtual environment (single QwenPaw 2.2 venv) ----
ARG QWENPAW_PIP_SPEC=qwenpaw==2.2.1
RUN python3 -m venv /opt/venv/qwenpaw \
&& /opt/venv/qwenpaw/bin/pip install --no-cache-dir \
-i "${PIP_INDEX_URL}" \
Expand Down
16 changes: 12 additions & 4 deletions manager/scripts/init/start-qwenpaw-manager.sh
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/bin/bash
# start-qwenpaw-manager.sh - Start Manager Agent with QwenPaw 2.0 runtime
# start-qwenpaw-manager.sh - Start Manager Agent with QwenPaw 2.2 runtime
# Called by start-manager-agent.sh when AGENTTEAMS_MANAGER_RUNTIME=copaw|qwenpaw
#
# This script converts an OpenClaw-style workspace to a QwenPaw-style workspace
Expand Down Expand Up @@ -207,7 +207,7 @@ rm -f "${DM_ROOMS_FILE}" "${DM_ROOMS_FILE}.tmp"
# Worker does this via api_client.disable_agent_if_present().
# Manager runs QwenPaw in-process (no API client), so we set
# enabled=false in config.json's agents.profiles before startup.
# QwenPaw 2.0 start_all_configured_agents() skips enabled=false agents.
# QwenPaw 2.2 start_all_configured_agents() skips enabled=false agents.
CONFIG_JSON="${QWENPAW_WORKING_DIR}/config.json"
if [ -f "${CONFIG_JSON}" ]; then
# AgentProfileRef requires id + workspace_dir (both mandatory).
Expand Down Expand Up @@ -319,8 +319,16 @@ export QWENPAW_SECRET_DIR="${QWENPAW_SECRET_DIR:-${QWENPAW_WORKING_DIR}.secret}"
export QWENPAW_RUNNING_IN_CONTAINER=true
export QWENPAW_LOG_LEVEL="${COPAW_LOG_LEVEL:-info}"

# LLM stream stall detection (QwenPaw 2.2.0 #7150): aligned with the Worker
# entrypoint. Upstream default 30s; AgentTeams defaults 300s (8/26
# QwenPaw001 false-kill precedent, lesson #386). Priority: native
# QWENPAW_LLM_STREAM_* vars > AGENTTEAMS_LLM_STREAM_TIMEOUT_S > 300.
AGENTTEAMS_LLM_STREAM_TIMEOUT_S="${AGENTTEAMS_LLM_STREAM_TIMEOUT_S:-300}"
export QWENPAW_LLM_STREAM_FIRST_CONTENT_TIMEOUT="${QWENPAW_LLM_STREAM_FIRST_CONTENT_TIMEOUT:-${AGENTTEAMS_LLM_STREAM_TIMEOUT_S}}"
export QWENPAW_LLM_STREAM_IDLE_TIMEOUT="${QWENPAW_LLM_STREAM_IDLE_TIMEOUT:-${AGENTTEAMS_LLM_STREAM_TIMEOUT_S}}"

# YOLO mode: AGENTTEAMS_YOLO=1 → set approval_level=OFF in agent.json
# (QwenPaw 2.0 equivalent of OpenClaw's tools.exec.ask=off).
# (QwenPaw 2.2 equivalent of OpenClaw's tools.exec.ask=off).
# start-manager-agent.sh promotes the yolo-mode marker file to
# AGENTTEAMS_YOLO=1 before calling this script.
if [ "${AGENTTEAMS_YOLO:-}" = "1" ] && [ -f "${AGENT_JSON}" ]; then
Expand All @@ -329,7 +337,7 @@ if [ "${AGENTTEAMS_YOLO:-}" = "1" ] && [ -f "${AGENT_JSON}" ]; then
log "YOLO mode: approval_level set to OFF"
fi

log "Starting QwenPaw 2.0 Manager (app mode)..."
log "Starting QwenPaw 2.2 Manager (app mode)..."

# Keep canonical Manager skills under $HOME/skills synchronized with the
# QwenPaw native workspace after startup. QwenPaw does not watch the OpenClaw
Expand Down
6 changes: 3 additions & 3 deletions plugins/agentteams-manager-tools/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@
"backend": "plugin.py"
},
"dependencies": [],
"min_version": "2.0.1",
"min_version": "2.2.0",
"qwenpaw_version": {
"min": "2.0.1",
"max": "2.1.0"
"min": "2.2.0",
"max": "2.3.0"
}
}
11 changes: 8 additions & 3 deletions tests/test-27-qwenpaw-manager-startup.sh
Original file line number Diff line number Diff line change
Expand Up @@ -145,12 +145,17 @@ fi
docker exec "${_AGENT_CTR}" bash -c \
"printf '%s\n' '---' 'name: ${_HOT_SKILL}' 'description: QwenPaw Manager updated hot loading regression skill.' '---' '' '# Hot Loading Regression Updated' > '/root/manager-workspace/skills/${_HOT_SKILL}/SKILL.md'"

# QwenPaw >= 2.2.0 skills API: the list endpoint (GET /api/skills) returns
# metadata only (SkillSpec, no content); skill content is served by the
# per-skill detail endpoint (GET /api/skills/{name}, SkillDetail) and read
# from disk at request time. Poll the detail endpoint: the Manager skill
# sync copies the canonical file into the workspace within ~1s, and the
# detail endpoint then serves the fresh content.
_skill_updated=false
_deadline=$(( $(date +%s) + 30 ))
while [ "$(date +%s)" -lt "${_deadline}" ]; do
if docker exec "${_AGENT_CTR}" curl -fsS http://127.0.0.1:18799/api/skills 2>/dev/null \
| jq -e --arg name "${_HOT_SKILL}" \
'.[] | select(.name == $name and (.content | contains("# Hot Loading Regression Updated")))' \
if docker exec "${_AGENT_CTR}" curl -fsS "http://127.0.0.1:18799/api/skills/${_HOT_SKILL}" 2>/dev/null \
| jq -e '.content | contains("# Hot Loading Regression Updated")' \
>/dev/null 2>&1; then
_skill_updated=true
break
Expand Down
Loading