Loading ai_agent/sub_agents/groq_agent.py +21 −8 Original line number Diff line number Diff line Loading @@ -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 = """ Loading mcp_module/app.py +1 −1 Original line number Diff line number Diff line Loading @@ -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") Loading Loading @@ -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") Loading mcp_module/requirements.txt +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 mcp_module/tools/edge_application.py +24 −3 Original line number Diff line number Diff line Loading @@ -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: """ Loading @@ -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 Loading
ai_agent/sub_agents/groq_agent.py +21 −8 Original line number Diff line number Diff line Loading @@ -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 = """ Loading
mcp_module/app.py +1 −1 Original line number Diff line number Diff line Loading @@ -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") Loading Loading @@ -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") Loading
mcp_module/requirements.txt +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
mcp_module/tools/edge_application.py +24 −3 Original line number Diff line number Diff line Loading @@ -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: """ Loading @@ -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