agentic_rag / app.py
omkar334's picture
audio history
c525e42
raw
history blame
3.49 kB
import base64
import gradio as gr
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from agent import function_caller, retriever
from client import HybridClient
from sarvam import save_audio, speaker, translator
app = FastAPI()
hclient = HybridClient()
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
class ChatQuery(BaseModel):
query: str
grade: str
subject: str
chapter: str
class TranslateQuery(BaseModel):
text: str
src: str
dest: str
class TTSQuery(BaseModel):
text: str
src: str
@app.get("/agent")
async def agent(query: ChatQuery):
collection = f"{query.grade}_{query.subject.lower()}_{query.chapter}"
return await function_caller(query.query, collection, hclient)
@app.get("/rag")
async def rag(query: ChatQuery):
collection = f"{query.grade}_{query.subject.lower()}_{query.chapter}"
return await retriever(query.query, collection, hclient)
@app.get("/translate")
async def translate(query: TranslateQuery):
return await translator(query.text, query.src, query.dest)
@app.get("/tts")
async def tts(query: TTSQuery):
return await speaker(query.text, query.src)
async def gradio_interface(input_text, grade, subject, chapter, history):
response = await agent(ChatQuery(query=input_text, grade=grade, subject=subject, chapter=chapter))
if "text" in response:
output = response["text"]
history.append((input_text, {"type": "text", "content": output}))
elif "audios" in response:
audio_data = base64.b64decode(response["audios"][0])
audio_path = save_audio(audio_data)
history.append((input_text, {"type": "audio", "content": audio_path}))
else:
output = "Unexpected response format"
history.append((input_text, {"type": "text", "content": output}))
return "", history
def format_history(history):
formatted_history = []
for human, assistant in history:
formatted_history.append((human, None))
if assistant["type"] == "text":
formatted_history.append((None, assistant["content"]))
elif assistant["type"] == "audio":
formatted_history.append((None, gr.Audio(value=assistant["content"], visible=True)))
return formatted_history
with gr.Blocks() as iface:
gr.Markdown("# Agentic RAG Chatbot")
gr.Markdown("Ask a question and get an answer from the chatbot. The response may be text or audio.")
with gr.Row():
grade = gr.Dropdown(choices=["1", "2", "3", "4", "5", "6", "7", "9", "10", "11", "12"], label="Grade", value="9", interactive=True)
subject = gr.Dropdown(choices=["Math", "Science", "History"], label="Subject", value="Science", interactive=True)
chapter = gr.Dropdown(choices=["1", "2", "3", "4", "5", "6", "7", "9", "10", "11", "12", "13", "14", "15", "16"], label="Chapter", value="11", interactive=True)
chatbot = gr.Chatbot(label="Chat History")
msg = gr.Textbox(label="Your message", placeholder="Type your message here...")
state = gr.State([])
msg.submit(gradio_interface, inputs=[msg, grade, subject, chapter, state], outputs=[msg, state]).then(format_history, inputs=[state], outputs=[chatbot])
app = gr.mount_gradio_app(app, iface, path="/")
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)