[架构重构] 移除本地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:
@@ -1,14 +1,20 @@
|
||||
"""
|
||||
模型适配器基类 - 所有模型适配器的抽象基类
|
||||
|
||||
新增模型只需继承此类并实现 4 个方法:
|
||||
新增模型只需继承此类并实现方法:
|
||||
1. health_check() -> bool
|
||||
2. analyze_frames(frame_paths, frame_timestamps, known_members_context) -> Optional[str]
|
||||
3. get_timeout() -> int
|
||||
4. get_circuit_breaker() -> CircuitBreaker
|
||||
2. analyze_frames(frame_paths, frame_timestamps, known_members_context) -> Optional[dict]
|
||||
- 视觉分析:输入帧图片路径 + 时间戳 + 成员清单,直接输出**结构化结果 dict**
|
||||
(含 frame_details 等,详见 format_cloud_result 约定)。
|
||||
- 失败/超时返回 None。
|
||||
3. chat(prompt) -> Optional[str]
|
||||
- 纯文本问答(智能问答场景),返回文本或 None。
|
||||
- 默认实现抛 NotImplementedError;文本/视觉模型按需实现。
|
||||
4. get_timeout() -> int
|
||||
5. get_circuit_breaker() -> CircuitBreaker
|
||||
"""
|
||||
from abc import ABC, abstractmethod
|
||||
from typing import List, Optional
|
||||
from typing import Dict, List, Optional
|
||||
|
||||
|
||||
class BaseModelAdapter(ABC):
|
||||
@@ -17,7 +23,7 @@ class BaseModelAdapter(ABC):
|
||||
def __init__(self, provider_name: str, config: dict):
|
||||
self.provider_name = provider_name # 如 "ollama", "gemini"
|
||||
self.config = config
|
||||
# 角色: vision=视觉分析, text=文本融合/对话; 默认 vision
|
||||
# 角色: vision=视觉分析, text=智能问答兜底(本地模型); 默认 vision
|
||||
self.role = config.get('role', 'vision')
|
||||
|
||||
def get_role(self) -> str:
|
||||
@@ -32,11 +38,28 @@ class BaseModelAdapter(ABC):
|
||||
@abstractmethod
|
||||
def analyze_frames(self, frame_paths: List[str],
|
||||
frame_timestamps: List[str],
|
||||
known_members_context: str) -> Optional[str]:
|
||||
"""视觉分析:输入帧图片路径 + 时间戳 + 成员清单,输出自然语言描述。
|
||||
失败/超时返回 None。"""
|
||||
known_members_context: str) -> Optional[Dict]:
|
||||
"""视觉分析:输入帧图片路径 + 时间戳 + 成员清单,
|
||||
直接输出结构化结果 dict(含 frame_details 等)。失败/超时返回 None。
|
||||
|
||||
约定返回结构(云端模型直出,Edge 仅做格式化校验,不再本地融合):
|
||||
{
|
||||
"global_summary": "整个时段整体摘要(可选,缺失时由 Edge 格式化生成)",
|
||||
"entities_json": [{"person","action","clothing"}] (可选,缺失时由 frame_details 推导),
|
||||
"frame_details": [
|
||||
{"frame_index":int, "frame_timestamp":str, "person":str,
|
||||
"action":str, "clothing":str, "is_attention_event":bool,
|
||||
"source_providers":[provider]}
|
||||
]
|
||||
}
|
||||
"""
|
||||
pass
|
||||
|
||||
def chat(self, prompt: str, max_tokens: int = 512) -> Optional[str]:
|
||||
"""纯文本问答(智能问答场景)。默认不实现。"""
|
||||
raise NotImplementedError(
|
||||
f"{self.provider_name} 适配器未实现 chat()(不参与智能问答)")
|
||||
|
||||
@abstractmethod
|
||||
def get_timeout(self) -> int:
|
||||
"""该模型的调用超时秒数"""
|
||||
|
||||
Reference in New Issue
Block a user