Skip to content

Commit c05b639

Browse files
Minor bugfixes
1 parent b56d846 commit c05b639

File tree

8 files changed

+92
-98
lines changed

8 files changed

+92
-98
lines changed

main.py

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from fastapi.staticfiles import StaticFiles
77
from fastapi.templating import Jinja2Templates
88
from fastapi.responses import RedirectResponse
9-
from routers import chat, files, api_keys, assistants
9+
from routers import chat, files, setup
1010
from utils.threads import create_thread
1111
from fastapi.exceptions import HTTPException
1212

@@ -24,8 +24,7 @@ async def lifespan(app: FastAPI):
2424
# Mount routers
2525
app.include_router(chat.router)
2626
app.include_router(files.router)
27-
app.include_router(api_keys.router)
28-
app.include_router(assistants.router)
27+
app.include_router(setup.router)
2928

3029
# Mount static files (e.g., CSS, JS)
3130
app.mount("/static", StaticFiles(directory=os.path.join(os.getcwd(), "static")), name="static")
@@ -61,7 +60,7 @@ async def read_home(request: Request, thread_id: str = None, messages: list = []
6160
# Check if environment variables are missing
6261
load_dotenv(override=True)
6362
if not os.getenv("OPENAI_API_KEY") or not os.getenv("ASSISTANT_ID"):
64-
return RedirectResponse(url="/setup")
63+
return RedirectResponse(url=app.url_path_for("read_setup"))
6564

6665
# Create a new assistant chat thread if no thread ID is provided
6766
if not thread_id or thread_id == "None" or thread_id == "null":
@@ -77,24 +76,6 @@ async def read_home(request: Request, thread_id: str = None, messages: list = []
7776
}
7877
)
7978

80-
81-
# Add new setup route
82-
@app.get("/setup")
83-
async def read_setup(request: Request, message: str = None):
84-
# Check if assistant ID is missing
85-
load_dotenv(override=True)
86-
if not os.getenv("OPENAI_API_KEY"):
87-
message="OpenAI API key is missing."
88-
elif not os.getenv("ASSISTANT_ID"):
89-
message="Assistant ID is missing."
90-
else:
91-
message="All set up!"
92-
93-
return templates.TemplateResponse(
94-
"setup.html",
95-
{"request": request, "message": message}
96-
)
97-
9879
if __name__ == "__main__":
9980
import uvicorn
10081

routers/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+

routers/api_keys.py

Lines changed: 0 additions & 32 deletions
This file was deleted.

routers/assistants.py

Lines changed: 0 additions & 40 deletions
This file was deleted.

routers/chat.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,8 @@ async def event_generator():
228228
# First run of the assistant stream
229229
initial_manager = client.beta.threads.runs.stream(
230230
assistant_id=assistant_id,
231-
thread_id=thread_id
231+
thread_id=thread_id,
232+
parallel_tool_calls=False
232233
)
233234

234235
# We'll re-run the loop if needed for tool calls

routers/setup.py

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import logging
2+
import os
3+
from dotenv import load_dotenv
4+
from fastapi import APIRouter, Depends, HTTPException, Form, Request
5+
from fastapi.responses import RedirectResponse
6+
from fastapi.templating import Jinja2Templates
7+
from openai import AsyncOpenAI
8+
9+
from utils.create_assistant import create_or_update_assistant, request
10+
from utils.create_assistant import update_env_file
11+
12+
# Configure logger
13+
logger: logging.Logger = logging.getLogger("uvicorn.error")
14+
15+
# Load environment variables
16+
load_dotenv()
17+
18+
router = APIRouter(prefix="/setup", tags=["Setup"])
19+
templates = Jinja2Templates(directory="templates")
20+
21+
@router.put("/api-key")
22+
async def set_openai_api_key(api_key: str = Form()):
23+
"""
24+
Set the OpenAI API key in the application's environment variables.
25+
26+
Args:
27+
api_key: OpenAI API key received from form submission
28+
29+
Returns:
30+
RedirectResponse: Redirects to home page on success
31+
32+
Raises:
33+
HTTPException: If there's an error updating the environment file
34+
"""
35+
try:
36+
update_env_file("OPENAI_API_KEY", api_key, logger)
37+
return RedirectResponse(url="/", headers={"HX-Redirect": "/"}, status_code=303)
38+
except Exception as e:
39+
raise HTTPException(
40+
status_code=500,
41+
detail=f"Failed to update API key: {str(e)}"
42+
)
43+
44+
45+
# Add new setup route
46+
@router.get("/")
47+
async def read_setup(request: Request, message: str = None):
48+
# Check if assistant ID is missing
49+
load_dotenv(override=True)
50+
if not os.getenv("OPENAI_API_KEY"):
51+
message="OpenAI API key is missing."
52+
elif not os.getenv("ASSISTANT_ID"):
53+
message="Assistant ID is missing."
54+
else:
55+
message="All set up!"
56+
57+
return templates.TemplateResponse(
58+
"setup.html",
59+
{"request": request, "message": message}
60+
)
61+
62+
63+
@router.post("/assistant")
64+
async def create_update_assistant(
65+
client: AsyncOpenAI = Depends(lambda: AsyncOpenAI())
66+
):
67+
"""
68+
Create a new assistant or update an existing one.
69+
Returns the assistant ID and status of the operation.
70+
"""
71+
assistant_id = os.getenv("ASSISTANT_ID")
72+
73+
assistant_id: str = await create_or_update_assistant(
74+
client=client,
75+
assistant_id=assistant_id,
76+
request=request,
77+
logger=logger
78+
)
79+
if not assistant_id:
80+
raise HTTPException(status_code=400, detail="Failed to create or update assistant")
81+
82+
return RedirectResponse(url="/", status_code=303)

templates/setup.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ <h1 class="title">Setup Required</h1>
88
{% if "API key" in message %}
99
<div class="setupForm">
1010
<p class="setupMessage">Please enter your OpenAI API key to continue:</p>
11-
<form action="/api-keys/set" method="POST">
11+
<form action="{{ url_for('set_openai_api_key') }}" method="POST">
1212
<div class="inputWrapper">
1313
<input
1414
type="password"
@@ -29,7 +29,7 @@ <h1 class="title">Setup Required</h1>
2929
{% elif "Assistant ID" in message %}
3030
<div class="setupForm">
3131
<p class="setupMessage">You need to create an assistant to continue:</p>
32-
<form action="/assistants/create-update" method="POST">
32+
<form action="{{ url_for('create_update_assistant') }}" method="POST">
3333
<button
3434
type="submit"
3535
class="button"
@@ -41,7 +41,7 @@ <h1 class="title">Setup Required</h1>
4141
{% elif message == "All set up!" %}
4242
<div class="setupForm">
4343
<p class="setupMessage">Your application is already configured and ready to use.</p>
44-
<a href="/" class="button">Return to Home</a>
44+
<a href="{{ url_for('read_home') }}" class="button">Return to Home</a>
4545
</div>
4646
{% endif %}
4747
</div>

utils/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+

0 commit comments

Comments
 (0)