1 line
25 KiB
JSON
1 line
25 KiB
JSON
{"repo": "benjamindaoson/haole", "files": {"deploy/production/docker-compose.celery.yml": {"36ff97dbee1e4a575d42bb5c54ff20a06abe1fbb": {"t": 1785747411.1404712, "n": 8027, "h": "99ee36ecf06265f6", "c": "# 把 celery worker 加进 dev 栈,跟主 docker-compose 一起起\n# 用法:\n# mock LLM: docker compose -f docker-compose.yml -f docker-compose.mock.yml -f docker-compose.celery.yml up -d\n# real LLM: docker compose -f docker-compose.yml -f docker-compose.celery.yml up -d\n\nname: haole-dev\n\n# 公共 agent 环境变量块(YAML anchor,各 agent 服务 <<: *agent-env 继承)\nx-agent-env: &agent-env\n REDIS_URL: redis://redis:6379/0\n LITELLM_URL: ${LITELLM_URL:-http://litellm-mock:4010}\n LITELLM_API_KEY: ${LITELLM_API_KEY:-sk-mock-1234}\n LITELLM_MOCK: ${LITELLM_MOCK:-true}\n STEP_PERSONA_MAX_BUDGET_TOKENS: ${STEP_PERSONA_MAX_BUDGET_TOKENS:-8000}\n AGENT_REACT_MAX_STEPS: ${AGENT_REACT_MAX_STEPS:-6}\n OPENROUTER_API_BASE: ${OPENROUTER_API_BASE:-https://openrouter.ai/api/v1}\n OPENROUTER_API_KEY: ${OPENROUTER_API_KEY:-}\n DEEPSEEK_API_BASE: ${DEEPSEEK_API_BASE:-https://api.deepseek.com/v1}\n DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}\n SILICONFLOW_API_BASE: ${SILICONFLOW_API_BASE:-https://api.siliconflow.cn/v1}\n SILICONFLOW_API_KEY: ${SILICONFLOW_API_KEY:-}\n OSS_ENDPOINT: http://minio:9000\n OSS_ACCESS_KEY: ${OSS_ACCESS_KEY:-minioadmin}\n OSS_SECRET_KEY: ${OSS_SECRET_KEY:-minioadmin}\n OSS_BUCKET: ${OSS_BUCKET:-haole-dev}\n MCP_OSS_URL: http://mcp-oss:7006\n MCP_SEARCH_URL: http://mcp-search:7001\n MCP_IMAGE_TOOLS_URL: http://mcp-image-tools:7002\n MCP_DOCUMENT_TOOLS_URL: http://mcp-document-tools:7005\n MCP_AUDIO_TOOLS_URL: http://mcp-audio-tools:7004\n MCP_VIDEO_TOOLS_URL: http://mcp-video-tools:7003\n AGENT_MAX_RETRIES: \"2\"\n AGENT_HEARTBEAT_INTERVAL: \"20\"\n\nservices:\n # ── Agent 1(文字师)— 消费 agent_tasks:text ──\n agent-1:\n build:\n context: ../..\n dockerfile: deploy/production/Dockerfile.agent\n args:\n AGENT_KIND: text\n image: haole-agent-text:latest\n container_name: haole-agent-1\n restart: unless-stopped\n depends_on:\n redis:\n condition: service_healthy\n minio:\n condition: service_healthy\n environment:\n <<: *agent-env\n AGENT_KIND: text\n\n # ── Agent 2(文档师)— 消费 agent_tasks:document ──\n agent-2:\n build:\n context: ../..\n dockerfile: deploy/production/Dockerfile.agent\n args:\n AGENT_KIND: document\n image: haole-agent-document:latest\n container_name: haole-agent-2\n restart: unless-stopped\n depends_on:\n redis:\n condition: service_healthy\n minio:\n condition: service_healthy\n environment:\n <<: *agent-env\n AGENT_KIND: document\n\n # ── Agent 3(设计师)— 消费 agent_tasks:image ──\n agent-3:\n build:\n context: ../..\n dockerfile: deploy/production/Dockerfile.agent\n args:\n AGENT_KIND: image\n image: haole-agent-image:latest\n container_name: haole-agent-3\n restart: unless-stopped\n depends_on:\n redis:\n condition: service_healthy\n minio:\n condition: service_healthy\n environment:\n <<: *agent-env\n AGENT_KIND: image\n\n celery-worker-video:\n build:\n context: ../..\n dockerfile: deploy/production/Dockerfile.celery\n image: haole-celery-worker:latest\n container_name: haole-celery-worker-video\n restart: unless-stopped\n depends_on:\n redis:\n condition: service_healthy\n minio:\n condition: service_healthy\n environment:\n CELERY_BROKER_URL: redis://redis:6379/1\n CELERY_RESULT_BACKEND: redis://redis:6379/2\n REDIS_URL: redis://redis:6379/0\n OSS_ENDPOINT: http://minio:9000\n OSS_ACCESS_KEY: ${OSS_ACCESS_KEY:-minioadmin}\n OSS_SECRET_KEY: ${OSS_SECRET_KEY:-minioadmin}\n OSS_BUCKET: ${OSS_BUCKET:-haole-dev}\n MCP_AUDIO_TOOLS_URL: http://mcp-audio-tools:7004\n MCP_VIDEO_TOOLS_URL: http://mcp-video-tools:7003\n command: [\"celery\", \"-A\", \"agents.av_agent.celery_tasks.video_workflow\", \"worker\",\n \"--loglevel=info\", \"--queues=video\", \"--concurrency=2\"]\n\n # 可选:Flower 监控面板\n flower:\n image: mher/flower:2.0\n container_name: haole-flower\n restart: unless-stopped\n depends_on:\n - redis\n environment:\n CELERY_BROKER_URL: redis://redis:6379/1\n FLOWER_PORT: \"5555\"\n ports:\n - \"5555:5555\"\n command: [\"celery\", \"--broker=redis://redis:6379/1\", \"flower\",\n \"--port=5555\", \"--persistent=True\"]\n\n mcp-search:\n build:\n context: ../..\n dockerfile: deploy/production/Dockerfile.mcp\n args:\n MCP_KIND: search\n image: haole-mcp-search:latest\n container_name: haole-mcp-search\n restart: unless-stopped\n environment:\n MCP_KIND: search\n TAVILY_API_KEY: ${TAVILY_API_KEY:-}\n ports:\n - \"7001:7001\"\n\n mcp-image-tools:\n build:\n context: ../..\n dockerfile: deploy/production/Dockerfile.mcp\n args:\n MCP_KIND: image_tools\n image: haole-mcp-image-tools:latest\n container_name: haole-mcp-image-tools\n restart: unless-stopped\n depends_on:\n minio:\n condition: service_healthy\n environment:\n MCP_KIND: image_tools\n OSS_ENDPOINT: http://minio:9000\n OSS_ACCESS_KEY: ${OSS_ACCESS_KEY:-minioadmin}\n OSS_SECRET_KEY: ${OSS_SECRET_KEY:-minioadmin}\n OSS_BUCKET: ${OSS_BUCKET:-haole-dev}\n ports:\n - \"7002:7002\"\n\n mcp-document-tools:\n build:\n context: ../..\n dockerfile: deploy/production/Dockerfile.mcp\n args:\n MCP_KIND: document_tools\n image: haole-mcp-document-tools:latest\n container_name: haole-mcp-document-tools\n restart: unless-stopped\n depends_on:\n minio:\n condition: service_healthy\n environment:\n MCP_KIND: document_tools\n OSS_ENDPOINT: http://minio:9000\n OSS_ACCESS_KEY: ${OSS_ACCESS_KEY:-minioadmin}\n OSS_SECRET_KEY: ${OSS_SECRET_KEY:-minioadmin}\n OSS_BUCKET: ${OSS_BUCKET:-haole-dev}\n ports:\n - \"7005:7005\"\n\n mcp-oss:\n build:\n context: ../..\n dockerfile: deploy/production/Dockerfile.mcp\n args:\n MCP_KIND: oss\n image: haole-mcp-oss:latest\n container_name: haole-mcp-oss\n restart: unless-stopped\n depends_on:\n minio:\n condition: service_healthy\n environment:\n MCP_KIND: oss\n OSS_ENDPOINT: http://minio:9000\n OSS_ACCESS_KEY: ${OSS_ACCESS_KEY:-minioadmin}\n OSS_SECRET_KEY: ${OSS_SECRET_KEY:-minioadmin}\n OSS_BUCKET: ${OSS_BUCKET:-haole-dev}\n ports:\n - \"7006:7006\"\n\n # mcp-video-tools 也需要 ffmpeg/MoviePy(因为它执行真实 compose),所以也用 celery 镜像\n mcp-video-tools:\n image: haole-celery-worker:latest\n container_name: haole-mcp-video-tools\n restart: unless-stopped\n depends_on:\n minio:\n condition: service_healthy\n environment:\n OSS_ENDPOINT: http://minio:9000\n OSS_ACCESS_KEY: ${OSS_ACCESS_KEY:-minioadmin}\n OSS_SECRET_KEY: ${OSS_SECRET_KEY:-minioadmin}\n OSS_BUCKET: ${OSS_BUCKET:-haole-dev}\n ports:\n - \"7003:7003\"\n # 用 fastapi 而不是 celery worker\n command: [\"uvicorn\", \"mcp_servers.video_tools.server:app\",\n \"--host\", \"0.0.0.0\", \"--port\", \"7003\"]\n\n mcp-audio-tools:\n image: haole-celery-worker:latest\n container_name: haole-mcp-audio-tools\n restart: unless-stopped\n depends_on:\n minio:\n condition: service_healthy\n environment:\n OSS_ENDPOINT: http://minio:9000\n OSS_ACCESS_KEY: ${OSS_ACCESS_KEY:-minioadmin}\n OSS_SECRET_KEY: ${OSS_SECRET_KEY:-minioadmin}\n OSS_BUCKET: ${OSS_BUCKET:-haole-dev}\n LITELLM_URL: ${LITELLM_URL:-http://litellm-mock:4010}\n LITELLM_API_KEY: ${LITELLM_API_KEY:-sk-mock-1234}\n LITELLM_MOCK: ${LITELLM_MOCK:-true}\n OPENROUTER_API_BASE: ${OPENROUTER_API_BASE:-https://openrouter.ai/api/v1}\n OPENROUTER_API_KEY: ${OPENROUTER_API_KEY:-}\n DEEPSEEK_API_BASE: ${DEEPSEEK_API_BASE:-https://api.deepseek.com/v1}\n DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}\n SILICONFLOW_API_BASE: ${SILICONFLOW_API_BASE:-https://api.siliconflow.cn/v1}\n SILICONFLOW_API_KEY: ${SILICONFLOW_API_KEY:-}\n ports:\n - \"7004:7004\"\n command: [\"uvicorn\", \"mcp_servers.audio_tools.server:app\",\n \"--host\", \"0.0.0.0\", \"--port\", \"7004\"]\n"}, "509176337960403dba7bfc13dc6f8787d9c5df1e": {"t": 1785773127.5132537, "n": 8027, "h": "99ee36ecf06265f6", "c": "# 把 celery worker 加进 dev 栈,跟主 docker-compose 一起起\n# 用法:\n# mock LLM: docker compose -f docker-compose.yml -f docker-compose.mock.yml -f docker-compose.celery.yml up -d\n# real LLM: docker compose -f docker-compose.yml -f docker-compose.celery.yml up -d\n\nname: haole-dev\n\n# 公共 agent 环境变量块(YAML anchor,各 agent 服务 <<: *agent-env 继承)\nx-agent-env: &agent-env\n REDIS_URL: redis://redis:6379/0\n LITELLM_URL: ${LITELLM_URL:-http://litellm-mock:4010}\n LITELLM_API_KEY: ${LITELLM_API_KEY:-sk-mock-1234}\n LITELLM_MOCK: ${LITELLM_MOCK:-true}\n STEP_PERSONA_MAX_BUDGET_TOKENS: ${STEP_PERSONA_MAX_BUDGET_TOKENS:-8000}\n AGENT_REACT_MAX_STEPS: ${AGENT_REACT_MAX_STEPS:-6}\n OPENROUTER_API_BASE: ${OPENROUTER_API_BASE:-https://openrouter.ai/api/v1}\n OPENROUTER_API_KEY: ${OPENROUTER_API_KEY:-}\n DEEPSEEK_API_BASE: ${DEEPSEEK_API_BASE:-https://api.deepseek.com/v1}\n DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}\n SILICONFLOW_API_BASE: ${SILICONFLOW_API_BASE:-https://api.siliconflow.cn/v1}\n SILICONFLOW_API_KEY: ${SILICONFLOW_API_KEY:-}\n OSS_ENDPOINT: http://minio:9000\n OSS_ACCESS_KEY: ${OSS_ACCESS_KEY:-minioadmin}\n OSS_SECRET_KEY: ${OSS_SECRET_KEY:-minioadmin}\n OSS_BUCKET: ${OSS_BUCKET:-haole-dev}\n MCP_OSS_URL: http://mcp-oss:7006\n MCP_SEARCH_URL: http://mcp-search:7001\n MCP_IMAGE_TOOLS_URL: http://mcp-image-tools:7002\n MCP_DOCUMENT_TOOLS_URL: http://mcp-document-tools:7005\n MCP_AUDIO_TOOLS_URL: http://mcp-audio-tools:7004\n MCP_VIDEO_TOOLS_URL: http://mcp-video-tools:7003\n AGENT_MAX_RETRIES: \"2\"\n AGENT_HEARTBEAT_INTERVAL: \"20\"\n\nservices:\n # ── Agent 1(文字师)— 消费 agent_tasks:text ──\n agent-1:\n build:\n context: ../..\n dockerfile: deploy/production/Dockerfile.agent\n args:\n AGENT_KIND: text\n image: haole-agent-text:latest\n container_name: haole-agent-1\n restart: unless-stopped\n depends_on:\n redis:\n condition: service_healthy\n minio:\n condition: service_healthy\n environment:\n <<: *agent-env\n AGENT_KIND: text\n\n # ── Agent 2(文档师)— 消费 agent_tasks:document ──\n agent-2:\n build:\n context: ../..\n dockerfile: deploy/production/Dockerfile.agent\n args:\n AGENT_KIND: document\n image: haole-agent-document:latest\n container_name: haole-agent-2\n restart: unless-stopped\n depends_on:\n redis:\n condition: service_healthy\n minio:\n condition: service_healthy\n environment:\n <<: *agent-env\n AGENT_KIND: document\n\n # ── Agent 3(设计师)— 消费 agent_tasks:image ──\n agent-3:\n build:\n context: ../..\n dockerfile: deploy/production/Dockerfile.agent\n args:\n AGENT_KIND: image\n image: haole-agent-image:latest\n container_name: haole-agent-3\n restart: unless-stopped\n depends_on:\n redis:\n condition: service_healthy\n minio:\n condition: service_healthy\n environment:\n <<: *agent-env\n AGENT_KIND: image\n\n celery-worker-video:\n build:\n context: ../..\n dockerfile: deploy/production/Dockerfile.celery\n image: haole-celery-worker:latest\n container_name: haole-celery-worker-video\n restart: unless-stopped\n depends_on:\n redis:\n condition: service_healthy\n minio:\n condition: service_healthy\n environment:\n CELERY_BROKER_URL: redis://redis:6379/1\n CELERY_RESULT_BACKEND: redis://redis:6379/2\n REDIS_URL: redis://redis:6379/0\n OSS_ENDPOINT: http://minio:9000\n OSS_ACCESS_KEY: ${OSS_ACCESS_KEY:-minioadmin}\n OSS_SECRET_KEY: ${OSS_SECRET_KEY:-minioadmin}\n OSS_BUCKET: ${OSS_BUCKET:-haole-dev}\n MCP_AUDIO_TOOLS_URL: http://mcp-audio-tools:7004\n MCP_VIDEO_TOOLS_URL: http://mcp-video-tools:7003\n command: [\"celery\", \"-A\", \"agents.av_agent.celery_tasks.video_workflow\", \"worker\",\n \"--loglevel=info\", \"--queues=video\", \"--concurrency=2\"]\n\n # 可选:Flower 监控面板\n flower:\n image: mher/flower:2.0\n container_name: haole-flower\n restart: unless-stopped\n depends_on:\n - redis\n environment:\n CELERY_BROKER_URL: redis://redis:6379/1\n FLOWER_PORT: \"5555\"\n ports:\n - \"5555:5555\"\n command: [\"celery\", \"--broker=redis://redis:6379/1\", \"flower\",\n \"--port=5555\", \"--persistent=True\"]\n\n mcp-search:\n build:\n context: ../..\n dockerfile: deploy/production/Dockerfile.mcp\n args:\n MCP_KIND: search\n image: haole-mcp-search:latest\n container_name: haole-mcp-search\n restart: unless-stopped\n environment:\n MCP_KIND: search\n TAVILY_API_KEY: ${TAVILY_API_KEY:-}\n ports:\n - \"7001:7001\"\n\n mcp-image-tools:\n build:\n context: ../..\n dockerfile: deploy/production/Dockerfile.mcp\n args:\n MCP_KIND: image_tools\n image: haole-mcp-image-tools:latest\n container_name: haole-mcp-image-tools\n restart: unless-stopped\n depends_on:\n minio:\n condition: service_healthy\n environment:\n MCP_KIND: image_tools\n OSS_ENDPOINT: http://minio:9000\n OSS_ACCESS_KEY: ${OSS_ACCESS_KEY:-minioadmin}\n OSS_SECRET_KEY: ${OSS_SECRET_KEY:-minioadmin}\n OSS_BUCKET: ${OSS_BUCKET:-haole-dev}\n ports:\n - \"7002:7002\"\n\n mcp-document-tools:\n build:\n context: ../..\n dockerfile: deploy/production/Dockerfile.mcp\n args:\n MCP_KIND: document_tools\n image: haole-mcp-document-tools:latest\n container_name: haole-mcp-document-tools\n restart: unless-stopped\n depends_on:\n minio:\n condition: service_healthy\n environment:\n MCP_KIND: document_tools\n OSS_ENDPOINT: http://minio:9000\n OSS_ACCESS_KEY: ${OSS_ACCESS_KEY:-minioadmin}\n OSS_SECRET_KEY: ${OSS_SECRET_KEY:-minioadmin}\n OSS_BUCKET: ${OSS_BUCKET:-haole-dev}\n ports:\n - \"7005:7005\"\n\n mcp-oss:\n build:\n context: ../..\n dockerfile: deploy/production/Dockerfile.mcp\n args:\n MCP_KIND: oss\n image: haole-mcp-oss:latest\n container_name: haole-mcp-oss\n restart: unless-stopped\n depends_on:\n minio:\n condition: service_healthy\n environment:\n MCP_KIND: oss\n OSS_ENDPOINT: http://minio:9000\n OSS_ACCESS_KEY: ${OSS_ACCESS_KEY:-minioadmin}\n OSS_SECRET_KEY: ${OSS_SECRET_KEY:-minioadmin}\n OSS_BUCKET: ${OSS_BUCKET:-haole-dev}\n ports:\n - \"7006:7006\"\n\n # mcp-video-tools 也需要 ffmpeg/MoviePy(因为它执行真实 compose),所以也用 celery 镜像\n mcp-video-tools:\n image: haole-celery-worker:latest\n container_name: haole-mcp-video-tools\n restart: unless-stopped\n depends_on:\n minio:\n condition: service_healthy\n environment:\n OSS_ENDPOINT: http://minio:9000\n OSS_ACCESS_KEY: ${OSS_ACCESS_KEY:-minioadmin}\n OSS_SECRET_KEY: ${OSS_SECRET_KEY:-minioadmin}\n OSS_BUCKET: ${OSS_BUCKET:-haole-dev}\n ports:\n - \"7003:7003\"\n # 用 fastapi 而不是 celery worker\n command: [\"uvicorn\", \"mcp_servers.video_tools.server:app\",\n \"--host\", \"0.0.0.0\", \"--port\", \"7003\"]\n\n mcp-audio-tools:\n image: haole-celery-worker:latest\n container_name: haole-mcp-audio-tools\n restart: unless-stopped\n depends_on:\n minio:\n condition: service_healthy\n environment:\n OSS_ENDPOINT: http://minio:9000\n OSS_ACCESS_KEY: ${OSS_ACCESS_KEY:-minioadmin}\n OSS_SECRET_KEY: ${OSS_SECRET_KEY:-minioadmin}\n OSS_BUCKET: ${OSS_BUCKET:-haole-dev}\n LITELLM_URL: ${LITELLM_URL:-http://litellm-mock:4010}\n LITELLM_API_KEY: ${LITELLM_API_KEY:-sk-mock-1234}\n LITELLM_MOCK: ${LITELLM_MOCK:-true}\n OPENROUTER_API_BASE: ${OPENROUTER_API_BASE:-https://openrouter.ai/api/v1}\n OPENROUTER_API_KEY: ${OPENROUTER_API_KEY:-}\n DEEPSEEK_API_BASE: ${DEEPSEEK_API_BASE:-https://api.deepseek.com/v1}\n DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}\n SILICONFLOW_API_BASE: ${SILICONFLOW_API_BASE:-https://api.siliconflow.cn/v1}\n SILICONFLOW_API_KEY: ${SILICONFLOW_API_KEY:-}\n ports:\n - \"7004:7004\"\n command: [\"uvicorn\", \"mcp_servers.audio_tools.server:app\",\n \"--host\", \"0.0.0.0\", \"--port\", \"7004\"]\n"}, "6ca47f54eba22ebeb8429b530c4f947324274011": {"t": 1785773129.7760825, "n": 8027, "h": "0418db9c21c7b999", "c": "# 把 celery worker 加进 dev 栈,跟主 docker-compose 一起起\n# 用法:\n# mock LLM: docker compose -f docker-compose.yml -f docker-compose.mock.yml -f docker-compose.celery.yml up -d\n# real LLM: docker compose -f docker-compose.yml -f docker-compose.celery.yml up -d\n\nname: youle-dev\n\n# 公共 agent 环境变量块(YAML anchor,各 agent 服务 <<: *agent-env 继承)\nx-agent-env: &agent-env\n REDIS_URL: redis://redis:6379/0\n LITELLM_URL: ${LITELLM_URL:-http://litellm-mock:4010}\n LITELLM_API_KEY: ${LITELLM_API_KEY:-sk-mock-1234}\n LITELLM_MOCK: ${LITELLM_MOCK:-true}\n STEP_PERSONA_MAX_BUDGET_TOKENS: ${STEP_PERSONA_MAX_BUDGET_TOKENS:-8000}\n AGENT_REACT_MAX_STEPS: ${AGENT_REACT_MAX_STEPS:-6}\n OPENROUTER_API_BASE: ${OPENROUTER_API_BASE:-https://openrouter.ai/api/v1}\n OPENROUTER_API_KEY: ${OPENROUTER_API_KEY:-}\n DEEPSEEK_API_BASE: ${DEEPSEEK_API_BASE:-https://api.deepseek.com/v1}\n DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}\n SILICONFLOW_API_BASE: ${SILICONFLOW_API_BASE:-https://api.siliconflow.cn/v1}\n SILICONFLOW_API_KEY: ${SILICONFLOW_API_KEY:-}\n OSS_ENDPOINT: http://minio:9000\n OSS_ACCESS_KEY: ${OSS_ACCESS_KEY:-minioadmin}\n OSS_SECRET_KEY: ${OSS_SECRET_KEY:-minioadmin}\n OSS_BUCKET: ${OSS_BUCKET:-youle-dev}\n MCP_OSS_URL: http://mcp-oss:7006\n MCP_SEARCH_URL: http://mcp-search:7001\n MCP_IMAGE_TOOLS_URL: http://mcp-image-tools:7002\n MCP_DOCUMENT_TOOLS_URL: http://mcp-document-tools:7005\n MCP_AUDIO_TOOLS_URL: http://mcp-audio-tools:7004\n MCP_VIDEO_TOOLS_URL: http://mcp-video-tools:7003\n AGENT_MAX_RETRIES: \"2\"\n AGENT_HEARTBEAT_INTERVAL: \"20\"\n\nservices:\n # ── Agent 1(文字师)— 消费 agent_tasks:text ──\n agent-1:\n build:\n context: ../..\n dockerfile: deploy/production/Dockerfile.agent\n args:\n AGENT_KIND: text\n image: youle-agent-text:latest\n container_name: youle-agent-1\n restart: unless-stopped\n depends_on:\n redis:\n condition: service_healthy\n minio:\n condition: service_healthy\n environment:\n <<: *agent-env\n AGENT_KIND: text\n\n # ── Agent 2(文档师)— 消费 agent_tasks:document ──\n agent-2:\n build:\n context: ../..\n dockerfile: deploy/production/Dockerfile.agent\n args:\n AGENT_KIND: document\n image: youle-agent-document:latest\n container_name: youle-agent-2\n restart: unless-stopped\n depends_on:\n redis:\n condition: service_healthy\n minio:\n condition: service_healthy\n environment:\n <<: *agent-env\n AGENT_KIND: document\n\n # ── Agent 3(设计师)— 消费 agent_tasks:image ──\n agent-3:\n build:\n context: ../..\n dockerfile: deploy/production/Dockerfile.agent\n args:\n AGENT_KIND: image\n image: youle-agent-image:latest\n container_name: youle-agent-3\n restart: unless-stopped\n depends_on:\n redis:\n condition: service_healthy\n minio:\n condition: service_healthy\n environment:\n <<: *agent-env\n AGENT_KIND: image\n\n celery-worker-video:\n build:\n context: ../..\n dockerfile: deploy/production/Dockerfile.celery\n image: youle-celery-worker:latest\n container_name: youle-celery-worker-video\n restart: unless-stopped\n depends_on:\n redis:\n condition: service_healthy\n minio:\n condition: service_healthy\n environment:\n CELERY_BROKER_URL: redis://redis:6379/1\n CELERY_RESULT_BACKEND: redis://redis:6379/2\n REDIS_URL: redis://redis:6379/0\n OSS_ENDPOINT: http://minio:9000\n OSS_ACCESS_KEY: ${OSS_ACCESS_KEY:-minioadmin}\n OSS_SECRET_KEY: ${OSS_SECRET_KEY:-minioadmin}\n OSS_BUCKET: ${OSS_BUCKET:-youle-dev}\n MCP_AUDIO_TOOLS_URL: http://mcp-audio-tools:7004\n MCP_VIDEO_TOOLS_URL: http://mcp-video-tools:7003\n command: [\"celery\", \"-A\", \"agents.av_agent.celery_tasks.video_workflow\", \"worker\",\n \"--loglevel=info\", \"--queues=video\", \"--concurrency=2\"]\n\n # 可选:Flower 监控面板\n flower:\n image: mher/flower:2.0\n container_name: youle-flower\n restart: unless-stopped\n depends_on:\n - redis\n environment:\n CELERY_BROKER_URL: redis://redis:6379/1\n FLOWER_PORT: \"5555\"\n ports:\n - \"5555:5555\"\n command: [\"celery\", \"--broker=redis://redis:6379/1\", \"flower\",\n \"--port=5555\", \"--persistent=True\"]\n\n mcp-search:\n build:\n context: ../..\n dockerfile: deploy/production/Dockerfile.mcp\n args:\n MCP_KIND: search\n image: youle-mcp-search:latest\n container_name: youle-mcp-search\n restart: unless-stopped\n environment:\n MCP_KIND: search\n TAVILY_API_KEY: ${TAVILY_API_KEY:-}\n ports:\n - \"7001:7001\"\n\n mcp-image-tools:\n build:\n context: ../..\n dockerfile: deploy/production/Dockerfile.mcp\n args:\n MCP_KIND: image_tools\n image: youle-mcp-image-tools:latest\n container_name: youle-mcp-image-tools\n restart: unless-stopped\n depends_on:\n minio:\n condition: service_healthy\n environment:\n MCP_KIND: image_tools\n OSS_ENDPOINT: http://minio:9000\n OSS_ACCESS_KEY: ${OSS_ACCESS_KEY:-minioadmin}\n OSS_SECRET_KEY: ${OSS_SECRET_KEY:-minioadmin}\n OSS_BUCKET: ${OSS_BUCKET:-youle-dev}\n ports:\n - \"7002:7002\"\n\n mcp-document-tools:\n build:\n context: ../..\n dockerfile: deploy/production/Dockerfile.mcp\n args:\n MCP_KIND: document_tools\n image: youle-mcp-document-tools:latest\n container_name: youle-mcp-document-tools\n restart: unless-stopped\n depends_on:\n minio:\n condition: service_healthy\n environment:\n MCP_KIND: document_tools\n OSS_ENDPOINT: http://minio:9000\n OSS_ACCESS_KEY: ${OSS_ACCESS_KEY:-minioadmin}\n OSS_SECRET_KEY: ${OSS_SECRET_KEY:-minioadmin}\n OSS_BUCKET: ${OSS_BUCKET:-youle-dev}\n ports:\n - \"7005:7005\"\n\n mcp-oss:\n build:\n context: ../..\n dockerfile: deploy/production/Dockerfile.mcp\n args:\n MCP_KIND: oss\n image: youle-mcp-oss:latest\n container_name: youle-mcp-oss\n restart: unless-stopped\n depends_on:\n minio:\n condition: service_healthy\n environment:\n MCP_KIND: oss\n OSS_ENDPOINT: http://minio:9000\n OSS_ACCESS_KEY: ${OSS_ACCESS_KEY:-minioadmin}\n OSS_SECRET_KEY: ${OSS_SECRET_KEY:-minioadmin}\n OSS_BUCKET: ${OSS_BUCKET:-youle-dev}\n ports:\n - \"7006:7006\"\n\n # mcp-video-tools 也需要 ffmpeg/MoviePy(因为它执行真实 compose),所以也用 celery 镜像\n mcp-video-tools:\n image: youle-celery-worker:latest\n container_name: youle-mcp-video-tools\n restart: unless-stopped\n depends_on:\n minio:\n condition: service_healthy\n environment:\n OSS_ENDPOINT: http://minio:9000\n OSS_ACCESS_KEY: ${OSS_ACCESS_KEY:-minioadmin}\n OSS_SECRET_KEY: ${OSS_SECRET_KEY:-minioadmin}\n OSS_BUCKET: ${OSS_BUCKET:-youle-dev}\n ports:\n - \"7003:7003\"\n # 用 fastapi 而不是 celery worker\n command: [\"uvicorn\", \"mcp_servers.video_tools.server:app\",\n \"--host\", \"0.0.0.0\", \"--port\", \"7003\"]\n\n mcp-audio-tools:\n image: youle-celery-worker:latest\n container_name: youle-mcp-audio-tools\n restart: unless-stopped\n depends_on:\n minio:\n condition: service_healthy\n environment:\n OSS_ENDPOINT: http://minio:9000\n OSS_ACCESS_KEY: ${OSS_ACCESS_KEY:-minioadmin}\n OSS_SECRET_KEY: ${OSS_SECRET_KEY:-minioadmin}\n OSS_BUCKET: ${OSS_BUCKET:-youle-dev}\n LITELLM_URL: ${LITELLM_URL:-http://litellm-mock:4010}\n LITELLM_API_KEY: ${LITELLM_API_KEY:-sk-mock-1234}\n LITELLM_MOCK: ${LITELLM_MOCK:-true}\n OPENROUTER_API_BASE: ${OPENROUTER_API_BASE:-https://openrouter.ai/api/v1}\n OPENROUTER_API_KEY: ${OPENROUTER_API_KEY:-}\n DEEPSEEK_API_BASE: ${DEEPSEEK_API_BASE:-https://api.deepseek.com/v1}\n DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}\n SILICONFLOW_API_BASE: ${SILICONFLOW_API_BASE:-https://api.siliconflow.cn/v1}\n SILICONFLOW_API_KEY: ${SILICONFLOW_API_KEY:-}\n ports:\n - \"7004:7004\"\n command: [\"uvicorn\", \"mcp_servers.audio_tools.server:app\",\n \"--host\", \"0.0.0.0\", \"--port\", \"7004\"]\n"}}}} |