Spaces:
Paused
Paused
| #!/usr/bin/env python | |
| # -*- coding: utf-8 -*- | |
| """ | |
| @Time : 2024/2/1 12:01 | |
| @Author : alexanderwu | |
| @File : write_novel.py | |
| """ | |
| import asyncio | |
| from typing import List | |
| from pydantic import BaseModel, Field | |
| from metagpt.actions.action_node import ActionNode | |
| from metagpt.llm import LLM | |
| class Chapter(BaseModel): | |
| name: str = Field(default="Chapter 1", description="The name of the chapter.") | |
| content: str = Field(default="...", description="The content of the chapter. No more than 1000 words.") | |
| class Chapters(BaseModel): | |
| chapters: List[Chapter] = Field( | |
| default=[ | |
| {"name": "Chapter 1", "content": "..."}, | |
| {"name": "Chapter 2", "content": "..."}, | |
| {"name": "Chapter 3", "content": "..."}, | |
| ], | |
| description="The chapters of the novel.", | |
| ) | |
| class Novel(BaseModel): | |
| name: str = Field(default="The Lord of the Rings", description="The name of the novel.") | |
| user_group: str = Field(default="...", description="The user group of the novel.") | |
| outlines: List[str] = Field( | |
| default=["Chapter 1: ...", "Chapter 2: ...", "Chapter 3: ..."], | |
| description="The outlines of the novel. No more than 10 chapters.", | |
| ) | |
| background: str = Field(default="...", description="The background of the novel.") | |
| character_names: List[str] = Field(default=["Frodo", "Gandalf", "Sauron"], description="The characters.") | |
| conflict: str = Field(default="...", description="The conflict of the characters.") | |
| plot: str = Field(default="...", description="The plot of the novel.") | |
| ending: str = Field(default="...", description="The ending of the novel.") | |
| async def generate_novel(): | |
| instruction = ( | |
| "Write a novel named 'Reborn in Skyrim'. " | |
| "Fill the empty nodes with your own ideas. Be creative! Use your own words!" | |
| "I will tip you $100,000 if you write a good novel." | |
| ) | |
| novel_node = await ActionNode.from_pydantic(Novel).fill(context=instruction, llm=LLM()) | |
| chap_node = await ActionNode.from_pydantic(Chapters).fill( | |
| context=f"### instruction\n{instruction}\n### novel\n{novel_node.content}", llm=LLM() | |
| ) | |
| print(chap_node.instruct_content) | |
| asyncio.run(generate_novel()) | |