feat(api): add tiered configuration and graph data caching
This commit is contained in:
parent
e7f452ed9e
commit
d790accebc
|
|
@ -17,6 +17,7 @@ from ..utils.file_parser import FileParser
|
||||||
from ..utils.logger import get_logger
|
from ..utils.logger import get_logger
|
||||||
from ..utils.locale import t, get_locale, set_locale
|
from ..utils.locale import t, get_locale, set_locale
|
||||||
from ..models.task import TaskManager, TaskStatus
|
from ..models.task import TaskManager, TaskStatus
|
||||||
|
from ..utils.zep_rate_limiter import graph_data_cache
|
||||||
from ..models.project import ProjectManager, ProjectStatus
|
from ..models.project import ProjectManager, ProjectStatus
|
||||||
|
|
||||||
# 获取日志器
|
# 获取日志器
|
||||||
|
|
@ -564,12 +565,35 @@ def list_tasks():
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
# ============== 配置接口 ==============
|
||||||
|
|
||||||
|
@graph_bp.route('/config', methods=['GET'])
|
||||||
|
def get_graph_config():
|
||||||
|
"""
|
||||||
|
返回前端需要的图谱轮询配置。
|
||||||
|
前端根据这些值决定是否自动轮询以及间隔。
|
||||||
|
"""
|
||||||
|
# 初始化缓存 TTL(确保与 Config 同步)
|
||||||
|
graph_data_cache.ttl = Config.ZEP_CACHE_TTL
|
||||||
|
|
||||||
|
return jsonify({
|
||||||
|
"success": True,
|
||||||
|
"data": {
|
||||||
|
"poll_interval": Config.ZEP_GRAPH_POLL_INTERVAL, # 0 = 仅手动刷新
|
||||||
|
"cache_ttl": Config.ZEP_CACHE_TTL,
|
||||||
|
"rate_limit": Config.ZEP_RATE_LIMIT,
|
||||||
|
"rate_limit_window": Config.ZEP_RATE_LIMIT_WINDOW,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
# ============== 图谱数据接口 ==============
|
# ============== 图谱数据接口 ==============
|
||||||
|
|
||||||
@graph_bp.route('/data/<graph_id>', methods=['GET'])
|
@graph_bp.route('/data/<graph_id>', methods=['GET'])
|
||||||
def get_graph_data(graph_id: str):
|
def get_graph_data(graph_id: str):
|
||||||
"""
|
"""
|
||||||
获取图谱数据(节点和边)
|
获取图谱数据(节点和边)。
|
||||||
|
使用响应缓存避免频繁调用 Zep API。
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
if not Config.ZEP_API_KEY:
|
if not Config.ZEP_API_KEY:
|
||||||
|
|
@ -578,12 +602,28 @@ def get_graph_data(graph_id: str):
|
||||||
"error": t('api.zepApiKeyMissing')
|
"error": t('api.zepApiKeyMissing')
|
||||||
}), 500
|
}), 500
|
||||||
|
|
||||||
|
# 检查缓存
|
||||||
|
cache_key = f"graph_data:{graph_id}"
|
||||||
|
cached = graph_data_cache.get(cache_key)
|
||||||
|
if cached is not None:
|
||||||
|
logger.debug(f"Serving cached graph data for {graph_id}")
|
||||||
|
return jsonify({
|
||||||
|
"success": True,
|
||||||
|
"data": cached,
|
||||||
|
"cached": True
|
||||||
|
})
|
||||||
|
|
||||||
|
# 缓存未命中,调用 Zep API
|
||||||
builder = GraphBuilderService(api_key=Config.ZEP_API_KEY)
|
builder = GraphBuilderService(api_key=Config.ZEP_API_KEY)
|
||||||
graph_data = builder.get_graph_data(graph_id)
|
graph_data = builder.get_graph_data(graph_id)
|
||||||
|
|
||||||
|
# 缓存成功响应
|
||||||
|
graph_data_cache.set(cache_key, graph_data)
|
||||||
|
|
||||||
return jsonify({
|
return jsonify({
|
||||||
"success": True,
|
"success": True,
|
||||||
"data": graph_data
|
"data": graph_data,
|
||||||
|
"cached": False
|
||||||
})
|
})
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|
|
||||||
|
|
@ -68,3 +68,14 @@ export function getProject(projectId) {
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取图谱轮询配置(速率限制参数)
|
||||||
|
* @returns {Promise} { poll_interval, cache_ttl, rate_limit, rate_limit_window }
|
||||||
|
*/
|
||||||
|
export function getGraphConfig() {
|
||||||
|
return service({
|
||||||
|
url: '/api/graph/config',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue