BookBeacon / app.py
nharshavardhana's picture
commit
58bf191
from typing import Optional
from smolagents import CodeAgent, HfApiModel, tool
import os
import requests
import gradio as gr
# Define tool for fetching book recommendations
@tool
def get_book_recommendations(prompt: str) -> str:
"""Fetches book recommendations based on user prompt.
Args:
prompt: the user's query, e.g., "book about Mars"
"""
print(f"Received prompt: {prompt}")
api_key = os.getenv("GOOGLE_BOOKS_API_KEY")
print(f"Using API Key: {api_key}")
search_query = prompt
url = f"https://www.googleapis.com/books/v1/volumes?q={search_query}&key={api_key}"
print(f"Request URL: {url}")
response = requests.get(url)
print(f"API Response Status Code: {response.status_code}")
if response.status_code == 200:
books = parse_google_books_response(response.json())
print(f"Parsed Books: {books}")
top_books = books[:5] # Get top 5 books
return format_book_recommendations(top_books)
else:
return "Error fetching book recommendations."
def parse_google_books_response(json_content):
books = []
for item in json_content.get('items', []):
volume_info = item.get('volumeInfo', {})
title = volume_info.get('title', 'No title available')
authors = ", ".join(volume_info.get('authors', ['No author available']))
books.append({
"title": title,
"author": authors
})
return books
def format_book_recommendations(books):
formatted_books = []
for index, book in enumerate(books, start=1):
formatted_books.append(f"{index}. {book['title']} by {book['author']}")
return "\n".join(formatted_books)
# Create the AI agent
agent = CodeAgent(tools=[get_book_recommendations], model=HfApiModel(), additional_authorized_imports=["requests"])
# Define Gradio interface
def generate_recommendations(query: str) -> str:
return agent.run(query)
description_md = """
Get top 5 book recommendations based on your query. Simply enter your query, and receive a list of books with their names, authors.
"""
# Create Gradio UI
iface = gr.Interface(
fn=generate_recommendations,
inputs=[
gr.Textbox(lines=1, placeholder="Enter a query", label="Book Topic")
],
outputs="text",
title="Book Beacon",
description=description_md
)
# Launch Gradio UI
iface.launch(share=True)