From 0bc488f44d330c09515bd716d672a643ce718f6f Mon Sep 17 00:00:00 2001 From: Jinhao Xu Date: Sat, 5 Sep 2026 13:38:08 +0800 Subject: [PATCH 1/3] feat: add local Monad exact and upto examples --- examples/local_monad_exact.py | 76 +++++++++++++++++++++++++++++ examples/local_monad_matrix.py | 88 ++++++++++++++++++++++++++++++++++ examples/local_monad_upto.py | 74 ++++++++++++++++++++++++++++ 3 files changed, 238 insertions(+) create mode 100644 examples/local_monad_exact.py create mode 100644 examples/local_monad_matrix.py create mode 100644 examples/local_monad_upto.py diff --git a/examples/local_monad_exact.py b/examples/local_monad_exact.py new file mode 100644 index 0000000..bf2cf93 --- /dev/null +++ b/examples/local_monad_exact.py @@ -0,0 +1,76 @@ +"""Local o402 exact settlement on Monad (mainnet or testnet). + +Hits POST /v1/images/generations (o402 bills that path exact) against the +local echo upstream (`exact-echo`). + +Usage: + python examples/local_monad_exact.py + NETWORK=eip155:10143 python examples/local_monad_exact.py +""" + +from __future__ import annotations + +import json +import os +from pathlib import Path + + +def _load_dotenv() -> None: + path = Path(__file__).resolve().parents[1] / ".env" + if not path.is_file(): + return + for line in path.read_text().splitlines(): + raw = line.strip() + if not raw or raw.startswith("#") or "=" not in raw: + continue + key, value = raw.split("=", 1) + os.environ.setdefault(key, value) + + +_load_dotenv() +os.environ.setdefault("NO_PROXY", "127.0.0.1,localhost,::1") +os.environ.setdefault("no_proxy", os.environ["NO_PROXY"]) + +from x402_openai import EvmConfig, X402OpenAI, prefer_network, prefer_scheme + +network = os.environ.get("NETWORK", "eip155:143") +rpc_url = ( + "https://testnet-rpc.monad.xyz" + if network == "eip155:10143" + else "https://rpc.monad.xyz" +) +client = X402OpenAI( + evm=EvmConfig(private_key=os.environ["EVM_PRIVATE_KEY"], rpc_url=rpc_url), + base_url=os.environ.get("O402_BASE_URL", "http://127.0.0.1:8080/v1"), + api_key="x402", + max_retries=0, + spend_controls={ + "max_amount_per_payment": "$1", + "allowed_assets": [ + { + "network": "eip155:10143", + "asset": "0x534b2f3A21130d7a60830c2Df862319e593943A3", + } + ], + }, + policies=[prefer_network(network), prefer_scheme("exact")], +) + +image = client.images.generate( + model="exact-echo", + prompt=f"exact {network}", + n=1, + size="256x256", +) +print( + json.dumps( + { + "network": network, + "model": "exact-echo", + "scheme": "exact", + "created": image.created, + "url": None if not image.data else image.data[0].url, + }, + indent=2, + ) +) diff --git a/examples/local_monad_matrix.py b/examples/local_monad_matrix.py new file mode 100644 index 0000000..793be69 --- /dev/null +++ b/examples/local_monad_matrix.py @@ -0,0 +1,88 @@ +"""Exercise exact + upto on Monad mainnet and testnet against local o402. + +Usage: python examples/local_monad_matrix.py +""" + +from __future__ import annotations + +import os +from pathlib import Path + + +def _load_dotenv() -> None: + path = Path(__file__).resolve().parents[1] / ".env" + if not path.is_file(): + return + for line in path.read_text().splitlines(): + raw = line.strip() + if not raw or raw.startswith("#") or "=" not in raw: + continue + key, value = raw.split("=", 1) + os.environ.setdefault(key, value) + + +_load_dotenv() +os.environ.setdefault("NO_PROXY", "127.0.0.1,localhost,::1") +os.environ.setdefault("no_proxy", os.environ["NO_PROXY"]) + +from x402_openai import EvmConfig, X402OpenAI, prefer_network, prefer_scheme + +key = os.environ["EVM_PRIVATE_KEY"] +base_url = os.environ.get("O402_BASE_URL", "http://127.0.0.1:8080/v1") +chat_model = os.environ.get("MODEL", "openrouter/meta-llama/llama-3.1-8b-instruct") +networks = ("eip155:143", "eip155:10143") + + +def rpc_url(network: str) -> str: + return ( + "https://testnet-rpc.monad.xyz" + if network == "eip155:10143" + else "https://rpc.monad.xyz" + ) + + +def make_client(network: str, scheme: str) -> X402OpenAI: + return X402OpenAI( + evm=EvmConfig(private_key=key, rpc_url=rpc_url(network)), + base_url=base_url, + api_key="x402", + max_retries=0, + spend_controls={ + "max_amount_per_payment": "$1", + "allowed_assets": [ + { + "network": "eip155:10143", + "asset": "0x534b2f3A21130d7a60830c2Df862319e593943A3", + } + ], + }, + policies=[prefer_network(network), prefer_scheme(scheme)], + ) + + +unpaid = X402OpenAI(evm=key, base_url=base_url, api_key="x402", max_retries=0) +print("models", [model.id for model in unpaid.models.list().data[:12]]) + +for network in networks: + try: + chat = make_client(network, "upto").chat.completions.create( + model=chat_model, + messages=[{"role": "user", "content": f"One word for {network}"}], + max_tokens=8, + stream=False, + ) + print("upto ok", {"network": network, "content": chat.choices[0].message.content}) + except Exception as exc: # noqa: BLE001 + print("upto fail", network, type(exc).__name__, exc) + + try: + image = make_client(network, "exact").images.generate( + model="exact-echo", + prompt=f"exact {network}", + n=1, + size="256x256", + ) + url = None if not image.data else image.data[0].url + print("exact ok", {"network": network, "url": url}) + except Exception as exc: # noqa: BLE001 + print("exact fail", network, type(exc).__name__, exc) diff --git a/examples/local_monad_upto.py b/examples/local_monad_upto.py new file mode 100644 index 0000000..9cc8315 --- /dev/null +++ b/examples/local_monad_upto.py @@ -0,0 +1,74 @@ +"""Local o402 upto chat on Monad (mainnet or testnet). + +Usage: + python examples/local_monad_upto.py + NETWORK=eip155:10143 python examples/local_monad_upto.py +""" + +from __future__ import annotations + +import json +import os +from pathlib import Path + + +def _load_dotenv() -> None: + path = Path(__file__).resolve().parents[1] / ".env" + if not path.is_file(): + return + for line in path.read_text().splitlines(): + raw = line.strip() + if not raw or raw.startswith("#") or "=" not in raw: + continue + key, value = raw.split("=", 1) + os.environ.setdefault(key, value) + + +_load_dotenv() +os.environ.setdefault("NO_PROXY", "127.0.0.1,localhost,::1") +os.environ.setdefault("no_proxy", os.environ["NO_PROXY"]) + +from x402_openai import EvmConfig, X402OpenAI, prefer_network, prefer_scheme + +network = os.environ.get("NETWORK", "eip155:143") +rpc_url = ( + "https://testnet-rpc.monad.xyz" + if network == "eip155:10143" + else "https://rpc.monad.xyz" +) +client = X402OpenAI( + evm=EvmConfig(private_key=os.environ["EVM_PRIVATE_KEY"], rpc_url=rpc_url), + base_url=os.environ.get("O402_BASE_URL", "http://127.0.0.1:8080/v1"), + api_key="x402", + max_retries=0, + spend_controls={ + "max_amount_per_payment": "$1", + "allowed_assets": [ + { + "network": "eip155:10143", + "asset": "0x534b2f3A21130d7a60830c2Df862319e593943A3", + } + ], + }, + policies=[prefer_network(network), prefer_scheme("upto")], +) + +model = os.environ.get("MODEL", "openrouter/meta-llama/llama-3.1-8b-instruct") +response = client.chat.completions.create( + model=model, + messages=[{"role": "user", "content": f"Reply with one word: {network}"}], + max_tokens=16, + stream=False, +) +print( + json.dumps( + { + "network": network, + "model": model, + "scheme": "upto", + "content": response.choices[0].message.content, + "usage": None if response.usage is None else response.usage.model_dump(), + }, + indent=2, + ) +) From 35626c57e80d55a2fd0ae7baa92740350ff45987 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 5 Sep 2026 05:40:48 +0000 Subject: [PATCH 2/3] =?UTF-8?q?=F0=9F=8E=A8=20[pre-commit.ci]=20Auto=20for?= =?UTF-8?q?mat=20from=20pre-commit.com=20hooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/local_monad_exact.py | 6 +----- examples/local_monad_matrix.py | 8 +++----- examples/local_monad_upto.py | 6 +----- 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/examples/local_monad_exact.py b/examples/local_monad_exact.py index bf2cf93..b21f5f7 100644 --- a/examples/local_monad_exact.py +++ b/examples/local_monad_exact.py @@ -34,11 +34,7 @@ def _load_dotenv() -> None: from x402_openai import EvmConfig, X402OpenAI, prefer_network, prefer_scheme network = os.environ.get("NETWORK", "eip155:143") -rpc_url = ( - "https://testnet-rpc.monad.xyz" - if network == "eip155:10143" - else "https://rpc.monad.xyz" -) +rpc_url = "https://testnet-rpc.monad.xyz" if network == "eip155:10143" else "https://rpc.monad.xyz" client = X402OpenAI( evm=EvmConfig(private_key=os.environ["EVM_PRIVATE_KEY"], rpc_url=rpc_url), base_url=os.environ.get("O402_BASE_URL", "http://127.0.0.1:8080/v1"), diff --git a/examples/local_monad_matrix.py b/examples/local_monad_matrix.py index 793be69..97ca90f 100644 --- a/examples/local_monad_matrix.py +++ b/examples/local_monad_matrix.py @@ -35,9 +35,7 @@ def _load_dotenv() -> None: def rpc_url(network: str) -> str: return ( - "https://testnet-rpc.monad.xyz" - if network == "eip155:10143" - else "https://rpc.monad.xyz" + "https://testnet-rpc.monad.xyz" if network == "eip155:10143" else "https://rpc.monad.xyz" ) @@ -72,7 +70,7 @@ def make_client(network: str, scheme: str) -> X402OpenAI: stream=False, ) print("upto ok", {"network": network, "content": chat.choices[0].message.content}) - except Exception as exc: # noqa: BLE001 + except Exception as exc: print("upto fail", network, type(exc).__name__, exc) try: @@ -84,5 +82,5 @@ def make_client(network: str, scheme: str) -> X402OpenAI: ) url = None if not image.data else image.data[0].url print("exact ok", {"network": network, "url": url}) - except Exception as exc: # noqa: BLE001 + except Exception as exc: print("exact fail", network, type(exc).__name__, exc) diff --git a/examples/local_monad_upto.py b/examples/local_monad_upto.py index 9cc8315..15fb185 100644 --- a/examples/local_monad_upto.py +++ b/examples/local_monad_upto.py @@ -31,11 +31,7 @@ def _load_dotenv() -> None: from x402_openai import EvmConfig, X402OpenAI, prefer_network, prefer_scheme network = os.environ.get("NETWORK", "eip155:143") -rpc_url = ( - "https://testnet-rpc.monad.xyz" - if network == "eip155:10143" - else "https://rpc.monad.xyz" -) +rpc_url = "https://testnet-rpc.monad.xyz" if network == "eip155:10143" else "https://rpc.monad.xyz" client = X402OpenAI( evm=EvmConfig(private_key=os.environ["EVM_PRIVATE_KEY"], rpc_url=rpc_url), base_url=os.environ.get("O402_BASE_URL", "http://127.0.0.1:8080/v1"), From 9556747c73bfd235b02c97d89956ebced21d57b4 Mon Sep 17 00:00:00 2001 From: Jinhao Xu Date: Sat, 5 Sep 2026 14:52:09 +0800 Subject: [PATCH 3/3] fix: satisfy ruff E402 in local Monad examples --- examples/local_monad_exact.py | 4 ++-- examples/local_monad_matrix.py | 4 ++-- examples/local_monad_upto.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/local_monad_exact.py b/examples/local_monad_exact.py index b21f5f7..724e747 100644 --- a/examples/local_monad_exact.py +++ b/examples/local_monad_exact.py @@ -14,6 +14,8 @@ import os from pathlib import Path +from x402_openai import EvmConfig, X402OpenAI, prefer_network, prefer_scheme + def _load_dotenv() -> None: path = Path(__file__).resolve().parents[1] / ".env" @@ -31,8 +33,6 @@ def _load_dotenv() -> None: os.environ.setdefault("NO_PROXY", "127.0.0.1,localhost,::1") os.environ.setdefault("no_proxy", os.environ["NO_PROXY"]) -from x402_openai import EvmConfig, X402OpenAI, prefer_network, prefer_scheme - network = os.environ.get("NETWORK", "eip155:143") rpc_url = "https://testnet-rpc.monad.xyz" if network == "eip155:10143" else "https://rpc.monad.xyz" client = X402OpenAI( diff --git a/examples/local_monad_matrix.py b/examples/local_monad_matrix.py index 97ca90f..df947e0 100644 --- a/examples/local_monad_matrix.py +++ b/examples/local_monad_matrix.py @@ -8,6 +8,8 @@ import os from pathlib import Path +from x402_openai import EvmConfig, X402OpenAI, prefer_network, prefer_scheme + def _load_dotenv() -> None: path = Path(__file__).resolve().parents[1] / ".env" @@ -25,8 +27,6 @@ def _load_dotenv() -> None: os.environ.setdefault("NO_PROXY", "127.0.0.1,localhost,::1") os.environ.setdefault("no_proxy", os.environ["NO_PROXY"]) -from x402_openai import EvmConfig, X402OpenAI, prefer_network, prefer_scheme - key = os.environ["EVM_PRIVATE_KEY"] base_url = os.environ.get("O402_BASE_URL", "http://127.0.0.1:8080/v1") chat_model = os.environ.get("MODEL", "openrouter/meta-llama/llama-3.1-8b-instruct") diff --git a/examples/local_monad_upto.py b/examples/local_monad_upto.py index 15fb185..d70223b 100644 --- a/examples/local_monad_upto.py +++ b/examples/local_monad_upto.py @@ -11,6 +11,8 @@ import os from pathlib import Path +from x402_openai import EvmConfig, X402OpenAI, prefer_network, prefer_scheme + def _load_dotenv() -> None: path = Path(__file__).resolve().parents[1] / ".env" @@ -28,8 +30,6 @@ def _load_dotenv() -> None: os.environ.setdefault("NO_PROXY", "127.0.0.1,localhost,::1") os.environ.setdefault("no_proxy", os.environ["NO_PROXY"]) -from x402_openai import EvmConfig, X402OpenAI, prefer_network, prefer_scheme - network = os.environ.get("NETWORK", "eip155:143") rpc_url = "https://testnet-rpc.monad.xyz" if network == "eip155:10143" else "https://rpc.monad.xyz" client = X402OpenAI(