Spaces:
Runtime error
Runtime error
Karthik Murali M commited on
Commit ยท
807e9b3
1
Parent(s): c448e5f
Add application file
Browse files- .env +1 -0
- Dockerfile +11 -0
- main.py +49 -0
- refine_prompt.py +89 -0
- requirements.txt +9 -0
- templates/form.html +13 -0
- templates/result.html +9 -0
.env
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
Langchain="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"
|
Dockerfile
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
FROM python:3.10-slim
|
| 2 |
+
|
| 3 |
+
WORKDIR /app
|
| 4 |
+
|
| 5 |
+
COPY requirements.txt .
|
| 6 |
+
|
| 7 |
+
RUN pip install --no-cache-dir -r requirements.txt
|
| 8 |
+
|
| 9 |
+
COPY . .
|
| 10 |
+
|
| 11 |
+
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "7860"]
|
main.py
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from fastapi import FastAPI, Form, Request
|
| 2 |
+
from fastapi.responses import HTMLResponse
|
| 3 |
+
from fastapi.templating import Jinja2Templates
|
| 4 |
+
from markdown2 import markdown
|
| 5 |
+
from refine_prompt import run_refiner
|
| 6 |
+
import os
|
| 7 |
+
from fastapi.middleware.cors import CORSMiddleware
|
| 8 |
+
|
| 9 |
+
|
| 10 |
+
app = FastAPI()
|
| 11 |
+
app.add_middleware(
|
| 12 |
+
CORSMiddleware,
|
| 13 |
+
allow_origins=["*"], # or frontend's domain
|
| 14 |
+
allow_credentials=True,
|
| 15 |
+
allow_methods=["*"],
|
| 16 |
+
allow_headers=["*"],
|
| 17 |
+
)
|
| 18 |
+
templates = Jinja2Templates(directory="templates")
|
| 19 |
+
|
| 20 |
+
@app.get("/", response_class=HTMLResponse)
|
| 21 |
+
async def show_form(request: Request):
|
| 22 |
+
return templates.TemplateResponse("form.html", {"request": request})
|
| 23 |
+
|
| 24 |
+
@app.post("/refine", response_class=HTMLResponse)
|
| 25 |
+
async def refine(request: Request, idea: str = Form(...)):
|
| 26 |
+
result = run_refiner(idea)
|
| 27 |
+
|
| 28 |
+
# Format all results into Markdown
|
| 29 |
+
markdown_output = f"""
|
| 30 |
+
## ๐ง Refined Idea
|
| 31 |
+
{result['refined_idea']}
|
| 32 |
+
|
| 33 |
+
---
|
| 34 |
+
|
| 35 |
+
## ๐ Market Info
|
| 36 |
+
{result['market_info']}
|
| 37 |
+
|
| 38 |
+
---
|
| 39 |
+
|
| 40 |
+
## ๐ฝ๏ธ Slide Summary
|
| 41 |
+
{result['slide_summary']}
|
| 42 |
+
"""
|
| 43 |
+
|
| 44 |
+
html_output = markdown(markdown_output)
|
| 45 |
+
|
| 46 |
+
return templates.TemplateResponse("result.html", {
|
| 47 |
+
"request": request,
|
| 48 |
+
"output_html": html_output
|
| 49 |
+
})
|
refine_prompt.py
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from openai import OpenAI
|
| 2 |
+
from dotenv import load_dotenv
|
| 3 |
+
|
| 4 |
+
from datetime import datetime
|
| 5 |
+
import json
|
| 6 |
+
import os
|
| 7 |
+
load_dotenv()
|
| 8 |
+
|
| 9 |
+
key=os.getenv("Langchain")
|
| 10 |
+
client = OpenAI(
|
| 11 |
+
base_url="https://openrouter.ai/api/v1",
|
| 12 |
+
api_key=key,
|
| 13 |
+
)
|
| 14 |
+
|
| 15 |
+
completion = client.chat.completions.create(
|
| 16 |
+
model="z-ai/glm-4.5-air:free",
|
| 17 |
+
messages=[
|
| 18 |
+
{
|
| 19 |
+
"role": "user",
|
| 20 |
+
"content": "What is the meaning of life?"
|
| 21 |
+
}
|
| 22 |
+
]
|
| 23 |
+
)
|
| 24 |
+
|
| 25 |
+
# print(completion.choices[0].message.content)
|
| 26 |
+
refine_prompt = lambda idea: f"""You are a startup advisor.
|
| 27 |
+
Refine this raw startup idea into a clearer concept.
|
| 28 |
+
|
| 29 |
+
Raw Idea: {idea}
|
| 30 |
+
|
| 31 |
+
Refined Idea:"""
|
| 32 |
+
|
| 33 |
+
market_prompt = lambda refined: f"""Analyze this startup idea:
|
| 34 |
+
{refined}
|
| 35 |
+
|
| 36 |
+
Give:
|
| 37 |
+
1. Problem it solves
|
| 38 |
+
2. Target audience
|
| 39 |
+
3. Estimated market size
|
| 40 |
+
(Short and concise)."""
|
| 41 |
+
|
| 42 |
+
slides_prompt = lambda refined: f"""Create a 5-slide pitch summary for this idea:
|
| 43 |
+
{refined}
|
| 44 |
+
|
| 45 |
+
Each slide should include:
|
| 46 |
+
- A title
|
| 47 |
+
- 2 bullet points
|
| 48 |
+
Keep it punchy and startup-pitch style."""
|
| 49 |
+
|
| 50 |
+
def ask_model(prompt, model="mistralai/mistral-7b-instruct"):
|
| 51 |
+
completion = client.chat.completions.create(
|
| 52 |
+
model=model,
|
| 53 |
+
messages=[{"role": "user", "content": prompt}]
|
| 54 |
+
)
|
| 55 |
+
return completion.choices[0].message.content.strip()
|
| 56 |
+
|
| 57 |
+
def refine_startup_idea(raw_idea):
|
| 58 |
+
refined = ask_model(refine_prompt(raw_idea))
|
| 59 |
+
market_info = ask_model(market_prompt(refined))
|
| 60 |
+
slides = ask_model(slides_prompt(refined))
|
| 61 |
+
|
| 62 |
+
result = {
|
| 63 |
+
"timestamp": datetime.now().isoformat(),
|
| 64 |
+
"raw_idea": raw_idea,
|
| 65 |
+
"refined_idea": refined,
|
| 66 |
+
"market_info": market_info,
|
| 67 |
+
"slide_summary": slides
|
| 68 |
+
}
|
| 69 |
+
|
| 70 |
+
return result
|
| 71 |
+
def save_result(result, folder="refined_ideas"):
|
| 72 |
+
os.makedirs(folder, exist_ok=True)
|
| 73 |
+
filename = f"{folder}/idea_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json"
|
| 74 |
+
with open(filename, "w") as f:
|
| 75 |
+
json.dump(result, f, indent=2)
|
| 76 |
+
print(f"โ
Saved to {filename}")
|
| 77 |
+
# idea = input("๐ก Enter your startup idea: ")
|
| 78 |
+
# result = refine_startup_idea(idea)
|
| 79 |
+
|
| 80 |
+
# print("\n๐ง Refined Idea:\n", result["refined_idea"])
|
| 81 |
+
# print("\n๐ Market Info:\n", result["market_info"])
|
| 82 |
+
# print("\n๐ฝ๏ธ Slide Summary:\n", result["slide_summary"])
|
| 83 |
+
|
| 84 |
+
# save_result(result)
|
| 85 |
+
|
| 86 |
+
def run_refiner(raw_idea):
|
| 87 |
+
result = refine_startup_idea(raw_idea)
|
| 88 |
+
save_result(result)
|
| 89 |
+
return result
|
requirements.txt
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
langchain
|
| 2 |
+
openai
|
| 3 |
+
httpx
|
| 4 |
+
python-dotenv
|
| 5 |
+
fastapi
|
| 6 |
+
uvicorn
|
| 7 |
+
jinja2
|
| 8 |
+
python-multipart
|
| 9 |
+
markdown2
|
templates/form.html
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html>
|
| 3 |
+
<head>
|
| 4 |
+
<title>Startup Idea Refiner</title>
|
| 5 |
+
</head>
|
| 6 |
+
<body>
|
| 7 |
+
<h2>๐ Enter Your Raw Startup Idea</h2>
|
| 8 |
+
<form action="/refine" method="post">
|
| 9 |
+
<textarea name="idea" rows="6" cols="60" required></textarea><br /><br />
|
| 10 |
+
<button type="submit">Refine</button>
|
| 11 |
+
</form>
|
| 12 |
+
</body>
|
| 13 |
+
</html>
|
templates/result.html
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html>
|
| 3 |
+
<head><title>Refined Output</title></head>
|
| 4 |
+
<body>
|
| 5 |
+
<h2>โ
Refined Startup Idea</h2>
|
| 6 |
+
<div>{{ output_html|safe }}</div>
|
| 7 |
+
<br><a href="/">๐ Try another</a>
|
| 8 |
+
</body>
|
| 9 |
+
</html>
|