698 lines
23 KiB
Bash
698 lines
23 KiB
Bash
# 魂镜 环境变量示例
|
||
# 复制为 .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),客户端不需要后端地址。
|
||
|
||
|
||
# =====================================================================
|
||
# 神识 · 模型网关(Go,rewrite/1.0 M0) — 灵台唯一模型出口
|
||
# =====================================================================
|
||
# 神识服务地址;为空时灵台 Kernel 使用进程内回声桩(仅骨架验证,不出真实模型流)。
|
||
# 本地开发:SHENSHI_BASE_URL=http://127.0.0.1:8080(先 shenshi/ 目录 `go run .`)
|
||
# Docker 部署由 docker-compose.app.yml 写死为 http://hunjing-shenshi:8080
|
||
SHENSHI_BASE_URL=
|
||
# 灵台 → 神识服务令牌(两边一致);为空时神识开发档放行不校验
|
||
SHENSHI_SERVICE_TOKEN=
|
||
# 神识流式调用超时(秒)
|
||
SHENSHI_TIMEOUT_SECONDS=120.0
|
||
# 神识服务监听端口(shenshi 服务自身)
|
||
SHENSHI_PORT=8080
|
||
# 神识出站端点目录(JSON 数组;未配置时回声桩兜底)。
|
||
# type: openai_compatible(云厂商兼容面与元炁 http://hunjing-yuanqi:11434 共用)
|
||
# 示例:
|
||
# SHENSHI_ENDPOINTS=[{"type":"openai_compatible","name":"yuanqi","base_url":"http://hunjing-yuanqi:11434","model":"bge-chat","priority":100}]
|
||
SHENSHI_ENDPOINTS=
|
||
|
||
|
||
# =====================================================================
|
||
# 照壁 · BFF(Fastify,rewrite/1.0 M0) — 鉴权透传 / SSE 直通
|
||
# =====================================================================
|
||
# 照壁监听端口
|
||
BFF_PORT=3000
|
||
# 照壁转发的灵台地址;本地开发默认 http://127.0.0.1:8000
|
||
# Docker 部署由 docker-compose.app.yml 写死为 http://hunjing-backend:8000
|
||
BACKEND_URL=http://127.0.0.1:8000
|