{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import path_setup  # noqa: F401 — adds project root to sys.path\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "40fe25b3",
   "metadata": {},
   "outputs": [],
   "source": [
    "%load_ext autoreload\n",
    "%autoreload 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "a9274208",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "\n",
    "df_ground_truth = pd.read_csv(\"data/ground_truth.csv\")\n",
    "ground_truth = df_ground_truth.to_dict(orient=\"records\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "c374fd62",
   "metadata": {},
   "outputs": [],
   "source": [
    "from ingest import load_faq_data, build_index, build_vector_index\n",
    "documents = load_faq_data()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "ceb1a461",
   "metadata": {},
   "outputs": [],
   "source": [
    "doc_idx = {}\n",
    "\n",
    "for doc in documents:\n",
    "    doc_idx[doc[\"id\"]] = doc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "5d7cf98f",
   "metadata": {},
   "outputs": [],
   "source": [
    "text_index = build_index(documents)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "from embedder import Embedder\n",
    "\n",
    "embedder = Embedder()\n",
    "index = build_vector_index(embedder, documents)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "51e38098",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from dotenv import load_dotenv\n",
    "\n",
    "load_dotenv()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "1a700037",
   "metadata": {},
   "outputs": [],
   "source": [
    "from litellm import completion\nfrom config import make_llm_client, MODEL_NAME\n\n# 1. Initialize your client object with a model list\nlitellm_router = make_llm_client()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "f2f7ebed",
   "metadata": {},
   "outputs": [],
   "source": [
    "from copy import deepcopy\n",
    "from toyaikit.llm import OpenAIChatCompletionsClient\n",
    "\n",
    "# 2. Build a custom wrapper class to satisfy ToyAIKit's send_request contract\n",
    "class LiteLLMToToyAIClient(OpenAIChatCompletionsClient):\n",
    "    def __init__(self, router, model_name=\"mistral-large\"):\n",
    "        self.router = router\n",
    "        self.model_name = model_name\n",
    "\n",
    "    @staticmethod\n",
    "    def _clean_tool_schema(tools):\n",
    "        if tools is None:\n",
    "            return None\n",
    "        cleaned_tools = []\n",
    "        for tool in tools:\n",
    "            if isinstance(tool, dict):\n",
    "                tool = deepcopy(tool)\n",
    "                params = tool.get(\"parameters\")\n",
    "                if isinstance(params, dict):\n",
    "                    properties = params.get(\"properties\")\n",
    "                    if isinstance(properties, dict) and \"self\" in properties:\n",
    "                        properties.pop(\"self\", None)\n",
    "                        required = params.get(\"required\")\n",
    "                        if isinstance(required, list):\n",
    "                            params[\"required\"] = [p for p in required if p != \"self\"]\n",
    "                cleaned_tools.append(tool)\n",
    "            else:\n",
    "                cleaned_tools.append(tool)\n",
    "        return cleaned_tools\n",
    "\n",
    "    def send_request(self, chat_messages, tools=None, output_format=None, **kwargs):\n",
    "        \"\"\"ToyAIKit runners call this method internally.\"\"\"\n",
    "        if tools is None:\n",
    "            litellm_tools = None\n",
    "        elif hasattr(tools, \"get_tools\"):\n",
    "            litellm_tools = self._clean_tool_schema(tools.get_tools())\n",
    "        else:\n",
    "            litellm_tools = self._clean_tool_schema(tools)\n",
    "\n",
    "        response = self.router.completion(\n",
    "            model=self.model_name,\n",
    "            messages=chat_messages,\n",
    "            tools=litellm_tools,\n",
    "            _skip_mcp_handler=True,\n",
    "            **kwargs\n",
    "        )\n",
    "        return response\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "1f4b64b8",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 3. Instantiate your custom client wrapper\nllm_client = LiteLLMToToyAIClient(router=litellm_router, model_name=MODEL_NAME)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "7216c4e2",
   "metadata": {},
   "outputs": [],
   "source": [
    "from typing import Any\n",
    "from toyaikit.tools import Tools\n",
    "from toyaikit.chat.runners import OpenAIResponsesRunner\n",
    "from evaluation.evaluation_utils import RAGWithUsage\n",
    "\n",
    "agent_tools = Tools()\n",
    "agent_tools.add_tool(RAGWithUsage.search)\n",
    "\n",
    "instructions = \"\"\"\n",
    "You're a First Aid QA Assistant. Answer person at accident site questions based on\n",
    "the FAQ search results. Use the search tool before answering.\n",
    "\"\"\".strip()\n",
    "\n",
    "runner = OpenAIResponsesRunner(\n",
    "    tools=agent_tools,\n",
    "    developer_prompt=instructions,\n",
    "    llm_client=llm_client,  # type: ignore[arg-type]\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "50d8f857",
   "metadata": {},
   "outputs": [
    {
     "ename": "BadRequestError",
     "evalue": "litellm.BadRequestError: MistralException - {\"detail\":[{\"type\":\"literal_error\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"WebSearchTool\",\"type\"],\"msg\":\"Input should be <ConversationToolTypes.Websearch: 'web_search'>\",\"input\":\"function\",\"ctx\":{\"expected\":\"<ConversationToolTypes.Websearch: 'web_search'>\"}},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"WebSearchTool\",\"name\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"search\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"WebSearchTool\",\"description\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"No description provided.\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"WebSearchTool\",\"parameters\"],\"msg\":\"Extra inputs are not permitted\",\"input\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}},{\"type\":\"literal_error\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"WebSearchPremiumTool\",\"type\"],\"msg\":\"Input should be <ConversationToolTypes.WebsearchPremium: 'web_search_premium'>\",\"input\":\"function\",\"ctx\":{\"expected\":\"<ConversationToolTypes.WebsearchPremium: 'web_search_premium'>\"}},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"WebSearchPremiumTool\",\"name\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"search\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"WebSearchPremiumTool\",\"description\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"No description provided.\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"WebSearchPremiumTool\",\"parameters\"],\"msg\":\"Extra inputs are not permitted\",\"input\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}},{\"type\":\"literal_error\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"CodeInterpreterTool\",\"type\"],\"msg\":\"Input should be <ConversationToolTypes.CodeInterpreter: 'code_interpreter'>\",\"input\":\"function\",\"ctx\":{\"expected\":\"<ConversationToolTypes.CodeInterpreter: 'code_interpreter'>\"}},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"CodeInterpreterTool\",\"name\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"search\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"CodeInterpreterTool\",\"description\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"No description provided.\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"CodeInterpreterTool\",\"parameters\"],\"msg\":\"Extra inputs are not permitted\",\"input\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}},{\"type\":\"literal_error\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"ImageGenerationTool\",\"type\"],\"msg\":\"Input should be <ConversationToolTypes.ImageGeneration: 'image_generation'>\",\"input\":\"function\",\"ctx\":{\"expected\":\"<ConversationToolTypes.ImageGeneration: 'image_generation'>\"}},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"ImageGenerationTool\",\"name\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"search\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"ImageGenerationTool\",\"description\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"No description provided.\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"ImageGenerationTool\",\"parameters\"],\"msg\":\"Extra inputs are not permitted\",\"input\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}},{\"type\":\"literal_error\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"DocumentLibraryTool\",\"type\"],\"msg\":\"Input should be <ConversationToolTypes.DocumentLibrary: 'document_library'>\",\"input\":\"function\",\"ctx\":{\"expected\":\"<ConversationToolTypes.DocumentLibrary: 'document_library'>\"}},{\"type\":\"missing\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"DocumentLibraryTool\",\"library_ids\"],\"msg\":\"Field required\",\"input\":{\"type\":\"function\",\"name\":\"search\",\"description\":\"No description provided.\",\"parameters\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}}},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"DocumentLibraryTool\",\"name\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"search\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"DocumentLibraryTool\",\"description\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"No description provided.\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"DocumentLibraryTool\",\"parameters\"],\"msg\":\"Extra inputs are not permitted\",\"input\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}},{\"type\":\"literal_error\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"CustomConnector\",\"type\"],\"msg\":\"Input should be <ConversationToolTypes.Connector: 'connector'>\",\"input\":\"function\",\"ctx\":{\"expected\":\"<ConversationToolTypes.Connector: 'connector'>\"}},{\"type\":\"missing\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"CustomConnector\",\"connector_id\"],\"msg\":\"Field required\",\"input\":{\"type\":\"function\",\"name\":\"search\",\"description\":\"No description provided.\",\"parameters\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}}},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"CustomConnector\",\"name\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"search\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"CustomConnector\",\"description\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"No description provided.\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"CustomConnector\",\"parameters\"],\"msg\":\"Extra inputs are not permitted\",\"input\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}},{\"type\":\"missing\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"Tool\",\"function\"],\"msg\":\"Field required\",\"input\":{\"type\":\"function\",\"name\":\"search\",\"description\":\"No description provided.\",\"parameters\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}}},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"Tool\",\"name\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"search\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"Tool\",\"description\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"No description provided.\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"Tool\",\"parameters\"],\"msg\":\"Extra inputs are not permitted\",\"input\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}},{\"type\":\"string_type\",\"loc\":[\"body\",\"tools\",\"list[str]\",0],\"msg\":\"Input should be a valid string\",\"input\":{\"type\":\"function\",\"name\":\"search\",\"description\":\"No description provided.\",\"parameters\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}}}]}. Received Model Group=ministral-3b-2512\nAvailable Model Group Fallbacks=None",
     "output_type": "error",
     "traceback": [
      "\u001b[31m---------------------------------------------------------------------------\u001b[39m",
      "\u001b[31mMaskedHTTPStatusError\u001b[39m                     Traceback (most recent call last)",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/llms/custom_httpx/llm_http_handler.py:321\u001b[39m, in \u001b[36mBaseLLMHTTPHandler._make_common_sync_call\u001b[39m\u001b[34m(self, sync_httpx_client, provider_config, api_base, headers, data, timeout, litellm_params, logging_obj, stream, signed_json_body)\u001b[39m\n\u001b[32m    319\u001b[39m                     \u001b[38;5;28;01mcontinue\u001b[39;00m\n\u001b[32m    320\u001b[39m                 \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m321\u001b[39m                     \u001b[38;5;28;01mraise\u001b[39;00m self._handle_error(e=e, provider_config=provider_config)\n\u001b[32m    322\u001b[39m             \u001b[38;5;28;01mexcept\u001b[39;00m Exception \u001b[38;5;28;01mas\u001b[39;00m e:\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/llms/custom_httpx/http_handler.py:1195\u001b[39m, in \u001b[36mHTTPHandler.post\u001b[39m\u001b[34m(self, url, data, json, params, headers, stream, timeout, files, content, logging_obj)\u001b[39m\n\u001b[32m   1194\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m httpx.HTTPStatusError \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m-> \u001b[39m\u001b[32m1195\u001b[39m     \u001b[30;43m_raise_masked_sync_error\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43me\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mstream\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m   1196\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/llms/custom_httpx/http_handler.py:434\u001b[39m, in \u001b[36m_raise_masked_sync_error\u001b[39m\u001b[34m(e, stream)\u001b[39m\n\u001b[32m    433\u001b[39m _text = mask_sensitive_info(_safe_get_response_text(e.response))\n\u001b[32m--> \u001b[39m\u001b[32m434\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m MaskedHTTPStatusError(e, message=_text, text=_text) \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m\n",
      "\u001b[31mMaskedHTTPStatusError\u001b[39m: Client error '422 Unprocessable Entity' for url 'https://api.mistral.ai/v1/chat/completions'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422",
      "\nDuring handling of the above exception, another exception occurred:\n",
      "\u001b[31mOpenAIError\u001b[39m                               Traceback (most recent call last)",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/main.py:5481\u001b[39m, in \u001b[36mcompletion\u001b[39m\u001b[34m(model, messages, timeout, temperature, top_p, n, stream, stream_options, stop, max_completion_tokens, max_tokens, modalities, prediction, audio, presence_penalty, frequency_penalty, logit_bias, user, reasoning_effort, verbosity, response_format, seed, tools, tool_choice, logprobs, top_logprobs, parallel_tool_calls, web_search_options, include_server_side_tool_invocations, deployment_id, extra_headers, safety_identifier, service_tier, functions, function_call, base_url, api_version, api_key, model_list, thinking, shared_session, enable_json_schema_validation, **kwargs)\u001b[39m\n\u001b[32m   5480\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m custom_llm_provider == \u001b[33m\"\u001b[39m\u001b[33mmistral\u001b[39m\u001b[33m\"\u001b[39m:\n\u001b[32m-> \u001b[39m\u001b[32m5481\u001b[39m     response = \u001b[30;43m_complete_mistral\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m_dispatch_ctx\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m   5482\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m \u001b[33m\"\u001b[39m\u001b[33mreplicate\u001b[39m\u001b[33m\"\u001b[39m \u001b[38;5;129;01min\u001b[39;00m model \u001b[38;5;129;01mor\u001b[39;00m custom_llm_provider == \u001b[33m\"\u001b[39m\u001b[33mreplicate\u001b[39m\u001b[33m\"\u001b[39m \u001b[38;5;129;01mor\u001b[39;00m model \u001b[38;5;129;01min\u001b[39;00m litellm.replicate_models:\n\u001b[32m   5483\u001b[39m     \u001b[38;5;66;03m# Setting the relevant API KEY for replicate, replicate defaults to using os.environ.get(\"REPLICATE_API_TOKEN\")\u001b[39;00m\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/main.py:2443\u001b[39m, in \u001b[36m_complete_mistral\u001b[39m\u001b[34m(ctx)\u001b[39m\n\u001b[32m   2441\u001b[39m api_base = api_base \u001b[38;5;129;01mor\u001b[39;00m litellm.api_base \u001b[38;5;129;01mor\u001b[39;00m get_secret(\u001b[33m\"\u001b[39m\u001b[33mMISTRAL_API_BASE\u001b[39m\u001b[33m\"\u001b[39m) \u001b[38;5;129;01mor\u001b[39;00m \u001b[33m\"\u001b[39m\u001b[33mhttps://api.mistral.ai/v1\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m-> \u001b[39m\u001b[32m2443\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[30;43mbase_llm_http_handler\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mcompletion\u001b[39;49m\u001b[30;43m(\u001b[39;49m\n\u001b[32m   2444\u001b[39m \u001b[30;43m    \u001b[39;49m\u001b[30;43mmodel\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mmodel\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   2445\u001b[39m \u001b[30;43m    \u001b[39;49m\u001b[30;43mmessages\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mmessages\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   2446\u001b[39m \u001b[30;43m    \u001b[39;49m\u001b[30;43mapi_base\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mapi_base\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   2447\u001b[39m \u001b[30;43m    \u001b[39;49m\u001b[30;43mcustom_llm_provider\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mcustom_llm_provider\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   2448\u001b[39m \u001b[30;43m    \u001b[39;49m\u001b[30;43mmodel_response\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mmodel_response\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   2449\u001b[39m \u001b[30;43m    \u001b[39;49m\u001b[30;43mencoding\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43m_get_encoding\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m)\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   2450\u001b[39m \u001b[30;43m    \u001b[39;49m\u001b[30;43mlogging_obj\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mlogging\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   2451\u001b[39m \u001b[30;43m    \u001b[39;49m\u001b[30;43moptional_params\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43moptional_params\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   2452\u001b[39m \u001b[30;43m    \u001b[39;49m\u001b[30;43mtimeout\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mtimeout\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   2453\u001b[39m \u001b[30;43m    \u001b[39;49m\u001b[30;43mlitellm_params\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mlitellm_params\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   2454\u001b[39m \u001b[30;43m    \u001b[39;49m\u001b[30;43mshared_session\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mshared_session\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   2455\u001b[39m \u001b[30;43m    \u001b[39;49m\u001b[30;43macompletion\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43macompletion\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   2456\u001b[39m \u001b[30;43m    \u001b[39;49m\u001b[30;43mstream\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mstream\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   2457\u001b[39m \u001b[30;43m    \u001b[39;49m\u001b[30;43mapi_key\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mapi_key\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   2458\u001b[39m \u001b[30;43m    \u001b[39;49m\u001b[30;43mheaders\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mheaders\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   2459\u001b[39m \u001b[30;43m    \u001b[39;49m\u001b[30;43mclient\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mclient\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   2460\u001b[39m \u001b[30;43m    \u001b[39;49m\u001b[30;43mprovider_config\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mprovider_config\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   2461\u001b[39m \u001b[30;43m\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/llms/custom_httpx/llm_http_handler.py:599\u001b[39m, in \u001b[36mBaseLLMHTTPHandler.completion\u001b[39m\u001b[34m(self, model, messages, api_base, custom_llm_provider, model_response, encoding, logging_obj, optional_params, timeout, litellm_params, acompletion, stream, fake_stream, api_key, headers, client, provider_config, shared_session)\u001b[39m\n\u001b[32m    597\u001b[39m             sync_httpx_client = client\n\u001b[32m    598\u001b[39m \n\u001b[32m--> \u001b[39m\u001b[32m599\u001b[39m         response = self._make_common_sync_call(\n\u001b[32m    600\u001b[39m             sync_httpx_client=sync_httpx_client,\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/llms/custom_httpx/llm_http_handler.py:321\u001b[39m, in \u001b[36mBaseLLMHTTPHandler._make_common_sync_call\u001b[39m\u001b[34m(self, sync_httpx_client, provider_config, api_base, headers, data, timeout, litellm_params, logging_obj, stream, signed_json_body)\u001b[39m\n\u001b[32m    319\u001b[39m                     \u001b[38;5;28;01mcontinue\u001b[39;00m\n\u001b[32m    320\u001b[39m                 \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m321\u001b[39m                     \u001b[38;5;28;01mraise\u001b[39;00m self._handle_error(e=e, provider_config=provider_config)\n\u001b[32m    322\u001b[39m             \u001b[38;5;28;01mexcept\u001b[39;00m Exception \u001b[38;5;28;01mas\u001b[39;00m e:\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/llms/custom_httpx/llm_http_handler.py:5546\u001b[39m, in \u001b[36mBaseLLMHTTPHandler._handle_error\u001b[39m\u001b[34m(self, e, provider_config)\u001b[39m\n\u001b[32m   5544\u001b[39m             )\n\u001b[32m   5545\u001b[39m \n\u001b[32m-> \u001b[39m\u001b[32m5546\u001b[39m         raise provider_config.get_error_class(\n\u001b[32m   5547\u001b[39m             error_message=error_text,\n",
      "\u001b[31mOpenAIError\u001b[39m: {\"detail\":[{\"type\":\"literal_error\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"WebSearchTool\",\"type\"],\"msg\":\"Input should be <ConversationToolTypes.Websearch: 'web_search'>\",\"input\":\"function\",\"ctx\":{\"expected\":\"<ConversationToolTypes.Websearch: 'web_search'>\"}},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"WebSearchTool\",\"name\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"search\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"WebSearchTool\",\"description\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"No description provided.\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"WebSearchTool\",\"parameters\"],\"msg\":\"Extra inputs are not permitted\",\"input\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}},{\"type\":\"literal_error\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"WebSearchPremiumTool\",\"type\"],\"msg\":\"Input should be <ConversationToolTypes.WebsearchPremium: 'web_search_premium'>\",\"input\":\"function\",\"ctx\":{\"expected\":\"<ConversationToolTypes.WebsearchPremium: 'web_search_premium'>\"}},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"WebSearchPremiumTool\",\"name\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"search\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"WebSearchPremiumTool\",\"description\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"No description provided.\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"WebSearchPremiumTool\",\"parameters\"],\"msg\":\"Extra inputs are not permitted\",\"input\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}},{\"type\":\"literal_error\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"CodeInterpreterTool\",\"type\"],\"msg\":\"Input should be <ConversationToolTypes.CodeInterpreter: 'code_interpreter'>\",\"input\":\"function\",\"ctx\":{\"expected\":\"<ConversationToolTypes.CodeInterpreter: 'code_interpreter'>\"}},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"CodeInterpreterTool\",\"name\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"search\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"CodeInterpreterTool\",\"description\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"No description provided.\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"CodeInterpreterTool\",\"parameters\"],\"msg\":\"Extra inputs are not permitted\",\"input\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}},{\"type\":\"literal_error\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"ImageGenerationTool\",\"type\"],\"msg\":\"Input should be <ConversationToolTypes.ImageGeneration: 'image_generation'>\",\"input\":\"function\",\"ctx\":{\"expected\":\"<ConversationToolTypes.ImageGeneration: 'image_generation'>\"}},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"ImageGenerationTool\",\"name\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"search\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"ImageGenerationTool\",\"description\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"No description provided.\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"ImageGenerationTool\",\"parameters\"],\"msg\":\"Extra inputs are not permitted\",\"input\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}},{\"type\":\"literal_error\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"DocumentLibraryTool\",\"type\"],\"msg\":\"Input should be <ConversationToolTypes.DocumentLibrary: 'document_library'>\",\"input\":\"function\",\"ctx\":{\"expected\":\"<ConversationToolTypes.DocumentLibrary: 'document_library'>\"}},{\"type\":\"missing\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"DocumentLibraryTool\",\"library_ids\"],\"msg\":\"Field required\",\"input\":{\"type\":\"function\",\"name\":\"search\",\"description\":\"No description provided.\",\"parameters\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}}},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"DocumentLibraryTool\",\"name\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"search\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"DocumentLibraryTool\",\"description\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"No description provided.\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"DocumentLibraryTool\",\"parameters\"],\"msg\":\"Extra inputs are not permitted\",\"input\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}},{\"type\":\"literal_error\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"CustomConnector\",\"type\"],\"msg\":\"Input should be <ConversationToolTypes.Connector: 'connector'>\",\"input\":\"function\",\"ctx\":{\"expected\":\"<ConversationToolTypes.Connector: 'connector'>\"}},{\"type\":\"missing\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"CustomConnector\",\"connector_id\"],\"msg\":\"Field required\",\"input\":{\"type\":\"function\",\"name\":\"search\",\"description\":\"No description provided.\",\"parameters\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}}},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"CustomConnector\",\"name\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"search\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"CustomConnector\",\"description\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"No description provided.\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"CustomConnector\",\"parameters\"],\"msg\":\"Extra inputs are not permitted\",\"input\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}},{\"type\":\"missing\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"Tool\",\"function\"],\"msg\":\"Field required\",\"input\":{\"type\":\"function\",\"name\":\"search\",\"description\":\"No description provided.\",\"parameters\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}}},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"Tool\",\"name\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"search\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"Tool\",\"description\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"No description provided.\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"Tool\",\"parameters\"],\"msg\":\"Extra inputs are not permitted\",\"input\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}},{\"type\":\"string_type\",\"loc\":[\"body\",\"tools\",\"list[str]\",0],\"msg\":\"Input should be a valid string\",\"input\":{\"type\":\"function\",\"name\":\"search\",\"description\":\"No description provided.\",\"parameters\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}}}]}",
      "\nDuring handling of the above exception, another exception occurred:\n",
      "\u001b[31mBadRequestError\u001b[39m                           Traceback (most recent call last)",
      "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[28]\u001b[39m\u001b[32m, line 3\u001b[39m\n\u001b[32m      1\u001b[39m rec = ground_truth[\u001b[32m0\u001b[39m]\n\u001b[32m      2\u001b[39m \n\u001b[32m----> \u001b[39m\u001b[32m3\u001b[39m result = runner.loop(prompt=rec[\u001b[33m\"question\"\u001b[39m])\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/toyaikit/chat/runners.py:252\u001b[39m, in \u001b[36mOpenAIResponsesRunner.loop\u001b[39m\u001b[34m(self, prompt, previous_messages, callback, output_format)\u001b[39m\n\u001b[32m    249\u001b[39m total_output_tokens = \u001b[32m0\u001b[39m\n\u001b[32m    251\u001b[39m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m252\u001b[39m     response = \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mllm_client\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43msend_request\u001b[39;49m\u001b[30;43m(\u001b[39;49m\n\u001b[32m    253\u001b[39m \u001b[30;43m        \u001b[39;49m\u001b[30;43mchat_messages\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mchat_messages\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m    254\u001b[39m \u001b[30;43m        \u001b[39;49m\u001b[30;43mtools\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mtools\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m    255\u001b[39m \u001b[30;43m        \u001b[39;49m\u001b[30;43moutput_format\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43moutput_format\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m    256\u001b[39m \u001b[30;43m    \u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m    257\u001b[39m     \u001b[38;5;28;01mif\u001b[39;00m callback:\n\u001b[32m    258\u001b[39m         callback.on_response(response)\n",
      "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[25]\u001b[39m\u001b[32m, line 40\u001b[39m, in \u001b[36mLiteLLMToToyAIClient.send_request\u001b[39m\u001b[34m(self, chat_messages, tools, output_format, **kwargs)\u001b[39m\n\u001b[32m     36\u001b[39m             litellm_tools = self._clean_tool_schema(tools.get_tools())\n\u001b[32m     37\u001b[39m         \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m     38\u001b[39m             litellm_tools = self._clean_tool_schema(tools)\n\u001b[32m     39\u001b[39m \n\u001b[32m---> \u001b[39m\u001b[32m40\u001b[39m         response = self.router.completion(\n\u001b[32m     41\u001b[39m             model=self.model_name,\n\u001b[32m     42\u001b[39m             messages=chat_messages,\n\u001b[32m     43\u001b[39m             tools=litellm_tools,\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/router.py:1612\u001b[39m, in \u001b[36mRouter.completion\u001b[39m\u001b[34m(self, model, messages, **kwargs)\u001b[39m\n\u001b[32m   1608\u001b[39m \n\u001b[32m   1609\u001b[39m             response = self.function_with_fallbacks(**kwargs)\n\u001b[32m   1610\u001b[39m             \u001b[38;5;28;01mreturn\u001b[39;00m response\n\u001b[32m   1611\u001b[39m         \u001b[38;5;28;01mexcept\u001b[39;00m Exception \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m-> \u001b[39m\u001b[32m1612\u001b[39m             \u001b[38;5;28;01mraise\u001b[39;00m e\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/router.py:1612\u001b[39m, in \u001b[36mRouter.completion\u001b[39m\u001b[34m(self, model, messages, **kwargs)\u001b[39m\n\u001b[32m   1608\u001b[39m \n\u001b[32m   1609\u001b[39m             response = self.function_with_fallbacks(**kwargs)\n\u001b[32m   1610\u001b[39m             \u001b[38;5;28;01mreturn\u001b[39;00m response\n\u001b[32m   1611\u001b[39m         \u001b[38;5;28;01mexcept\u001b[39;00m Exception \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m-> \u001b[39m\u001b[32m1612\u001b[39m             \u001b[38;5;28;01mraise\u001b[39;00m e\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/router.py:6605\u001b[39m, in \u001b[36mRouter.function_with_fallbacks\u001b[39m\u001b[34m(self, *args, **kwargs)\u001b[39m\n\u001b[32m   6601\u001b[39m         Sync wrapper \u001b[38;5;28;01mfor\u001b[39;00m async_function_with_fallbacks\n\u001b[32m   6602\u001b[39m \n\u001b[32m   6603\u001b[39m         Wrapped to reduce code duplication \u001b[38;5;28;01mand\u001b[39;00m prevent bugs.\n\u001b[32m   6604\u001b[39m         \"\"\"\n\u001b[32m-> \u001b[39m\u001b[32m6605\u001b[39m         \u001b[38;5;28;01mreturn\u001b[39;00m run_async_function(self.async_function_with_fallbacks, *args, **kwargs)\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/litellm_core_utils/asyncify.py:110\u001b[39m, in \u001b[36mrun_async_function\u001b[39m\u001b[34m(async_function, *args, **kwargs)\u001b[39m\n\u001b[32m    108\u001b[39m     \u001b[38;5;28;01mwith\u001b[39;00m ThreadPoolExecutor(max_workers=\u001b[32m1\u001b[39m) \u001b[38;5;28;01mas\u001b[39;00m executor:\n\u001b[32m    109\u001b[39m         future = executor.submit(run_in_new_loop)\n\u001b[32m--> \u001b[39m\u001b[32m110\u001b[39m         \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[30;43mfuture\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mresult\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m    112\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m:\n\u001b[32m    113\u001b[39m     \u001b[38;5;66;03m# No running event loop, we can safely run in this thread\u001b[39;00m\n\u001b[32m    114\u001b[39m     \u001b[38;5;28;01mreturn\u001b[39;00m run_in_new_loop()\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/anaconda3/lib/python3.12/concurrent/futures/_base.py:456\u001b[39m, in \u001b[36mFuture.result\u001b[39m\u001b[34m(self, timeout)\u001b[39m\n\u001b[32m    454\u001b[39m     \u001b[38;5;28;01mraise\u001b[39;00m CancelledError()\n\u001b[32m    455\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mself\u001b[39m._state == FINISHED:\n\u001b[32m--> \u001b[39m\u001b[32m456\u001b[39m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m__get_result\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m    457\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m    458\u001b[39m     \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTimeoutError\u001b[39;00m()\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/anaconda3/lib/python3.12/concurrent/futures/_base.py:401\u001b[39m, in \u001b[36mFuture.__get_result\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m    399\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m._exception:\n\u001b[32m    400\u001b[39m     \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m401\u001b[39m         \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;28mself\u001b[39m._exception\n\u001b[32m    402\u001b[39m     \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[32m    403\u001b[39m         \u001b[38;5;66;03m# Break a reference cycle with the exception in self._exception\u001b[39;00m\n\u001b[32m    404\u001b[39m         \u001b[38;5;28mself\u001b[39m = \u001b[38;5;28;01mNone\u001b[39;00m\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/anaconda3/lib/python3.12/concurrent/futures/thread.py:58\u001b[39m, in \u001b[36m_WorkItem.run\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m     55\u001b[39m     \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[32m     57\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m---> \u001b[39m\u001b[32m58\u001b[39m     result = \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mfn\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43margs\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mkwargs\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m     59\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[32m     60\u001b[39m     \u001b[38;5;28mself\u001b[39m.future.set_exception(exc)\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/litellm_core_utils/asyncify.py:98\u001b[39m, in \u001b[36mrun_async_function.<locals>.run_in_new_loop\u001b[39m\u001b[34m()\u001b[39m\n\u001b[32m     96\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m     97\u001b[39m     asyncio.set_event_loop(new_loop)\n\u001b[32m---> \u001b[39m\u001b[32m98\u001b[39m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[30;43mnew_loop\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mrun_until_complete\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43masync_function\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43margs\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43mkwargs\u001b[39;49m\u001b[30;43m)\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m     99\u001b[39m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[32m    100\u001b[39m     new_loop.close()\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/anaconda3/lib/python3.12/asyncio/base_events.py:687\u001b[39m, in \u001b[36mBaseEventLoop.run_until_complete\u001b[39m\u001b[34m(self, future)\u001b[39m\n\u001b[32m    684\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m future.done():\n\u001b[32m    685\u001b[39m     \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\u001b[33m'\u001b[39m\u001b[33mEvent loop stopped before Future completed.\u001b[39m\u001b[33m'\u001b[39m)\n\u001b[32m--> \u001b[39m\u001b[32m687\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[30;43mfuture\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mresult\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/router.py:6257\u001b[39m, in \u001b[36mRouter.async_function_with_fallbacks\u001b[39m\u001b[34m(self, *args, **kwargs)\u001b[39m\n\u001b[32m   6253\u001b[39m                 attempted_fallbacks=\u001b[32m0\u001b[39m,\n\u001b[32m   6254\u001b[39m             )\n\u001b[32m   6255\u001b[39m             \u001b[38;5;28;01mreturn\u001b[39;00m response\n\u001b[32m   6256\u001b[39m         \u001b[38;5;28;01mexcept\u001b[39;00m Exception \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m-> \u001b[39m\u001b[32m6257\u001b[39m             return await self.async_function_with_fallbacks_common_utils(\n\u001b[32m   6258\u001b[39m                 e,\n\u001b[32m   6259\u001b[39m                 disable_fallbacks,\n\u001b[32m   6260\u001b[39m                 fallbacks,\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/router.py:6219\u001b[39m, in \u001b[36mRouter.async_function_with_fallbacks_common_utils\u001b[39m\u001b[34m(self, e, disable_fallbacks, fallbacks, context_window_fallbacks, content_policy_fallbacks, model_group, args, kwargs, include_fallback_errors)\u001b[39m\n\u001b[32m   6215\u001b[39m                 original_exception.message += (  # type: ignore\n\u001b[32m   6216\u001b[39m                     \u001b[33m\"\\nError doing the fallback: {}\"\u001b[39m.format(fallback_failure_exception_str)\n\u001b[32m   6217\u001b[39m                 )\n\u001b[32m   6218\u001b[39m \n\u001b[32m-> \u001b[39m\u001b[32m6219\u001b[39m         \u001b[38;5;28;01mraise\u001b[39;00m original_exception\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/router.py:6257\u001b[39m, in \u001b[36mRouter.async_function_with_fallbacks\u001b[39m\u001b[34m(self, *args, **kwargs)\u001b[39m\n\u001b[32m   6253\u001b[39m                 attempted_fallbacks=\u001b[32m0\u001b[39m,\n\u001b[32m   6254\u001b[39m             )\n\u001b[32m   6255\u001b[39m             \u001b[38;5;28;01mreturn\u001b[39;00m response\n\u001b[32m   6256\u001b[39m         \u001b[38;5;28;01mexcept\u001b[39;00m Exception \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m-> \u001b[39m\u001b[32m6257\u001b[39m             return await self.async_function_with_fallbacks_common_utils(\n\u001b[32m   6258\u001b[39m                 e,\n\u001b[32m   6259\u001b[39m                 disable_fallbacks,\n\u001b[32m   6260\u001b[39m                 fallbacks,\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/router.py:6392\u001b[39m, in \u001b[36mRouter.async_function_with_retries\u001b[39m\u001b[34m(self, *args, **kwargs)\u001b[39m\n\u001b[32m   6388\u001b[39m \n\u001b[32m   6389\u001b[39m             \u001b[38;5;66;03m# raises an exception if this error should not be retries\u001b[39;00m\n\u001b[32m   6390\u001b[39m             \u001b[38;5;66;03m# Skip this check if retry policy applies (retry policy takes precedence)\u001b[39;00m\n\u001b[32m   6391\u001b[39m             \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28;01mnot\u001b[39;00m _retry_policy_applies:\n\u001b[32m-> \u001b[39m\u001b[32m6392\u001b[39m                 self.should_retry_this_error(\n\u001b[32m   6393\u001b[39m                     error=e,\n\u001b[32m   6394\u001b[39m                     healthy_deployments=_healthy_deployments,\n\u001b[32m   6395\u001b[39m                     all_deployments=_all_deployments,\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/router.py:6571\u001b[39m, in \u001b[36mRouter.should_retry_this_error\u001b[39m\u001b[34m(self, error, healthy_deployments, all_deployments, context_window_fallbacks, content_policy_fallbacks, regular_fallbacks)\u001b[39m\n\u001b[32m   6567\u001b[39m         status_code = getattr(error, \u001b[33m\"status_code\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[32m   6568\u001b[39m         \u001b[38;5;28;01mif\u001b[39;00m status_code \u001b[38;5;28;01mis\u001b[39;00m \u001b[38;5;28;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01mand\u001b[39;00m \u001b[38;5;28;01mnot\u001b[39;00m litellm._should_retry(status_code):\n\u001b[32m   6569\u001b[39m             \u001b[38;5;66;03m# 401/403 are special cases - allow retry if multiple deployments exist (handled below)\u001b[39;00m\n\u001b[32m   6570\u001b[39m             \u001b[38;5;28;01mif\u001b[39;00m status_code \u001b[38;5;28;01mnot\u001b[39;00m \u001b[38;5;28;01min\u001b[39;00m (\u001b[32m401\u001b[39m, \u001b[32m403\u001b[39m):\n\u001b[32m-> \u001b[39m\u001b[32m6571\u001b[39m                 \u001b[38;5;28;01mraise\u001b[39;00m error\n\u001b[32m   6572\u001b[39m \n\u001b[32m   6573\u001b[39m         \u001b[38;5;28;01mif\u001b[39;00m isinstance(error, litellm.NotFoundError):\n\u001b[32m   6574\u001b[39m             \u001b[38;5;28;01mraise\u001b[39;00m error\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/router.py:6392\u001b[39m, in \u001b[36mRouter.async_function_with_retries\u001b[39m\u001b[34m(self, *args, **kwargs)\u001b[39m\n\u001b[32m   6388\u001b[39m \n\u001b[32m   6389\u001b[39m             \u001b[38;5;66;03m# raises an exception if this error should not be retries\u001b[39;00m\n\u001b[32m   6390\u001b[39m             \u001b[38;5;66;03m# Skip this check if retry policy applies (retry policy takes precedence)\u001b[39;00m\n\u001b[32m   6391\u001b[39m             \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28;01mnot\u001b[39;00m _retry_policy_applies:\n\u001b[32m-> \u001b[39m\u001b[32m6392\u001b[39m                 self.should_retry_this_error(\n\u001b[32m   6393\u001b[39m                     error=e,\n\u001b[32m   6394\u001b[39m                     healthy_deployments=_healthy_deployments,\n\u001b[32m   6395\u001b[39m                     all_deployments=_all_deployments,\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/router.py:6501\u001b[39m, in \u001b[36mRouter.make_call\u001b[39m\u001b[34m(self, original_function, *args, **kwargs)\u001b[39m\n\u001b[32m   6497\u001b[39m         \"\"\"\n\u001b[32m   6498\u001b[39m         Handler \u001b[38;5;28;01mfor\u001b[39;00m making a call to the .completion()/.embeddings()/etc. functions.\n\u001b[32m   6499\u001b[39m         \"\"\"\n\u001b[32m   6500\u001b[39m         model_group = kwargs.get(\u001b[33m\"model\"\u001b[39m)\n\u001b[32m-> \u001b[39m\u001b[32m6501\u001b[39m         response = original_function(*args, **kwargs)\n\u001b[32m   6502\u001b[39m         \u001b[38;5;28;01mif\u001b[39;00m coroutine_checker.is_async_callable(response) \u001b[38;5;28;01mor\u001b[39;00m inspect.isawaitable(response):\n\u001b[32m   6503\u001b[39m             response = \u001b[38;5;28;01mawait\u001b[39;00m response\n\u001b[32m   6504\u001b[39m         \u001b[38;5;66;03m## PROCESS RESPONSE HEADERS\u001b[39;00m\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/router.py:1706\u001b[39m, in \u001b[36mRouter._completion\u001b[39m\u001b[34m(self, model, messages, **kwargs)\u001b[39m\n\u001b[32m   1702\u001b[39m             \u001b[38;5;66;03m# Set per-deployment num_retries on exception for retry logic\u001b[39;00m\n\u001b[32m   1703\u001b[39m             \u001b[38;5;28;01mif\u001b[39;00m deployment \u001b[38;5;28;01mis\u001b[39;00m \u001b[38;5;28;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m   1704\u001b[39m                 self._set_deployment_num_retries_on_exception(e, deployment)\n\u001b[32m   1705\u001b[39m                 self._set_failed_deployment_id_on_exception(e, deployment)\n\u001b[32m-> \u001b[39m\u001b[32m1706\u001b[39m             \u001b[38;5;28;01mraise\u001b[39;00m e\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/router.py:1706\u001b[39m, in \u001b[36mRouter._completion\u001b[39m\u001b[34m(self, model, messages, **kwargs)\u001b[39m\n\u001b[32m   1702\u001b[39m             \u001b[38;5;66;03m# Set per-deployment num_retries on exception for retry logic\u001b[39;00m\n\u001b[32m   1703\u001b[39m             \u001b[38;5;28;01mif\u001b[39;00m deployment \u001b[38;5;28;01mis\u001b[39;00m \u001b[38;5;28;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m   1704\u001b[39m                 self._set_deployment_num_retries_on_exception(e, deployment)\n\u001b[32m   1705\u001b[39m                 self._set_failed_deployment_id_on_exception(e, deployment)\n\u001b[32m-> \u001b[39m\u001b[32m1706\u001b[39m             \u001b[38;5;28;01mraise\u001b[39;00m e\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/utils.py:1577\u001b[39m, in \u001b[36mclient.<locals>.wrapper\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m   1573\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m logging_obj:\n\u001b[32m   1574\u001b[39m     logging_obj.failure_handler(\n\u001b[32m   1575\u001b[39m         e, traceback_exception, start_time, end_time\n\u001b[32m   1576\u001b[39m     )  \u001b[38;5;66;03m# DO NOT MAKE THREADED - router retry fallback relies on this!\u001b[39;00m\n\u001b[32m-> \u001b[39m\u001b[32m1577\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m e\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/utils.py:1425\u001b[39m, in \u001b[36mclient.<locals>.wrapper\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m   1423\u001b[39m         print_verbose(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mError while checking max token limit: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mstr\u001b[39m(e)\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m)\n\u001b[32m   1424\u001b[39m \u001b[38;5;66;03m# MODEL CALL\u001b[39;00m\n\u001b[32m-> \u001b[39m\u001b[32m1425\u001b[39m result = \u001b[30;43moriginal_function\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43margs\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43mkwargs\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m   1426\u001b[39m end_time = datetime.datetime.now()\n\u001b[32m   1427\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m _is_streaming_request(\n\u001b[32m   1428\u001b[39m     kwargs=kwargs,\n\u001b[32m   1429\u001b[39m     call_type=call_type,\n\u001b[32m   1430\u001b[39m ):\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/main.py:5607\u001b[39m, in \u001b[36mcompletion\u001b[39m\u001b[34m(model, messages, timeout, temperature, top_p, n, stream, stream_options, stop, max_completion_tokens, max_tokens, modalities, prediction, audio, presence_penalty, frequency_penalty, logit_bias, user, reasoning_effort, verbosity, response_format, seed, tools, tool_choice, logprobs, top_logprobs, parallel_tool_calls, web_search_options, include_server_side_tool_invocations, deployment_id, extra_headers, safety_identifier, service_tier, functions, function_call, base_url, api_version, api_key, model_list, thinking, shared_session, enable_json_schema_validation, **kwargs)\u001b[39m\n\u001b[32m   5604\u001b[39m     \u001b[38;5;28;01mreturn\u001b[39;00m response\n\u001b[32m   5605\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m   5606\u001b[39m     \u001b[38;5;66;03m## Map to OpenAI Exception\u001b[39;00m\n\u001b[32m-> \u001b[39m\u001b[32m5607\u001b[39m     \u001b[38;5;28;01mraise\u001b[39;00m \u001b[30;43mexception_type\u001b[39;49m\u001b[30;43m(\u001b[39;49m\n\u001b[32m   5608\u001b[39m \u001b[30;43m        \u001b[39;49m\u001b[30;43mmodel\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mmodel\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   5609\u001b[39m \u001b[30;43m        \u001b[39;49m\u001b[30;43mcustom_llm_provider\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mcustom_llm_provider\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   5610\u001b[39m \u001b[30;43m        \u001b[39;49m\u001b[30;43moriginal_exception\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43me\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   5611\u001b[39m \u001b[30;43m        \u001b[39;49m\u001b[30;43mcompletion_kwargs\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43margs\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   5612\u001b[39m \u001b[30;43m        \u001b[39;49m\u001b[30;43mextra_kwargs\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mkwargs\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   5613\u001b[39m \u001b[30;43m    \u001b[39;49m\u001b[30;43m)\u001b[39;49m\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/litellm_core_utils/exception_mapping_utils.py:2499\u001b[39m, in \u001b[36mexception_type\u001b[39m\u001b[34m(model, original_exception, custom_llm_provider, completion_kwargs, extra_kwargs)\u001b[39m\n\u001b[32m   2497\u001b[39m     \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(e, error_type):\n\u001b[32m   2498\u001b[39m         \u001b[38;5;28msetattr\u001b[39m(e, \u001b[33m\"\u001b[39m\u001b[33mlitellm_response_headers\u001b[39m\u001b[33m\"\u001b[39m, litellm_response_headers)\n\u001b[32m-> \u001b[39m\u001b[32m2499\u001b[39m         \u001b[38;5;28;01mraise\u001b[39;00m e  \u001b[38;5;66;03m# it's already mapped\u001b[39;00m\n\u001b[32m   2500\u001b[39m raised_exc = APIConnectionError(\n\u001b[32m   2501\u001b[39m     message=\u001b[33m\"\u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[33m\"\u001b[39m.format(\n\u001b[32m   2502\u001b[39m         original_exception,\n\u001b[32m   (...)\u001b[39m\u001b[32m   2506\u001b[39m     model=\u001b[33m\"\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m   2507\u001b[39m )\n\u001b[32m   2508\u001b[39m \u001b[38;5;28msetattr\u001b[39m(raised_exc, \u001b[33m\"\u001b[39m\u001b[33mlitellm_response_headers\u001b[39m\u001b[33m\"\u001b[39m, litellm_response_headers)\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/litellm_core_utils/exception_mapping_utils.py:2265\u001b[39m, in \u001b[36mexception_type\u001b[39m\u001b[34m(model, original_exception, custom_llm_provider, completion_kwargs, extra_kwargs)\u001b[39m\n\u001b[32m   2252\u001b[39m     extract_and_raise_litellm_exception(\n\u001b[32m   2253\u001b[39m         response=\u001b[38;5;28mgetattr\u001b[39m(original_exception, \u001b[33m\"\u001b[39m\u001b[33mresponse\u001b[39m\u001b[33m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m),\n\u001b[32m   2254\u001b[39m         error_str=error_str,\n\u001b[32m   2255\u001b[39m         model=model,\n\u001b[32m   2256\u001b[39m         custom_llm_provider=custom_llm_provider,\n\u001b[32m   2257\u001b[39m     )\n\u001b[32m   2258\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m (\n\u001b[32m   2259\u001b[39m     custom_llm_provider == \u001b[33m\"\u001b[39m\u001b[33mopenai\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m   2260\u001b[39m     \u001b[38;5;129;01mor\u001b[39;00m custom_llm_provider == \u001b[33m\"\u001b[39m\u001b[33mtext-completion-openai\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m   (...)\u001b[39m\u001b[32m   2263\u001b[39m     \u001b[38;5;129;01mor\u001b[39;00m custom_llm_provider == \u001b[33m\"\u001b[39m\u001b[33mmistral\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m   2264\u001b[39m ):\n\u001b[32m-> \u001b[39m\u001b[32m2265\u001b[39m     \u001b[30;43m_map_openai_exception\u001b[39;49m\u001b[30;43m(\u001b[39;49m\n\u001b[32m   2266\u001b[39m \u001b[30;43m        \u001b[39;49m\u001b[30;43mmodel\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mmodel\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   2267\u001b[39m \u001b[30;43m        \u001b[39;49m\u001b[30;43moriginal_exception\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mmappable_exception\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   2268\u001b[39m \u001b[30;43m        \u001b[39;49m\u001b[30;43mcustom_llm_provider\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mcustom_llm_provider\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   2269\u001b[39m \u001b[30;43m        \u001b[39;49m\u001b[30;43merror_str\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43merror_str\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   2270\u001b[39m \u001b[30;43m        \u001b[39;49m\u001b[30;43mexception_type\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mexception_type\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   2271\u001b[39m \u001b[30;43m        \u001b[39;49m\u001b[30;43mexception_provider\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mexception_provider\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   2272\u001b[39m \u001b[30;43m        \u001b[39;49m\u001b[30;43mextra_information\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mextra_information\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m   2273\u001b[39m \u001b[30;43m    \u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m   2274\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m custom_llm_provider == \u001b[33m\"\u001b[39m\u001b[33manthropic\u001b[39m\u001b[33m\"\u001b[39m \u001b[38;5;129;01mor\u001b[39;00m custom_llm_provider == \u001b[33m\"\u001b[39m\u001b[33manthropic_text\u001b[39m\u001b[33m\"\u001b[39m:  \u001b[38;5;66;03m# one of the anthropics\u001b[39;00m\n\u001b[32m   2275\u001b[39m     _map_anthropic_exception(\n\u001b[32m   2276\u001b[39m         model=model,\n\u001b[32m   2277\u001b[39m         original_exception=mappable_exception,\n\u001b[32m   (...)\u001b[39m\u001b[32m   2282\u001b[39m         extra_information=extra_information,\n\u001b[32m   2283\u001b[39m     )\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/AI-Practice/DataTalks/llm-zoomcamp-2026/first-aid-qa-rag-assistant/.venv/lib/python3.12/site-packages/litellm/litellm_core_utils/exception_mapping_utils.py:422\u001b[39m, in \u001b[36m_map_openai_exception\u001b[39m\u001b[34m(model, original_exception, custom_llm_provider, error_str, exception_type, exception_provider, extra_information)\u001b[39m\n\u001b[32m    415\u001b[39m     \u001b[38;5;28;01mraise\u001b[39;00m Timeout(\n\u001b[32m    416\u001b[39m         message=\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mTimeout Error: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mexception_provider\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m - \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mmessage\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m,\n\u001b[32m    417\u001b[39m         model=model,\n\u001b[32m    418\u001b[39m         llm_provider=custom_llm_provider,\n\u001b[32m    419\u001b[39m         litellm_debug_info=extra_information,\n\u001b[32m    420\u001b[39m     )\n\u001b[32m    421\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m original_exception.status_code == \u001b[32m422\u001b[39m:\n\u001b[32m--> \u001b[39m\u001b[32m422\u001b[39m     \u001b[38;5;28;01mraise\u001b[39;00m BadRequestError(\n\u001b[32m    423\u001b[39m         message=\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mexception_provider\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m - \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mmessage\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m,\n\u001b[32m    424\u001b[39m         model=model,\n\u001b[32m    425\u001b[39m         llm_provider=custom_llm_provider,\n\u001b[32m    426\u001b[39m         response=\u001b[38;5;28mgetattr\u001b[39m(original_exception, \u001b[33m\"\u001b[39m\u001b[33mresponse\u001b[39m\u001b[33m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m),\n\u001b[32m    427\u001b[39m         litellm_debug_info=extra_information,\n\u001b[32m    428\u001b[39m         body=\u001b[38;5;28mgetattr\u001b[39m(original_exception, \u001b[33m\"\u001b[39m\u001b[33mbody\u001b[39m\u001b[33m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m),\n\u001b[32m    429\u001b[39m     )\n\u001b[32m    430\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m original_exception.status_code == \u001b[32m429\u001b[39m:\n\u001b[32m    431\u001b[39m     \u001b[38;5;28;01mraise\u001b[39;00m RateLimitError(\n\u001b[32m    432\u001b[39m         message=\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mRateLimitError: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mexception_provider\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m - \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mmessage\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m,\n\u001b[32m    433\u001b[39m         model=model,\n\u001b[32m   (...)\u001b[39m\u001b[32m    436\u001b[39m         litellm_debug_info=extra_information,\n\u001b[32m    437\u001b[39m     )\n",
      "\u001b[31mBadRequestError\u001b[39m: litellm.BadRequestError: MistralException - {\"detail\":[{\"type\":\"literal_error\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"WebSearchTool\",\"type\"],\"msg\":\"Input should be <ConversationToolTypes.Websearch: 'web_search'>\",\"input\":\"function\",\"ctx\":{\"expected\":\"<ConversationToolTypes.Websearch: 'web_search'>\"}},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"WebSearchTool\",\"name\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"search\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"WebSearchTool\",\"description\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"No description provided.\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"WebSearchTool\",\"parameters\"],\"msg\":\"Extra inputs are not permitted\",\"input\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}},{\"type\":\"literal_error\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"WebSearchPremiumTool\",\"type\"],\"msg\":\"Input should be <ConversationToolTypes.WebsearchPremium: 'web_search_premium'>\",\"input\":\"function\",\"ctx\":{\"expected\":\"<ConversationToolTypes.WebsearchPremium: 'web_search_premium'>\"}},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"WebSearchPremiumTool\",\"name\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"search\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"WebSearchPremiumTool\",\"description\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"No description provided.\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"WebSearchPremiumTool\",\"parameters\"],\"msg\":\"Extra inputs are not permitted\",\"input\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}},{\"type\":\"literal_error\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"CodeInterpreterTool\",\"type\"],\"msg\":\"Input should be <ConversationToolTypes.CodeInterpreter: 'code_interpreter'>\",\"input\":\"function\",\"ctx\":{\"expected\":\"<ConversationToolTypes.CodeInterpreter: 'code_interpreter'>\"}},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"CodeInterpreterTool\",\"name\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"search\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"CodeInterpreterTool\",\"description\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"No description provided.\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"CodeInterpreterTool\",\"parameters\"],\"msg\":\"Extra inputs are not permitted\",\"input\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}},{\"type\":\"literal_error\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"ImageGenerationTool\",\"type\"],\"msg\":\"Input should be <ConversationToolTypes.ImageGeneration: 'image_generation'>\",\"input\":\"function\",\"ctx\":{\"expected\":\"<ConversationToolTypes.ImageGeneration: 'image_generation'>\"}},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"ImageGenerationTool\",\"name\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"search\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"ImageGenerationTool\",\"description\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"No description provided.\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"ImageGenerationTool\",\"parameters\"],\"msg\":\"Extra inputs are not permitted\",\"input\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}},{\"type\":\"literal_error\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"DocumentLibraryTool\",\"type\"],\"msg\":\"Input should be <ConversationToolTypes.DocumentLibrary: 'document_library'>\",\"input\":\"function\",\"ctx\":{\"expected\":\"<ConversationToolTypes.DocumentLibrary: 'document_library'>\"}},{\"type\":\"missing\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"DocumentLibraryTool\",\"library_ids\"],\"msg\":\"Field required\",\"input\":{\"type\":\"function\",\"name\":\"search\",\"description\":\"No description provided.\",\"parameters\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}}},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"DocumentLibraryTool\",\"name\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"search\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"DocumentLibraryTool\",\"description\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"No description provided.\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"DocumentLibraryTool\",\"parameters\"],\"msg\":\"Extra inputs are not permitted\",\"input\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}},{\"type\":\"literal_error\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"CustomConnector\",\"type\"],\"msg\":\"Input should be <ConversationToolTypes.Connector: 'connector'>\",\"input\":\"function\",\"ctx\":{\"expected\":\"<ConversationToolTypes.Connector: 'connector'>\"}},{\"type\":\"missing\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"CustomConnector\",\"connector_id\"],\"msg\":\"Field required\",\"input\":{\"type\":\"function\",\"name\":\"search\",\"description\":\"No description provided.\",\"parameters\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}}},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"CustomConnector\",\"name\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"search\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"CustomConnector\",\"description\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"No description provided.\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"CustomConnector\",\"parameters\"],\"msg\":\"Extra inputs are not permitted\",\"input\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}},{\"type\":\"missing\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"Tool\",\"function\"],\"msg\":\"Field required\",\"input\":{\"type\":\"function\",\"name\":\"search\",\"description\":\"No description provided.\",\"parameters\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}}},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"Tool\",\"name\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"search\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"Tool\",\"description\"],\"msg\":\"Extra inputs are not permitted\",\"input\":\"No description provided.\"},{\"type\":\"extra_forbidden\",\"loc\":[\"body\",\"tools\",\"list[union[WebSearchTool,WebSearchPremiumTool,CodeInterpreterTool,ImageGenerationTool,DocumentLibraryTool,CustomConnector,Tool]]\",0,\"Tool\",\"parameters\"],\"msg\":\"Extra inputs are not permitted\",\"input\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}},{\"type\":\"string_type\",\"loc\":[\"body\",\"tools\",\"list[str]\",0],\"msg\":\"Input should be a valid string\",\"input\":{\"type\":\"function\",\"name\":\"search\",\"description\":\"No description provided.\",\"parameters\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"query parameter\"},\"num_results\":{\"type\":\"string\",\"description\":\"num_results parameter\"}},\"required\":[\"query\"],\"additionalProperties\":false}}}]}. Received Model Group=ministral-3b-2512\nAvailable Model Group Fallbacks=None"
     ]
    }
   ],
   "source": [
    "rec = ground_truth[0]\n",
    "\n",
    "result = runner.loop(prompt=rec[\"question\"])"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "first-aid-qa-rag-assistant (3.12.7.final.0)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}