diff --git a/.gitattributes b/.gitattributes index a6344aac8c09253b3b630fb776ae94478aa0275b..40bf842adace62cc95e02d19435e1d65c6453fb0 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,35 +1,36 @@ -*.7z filter=lfs diff=lfs merge=lfs -text -*.arrow filter=lfs diff=lfs merge=lfs -text -*.bin filter=lfs diff=lfs merge=lfs -text -*.bz2 filter=lfs diff=lfs merge=lfs -text -*.ckpt filter=lfs diff=lfs merge=lfs -text -*.ftz filter=lfs diff=lfs merge=lfs -text -*.gz filter=lfs diff=lfs merge=lfs -text -*.h5 filter=lfs diff=lfs merge=lfs -text -*.joblib filter=lfs diff=lfs merge=lfs -text -*.lfs.* filter=lfs diff=lfs merge=lfs -text -*.mlmodel filter=lfs diff=lfs merge=lfs -text -*.model filter=lfs diff=lfs merge=lfs -text -*.msgpack filter=lfs diff=lfs merge=lfs -text -*.npy filter=lfs diff=lfs merge=lfs -text -*.npz filter=lfs diff=lfs merge=lfs -text -*.onnx filter=lfs diff=lfs merge=lfs -text -*.ot filter=lfs diff=lfs merge=lfs -text -*.parquet filter=lfs diff=lfs merge=lfs -text -*.pb filter=lfs diff=lfs merge=lfs -text -*.pickle filter=lfs diff=lfs merge=lfs -text -*.pkl filter=lfs diff=lfs merge=lfs -text -*.pt filter=lfs diff=lfs merge=lfs -text -*.pth filter=lfs diff=lfs merge=lfs -text -*.rar filter=lfs diff=lfs merge=lfs -text -*.safetensors filter=lfs diff=lfs merge=lfs -text -saved_model/**/* filter=lfs diff=lfs merge=lfs -text -*.tar.* filter=lfs diff=lfs merge=lfs -text -*.tar filter=lfs diff=lfs merge=lfs -text -*.tflite filter=lfs diff=lfs merge=lfs -text -*.tgz filter=lfs diff=lfs merge=lfs -text -*.wasm filter=lfs diff=lfs merge=lfs -text -*.xz filter=lfs diff=lfs merge=lfs -text -*.zip filter=lfs diff=lfs merge=lfs -text -*.zst filter=lfs diff=lfs merge=lfs -text -*tfevents* filter=lfs diff=lfs merge=lfs -text +*.7z filter=lfs diff=lfs merge=lfs -text +*.arrow filter=lfs diff=lfs merge=lfs -text +*.bin filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.ckpt filter=lfs diff=lfs merge=lfs -text +*.ftz filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.h5 filter=lfs diff=lfs merge=lfs -text +*.joblib filter=lfs diff=lfs merge=lfs -text +*.lfs.* filter=lfs diff=lfs merge=lfs -text +*.mlmodel filter=lfs diff=lfs merge=lfs -text +*.model filter=lfs diff=lfs merge=lfs -text +*.msgpack filter=lfs diff=lfs merge=lfs -text +*.npy filter=lfs diff=lfs merge=lfs -text +*.npz filter=lfs diff=lfs merge=lfs -text +*.onnx filter=lfs diff=lfs merge=lfs -text +*.ot filter=lfs diff=lfs merge=lfs -text +*.parquet filter=lfs diff=lfs merge=lfs -text +*.pb filter=lfs diff=lfs merge=lfs -text +*.pickle filter=lfs diff=lfs merge=lfs -text +*.pkl filter=lfs diff=lfs merge=lfs -text +*.pt filter=lfs diff=lfs merge=lfs -text +*.pth filter=lfs diff=lfs merge=lfs -text +*.rar filter=lfs diff=lfs merge=lfs -text +*.safetensors filter=lfs diff=lfs merge=lfs -text +saved_model/**/* filter=lfs diff=lfs merge=lfs -text +*.tar.* filter=lfs diff=lfs merge=lfs -text +*.tar filter=lfs diff=lfs merge=lfs -text +*.tflite filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.wasm filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.zst filter=lfs diff=lfs merge=lfs -text +*tfevents* filter=lfs diff=lfs merge=lfs -text +chroma_db/chroma.sqlite3 filter=lfs diff=lfs merge=lfs -text diff --git a/Dockerfile b/Dockerfile index 5f51ead59f36f13043e036290df9440e25fe8cbe..67841b1d027dea81e3e169e0b3efc59b728be7ac 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,20 +1,22 @@ -FROM python:3.13.5-slim - -WORKDIR /app - -RUN apt-get update && apt-get install -y \ - build-essential \ - curl \ - git \ - && rm -rf /var/lib/apt/lists/* - -COPY requirements.txt ./ -COPY src/ ./src/ - -RUN pip3 install -r requirements.txt - -EXPOSE 8501 - -HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health - -ENTRYPOINT ["streamlit", "run", "src/streamlit_app.py", "--server.port=8501", "--server.address=0.0.0.0"] \ No newline at end of file +# AI Virtual Pod - Streamlit application +FROM python:3.11-slim + +WORKDIR /app + +# Install dependencies first for better layer caching +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +# Copy application code +COPY app.py . +COPY agents/ agents/ +COPY core/ core/ + +# ChromaDB may write to disk; optional data dir +ENV CHROMA_PERSIST_DIR=/app/chroma_db + +# Streamlit runs on 8501 by default +EXPOSE 8501 + +# Run the app (bind to 0.0.0.0 so it's reachable from outside the container) +CMD ["streamlit", "run", "app.py", "--server.port=8501", "--server.address=0.0.0.0"] diff --git a/agents/__pycache__/business_analyst.cpython-310.pyc b/agents/__pycache__/business_analyst.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c6100f61078c7b11a2dbd64177628570b3978c2 Binary files /dev/null and b/agents/__pycache__/business_analyst.cpython-310.pyc differ diff --git a/agents/__pycache__/business_analyst.cpython-311.pyc b/agents/__pycache__/business_analyst.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..176e42b167963677ed660317630e08abc6fb1833 Binary files /dev/null and b/agents/__pycache__/business_analyst.cpython-311.pyc differ diff --git a/agents/__pycache__/business_analyst.cpython-313.pyc b/agents/__pycache__/business_analyst.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b556d5573e8b884b0b728a5b1cebec284ea4e3c Binary files /dev/null and b/agents/__pycache__/business_analyst.cpython-313.pyc differ diff --git a/agents/__pycache__/designer.cpython-310.pyc b/agents/__pycache__/designer.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0956f10f0daf5ab3eefb1d9b6e7687164cdfe7bf Binary files /dev/null and b/agents/__pycache__/designer.cpython-310.pyc differ diff --git a/agents/__pycache__/designer.cpython-311.pyc b/agents/__pycache__/designer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..77ad7bcbdaa7b9259cfe96694d70c7481cebfaef Binary files /dev/null and b/agents/__pycache__/designer.cpython-311.pyc differ diff --git a/agents/__pycache__/designer.cpython-313.pyc b/agents/__pycache__/designer.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5dd07a7637eb0fc40b97cec27e396e35add14422 Binary files /dev/null and b/agents/__pycache__/designer.cpython-313.pyc differ diff --git a/agents/__pycache__/developer.cpython-310.pyc b/agents/__pycache__/developer.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..873ae4b59efbdcd065f0382d2b9d385aec5ac993 Binary files /dev/null and b/agents/__pycache__/developer.cpython-310.pyc differ diff --git a/agents/__pycache__/developer.cpython-311.pyc b/agents/__pycache__/developer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a57b9f06b666275c44077f334d30f02820ff1c1 Binary files /dev/null and b/agents/__pycache__/developer.cpython-311.pyc differ diff --git a/agents/__pycache__/developer.cpython-313.pyc b/agents/__pycache__/developer.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6e0e19c1b807bdd7a69eb5e8b92306e69c66af2 Binary files /dev/null and b/agents/__pycache__/developer.cpython-313.pyc differ diff --git a/agents/__pycache__/project_manager.cpython-310.pyc b/agents/__pycache__/project_manager.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4a1b193a72a65fc50c4a719b2ac9216aa73e5da Binary files /dev/null and b/agents/__pycache__/project_manager.cpython-310.pyc differ diff --git a/agents/__pycache__/project_manager.cpython-311.pyc b/agents/__pycache__/project_manager.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e5ea2525aa485dbd350aa088238e7b5a3fe6a9d Binary files /dev/null and b/agents/__pycache__/project_manager.cpython-311.pyc differ diff --git a/agents/__pycache__/project_manager.cpython-313.pyc b/agents/__pycache__/project_manager.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..712e2e8c3c0f080d57d0f85748a8a2b03a2f3f2f Binary files /dev/null and b/agents/__pycache__/project_manager.cpython-313.pyc differ diff --git a/agents/__pycache__/tester.cpython-310.pyc b/agents/__pycache__/tester.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a9b3f14803ed55929403fd76a54847c9f0c0d75 Binary files /dev/null and b/agents/__pycache__/tester.cpython-310.pyc differ diff --git a/agents/__pycache__/tester.cpython-311.pyc b/agents/__pycache__/tester.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..639b61a1e8936436ec72e0995edf9a06a498c072 Binary files /dev/null and b/agents/__pycache__/tester.cpython-311.pyc differ diff --git a/agents/__pycache__/tester.cpython-313.pyc b/agents/__pycache__/tester.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3acd63ff5b9770e1c05b46fcad8770254b3fc590 Binary files /dev/null and b/agents/__pycache__/tester.cpython-313.pyc differ diff --git a/agents/business_analyst.py b/agents/business_analyst.py new file mode 100644 index 0000000000000000000000000000000000000000..bf499a980a87d7a5d70f92fd3c20073559c46828 --- /dev/null +++ b/agents/business_analyst.py @@ -0,0 +1,46 @@ +from core.base_agent import BaseAgent +from core.database import db +from typing import Dict, Any + +class BusinessAnalystAgent(BaseAgent): + def __init__(self): + super().__init__("Business Analyst") + self.create_chain(""" + You are a Business Analyst. Your task is to create detailed user stories from the given business requirements. + + Business Requirements: + {input} + + Create user stories following this format: + As a [type of user] + I want [some goal] + So that [some reason] + + Acceptance Criteria: + 1. [First criterion] + 2. [Second criterion] + ... + + Please provide clear, testable user stories with specific acceptance criteria. + """) + + async def create_user_stories(self, requirements: str) -> Dict[str, Any]: + """Create user stories from business requirements""" + result = await self.process({"input": requirements}) + + # Store the user stories in the database + db.store_artifact( + "user_stories", + result, + { + "type": "user_story", + "source": "business_analyst", + "status": "created" + } + ) + + return { + "status": "success", + "user_stories": result, + "message": "User stories created successfully" + } \ No newline at end of file diff --git a/agents/designer.py b/agents/designer.py new file mode 100644 index 0000000000000000000000000000000000000000..747f44c042be9cd89179c55222d329df7314b293 --- /dev/null +++ b/agents/designer.py @@ -0,0 +1,44 @@ +from core.base_agent import BaseAgent +from core.database import db +from typing import Dict, Any + +class DesignerAgent(BaseAgent): + def __init__(self): + super().__init__("Designer") + self.create_chain(""" + You are a Software Designer. Your task is to create detailed design specifications from the given user stories. + + User Stories: + {input} + + Create a comprehensive design document that includes: + 1. System Architecture + 2. Component Design + 3. Database Schema + 4. API Endpoints + 5. Data Flow Diagrams + 6. Security Considerations + + Please provide a detailed, implementable design that follows best practices and design patterns. + """) + + async def create_design(self, user_stories: str) -> Dict[str, Any]: + """Create design specifications from user stories""" + result = await self.process({"input": user_stories}) + + # Store the design in the database + db.store_artifact( + "designs", + result, + { + "type": "design", + "source": "designer", + "status": "created" + } + ) + + return { + "status": "success", + "design": result, + "message": "Design specifications created successfully" + } \ No newline at end of file diff --git a/agents/developer.py b/agents/developer.py new file mode 100644 index 0000000000000000000000000000000000000000..016a110d4b1effd572a099988bb22c2f450ae227 --- /dev/null +++ b/agents/developer.py @@ -0,0 +1,111 @@ +from core.base_agent import BaseAgent +from core.database import db +from typing import Dict, Any + +class DeveloperAgent(BaseAgent): + def __init__(self): + super().__init__("Developer") + self.create_chain(""" + You are an expert Software Developer. Your task is to generate production-ready, well-structured code based on the given design specifications. + + Design Specifications: + {input} + + Generate code that follows these strict guidelines: + + 1. Code Structure: + - Use proper project structure with separate modules + - Follow SOLID principles + - Implement proper error handling + - Use type hints + - Include comprehensive docstrings + - Follow PEP 8 style guide + + 2. Implementation Details: + - Use modern Python features (Python 3.9+) + - Implement proper logging + - Add input validation + - Include unit tests + - Use dependency injection where appropriate + - Implement proper configuration management + + 3. Security: + - Sanitize all inputs + - Implement proper authentication/authorization + - Use secure coding practices + - Handle sensitive data properly + + 4. Performance: + - Optimize database queries + - Implement caching where appropriate + - Use async/await for I/O operations + - Implement proper resource management + + 5. Documentation: + - Include detailed module docstrings + - Document all public methods + - Include usage examples + - Document configuration options + + The code should be: + - Production-ready + - Well-tested + - Scalable + - Maintainable + - Secure + - Performant + + Provide the complete implementation with all necessary files and dependencies. + """) + + async def generate_code(self, design: str) -> Dict[str, Any]: + """Generate code from design specifications""" + result = await self.process({"input": design}) + + # Store the code in the database + db.store_artifact( + "code", + result, + { + "type": "code", + "source": "developer", + "status": "created", + "version": "1.0.0" + } + ) + + return { + "status": "success", + "code": result, + "message": "Code generated successfully", + "metadata": { + "language": "Python", + "framework": "Standard Library", + "dependencies": self._extract_dependencies(result) + } + } + + def _extract_dependencies(self, code: str) -> list: + """Extract dependencies from the generated code""" + dependencies = set() + # Add common dependencies + dependencies.update([ + "python-dotenv", + "pydantic", + "fastapi", + "uvicorn", + "pytest", + "pytest-asyncio" + ]) + + # Add dependencies based on code content + if "import sqlalchemy" in code: + dependencies.add("sqlalchemy") + if "import aiohttp" in code: + dependencies.add("aiohttp") + if "import redis" in code: + dependencies.add("redis") + if "import jwt" in code: + dependencies.add("PyJWT") + + return sorted(list(dependencies)) \ No newline at end of file diff --git a/agents/project_manager.py b/agents/project_manager.py new file mode 100644 index 0000000000000000000000000000000000000000..d264bdca2424918c02eb8b1fb378cf138a706912 --- /dev/null +++ b/agents/project_manager.py @@ -0,0 +1,123 @@ +from core.base_agent import BaseAgent +from core.database import db +from core.workflow import DevelopmentWorkflow +from typing import Dict, Any + +class ProjectManagerAgent(BaseAgent): + def __init__(self): + super().__init__("Project Manager") + self.workflow = DevelopmentWorkflow() + + self.create_chain(""" + You are a Project Manager. Your task is to oversee the development process and provide status updates. + + Current Status: + {input} + + Please provide a comprehensive status report including: + 1. Project progress + 2. Any blockers or issues + 3. Next steps + 4. Quality metrics + 5. Recommendations + + Please provide clear, actionable insights. + """) + + async def start_project(self, requirements: str) -> Dict[str, Any]: + """Start a new project with the given requirements""" + # Run the complete workflow + result = await self.workflow.run(requirements) + + # Store all artifacts in the database + self._store_artifacts(result) + + return { + "status": "success", + "user_stories": result["user_stories"], + "design": result["design"], + "code": result["code"], + "test_results": result["test_results"], + "messages": result["messages"], + "message": "Project completed successfully" + } + + def _store_artifacts(self, result: Dict[str, Any]): + """Store all project artifacts in the database""" + # Store user stories + db.store_artifact( + "user_stories", + result["user_stories"], + { + "type": "user_story", + "source": "business_analyst", + "status": "created" + } + ) + + # Store design + db.store_artifact( + "designs", + result["design"], + { + "type": "design", + "source": "designer", + "status": "created" + } + ) + + # Store code + db.store_artifact( + "code", + result["code"], + { + "type": "code", + "source": "developer", + "status": "created", + "version": "1.0.0" + } + ) + + # Store test results + db.store_artifact( + "test_results", + result["test_results"], + { + "type": "test_result", + "source": "tester", + "status": "executed" + } + ) + + async def get_status(self) -> Dict[str, Any]: + """Get the current project status""" + # Query all artifacts from the database + user_stories = db.query_artifacts("user_stories", "status:created") + designs = db.query_artifacts("designs", "status:created") + code = db.query_artifacts("code", "status:created") + test_results = db.query_artifacts("test_results", "status:executed") + + status = { + "user_stories": len(user_stories["ids"]), + "designs": len(designs["ids"]), + "code": len(code["ids"]), + "test_results": len(test_results["ids"]) + } + + return { + "status": "success", + "data": status, + "message": "Status retrieved successfully" + } + + async def check_quality(self) -> Dict[str, Any]: + """Check the quality of project artifacts""" + result = await self.process({ + "input": "Checking quality of all project artifacts" + }) + + return { + "status": "success", + "quality_report": result, + "message": "Quality check completed successfully" + } \ No newline at end of file diff --git a/agents/tester.py b/agents/tester.py new file mode 100644 index 0000000000000000000000000000000000000000..fd144c97aa2846f084ade85f7b52ed34627f0aac --- /dev/null +++ b/agents/tester.py @@ -0,0 +1,66 @@ +from core.base_agent import BaseAgent +from core.database import db +from typing import Dict, Any + +class TesterAgent(BaseAgent): + def __init__(self): + super().__init__("Tester") + self.create_chain(""" + You are a Software Tester. Your task is to create comprehensive test cases and execute them on the given code. + + Code to Test: + {input} + + Create test cases that: + 1. Cover all user stories and acceptance criteria + 2. Include unit tests, integration tests, and system tests + 3. Test edge cases and error conditions + 4. Follow testing best practices + 5. Include test data and expected results + + Please provide detailed test cases with clear steps and expected outcomes. + """) + + async def create_test_cases(self, code: str) -> Dict[str, Any]: + """Create test cases for the given code""" + result = await self.process({"input": code}) + + # Store the test cases in the database + db.store_artifact( + "test_cases", + result, + { + "type": "test_case", + "source": "tester", + "status": "created" + } + ) + + return { + "status": "success", + "test_cases": result, + "message": "Test cases created successfully" + } + + async def execute_tests(self, code: str, test_cases: str) -> Dict[str, Any]: + """Execute test cases on the given code""" + result = await self.process({ + "input": f"Code:\n{code}\n\nTest Cases:\n{test_cases}" + }) + + # Store the test results in the database + db.store_artifact( + "test_results", + result, + { + "type": "test_result", + "source": "tester", + "status": "executed" + } + ) + + return { + "status": "success", + "test_results": result, + "message": "Tests executed successfully" + } \ No newline at end of file diff --git a/api/__pycache__/main.cpython-310.pyc b/api/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99669fb6710cb7be0312806defa8e48bf524ba5a Binary files /dev/null and b/api/__pycache__/main.cpython-310.pyc differ diff --git a/app.py b/app.py new file mode 100644 index 0000000000000000000000000000000000000000..bd58fbc86846c3dd8f7949d963e1d596ff4ff5b1 --- /dev/null +++ b/app.py @@ -0,0 +1,167 @@ +import streamlit as st +import asyncio +from agents.project_manager import ProjectManagerAgent +import json +from typing import Dict, Any + +# Initialize the project manager +project_manager = ProjectManagerAgent() + +# Set page config +st.set_page_config( + page_title="AI Development Pod", + page_icon="🤖", + layout="wide" +) + +# Custom CSS +st.markdown(""" + +""", unsafe_allow_html=True) + +# Title and description +st.title("🤖 AI Development Pod") +st.markdown(""" + This is an AI-powered virtual development team that can handle your software project from requirements to testing. + Simply enter your project requirements and let the AI team do the rest! +""") + +# Sidebar for navigation +st.sidebar.title("Navigation") +page = st.sidebar.radio("Go to", ["Start Project", "Project Status", "Quality Check"]) + +def display_progress(messages: list): + """Display progress based on workflow messages""" + steps = { + "User stories created successfully": 20, + "Design created successfully": 40, + "Code generated successfully": 60, + "Test cases created successfully": 80, + "Tests executed successfully": 100 + } + + current_progress = 0 + for message in messages: + if message in steps: + current_progress = max(current_progress, steps[message]) + + st.markdown(f""" +
+{current_progress}% Complete
+ """, unsafe_allow_html=True) + + for message in messages: + st.info(message) + +async def run_project(requirements: str) -> Dict[str, Any]: + """Run the project workflow""" + return await project_manager.start_project(requirements) + +async def get_project_status() -> Dict[str, Any]: + """Get the project status""" + return await project_manager.get_status() + +async def run_quality_check() -> Dict[str, Any]: + """Run the quality check""" + return await project_manager.check_quality() + +if page == "Start Project": + st.header("Start New Project") + + # Project requirements input + requirements = st.text_area( + "Enter your project requirements:", + placeholder="Describe your project requirements in detail...", + height=200 + ) + + if st.button("Start Project"): + if requirements: + with st.spinner("Processing your project..."): + # Run the async function + result = asyncio.run(run_project(requirements)) + + # Display progress + display_progress(result["messages"]) + + # Display results in tabs + tab1, tab2, tab3, tab4 = st.tabs(["User Stories", "Design", "Code", "Test Results"]) + + with tab1: + st.subheader("User Stories") + st.markdown(result["user_stories"]) + + with tab2: + st.subheader("Design") + st.markdown(result["design"]) + + with tab3: + st.subheader("Generated Code") + st.code(result["code"], language="python") + + with tab4: + st.subheader("Test Results") + st.markdown(result["test_results"]) + else: + st.error("Please enter project requirements") + +elif page == "Project Status": + st.header("Project Status") + + if st.button("Check Status"): + with st.spinner("Getting project status..."): + status = asyncio.run(get_project_status()) + + # Display status metrics + col1, col2, col3, col4 = st.columns(4) + + with col1: + st.metric("User Stories", status["data"]["user_stories"]) + with col2: + st.metric("Designs", status["data"]["designs"]) + with col3: + st.metric("Code Files", status["data"]["code"]) + with col4: + st.metric("Test Results", status["data"]["test_results"]) + +elif page == "Quality Check": + st.header("Quality Check") + + if st.button("Run Quality Check"): + with st.spinner("Running quality check..."): + quality_report = asyncio.run(run_quality_check()) + + st.subheader("Quality Report") + st.markdown(quality_report["quality_report"]) + +# Footer +st.markdown("---") +st.markdown(""" +AI Development Pod - Powered by Groq's Gemma2-9b-it and LangGraph
+