webchainai / app.py
jamesbright's picture
Update app.py
a0037e0 verified
raw
history blame
7.64 kB
import gradio as gr
import json
from smolagents import CodeAgent, tool, Tool, FinalAnswerTool, HfApiModel, load_tool
final_answer = FinalAnswerTool()
model = HfApiModel(
max_tokens=2096,
temperature=0.5,
model_id='Qwen/Qwen2.5-Coder-32B-Instruct',
custom_role_conversions=None,
)
class ProjectScopingTool(Tool):
name = "project_scoping_tool"
description = """
Handles project scoping by collecting key details such as type, domain, budget, and timeline.
"""
inputs = {
"project_type": {
"type": "string",
"description": "The type of project (e.g., 'web', 'blockchain', 'ai').",
},
"domain": {
"type": "string",
"description": "The industry or field related to the project (e.g., 'finance', 'healthcare').",
},
"budget_min"
: {
"type": "number",
"description": "The minimum budget allocated for the project.",
},
"budget_max": {
"type": "number",
"description": "The maximum budget allocated for the project.",
},
"timeline_months": {
"type": "number",
"description": "The expected duration of the project in months.",
},
}
output_type = "json"
def forward(self, project_type: str, domain: str, budget_min: float, budget_max: float, timeline_months: int):
"""
Collects and structures project details from user input.
"""
self.project_details = {
"type": project_type,
"domain": domain,
"budget_range": {"min": budget_min, "max": budget_max},
"timeline": {"months": timeline_months}
}
return json.dumps(self.project_details, indent=2)
class TechnicalArchitectureTool(Tool):
name = "technical_architecture_tool"
description = """
Determines the appropriate technical architecture based on the project type.
"""
inputs = {
"project_type": {
"type": "string",
"description": "The type of project (e.g., 'web', 'blockchain', 'ai').",
}
}
output_type = "json"
def forward(self, project_type: str):
architectures = {
"web": {
"frontend": ["React", "Next.js", "Tailwind"],
"backend": ["FastAPI", "Django", "Express"],
"database": ["PostgreSQL", "MongoDB"]
},
"blockchain": {
"blockchain_type": "EVM-compatible",
"smart_contract_language": "Solidity",
"consensus_mechanism": "Proof of Stake"
},
"ai": {
"model_type": "Transformer",
"inference_strategy": "Cloud-based",
"data_processing": "Distributed"
}
}
return json.dumps(architectures.get(project_type, "Invalid project type"), indent=2)
class CostEstimationTool(Tool):
name = "cost_estimation_tool"
description = """
Estimates the cost based on the architecture complexity and timeline.
"""
inputs = {
"architecture_size": {
"type": "number",
"description": "The estimated complexity of the architecture on a scale from 1 to 10.",
},
"timeline_months": {
"type": "number",
"description": "The project duration in months.",
}
}
output_type = "json"
def forward(self, architecture_size: int, timeline_months: int):
base_costs = {
"development": 5000 * (architecture_size * 0.5),
"infrastructure": 500 * (architecture_size * 0.3),
"maintenance": 1000 * (architecture_size * 0.2)
}
total_cost = sum(base_costs.values())
return json.dumps({"total_estimated_cost": total_cost, "breakdown": base_costs}, indent=2)
class DeploymentTool(Tool):
name = "deployment_tool"
description = """
Suggests a deployment strategy based on best practices.
"""
inputs = {}
output_type = "json"
def forward(self):
return json.dumps({
"container_strategy": "Docker + Kubernetes",
"cloud_provider": "AWS",
"services": ["ECS", "Lambda", "S3", "RDS"],
"ci_cd_pipeline": "GitHub Actions"
}, indent=2)
class MeetingPreparationTool(Tool):
name = "meeting_preparation_tool"
description = """
Provides meeting agendas depending on the project stage.
"""
inputs = {
"project_stage": {
"type": "string",
"description": "The current stage of the project (e.g., 'initial_discovery', 'architecture_review').",
}
}
output_type = "json"
def forward(self, project_stage: str):
agendas = {
"initial_discovery": [
"Project Vision Validation",
"Technical Feasibility Discussion",
"Initial Scope Definition"
],
"architecture_review": [
"Technical Architecture Walkthrough",
"Technology Stack Validation",
"Performance Considerations"
]
}
return json.dumps(agendas.get(project_stage, "No agenda found for this stage"), indent=2)
# Instantiate tools
scoping_tool = ProjectScopingTool()
tech_arch_tool = TechnicalArchitectureTool()
cost_tool = CostEstimationTool()
deploy_tool = DeploymentTool()
meeting_tool = MeetingPreparationTool()
# Define the agent
tools = [
scoping_tool,
tech_arch_tool,
cost_tool,
deploy_tool,
meeting_tool
]
agent = CodeAgent(
model=model,
tools=[final_answer, tools], # add your tools here (don't remove final_answer)
max_steps=6,
verbosity_level=1,
name="webchainai",
description="Sets up first project mockups"
)
# Define Gradio Interface
with gr.Blocks() as demo:
gr.Markdown("# 🏗️ Project Scoping & Cost Estimation Tool")
with gr.Row():
project_type = gr.Dropdown(["web", "blockchain", "ai"], label="Select Project Type")
domain = gr.Textbox(label="Enter Project Domain")
with gr.Row():
budget_min = gr.Number(label="Min Budget ($)")
budget_max = gr.Number(label="Max Budget ($)")
timeline_months = gr.Number(label="Timeline (Months)")
project_output = gr.Textbox(label="Project Details", interactive=False)
arch_output = gr.Textbox(label="Technical Architecture", interactive=False)
cost_output = gr.Textbox(label="Estimated Cost", interactive=False)
deploy_output = gr.Textbox(label="Deployment Strategy", interactive=False)
meeting_output = gr.Textbox(label="Meeting Agenda", interactive=False)
def process_inputs(p_type, dom, min_b, max_b, months):
project_details = scoping_tool.collect_project_details(p_type, dom, min_b, max_b, months)
architecture = tech_arch_tool.generate_architecture(p_type)
estimated_cost = cost_tool.estimate_project_cost(len(architecture), months)
deployment_strategy = deploy_tool.generate_deployment_strategy()
meeting_agenda = meeting_tool.generate_meeting_agenda("initial_discovery")
return project_details, architecture, estimated_cost, deployment_strategy, meeting_agenda
process_button = gr.Button("Generate Estimates")
process_button.click(process_inputs, inputs=[project_type, domain, budget_min, budget_max, timeline_months],
outputs=[project_output, arch_output, cost_output, deploy_output, meeting_output])
# Launch the Gradio App
demo(agent).launch()