File size: 3,271 Bytes
5105400
 
0c824dd
6faa4cc
5105400
 
 
 
 
 
 
6fe0a96
 
 
 
 
 
 
5105400
 
6fe0a96
 
 
5105400
 
 
 
6faa4cc
 
 
 
 
 
 
 
 
 
 
 
5105400
 
0c824dd
5105400
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0c824dd
 
 
 
 
 
 
 
 
 
6faa4cc
b5df131
5105400
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import streamlit as st
import openai
import urllib.parse
import io

# Function to call OpenAI GPT model for prompt processing
def get_diagram_code(prompt, diagram_type, api_key):
    try:
        # Set the OpenAI API key dynamically based on user input
        openai.api_key = api_key

        # For GPT-4 and other chat models, use the v1/chat/completions endpoint
        response = openai.ChatCompletion.create(
            model="gpt-4",  # Make sure you're using the right model
            messages=[
                {"role": "system", "content": "You are a helpful assistant."},
                {"role": "user", "content": f"Generate a {diagram_type} diagram in Mermaid.js syntax based on the following prompt: {prompt}"}
            ],
            max_tokens=500
        )

        return response['choices'][0]['message']['content'].strip()
    
    except Exception as e:
        st.error(f"Error: {e}")
        return None

# Function to convert SVG to PNG
def convert_svg_to_png(svg_file):
    try:
        # Read the uploaded SVG file and convert it to PNG using cairosvg
        png_output = io.BytesIO()
        cairosvg.svg2png(file_obj=svg_file, write_to=png_output)
        png_output.seek(0)
        return png_output
    except Exception as e:
        st.error(f"Error during SVG to PNG conversion: {e}")
        return None

# Streamlit App UI
def main():
    st.title("Generate Diagrams using GPT-4 and MermaidFlow")

    # User input for OpenAI API key
    api_key = st.text_input("Enter your OpenAI API Key:", type="password")
    
    # Check if API key is provided
    if not api_key:
        st.warning("Please enter your OpenAI API Key to continue.")
        return

    # User prompt for diagram type
    prompt = st.text_area("Enter your prompt for the diagram:", "")
    
    diagram_types = ["UML Diagram", "ER Diagram", "State Diagram", "Class Diagram", "Sequence Diagram"]
    diagram_choice = st.selectbox("Select the type of diagram to generate:", diagram_types)

    if st.button("Generate Diagram"):
        if prompt:
            diagram_code = get_diagram_code(prompt, diagram_choice, api_key)
            
            if diagram_code:
                # Render Mermaid code to Streamlit
                st.code(diagram_code, language='mermaid')

                # Encode the Mermaid code for use in the MermaidFlow editor URL
                encoded_code = urllib.parse.quote(diagram_code)  # URL encode the Mermaid code

                # MermaidFlow Editor URL with the encoded Mermaid code
                mermaidflow_url = f"https://www.mermaidflow.app/editor?code={encoded_code}"

                # Embed MermaidFlow Editor in iframe
                st.markdown(f'<iframe src="{mermaidflow_url}" width="100%" height="600px"></iframe>', unsafe_allow_html=True)

                # Provide a direct link to MermaidFlow editor for convenience
                st.markdown(f"Copy and paste the Generated Mermaid Code in the Live Editor and download the generated diagram by clicking on Export as SVG format to get a high-resolution generated image.")

            else:
                st.error("Failed to generate diagram code.")
        else:
            st.error("Please enter a prompt.")

if __name__ == "__main__":
    main()