Files
ailine/backend/app/config.py

151 lines
5.3 KiB
Python
Raw Normal View History

2026-04-21 11:02:16 +08:00
"""
环境变量集中管理模块
所有配置项统一定义避免散落在各个文件中
2026-04-21 18:41:14 +08:00
配置分组相关配置放在一起URL API Key 配对
所有配置直接从环境变量读取无默认值避免配置混乱
需要类型转换的配置在此处理
2026-04-21 11:02:16 +08:00
"""
import os
2026-04-21 21:55:31 +08:00
from dotenv import load_dotenv
2026-04-21 11:02:16 +08:00
2026-04-21 21:55:31 +08:00
load_dotenv()
2026-04-21 11:02:16 +08:00
2026-04-21 18:41:14 +08:00
# ========== 辅助函数:类型转换 ==========
def _get_str(key: str) -> str | None:
"""获取字符串配置"""
return os.getenv(key)
2026-04-21 11:02:16 +08:00
2026-04-21 18:41:14 +08:00
def _get_int(key: str) -> int | None:
"""获取整数配置,自动转换"""
value = os.getenv(key)
if value is not None:
try:
return int(value)
except (ValueError, TypeError):
pass
return None
def _get_bool(key: str) -> bool | None:
"""获取布尔配置,自动转换"""
value = os.getenv(key)
if value is not None:
return value.lower() in ("true", "1", "yes", "on")
return None
# ========== 第三方 API 密钥 ==========
ZHIPUAI_API_KEY = _get_str("ZHIPUAI_API_KEY")
DEEPSEEK_API_KEY = _get_str("DEEPSEEK_API_KEY")
SILICONFLOW_API_KEY = _get_str("SILICONFLOW_API_KEY")
BAOSI_API_KEY = _get_str("BAOSI_API_KEY")
2026-04-21 18:41:14 +08:00
# ========== 智谱 API 配置 ==========
# 嵌入模型:根据 https://docs.bigmodel.cn/cn/guide/start/model-overview
# 可选embedding-2 (1024维)、embedding-3 (2048维)
# 注意:如果 Qdrant collection 是1024维请使用 embedding-2
ZHIPU_EMBEDDING_MODEL = _get_str("ZHIPU_EMBEDDING_MODEL") or "embedding-2"
# 重排模型:可选 rerank-1、rerank-2
ZHIPU_RERANK_MODEL = _get_str("ZHIPU_RERANK_MODEL") or "rerank-2"
ZHIPU_API_BASE = _get_str("ZHIPU_API_BASE") or "https://open.bigmodel.cn/api/paas/v4"
# ========== 硅基流动(SiliconFlow) API 配置 ==========
# 重排模型BAAI/bge-reranker-v2-m3
SILICONFLOW_RERANK_MODEL = _get_str("SILICONFLOW_RERANK_MODEL") or "BAAI/bge-reranker-v2-m3"
SILICONFLOW_API_BASE = _get_str("SILICONFLOW_API_BASE") or "https://api.siliconflow.cn/v1"
# ========== Baosi API 配置 ==========
BAOSI_API_BASE = _get_str("BAOSI_API_BASE") or "https://api.baosiapi.com"
BAOSI_MODEL = _get_str("BAOSI_MODEL") or "ops4.7"
# ========== 稀疏模型配置 ==========
SPARSE_MODEL_PATH = _get_str("SPARSE_MODEL_PATH") or "./models/sparse"
SPARSE_MODEL_NAME = _get_str("SPARSE_MODEL_NAME") or "Qdrant/bm25"
FASTEMBED_CACHE_PATH = _get_str("FASTEMBED_CACHE_PATH") or "./models/fastembed_cache"
# ========== 本地模型配置 ==========
LOCAL_MODEL_NAME = _get_str("LOCAL_MODEL_NAME") or "gemma-4-E4B-it"
2026-04-21 18:41:14 +08:00
# ========== llama.cpp 服务配置URL + API密钥 配对) ==========
# 主 LLM 服务
VLLM_BASE_URL = _get_str("VLLM_BASE_URL")
LLM_API_KEY = _get_str("LLM_API_KEY")
2026-04-21 18:41:14 +08:00
# Embedding 服务 (用于 Mem0 的向量化)
LLAMACPP_EMBEDDING_URL = _get_str("LLAMACPP_EMBEDDING_URL")
LLAMACPP_API_KEY = _get_str("LLAMACPP_API_KEY")
# Reranker 服务
LLAMACPP_RERANKER_URL = _get_str("LLAMACPP_RERANKER_URL")
# ========== 小模型配置(查询改写、意图分类等简单任务) ==========
# 默认复用大模型配置,后续可单独配置
# 本地小模型(默认复用 VLLM 配置)
SMALL_VLLM_BASE_URL = _get_str("SMALL_VLLM_BASE_URL")
SMALL_LLM_API_KEY = _get_str("SMALL_LLM_API_KEY")
SMALL_LOCAL_MODEL_NAME = _get_str("SMALL_LOCAL_MODEL_NAME") or LOCAL_MODEL_NAME
# 如果小模型没单独配置,用大模型的配置
if not SMALL_VLLM_BASE_URL:
SMALL_VLLM_BASE_URL = VLLM_BASE_URL
if not SMALL_LLM_API_KEY:
SMALL_LLM_API_KEY = LLM_API_KEY
# DeepSeek 小模型(默认复用 DeepSeek 配置)
SMALL_DEEPSEEK_API_KEY = _get_str("SMALL_DEEPSEEK_API_KEY")
SMALL_DEEPSEEK_MODEL = _get_str("SMALL_DEEPSEEK_MODEL") or "deepseek-chat"
SMALL_DEEPSEEK_API_BASE = _get_str("SMALL_DEEPSEEK_API_BASE") or "https://api.deepseek.com"
# 如果小模型没单独配置,用大模型的配置
if not SMALL_DEEPSEEK_API_KEY:
SMALL_DEEPSEEK_API_KEY = DEEPSEEK_API_KEY
2026-04-21 11:02:16 +08:00
2026-04-21 18:41:14 +08:00
# ========== Qdrant 向量数据库配置URL + API密钥 配对) ==========
QDRANT_URL = _get_str("QDRANT_URL")
QDRANT_API_KEY = _get_str("QDRANT_API_KEY")
QDRANT_COLLECTION_NAME = _get_str("QDRANT_COLLECTION_NAME")
# ========== PostgreSQL 数据库配置(分离配置 + 完整URI ==========
# 分离配置(优先使用)
DB_HOST = _get_str("DB_HOST")
DB_PORT = _get_int("DB_PORT")
DB_USER = _get_str("DB_USER")
DB_PASSWORD = _get_str("DB_PASSWORD")
DB_NAME = _get_str("DB_NAME")
# 完整连接字符串(直接从环境变量读取)
DB_URI = _get_str("DB_URI")
2026-04-22 13:28:14 +08:00
if not DB_URI and all([DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_NAME]):
DB_URI = f"postgresql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}?sslmode=disable"
2026-04-21 11:02:16 +08:00
# ========== 后端服务配置 ==========
2026-04-21 18:41:14 +08:00
BACKEND_PORT = _get_int("BACKEND_PORT")
2026-04-21 11:02:16 +08:00
2026-04-21 18:41:14 +08:00
# ========== Mem0 记忆层配置 ==========
# 记忆提取间隔:每 N 轮对话生成一次摘要
MEMORY_SUMMARIZE_INTERVAL = _get_int("MEMORY_SUMMARIZE_INTERVAL")
2026-04-21 11:02:16 +08:00
2026-04-21 18:41:14 +08:00
refactor: 单图方案重构 + 动态模型选择 + chat_services优化 ## 核心改动 ### 1. 单图方案重构 - 删除了多图(self.graphs),改为单图(self.graph) - 新增 MainGraphState.current_model 字段用于运行时注入模型 - llm_call 节点改为动态选择模型(create_dynamic_llm_call_node) ### 2. chat_services 优化 - 添加 _cached_services 缓存,避免重复初始化 - 新增 get_cached_chat_services() 函数,用于单图注入 - 新增 _check_http_service_available() 统一HTTP探测逻辑 - 减少重复代码,LocalVLLMChatProvider和LocalSmallModelProvider共用探测方法 ### 3. AIAgentService 重构 - initialize() 只构建一次图,传入 chat_services 字典 - 新增 _resolve_model() 模型回退逻辑 - 新增 _build_invocation() 统一构建调用参数 - process_message() 和 process_message_stream() 改为注入 current_model - 流式处理代码拆分,增加可读性 ### 4. 新增和删除文件 - 新增:backend/app/main_graph/main_graph_builder.py(图构建) - 新增:backend/app/main_graph/subgraph_wrapper.py(子图封装) - 新增:tools/test/test_tavily_search.py(测试) - 删除:backend/app/main_graph/graph.py(旧图) - 删除:backend/app/main_graph/utils/main_graph_builder.py(旧构建器) - 删除:backend/app/main_graph/utils/__init__.py ### 5. 其他更新 - README.md:新增模型服务使用情况详解章节 - backend/app/model_services/__init__.py:新增 get_cached_chat_services 导出 ## 方案优势 - 内存优化:N张图 → 1张图 - 灵活性:运行时动态选择模型,支持同会话不同模型 - 性能:模型服务缓存,初始化仅一次 - 可维护性:减少重复代码,统一HTTP探测逻辑
2026-05-05 17:30:55 +08:00
# ========== Tavily 搜索配置 ==========
# Tavily APIhttps://app.tavily.com
# 免费额度1000次/天
TAVILY_API_KEY = _get_str("TAVILY_API_KEY")
TAVILY_MAX_RESULTS = _get_int("TAVILY_MAX_RESULTS") or 5
2026-04-21 18:41:14 +08:00
# ========== Graph 执行追踪配置 ==========
# 是否启用 Graph 流转追踪(通过环境变量控制)
ENABLE_GRAPH_TRACE = _get_bool("ENABLE_GRAPH_TRACE")
# ========== 日志配置 ==========
LOG_LEVEL = _get_str("LOG_LEVEL")
DEBUG = _get_bool("DEBUG")