diff --git a/Makefile b/Makefile index c5f2277c2..12725b2f6 100644 --- a/Makefile +++ b/Makefile @@ -53,6 +53,8 @@ LOCAL_WORKER = agentteams/worker-agent:$(VERSION) LOCAL_COPAW_WORKER = agentteams/copaw-worker:$(VERSION) LOCAL_HERMES_WORKER = agentteams/hermes-worker:$(VERSION) LOCAL_QWENPAW_WORKER = agentteams/qwenpaw-worker:$(VERSION) +# SKIP_BUILD callers may not have the opt-in QwenPaw image loaded (for example CI shards). +AGENTTEAMS_INSTALL_QWENPAW_WORKER_IMAGE ?= $(if $(SKIP_BUILD),,$(LOCAL_QWENPAW_WORKER)) LOCAL_MANAGER_LEGACY = hiclaw/hiclaw-manager:$(VERSION) LOCAL_MANAGER_COPAW_LEGACY = hiclaw/hiclaw-manager-copaw:$(VERSION) LOCAL_WORKER_LEGACY = hiclaw/worker-agent:$(VERSION) @@ -640,6 +642,7 @@ endif AGENTTEAMS_INSTALL_COPAW_WORKER_IMAGE=$(LOCAL_COPAW_WORKER) \ AGENTTEAMS_INSTALL_HERMES_WORKER_IMAGE=$(LOCAL_HERMES_WORKER) \ AGENTTEAMS_INSTALL_OPENHUMAN_WORKER_IMAGE=$(LOCAL_OPENHUMAN_WORKER) \ + AGENTTEAMS_INSTALL_QWENPAW_WORKER_IMAGE=$(AGENTTEAMS_INSTALL_QWENPAW_WORKER_IMAGE) \ AGENTTEAMS_INSTALL_CONTROLLER_IMAGE=$(LOCAL_CONTROLLER) \ bash ./install/hiclaw-install.sh manager @@ -654,6 +657,7 @@ endif AGENTTEAMS_INSTALL_COPAW_WORKER_IMAGE=$(LOCAL_COPAW_WORKER) \ AGENTTEAMS_INSTALL_HERMES_WORKER_IMAGE=$(LOCAL_HERMES_WORKER) \ AGENTTEAMS_INSTALL_OPENHUMAN_WORKER_IMAGE=$(LOCAL_OPENHUMAN_WORKER) \ + AGENTTEAMS_INSTALL_QWENPAW_WORKER_IMAGE=$(AGENTTEAMS_INSTALL_QWENPAW_WORKER_IMAGE) \ bash ./install/hiclaw-install.sh manager uninstall: ## Stop and remove Manager + all Worker containers @@ -696,7 +700,7 @@ uninstall: ## Stop and remove Manager + all Worker containers install-embedded: ## Install in embedded mode (dual-container: controller + agent) ifndef SKIP_BUILD - $(MAKE) build-embedded build-manager build-manager-copaw build-worker build-copaw-worker build-hermes-worker + $(MAKE) build-embedded build-manager build-manager-copaw build-worker build-copaw-worker build-hermes-worker build-qwenpaw-worker endif @echo "==> Installing AgentTeams (embedded mode)..." AGENTTEAMS_NON_INTERACTIVE=1 \ @@ -707,6 +711,7 @@ endif AGENTTEAMS_INSTALL_COPAW_WORKER_IMAGE=$(LOCAL_COPAW_WORKER) \ AGENTTEAMS_INSTALL_HERMES_WORKER_IMAGE=$(LOCAL_HERMES_WORKER) \ AGENTTEAMS_INSTALL_OPENHUMAN_WORKER_IMAGE=$(LOCAL_OPENHUMAN_WORKER) \ + AGENTTEAMS_INSTALL_QWENPAW_WORKER_IMAGE=$(AGENTTEAMS_INSTALL_QWENPAW_WORKER_IMAGE) \ AGENTTEAMS_MATRIX_E2EE=0 \ bash ./install/hiclaw-install.sh diff --git a/changelog/current.md b/changelog/current.md index f3ae6b4eb..24f1e9be2 100644 --- a/changelog/current.md +++ b/changelog/current.md @@ -4,6 +4,8 @@ Record image-affecting changes to `manager/`, `worker/`, `copaw/`, `openclaw-bas --- +- fix(controller): wire the dedicated QwenPaw Worker image through controller backend defaults and Helm deployments ([d9f0876](https://github.com/agentscope-ai/AgentTeams/commit/d9f08763d10e5087c7169f3051a426fb78bb55b1)). +- fix(install): propagate explicit QwenPaw Worker images through local install targets and Embedded controllers while preserving `SKIP_BUILD` image sets ([1b9bdcb](https://github.com/agentscope-ai/AgentTeams/commit/1b9bdcbae14cf836656cce8a516195af7188359f), [77ff709](https://github.com/agentscope-ai/AgentTeams/commit/77ff7093b6eed80cb5094276d585c2de732decc0)). - feat(qwenpaw): add the QwenPaw worker runtime Python package baseline with runtime config sync, storage sync, heartbeat reporting, Matrix channel overlay, and focused unit tests. - fix(controller): surface Kubernetes Pod container failures in Worker backend status and status API responses. - feat(controller): expose low-cardinality AgentTeams controller metrics and optional Helm ServiceMonitor. diff --git a/helm/hiclaw/templates/_helpers.tpl b/helm/hiclaw/templates/_helpers.tpl index a86642ee0..afbfcdd53 100644 --- a/helm/hiclaw/templates/_helpers.tpl +++ b/helm/hiclaw/templates/_helpers.tpl @@ -192,3 +192,8 @@ app.kubernetes.io/component: {{ .component }} {{- $tag := default (include "hiclaw.globalImageTag" .) .Values.worker.defaultImage.openhuman.tag }} {{- printf "%s:%s" .Values.worker.defaultImage.openhuman.repository $tag }} {{- end }} + +{{- define "hiclaw.worker.qwenpawImage" -}} +{{- $tag := default (include "hiclaw.globalImageTag" .) .Values.worker.defaultImage.qwenpaw.tag }} +{{- printf "%s:%s" .Values.worker.defaultImage.qwenpaw.repository $tag }} +{{- end }} diff --git a/helm/hiclaw/templates/controller/deployment.yaml b/helm/hiclaw/templates/controller/deployment.yaml index 78eb84cb3..ea99adf36 100644 --- a/helm/hiclaw/templates/controller/deployment.yaml +++ b/helm/hiclaw/templates/controller/deployment.yaml @@ -84,6 +84,8 @@ spec: value: {{ include "hiclaw.worker.hermesImage" . | quote }} - name: AGENTTEAMS_OPENHUMAN_WORKER_IMAGE value: {{ include "hiclaw.worker.openhumanImage" . | quote }} + - name: AGENTTEAMS_QWENPAW_WORKER_IMAGE + value: {{ include "hiclaw.worker.qwenpawImage" . | quote }} - name: AGENTTEAMS_DEFAULT_WORKER_RUNTIME value: {{ .Values.worker.defaultRuntime | quote }} - name: TZ diff --git a/helm/hiclaw/values.yaml b/helm/hiclaw/values.yaml index 436241ace..dd8a9d166 100644 --- a/helm/hiclaw/values.yaml +++ b/helm/hiclaw/values.yaml @@ -300,6 +300,9 @@ worker: openhuman: repository: higress-registry.cn-hangzhou.cr.aliyuncs.com/higress/hiclaw-openhuman-worker tag: "" # defaults to global.imageTag + qwenpaw: + repository: higress-registry.cn-hangzhou.cr.aliyuncs.com/higress/agentteams-qwenpaw-worker + tag: "" # defaults to global.imageTag defaultRuntime: "openclaw" resources: requests: diff --git a/hiclaw-controller/internal/config/config.go b/hiclaw-controller/internal/config/config.go index 258bb5f37..19b1beba7 100644 --- a/hiclaw-controller/internal/config/config.go +++ b/hiclaw-controller/internal/config/config.go @@ -518,6 +518,7 @@ func (c *Config) DockerConfig() backend.DockerConfig { CopawWorkerImage: envOrDefault("AGENTTEAMS_COPAW_WORKER_IMAGE", "agentteams/agentteams-copaw-worker:latest"), HermesWorkerImage: envOrDefault("AGENTTEAMS_HERMES_WORKER_IMAGE", "agentteams/agentteams-hermes-worker:latest"), OpenHumanWorkerImage: envOrDefault("AGENTTEAMS_OPENHUMAN_WORKER_IMAGE", "agentteams/agentteams-openhuman-worker:latest"), + QwenPawWorkerImage: envOrDefault("AGENTTEAMS_QWENPAW_WORKER_IMAGE", "agentteams/agentteams-qwenpaw-worker:latest"), DefaultNetwork: envOrDefault("AGENTTEAMS_DOCKER_NETWORK", "agentteams-net"), } } @@ -560,6 +561,7 @@ func (c *Config) K8sConfig() backend.K8sConfig { CopawWorkerImage: envOrDefault("AGENTTEAMS_COPAW_WORKER_IMAGE", "agentteams/agentteams-copaw-worker:latest"), HermesWorkerImage: envOrDefault("AGENTTEAMS_HERMES_WORKER_IMAGE", "agentteams/agentteams-hermes-worker:latest"), OpenHumanWorkerImage: envOrDefault("AGENTTEAMS_OPENHUMAN_WORKER_IMAGE", "agentteams/agentteams-openhuman-worker:latest"), + QwenPawWorkerImage: envOrDefault("AGENTTEAMS_QWENPAW_WORKER_IMAGE", "agentteams/agentteams-qwenpaw-worker:latest"), WorkerCPU: c.K8sWorkerCPU, WorkerMemory: c.K8sWorkerMemory, ControllerName: c.ControllerName, @@ -576,6 +578,7 @@ func (c *Config) SandboxConfig() backend.SandboxConfig { CopawWorkerImage: envOrDefault("AGENTTEAMS_COPAW_WORKER_IMAGE", "agentteams/agentteams-copaw-worker:latest"), HermesWorkerImage: envOrDefault("AGENTTEAMS_HERMES_WORKER_IMAGE", "agentteams/agentteams-hermes-worker:latest"), OpenHumanWorkerImage: envOrDefault("AGENTTEAMS_OPENHUMAN_WORKER_IMAGE", "agentteams/agentteams-openhuman-worker:latest"), + QwenPawWorkerImage: envOrDefault("AGENTTEAMS_QWENPAW_WORKER_IMAGE", "agentteams/agentteams-qwenpaw-worker:latest"), WorkerCPU: c.K8sWorkerCPU, WorkerMemory: c.K8sWorkerMemory, SandboxPrewarmSize: c.SandboxPrewarmSize, diff --git a/hiclaw-controller/internal/config/config_test.go b/hiclaw-controller/internal/config/config_test.go index ab5bbbf35..c8eb89cef 100644 --- a/hiclaw-controller/internal/config/config_test.go +++ b/hiclaw-controller/internal/config/config_test.go @@ -70,6 +70,22 @@ func TestLoadConfigMetricsBindAddrIgnoresLegacyFallback(t *testing.T) { } } +func TestBackendConfigsIncludeQwenPawWorkerImage(t *testing.T) { + t.Setenv("AGENTTEAMS_QWENPAW_WORKER_IMAGE", "registry.example.com/agentteams-qwenpaw-worker:test") + + cfg := &Config{} + tests := map[string]string{ + "docker": cfg.DockerConfig().QwenPawWorkerImage, + "kubernetes": cfg.K8sConfig().QwenPawWorkerImage, + "sandbox": cfg.SandboxConfig().QwenPawWorkerImage, + } + for backendName, got := range tests { + if want := "registry.example.com/agentteams-qwenpaw-worker:test"; got != want { + t.Errorf("%s QwenPawWorkerImage = %q, want %q", backendName, got, want) + } + } +} + func TestLoadConfigAppliesManagerSpec(t *testing.T) { t.Setenv("AGENTTEAMS_MANAGER_SPEC", `{ "model":"qwen-max", diff --git a/install/hiclaw-install.ps1 b/install/hiclaw-install.ps1 index a0e755e29..abb5adbd0 100644 --- a/install/hiclaw-install.ps1 +++ b/install/hiclaw-install.ps1 @@ -30,6 +30,7 @@ # AGENTTEAMS_INSTALL_WORKER_IMAGE Override worker image (e.g., local build) # AGENTTEAMS_INSTALL_COPAW_WORKER_IMAGE Override copaw worker image (e.g., local build) # AGENTTEAMS_INSTALL_HERMES_WORKER_IMAGE Override hermes worker image (e.g., local build) +# AGENTTEAMS_INSTALL_QWENPAW_WORKER_IMAGE Override qwenpaw worker image (e.g., local build) # AGENTTEAMS_PORT_GATEWAY Host port for Higress gateway (default: 18080) # AGENTTEAMS_PORT_CONSOLE Host port for Higress console (default: 18001) # AGENTTEAMS_PORT_ELEMENT_WEB Host port for Element Web direct access (default: 18088) @@ -1060,11 +1061,12 @@ AGENTTEAMS_CMS_METRICS_ENABLED=$(if ($env:AGENTTEAMS_CMS_METRICS_ENABLED) { $env AGENTTEAMS_WORKER_IMAGE=$($Config.WORKER_IMAGE) AGENTTEAMS_COPAW_WORKER_IMAGE=$($Config.COPAW_WORKER_IMAGE) AGENTTEAMS_HERMES_WORKER_IMAGE=$($Config.HERMES_WORKER_IMAGE) +AGENTTEAMS_QWENPAW_WORKER_IMAGE=$($Config.QWENPAW_WORKER_IMAGE) # Manager runtime (openclaw | copaw) AGENTTEAMS_MANAGER_RUNTIME=$($Config.MANAGER_RUNTIME) -# Default Worker runtime (openclaw | copaw | hermes) +# Default Worker runtime (openclaw | copaw | hermes | qwenpaw) AGENTTEAMS_DEFAULT_WORKER_RUNTIME=$($Config.DEFAULT_WORKER_RUNTIME) # Matrix E2EE (0=disabled, 1=enabled; default: 0) @@ -2486,6 +2488,8 @@ function Install-Manager { "$($script:AGENTTEAMS_REGISTRY)/higress/agentteams-hermes-worker:$($script:AGENTTEAMS_VERSION)" } + $script:QWENPAW_WORKER_IMAGE = $env:AGENTTEAMS_INSTALL_QWENPAW_WORKER_IMAGE + $script:MANAGER_COPAW_IMAGE = if ($env:AGENTTEAMS_INSTALL_MANAGER_COPAW_IMAGE) { $env:AGENTTEAMS_INSTALL_MANAGER_COPAW_IMAGE } else { @@ -2669,6 +2673,7 @@ function Install-Manager { $config.WORKER_IMAGE = $script:WORKER_IMAGE $config.COPAW_WORKER_IMAGE = $script:COPAW_WORKER_IMAGE $config.HERMES_WORKER_IMAGE = $script:HERMES_WORKER_IMAGE + $config.QWENPAW_WORKER_IMAGE = $script:QWENPAW_WORKER_IMAGE $config.MANAGER_COPAW_IMAGE = $script:MANAGER_COPAW_IMAGE # Write env file @@ -2745,6 +2750,7 @@ function Install-Manager { -e "AGENTTEAMS_WORKER_IMAGE=$($script:WORKER_IMAGE)" ` -e "AGENTTEAMS_COPAW_WORKER_IMAGE=$($script:COPAW_WORKER_IMAGE)" ` -e "AGENTTEAMS_HERMES_WORKER_IMAGE=$($script:HERMES_WORKER_IMAGE)" ` + $(if ($script:QWENPAW_WORKER_IMAGE) { @("-e", "AGENTTEAMS_QWENPAW_WORKER_IMAGE=$($script:QWENPAW_WORKER_IMAGE)") }) ` -e "AGENTTEAMS_DEFAULT_WORKER_RUNTIME=$($script:config.DEFAULT_WORKER_RUNTIME)" ` $(if ($config.PROXY_ALLOWED_REGISTRIES) { @("-e", "AGENTTEAMS_PROXY_ALLOWED_REGISTRIES=$($config.PROXY_ALLOWED_REGISTRIES)") }) ` --restart unless-stopped ` @@ -2866,7 +2872,11 @@ function Install-Manager { } # Pull all worker runtime images (workers may use any runtime regardless of the default) - foreach ($workerImg in @($script:WORKER_IMAGE, $script:COPAW_WORKER_IMAGE, $script:HERMES_WORKER_IMAGE)) { + $workerImages = @($script:WORKER_IMAGE, $script:COPAW_WORKER_IMAGE, $script:HERMES_WORKER_IMAGE) + if ($script:QWENPAW_WORKER_IMAGE) { + $workerImages += $script:QWENPAW_WORKER_IMAGE + } + foreach ($workerImg in $workerImages) { if ($workerImg -match $LocalImagePattern) { if (Test-OrTagLocalImage $workerImg) { Write-Log (Get-Msg "install.image.worker_exists" -f $workerImg) @@ -3136,6 +3146,10 @@ function Install-Manager { "-e", "AGENTTEAMS_PORT_MANAGER_CONSOLE=$($config.PORT_MANAGER_CONSOLE)" ) + if ($script:QWENPAW_WORKER_IMAGE) { + $ctrlArgs += @("-e", "AGENTTEAMS_QWENPAW_WORKER_IMAGE=$($script:QWENPAW_WORKER_IMAGE)") + } + if ($script:AGENTTEAMS_TIMEZONE) { $ctrlArgs += @("-e", "TZ=$($script:AGENTTEAMS_TIMEZONE)") } diff --git a/install/hiclaw-install.sh b/install/hiclaw-install.sh index c593ea008..fe28cf557 100755 --- a/install/hiclaw-install.sh +++ b/install/hiclaw-install.sh @@ -29,6 +29,7 @@ # AGENTTEAMS_INSTALL_WORKER_IMAGE Override worker image (e.g., local build) # AGENTTEAMS_INSTALL_COPAW_WORKER_IMAGE Override copaw worker image (e.g., local build) # AGENTTEAMS_INSTALL_HERMES_WORKER_IMAGE Override hermes worker image (e.g., local build) +# AGENTTEAMS_INSTALL_QWENPAW_WORKER_IMAGE Override qwenpaw worker image (e.g., local build) # AGENTTEAMS_NACOS_REGISTRY_URI Default Nacos registry URI for Worker market search/import # (default: nacos://market.agentteams.io:80/public) # AGENTTEAMS_NACOS_USERNAME Default Nacos username for nacos:// package imports (optional) @@ -1023,6 +1024,7 @@ MANAGER_COPAW_IMAGE="${AGENTTEAMS_INSTALL_MANAGER_COPAW_IMAGE:-}" WORKER_IMAGE="${AGENTTEAMS_INSTALL_WORKER_IMAGE:-}" COPAW_WORKER_IMAGE="${AGENTTEAMS_INSTALL_COPAW_WORKER_IMAGE:-}" HERMES_WORKER_IMAGE="${AGENTTEAMS_INSTALL_HERMES_WORKER_IMAGE:-}" +QWENPAW_WORKER_IMAGE="${AGENTTEAMS_INSTALL_QWENPAW_WORKER_IMAGE:-}" CONTROLLER_IMAGE="${AGENTTEAMS_INSTALL_CONTROLLER_IMAGE:-}" resolve_image_tags() { @@ -1031,6 +1033,7 @@ resolve_image_tags() { WORKER_IMAGE="${AGENTTEAMS_INSTALL_WORKER_IMAGE:-${AGENTTEAMS_REGISTRY}/higress/agentteams-worker:${AGENTTEAMS_VERSION}}" COPAW_WORKER_IMAGE="${AGENTTEAMS_INSTALL_COPAW_WORKER_IMAGE:-${AGENTTEAMS_REGISTRY}/higress/agentteams-copaw-worker:${AGENTTEAMS_VERSION}}" HERMES_WORKER_IMAGE="${AGENTTEAMS_INSTALL_HERMES_WORKER_IMAGE:-${AGENTTEAMS_REGISTRY}/higress/agentteams-hermes-worker:${AGENTTEAMS_VERSION}}" + QWENPAW_WORKER_IMAGE="${AGENTTEAMS_INSTALL_QWENPAW_WORKER_IMAGE:-}" EMBEDDED_IMAGE="${AGENTTEAMS_INSTALL_EMBEDDED_IMAGE:-${AGENTTEAMS_REGISTRY}/higress/agentteams-embedded:${AGENTTEAMS_VERSION}}" # CoPaw Worker introduced in v1.0.4; Hermes Worker introduced in v1.1.0 if [ -z "${AGENTTEAMS_INSTALL_COPAW_WORKER_IMAGE:-}" ] && _ver_lt "${AGENTTEAMS_VERSION}" "v1.0.4"; then @@ -3071,8 +3074,9 @@ AGENTTEAMS_CMS_METRICS_ENABLED=${AGENTTEAMS_CMS_METRICS_ENABLED:-false} AGENTTEAMS_WORKER_IMAGE=${WORKER_IMAGE} AGENTTEAMS_COPAW_WORKER_IMAGE=${COPAW_WORKER_IMAGE} AGENTTEAMS_HERMES_WORKER_IMAGE=${HERMES_WORKER_IMAGE} +AGENTTEAMS_QWENPAW_WORKER_IMAGE=${QWENPAW_WORKER_IMAGE} -# Default Worker runtime (openclaw | copaw | hermes) +# Default Worker runtime (openclaw | copaw | hermes | qwenpaw) AGENTTEAMS_DEFAULT_WORKER_RUNTIME=${AGENTTEAMS_DEFAULT_WORKER_RUNTIME:-copaw} # Matrix E2EE (0=disabled, 1=enabled; default: 0) @@ -3263,6 +3267,7 @@ EOF _pull_image "${WORKER_IMAGE}" "install.image.worker_exists" "install.image.pulling_worker" _pull_image "${COPAW_WORKER_IMAGE}" "install.image.worker_exists" "install.image.pulling_worker" _pull_image "${HERMES_WORKER_IMAGE}" "install.image.worker_exists" "install.image.pulling_worker" + _pull_image "${QWENPAW_WORKER_IMAGE}" "install.image.worker_exists" "install.image.pulling_worker" # --- Pre-upgrade: extract Matrix passwords from running old containers --- # Only needed when upgrading FROM old architecture (v1.0.9) TO embedded. @@ -3481,6 +3486,7 @@ CREDEOF -e "AGENTTEAMS_WORKER_IMAGE=${WORKER_IMAGE}" -e "AGENTTEAMS_COPAW_WORKER_IMAGE=${COPAW_WORKER_IMAGE}" -e "AGENTTEAMS_HERMES_WORKER_IMAGE=${HERMES_WORKER_IMAGE}" + -e "AGENTTEAMS_QWENPAW_WORKER_IMAGE=${QWENPAW_WORKER_IMAGE}" -e "AGENTTEAMS_MATRIX_DOMAIN=${_matrix_domain}" -e "AGENTTEAMS_ELEMENT_HOMESERVER_URL=http://127.0.0.1:${AGENTTEAMS_PORT_GATEWAY}" -e "AGENTTEAMS_MATRIX_URL=http://127.0.0.1:6167" @@ -3719,6 +3725,7 @@ CREDEOF -e AGENTTEAMS_WORKER_IMAGE="${WORKER_IMAGE}" \ -e AGENTTEAMS_COPAW_WORKER_IMAGE="${COPAW_WORKER_IMAGE}" \ -e AGENTTEAMS_HERMES_WORKER_IMAGE="${HERMES_WORKER_IMAGE}" \ + -e AGENTTEAMS_QWENPAW_WORKER_IMAGE="${QWENPAW_WORKER_IMAGE}" \ ${AGENTTEAMS_PROXY_ALLOWED_REGISTRIES:+-e AGENTTEAMS_PROXY_ALLOWED_REGISTRIES="${AGENTTEAMS_PROXY_ALLOWED_REGISTRIES}"} \ --restart unless-stopped \ "${_proxy_image}"