feat: add ExportManuscript node

This commit is contained in:
诺斯费拉图 2026-04-12 17:50:55 +08:00
parent b1f149ff2b
commit 8140dac594
2 changed files with 142 additions and 1 deletions

View File

@ -17,7 +17,8 @@ class ResearchExtension(ComfyExtension):
from custom_nodes.research.introduction_draft import IntroductionDraft
from custom_nodes.research.methods_draft import MethodsDraft
from custom_nodes.research.consistency_check import ConsistencyCheck
return [PaperSearch, PaperClaimExtract, ClaimEvidenceAssemble, StyleProfileExtract, ReferencePaperSelect, SectionPlan, AbstractDraft, IntroductionDraft, MethodsDraft, ConsistencyCheck]
from custom_nodes.research.export_manuscript import ExportManuscript
return [PaperSearch, PaperClaimExtract, ClaimEvidenceAssemble, StyleProfileExtract, ReferencePaperSelect, SectionPlan, AbstractDraft, IntroductionDraft, MethodsDraft, ConsistencyCheck, ExportManuscript]
async def comfy_entrypoint() -> ComfyExtension:

View File

@ -0,0 +1,140 @@
"""ExportManuscript node - compile manuscript sections to output format."""
import json
import os
from datetime import datetime
from typing_extensions import override
from comfy_api.latest import ComfyNode, io
class ExportManuscript(io.ComfyNode):
"""Compile manuscript sections into a formatted document."""
@classmethod
def define_schema(cls) -> io.Schema:
return io.Schema(
node_id="ExportManuscript",
display_name="Export Manuscript",
category="Research",
inputs=[
io.String.Input(
"title",
display_name="Paper Title",
default="",
),
io.String.Input(
"authors",
display_name="Authors (comma-separated)",
default="",
),
io.String.Input(
"abstract",
display_name="Abstract",
default="",
multiline=True,
),
io.String.Input(
"introduction",
display_name="Introduction",
default="",
multiline=True,
),
io.String.Input(
"methods",
display_name="Methods",
default="",
multiline=True,
),
io.String.Input(
"results",
display_name="Results",
default="",
multiline=True,
),
io.String.Input(
"conclusion",
display_name="Conclusion",
default="",
multiline=True,
),
io.String.Input(
"output_format",
display_name="Output Format",
default="markdown",
),
],
outputs=[
io.String.Output(display_name="Output Path"),
io.String.Output(display_name="Manuscript Text"),
],
)
@classmethod
def execute(cls, title: str, authors: str, abstract: str, introduction: str,
methods: str, results: str, conclusion: str, output_format: str) -> io.NodeOutput:
# Build manuscript
lines = []
if title:
lines.append(f"# {title}")
lines.append("")
if authors:
author_list = [a.strip() for a in authors.split(",")]
lines.append("**Authors:** " + ", ".join(author_list))
lines.append("")
lines.append("---")
lines.append("")
if abstract:
lines.append("## Abstract")
lines.append("")
lines.append(abstract)
lines.append("")
if introduction:
lines.append("## 1. Introduction")
lines.append("")
lines.append(introduction)
lines.append("")
if methods:
lines.append("## 2. Methods")
lines.append("")
lines.append(methods)
lines.append("")
if results:
lines.append("## 3. Results")
lines.append("")
lines.append(results)
lines.append("")
if conclusion:
lines.append("## 4. Conclusion")
lines.append("")
lines.append(conclusion)
lines.append("")
manuscript_text = "\n".join(lines)
# Save to file
output_dir = os.path.join(os.path.dirname(__file__), "..", "..", "research_workbench", "exports")
os.makedirs(output_dir, exist_ok=True)
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"manuscript_{timestamp}.md"
filepath = os.path.join(output_dir, filename)
try:
with open(filepath, "w", encoding="utf-8") as f:
f.write(manuscript_text)
output_path = filepath
except Exception as e:
output_path = f"Error saving: {str(e)}"
return io.NodeOutput(
output_path=output_path,
manuscript_text=manuscript_text[:5000] # Truncate for display
)