Files
mnote/wolai-backend/app/services/simple_ai_service.py
T

92 lines
2.7 KiB
Python

from __future__ import annotations
import json
from typing import Dict, Optional
from app.services.supabase_rest import supabase_rest
class SimpleAIService:
"""提供在 LightRAG 不可用时的兜底回答。"""
def summarize_document(
self,
*,
query: str,
user_id: str,
document_id: Optional[str],
workspace_id: Optional[str],
) -> Dict[str, object]:
document = None
if document_id:
document = supabase_rest.select_one(
"documents",
{
"id": document_id,
"user_id": user_id,
},
)
title = (document or {}).get("title") or "当前页面"
raw_text = (document or {}).get("raw_text") or ""
if not raw_text and document and document.get("content"):
raw_text = self._blocks_to_text(document["content"])
snippet = raw_text.strip().replace("\n", " ")
if len(snippet) > 400:
snippet = snippet[:400].rstrip() + "…"
if snippet:
summary = f"《{title}》当前摘要:{snippet}"
else:
summary = f"《{title}》暂未填写正文内容,可直接编辑后再次提问。"
answer = "\n\n".join(
[
summary,
f"你的问题:{query}",
"(提示:LightRAG 暂未就绪,已使用本地摘要兜底回答)",
]
)
references = []
if document_id:
ref_path = f"doc://{document_id}"
if title:
ref_path = f"{ref_path}?title={title}"
references.append(
{
"file_path": ref_path,
"workspace": workspace_id or "",
}
)
return {"content": answer, "references": references}
def _blocks_to_text(self, content: object) -> str:
if isinstance(content, str):
return content
if isinstance(content, list):
parts = []
for item in content:
text = self._blocks_to_text(item)
if text:
parts.append(text)
return " ".join(parts)
if isinstance(content, dict):
if "text" in content and isinstance(content["text"], str):
return content["text"]
parts = []
for value in content.values():
text = self._blocks_to_text(value)
if text:
parts.append(text)
return " ".join(parts)
try:
return json.dumps(content, ensure_ascii=False)
except TypeError:
return ""
simple_ai_service = SimpleAIService()