92 lines
2.7 KiB
Python
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()
|