-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path.env.example
More file actions
173 lines (152 loc) · 9.19 KB
/
Copy path.env.example
File metadata and controls
173 lines (152 loc) · 9.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# =============================================================================
# 本文件为示例模板:复制为 `.env` 后填入真值。勿将 `.env` 提交到 Git。
# 真值表见:docs/meta/PROJECT_CONFIG_AI_INK_BRAIN_API_PYTHON.md
# =============================================================================
# ---------- Embedding(二选一厂商)----------
# siliconflow | dashscope | bailian(bailian 等同 dashscope)
EMBEDDING_PROVIDER=siliconflow
# 向量维度,须与 supabase/sql/init.sql 中 vector(N) 一致(默认 1024)
EMBEDDING_DIM=1024
# 兼容旧名;未设 EMBEDDING_DIM 时仍可读取此项
# SILICONFLOW_EMBEDDING_DIM=1024
# --- SiliconFlow ---
SILICONFLOW_API_KEY=
# 未设置或仅空白时使用默认 https://api.siliconflow.cn/v1/embeddings
SILICONFLOW_EMBEDDING_ENDPOINT="https://api.siliconflow.cn/v1/embeddings"
# 留空则使用 api/rag_env.py 默认 Qwen/Qwen3-Embedding-0.6B(须与 CI ingest / Vercel 查询侧一致)
# 更换模型后必须:① 三处 env 同改 ② 全量 re-sync ③ 跑 Portfolio 五问 smoke
SILICONFLOW_EMBEDDING_MODEL="Qwen/Qwen3-Embedding-0.6B"
SILICONFLOW_EMBEDDING_DIMENSIONS=1024
# RAG 检索前校验向量库 metadata.embedding_model 与运行时是否一致(block | warn | off)
RAG_EMBEDDING_MISMATCH_MODE=block
# --- 阿里云百炼 / DashScope(EMBEDDING_PROVIDER=dashscope 或 bailian 时必填)---
# DASHSCOPE_API_KEY=""
# 默认中国大陆 compatible-mode;国际站示例:https://dashscope-intl.aliyuncs.com/compatible-mode/v1
# DASHSCOPE_EMBEDDING_BASE_URL=
# DASHSCOPE_EMBEDDING_MODEL=text-embedding-v3
# ---------- Supabase ----------
# 必须与 service_role 来自同一项目:Dashboard → Project Settings → API
NEXT_PUBLIC_SUPABASE_URL="https://YOUR_PROJECT_REF.supabase.co"
SUPABASE_SERVICE_ROLE_KEY=
# PostgREST 瞬时断线(如 Connection reset by peer)时 insert/select 重试次数与退避(见 api/rag_env.py)
# SUPABASE_HTTP_RETRIES=4
# SUPABASE_HTTP_RETRY_BASE_DELAY_S=0.25
# text2sql 只读连接(示例格式;账号密码以你方 Supabase 为准)
TEXT2SQL_DATABASE_URL=postgresql://USER:PASSWORD@HOST:6543/postgres?sslmode=require
# ---------- Text2SQL:列值域 YAML(B-PR1)与 DISTINCT 探针(B-PR2,防漂移)----------
# 真值表:docs/meta/PROJECT_CONFIG_AI_INK_BRAIN_API_PYTHON.md
# 任务说明:docs/tasks/done/task_chatbi_v2_text2sql_multiturn_grounding_v1.md(已归档);V3 欠债见 docs/tasks/active/task_chatbi_v3_debt_from_v2_multiturn_v1.md
# DDL 检索串长度上限(可选,默认 1200)
# TEXT2SQL_RETRIEVE_QUERY_MAX_LEN=1200
# 值域 / 同义词 YAML:留空则用仓库内 docs/text2sql/v1/value_hints.yaml(若存在)
# TEXT2SQL_VALUE_HINTS_PATH=
# TEXT2SQL_VALUE_HINTS_ENABLED=true
# PR2:DISTINCT 与 YAML 并集进 prompt(见 api/text2sql_value_hints.py、docs/text2sql/v1/VALUE_HINTS_DISTINCT.md)
# allowlist:英文逗号分隔 schema.table.column;可选 TEXT2SQL_DISTINCT_MAX_PROBES、TEXT2SQL_DISTINCT_STMT_TIMEOUT_MS
TEXT2SQL_DISTINCT_PROBE=false
TEXT2SQL_DISTINCT_MAX=64
TEXT2SQL_DISTINCT_COLUMNS=public.agent_info.gender,public.agent_info.commission_structure
# --- ChatBI V3 P0 · Text2SQL(实现见 docs/tasks/done/task_chatbi_v3_text2sql_tool_latency_obs_v1.md §拍板;真值表 PROJECT_CONFIG §C)---
# P0-2:单行 JSON 日志(根字段 request_id/run_id + text2sql_phases_ms 等;默认关闭)
# CHATBI_JSON_LOG=true
# CHATBI_TEXT2SQL_LLM_TIMEOUT_S=120
# CHATBI_TEXT2SQL_LLM_SQL_TIMEOUT_S=
# CHATBI_TEXT2SQL_LLM_SUMMARY_TIMEOUT_S=
# 留空 = 与 INTENT_LLM_MODEL 生效值相同
# CHATBI_TEXT2SQL_SUMMARY_LLM_MODEL=
# 多轮对话块注入 build_sql_prompt 前的最大字符数(超出截尾部)
# TEXT2SQL_DIALOGUE_CONTEXT_MAX_LEN=8000
# 可选别名(与 lib/supabase/server.ts 一致);若设置,仍需与上面 URL 同属一个项目
# SUPABASE_URL=
# SUPABASE_SERVICE_KEY=
# --- admin/sync 鉴权(服务端 only · 勿提交 Git)---
# 真值(与前端 ai-ink-brain 的 SYNC_ADMIN_SECRET 同值):
SYNC_ADMIN_SECRET=
# 已废弃 · 前端不再使用 · 代码仍作 fallback · 计划后续删除:
# NEXT_PUBLIC_ADMIN_SECRET=
# CHAT_API_SECRET=
SILICONFLOW_EMBEDDING_DIMENSIONS=1024
RAG_MATCH_THRESHOLD=0.3
# =============================================================================
# Portfolio 演示站 · ingest / admin/sync(PORTFOLIO-RAG-DEMO@2026-06-01)
# 真值:docs/meta/PROJECT_CONFIG_AI_INK_BRAIN_API_PYTHON.md §C.1
# RUNBOOK:docs/harness/guides/RUNBOOK_portfolio_rag_five_questions_v1_zh.md
# =============================================================================
#
# 【后端不需要】NEXT_PUBLIC_SITE_MODE —— 该变量仅在前端 ai-ink-brain 控制导航/首页;
# Python 进程不读取。前端 Vercel Production 须设 NEXT_PUBLIC_SITE_MODE=portfolio。
#
# CONTENT_ROOT:admin/sync 扫描 Markdown 的根目录(仅 .md / .mdx)。
# - 本地开发(推荐):指向前端仓 content/ 绝对路径,与站点展示/RAG 同源
# CONTENT_ROOT=/path/to/ai-ink-brain/content
# - 生产/预发(Python 部署 env):
# ① 若 curl 打到「本 Python 实例」的 POST /api/py/admin/sync,则本进程须能 read 该路径;
# ② 常见替代:在本机或 CI 起 Python(CONTENT_ROOT 指本地 checkout),对「同一 Supabase」
# 执行 sync,生产 Unified Chat 仍读同一向量库(不必 production serverless 挂载 content)。
# - 留空:回退 REPO_ROOT/content(后端仓内,portfolio 生产禁止依赖此回退)
CONTENT_ROOT=/path/to/ai-ink-brain/content
# Harness / 代理自检(示例 · sync curl 文档别名 ADMIN_TOKEN,非 env 键名)
API_BASE=https://your-frontend-or-bff.example.com
API_KEY=
# shell 文档别名(非 env 键):export ADMIN_TOKEN="$SYNC_ADMIN_SECRET"
ADMIN_TOKEN=
# ------------- Langchain -------------
I18N_EXPAND_ENABLED=true
I18N_EXPAND_MODE=glossary
I18N_EXPAND_MAX_CANDIDATES=5
I18N_EXPAND_MAX_CANDIDATE_CHARS=48
I18N_EXPAND_MAX_QUERY_TEXT_CHARS=240
# =============================================================================
# ChatBI V2 Agent / Intent(生产可保留第一节;第二节仅本地评测与基准)
# =============================================================================
# ----- 生产 / 预发常用(按需)-----
# Unified Chat 是否走 V2 ReAct 路径(默认 false)
CHATBI_USE_AGENT=true
# 对话主模型(与 INTENT 可不同)
SILICONFLOW_CHAT_MODEL=deepseek-ai/DeepSeek-V4-Pro
# Intent 是否调用 SiliconFlow(false = 启发式 + 超时后 V1,无上游 client,适合 CI)
CHATBI_V2_INTENT_LLM=true
INTENT_LLM_MODEL=deepseek-ai/DeepSeek-V4-Pro
# Intent 单次 wait_for 上限(秒);超时 → raw_response.used=v1_fallback
CHATBI_V2_INTENT_TIMEOUT_S=60
# Intent 站点上下文 YAML(Portfolio Q4/人名路由 · Step1 C-lite)
# INTENT_HINTS_ENABLED=true
# INTENT_HINTS_PATH=docs/chatbi/v1/intent_hints.yaml
# Step2:LLM 选 direct 且 YAML 命中人名/经历信号时强制 rag(0/false/no/off 关 · 等同 Step1)
# INTENT_HINTS_ARBITRATION=true
# Intent LLM 外呼最大尝试次数(含首次);瞬态失败指数退避后重试,耗尽 → v1_fallback
# CHATBI_V2_INTENT_LLM_RETRIES=3
# CHATBI_V2_INTENT_LLM_RETRY_BACKOFF_S=0.15
# 各轮 wait_for 相对首轮系数(默认 1.0,0.65,0.4 — 首轮全量、二三轮递减)
# CHATBI_V2_INTENT_RETRY_TIMEOUT_FACTORS=1.0,0.65,0.4
# V2 Agent 传入 decide_intent_v2 的最低置信度(见 api/agent.py)
# INTENT_MIN_CONFIDENCE=0.6
# P1-4 §4.3:低置信 + SQL 候选时发 agent.clarify 并短路首轮 text2sql(默认关;见 SPEC-ChatBI-V2-Events §3.2.1)
# CHATBI_V3_LOW_CONFIDENCE_CLARIFY=0
# 澄清追问是否附带 Intent reasoning(可能含物理表名;默认关,见 PROJECT_CONFIG)
# CHATBI_V3_CLARIFY_PROMPT_USE_REASONING=0
# V3:澄清分支内是否生成 SQL 预览 + plan_execution_token(默认开;须与上一行 clarify 同开才生效;见 SPEC §3.2.2)
# 显式关闭:CHATBI_V3_PLAN_PREVIEW_CONFIRM=0
# 放行令牌 TTL(秒,30~600,默认 120)
# CHATBI_PLAN_TOKEN_TTL_S=120
# 令牌 HMAC 密钥(生产建议设置;留空则从 admin_secret 派生)
# CHATBI_PLAN_EXEC_TOKEN_SECRET=
# 排障:Agent 侧是否写库级 debug(生产建议 0 或不设)
DEBUG_AGENT_DB_LOG=0
# Intent 缓存诊断日志(仅打 key_hash + latency_ms;生产一般 0)
# DEBUG_INTENT_CACHE=0
# ----- 仅本地 / CI 评测与基准(生产勿设或保持 false)-----
# pytest:`tests/conftest.py` 会在导入 api 前把 CHATBI_V2_INTENT_EVAL / BENCH_RUN / LLM 默认置为 false,
# 避免 .env 打开评测导致「pytest tests」卡死;若要在同一次 pytest 里沿用 .env 的开关,设:
# CHATBI_PYTEST_KEEP_INTENT_ENV=1
CHATBI_V2_INTENT_EVAL=false
# 开启 60 条真实/ stub 意图评测时再设 true,并配 SILICONFLOW_API_KEY
# CHATBI_V2_INTENT_EVAL=true
# 评测导出 JSONL(相对路径以仓库根为锚时写 tests/_out/...)
# CHATBI_V2_INTENT_EVAL_OUT=tests/_out/intent_llm_latest.jsonl
# B1 脚本采样次数(仅 tests/benchmark_intent_latency.py)
# CHATBI_V2_INTENT_BENCH_N=100
# 是否在 pytest 里跑 intent_benchmark(依赖外网 + 密钥)
# CHATBI_V2_INTENT_BENCH_RUN=false
# 冷/热缓存两轮对比(仅 benchmark 脚本)
# CHATBI_V2_INTENT_BENCH_COLD_WARM=0