Skip to content

Default TEE registry is empty: no LLM inference works out of the box #10

Description

@gilbertsahumada

Summary

Out of the box, the TS SDK (opengradient-sdk@2.1.1) cannot perform any LLM inference on the current OpenGradient testnet. The default TEE registry address points to a deprecated registry with 0 active LLM-proxy TEEs, so TEE discovery always fails. The maintained Python SDK (1.1.0) points to a different, current registry that has live TEEs.

The paid path itself (x402 + Permit2 on Base) works fine: this is purely a discovery problem.

Reproduction

import { Client } from 'opengradient-sdk';

const client = new Client(/* default config */);
await client.llm.chat({ model: 'anthropic/claude-haiku-4-5', messages: [...] });

Fails, after a successful Permit2 approval, with:

TEE LLM request failed and registry refresh failed:
Error: No active LLM proxy TEE found in the registry.

Root cause

Both SDKs use the same network (testnet, RPC https://ogevmdevnet.opengradient.ai, chain id 10740) and the same discovery call getActiveTEEs(TEE_TYPE_LLM_PROXY=0), but differ in two coordinated ways:

TS SDK 2.1.1 Python SDK 1.1.0
Default registry address 0x4e72238852f3c918f4E4e57AeC9280dDB0c80248 0x703cB174AEadB35D611858369B4b1111dC9Abda6
getActiveTEEs struct 10 fields 11 fields (+ ohttpConfig)
  • TS: src/defaults.ts (address), src/abi/teeRegistry.ts (getActiveTEEs struct ends at lastHeartbeatAt, no ohttpConfig).
  • Because the structs differ, overriding teeRegistryAddress to the new address on the released SDK is not enough: viem decodes tuples positionally and throws on the extra field (caught internally, returns [], surfaces as "No active TEE").

Evidence (read-only, on-chain)

Queried both registries directly with viem on the testnet RPC, using the Python (new) ABI:

NEW 0x703c -> 3 active LLM-proxy TEE(s)   (enabled=true, hasTLS=true)
OLD 0x4e72 -> 0 active LLM-proxy TEE(s)

Confirmed end to end by pointing a Client at one of the new registry's endpoints via llmServerUrl (bypasses discovery): real inference returns a valid teeSignature (TEE attestation) and usage. So payment + attestation work, only registry discovery is broken.

Proposed fix

  1. src/defaults.ts : bump DEFAULT_TEE_REGISTRY_ADDRESS to 0x703cB174AEadB35D611858369B4b1111dC9Abda6.
  2. src/abi/teeRegistry.ts : append ohttpConfig to the getActiveTEEs output struct so viem can decode the current registry (copy the OhttpConfig components verbatim from the Python ABI opengradient/abi/TEERegistry.abi). The reading code in src/teeRegistry.ts does not need to change (it only uses endpoint/tlsCertificate/paymentAddress/publicKey).

Workaround today

Pass llmServerUrl with an endpoint read from the new registry. This bypasses on-chain discovery and TLS pinning (rejectUnauthorized: false), so it is fine for dev but not the secure production path.

Open question

Can a maintainer confirm 0x703cB174…Abda6 is the canonical current registry (not just one of several deployments)? Happy to send a PR bumping the default address + extending the ABI once confirmed.

Context

I hit this while building a community OpenGradient provider for the Vercel AI SDK: opengradient-ai-provider (npm), so OpenGradient inference is usable through that ecosystem (one of the most widely used TS toolkits for LLM apps). This bug blocks the default zero-config path; the current workaround is passing llmServerUrl manually, which also disables on-chain TLS pinning. PR #11 proposes the fix.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions