mirror of
https://gitee.com/wanwujie/deer-flow
synced 2026-04-22 05:34:45 +08:00
feat: add ppt generation feat
This commit is contained in:
30
src/ppt/graph/builder.py
Normal file
30
src/ppt/graph/builder.py
Normal file
@@ -0,0 +1,30 @@
|
||||
# Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
from langgraph.graph import END, START, StateGraph
|
||||
|
||||
from src.ppt.graph.ppt_composer_node import ppt_composer_node
|
||||
from src.ppt.graph.ppt_generator_node import ppt_generator_node
|
||||
from src.ppt.graph.state import PPTState
|
||||
|
||||
|
||||
def build_graph():
|
||||
"""Build and return the ppt workflow graph."""
|
||||
# build state graph
|
||||
builder = StateGraph(PPTState)
|
||||
builder.add_node("ppt_composer", ppt_composer_node)
|
||||
builder.add_node("ppt_generator", ppt_generator_node)
|
||||
builder.add_edge(START, "ppt_composer")
|
||||
builder.add_edge("ppt_composer", "ppt_generator")
|
||||
builder.add_edge("ppt_generator", END)
|
||||
return builder.compile()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
from dotenv import load_dotenv
|
||||
|
||||
load_dotenv()
|
||||
|
||||
report_content = open("examples/nanjing_tangbao.md").read()
|
||||
workflow = build_graph()
|
||||
final_state = workflow.invoke({"input": report_content})
|
||||
33
src/ppt/graph/ppt_composer_node.py
Normal file
33
src/ppt/graph/ppt_composer_node.py
Normal file
@@ -0,0 +1,33 @@
|
||||
# Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
import logging
|
||||
import os
|
||||
import uuid
|
||||
|
||||
from langchain.schema import HumanMessage, SystemMessage
|
||||
|
||||
from src.config.agents import AGENT_LLM_MAP
|
||||
from src.llms.llm import get_llm_by_type
|
||||
from src.prompts.template import get_prompt_template
|
||||
|
||||
from .state import PPTState
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def ppt_composer_node(state: PPTState):
|
||||
logger.info("Generating ppt content...")
|
||||
model = get_llm_by_type(AGENT_LLM_MAP["ppt_composer"])
|
||||
ppt_content = model.invoke(
|
||||
[
|
||||
SystemMessage(content=get_prompt_template("ppt_composer")),
|
||||
HumanMessage(content=state["input"]),
|
||||
],
|
||||
)
|
||||
logger.info(f"ppt_content: {ppt_content}")
|
||||
# save the ppt content in a temp file
|
||||
temp_ppt_file_path = os.path.join(os.getcwd(), f"ppt_content_{uuid.uuid4()}.md")
|
||||
with open(temp_ppt_file_path, "w") as f:
|
||||
f.write(ppt_content.content)
|
||||
return {"ppt_content": ppt_content, "ppt_file_path": temp_ppt_file_path}
|
||||
25
src/ppt/graph/ppt_generator_node.py
Normal file
25
src/ppt/graph/ppt_generator_node.py
Normal file
@@ -0,0 +1,25 @@
|
||||
# Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
import logging
|
||||
import os
|
||||
import subprocess
|
||||
import uuid
|
||||
|
||||
from src.ppt.graph.state import PPTState
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def ppt_generator_node(state: PPTState):
|
||||
logger.info("Generating ppt file...")
|
||||
# use marp cli to generate ppt file
|
||||
# https://github.com/marp-team/marp-cli?tab=readme-ov-file
|
||||
generated_file_path = os.path.join(
|
||||
os.getcwd(), f"generated_ppt_{uuid.uuid4()}.pptx"
|
||||
)
|
||||
subprocess.run(["marp", state["ppt_file_path"], "-o", generated_file_path])
|
||||
# remove the temp file
|
||||
os.remove(state["ppt_file_path"])
|
||||
logger.info(f"generated_file_path: {generated_file_path}")
|
||||
return {"generated_file_path": generated_file_path}
|
||||
20
src/ppt/graph/state.py
Normal file
20
src/ppt/graph/state.py
Normal file
@@ -0,0 +1,20 @@
|
||||
# Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
from typing import Optional
|
||||
|
||||
from langgraph.graph import MessagesState
|
||||
|
||||
|
||||
class PPTState(MessagesState):
|
||||
"""State for the ppt generation."""
|
||||
|
||||
# Input
|
||||
input: str = ""
|
||||
|
||||
# Output
|
||||
generated_file_path: str = ""
|
||||
|
||||
# Assets
|
||||
ppt_content: str = ""
|
||||
ppt_file_path: str = ""
|
||||
Reference in New Issue
Block a user