| """ |
| 文档合并拆分核心逻辑 - 供 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 = [] |
|
|
| |
| 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}"} |
|
|
| |
| 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)} 个片段", |
| } |