Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 19 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,28 @@ LLM_API_KEY=your_api_key_here
LLM_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
LLM_MODEL_NAME=qwen-plus

# ===== ZEP记忆图谱配置 =====
# 嵌入模型配置(用于 Graphiti local 模式,可独立配置)
# 如果不配置,则默认使用 LLM 的 API
# EMBEDDING_API_KEY=your_embedding_api_key # 可选
# EMBEDDING_BASE_URL=your_embedding_base_url # 可选
# EMBEDDING_MODEL=text-embedding-3-small
# EMBEDDING_DIM=1536

# ===== 知识图谱配置 =====
# 模式选择: "cloud" (Zep Cloud) 或 "local" (Graphiti + Neo4j)
KNOWLEDGE_GRAPH_MODE=cloud

# Zep Cloud 配置 (KNOWLEDGE_GRAPH_MODE=cloud 时需要)
# 每月免费额度即可支撑简单使用:https://app.getzep.com/
ZEP_API_KEY=your_zep_api_key_here

# Graphiti / Neo4j 配置 (KNOWLEDGE_GRAPH_MODE=local 时需要)
NEO4J_URI=bolt://localhost:7687
NEO4J_USER=neo4j
NEO4J_PASSWORD=your_neo4j_password
# 嵌入向量 API Key(可选,用 LLM_API_KEY 即可,会自动使用同一 base_url)
# OPENAI_API_KEY=your_openai_key_for_embedding

# ===== 加速 LLM 配置(可选)=====
# 注意如果不使用加速配置,env文件中就不要出现下面的配置项
LLM_BOOST_API_KEY=your_api_key_here
Expand Down
16 changes: 8 additions & 8 deletions backend/app/api/graph.py
Original file line number Diff line number Diff line change
Expand Up @@ -282,9 +282,9 @@ def build_graph():
try:
logger.info("=== 开始构建图谱 ===")

# 检查配置
# 检查配置 (cloud 模式需要 Zep Cloud)
errors = []
if not Config.ZEP_API_KEY:
if Config.KNOWLEDGE_GRAPH_MODE == 'cloud' and not Config.ZEP_API_KEY:
errors.append("ZEP_API_KEY未配置")
if errors:
logger.error(f"配置错误: {errors}")
Expand Down Expand Up @@ -567,13 +567,13 @@ def get_graph_data(graph_id: str):
获取图谱数据(节点和边)
"""
try:
if not Config.ZEP_API_KEY:
if Config.KNOWLEDGE_GRAPH_MODE == 'cloud' and not Config.ZEP_API_KEY:
return jsonify({
"success": False,
"error": "ZEP_API_KEY未配置"
}), 500
builder = GraphBuilderService(api_key=Config.ZEP_API_KEY)

builder = GraphBuilderService()
graph_data = builder.get_graph_data(graph_id)

return jsonify({
Expand All @@ -595,13 +595,13 @@ def delete_graph(graph_id: str):
删除Zep图谱
"""
try:
if not Config.ZEP_API_KEY:
if Config.KNOWLEDGE_GRAPH_MODE == 'cloud' and not Config.ZEP_API_KEY:
return jsonify({
"success": False,
"error": "ZEP_API_KEY未配置"
}), 500
builder = GraphBuilderService(api_key=Config.ZEP_API_KEY)

builder = GraphBuilderService()
builder.delete_graph(graph_id)

return jsonify({
Expand Down
16 changes: 8 additions & 8 deletions backend/app/api/simulation.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,18 +56,18 @@ def get_graph_entities(graph_id: str):
enrich: 是否获取相关边信息(默认true)
"""
try:
if not Config.ZEP_API_KEY:
if Config.KNOWLEDGE_GRAPH_MODE == 'cloud' and not Config.ZEP_API_KEY:
return jsonify({
"success": False,
"error": "ZEP_API_KEY未配置"
}), 500

entity_types_str = request.args.get('entity_types', '')
entity_types = [t.strip() for t in entity_types_str.split(',') if t.strip()] if entity_types_str else None
enrich = request.args.get('enrich', 'true').lower() == 'true'

logger.info(f"获取图谱实体: graph_id={graph_id}, entity_types={entity_types}, enrich={enrich}")

reader = ZepEntityReader()
result = reader.filter_defined_entities(
graph_id=graph_id,
Expand All @@ -93,12 +93,12 @@ def get_graph_entities(graph_id: str):
def get_entity_detail(graph_id: str, entity_uuid: str):
"""获取单个实体的详细信息"""
try:
if not Config.ZEP_API_KEY:
if Config.KNOWLEDGE_GRAPH_MODE == 'cloud' and not Config.ZEP_API_KEY:
return jsonify({
"success": False,
"error": "ZEP_API_KEY未配置"
}), 500

reader = ZepEntityReader()
entity = reader.get_entity_with_context(graph_id, entity_uuid)

Expand Down Expand Up @@ -126,12 +126,12 @@ def get_entity_detail(graph_id: str, entity_uuid: str):
def get_entities_by_type(graph_id: str, entity_type: str):
"""获取指定类型的所有实体"""
try:
if not Config.ZEP_API_KEY:
if Config.KNOWLEDGE_GRAPH_MODE == 'cloud' and not Config.ZEP_API_KEY:
return jsonify({
"success": False,
"error": "ZEP_API_KEY未配置"
}), 500

enrich = request.args.get('enrich', 'true').lower() == 'true'

reader = ZepEntityReader()
Expand Down
35 changes: 32 additions & 3 deletions backend/app/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,27 @@ class Config:
LLM_API_KEY = os.environ.get('LLM_API_KEY')
LLM_BASE_URL = os.environ.get('LLM_BASE_URL', 'https://api.openai.com/v1')
LLM_MODEL_NAME = os.environ.get('LLM_MODEL_NAME', 'gpt-4o-mini')

# 嵌入模型配置(用于 Graphiti local 模式,可独立配置)
EMBEDDING_API_KEY = os.environ.get('EMBEDDING_API_KEY') # 可选,默认使用 LLM_API_KEY
EMBEDDING_BASE_URL = os.environ.get('EMBEDDING_BASE_URL') # 可选,默认使用 LLM_BASE_URL
EMBEDDING_MODEL = os.environ.get('EMBEDDING_MODEL', 'text-embedding-3-small')
EMBEDDING_DIM = int(os.environ.get('EMBEDDING_DIM', '1536'))

# Zep配置
# 知识图谱模式配置
# cloud: 使用 Zep Cloud (默认)
# local: 使用 Graphiti + Neo4j (本地部署)
KNOWLEDGE_GRAPH_MODE = os.environ.get('KNOWLEDGE_GRAPH_MODE', 'cloud')

# Zep Cloud 配置 (KNOWLEDGE_GRAPH_MODE=cloud 时需要)
ZEP_API_KEY = os.environ.get('ZEP_API_KEY')

# Graphiti / Neo4j 配置 (KNOWLEDGE_GRAPH_MODE=local 时需要)
NEO4J_URI = os.environ.get('NEO4J_URI', 'bolt://localhost:7687')
NEO4J_USER = os.environ.get('NEO4J_USER', 'neo4j')
NEO4J_PASSWORD = os.environ.get('NEO4J_PASSWORD')
# OpenAI API 用于嵌入向量 (Graphiti 模式需要)
OPENAI_API_KEY = os.environ.get('OPENAI_API_KEY')

# 文件上传配置
MAX_CONTENT_LENGTH = 50 * 1024 * 1024 # 50MB
Expand Down Expand Up @@ -69,7 +87,18 @@ def validate(cls):
errors = []
if not cls.LLM_API_KEY:
errors.append("LLM_API_KEY 未配置")
if not cls.ZEP_API_KEY:
errors.append("ZEP_API_KEY 未配置")

# 根据模式验证对应的配置
if cls.KNOWLEDGE_GRAPH_MODE == 'cloud':
if not cls.ZEP_API_KEY:
errors.append("ZEP_API_KEY 未配置 (当前模式: cloud)")
elif cls.KNOWLEDGE_GRAPH_MODE == 'local':
if not cls.NEO4J_PASSWORD:
errors.append("NEO4J_PASSWORD 未配置 (当前模式: local)")
if not cls.LLM_API_KEY and not cls.OPENAI_API_KEY:
errors.append("LLM_API_KEY 或 OPENAI_API_KEY 未配置 (当前模式: local,用于嵌入向量)")
else:
errors.append(f"未知的 KNOWLEDGE_GRAPH_MODE: {cls.KNOWLEDGE_GRAPH_MODE}")

return errors

Loading