Files
2026-06-05 11:49:45 +00:00

56 lines
2.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Tool definitions for the FAQ bot.
The module defines two tools:
1. `search_course_docs` a semantic search over the local Chroma FAQ store.
2. `fetch_course_meta` a simple HTTP GET to a local JSON file that mimics an MCP
metadata service.
Both tools are decorated with `@tool` so that LangChain can expose them to the
agent.
"""
import json
import os
from pathlib import Path
from typing import Any
import httpx
from langchain.tools import tool
from config import COURSE_META_JSON
from vector_store import search_course_docs
# ---------------------------------------------------------------------------
# 1. Semantic search tool
# ---------------------------------------------------------------------------
@tool("search_course_docs", "Search local FAQ documents.")
async def search_course_docs_tool(query: str, k: int = 3) -> str:
"""Return topk relevant FAQ snippets for *query*.
The function is asynchronous to match the signature expected by LangChain
agents. It simply forwards the call to the synchronous helper in
``vector_store``.
"""
return search_course_docs(query, k)
# ---------------------------------------------------------------------------
# 2. Metadata fetch tool MCPstyle
# ---------------------------------------------------------------------------
@tool("fetch_course_meta", "Get course metadata from a local JSON file.")
async def fetch_course_meta_tool(query: str) -> str:
"""Return JSON string of metadata matching *query*.
The function reads a static JSON file. In a real deployment this would be a
HTTP request to an MCP server. For the purposes of the assignment we keep
it simple and local.
"""
if not Path(COURSE_META_JSON).exists():
return f"Metadata file {COURSE_META_JSON} not found."
data = json.loads(Path(COURSE_META_JSON).read_text(encoding="utf-8"))
# Very naive lookup: return the whole file if query is empty or substring
if not query or query.lower() in json.dumps(data).lower():
return json.dumps(data, indent=2)
return f"No metadata found for query: {query}."
# Expose the tools for external imports
__all__ = ["search_course_docs_tool", "fetch_course_meta_tool"]