message / plugins /doc /core.py
hunian
refactor(plugins): 插件短名并统一 MCP tool 为 {plugin}-{tool}
cc826a1
Raw
History Blame Contribute Delete
2.29 kB
"""
文档合并拆分核心逻辑 - 供 mcp.py 和 api.py 共用
"""
from typing import List, Optional
from app.utils.url_input_handler import resolve_text_content, encode_text_to_base64
async def do_merge(
files_base64: Optional[List[str]],
files_url: Optional[List[str]],
output_format: str = "text",
) -> dict:
"""合并多个文档。"""
contents = []
# 处理 base64 输入
if files_base64:
for f_b64 in files_base64:
try:
content, source = await resolve_text_content(f_b64, None)
contents.append(content)
except ValueError as e:
return {"success": False, "message": f"解码失败: {e}"}
# 处理 URL 输入
if files_url:
for url in files_url:
try:
content, source = await resolve_text_content(None, url)
contents.append(content)
except ValueError as e:
return {"success": False, "message": f"URL下载失败 ({url}): {e}"}
if not contents:
return {"success": False, "message": "没有提供任何文件"}
separator = "\n\n---\n\n" if output_format == "markdown" else "\n\n"
merged = separator.join(contents)
output_base64 = encode_text_to_base64(merged)
return {
"success": True,
"output_base64": output_base64,
"message": f"已合并 {len(contents)} 个文档",
}
async def do_split(
content_base64: Optional[str],
content_url: Optional[str],
split_by: str = "line",
chunk_size: int = 100,
) -> dict:
"""拆分文档。"""
try:
content, source = await resolve_text_content(content_base64, content_url)
except ValueError as e:
return {"success": False, "message": f"内容获取失败: {e}"}
chunks = []
if split_by == "line":
chunks = content.split("\n")
elif split_by == "paragraph":
chunks = content.split("\n\n")
elif split_by == "chunk":
chunks = [content[i : i + chunk_size] for i in range(0, len(content), chunk_size)]
chunks_base64 = [encode_text_to_base64(c) for c in chunks]
return {
"success": True,
"chunks_base64": chunks_base64,
"message": f"已拆分为 {len(chunks)} 个片段",
}