Skip to content

feat(x402): add SKALE network settings to X402Settings#528

Closed
Subhajitdas99 wants to merge 3 commits into
GetBindu:mainfrom
Subhajitdas99:feat/skale-x402-settings-clean-v2
Closed

feat(x402): add SKALE network settings to X402Settings#528
Subhajitdas99 wants to merge 3 commits into
GetBindu:mainfrom
Subhajitdas99:feat/skale-x402-settings-clean-v2

Conversation

@Subhajitdas99
Copy link
Copy Markdown
Contributor

@Subhajitdas99 Subhajitdas99 commented May 8, 2026

Summary

Describe the problem and fix in 2–5 bullets:

  • Problem: Bindu’s X402Settings did not expose a clean, validated SKALE-specific configuration surface, and the earlier branch accumulated unrelated changes beyond the intended scope.
  • Why it matters: SKALE/x402 setup should be configurable through settings only, with malformed values failing early at settings load instead of later during payment flow or RPC connection setup.
  • What changed: Added SKALE-specific x402 settings in bindu/settings.py, added validation for those fields, and added a secondary SKALE RPC endpoint so the existing fallback logic can actually fail over.
  • What did NOT change (scope boundary): No middleware behavior changes, no facilitator logic changes, no payment validation changes, no storage/auth changes, and no unrelated settings refactors.

Change Type (select all that apply)

  • Bug fix
  • Feature
  • Refactor
  • Documentation
  • Security hardening
  • Tests
  • Chore/infra

Scope (select all touched areas)

  • Server / API endpoints
  • Extensions (DID, x402, etc.)
  • Storage backends
  • Scheduler backends
  • Observability / monitoring
  • Authentication / authorization
  • CLI / utilities
  • Tests
  • Documentation
  • CI/CD / infra

Linked Issue/PR

User-Visible / Behavior Changes

Added new optional X402Settings fields:

  • skale_facilitator_url
  • skale_network
  • skale_payment_token
  • skale_payment_token_name
  • skale_default_amount

Also added SKALE RPC mappings for:

  • eip155:2046399126
  • skale-europa

Invalid SKALE settings values now fail at settings load instead of failing later at runtime.

Security Impact (required)

  • New permissions/capabilities? (Yes/No) No
  • Secrets/credentials handling changed? (Yes/No) No
  • New/changed network calls? (Yes/No) No
  • Database schema/migration changes? (Yes/No) No
  • Authentication/authorization changes? (Yes/No) No
  • If any Yes, explain risk + mitigation: None

Verification

Environment

  • OS: Windows 11
  • Python version: 3.12.9
  • Storage backend: Not applicable
  • Scheduler backend: Not applicable

Steps to Test

  1. Start from main and apply this branch.
  2. Confirm bindu/settings.py loads with the new SKALE x402 fields present in X402Settings.
  3. Confirm SKALE config validation exists and rpc_urls_by_network contains both SKALE keys with fallback URLs.

Expected Behavior

  • X402Settings exposes the new SKALE configuration fields.
  • Invalid SKALE settings values fail early at settings load.
  • SKALE RPC mapping includes more than one endpoint for failover.
  • Existing Base/Ethereum mappings remain unaffected.

Actual Behavior

  • Verified the new SKALE settings fields, validators, and RPC fallback mappings are present in bindu/settings.py.
  • Existing x402 settings structure remains unchanged outside the SKALE additions.

Evidence (attach at least one)

  • Failing test before + passing after
  • Test output / logs
  • Screenshot / recording
  • Performance metrics (if relevant)

Human Verification (required)

What you personally verified (not just CI):

  • Verified scenarios: Verified the branch contains only the intended X402Settings SKALE additions and validation logic in bindu/settings.py.
  • Edge cases checked: Checked invalid network/token/name/amount cases are guarded by validation logic, and confirmed both SKALE RPC keys have fallback endpoints.
  • What you did NOT verify: Did not verify live facilitator interaction or full end-to-end SKALE payment flow in this PR, since this change is settings-surface only.

Compatibility / Migration

  • Backward compatible? (Yes/No) Yes
  • Config/env changes? (Yes/No) Yes
  • Database migration needed? (Yes/No) No
  • If yes, exact upgrade steps: Existing users do not need to change anything. SKALE users can optionally configure the new X402Settings fields.

Failure Recovery (if this breaks)

  • How to disable/revert this change quickly: Revert this PR or stop using the new SKALE-specific settings.
  • Files/config to restore: bindu/settings.py
  • Known bad symptoms reviewers should watch for: Unexpected settings-loading errors if downstream configuration provides malformed SKALE values.

Risks and Mitigations

List only real risks for this PR. If none, write None.

  • Risk: SKALE metadata values (network identifier / RPC URLs / token address) may need future adjustment if upstream ecosystem details change.
    • Mitigation: Kept the PR narrowly scoped to settings so values can be updated easily without touching middleware or payment logic.

Checklist

  • Tests pass (uv run pytest)
  • Pre-commit hooks pass (uv run pre-commit run --all-files)
  • Documentation updated (if needed)
  • Security impact assessed
  • Human verification completed
  • Backward compatibility considered

Summary by CodeRabbit

  • New Features
    • Added SKALE network support for payments, including facilitator endpoint, network selection, default token, display name, and default amount.
  • Bug Fixes / Validation
    • Enforced HTTPS facilitator URL, validated network identifiers and token address/name formats and bounds, and ensured RPC mappings stay in sync with the SKALE allowlist.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 8, 2026

Review Change Stack

📝 Walkthrough

Walkthrough

Adds SKALE payment support to X402Settings: import updates, a supported-networks constant, five SKALE config fields, RPC URL entries for two SKALE networks, field validators for URL/network/token/name, and a post-model check ensuring RPC mappings exist.

Changes

SKALE Payment Configuration

Layer / File(s) Summary
Imports and Dependencies
bindu/settings.py
Imports re and field_validator for regex and pydantic field validation.
Supported Networks Constant
bindu/settings.py
Adds SKALE_SUPPORTED_NETWORKS: ClassVar[frozenset[str]] = frozenset({"eip155:2046399126", "skale-europa"}).
Configuration Fields
bindu/settings.py
Adds skale_facilitator_url, skale_network, skale_payment_token, skale_payment_token_name, and skale_default_amount (default 10000, gt=0, le=10**18).
RPC URL Configuration
bindu/settings.py
Extends rpc_urls_by_network with RPC endpoint lists for eip155:2046399126 and skale-europa.
Field Validators
bindu/settings.py
Adds pydantic field_validators to enforce HTTPS for facilitator URL, validate network membership/format, validate token as 0x-prefixed 40-hex, and trim/limit token name to ≤100 chars.
Post-model Consistency Check
bindu/settings.py
Adds @model_validator(mode="after") to require non-empty RPC URL mappings for all SKALE-supported networks.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 I hopped into settings, neat and spry,
Adding SKALE fields beneath the sky.
Validators tidy each token and name,
RPC lists join the supported-network frame.
Hooray—config checks all pass by! 🥕

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the main change: adding SKALE network settings to X402Settings, which directly matches the primary focus of the changeset.
Description check ✅ Passed The description comprehensively covers all required sections from the template: problem statement, change scope, security impact assessment, verification steps, backward compatibility, and risk analysis.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
bindu/settings.py (1)

384-388: ⚡ Quick win

Avoid duplicated network source of truth in validator.

supported_networks is hardcoded here and also represented in rpc_urls_by_network. This can drift and reject a valid mapped network later. Prefer deriving the allowed set from a single constant/shared source.

♻️ Suggested refactor
 class X402Settings(BaseSettings):
@@
+    SKALE_SUPPORTED_NETWORKS: frozenset[str] = frozenset(
+        {"eip155:2046399126", "skale-europa"}
+    )
@@
     def validate_skale_network(cls, value: str) -> str:
         """Validate the SKALE network identifier against supported mappings."""
-        supported_networks = {"eip155:2046399126", "skale-europa"}
-        if value not in supported_networks:
+        if value not in cls.SKALE_SUPPORTED_NETWORKS:
             raise ValueError(
                 "skale_network must be one of: eip155:2046399126, skale-europa"
             )
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@bindu/settings.py` around lines 384 - 388, The validator builds a local
supported_networks set independently of rpc_urls_by_network which duplicates the
source of truth and can drift; replace the hardcoded supported_networks check in
the skale_network validation with a derived set from the keys of
rpc_urls_by_network (or the shared constant that defines RPC mappings) so the
validator uses the single source of truth (e.g., derive allowed =
set(rpc_urls_by_network.keys()) and validate value against that), update the
error message to list allowed = sorted(allowed) if you still want a message, and
ensure any references to supported_networks are removed so only
rpc_urls_by_network (or the shared constant) drives allowed networks.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@bindu/settings.py`:
- Around line 384-388: The validator builds a local supported_networks set
independently of rpc_urls_by_network which duplicates the source of truth and
can drift; replace the hardcoded supported_networks check in the skale_network
validation with a derived set from the keys of rpc_urls_by_network (or the
shared constant that defines RPC mappings) so the validator uses the single
source of truth (e.g., derive allowed = set(rpc_urls_by_network.keys()) and
validate value against that), update the error message to list allowed =
sorted(allowed) if you still want a message, and ensure any references to
supported_networks are removed so only rpc_urls_by_network (or the shared
constant) drives allowed networks.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e9d78991-e05c-4126-80af-483bf3da0014

📥 Commits

Reviewing files that changed from the base of the PR and between 23becac and f649c23.

📒 Files selected for processing (1)
  • bindu/settings.py

@Subhajitdas99
Copy link
Copy Markdown
Contributor Author

Addressed the nitpick by moving the supported SKALE network set to a shared class-level constant so the validator no longer keeps its own local copy.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
bindu/settings.py (1)

287-373: ⚡ Quick win

Keep SKALE network allowlist and RPC mapping synchronized at load time.

Line 287 and Line 344 currently define SKALE network truth in two places. A small model-level consistency check would preserve the PR’s fail-fast goal if one side changes later.

♻️ Proposed guard to prevent config drift
 from pydantic import Field, computed_field, BaseModel, HttpUrl, field_validator
+from pydantic import model_validator
@@
 class X402Settings(BaseSettings):
@@
     rpc_urls_by_network: dict[str, list[str]] = {
@@
     }
+
+    `@model_validator`(mode="after")
+    def validate_skale_network_mappings(self) -> "X402Settings":
+        missing = [
+            network
+            for network in self.SKALE_SUPPORTED_NETWORKS
+            if network not in self.rpc_urls_by_network
+            or not self.rpc_urls_by_network[network]
+        ]
+        if missing:
+            raise ValueError(
+                f"Missing RPC URL mappings for SKALE networks: {', '.join(sorted(missing))}"
+            )
+        return self
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@bindu/settings.py` around lines 287 - 373, Add a model-level validation on
the Settings class that asserts SKALE_SUPPORTED_NETWORKS and the keys in
rpc_urls_by_network remain in sync: check that every string in
SKALE_SUPPORTED_NETWORKS is present as a key in rpc_urls_by_network and
optionally that any rpc_urls_by_network key that represents a SKALE network
appears in SKALE_SUPPORTED_NETWORKS; raise a clear ValueError if the sets
differ. Implement this as a Pydantic class-level validator
(root_validator/model_validator depending on your Pydantic version) inside the
same class that defines SKALE_SUPPORTED_NETWORKS, rpc_urls_by_network, and
model_config so the app fails fast at load time when the two definitions drift.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@bindu/settings.py`:
- Around line 287-373: Add a model-level validation on the Settings class that
asserts SKALE_SUPPORTED_NETWORKS and the keys in rpc_urls_by_network remain in
sync: check that every string in SKALE_SUPPORTED_NETWORKS is present as a key in
rpc_urls_by_network and optionally that any rpc_urls_by_network key that
represents a SKALE network appears in SKALE_SUPPORTED_NETWORKS; raise a clear
ValueError if the sets differ. Implement this as a Pydantic class-level
validator (root_validator/model_validator depending on your Pydantic version)
inside the same class that defines SKALE_SUPPORTED_NETWORKS,
rpc_urls_by_network, and model_config so the app fails fast at load time when
the two definitions drift.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e9343b0b-79e9-48f5-8e2f-17e3ec1308d0

📥 Commits

Reviewing files that changed from the base of the PR and between f649c23 and d7be8b1.

📒 Files selected for processing (1)
  • bindu/settings.py

@Subhajitdas99
Copy link
Copy Markdown
Contributor Author

The latest follow-up nitpicks have been addressed. I’m checking the remaining CI / Unit Tests (3.12) failure now and will patch it once I confirm the exact error.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@bindu/settings.py`:
- Around line 391-401: In validate_skale_network, remove the unreachable regex
branch that checks re.fullmatch(...) (the inner if block) and instead make the
membership error message dynamic by deriving the allowed values string from
cls.SKALE_SUPPORTED_NETWORKS (e.g., join the set into a comma-separated string)
so the ValueError in validate_skale_network references the current
SKALE_SUPPORTED_NETWORKS; update the raise ValueError call in
validate_skale_network accordingly and keep the initial membership check as the
sole validation.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c469ea79-5386-46ed-bc9b-6644845e40ef

📥 Commits

Reviewing files that changed from the base of the PR and between d7be8b1 and a3f2a4f.

📒 Files selected for processing (1)
  • bindu/settings.py

Comment thread bindu/settings.py
Comment on lines +391 to +401
@field_validator("skale_network")
@classmethod
def validate_skale_network(cls, value: str) -> str:
"""Validate the SKALE network identifier against supported mappings."""
if value not in cls.SKALE_SUPPORTED_NETWORKS:
raise ValueError(
"skale_network must be one of: eip155:2046399126, skale-europa"
)
if value.startswith("eip155:") and not re.fullmatch(r"eip155:\d+", value):
raise ValueError("skale_network must match the format 'eip155:<numeric>'")
return value
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

validate_skale_network: unreachable regex branch + stale-on-extension error message

Two issues in this validator:

  1. Lines 399–400 are dead code. The first guard (value not in cls.SKALE_SUPPORTED_NETWORKS) already guarantees that any value reaching the second if is either "eip155:2046399126" or "skale-europa". "eip155:2046399126" trivially satisfies re.fullmatch(r"eip155:\d+", ...), so the inner ValueError can never be raised. Remove the block entirely.

  2. Hardcoded error message at line 397 will silently go stale the moment a new network is added to SKALE_SUPPORTED_NETWORKS. Derive the string from the constant.

🐛 Proposed fix
 `@field_validator`("skale_network")
 `@classmethod`
 def validate_skale_network(cls, value: str) -> str:
     """Validate the SKALE network identifier against supported mappings."""
     if value not in cls.SKALE_SUPPORTED_NETWORKS:
         raise ValueError(
-            "skale_network must be one of: eip155:2046399126, skale-europa"
+            f"skale_network must be one of: {', '.join(sorted(cls.SKALE_SUPPORTED_NETWORKS))}"
         )
-    if value.startswith("eip155:") and not re.fullmatch(r"eip155:\d+", value):
-        raise ValueError("skale_network must match the format 'eip155:<numeric>'")
     return value
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@bindu/settings.py` around lines 391 - 401, In validate_skale_network, remove
the unreachable regex branch that checks re.fullmatch(...) (the inner if block)
and instead make the membership error message dynamic by deriving the allowed
values string from cls.SKALE_SUPPORTED_NETWORKS (e.g., join the set into a
comma-separated string) so the ValueError in validate_skale_network references
the current SKALE_SUPPORTED_NETWORKS; update the raise ValueError call in
validate_skale_network accordingly and keep the initial membership check as the
sole validation.

@Subhajitdas99
Copy link
Copy Markdown
Contributor Author

The remaining CI failure was coming from runtime test typing issues on updated main, not from the SKALE settings change itself. I opened a tiny follow-up PR to fix those ty failures cleanly so #528 can stay narrowly scoped.

@raahulrahl
Copy link
Copy Markdown
Member

Superseded by #534. Same goal achieved via extra_networks rather than hardcoded skale_* fields, so the pattern generalises to Polygon, Avalanche, etc.

@raahulrahl raahulrahl closed this May 12, 2026
Subhajitdas99 pushed a commit to Subhajitdas99/Bindu that referenced this pull request May 13, 2026
x402 v2 ships built-in pricing for Base mainnet and Base Sepolia only.
Reaching SKALE / Polygon / Avalanche / Ethereum mainnet etc. needs two
things to line up — a facilitator that supports the chain, and asset
metadata so the price parser maps `"0.01"` to the right ERC-20 contract.

This commit lands the second piece as an operator-extensible config
surface, and ships SKALE Europa as the worked example.

What's new
----------

* `bindu/settings.py::ExtraNetwork`
  Pydantic model carrying CAIP-2 + asset address + EIP-712 domain bits
  (`asset_name`, `asset_eip712_version`, `asset_decimals`). Field
  validators reject malformed CAIP-2 / non-hex asset addresses at
  settings-load time so misconfiguration fails early.

* `bindu/settings.py::X402Settings.extra_networks`
  Dict keyed on friendly network slug ("skale-europa"). Default ships
  one entry — SKALE Europa Hub bridged USDC — mirroring
  facilitator.x402.fi's `/supported` metadata exactly. Operators add
  more chains by extending the dict.

* `bindu/server/applications.py::_create_payment_requirements`
  Plumbed the two ways `extra_networks` matters:
    - The friendly → CAIP-2 normaliser now merges built-in mappings
      (base, ethereum, …) with operator-supplied ones. Built-ins win
      collisions, on purpose — operators can't accidentally re-route
      `base-sepolia`.
    - For each extra network, registers a money parser on
      `ExactEvmServerScheme` via `register_money_parser`. The parser
      claims requests for its specific CAIP-2 and returns `None` for
      everything else, so the SDK's built-in Base parser still wins
      for Base.

Why this shape (not the four open PRs that tried something else)
----------------------------------------------------------------

* GetBindu#486 documented SKALE as blocked by `x402.types.SupportedNetworks` —
  a symbol that no longer exists after v2. The doc was a snapshot of a
  problem v2 removed.
* GetBindu#507 added SKALE to `rpc_urls_by_network` — the dict the v2
  migration removed because the facilitator owns RPC now.
* GetBindu#528 added hardcoded `skale_*` fields to `X402Settings`. It works
  for one chain but doesn't generalise — and it re-introduced the dead
  RPC dict. Plus settings alone don't help: `parse_price()` would still
  raise on SKALE because the SDK has no built-in entry for chain
  1187947933.
* GetBindu#496 wrapped a stubbed HTTP `GET /supported` health check around a
  RAG agent and called it "SKALE integration". No payment actually
  gated.

The right shape is operator-extensible networks + a money parser per
chain — same surface works for SKALE today and Polygon / Avalanche / any
EVM tomorrow with no code changes.

Live facilitator situation
--------------------------

Only one public facilitator advertises SKALE chains today:
`https://facilitator.x402.fi`. Coinbase's own facilitator at
`https://x402.org/facilitator` lists Base + non-EVM chains only.
`facilitator.x402.fi`'s cert is currently expired — documented in
`bugs/known-issues.md` as `skale-facilitator-cert-expired` (low/ops).
The shipped Bindu defaults still point at Coinbase; operators that want
SKALE set `X402__FACILITATOR_URL` themselves after reading the doc.

Tests
-----

* `tests/unit/server/middleware/x402/test_extra_networks.py` (11 tests)
  Schema validation (CAIP-2 format, hex asset, decimal cap), money parser
  registration, network-falls-through behavior, decimal-other-than-6
  scaling (WETH 18-decimals case), independence of multiple parsers,
  and confirmation that the shipped SKALE Europa default matches
  facilitator.x402.fi's advertised asset.

* `tests/integration/x402/test_skale_facilitator_supported.py` (2 tests)
  Live smoke against `facilitator.x402.fi/supported`. Opt-in
  (`X402_NETWORK_TESTS=1`) so CI doesn't depend on a third-party with
  an expired cert. Asserts (a) facilitator still advertises SKALE
  Europa at the CAIP-2 we ship, (b) the asset metadata
  (decimals/name/version) matches our `ExtraNetwork` default — if any
  of those drift the test fires before agents start collecting
  signature mismatches in prod.

* `pytest.ini`: new `network` marker for opt-in live-external tests.

Verified
--------

* 980 unit + integration tests pass (969 baseline + 11 new).
* ty: All checks passed (0 diagnostics).
* ruff clean.
* Pre-commit hooks all pass end-to-end (no --no-verify).
* Live smoke against facilitator.x402.fi confirms our shipped SKALE
  Europa defaults match what the facilitator advertises.

Closes-out: GetBindu#486 (stale upstream-blocker note), GetBindu#507 (dead RPC dict
re-add), GetBindu#528 (hardcoded one-chain settings) — this PR is the
operator-extensible alternative all three were reaching toward.

Related: GetBindu#496 RAG router agent — the routing example is still useful,
but its SKALE story should be rewritten on top of this commit (drop
the stub health check, use the `X402Middleware` directly on the
premium endpoint).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants