Spaces:
Runtime error
Runtime error
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
""" | |
@Time : 2023/5/11 14:43 | |
@Author : alexanderwu | |
@From : https://github.com/geekan/MetaGPT/blob/main/metagpt/actions/write_code.py | |
""" | |
from .design_api import WriteDesign | |
from autoagents.actions.action import Action | |
from autoagents.system.const import WORKSPACE_ROOT | |
from autoagents.system.logs import logger | |
from autoagents.system.schema import Message | |
from autoagents.system.utils.common import CodeParser | |
from tenacity import retry, stop_after_attempt, wait_fixed | |
PROMPT_TEMPLATE = """ | |
NOTICE | |
Role: You are a professional engineer; the main goal is to write PEP8 compliant, elegant, modular, easy to read and maintain Python 3.9 code (but you can also use other programming language) | |
ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example". | |
## Code: {filename} Write code with triple quoto, based on the following list and context. | |
1. Do your best to implement THIS ONLY ONE FILE. ONLY USE EXISTING API. IF NO API, IMPLEMENT IT. | |
2. Requirement: Based on the context, implement one following code file, note to return only in code form, your code will be part of the entire project, so please implement complete, reliable, reusable code snippets | |
3. Attention1: If there is any setting, ALWAYS SET A DEFAULT VALUE, ALWAYS USE STRONG TYPE AND EXPLICIT VARIABLE. | |
4. Attention2: YOU MUST FOLLOW "Data structures and interface definitions". DONT CHANGE ANY DESIGN. | |
5. Think before writing: What should be implemented and provided in this document? | |
6. CAREFULLY CHECK THAT YOU DONT MISS ANY NECESSARY CLASS/FUNCTION IN THIS FILE. | |
7. Do not use public member functions that do not exist in your design. | |
----- | |
# Context | |
{context} | |
----- | |
## Format example | |
----- | |
## Code: {filename} | |
```python | |
## {filename} | |
... | |
``` | |
----- | |
""" | |
class WriteCode(Action): | |
def __init__(self, name="WriteCode", context: list[Message] = None, llm=None): | |
super().__init__(name, context, llm) | |
def _is_invalid(self, filename): | |
return any(i in filename for i in ["mp3", "wav"]) | |
def _save(self, context, filename, code): | |
# logger.info(filename) | |
# logger.info(code_rsp) | |
if self._is_invalid(filename): | |
return | |
design = [i for i in context if i.cause_by == WriteDesign][0] | |
ws_name = CodeParser.parse_str(block="Python package name", text=design.content) | |
ws_path = WORKSPACE_ROOT / ws_name | |
if f"{ws_name}/" not in filename and all(i not in filename for i in ["requirements.txt", ".md"]): | |
ws_path = ws_path / ws_name | |
code_path = ws_path / filename | |
code_path.parent.mkdir(parents=True, exist_ok=True) | |
code_path.write_text(code) | |
logger.info(f"Saving Code to {code_path}") | |
async def write_code(self, prompt): | |
code_rsp = await self._aask(prompt) | |
code = CodeParser.parse_code(block="", text=code_rsp) | |
return code | |
async def run(self, context, filename): | |
prompt = PROMPT_TEMPLATE.format(context=context, filename=filename) | |
logger.info(f'Writing {filename}..') | |
code = await self.write_code(prompt) | |
# code_rsp = await self._aask_v1(prompt, "code_rsp", OUTPUT_MAPPING) | |
# self._save(context, filename, code) | |
return code |