parent
76e247052e
commit
97cea83285
@ -5,8 +5,6 @@ RUN_EVENTS_STREAM_TTL_SECONDS=7200
|
||||
RUN_CANCEL_KEY_TTL_SECONDS=1800
|
||||
LANGGRAPH_CHECKPOINTER_BACKEND=postgres
|
||||
VITE_USE_RUNS_API=false
|
||||
YUXI_ENABLE_LIGHTRAG=true
|
||||
YUXI_ENABLE_KNOWLEDGE_GRAPH=true
|
||||
|
||||
# region model_provider
|
||||
SILICONFLOW_API_KEY= # 推荐使用硅基流动免费服务 https://cloud.siliconflow.cn/i/Eo5yTHGJ
|
||||
|
||||
@ -30,11 +30,6 @@ cp .env.template .env.prod
|
||||
- `MINIO_ACCESS_KEY` / `MINIO_SECRET_KEY`: 修改默认密钥
|
||||
- `SILICONFLOW_API_KEY` 等模型密钥
|
||||
|
||||
如果希望以最小资源模式运行(禁用 LightRAG 和知识图谱),可额外设置:
|
||||
|
||||
- `YUXI_ENABLE_LIGHTRAG=false`
|
||||
- `YUXI_ENABLE_KNOWLEDGE_GRAPH=false`
|
||||
|
||||
### 2. 启动服务
|
||||
|
||||
使用 `docker-compose.prod.yml` 文件启动生产环境:
|
||||
@ -47,13 +42,6 @@ docker compose -f docker-compose.prod.yml up -d --build
|
||||
docker compose -f docker-compose.prod.yml --profile all up -d --build
|
||||
```
|
||||
|
||||
最小资源模式(不启动 Neo4j 图数据库)可使用:
|
||||
|
||||
```bash
|
||||
docker compose -f docker-compose.prod.yml up -d --build \
|
||||
api worker web postgres redis etcd minio milvus
|
||||
```
|
||||
|
||||
### 3. 验证部署
|
||||
|
||||
- **Web 访问**: `http://localhost` (直接通过 80 端口访问,无需 :5173)
|
||||
|
||||
@ -13,14 +13,6 @@ from src.utils.logging_config import logger
|
||||
graph = APIRouter(prefix="/graph", tags=["graph"])
|
||||
|
||||
|
||||
def _is_graph_feature_enabled() -> bool:
|
||||
return bool(getattr(graph_base, "feature_enabled", True))
|
||||
|
||||
|
||||
def _graph_disabled_detail() -> str:
|
||||
return str(getattr(graph_base, "reason", "知识图谱功能已禁用"))
|
||||
|
||||
|
||||
# =============================================================================
|
||||
# === 统一图谱接口 (Unified Graph API) ===
|
||||
# =============================================================================
|
||||
@ -36,9 +28,6 @@ async def _get_graph_adapter(db_id: str) -> GraphAdapter:
|
||||
Returns:
|
||||
GraphAdapter: 对应的图谱适配器实例
|
||||
"""
|
||||
if not _is_graph_feature_enabled():
|
||||
raise HTTPException(status_code=503, detail=_graph_disabled_detail())
|
||||
|
||||
# 检查图数据库服务状态 (仅对 Upload 类型需要)
|
||||
if not graph_base.is_running():
|
||||
# 先尝试检测图谱类型,如果是不需要 graph_base 的类型则允许
|
||||
@ -69,9 +58,6 @@ async def get_graphs(current_user: User = Depends(get_admin_user)):
|
||||
包含所有图谱信息的列表 (包括 Neo4j 和 LightRAG),以及每个类型的 capability 信息
|
||||
"""
|
||||
try:
|
||||
if not _is_graph_feature_enabled():
|
||||
return {"success": True, "data": []}
|
||||
|
||||
graphs = []
|
||||
|
||||
# 1. 获取默认 Neo4j 图谱信息 (Upload 类型)
|
||||
@ -249,9 +235,6 @@ async def get_neo4j_node(
|
||||
async def get_neo4j_info(current_user: User = Depends(get_admin_user)):
|
||||
"""获取Neo4j图数据库信息"""
|
||||
try:
|
||||
if not _is_graph_feature_enabled():
|
||||
raise HTTPException(status_code=503, detail=_graph_disabled_detail())
|
||||
|
||||
graph_info = graph_base.get_graph_info()
|
||||
if graph_info is None:
|
||||
raise HTTPException(status_code=400, detail="图数据库获取出错")
|
||||
@ -265,9 +248,6 @@ async def get_neo4j_info(current_user: User = Depends(get_admin_user)):
|
||||
async def index_neo4j_entities(data: dict = Body(default={}), current_user: User = Depends(get_admin_user)):
|
||||
"""为Neo4j图谱节点添加嵌入向量索引"""
|
||||
try:
|
||||
if not _is_graph_feature_enabled():
|
||||
raise HTTPException(status_code=503, detail=_graph_disabled_detail())
|
||||
|
||||
if not graph_base.is_running():
|
||||
raise HTTPException(status_code=400, detail="图数据库未启动")
|
||||
|
||||
@ -295,9 +275,6 @@ async def add_neo4j_entities(
|
||||
):
|
||||
"""通过JSONL文件添加图谱实体到Neo4j(只接受 MinIO URL)"""
|
||||
try:
|
||||
if not _is_graph_feature_enabled():
|
||||
raise HTTPException(status_code=503, detail=_graph_disabled_detail())
|
||||
|
||||
# 服务层会验证 URL 并从 MinIO 下载文件
|
||||
await graph_base.jsonl_file_add_entity(file_path, kgdb_name, embed_model_name, batch_size)
|
||||
return {"success": True, "message": "实体添加成功", "status": "success"}
|
||||
|
||||
@ -4,6 +4,7 @@ from fastapi import FastAPI
|
||||
|
||||
from src.services.task_service import tasker
|
||||
from src.services.mcp_service import init_mcp_servers
|
||||
from src.services.skill_service import init_skills_cache
|
||||
from src.services.run_queue_service import close_queue_clients, get_redis_client
|
||||
from src.storage.postgres.manager import pg_manager
|
||||
from src.knowledge import knowledge_base
|
||||
|
||||
@ -342,10 +342,12 @@ def gen_tool_info(tools) -> list[dict[str, Any]]:
|
||||
|
||||
def get_buildin_tools() -> list:
|
||||
"""注册静态工具"""
|
||||
static_tools = [get_approved_user_goal, calculator, text_to_img_demo]
|
||||
|
||||
if bool(getattr(graph_base, "feature_enabled", True)):
|
||||
static_tools.insert(0, query_knowledge_graph)
|
||||
static_tools = [
|
||||
query_knowledge_graph,
|
||||
get_approved_user_goal,
|
||||
calculator,
|
||||
text_to_img_demo,
|
||||
]
|
||||
|
||||
# subagents 工具
|
||||
from .subagents import calc_agent_tool
|
||||
|
||||
@ -3,49 +3,24 @@ import os
|
||||
from ..config import config
|
||||
from .factory import KnowledgeBaseFactory
|
||||
from .implementations.dify import DifyKB
|
||||
from .implementations.lightrag import LightRagKB
|
||||
from .implementations.milvus import MilvusKB
|
||||
from .manager import KnowledgeBaseManager
|
||||
from .services.disabled_graph_service import DisabledGraphService
|
||||
from .services.upload_graph_service import UploadGraphService
|
||||
from src.utils import logger
|
||||
|
||||
|
||||
def _env_enabled(name: str, default: bool = True) -> bool:
|
||||
value = os.getenv(name)
|
||||
if value is None:
|
||||
return default
|
||||
return value.strip().lower() in {"1", "true", "yes", "on"}
|
||||
|
||||
|
||||
LIGHTRAG_ENABLED = _env_enabled("YUXI_ENABLE_LIGHTRAG", default=True)
|
||||
KNOWLEDGE_GRAPH_ENABLED = _env_enabled("YUXI_ENABLE_KNOWLEDGE_GRAPH", default=True)
|
||||
|
||||
# 注册知识库类型
|
||||
KnowledgeBaseFactory.register("milvus", MilvusKB, {"description": "基于 Milvus 的生产级向量知识库,适合高性能部署"})
|
||||
KnowledgeBaseFactory.register("lightrag", LightRagKB, {"description": "基于图检索的知识库,支持实体关系构建和复杂查询"})
|
||||
KnowledgeBaseFactory.register("dify", DifyKB, {"description": "连接 Dify Dataset 的只读检索知识库"})
|
||||
|
||||
if LIGHTRAG_ENABLED:
|
||||
from .implementations.lightrag import LightRagKB
|
||||
|
||||
KnowledgeBaseFactory.register("lightrag", LightRagKB, {"description": "基于图检索的知识库,支持实体关系构建和复杂查询"})
|
||||
else:
|
||||
logger.info("LightRAG feature disabled by YUXI_ENABLE_LIGHTRAG=false")
|
||||
|
||||
# 创建知识库管理器
|
||||
work_dir = os.path.join(config.save_dir, "knowledge_base_data")
|
||||
knowledge_base = KnowledgeBaseManager(work_dir)
|
||||
|
||||
# 创建图数据库实例
|
||||
if KNOWLEDGE_GRAPH_ENABLED:
|
||||
try:
|
||||
graph_base = UploadGraphService()
|
||||
except Exception as e:
|
||||
logger.warning(f"Knowledge graph init failed, fallback to disabled mode: {e}")
|
||||
graph_base = DisabledGraphService(reason=f"知识图谱服务不可用: {e}")
|
||||
else:
|
||||
graph_base = DisabledGraphService(reason="知识图谱功能已禁用(YUXI_ENABLE_KNOWLEDGE_GRAPH=false)")
|
||||
graph_base = UploadGraphService()
|
||||
|
||||
# 向后兼容:让 GraphDatabase 指向 UploadGraphService
|
||||
GraphDatabase = UploadGraphService if KNOWLEDGE_GRAPH_ENABLED else DisabledGraphService
|
||||
GraphDatabase = UploadGraphService
|
||||
|
||||
__all__ = ["GraphDatabase", "UploadGraphService", "knowledge_base", "graph_base"]
|
||||
|
||||
@ -55,9 +55,6 @@ class KnowledgeBaseManager:
|
||||
kb_types_in_use = set()
|
||||
for row in rows:
|
||||
kb_type = row.kb_type or "lightrag"
|
||||
if not KnowledgeBaseFactory.is_type_supported(kb_type):
|
||||
logger.warning(f"[InitializeKB] 跳过未启用的知识库类型: {kb_type}")
|
||||
continue
|
||||
kb_types_in_use.add(kb_type)
|
||||
|
||||
logger.info(f"[InitializeKB] 发现 {len(kb_types_in_use)} 种知识库类型: {kb_types_in_use}")
|
||||
@ -182,9 +179,6 @@ class KnowledgeBaseManager:
|
||||
metadata_reloaded_types: set[str] = set()
|
||||
for row in rows:
|
||||
kb_type = row.kb_type or "lightrag"
|
||||
if not KnowledgeBaseFactory.is_type_supported(kb_type):
|
||||
logger.warning(f"Skip database due to unsupported kb_type: db_id={row.db_id}, kb_type={kb_type}")
|
||||
continue
|
||||
kb_instance = self._get_or_create_kb_instance(kb_type)
|
||||
db_info = kb_instance.get_database_info(row.db_id)
|
||||
if not db_info and kb_type not in metadata_reloaded_types:
|
||||
|
||||
@ -1,30 +0,0 @@
|
||||
class DisabledGraphService:
|
||||
"""禁用态图谱服务,占位实现。"""
|
||||
|
||||
feature_enabled = False
|
||||
|
||||
def __init__(self, reason: str = "知识图谱功能已禁用"):
|
||||
self.reason = reason
|
||||
|
||||
def start(self):
|
||||
return None
|
||||
|
||||
def close(self):
|
||||
return None
|
||||
|
||||
def is_running(self):
|
||||
return False
|
||||
|
||||
def get_graph_info(self, graph_name="neo4j"):
|
||||
return None
|
||||
|
||||
def query_node(self, keyword, threshold=0.9, kgdb_name="neo4j", hops=2, max_entities=8, return_format="graph", **kwargs):
|
||||
if return_format == "triples":
|
||||
return {"triples": [], "message": self.reason}
|
||||
return {"nodes": [], "edges": [], "message": self.reason}
|
||||
|
||||
async def add_embedding_to_nodes(self, node_names=None, kgdb_name="neo4j", batch_size=None):
|
||||
raise RuntimeError(self.reason)
|
||||
|
||||
async def jsonl_file_add_entity(self, file_path, kgdb_name="neo4j", embed_model_name=None, batch_size=None):
|
||||
raise RuntimeError(self.reason)
|
||||
Loading…
Reference in New Issue
Block a user