Files
2026-08-21 16:00:13 +08:00

668 lines
21 KiB
Bash
Raw Permalink 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.
# 魂镜 环境变量示例
# 复制为 .env 后按需修改
#
# 分层分组法排列:核心运行环境 → 应用配置 → 第三方服务 → 基础设施
# 每组内按"同类"对齐:连接地址 → 端口 → 认证信息 → 开关/参数
# 各组按"如果删除此功能能否一键删除整组"的组织原则排列
#
# 标注了"必填"的变量在启动前必须设置,
# 标注"按需"的变量保留默认值即可正常工作。
# 每个变量的默认值是本地开发推荐值。生产环境请根据实际部署调整。
# =====================================================================
# 全局基础配置(所有子系统共用)
# =====================================================================
# 应用名称,仅用于 OpenAPI、日志和健康检查展示
APP_NAME=魂镜
# 运行环境:dev / prod
# prod 环境下博闻的日志输出会切换为 JSON 格式,便于日志采集系统(如 Loki)解析
APP_ENV=dev
# 服务端默认时区,用于日志和数据库时间展示。格式:IANA Time Zone
# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
TIMEZONE=Asia/Shanghai
# =====================================================================
# 后端 · 灵台(FastAPI)
# =====================================================================
# --- 部署与跨域 ---
# 后端监听地址与端口
BACKEND_HOST=0.0.0.0
BACKEND_PORT=8000
# 允许跨域来源,多个来源用逗号分隔
# 生产环境前端独立域名部署时生效;本地开发浏览器经 next.config.ts 同源代理,不触发 CORS
CORS_ALLOW_ORIGINS=http://localhost:3000
# HTTP API 前缀
API_PREFIX=/api/v1
# 是否开启 FastAPI debug。生产环境必须为 false
DEBUG=false
# --- 数据库(金匮)---
# 数据库类型:sqlite / pgsql
# - sqlite:本地开发默认,无需 Docker,数据库文件放在项目根目录 db/ 下
# - pgsql:正式环境或模拟正式环境,使用 PostgreSQL / asyncpg
DATABASE_TYPE=sqlite
# SQLite 配置。DATABASE_TYPE=sqlite 时使用
# 后端会根据 SQLITE_DATABASE_PATH 拼接为:sqlite+aiosqlite:///<绝对路径>
SQLITE_DATABASE_PATH=../db/hunjing.sqlite3
# PostgreSQL 配置。DATABASE_TYPE=pgsql 时使用
# 后端会根据下列字段拼接为:postgresql+asyncpg://<user>:<password>@<host>:<port>/<db>
POSTGRES_HOST=127.0.0.1
POSTGRES_PORT=5432
POSTGRES_DB=hunjing
POSTGRES_USER=hunjing
POSTGRES_PASSWORD=change-me
POSTGRES_SSL=false
POSTGRES_POOL_SIZE=10
POSTGRES_MAX_OVERFLOW=20
# 可选覆盖项:如果显式设置 DATABASE_URL,则优先使用它,不再根据 DATABASE_TYPE 拼接
DATABASE_URL=
# --- 日志 ---
# 日志目录,默认放在项目根目录 logs/ 下
LOG_DIR=../logs
# 日志级别:DEBUG / INFO / WARNING / ERROR
LOG_LEVEL=INFO
# 是否启用访问日志(每个请求的 method、path、status、duration)
LOG_ACCESS=true
# 日志保留天数。超过此天数的日志文件自动清理
LOG_RETENTION_DAYS=14
# 日志轮转大小。单个日志文件达到此大小后自动切分
LOG_ROTATION_SIZE=10 MB
# --- 默认人物与用户 ---
# 本地单用户范围标识,当前阶段不实现多用户、组织、租户、OAuth 或 SSO
DEFAULT_OWNER_SCOPE=local-user
# 默认逻辑模型名。必须指向 config/models.yaml 中真实远程 provider 的逻辑模型
DEFAULT_MODEL_HINT=deepseek-v4-flash
# --- 管理端点和认证 ---
# 司命台管理 API(/api/v1/admin/*)的访问凭证
# 请求需在 Authorization 头携带 ``Bearer <ADMIN_TOKEN>``;
# 为空时管理端点 fail-closed(返回 503),强制部署时配置
# 生成命令:python -c "import secrets; print(secrets.token_urlsafe(32))"
# 前端司命台管理控制台需在 frontend/.env.local 同步配置 NEXT_PUBLIC_ADMIN_TOKEN(同值)
ADMIN_TOKEN=
# JWT 签名密钥。必须是一个至少 32 字符的随机字符串
# 为空时 /auth/* 端点返回 503 fail-closed,强制部署时配置
# 生成命令:python -c "import secrets; print(secrets.token_urlsafe(48))"
JWT_SECRET=
# Access Token 有效期(秒)。默认 900(15 分钟)
ACCESS_TOKEN_TTL=900
# Refresh Token 有效期(秒)。默认 604800(7 天)
REFRESH_TOKEN_TTL=604800
# 种子初始管理员账户(仅首次启动时创建;生产环境部署后应立刻修改密码)
DEFAULT_ADMIN_USERNAME=admin
DEFAULT_ADMIN_EMAIL=admin@hunjing.local
DEFAULT_ADMIN_PASSWORD=admin123
# --- SSE 流式输出 ---
# 是否启用 SSE 流式输出
ENABLE_SSE=true
# SSE 轮询数据库新增事件的间隔秒数
SSE_POLL_INTERVAL_SECONDS=0.01
# SSE 心跳间隔秒数
SSE_HEARTBEAT_SECONDS=15
# --- 功能开关 ---
# 是否启用工具运行时(百工枢)。关闭时所有工具调用会被拒绝,但不会影响其他功能
ENABLE_TOOL_RUNTIME=true
# 是否启用自动记忆候选。关闭时不会从对话中抽取记忆候选,但手动导入记忆不受影响
ENABLE_MEMORY_CANDIDATES=false
# 是否启用内驱力扫描(太一枢的 curiosity / exploration)
ENABLE_INTRINSIC_DRIVE=false
# 是否启用大周天自动触发(长期演化循环)
ENABLE_BIG_CYCLE=true
# 是否启用洛书显式多步规划(Deliberative Planning)
ENABLE_DELIBERATIVE_PLANNING=false
# 是否启用审计日志(司命枢·起居注)
ENABLE_AUDIT_LOG=true
# 是否启用摄像头(烛照枢·视觉感知)
ENABLE_CAMERA=false
# 是否启用麦克风(烛照枢·听觉感知)
ENABLE_MICROPHONE=false
# 是否启用 ASR(语音转文字)
ENABLE_ASR=false
# 是否启用 TTS(文字转语音)
ENABLE_TTS=false
# 是否启用语音训练(基于导入的语音样本微调 TTS 音色)
ENABLE_VOICE_TRAINING=false
# 是否启用实时语音对话(Voice Chat)
ENABLE_VOICE_CHAT=false
# --- 运行时参数 ---
# 单条文本消息最大字节数
MAX_TEXT_MESSAGE_BYTES=32768
# 单个 Run 超时秒数
RUN_TIMEOUT_SECONDS=120
# Agent 循环最大轮数
AGENT_MAX_ITERATIONS=8
# 单个 Run 最大事件数
RUN_MAX_EVENTS=1000
# 事件 payload 最大字节数
EVENT_PAYLOAD_MAX_BYTES=65536
# 单次高风险工具确认挂起超时秒数;须小于 RUN_TIMEOUT_SECONDS,超时按拒绝处理
CONFIRMATION_TIMEOUT_SECONDS=60
# 是否启用数据库持久化的确认存储(用于多 worker 部署)
# 关闭时使用进程内 InMemoryConfirmationStore(默认),适合单进程开发模式
USE_DB_CONFIRMATION_STORE=false
# 每轮对话最多注入的记忆条数
MEMORY_INJECTION_LIMIT=5
# 自动记忆候选重要性阈值(0.0 ~ 1.0)。低于此阈值的不生成候选
MEMORY_CANDIDATE_MIN_IMPORTANCE=0.7
# 内驱力扫描间隔秒数
DRIVE_SCAN_INTERVAL_SECONDS=3600
# 单次扫描最多好奇问题数
DRIVE_MAX_CURIOSITY_PER_SCAN=5
# 是否允许内驱力中断当前任务(Agent 循环中插入探索)
DRIVE_ALLOW_INTERRUPT=false
# 触发大周天的记忆数阈值。新增记忆数达到此值时触发一轮大周天
BIG_CYCLE_MEMORY_THRESHOLD=20
# 两次大周天最小间隔(秒),避免频繁触发
BIG_CYCLE_MIN_INTERVAL_SECONDS=300
# 大周天候选生成所用模型(config/models.yaml 的逻辑模型名)
BIG_CYCLE_MODEL=deepseek-v4-flash
# 单次大周天生成的演化候选上限
BIG_CYCLE_MAX_CANDIDATES=10
# 高风险动作是否总是确认(即使 permission_policy 设为 allow 也弹出确认框)
SAFETY_ALWAYS_CONFIRM_HIGH_RISK=true
# --- 工具调用参数 ---
# 工具调用超时秒数(所有工具共享)
TOOL_TIMEOUT_SECONDS=60
# fetch_url 等 HTTP 工具的 HTTP 请求超时秒数
TOOL_WEB_HTTP_TIMEOUT_SECONDS=15
# MCP Server tools/list 请求超时秒数
MCP_LIST_TIMEOUT_SECONDS=10
# MCP Server tools/call 请求超时秒数
MCP_CALL_TIMEOUT_SECONDS=30
# MCP stdio 子进程启动超时秒数
MCP_STDIO_START_TIMEOUT_SECONDS=15
# MCP stdio 单次 tools/call 超时秒数
MCP_STDIO_CALL_TIMEOUT_SECONDS=30
# MCP stdio SIGTERM → SIGKILL 等待秒数
MCP_STDIO_STOP_TIMEOUT_SECONDS=5
# Embedding 模型逻辑名。指向 config/models.yaml 中已注册的 embedding 模型
EMBEDDING_MODEL_HINT=bge-m3
# --- 感知与导入 ---
# 是否保存原始感知文件(摄像头 / 麦克风采集的原始文件)
PERCEPTION_SAVE_RAW_MEDIA=false
# 感知文件最大大小(MB),超限的感知输入会被拒绝
PERCEPTION_MAX_MEDIA_MB=20
# 人物资料导入文件最大大小(MB)
IMPORT_MAX_FILE_MB=20
# 人物语音样本最大时长(秒)
IMPORT_AUDIO_MAX_DURATION_SECONDS=600
# 允许上传的人物语音样本 MIME 类型,逗号分隔
IMPORT_ALLOWED_AUDIO_MIME_TYPES=audio/wav,audio/mpeg,audio/mp4,audio/flac
# =====================================================================
# 模型网关 · 神识(LLM Provider API Keys)
# =====================================================================
# 模型名称、provider 映射、能力标签、超时、限流、价格等,统一放在 config/models.yaml 中。
# .env 只保存各 provider 的 URL 与 API key,避免模型策略散落在环境变量中。
# --- DeepSeek ---
DEEPSEEK_API_KEY=
DEEPSEEK_BASE_URL=https://api.deepseek.com
# --- 火山方舟 / 豆包 ---
VOLCENGINE_ARK_API_KEY=
VOLCENGINE_ARK_BASE_URL=https://ark.cn-beijing.volces.com/api/v3
# --- 小米 MiMo ---
XIAOMI_MIMO_API_KEY=
XIAOMI_MIMO_BASE_URL=https://token-plan-cn.xiaomimimo.com/v1
# --- OpenAI ---
OPENAI_API_KEY=
OPENAI_BASE_URL=https://api.openai.com/v1
# --- Anthropic ---
ANTHROPIC_API_KEY=
ANTHROPIC_BASE_URL=https://api.anthropic.com
# --- 元炁(本地推理引擎)---
# 作为 OpenAI 兼容 provider 接入,供 bge-m3 embedding 等模型调用。
YUANQI_BASE_URL=http://localhost:11434
YUANQI_API_KEY=
# --- 其他兼容网关预留 ---
CUSTOM_LLM_API_KEY=
CUSTOM_LLM_BASE_URL=
# --- 模型 endpoint 池路由(高级调优项,保持默认即可正常工作)---
# 物理 endpoint 池的 failover 与重试策略
MODEL_ENDPOINT_POOL_ENABLED=true
MODEL_ENDPOINT_POOL_DRY_RUN_SELECTION=false
MODEL_ENDPOINT_POOL_EXPOSE_DEBUG_HEADERS=false
MODEL_ENDPOINT_POOL_AGENT_FAILOVER_ENABLED=false
MODEL_ENDPOINT_POOL_PER_ENDPOINT_MAX_RETRIES=1
MODEL_ENDPOINT_POOL_RETRY_BASE_DELAY_SECONDS=0.25
MODEL_ENDPOINT_POOL_RETRY_MAX_DELAY_SECONDS=2.0
# 模型配置文件路径
# 默认读取项目根目录 config/models.yaml;不存在时 fallback 到 config/models.example.yaml
MODEL_CONFIG_PATH=../config/models.yaml
# =====================================================================
# 元炁 · 本地推理引擎(Local Inference Engine)
# =====================================================================
# 元炁监听地址与端口
YUANQI_HOST=0.0.0.0
YUANQI_PORT=11434
# 下载源:auto / huggingface / modelscope
YUANQI_MODEL_SOURCE=auto
# 模型文件根目录
YUANQI_MODELS_DIR=../models
# GGUF LLM 模型路径(为空自动扫描 models/gguf/)
YUANQI_LLM_MODEL_PATH=
# 多模态 GGUF 模型路径
YUANQI_VISION_MODEL_PATH=
# Embedding 模型(HF ID 或本地路径)
YUANQI_EMBEDDING_MODEL=BAAI/bge-m3
# Reranker 模型(HF ID 或本地路径)
YUANQI_RERANKER_MODEL=BAAI/bge-reranker-v2-m3
# ASR 模型(HF/ModelScope ID 或本地路径),默认 iic/SenseVoiceSmall
# 自动下载到 models/funasr/<模型名>
YUANQI_ASR_MODEL=iic/SenseVoiceSmall
# 推理设备:auto / cuda / mps / cpu
YUANQI_DEVICE=auto
# LLM 默认参数
YUANQI_LLM_MAX_TOKENS=2048
YUANQI_LLM_TEMPERATURE=0.7
YUANQI_LLM_CTX_SIZE=4096
# 日志级别
YUANQI_LOG_LEVEL=info
# =====================================================================
# 天目 · 本地 OCR 引擎(Local OCR Engine)
# =====================================================================
# 天目监听地址与端口
TIANMU_HOST=0.0.0.0
TIANMU_PORT=8101
# 模型文件根目录(容器内路径,Docker volume 映射)
TIANMU_MODELS_DIR=../models
# 推理设备:auto / cuda / mps / cpu。
# auto 表示天目启动时自动检测最优可用加速器(CUDA > MPS > CPU)
TIANMU_DEVICE=auto
# 日志级别
TIANMU_LOG_LEVEL=info
# OCR 结果输出目录(Markdown 文件等),默认 ../output/
TIANMU_OUTPUT_DIR=
# HTTP 下载远端图片超时(秒)
TIANMU_HTTP_TIMEOUT=30
# PaddleOCR-VL 最大生成 tokens
TIANMU_VL_MAX_NEW_TOKENS=1024
# PaddleOCR-VL 图像最大像素数(长边像素 × 28 × 28)
TIANMU_VL_MAX_PIXELS=1003520
# PP-OCRv6 模型覆盖路径(为空时自动扫描 $TIANMU_MODELS_DIR/ocr/ppocrv6/{det,rec,cls}/)
# TIANMU_PPORCV6_DET_MODEL=
# TIANMU_PPORCV6_REC_MODEL=
# TIANMU_PPORCV6_CLS_MODEL=
# TIANMU_PPORCV6_DICT_PATH=
# PaddleOCR-VL 模型覆盖目录(为空时自动扫描 $TIANMU_MODELS_DIR/ocr/paddleocr-vl/)
# TIANMU_PADDLEOCR_VL_MODEL_DIR=
# =====================================================================
# 博闻 · MCP Web Search(Go)
# =====================================================================
# 博闻是一个独立的 MCP Web Search 服务,与灵台(Python)运行时无关。
# --- 搜索 API Key ---
# Tavily 搜索 API Key(必填)。多 key 用逗号分隔,博闻会按 EWMA 动态权重自动轮询
TAVILY_API_KEYS=
# Brave Search API Key(必填)。X-Subscription-Token
# 多 key 逗号分隔
BRAVE_API_KEYS=
# --- Redis 缓存配置 ---
# 博闻 Redis 缓存总开关。启用后作为内存 LRU 的第二层缓存(两级:L1 LRU → L2 Redis)
# 在 SSE 多实例部署时共享缓存状态。单实例部署可以不启用
# 注意:这里的 Redis 配置独立于后端灵台的 REDIS_ENABLED,两套可独立控制
MCP_WEB_SEARCH_REDIS_ENABLED=false
# Redis 连接地址(host:port)
MCP_WEB_SEARCH_REDIS_ADDR=127.0.0.1:6379
# Redis 密码(无密码则留空)
MCP_WEB_SEARCH_REDIS_PASSWORD=
# Redis 数据库编号(0 ~ 15)
MCP_WEB_SEARCH_REDIS_DB=0
# =====================================================================
# 基础设施(Redis/向量库/图库/对象存储)
# =====================================================================
# ===== Redis(灵泉,后端灵台用)=====
# 注意:博闻有独立的 MCP_WEB_SEARCH_REDIS_* 配置
REDIS_ENABLED=false
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_DB=0
REDIS_PASSWORD=
REDIS_URL=redis://127.0.0.1:6379/0
# 后台任务队列(Dramatiq)的 Redis 连接
DRAMATIQ_ENABLED=false
DRAMATIQ_BROKER_URL=redis://127.0.0.1:6379/1
# ===== 向量数据库(灵犀)=====
# 向量数据库总开关(false 则纯 SQL 检索,不走向量库)。
VECTOR_DB_ENABLED=false
# 向量数据库类型:chroma / milvus
VECTOR_DB_TYPE=chroma
# ChromaDB 配置(VECTOR_DB_ENABLED=true && VECTOR_DB_TYPE=chroma 时使用)
CHROMA_COLLECTION=hunjing_memories
CHROMA_PERSIST_DIRECTORY=../db/chroma
# Milvus 配置(VECTOR_DB_ENABLED=true && VECTOR_DB_TYPE=milvus 时使用)
MILVUS_HOST=127.0.0.1
MILVUS_PORT=19530
MILVUS_USER=
MILVUS_PASSWORD=
MILVUS_DATABASE=default
MILVUS_COLLECTION=hunjing_memories
# ===== 图数据库(玄络)=====
GRAPH_DB_ENABLED=false
# 图数据库类型:neo4j / nebulagraph
GRAPH_DB_TYPE=neo4j
# Neo4j 配置(GRAPH_DB_ENABLED=true && GRAPH_DB_TYPE=neo4j 时使用)
NEO4J_URI=bolt://127.0.0.1:7687
NEO4J_USER=neo4j
NEO4J_PASSWORD=change-me
NEO4J_DATABASE=neo4j
# NebulaGraph 配置(GRAPH_DB_ENABLED=true && GRAPH_DB_TYPE=nebulagraph 时使用)
NEBULAGRAPH_HOST=127.0.0.1
NEBULAGRAPH_PORT=9669
NEBULAGRAPH_USER=root
NEBULAGRAPH_PASSWORD=nebula
NEBULAGRAPH_SPACE=hunjing
# ===== 对象存储(玉函)=====
# 存储后端:local / minio / aws_s3 / aliyun_oss / tencent_cos / huawei_obs / qiniu_kodo
STORAGE_PROVIDER=local
# 对象 key 前缀,用于隔离不同环境或部署
STORAGE_KEY_PREFIX=hunjing/local
# 预签名 URL 默认过期秒数
STORAGE_PRESIGN_EXPIRES_SECONDS=900
# 本地存储(STORAGE_PROVIDER=local 时使用)
LOCAL_STORAGE_ROOT=../storage/objects
LOCAL_PUBLIC_BASE_URL=
# MinIO(STORAGE_PROVIDER=minio 时使用)
MINIO_ENDPOINT=http://127.0.0.1:9000
MINIO_REGION=local
MINIO_BUCKET=hunjing
MINIO_ACCESS_KEY_ID=
MINIO_SECRET_ACCESS_KEY=
MINIO_PUBLIC_BASE_URL=
MINIO_FORCE_PATH_STYLE=true
MINIO_SECURE=false
# AWS S3(STORAGE_PROVIDER=aws_s3 时使用)
AWS_S3_REGION=us-east-1
AWS_S3_BUCKET=hunjing
AWS_S3_ACCESS_KEY_ID=
AWS_S3_SECRET_ACCESS_KEY=
AWS_S3_ENDPOINT=
AWS_S3_PUBLIC_BASE_URL=
AWS_S3_FORCE_PATH_STYLE=false
# 阿里云 OSS(STORAGE_PROVIDER=aliyun_oss 时使用)
ALIYUN_OSS_ENDPOINT=https://oss-cn-hangzhou.aliyuncs.com
ALIYUN_OSS_REGION=cn-hangzhou
ALIYUN_OSS_BUCKET=hunjing
ALIYUN_OSS_ACCESS_KEY_ID=
ALIYUN_OSS_ACCESS_KEY_SECRET=
ALIYUN_OSS_PUBLIC_BASE_URL=
# 腾讯云 COS(STORAGE_PROVIDER=tencent_cos 时使用)
TENCENT_COS_REGION=ap-guangzhou
TENCENT_COS_BUCKET=hunjing
TENCENT_COS_APP_ID=
TENCENT_COS_SECRET_ID=
TENCENT_COS_SECRET_KEY=
TENCENT_COS_PUBLIC_BASE_URL=
# 华为云 OBS(STORAGE_PROVIDER=huawei_obs 时使用)
HUAWEI_OBS_ENDPOINT=https://obs.cn-north-4.myhuaweicloud.com
HUAWEI_OBS_REGION=cn-north-4
HUAWEI_OBS_BUCKET=hunjing
HUAWEI_OBS_ACCESS_KEY_ID=
HUAWEI_OBS_SECRET_ACCESS_KEY=
HUAWEI_OBS_PUBLIC_BASE_URL=
# 七牛云 Kodo(STORAGE_PROVIDER=qiniu_kodo 时使用)
QINIU_KODO_REGION=z0
QINIU_KODO_BUCKET=hunjing
QINIU_KODO_ACCESS_KEY=
QINIU_KODO_SECRET_KEY=
QINIU_KODO_DOMAIN=
# =====================================================================
# 乾坤 · Rust 安全沙箱
# =====================================================================
# 沙箱是百工枢的执行后端,使用 Rust 实现隔离执行环境。
# --- 服务地址 ---
# Rust 沙箱地址。后端通过该 URL 连接乾坤沙箱服务
# 本地开发:http://127.0.0.1:8090;Docker Compose 内:http://hunjing-sandbox:8090
RUST_SANDBOX_URL=
# 沙箱进程监听地址(cargo run 时读取;容器内由 docker-compose 覆盖)
SANDBOX_HOST=0.0.0.0
SANDBOX_PORT=8090
# 沙箱工作根目录:所有执行的工作目录都约束在其之下
SANDBOX_BASE_WORKDIR=../sandbox-work
# 沙箱日志目录
SANDBOX_LOG_DIR=../logs
# 沙箱 tracing 日志级别
RUST_LOG=info
# --- 执行限额 ---
# 单次执行全局超时上限(毫秒),请求 timeout_ms 不可超过该值
SANDBOX_MAX_TIMEOUT_MS=30000
# 最大并发执行数。超过此值的请求排队等待
SANDBOX_MAX_CONCURRENT=8
# 单流(stdout / stderr 各自)最大捕获字节数
SANDBOX_MAX_OUTPUT_BYTES=1048576
# 单次文件读写(/v1/file/*)最大字节数
SANDBOX_MAX_FILE_BYTES=1048576
# 默认注入子进程的环境变量白名单(逗号分隔)
SANDBOX_ALLOWED_ENV=PATH,HOME,TZ,LANG
# --- 授权 ---
# 是否校验调用方授权凭证(HMAC)
# 生产必须为 true 且填写密钥;仅本地快速联调可临时关闭
SANDBOX_AUTH_ENABLED=true
# 司命授权 HMAC 共享密钥
# 生产请用高熵随机值,例如:openssl rand -base64 48
SANDBOX_AUTH_SECRET=shared-secret
# 旧 secret(逗号分隔)。无中断轮换的并存窗口
# 沙箱先加 previous 认新旧 → 后端切新 secret → TTL 窗口后清 previous
SANDBOX_AUTH_SECRET_PREVIOUS=
# 后端客户端默认执行超时(毫秒),请求未指定 timeout_ms 时使用
SANDBOX_DEFAULT_TIMEOUT_MS=30000
# 授权凭证有效期(秒),凭证为短期 HMAC token
SANDBOX_AUTH_TTL_SECONDS=30
# 凭证未下发 isolation_mode 时的兜底隔离模式(process / container)
SANDBOX_ISOLATION_DEFAULT=process
# --- 进程级资源限额(setrlimit)---
# 配额分层(每层只能收紧、不能放宽):全局天花板 *_MAX → 凭证 rlimit_overrides → 请求 rlimits → 默认值
SANDBOX_RLIMIT_FSIZE_BYTES=67108864
SANDBOX_RLIMIT_AS_BYTES=536870912
SANDBOX_RLIMIT_CPU_SECS=30
SANDBOX_RLIMIT_NPROC=64
SANDBOX_RLIMIT_NOFILE=256
SANDBOX_RLIMIT_DISABLE=
# --- 容器隔离(Docker,L3-L4 高风险工具)---
# Docker 容器模式总开关
SANDBOX_DOCKER_ENABLED=true
# Docker 守护进程 socket 地址
SANDBOX_DOCKER_SOCKET=unix:///var/run/docker.sock
# 预热池:每种语言保持的最大空闲容器数
SANDBOX_WARM_POOL_MAX_IDLE=3
# 全局最大容器数(各语言空闲 + 运行中总和)
SANDBOX_WARM_POOL_GLOBAL_MAX=20
# 空闲容器超时回收(秒)
SANDBOX_CONTAINER_IDLE_TTL_SECS=300
# 每容器内存上限(字节)
SANDBOX_CONTAINER_MEMORY_BYTES=536870912
# 每容器 CPU 上限(纳秒核)
SANDBOX_CONTAINER_CPU_NANOCORES=1000000000
# 每容器进程数上限(防 fork bomb)
SANDBOX_CONTAINER_PIDS_LIMIT=64
# 容器网络模式。留空使用 Docker 默认 bridge 网络
SANDBOX_CONTAINER_NETWORK=
# 容器创建/启动超时(毫秒)
SANDBOX_CONTAINER_CREATE_TIMEOUT_MS=60000
# 各语言容器镜像名
# 未配置的语言对应的请求降级为进程模式
SANDBOX_CONTAINER_IMAGE_PYTHON=python:3.12-slim
SANDBOX_CONTAINER_IMAGE_NODE=node:24-slim
# SANDBOX_CONTAINER_IMAGE_JAVA=eclipse-temurin:21-jre
# SANDBOX_CONTAINER_IMAGE_GENERIC=debian:bookworm-slim
# =====================================================================
# 安全管理策略
# =====================================================================
# 工具策略文件路径(由 config/safety.example.yaml 复制为 safety.yaml)
# 未配置时 SafetyGovernor 使用内置默认策略;配置后覆盖各工具的 risk_level / permission_policy
SAFETY_POLICY_PATH=config/safety.yaml
# =====================================================================
# 前端 · 琉璃镜(Next.js) — 参考信息
# =====================================================================
# 前端配置在 frontend/.env.local 中管理(含 NEXT_PUBLIC_*)。
# 目前前端的鉴权已改为通过 /api/auth/me 返回的 is_admin 判断,不再需要独立的管理 token。
# BFF 连接后端的服务端地址(仅 Next 服务端读取,不暴露给浏览器):
# BACKEND_URL=http://localhost:8000 (本地开发,跨公网须 https://)
# Docker 部署由 docker-compose.app.yml 写死为 http://hunjing-backend:8000
# 浏览器所有请求同源走 BFF(/api/proxy、/api/sse、/api/auth),客户端不需要后端地址。