agent_autoscale_loop(ENABLE_AGENT_AUTOSCALING):初始只起 AGENT_LAUNCH_MIN_POOL 个, 按每个 run 的 PENDING 任务积压超过空闲 agent 时 top-up,上限 MAX_POOL/per-user cap。 plan_launch_specs 加 count_override/id_start 支持非碰撞增补。trivial run 用少量 agent, 重 run 自动扩展。fail-soft,backend=none 时 no-op。 manifest:MIN/POOL 16→2 + ENABLE_AGENT_AUTOSCALING=1(初始小、按需长)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
179 lines
8.2 KiB
YAML
179 lines
8.2 KiB
YAML
# heicode-test 云部署清单(SWE-bench 涌现评测 · 生成段)—— 改自 orchestrator-local.yaml。
|
||
# 与本地差异:ACR 镜像(非 local)、Redis 集群(REDIS_URL+REDIS_CLUSTER)、隔离沙箱双门控开、
|
||
# SWARM_EMIT_PATCH 产 diff(不落 main)、Cosmos/Blob 用测试专属 database/container 与生产区分、
|
||
# Service=LoadBalancer 公网裸入(本地测试式,无鉴权)。
|
||
# 所有凭据走 Secret(secretKeyRef),manifest 内零明文。创建 Secret 见文件末尾注释(你自行执行)。
|
||
apiVersion: v1
|
||
kind: Service
|
||
metadata:
|
||
name: orchestrator-public
|
||
namespace: swarm-system
|
||
labels: { app: orchestrator }
|
||
spec:
|
||
type: LoadBalancer # 公网入口(无鉴权,仅限隔离测试集群);建议加 loadBalancerSourceRanges 限 IP
|
||
ports:
|
||
- port: 80
|
||
targetPort: 8000
|
||
name: http
|
||
selector: { app: orchestrator }
|
||
---
|
||
apiVersion: v1
|
||
kind: Service
|
||
metadata:
|
||
name: orchestrator-service # 集群内 WS 入口(agent pod 连这个),保持与 local 同名
|
||
namespace: swarm-system
|
||
labels: { app: orchestrator }
|
||
spec:
|
||
type: ClusterIP
|
||
ports:
|
||
- port: 8000
|
||
targetPort: 8000
|
||
name: http
|
||
selector: { app: orchestrator }
|
||
---
|
||
apiVersion: apps/v1
|
||
kind: Deployment
|
||
metadata:
|
||
name: orchestrator
|
||
namespace: swarm-system
|
||
labels: { app: orchestrator }
|
||
spec:
|
||
replicas: 1
|
||
selector:
|
||
matchLabels: { app: orchestrator }
|
||
template:
|
||
metadata:
|
||
labels: { app: orchestrator }
|
||
spec:
|
||
serviceAccountName: swarm-orchestrator
|
||
# ACR 拉取:AKS 已 attach ACR 时无需此项;否则用 imagePullSecret。
|
||
# imagePullSecrets: [{ name: acr-pull }]
|
||
containers:
|
||
- name: orchestrator
|
||
image: heicodetest.azurecr.io/swarm-orchestrator:heicode-test # ← 填 ACR
|
||
imagePullPolicy: Always
|
||
ports:
|
||
- containerPort: 8000
|
||
name: http
|
||
env:
|
||
# --- Redis 集群(权威存储,非 FAKE)---
|
||
# REDIS_URL 形如 rediss://:<password>@<host>:<port>/0;含密码 → 走 Secret。
|
||
- name: REDIS_URL
|
||
valueFrom:
|
||
secretKeyRef: { name: swarm-redis, key: REDIS_URL }
|
||
- name: REDIS_CLUSTER
|
||
value: "1" # Azure Redis Enterprise OSSCluster 协议需要
|
||
- name: LOG_LEVEL
|
||
value: "INFO"
|
||
# --- agent pod 启动(ACR 镜像)---
|
||
- name: AGENT_LAUNCH_BACKEND
|
||
value: "kubernetes"
|
||
- name: AGENT_POD_IMAGE
|
||
value: "heicodetest.azurecr.io/swarm-agent:heicode-test" # ← 填 ACR
|
||
- name: AGENT_POD_NAMESPACE
|
||
value: "swarm-system"
|
||
- name: ORCHESTRATOR_PUBLIC_URL
|
||
value: "ws://orchestrator-service.swarm-system.svc.cluster.local:8000"
|
||
# --- 模型网关(OpenAI 兼容)= 你的叮嘱:qwen3.7-max @ api.heicode.cc ---
|
||
- name: AGENT_OPENAI_API_BASE
|
||
value: "https://api.heicode.cc/v1"
|
||
- name: OPENAI_API_BASE
|
||
value: "https://api.heicode.cc/v1"
|
||
- name: OPENAI_MODEL
|
||
value: "qwen3.7-max"
|
||
- name: MASTER_REVIEW_MODEL # 聚合器整合也用同模型(锁模型)
|
||
value: "qwen3.7-max"
|
||
- name: OPENAI_API_KEY
|
||
valueFrom:
|
||
secretKeyRef: { name: swarm-model-key, key: OPENAI_API_KEY }
|
||
# Jina MCP key — launcher 透传给 agent pod(SENSITIVE → per-swarm Secret),
|
||
# agent 用它连 mcp.jina.ai 取 search_web/read_url 工具做 function-calling。
|
||
- name: JINA_API_KEY
|
||
valueFrom:
|
||
secretKeyRef: { name: swarm-jina-key, key: JINA_API_KEY }
|
||
# --- agent 池窗口(弹性)---
|
||
# 初始只起 2 个;autoscale loop 按 PENDING 积压按需扩到 MAX/per-user 上限。
|
||
- name: ENABLE_AGENT_AUTOSCALING
|
||
value: "1"
|
||
- name: AGENT_LAUNCH_MIN_POOL
|
||
value: "2"
|
||
- name: AGENT_LAUNCH_POOL_SIZE
|
||
value: "2"
|
||
- name: AGENT_LAUNCH_MAX_POOL
|
||
value: "64"
|
||
- name: MAX_AGENTS_PER_USER
|
||
value: "64"
|
||
- name: AGENT_PROPOSAL_BUDGET
|
||
value: "12"
|
||
# plan/分解 token 上限:降到 32768 避开模型网关 >32768 → 400(launcher 透传给 agent pod)
|
||
- name: AGENT_PLAN_MAX_TOKENS
|
||
value: "32768"
|
||
# 协作聚合质量门:pass_rate<70 打回迭代(对齐本地已验证收敛行为;未设=门关=不打回)
|
||
- name: AGGREGATE_ACCEPTANCE_THRESHOLD
|
||
value: "70"
|
||
# SWE-bench repo clone 凭据(dev secret 解析:grant.secret_ref 末段 swe_git_1 → 读此 env)
|
||
# JSON {"git_username":...,"git_password":...},走 Secret,绝不明文。
|
||
- name: HEICODE_SECRET_swe_git_1
|
||
valueFrom:
|
||
secretKeyRef: { name: swarm-git-grant, key: HEICODE_SECRET_swe_git_1 }
|
||
# --- 隔离沙箱双门控(heicode-test 已确认隔离集群)---
|
||
- name: ENABLE_QUALITY_EVAL
|
||
value: "1"
|
||
- name: HEICODE_SANDBOX_ISOLATED
|
||
value: "1"
|
||
# 代码沙箱后端:daytona = 在 Daytona 云沙箱执行模型生成代码(不在本 Pod 跑,隔离更强);
|
||
# 出错 fail-soft 回退 Pod 内 subprocess。双门控不变。
|
||
- name: SANDBOX_BACKEND
|
||
value: "daytona"
|
||
- name: DAYTONA_API_URL
|
||
value: "https://app.daytona.io/api"
|
||
- name: DAYTONA_API_KEY
|
||
valueFrom:
|
||
secretKeyRef: { name: swarm-daytona-key, key: DAYTONA_API_KEY }
|
||
# --- SWE-bench 评测:产 unified diff,不 push 到 main ---
|
||
- name: SWARM_EMIT_PATCH
|
||
value: "1"
|
||
# --- 采集遥测:与生产 Cosmos/Blob 共用底座,但用测试专属 database/container 区分 ---
|
||
- name: BENCHMARK_COSMOS_DATABASE
|
||
value: "benchmark-heicodetest" # 区分键(生产默认 benchmark)
|
||
- name: BENCHMARK_COSMOS_CONTAINER
|
||
value: "selfcert-heicodetest" # 区分键(生产默认 selfcert)
|
||
- name: BENCHMARK_BLOB_CONTAINER
|
||
value: "selfcert-heicodetest" # 区分键(生产默认 benchmark-selfcert)
|
||
- name: BENCHMARK_COSMOS_CONNECTION_STRING
|
||
valueFrom:
|
||
secretKeyRef: { name: swarm-telemetry, key: COSMOS_CONNECTION_STRING, optional: true }
|
||
- name: AZURE_STORAGE_CONNECTION_STRING
|
||
valueFrom:
|
||
secretKeyRef: { name: swarm-telemetry, key: AZURE_STORAGE_CONNECTION_STRING, optional: true }
|
||
resources:
|
||
requests: { memory: "512Mi", cpu: "300m" }
|
||
limits: { memory: "1Gi", cpu: "1" }
|
||
livenessProbe:
|
||
httpGet: { path: /health, port: 8000 }
|
||
initialDelaySeconds: 20
|
||
periodSeconds: 10
|
||
timeoutSeconds: 5
|
||
failureThreshold: 3
|
||
readinessProbe:
|
||
httpGet: { path: /health, port: 8000 }
|
||
initialDelaySeconds: 8
|
||
periodSeconds: 5
|
||
timeoutSeconds: 3
|
||
failureThreshold: 3
|
||
# ---------------------------------------------------------------------------
|
||
# 创建 Secret(你自行执行,凭据不进任何文件/日志;用 ! 前缀在会话里跑):
|
||
# kubectl -n swarm-system create secret generic swarm-model-key \
|
||
# --from-literal=OPENAI_API_KEY=<模型KEY>
|
||
# kubectl -n swarm-system create secret generic swarm-redis \
|
||
# --from-literal=REDIS_URL='rediss://:<password>@<host>:<port>/0'
|
||
# # 遥测(可选,不重要时可跳过;跳过则 export 自动 no-op):
|
||
# kubectl -n swarm-system create secret generic swarm-telemetry \
|
||
# --from-literal=COSMOS_CONNECTION_STRING='<...>' \
|
||
# --from-literal=AZURE_STORAGE_CONNECTION_STRING='<...>'
|
||
# 部署:
|
||
# kubectl create -f k8s/rbac/
|
||
# kubectl create -f k8s/orchestrator-heicode-test.yaml
|
||
# kubectl -n swarm-system get svc orchestrator-public -w # 等 EXTERNAL-IP
|
||
# ---------------------------------------------------------------------------
|