Spaces:
Running
Running
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
""" | |
@Time : 2023/7/4 10:53 | |
@Author : alexanderwu alitrack | |
@File : mermaid.py | |
""" | |
import asyncio | |
import os | |
from pathlib import Path | |
from metagpt.config2 import config | |
from metagpt.logs import logger | |
from metagpt.utils.common import awrite, check_cmd_exists | |
async def mermaid_to_file(engine, mermaid_code, output_file_without_suffix, width=2048, height=2048) -> int: | |
"""suffix: png/svg/pdf | |
:param mermaid_code: mermaid code | |
:param output_file_without_suffix: output filename | |
:param width: | |
:param height: | |
:return: 0 if succeed, -1 if failed | |
""" | |
# Write the Mermaid code to a temporary file | |
dir_name = os.path.dirname(output_file_without_suffix) | |
if dir_name and not os.path.exists(dir_name): | |
os.makedirs(dir_name) | |
tmp = Path(f"{output_file_without_suffix}.mmd") | |
await awrite(filename=tmp, data=mermaid_code) | |
if engine == "nodejs": | |
if check_cmd_exists(config.mermaid.path) != 0: | |
logger.warning( | |
"RUN `npm install -g @mermaid-js/mermaid-cli` to install mmdc," | |
"or consider changing engine to `playwright`, `pyppeteer`, or `ink`." | |
) | |
return -1 | |
for suffix in ["pdf", "svg", "png"]: | |
output_file = f"{output_file_without_suffix}.{suffix}" | |
# Call the `mmdc` command to convert the Mermaid code to a PNG | |
logger.info(f"Generating {output_file}..") | |
if config.mermaid.puppeteer_config: | |
commands = [ | |
config.mermaid.path, | |
"-p", | |
config.mermaid.puppeteer_config, | |
"-i", | |
str(tmp), | |
"-o", | |
output_file, | |
"-w", | |
str(width), | |
"-H", | |
str(height), | |
] | |
else: | |
commands = [config.mermaid.path, "-i", str(tmp), "-o", output_file, "-w", str(width), "-H", str(height)] | |
process = await asyncio.create_subprocess_shell( | |
" ".join(commands), stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE | |
) | |
stdout, stderr = await process.communicate() | |
if stdout: | |
logger.info(stdout.decode()) | |
if stderr: | |
logger.warning(stderr.decode()) | |
else: | |
if engine == "playwright": | |
from metagpt.utils.mmdc_playwright import mermaid_to_file | |
return await mermaid_to_file(mermaid_code, output_file_without_suffix, width, height) | |
elif engine == "pyppeteer": | |
from metagpt.utils.mmdc_pyppeteer import mermaid_to_file | |
return await mermaid_to_file(mermaid_code, output_file_without_suffix, width, height) | |
elif engine == "ink": | |
from metagpt.utils.mmdc_ink import mermaid_to_file | |
return await mermaid_to_file(mermaid_code, output_file_without_suffix) | |
elif engine == "none": | |
return 0 | |
else: | |
logger.warning(f"Unsupported mermaid engine: {engine}") | |
return 0 | |
MMC1 = """ | |
classDiagram | |
class Main { | |
-SearchEngine search_engine | |
+main() str | |
} | |
class SearchEngine { | |
-Index index | |
-Ranking ranking | |
-Summary summary | |
+search(query: str) str | |
} | |
class Index { | |
-KnowledgeBase knowledge_base | |
+create_index(data: dict) | |
+query_index(query: str) list | |
} | |
class Ranking { | |
+rank_results(results: list) list | |
} | |
class Summary { | |
+summarize_results(results: list) str | |
} | |
class KnowledgeBase { | |
+update(data: dict) | |
+fetch_data(query: str) dict | |
} | |
Main --> SearchEngine | |
SearchEngine --> Index | |
SearchEngine --> Ranking | |
SearchEngine --> Summary | |
Index --> KnowledgeBase | |
""" | |
MMC2 = """ | |
sequenceDiagram | |
participant M as Main | |
participant SE as SearchEngine | |
participant I as Index | |
participant R as Ranking | |
participant S as Summary | |
participant KB as KnowledgeBase | |
M->>SE: search(query) | |
SE->>I: query_index(query) | |
I->>KB: fetch_data(query) | |
KB-->>I: return data | |
I-->>SE: return results | |
SE->>R: rank_results(results) | |
R-->>SE: return ranked_results | |
SE->>S: summarize_results(ranked_results) | |
S-->>SE: return summary | |
SE-->>M: return summary | |
""" | |