ForcePilot/backend/package/yuxi/channel/extensions/confluence/knowledge.py

68 lines
2.1 KiB
Python
Raw Normal View History

import logging
from yuxi.channel.extensions.confluence.format import extract_text_from_adf
from yuxi.channel.extensions.confluence.gateway import ConfluenceGateway
from yuxi.channel.extensions.confluence.search import CQLBuilder
logger = logging.getLogger(__name__)
class ConfluenceKnowledge:
def __init__(self, gateway: ConfluenceGateway):
self._gateway = gateway
async def retrieve_context(
self,
query: str,
account_id: str = "default",
space_keys: list[str] | None = None,
max_pages: int = 5,
) -> list[dict]:
client = self._gateway.get_client(account_id)
if client is None:
return []
cql = CQLBuilder.search_pages(query, space_keys)
try:
results = await client.cql_search(cql, limit=max_pages)
except Exception as e:
logger.error("CQL search failed for context retrieval '%s': %s", query, e)
return []
contexts = []
for item in results.get("results", []):
content = item.get("content", {})
page_id = content.get("id")
title = content.get("title", "")
body = content.get("body", {})
adf_value = body.get("view", {}).get("value", "")
text = extract_text_from_adf(adf_value) if adf_value else ""
contexts.append({
"page_id": page_id,
"title": title,
"text": text[:2000],
"url": content.get("_links", {}).get("base", ""),
})
return contexts
async def build_context_note(
self,
page_context,
account_id: str = "default",
) -> str:
if page_context is None:
return ""
client = self._gateway.get_client(account_id)
if client is None:
return ""
try:
page = await client.get_page(page_context.page_id)
title = page.get("title", "")
return f"当前页面: [{page_context.space_key}] {title}"
except Exception:
return f"当前页面: {page_context.context_label}"