from __future__ import annotations from app.core.config import get_settings from app.core.llm import build_llm from app.agent.agent import run_optimized_agent from app.tools.search import build_web_search_tool from app.tools.scraper import fetch_url from app.tools.image_tool import analyze_image from app.tools.wikipedia_tool import wikipedia_search from app.tools.arxiv_tool import arxiv_search from app.utils.logger import get_logger logger = get_logger(__name__) def _build_executor( temperature: float, max_results: int, tool_names: list[str] | None = None, model_name: str | None = None, max_iterations: int = 5, compress_chars: int = 1200, tool_output_limit: int = 1500, force_tools: bool = False, ) -> dict: settings = get_settings() available = { "web_search": build_web_search_tool(settings, max_results), "fetch_url": fetch_url, "analyze_image": analyze_image, "wikipedia": wikipedia_search, "arxiv": arxiv_search, } if tool_names: tools = [available[name] for name in tool_names if name in available] else: tools = [available["web_search"], available["fetch_url"], available["analyze_image"]] llm = build_llm(settings, temperature, tools, model_name=model_name) def run_fn(prompt: str, chat_history: str = "") -> tuple[str, list]: return run_optimized_agent( tools=tools, llm=llm, prompt=prompt, chat_history=chat_history, max_iterations=max_iterations, compress_chars=compress_chars, tool_output_limit=tool_output_limit, force_tools=force_tools, ) return { "tools": tools, "llm": llm, "run_fn": run_fn, "max_iterations": max_iterations, "compress_chars": compress_chars, "tool_output_limit": tool_output_limit, } def build_compressed_chat_executor( temperature: float, max_results: int, tool_names: list[str] | None = None, model_name: str | None = None, max_iterations: int = 5, compress_chars: int = 1200, tool_output_limit: int = 1500, force_tools: bool = False, ) -> dict: logger.info("Building chat executor (max_iterations=%d)", max_iterations) return _build_executor(temperature, max_results, tool_names, model_name, max_iterations, compress_chars, tool_output_limit, force_tools) def build_optimized_executor( temperature: float, max_results: int, tool_names: list[str] | None = None, model_name: str | None = None, max_iterations: int = 8, compress_chars: int = 1200, tool_output_limit: int = 1500, force_tools: bool = False, ) -> dict: logger.info("Building optimized executor (max_iterations=%d)", max_iterations) return _build_executor(temperature, max_results, tool_names, model_name, max_iterations, compress_chars, tool_output_limit, force_tools)