services: llm-stub: image: python:3.14.7-slim-bookworm@sha256:416f0db2a2b561945630cef9877a7ea0581b27449eb9fd9df42f03e1b74b5b63 working_dir: /app command: [python3, mock_openai.py] volumes: - ./tests/e2e:/app:ro networks: - novel-net ports: - 127.0.0.1:${E2E_LLM_STUB_PORT:-18080}:18080 healthcheck: test: [CMD, python3, -c, "import urllib.request; urllib.request.urlopen('http://127.0.0.1:18080/health')"] interval: 1s timeout: 2s retries: 10 user-service: environment: LLM_API_URL: http://llm-stub:18080 depends_on: llm-stub: condition: service_healthy novel-service: environment: LLM_API_URL: http://llm-stub:18080 LLM_ALLOW_INSECURE_HTTP: "true" IMAGE_GEN_API_URL: http://llm-stub:18080 IMAGE_GEN_API_KEY: e2e-only depends_on: llm-stub: condition: service_healthy agent-service: environment: LLM_API_URL: http://llm-stub:18080 LLM_ALLOW_INSECURE_HTTP: "true" EMBEDDING_PROVIDER: e2e EMBEDDING_API_URL: http://llm-stub:18080 EMBEDDING_MODEL: text-embedding-3-small depends_on: llm-stub: condition: service_healthy narrative-service: environment: LLM_API_URL: http://llm-stub:18080 LLM_ALLOW_INSECURE_HTTP: "true" depends_on: llm-stub: condition: service_healthy gateway: ports: - 127.0.0.1:${E2E_GATEWAY_PORT:-18081}:8080