Spaces:
Sleeping
Sleeping
Update: Tools create and analyze, TechTool, session, init
Browse files- src/streamlit_app.py +87 -38
src/streamlit_app.py
CHANGED
|
@@ -1,40 +1,89 @@
|
|
| 1 |
-
import
|
| 2 |
-
import numpy as np
|
| 3 |
-
import pandas as pd
|
| 4 |
import streamlit as st
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# import phase
|
|
|
|
|
|
|
| 2 |
import streamlit as st
|
| 3 |
+
import pydantic import BaseModel, Field
|
| 4 |
+
from typing import List, Literal, Dict, Optional
|
| 5 |
+
from agency_swarn import Agent, Agency, set_openai_key, BaseTool
|
| 6 |
|
| 7 |
+
class AnalyzeProjectRequirement(BaseTool):
|
| 8 |
+
project_name: str = Field(..., description = "Name of Project")
|
| 9 |
+
project_description: str = Field(..., description = "Project Description and Goals")
|
| 10 |
+
project_type: Literal["Web Application", "Mobile App", "API Development", "Data Analytics", "AI/ML Solution", "Other"] = Field(..., description = "Type of project")
|
| 11 |
+
budget_range: Literal["$10k-$25k", "$25k-$50k", "$100k+"] = Field(..., description = "Budget Range of the project")
|
| 12 |
+
|
| 13 |
+
class ToolConfig:
|
| 14 |
+
name = "analyze_project"
|
| 15 |
+
description = "Analyze project requirements and feasibility"
|
| 16 |
+
one_call_at_a_time = True
|
| 17 |
+
|
| 18 |
+
def run(self) -> str:
|
| 19 |
+
"""Analyze project and store results in shared state"""
|
| 20 |
+
if self._shared_state.get("project_analysis", None) is not None:
|
| 21 |
+
raise ValueError('Project Analysis already exists, you can move forward to technical specification.')
|
| 22 |
+
|
| 23 |
+
analysis = {
|
| 24 |
+
"name": self.project_name,
|
| 25 |
+
"type": self.project_type,
|
| 26 |
+
"complexity": "high",
|
| 27 |
+
"timeline": "6 months",
|
| 28 |
+
"budget_feasibility": "within range",
|
| 29 |
+
"requirements": ["Scalable Architecture", "Security", "API Integration"]
|
| 30 |
+
}
|
| 31 |
+
|
| 32 |
+
self._shared_state.set("project_analysis", analysis)
|
| 33 |
+
return "Project analysis completed. Please proceed with technical specification"
|
| 34 |
+
|
| 35 |
+
class CreateTechnicalSpecification(BaseTool):
|
| 36 |
+
core_technologies: str = Field(..., description = "Comma-seperated list of main technologies and frameworks")
|
| 37 |
+
architecture_type: Literal["monolithic", "microservice", "serverless", "hybrid"] = Field(..., description = "Proposed Architecture Type")
|
| 38 |
+
scalability_requirement: Literal("high", "medium", "low") = Field(..., description = "Scalability Needs")
|
| 39 |
+
|
| 40 |
+
class ToolConfig:
|
| 41 |
+
name = "create_technical_spec"
|
| 42 |
+
description = "Creates technical specifications based on project analysis"
|
| 43 |
+
one_call_at_a_time = True
|
| 44 |
+
|
| 45 |
+
def run(self) -> str:
|
| 46 |
+
"""Create technical specification based on the analysis"""
|
| 47 |
+
project_analysis = self._shared_state.get("project_analysis", None)
|
| 48 |
+
if project_analysis is None:
|
| 49 |
+
raise ValueError("Please analyse project requirements first using the AnalyzeProjectRequirement tool")
|
| 50 |
+
|
| 51 |
+
spec ={
|
| 52 |
+
"project_name" : project_analysis["name"],
|
| 53 |
+
"architecture": self.architecture_type,
|
| 54 |
+
"technologies": self.core_technologies.split(","),
|
| 55 |
+
"scalability": self.scalability_requirement
|
| 56 |
+
}
|
| 57 |
+
self._shared_state.set("technical_specification", spec)
|
| 58 |
+
return f"Technical Specification created for {project_analysis['name']}"
|
| 59 |
+
|
| 60 |
+
def init_session_state() -> None:
|
| 61 |
+
"""Initiate session state variable"""
|
| 62 |
+
if "messages" is not st.session_state:
|
| 63 |
+
st.session_state.message = []
|
| 64 |
+
if "api_key" not in st.session_state:
|
| 65 |
+
st.session_state.api_key = None
|
| 66 |
+
|
| 67 |
+
|
| 68 |
+
def main() -> None:
|
| 69 |
+
st.set_page_config(page_title = "dev.ai - Place for innovation", layout = "wide")
|
| 70 |
+
init_session_state()
|
| 71 |
+
|
| 72 |
+
st.title("🎯 dev.ai services - Innovate, Build and Lighten up the future with AI")
|
| 73 |
+
|
| 74 |
+
# API Configuration
|
| 75 |
+
with st.sidebar:
|
| 76 |
+
st.header("API Configuration")
|
| 77 |
+
openai_api_key = st.text_input(
|
| 78 |
+
"OpenAI API Key",
|
| 79 |
+
type = "password",
|
| 80 |
+
help = "Enter your OpenAI Key that start with sk--xxxxxxxxxxxxxx"
|
| 81 |
+
)
|
| 82 |
+
|
| 83 |
+
if openai_api_key:
|
| 84 |
+
st.session_state.api_key = openai_api_key
|
| 85 |
+
st.success("API Key accepted")
|
| 86 |
+
else:
|
| 87 |
+
st.warning("⚠️ API Key not found, please enter you key to proceed")
|
| 88 |
+
st.markdown("[Get your API key here]("https://platform.openai.com/api-keys)")
|
| 89 |
+
return
|