
Added tool to find title of article being refered to by query with vector search of content.
2e66273
verified
'''Main script to run gradio interface and MCP server.''' | |
import logging | |
from pathlib import Path | |
from logging.handlers import RotatingFileHandler | |
import gradio as gr | |
import assets.text as text | |
import functions.tools as tool_funcs | |
import functions.gradio_functions as gradio_funcs | |
# Call the modal container so it spins up before the rest of | |
# the app starts | |
gradio_funcs.call_modal() | |
# Set-up logging | |
# Make sure log directory exists | |
Path('logs').mkdir(parents=True, exist_ok=True) | |
# Clear old logs if present | |
gradio_funcs.delete_old_logs('logs', 'rss_server') | |
# Set up the root logger so we catch logs from everything | |
logging.basicConfig( | |
handlers=[RotatingFileHandler( | |
'logs/rss_server.log', | |
maxBytes=100000, | |
backupCount=10, | |
mode='w' | |
)], | |
level=logging.INFO, | |
format='%(levelname)s - %(name)s - %(message)s' | |
) | |
# Get a logger | |
logger = logging.getLogger(__name__) | |
with gr.Blocks() as demo: | |
# Page text | |
gr.HTML(text.TITLE) | |
gr.Markdown(text.DESCRIPTION) | |
# Log output | |
with gr.Row(): | |
dialog_output = gr.Textbox(label='Server logs', lines=7, max_lines=5) | |
timer = gr.Timer(0.5, active=True) | |
timer.tick( # pylint: disable=no-member | |
lambda: gradio_funcs.update_log(), # pylint: disable=unnecessary-lambda | |
outputs=dialog_output, | |
show_api=False | |
) | |
# Get feed tool | |
gr.Markdown('### 1. `get_feed()`') | |
website_url = gr.Textbox('hackernews.com', label='Website') | |
feed_output = gr.Textbox(label='RSS entries', lines=7, max_lines=7) | |
with gr.Row(): | |
website_submit_button = gr.Button('Submit website') | |
website_clear_button = gr.ClearButton(components=[website_url, feed_output]) | |
website_submit_button.click( # pylint: disable=no-member | |
fn=tool_funcs.get_feed, | |
inputs=website_url, | |
outputs=feed_output, | |
api_name='Get RSS feed content' | |
) | |
# Vector search tool | |
gr.Markdown('### 2. `context_search()`') | |
context_search_query = gr.Textbox( | |
'Does apple offer parental controls?', | |
label='Context search query' | |
) | |
context_search_output = gr.Textbox( | |
label='Context search results', | |
lines=7, | |
max_lines=7 | |
) | |
with gr.Row(): | |
context_search_submit_button = gr.Button('Submit query') | |
context_search_clear_button = gr.ClearButton( | |
components=[context_search_query, context_search_output] | |
) | |
context_search_submit_button.click( # pylint: disable=no-member | |
fn=tool_funcs.context_search, | |
inputs=context_search_query, | |
outputs=context_search_output, | |
api_name='Context vector search' | |
) | |
# Find article tool | |
gr.Markdown('### 3. `find_article()`') | |
article_search_query = gr.Textbox( | |
'Does apple offer parental controls?', | |
label='Article search query' | |
) | |
article_search_output = gr.Textbox( | |
label='Article search results', | |
lines=7, | |
max_lines=7 | |
) | |
with gr.Row(): | |
article_search_submit_button = gr.Button('Submit query') | |
article_search_clear_button = gr.ClearButton( | |
components=[article_search_query, article_search_output] | |
) | |
article_search_submit_button.click( # pylint: disable=no-member | |
fn=tool_funcs.find_article, | |
inputs=article_search_query, | |
outputs=article_search_output, | |
api_name='Article vector search' | |
) | |
if __name__ == '__main__': | |
demo.launch(mcp_server=True) | |