Files
Agent-System/docker-compose.dev.yml
T
weichen e9c0281404 feat(ctxmgr): wildcard session allowlist for semantic replace rollout
- SEMANTIC_SUMMARY_REPLACE_SESSIONS supports * (all sessions, present and
  future), mirroring INTENT_PLAN_PROJECT_ALLOWLIST; empty allowlist still
  replaces nothing (fail-closed defense in depth unchanged)
- declare SEMANTIC_SUMMARY_REPLACE(_SESSIONS) in dev/test/main compose app
  env (stale Wave2 "REPLACE unwired" comment fixed); extend A-4 declaration
  test; .env.example key docs updated
- sysadmin feature catalog: SESSIONS description + REPLACE reason note *

Prepares dev degraded-flags enable (task degraded-flags-enable-2026-09-26-r4):
user-authorized all-session replace, plan tier confirm, shadow summary, PI
change-report narrative; env ops and runtime verification follow.
2026-09-26 02:29:29 +00:00

222 lines
9.1 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# =============================================================================
# 开发环境编排 (Dev Branch Environment)
# 特性:
# 1. 独占系统业务库 (5433:5432) 与专属数据卷
# 2. 独占对话记录、工作区及日志目录 (./data/dev)
# 3. 共享连接知识库服务 (shuimu-kb-shared:5432)
# =============================================================================
name: agent-dev
services:
system-db:
image: pgvector/pgvector:pg16
container_name: shuimu-context-pg-dev
command: ["postgres", "-c", "shared_buffers=256MB", "-c", "max_connections=100"]
environment:
POSTGRES_USER: ${CONTEXT_DB_USER:-${SYSTEM_DB_USER:-app}}
POSTGRES_PASSWORD: ${CONTEXT_DB_PASSWORD:-${SYSTEM_DB_PASSWORD:-dev_secret_db_pass}}
POSTGRES_DB: ${CONTEXT_DB_NAME:-${SYSTEM_DB_NAME:-agent_system_dev}}
ports:
- "127.0.0.1:${CONTEXT_DB_PUBLISH_PORT:-${SYSTEM_DB_PUBLISH_PORT:-5433}}:5432"
volumes:
- dev-context-pgdata:/var/lib/postgresql/data
# T20-I4: 三环境统一仅初始化扩展;表结构一律走 app goose 迁移(空卷顺序: 扩展→迁移)
- ./deploy/postgres/extensions_init.sql:/docker-entrypoint-initdb.d/01-extensions.sql:ro
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${CONTEXT_DB_USER:-${SYSTEM_DB_USER:-app}} -d ${CONTEXT_DB_NAME:-${SYSTEM_DB_NAME:-agent_system_dev}}"]
interval: 5s
timeout: 5s
retries: 20
restart: unless-stopped
networks:
- dev-net
pi-agent:
build:
context: .
dockerfile: deploy/pi-agent/Dockerfile
image: shuimu-pi-agent:dev
container_name: shuimu-pi-agent-dev
environment:
PORT: 18865
DATA_DIR: /app/data/workspaces
MINIMAX_ENDPOINT_URL: ${MINIMAX_ENDPOINT_URL:-https://api.minimaxi.com/v1}
MINIMAX_API_KEY: ${MINIMAX_API_KEY:-}
# dev iterates on highspeed; test/main pin MiniMax-M3. Do not align without a promotion decision.
MINIMAX_MODEL_ID: ${MINIMAX_MODEL_ID:-MiniMax-M2.7-highspeed}
MINIMAX_API_TYPE: ${MINIMAX_API_TYPE:-openai-compatible}
MINIMAX_PROVIDER: minimax
TAVILY_API_KEYS: ${TAVILY_API_KEYS:-}
RUNNER_AUTH_TOKEN: ${RUNNER_AUTH_TOKEN:-}
ports:
- "127.0.0.1:${PI_AGENT_RUNNER_PORT:-18865}:18865"
volumes:
- ./data/dev/workspaces:/app/data/workspaces
- ./data/dev/agent_sessions:/root/.pi/agent/sessions
- ./deploy/pi-agent/runner.mjs:/app/runner.mjs:ro
- ./deploy/pi-agent/pi-args.mjs:/app/pi-args.mjs:ro
- ./deploy/pi-agent/result-v1.mjs:/app/result-v1.mjs:ro
- ./deploy/pi-agent/extensions:/app/extensions:ro
tmpfs:
- /tmp
healthcheck:
test: ["CMD-SHELL", "curl -f http://127.0.0.1:18865/health || exit 1"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
networks:
- dev-net
app:
# T20-I1: 资源上限(防 OOM 连坐;app 限额独立于 runner)
mem_limit: 1536m
mem_reservation: 768m
cpus: 1.5
build:
context: .
dockerfile: deploy/app/Dockerfile
args:
GOPROXY: ${GO_PROXY:-https://proxy.golang.org,direct}
container_name: shuimu-agent-app-dev
depends_on:
system-db:
condition: service_healthy
# T20-B7:drain 窗口对齐 SHUTDOWN_DRAIN_TIMEOUT(默认 min(AGENT_TIMEOUT,35m)+30s)
stop_grace_period: ${SHUTDOWN_DRAIN_GRACE:-35m30s}
environment:
ENV: dev
HTTP_ADDR: ":${HTTP_PORT:-8080}"
HTTP_PORT: "${HTTP_PORT:-8080}"
HTTP_HOST: "0.0.0.0"
AGENT_BACKEND: ${AGENT_BACKEND:-pi-native}
AGENTX_API_BASE: ${MINIMAX_ENDPOINT_URL:-https://api.minimaxi.com/v1}
AGENTX_API_KEY: ${MINIMAX_API_KEY:-}
AGENTX_MODEL: ${MINIMAX_MODEL_ID:-MiniMax-M2.7-highspeed}
AGENT_TIMEOUT: ${AGENT_TIMEOUT:-30m}
MAX_CONCURRENT_AGENTS: ${MAX_CONCURRENT_AGENTS:-8}
DATA_DIR: /app/data
# 独占业务与对话库
APP_DB_DSN: postgres://${SYSTEM_DB_USER:-app}:${SYSTEM_DB_PASSWORD:-dev_secret_db_pass}@system-db:5432/${SYSTEM_DB_NAME:-agent_system_dev}?sslmode=disable
# 共享知识库
POSTGRES_SHARED_KB_DSN: postgres://${KB_DB_USER:-regkb}:${KB_DB_PASSWORD:?KB_DB_PASSWORD is required}@shuimu-kb-shared:5432/${KB_DB_NAME:-regulations}?sslmode=disable
PI_AGENT_RUNNER_URL: http://pi-agent:18865
PI_AGENT_RUNNER_AUTH_TOKEN: ${RUNNER_AUTH_TOKEN:-}
PI_AGENT_PROVIDER: ${PI_AGENT_PROVIDER:-minimax}
PI_AGENT_MODEL: ${PI_AGENT_MODEL:-MiniMax-M2.7-highspeed}
RUNNER_AUTH_TOKEN: ${RUNNER_AUTH_TOKEN:-}
EMBEDDING_ENDPOINT_URL: ${EMBEDDING_ENDPOINT_URL:-}
EMBEDDING_MODEL: ${EMBEDDING_MODEL:-bge-m3}
EMBEDDING_API_KEY: ${EMBEDDING_API_KEY:-}
RERANKER_ENDPOINT_URL: ${RERANKER_ENDPOINT_URL:-}
RERANKER_MODEL: ${RERANKER_MODEL:-bge-reranker-v2-m3-free}
RERANKER_API_KEY: ${RERANKER_API_KEY:-}
MINERU_ENDPOINT_URL: ${MINERU_ENDPOINT_URL:-https://mineru.net}
MINERU_API_KEY: ${MINERU_API_KEY:-}
MINERU_MODEL_VERSION: ${MINERU_MODEL_VERSION:-vlm}
MINERU_LANGUAGE: ${MINERU_LANGUAGE:-ch}
MINERU_TIMEOUT: ${MINERU_TIMEOUT:-90s}
MATERIAL_FULLTEXT_MAX_BYTES: ${MATERIAL_FULLTEXT_MAX_BYTES:-61440}
MATERIAL_RAG_TOP_K: ${MATERIAL_RAG_TOP_K:-8}
ADMIN_USERNAME: ${ADMIN_USERNAME:-admin}
ADMIN_PASSWORD: ${ADMIN_PASSWORD:-admin-secret-password-123}
AUTH_REGISTRATION_ENABLED: ${AUTH_REGISTRATION_ENABLED:-true}
AUTH_REQUIRE_APPROVAL: ${AUTH_REQUIRE_APPROVAL:-false}
CORS_ALLOWED_ORIGINS: ${CORS_ALLOWED_ORIGINS:-}
ALLOW_IN_MEMORY: ${ALLOW_IN_MEMORY:-false}
VAULT_STATE_ROOT: /app/vault
VAULT_STORAGE_IDENTITY: ${VAULT_STORAGE_IDENTITY:-dev-vault}
VAULT_MASTER_KEY: ${VAULT_MASTER_KEY:-}
FAV_DEGRADED_READ: ${FAV_DEGRADED_READ:-false}
CACHE_ENABLED: ${CACHE_ENABLED:-true}
INTENT_V2_SHADOW: ${INTENT_V2_SHADOW:-false}
JEV_DECIDE_MODE: ${JEV_DECIDE_MODE:-off}
JEV_BASE_URL: ${JEV_BASE_URL:-}
JEV_API_KEY: ${JEV_API_KEY:-}
INTENT_V2_DECISION: ${INTENT_V2_DECISION:-false}
INTENT_V2_DECISION_TIER: ${INTENT_V2_DECISION_TIER:-none}
WORKFLOW_INTENTS_ENABLED: ${WORKFLOW_INTENTS_ENABLED:-true}
MULTI_INTENT_ENABLED: ${MULTI_INTENT_ENABLED:-true}
MULTI_INTENT_PLAN_TIER: ${MULTI_INTENT_PLAN_TIER:-legacy}
INTENT_PLAN_PROJECT_ALLOWLIST: ${INTENT_PLAN_PROJECT_ALLOWLIST:-}
MULTI_INTENT_U9_SEGMENT: ${MULTI_INTENT_U9_SEGMENT:-false}
MULTI_INTENT_U10_MUTATE: ${MULTI_INTENT_U10_MUTATE:-false}
MULTI_INTENT_U11_DOCGOV: ${MULTI_INTENT_U11_DOCGOV:-false}
MULTI_INTENT_U12_RUN_CONTROL: ${MULTI_INTENT_U12_RUN_CONTROL:-false}
WORKFLOW_SCOPE_MODE: ${WORKFLOW_SCOPE_MODE:-strict}
# Semantic summary: shadow generation + fail-closed REPLACE gray release.
# REPLACE needs master + session allowlist (empty = none; * = all sessions).
SEMANTIC_SUMMARY_SHADOW: ${SEMANTIC_SUMMARY_SHADOW:-false}
SEMANTIC_SUMMARY_REPLACE: ${SEMANTIC_SUMMARY_REPLACE:-false}
SEMANTIC_SUMMARY_REPLACE_SESSIONS: ${SEMANTIC_SUMMARY_REPLACE_SESSIONS:-}
PI_CHANGE_REPORT_NARRATIVE: ${PI_CHANGE_REPORT_NARRATIVE:-false}
# FAV U7: keep publisher off until separate approval (FAV_DEGRADED_READ declared above)
FAV_PUBLISHER_ENABLED: ${FAV_PUBLISHER_ENABLED:-false}
ports:
- "${APP_PUBLISH_HOST:-127.0.0.1}:${HTTP_PORT:-8080}:${HTTP_PORT:-8080}"
healthcheck:
test: ["CMD", "curl", "-fsS", "http://127.0.0.1:${HTTP_PORT:-8080}/api/v1/ready"]
interval: 10s
timeout: 5s
retries: 6
start_period: 20s
volumes:
# 独占对话记录与环境数据
- ./data/dev:/app/data
- ./data/vault/dev:/app/vault
- dev-aux-sqlite-data:/var/lib/feishu
- ./.regulations:/app/.regulations:ro
restart: unless-stopped
networks:
- dev-net
- shared-net
events:
# T20-I1: 资源上限(防 OOM 连坐;events 限额独立于 runner)
mem_limit: 768m
mem_reservation: 384m
cpus: 1.0
build:
context: .
dockerfile: deploy/app/Dockerfile
args:
GOPROXY: ${GO_PROXY:-https://proxy.golang.org,direct}
container_name: shuimu-agent-events-dev
entrypoint: ["/app/events"]
command: ["-env", "/dev/null"]
depends_on:
system-db:
condition: service_healthy
environment:
ENV: dev
HTTP_HOST: "0.0.0.0"
HTTP_PORT: "${EVENTS_HTTP_PORT:-8088}"
EVENTS_HTTP_PORT: "${EVENTS_HTTP_PORT:-8088}"
DATA_DIR: /app/data
APP_DB_DSN: postgres://${SYSTEM_DB_USER:-app}:${SYSTEM_DB_PASSWORD:-dev_secret_db_pass}@system-db:5432/${SYSTEM_DB_NAME:-agent_system_dev}?sslmode=disable
ports:
- "127.0.0.1:${EVENTS_HTTP_PORT:-8088}:${EVENTS_HTTP_PORT:-8088}"
healthcheck:
test: ["CMD", "curl", "-fsS", "http://127.0.0.1:${EVENTS_HTTP_PORT:-8088}/health"]
interval: 10s
timeout: 5s
retries: 6
start_period: 15s
restart: unless-stopped
networks:
- dev-net
networks:
dev-net:
name: chat-agent-dev-net
driver: bridge
shared-net:
name: chat-agent-shared-net
external: true
volumes:
dev-context-pgdata:
name: agent-dev-context-pgdata
dev-aux-sqlite-data:
name: agent-dev-aux-sqlite-data