From 0a0ba5f473c46101ddfbf386a8860fee53a7e2f3 Mon Sep 17 00:00:00 2001 From: Ramon Navarro Bosch Date: Wed, 8 Jul 2026 09:21:21 +0200 Subject: [PATCH 1/2] function schema init --- agents/nucliadb/src/hyperforge_nucliadb/driver.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/agents/nucliadb/src/hyperforge_nucliadb/driver.py b/agents/nucliadb/src/hyperforge_nucliadb/driver.py index c170035..e245f77 100644 --- a/agents/nucliadb/src/hyperforge_nucliadb/driver.py +++ b/agents/nucliadb/src/hyperforge_nucliadb/driver.py @@ -1,7 +1,7 @@ import asyncio from asyncio import gather from functools import reduce -from typing import Dict, List, Optional +from typing import Dict, List, Optional, Union import httpx from hyperforge.configure import driver @@ -347,7 +347,7 @@ async def catalog_search_raw(self, q: CatalogRequest) -> CatalogResponse: return await self.driver.catalog(content=q, kbid=self.config.kbid) async def get_resource_by_id( - self, rid: str, query_params: Optional[Dict[str, str]] = None + self, rid: str, query_params: Optional[Dict[str, Union[str, List[str]]]] = None ) -> Optional[Resource]: return await self.driver.get_resource_by_id( kbid=self.config.kbid, rid=rid, query_params=query_params From 4b3c7b1e460d3810b1c8ee6e2c9738c31727d908 Mon Sep 17 00:00:00 2001 From: Ramon Navarro Bosch Date: Wed, 8 Jul 2026 09:29:30 +0200 Subject: [PATCH 2/2] Fix lint and health check disabled on testing --- agents/mcp/src/hyperforge_mcp/http.py | 20 +++++++++---------- agents/mcp/tests/test_mcp_oauth.py | 7 +++---- hyperforge/src/hyperforge/api/v1/oauth.py | 2 +- hyperforge/src/hyperforge/broker/redis.py | 4 +++- hyperforge/src/hyperforge/server/sandbox.py | 2 +- hyperforge/src/hyperforge/server/session.py | 2 +- hyperforge/src/hyperforge/server/settings.py | 2 ++ .../tests/server/test_session_manager.py | 1 - .../unit/arag/test_mcp_oauth_callback.py | 6 ++---- uv.lock | 2 ++ 10 files changed, 25 insertions(+), 23 deletions(-) diff --git a/agents/mcp/src/hyperforge_mcp/http.py b/agents/mcp/src/hyperforge_mcp/http.py index 882d796..af8cef4 100644 --- a/agents/mcp/src/hyperforge_mcp/http.py +++ b/agents/mcp/src/hyperforge_mcp/http.py @@ -13,6 +13,16 @@ import httpx from cryptography.fernet import Fernet from httpx import Auth, Timeout +from hyperforge.configure import driver +from hyperforge.driver import Driver +from hyperforge.interaction import ( + Feedback, + OAuthAuthenticateURL, + OAuthFeedbackReturnSchema, + Provider, +) +from hyperforge.memory import QuestionMemory +from hyperforge.utils.http import SafeTransport from mcp.client.auth import OAuthClientProvider, PKCEParameters, TokenStorage from mcp.client.auth.exceptions import OAuthFlowError from mcp.client.streamable_http import streamable_http_client @@ -25,16 +35,6 @@ from pydantic import AnyUrl, BaseModel from hyperforge import logger -from hyperforge.configure import driver -from hyperforge.driver import Driver -from hyperforge.interaction import ( - Feedback, - OAuthAuthenticateURL, - OAuthFeedbackReturnSchema, - Provider, -) -from hyperforge.memory import QuestionMemory -from hyperforge.utils.http import SafeTransport from hyperforge_mcp.config_driver import MCPHTTPDriverConfig, MCPHTTPInnerConfig # --------------------------------------------------------------------------- diff --git a/agents/mcp/tests/test_mcp_oauth.py b/agents/mcp/tests/test_mcp_oauth.py index 4d4b699..274dac1 100644 --- a/agents/mcp/tests/test_mcp_oauth.py +++ b/agents/mcp/tests/test_mcp_oauth.py @@ -7,10 +7,6 @@ import httpx import pytest -from mcp.client.auth import PKCEParameters -from mcp.shared.auth import OAuthClientInformationFull, OAuthClientMetadata -from pydantic import AnyUrl - from hyperforge_mcp.http import ( _MCP_OAUTH_SINGLE_FLIGHT_LOCKS, MCPOAuthRoutingParams, @@ -18,6 +14,9 @@ _RoutedOAuthClientProvider, handle_callback, ) +from mcp.client.auth import PKCEParameters +from mcp.shared.auth import OAuthClientInformationFull, OAuthClientMetadata +from pydantic import AnyUrl def _make_provider(**kwargs) -> _RoutedOAuthClientProvider: diff --git a/hyperforge/src/hyperforge/api/v1/oauth.py b/hyperforge/src/hyperforge/api/v1/oauth.py index 5b44a64..3e5bb83 100644 --- a/hyperforge/src/hyperforge/api/v1/oauth.py +++ b/hyperforge/src/hyperforge/api/v1/oauth.py @@ -3,13 +3,13 @@ from cryptography.fernet import InvalidToken from fastapi import Query +from hyperforge_mcp.http import _fingerprint, decrypt_mcp_oauth_state from starlette.requests import Request from starlette.responses import HTMLResponse from hyperforge.api.settings import Settings from hyperforge.api.v1.router import router from hyperforge.api.v1.utils import tracer -from hyperforge_mcp.http import _fingerprint, decrypt_mcp_oauth_state logger = logging.getLogger(__name__) diff --git a/hyperforge/src/hyperforge/broker/redis.py b/hyperforge/src/hyperforge/broker/redis.py index 0c74cd2..32aa9c5 100644 --- a/hyperforge/src/hyperforge/broker/redis.py +++ b/hyperforge/src/hyperforge/broker/redis.py @@ -99,7 +99,9 @@ async def subscribe_activations( logger.warning("Consumer group lost, re-creating...") await self._ensure_consumer_group() else: - logger.exception("Error while subscribing to activations, retrying...") + logger.exception( + "Error while subscribing to activations, retrying..." + ) await asyncio.sleep(1) except Exception: logger.exception("Error while subscribing to activations, retrying...") diff --git a/hyperforge/src/hyperforge/server/sandbox.py b/hyperforge/src/hyperforge/server/sandbox.py index a4d5b35..d9fd9ad 100644 --- a/hyperforge/src/hyperforge/server/sandbox.py +++ b/hyperforge/src/hyperforge/server/sandbox.py @@ -2,12 +2,12 @@ from importlib.metadata import version import sentry_sdk +from hyperforge_restricted import sandbox from nucliadb_telemetry.fastapi import application_metrics from nucliadb_telemetry.logs import setup_logging from nucliadb_telemetry.settings import LogLevel, LogSettings from sentry_sdk.integrations.excepthook import ExcepthookIntegration -from hyperforge_restricted import sandbox from hyperforge.server.settings import Settings diff --git a/hyperforge/src/hyperforge/server/session.py b/hyperforge/src/hyperforge/server/session.py index e4a1e2f..e9d3155 100644 --- a/hyperforge/src/hyperforge/server/session.py +++ b/hyperforge/src/hyperforge/server/session.py @@ -111,7 +111,7 @@ async def initialize(self, health_check: bool = True) -> None: logger.error(f"Module {load_module} could not be loaded") self.activation_task = asyncio.create_task(self.activation_listener()) - if health_check: + if health_check and self.settings.health_check_enabled: self.server = await start_health_check() async def finalize(self): diff --git a/hyperforge/src/hyperforge/server/settings.py b/hyperforge/src/hyperforge/server/settings.py index e17454b..7fd57de 100644 --- a/hyperforge/src/hyperforge/server/settings.py +++ b/hyperforge/src/hyperforge/server/settings.py @@ -45,3 +45,5 @@ class Settings(BaseSettings): # the kbid for internal NUA calls from the account_id request header # instead. standalone: bool = False + + health_check_enabled: bool = True diff --git a/hyperforge/tests/server/test_session_manager.py b/hyperforge/tests/server/test_session_manager.py index 8ab6e26..0027dad 100644 --- a/hyperforge/tests/server/test_session_manager.py +++ b/hyperforge/tests/server/test_session_manager.py @@ -2,7 +2,6 @@ from unittest.mock import AsyncMock, MagicMock, patch import pytest - from hyperforge.pubsub import StartInteraction from hyperforge.server.session import SessionManager diff --git a/hyperforge/tests/unit/arag/test_mcp_oauth_callback.py b/hyperforge/tests/unit/arag/test_mcp_oauth_callback.py index cf97972..568e0fb 100644 --- a/hyperforge/tests/unit/arag/test_mcp_oauth_callback.py +++ b/hyperforge/tests/unit/arag/test_mcp_oauth_callback.py @@ -3,16 +3,15 @@ from unittest.mock import AsyncMock from urllib.parse import parse_qs +import hyperforge_mcp.http as http_module import pytest from cryptography.fernet import Fernet -from starlette.testclient import TestClient - -import hyperforge_mcp.http as http_module from hyperforge_mcp.http import ( MCPOAuthRoutingParams, decrypt_mcp_oauth_state, encrypt_mcp_oauth_state, ) +from starlette.testclient import TestClient # --------------------------------------------------------------------------- # Test Fernet key - injected via env var so EncryptionSettings picks it up. @@ -47,7 +46,6 @@ def _inject_key(monkeypatch): def _make_app(): """Return a minimal FastAPI app that mounts only the oauth router.""" from fastapi import FastAPI - from hyperforge.api.settings import Settings from hyperforge.api.v1.router import router diff --git a/uv.lock b/uv.lock index b24cfb1..845a65d 100644 --- a/uv.lock +++ b/uv.lock @@ -1251,6 +1251,7 @@ dependencies = [ { name = "databases", extra = ["asyncpg"] }, { name = "fastapi" }, { name = "httpx" }, + { name = "hyperforge-restricted" }, { name = "jinja2" }, { name = "lru-dict" }, { name = "mcp" }, @@ -1298,6 +1299,7 @@ requires-dist = [ { name = "databases", extras = ["asyncpg"] }, { name = "fastapi" }, { name = "httpx" }, + { name = "hyperforge-restricted", editable = "agents/restricted" }, { name = "jinja2" }, { name = "lru-dict" }, { name = "mcp", specifier = ">=1.26.0" },