import os import io import requests import zipfile import hmac from metagpt.software_company import generate_repo, ProjectRepo import streamlit as st # CONFIG_FILE_PATH = '~/.metagpt/config2.yaml' # if not os.path.exists(CONFIG_FILE_PATH): # with open(CONFIG_FILE_PATH, 'w') as f: # f.write(os.environ['METAGPT_CONFIG_WITH_ANTHROPIC_API']) st.title("AI Software Coder") def check_password(): """Returns `True` if the user had the correct password.""" def password_entered(): """Checks whether a password entered by the user is correct.""" if hmac.compare_digest(st.session_state["password"], os.environ['PAGE_PASSWORD']): st.session_state["password_correct"] = True del st.session_state["password"] # Don't store the password. else: st.session_state["password_correct"] = False # Return True if the password is validated. if st.session_state.get("password_correct", False): return True # Show input for password. st.text_input( "Password", type="password", on_change=password_entered, key="password" ) if "password_correct" in st.session_state: st.error("😕 Password incorrect") return False if not check_password(): st.stop() # Do not continue if check_password is not True. def generate_zip(files): """Generates a zip file containing the input files.""" zip_buffer = io.BytesIO() with zipfile.ZipFile(zip_buffer, 'w') as zip_file: for filename, file_content in files.items(): zip_file.writestr(filename, file_content) zip_buffer.seek(0) return zip_buffer text_input = st.text_area("Enter your software development requirements here:", value="""The goal. The instructions of the task for each file example, things to do with input and output. Here are some examples. ### filename.json Original document: ```markdown ## policy title detailed section - blah blah ``` Configuration: ```json { "income_limit": 50 } ``` ### filename.py Original document: ```markdown ## policy title detailed section - blah blah ``` Configuration: ```py class AgeCalculator: def __init__(self, birth_year): self.birth_year = birth_year def calculate_age(self, current_year): age = current_year - self.birth_year return self._validate_and_format_age(age) def _validate_and_format_age(self, age): if age < 0: raise ValueError("Invalid age calculated") return f"User is {age} years old" def get_user_age(birth_year, current_year): calculator = AgeCalculator(birth_year) return calculator.calculate_age(current_year) ``` Here is the additional input from a lawer: comments from Nick/Marc/... """) if st.button("Generate Code"): # def download_content(url): # response = requests.get(url) # response.raise_for_status() # return response.text # def replace_urls_with_content(text): # lines = text.splitlines() # for i, line in enumerate(lines): # if line.startswith('http://') or line.startswith('https://'): # try: # content = download_content(line) # lines[i] = line.split('/')[-1] + '\n```\n' + content + '\n```' # except requests.exceptions.RequestException as e: # print(f"Error downloading content from {line}: {e}") # return '\n'.join(lines) # text_input = replace_urls_with_content(text_input) # repo: ProjectRepo = generate_repo(text_input) # zip_buffer = generate_zip(repo.all_files) # st.download_button( # label="Download Code Repository", # data=zip_buffer, # file_name="output.zip", # mime="application/zip" # ) st.balloons()