Commit 25af8831 authored by Kostas Chartsias's avatar Kostas Chartsias
Browse files

error handling and logging enhancements

parent 3795b07a
Loading
Loading
Loading
Loading
+21 −8
Original line number Diff line number Diff line
@@ -7,27 +7,40 @@ from mcp_use import MCPAgent, MCPClient
load_dotenv()
logging.getLogger("mcp_use").setLevel(logging.ERROR)

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")
    return value.strip()

async def create_groq_agent():
    """Create an MCPAgent using Groq backend."""
    MCP_SERVER_URL = os.getenv("MCP_SERVER_URL")
    GROQ_API_KEY = os.getenv("GROQ_API_KEY")
    MODEL_NAME = os.getenv("GROQ_MODEL_NAME", "openai/gpt-oss-20b")
    try:
        mcp_server_url = require_env("MCP_SERVER_URL")
        groq_api_key = require_env("GROQ_API_KEY")
    except EnvironmentError as e:
        logger.error("Groq agent configuration error: %s", e)
        raise

    model_name = os.getenv("GROQ_MODEL_NAME", "openai/gpt-oss-20b").strip() or "openai/gpt-oss-20b"

    client = MCPClient({
        "mcpServers": {"http": {"url": MCP_SERVER_URL}},
        "mcpServers": {"http": {"url": mcp_server_url}},
        "use-oauth2": False,
        "use-oidc": False
    })
    await client.create_session("http")

    llm = ChatGroq(
        model=MODEL_NAME,
        model=model_name,
        temperature=0,
        max_tokens=None,
        reasoning_format="parsed",
        timeout=None,
        timeout=15,
        max_retries=3,
        api_key=GROQ_API_KEY,
        api_key=groq_api_key,
    )

    PROMPT = """
+1 −1
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ from mcp_module.tools.edge_application import get_app_definitions
from mcp_module.tools.user_phone import get_user_phone
from dotenv import load_dotenv
import os
import uvicorn

logging.basicConfig(level=logging.DEBUG, format="%(asctime)s [%(levelname)s] %(message)s")
logger = logging.getLogger("MCP server")
@@ -47,7 +48,6 @@ async def health_check():
app.mount("", mcp_app)

if __name__ == "__main__":
    import uvicorn

    logger.info("Starting MCP Server with FastAPI...")
    host = os.getenv("MCP_HOST", "127.0.0.1")
+1 −2
Original line number Diff line number Diff line
connexion==3.3.0
fastapi==0.129.0
fastmcp==3.0.0rc1
httpx==0.28.1
pydantic==2.12.5
python-dotenv==1.2.1
uvicorn==0.40.0
+24 −3
Original line number Diff line number Diff line
@@ -14,6 +14,8 @@ env_path = root_dir / ".env"
# Load the .env file
load_dotenv(dotenv_path=env_path)
SESSION_SERVICE_URL = os.getenv("OpenOP_ISI_BACKEND")
if not SESSION_SERVICE_URL:
    raise EnvironmentError("OpenOP_ISI_BACKEND environment variable is not set")

async def get_app_definitions() -> dict:
    """
@@ -22,13 +24,32 @@ async def get_app_definitions() -> dict:
    """
    url = f"{SESSION_SERVICE_URL}/apps"
    headers = {"accept": "application/json"}
    logger.debug("Fetching edge application definitions from: %s", url)

    try:
        async with httpx.AsyncClient(trust_env=True) as client:
        response = await client.get(url, headers=headers, follow_redirects=True, timeout=10)
            response = await client.get(url, headers=headers, follow_redirects=True, timeout=15)
            response.raise_for_status()
    except httpx.HTTPError as e:
        logger.error("Failed to fetch edge application definitions: %s", e)
        raise

    try:
        data = response.json()
    except ValueError as e:
        logger.error("Invalid JSON in edge application definitions response: %s", e)
        raise

    logger.debug("Edge application definitions response type: %s", type(data).__name__)

    # Ensure the result is a dict for FastMCP compatibility
    if isinstance(data, list):
        logger.info("Edge application definitions returned as list; wrapping for FastMCP")
        return {"applications": data}
    if not isinstance(data, dict):
        logger.warning(
            "Unexpected edge application definitions response type: %s; returning empty result",
            type(data).__name__,
        )
        return {}
    return data