From 6d408ca52f09ef1cffc915de7ff0a06fe8b2158f Mon Sep 17 00:00:00 2001 From: "balogh.adam@icloud.com" Date: Sat, 14 Mar 2026 20:29:44 -0400 Subject: [PATCH 01/14] fix mypy --- tee_gateway/__main__.py | 2 -- tee_gateway/definitions.py | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/tee_gateway/__main__.py b/tee_gateway/__main__.py index 99b87c4..314c0e7 100644 --- a/tee_gateway/__main__.py +++ b/tee_gateway/__main__.py @@ -83,8 +83,6 @@ def _shutdown_heartbeat(): atexit.register(_shutdown_heartbeat) -EVM_NETWORK: Network = "eip155:10740" -BASE_TESTNET_NETWORK: Network = "eip155:84532" EVM_PAYMENT_ADDRESS = "0x40eFb45552EDfB2502D90A657a8ab41F03ec460d" FACILITATOR_URL = os.getenv("FACILITATOR_URL", "https://facilitator.memchat.io") diff --git a/tee_gateway/definitions.py b/tee_gateway/definitions.py index 0886abe..43f3158 100644 --- a/tee_gateway/definitions.py +++ b/tee_gateway/definitions.py @@ -14,7 +14,7 @@ # Network IDs (EIP-155 chain identifiers) # --------------------------------------------------------------------------- -# Lavanet EVM — where USDC payments are accepted +# OG EVM — where USDC payments are accepted EVM_NETWORK: str = "eip155:10740" # Base Testnet — where OPG payments are accepted From d7ccd961b4280feda69c6bc49713e08fc4eb7cfd Mon Sep 17 00:00:00 2001 From: "balogh.adam@icloud.com" Date: Sat, 14 Mar 2026 20:33:08 -0400 Subject: [PATCH 02/14] rm redefinition --- Makefile | 7 +++++++ tee_gateway/__main__.py | 8 +++----- tee_gateway/definitions.py | 5 +++++ 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index cc657bb..c66eb92 100644 --- a/Makefile +++ b/Makefile @@ -86,6 +86,12 @@ test-local: # export OPENAI_API_KEY=... ANTHROPIC_API_KEY=... etc. python3 -m tee_gateway +.PHONY: lint +lint: + python3 -m ruff check tee_gateway + python3 -m ruff format --check tee_gateway + python3 -m mypy tee_gateway + .PHONY: mypy mypy: python3 -m mypy tee_gateway @@ -103,6 +109,7 @@ help: @echo " make get-tls-cert - Print the nitriding TLS certificate" @echo "" @echo " make test-local - Run server locally without TEE (development)" + @echo " make lint - Run ruff check, ruff format --check, and mypy" @echo " make mypy - Run mypy type checker on tee_gateway" @echo "" @echo " LLM endpoints (/v1/chat/completions, /v1/completions) require x402" diff --git a/tee_gateway/__main__.py b/tee_gateway/__main__.py index 314c0e7..965fa58 100644 --- a/tee_gateway/__main__.py +++ b/tee_gateway/__main__.py @@ -24,10 +24,11 @@ from x402v2.http.types import RouteConfig from x402v2.mechanisms.evm.exact import ExactEvmServerScheme from x402v2.mechanisms.evm.upto import UptoEvmServerScheme -from x402v2.schemas import AssetAmount, Network +from x402v2.schemas import AssetAmount from x402v2.server import x402ResourceServerSync from x402v2.session import SessionStore import x402v2.http.middleware.flask as x402_flask + from .util import dynamic_session_cost_calculator from .definitions import ( EVM_NETWORK, @@ -38,6 +39,7 @@ CHAT_COMPLETIONS_USDC_AMOUNT, CHAT_COMPLETIONS_OPG_AMOUNT, COMPLETIONS_USDC_AMOUNT, + FACILITATOR_URL, ) # Configure logging @@ -82,10 +84,6 @@ def _shutdown_heartbeat(): atexit.register(_shutdown_heartbeat) - -EVM_PAYMENT_ADDRESS = "0x40eFb45552EDfB2502D90A657a8ab41F03ec460d" -FACILITATOR_URL = os.getenv("FACILITATOR_URL", "https://facilitator.memchat.io") - facilitator = HTTPFacilitatorClientSync(FacilitatorConfig(url=FACILITATOR_URL)) server = x402ResourceServerSync(facilitator) store = SessionStore() diff --git a/tee_gateway/definitions.py b/tee_gateway/definitions.py index 43f3158..d56d0b3 100644 --- a/tee_gateway/definitions.py +++ b/tee_gateway/definitions.py @@ -10,6 +10,11 @@ import os +# --------------------------------------------------------------------------- +# X402 Facilitator +# --------------------------------------------------------------------------- +FACILITATOR_URL = os.getenv("FACILITATOR_URL", "https://facilitator.memchat.io") + # --------------------------------------------------------------------------- # Network IDs (EIP-155 chain identifiers) # --------------------------------------------------------------------------- From fbba788ca5844d42829a14a8165e8a8a62390769 Mon Sep 17 00:00:00 2001 From: "balogh.adam@icloud.com" Date: Sat, 14 Mar 2026 20:34:06 -0400 Subject: [PATCH 03/14] fix lint --- tee_gateway/typing_utils.py | 10 +++++----- tee_gateway/util.py | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tee_gateway/typing_utils.py b/tee_gateway/typing_utils.py index c905b1d..d62e8e7 100644 --- a/tee_gateway/typing_utils.py +++ b/tee_gateway/typing_utils.py @@ -5,15 +5,15 @@ def is_generic(klass): """Determine whether klass is a generic class""" - return type(klass) == typing.GenericMeta + return type(klass) is typing.GenericMeta def is_dict(klass): """Determine whether klass is a Dict""" - return klass.__extra__ == dict + return klass.__extra__ is dict def is_list(klass): """Determine whether klass is a List""" - return klass.__extra__ == list + return klass.__extra__ is list else: @@ -23,8 +23,8 @@ def is_generic(klass): def is_dict(klass): """Determine whether klass is a Dict""" - return klass.__origin__ == dict + return klass.__origin__ is dict def is_list(klass): """Determine whether klass is a List""" - return klass.__origin__ == list + return klass.__origin__ is list diff --git a/tee_gateway/util.py b/tee_gateway/util.py index d6336ce..f810663 100644 --- a/tee_gateway/util.py +++ b/tee_gateway/util.py @@ -23,7 +23,7 @@ def _deserialize(data, klass): if klass in (int, float, str, bool, bytearray): return _deserialize_primitive(data, klass) - elif klass == object: + elif klass is object: return _deserialize_object(data) elif klass == datetime.date: return deserialize_date(data) From dc79e1eaae2ffbda7ae865992a301f659243c046 Mon Sep 17 00:00:00 2001 From: "balogh.adam@icloud.com" Date: Sat, 14 Mar 2026 20:35:34 -0400 Subject: [PATCH 04/14] fix lint --- examples/verify_attestation.py | 3 +-- tests/test_server.py | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/examples/verify_attestation.py b/examples/verify_attestation.py index 2625def..a12f357 100644 --- a/examples/verify_attestation.py +++ b/examples/verify_attestation.py @@ -74,7 +74,7 @@ def get_attestation(url: str, nonce: str) -> str: return None # Return the output of the curl command - if result.stdout == None: + if result.stdout is None: print("Curl command result was None") return result.stdout @@ -197,7 +197,6 @@ def verify_attestation_doc(attestation_string: str) -> None: cert_public_numbers = cert.get_pubkey().to_cryptography_key().public_numbers() x = cert_public_numbers.x y = cert_public_numbers.y - curve = cert_public_numbers.curve x = long_to_bytes(x) y = long_to_bytes(y) diff --git a/tests/test_server.py b/tests/test_server.py index faa77d4..ee85f4c 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -12,6 +12,7 @@ from typing import List, Dict from unittest.mock import patch, MagicMock from dotenv import load_dotenv +from fastapi.testclient import TestClient # Add src/ to path so we can import server sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "src")) @@ -25,8 +26,6 @@ if missing_keys: raise ValueError(f"Missing required API keys in .env: {', '.join(missing_keys)}") -from fastapi.testclient import TestClient - # Mock the TEE key manager registration before importing the app with patch("urllib.request.urlopen"): from server import app From c54efa928c0108b3c0403f2d04d9697a2e42f7e1 Mon Sep 17 00:00:00 2001 From: "balogh.adam@icloud.com" Date: Sat, 14 Mar 2026 20:36:25 -0400 Subject: [PATCH 05/14] fix lint --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index c66eb92..57c2ed3 100644 --- a/Makefile +++ b/Makefile @@ -88,8 +88,8 @@ test-local: .PHONY: lint lint: - python3 -m ruff check tee_gateway - python3 -m ruff format --check tee_gateway + python3 -m ruff check . + python3 -m ruff format --check . python3 -m mypy tee_gateway .PHONY: mypy From e38e7b1c34e4fc698d57caea17b5bc4d703062d3 Mon Sep 17 00:00:00 2001 From: "balogh.adam@icloud.com" Date: Sat, 14 Mar 2026 20:39:49 -0400 Subject: [PATCH 06/14] version --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 139a46f..24422dd 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -25,5 +25,5 @@ jobs: with: python-version: "3.12" cache: pip - - run: pip install -r requirements.txt mypy + - run: pip install -r requirements.txt mypy==1.19.1 - run: mypy tee_gateway From eee592ffc3a3ffac231a78e4c3e810a5deba91be Mon Sep 17 00:00:00 2001 From: "balogh.adam@icloud.com" Date: Sat, 14 Mar 2026 20:47:03 -0400 Subject: [PATCH 07/14] cleanup --- ...v-requirements.txt => dev-requirements.txt | 0 tee_gateway/llm_backend.py | 1 - tee_gateway/util.py | 4 +-- tests/mypy.ini | 30 ------------------- 4 files changed, 2 insertions(+), 33 deletions(-) rename tests/dev-requirements.txt => dev-requirements.txt (100%) delete mode 100644 tests/mypy.ini diff --git a/tests/dev-requirements.txt b/dev-requirements.txt similarity index 100% rename from tests/dev-requirements.txt rename to dev-requirements.txt diff --git a/tee_gateway/llm_backend.py b/tee_gateway/llm_backend.py index 118e42e..488ea1e 100644 --- a/tee_gateway/llm_backend.py +++ b/tee_gateway/llm_backend.py @@ -14,7 +14,6 @@ from functools import lru_cache import httpx - from langchain_core.messages import HumanMessage, SystemMessage, AIMessage, ToolMessage from langchain_google_genai import ChatGoogleGenerativeAI from langchain_openai import ChatOpenAI diff --git a/tee_gateway/util.py b/tee_gateway/util.py index f810663..8821c61 100644 --- a/tee_gateway/util.py +++ b/tee_gateway/util.py @@ -76,7 +76,7 @@ def deserialize_date(string): return None try: - from dateutil.parser import parse + from dateutil.parser import parse # type: ignore[import-untyped] return parse(string).date() except ImportError: @@ -97,7 +97,7 @@ def deserialize_datetime(string): return None try: - from dateutil.parser import parse + from dateutil.parser import parse # type: ignore[import-untyped] return parse(string) except ImportError: diff --git a/tests/mypy.ini b/tests/mypy.ini deleted file mode 100644 index 52e8864..0000000 --- a/tests/mypy.ini +++ /dev/null @@ -1,30 +0,0 @@ -[mypy] -python_version = 3.11 -warn_return_any = True -warn_unused_configs = True -disallow_untyped_defs = True -disallow_incomplete_defs = True -check_untyped_defs = True -no_implicit_optional = True -warn_redundant_casts = True -warn_unused_ignores = True -show_error_codes = True -files = server.py - -[mypy-langchain_core.*] -ignore_missing_imports = True - -[mypy-langchain_google_genai.*] -ignore_missing_imports = True - -[mypy-langchain_openai.*] -ignore_missing_imports = True - -[mypy-langchain_anthropic.*] -ignore_missing_imports = True - -[mypy-langchain_xai.*] -ignore_missing_imports = True - -[mypy-uvicorn.*] -ignore_missing_imports = True From c9495912676fd2b83c88ae6a9eb6773e273a2e5d Mon Sep 17 00:00:00 2001 From: "balogh.adam@icloud.com" Date: Sat, 14 Mar 2026 20:51:45 -0400 Subject: [PATCH 08/14] typing --- tee_gateway/llm_backend.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tee_gateway/llm_backend.py b/tee_gateway/llm_backend.py index 488ea1e..d397deb 100644 --- a/tee_gateway/llm_backend.py +++ b/tee_gateway/llm_backend.py @@ -14,7 +14,7 @@ from functools import lru_cache import httpx -from langchain_core.messages import HumanMessage, SystemMessage, AIMessage, ToolMessage +from langchain_core.messages import HumanMessage, SystemMessage, AIMessage, ToolMessage, BaseMessage from langchain_google_genai import ChatGoogleGenerativeAI from langchain_openai import ChatOpenAI from langchain_anthropic import ChatAnthropic @@ -188,7 +188,7 @@ def get_chat_model_cached(model: str, temperature: float, max_tokens: int): def convert_messages(messages: list) -> List[Any]: """Convert OpenAI-format message objects or dicts to LangChain message objects.""" - langchain_messages = [] + langchain_messages: List[BaseMessage] = [] for msg in messages: # Support both OpenAPI model objects and plain dicts From ee38672eef494151025a43e1697ad0a471a20722 Mon Sep 17 00:00:00 2001 From: "balogh.adam@icloud.com" Date: Sat, 14 Mar 2026 20:52:53 -0400 Subject: [PATCH 09/14] format --- tee_gateway/llm_backend.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tee_gateway/llm_backend.py b/tee_gateway/llm_backend.py index d397deb..45619e0 100644 --- a/tee_gateway/llm_backend.py +++ b/tee_gateway/llm_backend.py @@ -14,7 +14,13 @@ from functools import lru_cache import httpx -from langchain_core.messages import HumanMessage, SystemMessage, AIMessage, ToolMessage, BaseMessage +from langchain_core.messages import ( + HumanMessage, + SystemMessage, + AIMessage, + ToolMessage, + BaseMessage, +) from langchain_google_genai import ChatGoogleGenerativeAI from langchain_openai import ChatOpenAI from langchain_anthropic import ChatAnthropic From d44342b7e77fd7e3c335c7074d28b9e5c2f04cfa Mon Sep 17 00:00:00 2001 From: "balogh.adam@icloud.com" Date: Sat, 14 Mar 2026 20:53:16 -0400 Subject: [PATCH 10/14] check --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 57c2ed3..4b991e8 100644 --- a/Makefile +++ b/Makefile @@ -88,8 +88,8 @@ test-local: .PHONY: lint lint: + python3 -m ruff format . python3 -m ruff check . - python3 -m ruff format --check . python3 -m mypy tee_gateway .PHONY: mypy From 14961f82be74d8e5ae86a587463586e0ef60e3c5 Mon Sep 17 00:00:00 2001 From: "balogh.adam@icloud.com" Date: Sat, 14 Mar 2026 21:12:58 -0400 Subject: [PATCH 11/14] secretstr --- tee_gateway/llm_backend.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tee_gateway/llm_backend.py b/tee_gateway/llm_backend.py index 45619e0..355196a 100644 --- a/tee_gateway/llm_backend.py +++ b/tee_gateway/llm_backend.py @@ -14,6 +14,7 @@ from functools import lru_cache import httpx +from pydantic import SecretStr from langchain_core.messages import ( HumanMessage, SystemMessage, @@ -165,7 +166,7 @@ def get_chat_model_cached(model: str, temperature: float, max_tokens: int): return ChatAnthropic( model=api_name, - api_key=api_key, + api_key=SecretStr(api_key), temperature=effective_temp, max_tokens=max_tokens, timeout=ANTHROPIC_TIMEOUT, @@ -180,7 +181,7 @@ def get_chat_model_cached(model: str, temperature: float, max_tokens: int): return ChatXAI( model=api_name, - api_key=api_key, + api_key=SecretStr(api_key), temperature=effective_temp, max_tokens=max_tokens, http_client=xai_http_client, From c4a8c4ea5a06455a84d77bec59cd6e6e15952441 Mon Sep 17 00:00:00 2001 From: "balogh.adam@icloud.com" Date: Sat, 14 Mar 2026 21:17:31 -0400 Subject: [PATCH 12/14] secret --- tee_gateway/llm_backend.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tee_gateway/llm_backend.py b/tee_gateway/llm_backend.py index 355196a..3722767 100644 --- a/tee_gateway/llm_backend.py +++ b/tee_gateway/llm_backend.py @@ -151,7 +151,7 @@ def get_chat_model_cached(model: str, temperature: float, max_tokens: int): return ChatOpenAI( model=api_name, - api_key=api_key, + api_key=SecretStr(api_key), temperature=effective_temp, max_tokens=max_tokens, http_client=openai_http_client, From 06085cd7dfe8a1d0cfecf5c65c58934d939300e7 Mon Sep 17 00:00:00 2001 From: "balogh.adam@icloud.com" Date: Sat, 14 Mar 2026 21:19:47 -0400 Subject: [PATCH 13/14] dev --- dev-requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-requirements.txt b/dev-requirements.txt index 13999cd..0bb3e03 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -1 +1,2 @@ mypy>=1.13.0 +ruff>=0.9.1 From 1452e2e03154f64b78769130141efae155b97032 Mon Sep 17 00:00:00 2001 From: "balogh.adam@icloud.com" Date: Sat, 14 Mar 2026 21:22:53 -0400 Subject: [PATCH 14/14] mypy --- tee_gateway/llm_backend.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tee_gateway/llm_backend.py b/tee_gateway/llm_backend.py index 3722767..cea36a2 100644 --- a/tee_gateway/llm_backend.py +++ b/tee_gateway/llm_backend.py @@ -151,13 +151,13 @@ def get_chat_model_cached(model: str, temperature: float, max_tokens: int): return ChatOpenAI( model=api_name, - api_key=SecretStr(api_key), temperature=effective_temp, max_tokens=max_tokens, http_client=openai_http_client, + api_key=SecretStr(api_key), streaming=True, stream_usage=True, - ) + ) # type: ignore [call-arg] elif provider == "anthropic": api_key = os.getenv("ANTHROPIC_API_KEY") @@ -172,7 +172,7 @@ def get_chat_model_cached(model: str, temperature: float, max_tokens: int): timeout=ANTHROPIC_TIMEOUT, streaming=True, stream_usage=True, - ) + ) # type: ignore [call-arg] elif provider == "x-ai": api_key = os.getenv("XAI_API_KEY")