[架构重构] 移除本地Ollama融合,云端直出JSON直存DB,Q&A三模型降级
1. 视频摘要链路:云端VLM直出结构化JSON → Edge format_cloud_result格式化校验 → 直存NAS DB(移除run_text_fusion本地融合) 2. 智能问答链路:Gemini→NVIDIA→Ollama降级,新增chat()纯文本问答方法 3. 适配器重构:base/gemini/nvidia/ollama adapter新增chat();gemini多图单请求结构化JSON;nvidia逐帧调用聚合 4. 端点变更:/api/edge/chat → /api/edge/chat/ask,调orchestrator.run_qa() 5. chat_handler改经Edge Q&A编排,不再直连Ollama 6. 配置更新:ollama_url → qa_url,Ollama role注释改为Q&A兜底 7. README同步更新架构描述、拓扑图、时序图、模块表
This commit is contained in:
@@ -37,6 +37,6 @@ video_server:
|
||||
video_dir: "/volume1/surveillance"
|
||||
|
||||
chat_handler:
|
||||
ollama_url: "http://129.146.203.203:5000/api/edge/chat"
|
||||
model_name: "llava-phi3"
|
||||
# 智能问答统一走 FAM-Edge 编排端点(Gemini → NVIDIA → 本地 Ollama 兜底)
|
||||
qa_url: "http://129.146.203.203:5000/api/edge/chat/ask"
|
||||
timeout: 120
|
||||
|
||||
@@ -71,27 +71,25 @@ def _aggregate_by_hour(details):
|
||||
return '\n'.join(lines)
|
||||
|
||||
|
||||
def _call_ollama(prompt: str) -> str:
|
||||
"""调用 Oracle Ollama 纯文本模式"""
|
||||
def _call_edge_qa(prompt: str) -> str:
|
||||
"""调用 FAM-Edge 问答编排端点(Gemini → NVIDIA → 本地 Ollama 兜底)"""
|
||||
cfg = load_config()
|
||||
ollama_url = cfg.get('chat_handler', {}).get(
|
||||
'ollama_url', 'http://localhost:11434/api/generate'
|
||||
qa_url = cfg.get('chat_handler', {}).get(
|
||||
'qa_url', 'http://129.146.203.203:5000/api/edge/chat/ask'
|
||||
)
|
||||
model_name = cfg.get('chat_handler', {}).get('model_name', 'llava-phi3')
|
||||
timeout = cfg.get('chat_handler', {}).get('timeout', 120)
|
||||
|
||||
resp = requests.post(ollama_url, json={
|
||||
"model": model_name,
|
||||
"prompt": prompt,
|
||||
"stream": False,
|
||||
"options": {"temperature": 0.3}
|
||||
}, timeout=timeout)
|
||||
resp = requests.post(qa_url, json={"prompt": prompt}, timeout=timeout)
|
||||
|
||||
if resp.status_code == 200:
|
||||
return resp.json().get('response', '')
|
||||
data = resp.json()
|
||||
answer = data.get('answer', '')
|
||||
provider = data.get('provider', 'unknown')
|
||||
logger.info(f"问答由 {provider} 提供回答(长度={len(answer)})")
|
||||
return answer
|
||||
else:
|
||||
logger.error(f"Ollama 调用失败: {resp.status_code} {resp.text}")
|
||||
raise Exception(f"Ollama error: {resp.status_code}")
|
||||
logger.error(f"Edge 问答调用失败: {resp.status_code} {resp.text[:200]}")
|
||||
raise Exception(f"Edge QA error: {resp.status_code}")
|
||||
|
||||
|
||||
@chat_bp.route('/api/chat/ask', methods=['POST'])
|
||||
@@ -136,9 +134,9 @@ def chat_ask():
|
||||
)
|
||||
|
||||
try:
|
||||
answer = _call_ollama(prompt)
|
||||
answer = _call_edge_qa(prompt)
|
||||
except Exception as e:
|
||||
logger.error(f"Ollama 调用失败: {e}")
|
||||
logger.error(f"问答编排调用失败: {e}")
|
||||
return jsonify({"error": f"AI 调用失败: {e}"}), 503
|
||||
|
||||
# 3. 写入 chat_history
|
||||
|
||||
Reference in New Issue
Block a user