Karthik Murali M commited on
Commit
807e9b3
ยท
1 Parent(s): c448e5f

Add application file

Browse files
Files changed (7) hide show
  1. .env +1 -0
  2. Dockerfile +11 -0
  3. main.py +49 -0
  4. refine_prompt.py +89 -0
  5. requirements.txt +9 -0
  6. templates/form.html +13 -0
  7. 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>