Skip to content

Commit a2534b6

Browse files
committed
refactor dialogue manager initialization & usage
1 parent 4996d2a commit a2534b6

File tree

5 files changed

+52
-35
lines changed

5 files changed

+52
-35
lines changed

app/admin/train/routes.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from fastapi import APIRouter, HTTPException, BackgroundTasks, Request
1+
from fastapi import APIRouter, HTTPException, BackgroundTasks
22
from app.admin.intents import store
33
from app.bot.nlu.training import train_pipeline
44

@@ -29,9 +29,9 @@ async def get_training_data(intent_id: str):
2929
return intent.trainingData
3030

3131
@router.post('/build_models')
32-
async def build_models(request: Request, background_tasks: BackgroundTasks):
32+
async def build_models(background_tasks: BackgroundTasks):
3333
"""
3434
Build Intent classification and NER Models
3535
"""
36-
background_tasks.add_task(train_pipeline, request.app)
36+
background_tasks.add_task(train_pipeline)
3737
return {"status": "training started in the background"}

app/bot/chat/routes.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
1-
from fastapi import APIRouter, HTTPException, Body, Request
1+
from fastapi import APIRouter, HTTPException, Body, Request, Depends
22
from app.bot.dialogue_manager.models import ChatModel
3+
from app.dependencies import get_dialogue_manager
34

45
router = APIRouter(prefix="/v1", tags=["bots"])
56

67
@router.post("/chat")
7-
async def chat(request: Request, body: dict):
8+
async def chat(request: Request, body: dict, dialogue_manager = Depends(get_dialogue_manager)):
89
"""
910
Endpoint to converse with the chatbot.
1011
Delegates the request processing to DialogueManager.
1112
1213
:return: JSON response with the chatbot's reply and context.
1314
"""
14-
try:
15-
# Access the dialogue manager from the fast api application state.
16-
chat_request = ChatModel.from_json(body)
17-
chat_response = await request.app.state.dialogue_manager.process(chat_request)
18-
return chat_response.to_json()
19-
except Exception as e:
20-
raise HTTPException(status_code=500, detail=f"Error processing request: {e}")
15+
16+
# Access the dialogue manager from the fast api application state.
17+
chat_request = ChatModel.from_json(body)
18+
chat_response = await dialogue_manager.process(chat_request)
19+
return chat_response.to_json()
20+

app/bot/nlu/training.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
from app.bot.nlu.intent_classifiers import IntentClassifier
88
from app.bot.nlu.entity_extractors import EntityExtractor
99
from app.admin.entities.store import list_synonyms
10-
10+
from app.dependencies import set_dialogue_manager
1111
from app.config import app_config
1212

13-
async def train_pipeline(app):
13+
async def train_pipeline():
1414
"""
1515
Initiate NLU pipeline training
1616
:return:
@@ -46,7 +46,10 @@ async def train_pipeline(app):
4646
pipeline.train(training_data, models_dir)
4747

4848
# recreate dialogue manager with new data
49-
app.state.dialogue_manager = await DialogueManager.from_config()
49+
dialogue_manager = await DialogueManager.from_config()
5050

5151
# update dialogue manager with new models
52-
app.state.dialogue_manager.update_model(models_dir)
52+
dialogue_manager.update_model(models_dir)
53+
54+
await set_dialogue_manager(dialogue_manager)
55+

app/dependencies.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from typing import Optional
2+
from app.bot.dialogue_manager.dialogue_manager import DialogueManager
3+
from app.config import app_config
4+
5+
_dialogue_manager: Optional[DialogueManager] = None
6+
7+
async def get_dialogue_manager():
8+
global _dialogue_manager
9+
return _dialogue_manager
10+
11+
async def set_dialogue_manager(dialogue_manager: DialogueManager):
12+
global _dialogue_manager
13+
_dialogue_manager = dialogue_manager
14+
15+
async def init_dialogue_manager():
16+
global _dialogue_manager
17+
print("initializing dialogue manager")
18+
_dialogue_manager = await DialogueManager.from_config()
19+
_dialogue_manager.update_model(app_config.MODELS_DIR)
20+
print("dialogue manager initialized")

app/main.py

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,25 @@
22
from contextlib import asynccontextmanager
33
from fastapi.middleware.cors import CORSMiddleware
44
from fastapi.staticfiles import StaticFiles
5-
from fastapi import FastAPI
6-
from app.bot.dialogue_manager.dialogue_manager import DialogueManager
5+
from fastapi import FastAPI, APIRouter
76
from app.database import client as database_client
7+
from app.dependencies import init_dialogue_manager
88

99
from app.admin.bots.routes import router as bots_router
1010
from app.admin.entities.routes import router as entities_router
1111
from app.admin.intents.routes import router as intents_router
1212
from app.admin.train.routes import router as train_router
1313
from app.bot.chat.routes import router as chat_router
14-
from app.config import app_config
1514

16-
@asynccontextmanager
17-
async def lifespan(app: FastAPI):
18-
# initialize dialogue_manager
19-
dialogue_manager = await DialogueManager.from_config()
20-
dialogue_manager.update_model(app_config.MODELS_DIR)
21-
app.state.dialogue_manager : DialogueManager = dialogue_manager
22-
print("dialogue manager loaded")
23-
24-
yield
2515

16+
@asynccontextmanager
17+
async def lifespan(_):
18+
await init_dialogue_manager()
19+
yield
2620
database_client.close()
2721

2822
app = FastAPI(title="AI Chatbot Framework",lifespan=lifespan)
2923

30-
# CORS middleware
3124
app.add_middleware(
3225
CORSMiddleware,
3326
allow_origins=["*"],
@@ -36,10 +29,8 @@ async def lifespan(app: FastAPI):
3629
allow_headers=["*"],
3730
)
3831

39-
# Static files
4032
app.mount("/static", StaticFiles(directory="app/static"), name="static")
4133

42-
4334
@app.get("/ready")
4435
async def ready():
4536
return {"status": "ok"}
@@ -48,9 +39,12 @@ async def ready():
4839
async def root():
4940
return {"message": "Welcome to AI Chatbot Framework API"}
5041

42+
# admin apis
43+
admin_router = APIRouter(prefix="/admin", tags=["admin"])
44+
admin_router.include_router(bots_router)
45+
admin_router.include_router(intents_router)
46+
admin_router.include_router(entities_router)
47+
admin_router.include_router(train_router)
48+
app.include_router(admin_router)
5149

52-
app.include_router(bots_router, prefix="/admin", tags=["bots"])
53-
app.include_router(intents_router, prefix="/admin", tags=["intents"])
54-
app.include_router(entities_router, prefix="/admin", tags=["entities"])
55-
app.include_router(train_router, prefix="/admin", tags=["train"])
5650
app.include_router(chat_router, prefix="/bots", tags=["bots"])

0 commit comments

Comments
 (0)