import os
current_directory = os.getcwd()
os.environ['HOME'] = current_directory
print(f"New HOME directory: {os.environ['HOME']}")
import io
import requests
import zipfile
import hmac
# from metagpt.config import Config
from metagpt.software_company import generate_repo, ProjectRepo
import streamlit as st
CONFIG_FILE_PATH = 'config/config2.yaml'
if not os.path.exists(CONFIG_FILE_PATH):
os.mkdir(os.path.dirname(CONFIG_FILE_PATH))
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'])
# config = Config(CONFIG_FILE_PATH)
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(dir_path):
"""Generates a zip file containing the input files."""
zip_buffer = io.BytesIO()
with zipfile.ZipFile(zip_buffer, 'w') as zip_file:
for root, _, files in os.walk(dir_path):
# Add each file to the zip archive
for file in files:
file_path = os.path.join(root, file)
with open(file_path, 'rb') as f:
file_content = f.read()
zip_file.writestr(filename, file_content, arcname=os.path.relpath(file_path, dir_path))
zip_buffer.seek(0)
return zip_buffer
if "default" not in st.session_state:
st.session_state["default"] = 2000
text_input = st.text_area("Enter your software development requirements here:",
height=st.session_state["default"],
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"):
st.balloons()
st.session_state["default"] = 200
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)
st.info('Working on it.. A download button will show up below once work done.')
text_input = replace_urls_with_content(text_input)
repo: ProjectRepo = generate_repo(text_input)
zip_buffer = generate_zip(repo.workdir())
st.download_button(
label="Download Code Repository",
data=zip_buffer,
file_name="output.zip",
mime="application/zip"
)