Loading ai_agent/app.py +4 −3 Changes for ai_agent/app.py: 4 added lines, 3 removed lines. Original line number Diff line number Diff line import os import logging from dotenv import load_dotenv import os import uvicorn from dotenv import load_dotenv from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from ai_agent.routes.groq import router as groq_router from ai_agent.routes.debug import router as debug_router from ai_agent.routes.groq import router as groq_router load_dotenv() Loading ai_agent/routes/debug.py +1 −0 Changes for ai_agent/routes/debug.py: 1 added line, 0 removed lines. Original line number Diff line number Diff line import io import sys import objgraph # type: ignore[import-untyped] from fastapi import APIRouter from fastapi.responses import PlainTextResponse Loading ai_agent/routes/groq.py +7 −3 Changes for ai_agent/routes/groq.py: 7 added lines, 3 removed lines. Original line number Diff line number Diff line import logging from typing import Annotated from fastapi import APIRouter, Body, Query from fastapi.responses import JSONResponse, StreamingResponse Loading @@ -6,12 +8,14 @@ from ai_agent.memory import RedisShortTermMemory from ai_agent.sub_agents.groq_agent import create_groq_agent from ai_agent.utils import stream_agent_response logger = logging.getLogger(__name__) router = APIRouter() memory_store = RedisShortTermMemory() @router.post("/groq-mcp") async def groq_query(payload: dict | None = Body(default=None)): async def groq_query(payload: Annotated[dict | None, Body()] = None): query = payload.get("query") if payload else None session_id = payload.get("session_id") if payload else None Loading @@ -28,7 +32,7 @@ async def groq_query(payload: dict | None = Body(default=None)): response["session_id"] = session_id return response except Exception as e: logging.error("Error in groq_query", exc_info=True) logger.exception("Error in groq_query") return JSONResponse(status_code=500, content={"error": str(e)}) finally: await agent.close() Loading Loading @@ -64,6 +68,6 @@ async def groq_stream( }, ) except Exception as e: logging.error("Error in groq_stream", exc_info=True) logger.exception("Error in groq_stream") await agent.close() return JSONResponse(status_code=500, content={"error": str(e)}) ai_agent/sub_agents/groq_agent.py +6 −4 Changes for ai_agent/sub_agents/groq_agent.py: 6 added lines, 4 removed lines. Original line number Diff line number Diff line import os import logging import os from dotenv import load_dotenv from ai_agent.prompts import CONVERSATION_MEMORY_PROMPT from langchain_groq import ChatGroq from mcp_use import MCPAgent, MCPClient # type: ignore[import-untyped] from ai_agent.prompts import CONVERSATION_MEMORY_PROMPT load_dotenv() logging.getLogger("mcp_use").setLevel(logging.ERROR) Loading @@ -14,7 +16,7 @@ logger = logging.getLogger(__name__) def require_env(name: str) -> str: value = os.getenv(name) if value is None or not value.strip(): raise EnvironmentError(f"{name} environment variable is not set") raise OSError(f"{name} environment variable is not set") return value.strip() Loading @@ -23,7 +25,7 @@ async def create_groq_agent(): try: mcp_server_url = require_env("MCP_SERVER_URL") groq_api_key = require_env("GROQ_API_KEY") except EnvironmentError as e: except OSError as e: logger.error("Groq agent configuration error: %s", e) raise Loading ai_agent/utils.py +4 −1 Changes for ai_agent/utils.py: 4 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -3,6 +3,8 @@ import json import logging from collections.abc import Awaitable, Callable logger = logging.getLogger(__name__) # --- SSE Helper --- def sse_event(data, event="message", id=None, retry=None): Loading Loading @@ -47,9 +49,10 @@ async def stream_agent_response( await asyncio.sleep(0.01) yield sse_event({"done": True}, event="complete", id=event_id) except Exception as e: logger.exception("Error while streaming agent response") yield sse_event({"error": str(e)}, event="error", id=event_id) finally: await agent.close() logging.info("Agent closed after streaming") logger.info("Agent closed after streaming") return generator Loading
ai_agent/app.py +4 −3 Changes for ai_agent/app.py: 4 added lines, 3 removed lines. Original line number Diff line number Diff line import os import logging from dotenv import load_dotenv import os import uvicorn from dotenv import load_dotenv from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from ai_agent.routes.groq import router as groq_router from ai_agent.routes.debug import router as debug_router from ai_agent.routes.groq import router as groq_router load_dotenv() Loading
ai_agent/routes/debug.py +1 −0 Changes for ai_agent/routes/debug.py: 1 added line, 0 removed lines. Original line number Diff line number Diff line import io import sys import objgraph # type: ignore[import-untyped] from fastapi import APIRouter from fastapi.responses import PlainTextResponse Loading
ai_agent/routes/groq.py +7 −3 Changes for ai_agent/routes/groq.py: 7 added lines, 3 removed lines. Original line number Diff line number Diff line import logging from typing import Annotated from fastapi import APIRouter, Body, Query from fastapi.responses import JSONResponse, StreamingResponse Loading @@ -6,12 +8,14 @@ from ai_agent.memory import RedisShortTermMemory from ai_agent.sub_agents.groq_agent import create_groq_agent from ai_agent.utils import stream_agent_response logger = logging.getLogger(__name__) router = APIRouter() memory_store = RedisShortTermMemory() @router.post("/groq-mcp") async def groq_query(payload: dict | None = Body(default=None)): async def groq_query(payload: Annotated[dict | None, Body()] = None): query = payload.get("query") if payload else None session_id = payload.get("session_id") if payload else None Loading @@ -28,7 +32,7 @@ async def groq_query(payload: dict | None = Body(default=None)): response["session_id"] = session_id return response except Exception as e: logging.error("Error in groq_query", exc_info=True) logger.exception("Error in groq_query") return JSONResponse(status_code=500, content={"error": str(e)}) finally: await agent.close() Loading Loading @@ -64,6 +68,6 @@ async def groq_stream( }, ) except Exception as e: logging.error("Error in groq_stream", exc_info=True) logger.exception("Error in groq_stream") await agent.close() return JSONResponse(status_code=500, content={"error": str(e)})
ai_agent/sub_agents/groq_agent.py +6 −4 Changes for ai_agent/sub_agents/groq_agent.py: 6 added lines, 4 removed lines. Original line number Diff line number Diff line import os import logging import os from dotenv import load_dotenv from ai_agent.prompts import CONVERSATION_MEMORY_PROMPT from langchain_groq import ChatGroq from mcp_use import MCPAgent, MCPClient # type: ignore[import-untyped] from ai_agent.prompts import CONVERSATION_MEMORY_PROMPT load_dotenv() logging.getLogger("mcp_use").setLevel(logging.ERROR) Loading @@ -14,7 +16,7 @@ logger = logging.getLogger(__name__) def require_env(name: str) -> str: value = os.getenv(name) if value is None or not value.strip(): raise EnvironmentError(f"{name} environment variable is not set") raise OSError(f"{name} environment variable is not set") return value.strip() Loading @@ -23,7 +25,7 @@ async def create_groq_agent(): try: mcp_server_url = require_env("MCP_SERVER_URL") groq_api_key = require_env("GROQ_API_KEY") except EnvironmentError as e: except OSError as e: logger.error("Groq agent configuration error: %s", e) raise Loading
ai_agent/utils.py +4 −1 Changes for ai_agent/utils.py: 4 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -3,6 +3,8 @@ import json import logging from collections.abc import Awaitable, Callable logger = logging.getLogger(__name__) # --- SSE Helper --- def sse_event(data, event="message", id=None, retry=None): Loading Loading @@ -47,9 +49,10 @@ async def stream_agent_response( await asyncio.sleep(0.01) yield sse_event({"done": True}, event="complete", id=event_id) except Exception as e: logger.exception("Error while streaming agent response") yield sse_event({"error": str(e)}, event="error", id=event_id) finally: await agent.close() logging.info("Agent closed after streaming") logger.info("Agent closed after streaming") return generator