Advertise the full Chat model catalog, not just the SDK enum - #18

Merged
adambalogh merged 2 commits into
OpenGradient:mainfrom
0xadvait:sync-model-catalog-with-chat-app
Jul 30, 2026
Merged

Advertise the full Chat model catalog, not just the SDK enum#18
adambalogh merged 2 commits into
OpenGradient:mainfrom
0xadvait:sync-model-catalog-with-chat-app

Conversation

@0xadvait

Copy link
Copy Markdown
Contributor

Why

/v1/models and og-veil models were both derived from the SDK's TEE_LLM enum. That enum ships on the SDK's release cadence and lags the network. At the pinned opengradient 1.1.1 it is missing ten models the gateway already serves and the Chat app already offers:

gpt-5.6-luna · gpt-5.6-terra · gpt-5.6-sol · claude-sonnet-5 · claude-opus-5 · claude-fable-5 · gemini-3.6-flash · gemini-3.5-flash-lite · grok-4.5 · grok-4.3

So an agent probing /v1/models never learned they existed. Bumping the SDK doesn't fix it -- 1.1.3 is missing the same ten.

What

veil/models.py, a curated catalog mirroring the Chat app's lib/constants/models.ts: same models, same display names, same order within a provider. Ids are the bare wire names (the gateway is sent claude-opus-5, not anthropic/claude-opus-5) -- matching both the SDK (model.split("/")[1]) and the Chat app (modelToGatewayModel).

The enum is still folded in on top of the catalog, so anything a later SDK adds shows up without an edit here, and nothing that used to be listed can regress. 42 ids advertised before, 59 now, none dropped.

Neither list gates anything: the gateway stays the source of truth for what's routable, and Veil forwards whatever model the agent sends. This is a listing, so it errs toward completeness.

Also in here:

  • /v1/models reports the upstream provider as owned_by instead of a flat "opengradient", and keeps superseded ids listed so an agent already configured for one keeps working.
  • og-veil models groups by provider with descriptions instead of printing one flat sorted list; --all adds superseded and SDK-only ids.
  • og-veil test defaulted to --model gpt-4.1, which is not a model the network serves (the enum has gpt-4.1-nano / -mini / -2025-04-14, no bare gpt-4.1). Now defaults to claude-haiku-4-5, the Chat app's own free-tier default -- cheap, fast, and available on every account.
  • README gains a model table, and drops the superseded claude-sonnet-4-6 from its examples.
  • Image-generation models are included, grouped separately. They're called through the same /v1/chat/completions endpoint, which is how the Chat app's Image Studio reaches them.

og-veil models

Models available through OpenGradient Veil:
Anthropic
claude-haiku-4-5 Fast, low-cost replies for everyday tasks
claude-sonnet-5 Balanced all-rounder for writing and code
claude-opus-5 Latest Opus -- top-tier reasoning for complex work
claude-fable-5 Anthropic's most capable model for demanding work
OpenAI
gpt-4.1-nano Cheapest option for simple tasks
gpt-5-mini Fast and affordable for daily use
gpt-5 Powerful all-rounder, previous generation
gpt-5.6-luna Latest GPT model for fast everyday work
gpt-5.6-terra Latest GPT model with strong reasoning at balanced cost
gpt-5.6-sol Most capable latest GPT model
...

Testing

make check and make test both clean. New tests/test_models.py covers the invariants that matter: ids are bare, the catalog covers the ten the enum lagged on, and known_model_ids() is a superset of the enum -- so the listing can only ever grow.

Follow-up, not in this PR

Keeping this catalog and the Chat app's in sync is manual. If the tee-gateway grows a model-registry endpoint, both should read from it instead. The opengradient floor is also still >=1.1.1 while 1.1.3 is out; bumping it gains nothing here (the union already covers it) so I left it alone.

Advait Jayant added 2 commits July 30, 2026 16:16
/v1/models and `og-veil models` were both derived from the SDK's TEE_LLM
enum. That enum ships on the SDK's release cadence and lags the network:
at the pinned 1.1.1 it was missing ten models the gateway already serves
and the Chat app already offers -- the GPT-5.6 trio, Claude Sonnet 5 /
Opus 5 / Fable 5, Gemini 3.6 Flash and 3.5 Flash Lite, and Grok 4.5 /
4.3 -- so an agent probing /v1/models never learned they existed.
Add veil/models.py, a curated catalog mirroring the Chat app's
lib/constants/models.ts: same models, same display names, same order,
with bare wire ids (the gateway is sent `claude-opus-5`, not
`anthropic/claude-opus-5`, matching both the SDK and the Chat app). The
enum is folded in on top, so anything a later SDK adds still shows up
and nothing that used to be listed can regress -- 42 ids advertised
before, 59 now, none dropped.
- /v1/models reports the provider as `owned_by` instead of a flat
"opengradient", and keeps superseded ids listed so an agent already
configured for one keeps working.
- `og-veil models` groups by provider with descriptions; `--all` adds
superseded and SDK-only ids.
- `og-veil test` defaulted to `--model gpt-4.1`, which is not a model
the network serves (the enum has gpt-4.1-nano / -mini / -2025-04-14).
Default to claude-haiku-4-5, the Chat app's own free-tier default.
- README gains a model table and drops the superseded claude-sonnet-4-6
from its examples.
Two accuracy gaps in the models docs the previous commit added.
Generated image bytes ride out-of-band and are not signed -- the enclave
hashes the assistant text (see the SDK's response_content_for_hash). The
request is OHTTP-sealed exactly as a text prompt is, so privacy is
unchanged, but `X-OpenGradient-Verified: true` on an image-generation
response attests the exchange, not the pixels. Worth stating plainly in
a README whose whole subject is what the verification covers.
And note the absence of video. Chat's Video Studio (Veo, Kling,
Seedance, Wan) doesn't run over this path: those requests go to
chat-api, which holds the fal/BytePlus/Atlas keys and calls the
providers directly -- no enclave, no OHTTP, no signature. Listing those
models here would advertise a guarantee that doesn't exist, so the
README says so rather than leaving the omission to be guessed at.
@0xadvait

Copy link
Copy Markdown
ContributorAuthor

Follow-up commit, prompted by "what about image and video models?" -- both worth answering in the README rather than leaving implicit.

Image models are in (they were in the first commit): gpt-image-2, gemini-3.1-flash-image, seedream-5.0-lite, seedance-4.5, glm-image, plus three superseded. They belong here because resolveGatewayModel puts the image model id on the same OHTTP /v1/chat/completions request as chat -- identical sealed-and-verified path.

But the guarantee is narrower than the surrounding README implies, so it now says so: generated image bytes ride out-of-band and are not signed. From the SDK's response_content_for_hash:

otherwise it hashes the assistant message text (generated image bytes are excluded -- they ride out-of-band and are not signed)

The request is OHTTP-sealed exactly as a text prompt is, so privacy is unchanged. But X-OpenGradient-Verified: true on an image-generation response attests the exchange, not the pixels. Surfacing image models prominently without saying that would have been an over-claim.

Video models are deliberately out. Chat's Video Studio doesn't run over this path at all:

  • lib/api/videoStudio.ts sends to chat-api /api/v1/video over a plain fetch with a Supabase bearer token
  • nothing under chat-app's app/api references ohttp or tee
  • chat-api holds the fal / BytePlus / Atlas keys and calls those providers directly (provider?: "fal" | "byteplus" | "atlas" -- Veo 3.1, Kling v3 Pro, Seedance 2.0, the Wan 2.x line, Happy Horse)
  • the shape is async submit + poll on a statusUrl, not an OpenAI-compatible call

No HPKE sealing, no attestation, no signature anywhere in that chain. Listing those ids in /v1/models would tell an agent to send them down the verified private path when none exists. Making it real is a gateway change -- video generation proxied in-enclave -- not a veil change. The README now states the absence and the reason.

@adambalogh
adambalogh merged commit 6aaa956 into OpenGradient:mainJul 30, 2026
2 checks passed
Sign up for freeto 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

@0xadvait@adambalogh
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Advertise the full Chat model catalog, not just the SDK enum - #18

Merged
adambalogh merged 2 commits into
OpenGradient:mainfrom
0xadvait:sync-model-catalog-with-chat-app
Jul 30, 2026
Merged

Advertise the full Chat model catalog, not just the SDK enum#18
adambalogh merged 2 commits into
OpenGradient:mainfrom
0xadvait:sync-model-catalog-with-chat-app

Conversation

@0xadvait

Copy link
Copy Markdown
Contributor

Why

/v1/models and og-veil models were both derived from the SDK's TEE_LLM enum. That enum ships on the SDK's release cadence and lags the network. At the pinned opengradient 1.1.1 it is missing ten models the gateway already serves and the Chat app already offers:

gpt-5.6-luna · gpt-5.6-terra · gpt-5.6-sol · claude-sonnet-5 · claude-opus-5 · claude-fable-5 · gemini-3.6-flash · gemini-3.5-flash-lite · grok-4.5 · grok-4.3

So an agent probing /v1/models never learned they existed. Bumping the SDK doesn't fix it -- 1.1.3 is missing the same ten.

What

veil/models.py, a curated catalog mirroring the Chat app's lib/constants/models.ts: same models, same display names, same order within a provider. Ids are the bare wire names (the gateway is sent claude-opus-5, not anthropic/claude-opus-5) -- matching both the SDK (model.split("/")[1]) and the Chat app (modelToGatewayModel).

The enum is still folded in on top of the catalog, so anything a later SDK adds shows up without an edit here, and nothing that used to be listed can regress. 42 ids advertised before, 59 now, none dropped.

Neither list gates anything: the gateway stays the source of truth for what's routable, and Veil forwards whatever model the agent sends. This is a listing, so it errs toward completeness.

Also in here:

  • /v1/models reports the upstream provider as owned_by instead of a flat "opengradient", and keeps superseded ids listed so an agent already configured for one keeps working.
  • og-veil models groups by provider with descriptions instead of printing one flat sorted list; --all adds superseded and SDK-only ids.
  • og-veil test defaulted to --model gpt-4.1, which is not a model the network serves (the enum has gpt-4.1-nano / -mini / -2025-04-14, no bare gpt-4.1). Now defaults to claude-haiku-4-5, the Chat app's own free-tier default -- cheap, fast, and available on every account.
  • README gains a model table, and drops the superseded claude-sonnet-4-6 from its examples.
  • Image-generation models are included, grouped separately. They're called through the same /v1/chat/completions endpoint, which is how the Chat app's Image Studio reaches them.

og-veil models

Models available through OpenGradient Veil:
Anthropic
claude-haiku-4-5 Fast, low-cost replies for everyday tasks
claude-sonnet-5 Balanced all-rounder for writing and code
claude-opus-5 Latest Opus -- top-tier reasoning for complex work
claude-fable-5 Anthropic's most capable model for demanding work
OpenAI
gpt-4.1-nano Cheapest option for simple tasks
gpt-5-mini Fast and affordable for daily use
gpt-5 Powerful all-rounder, previous generation
gpt-5.6-luna Latest GPT model for fast everyday work
gpt-5.6-terra Latest GPT model with strong reasoning at balanced cost
gpt-5.6-sol Most capable latest GPT model
...

Testing

make check and make test both clean. New tests/test_models.py covers the invariants that matter: ids are bare, the catalog covers the ten the enum lagged on, and known_model_ids() is a superset of the enum -- so the listing can only ever grow.

Follow-up, not in this PR

Keeping this catalog and the Chat app's in sync is manual. If the tee-gateway grows a model-registry endpoint, both should read from it instead. The opengradient floor is also still >=1.1.1 while 1.1.3 is out; bumping it gains nothing here (the union already covers it) so I left it alone.

Advait Jayant added 2 commits July 30, 2026 16:16
/v1/models and `og-veil models` were both derived from the SDK's TEE_LLM
enum. That enum ships on the SDK's release cadence and lags the network:
at the pinned 1.1.1 it was missing ten models the gateway already serves
and the Chat app already offers -- the GPT-5.6 trio, Claude Sonnet 5 /
Opus 5 / Fable 5, Gemini 3.6 Flash and 3.5 Flash Lite, and Grok 4.5 /
4.3 -- so an agent probing /v1/models never learned they existed.
Add veil/models.py, a curated catalog mirroring the Chat app's
lib/constants/models.ts: same models, same display names, same order,
with bare wire ids (the gateway is sent `claude-opus-5`, not
`anthropic/claude-opus-5`, matching both the SDK and the Chat app). The
enum is folded in on top, so anything a later SDK adds still shows up
and nothing that used to be listed can regress -- 42 ids advertised
before, 59 now, none dropped.
- /v1/models reports the provider as `owned_by` instead of a flat
"opengradient", and keeps superseded ids listed so an agent already
configured for one keeps working.
- `og-veil models` groups by provider with descriptions; `--all` adds
superseded and SDK-only ids.
- `og-veil test` defaulted to `--model gpt-4.1`, which is not a model
the network serves (the enum has gpt-4.1-nano / -mini / -2025-04-14).
Default to claude-haiku-4-5, the Chat app's own free-tier default.
- README gains a model table and drops the superseded claude-sonnet-4-6
from its examples.
Two accuracy gaps in the models docs the previous commit added.
Generated image bytes ride out-of-band and are not signed -- the enclave
hashes the assistant text (see the SDK's response_content_for_hash). The
request is OHTTP-sealed exactly as a text prompt is, so privacy is
unchanged, but `X-OpenGradient-Verified: true` on an image-generation
response attests the exchange, not the pixels. Worth stating plainly in
a README whose whole subject is what the verification covers.
And note the absence of video. Chat's Video Studio (Veo, Kling,
Seedance, Wan) doesn't run over this path: those requests go to
chat-api, which holds the fal/BytePlus/Atlas keys and calls the
providers directly -- no enclave, no OHTTP, no signature. Listing those
models here would advertise a guarantee that doesn't exist, so the
README says so rather than leaving the omission to be guessed at.
@0xadvait

Copy link
Copy Markdown
ContributorAuthor

Follow-up commit, prompted by "what about image and video models?" -- both worth answering in the README rather than leaving implicit.

Image models are in (they were in the first commit): gpt-image-2, gemini-3.1-flash-image, seedream-5.0-lite, seedance-4.5, glm-image, plus three superseded. They belong here because resolveGatewayModel puts the image model id on the same OHTTP /v1/chat/completions request as chat -- identical sealed-and-verified path.

But the guarantee is narrower than the surrounding README implies, so it now says so: generated image bytes ride out-of-band and are not signed. From the SDK's response_content_for_hash:

otherwise it hashes the assistant message text (generated image bytes are excluded -- they ride out-of-band and are not signed)

The request is OHTTP-sealed exactly as a text prompt is, so privacy is unchanged. But X-OpenGradient-Verified: true on an image-generation response attests the exchange, not the pixels. Surfacing image models prominently without saying that would have been an over-claim.

Video models are deliberately out. Chat's Video Studio doesn't run over this path at all:

  • lib/api/videoStudio.ts sends to chat-api /api/v1/video over a plain fetch with a Supabase bearer token
  • nothing under chat-app's app/api references ohttp or tee
  • chat-api holds the fal / BytePlus / Atlas keys and calls those providers directly (provider?: "fal" | "byteplus" | "atlas" -- Veo 3.1, Kling v3 Pro, Seedance 2.0, the Wan 2.x line, Happy Horse)
  • the shape is async submit + poll on a statusUrl, not an OpenAI-compatible call

No HPKE sealing, no attestation, no signature anywhere in that chain. Listing those ids in /v1/models would tell an agent to send them down the verified private path when none exists. Making it real is a gateway change -- video generation proxied in-enclave -- not a veil change. The README now states the absence and the reason.

@adambalogh
adambalogh merged commit 6aaa956 into OpenGradient:mainJul 30, 2026
2 checks passed
Sign up for freeto 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

@0xadvait@adambalogh
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Advertise the full Chat model catalog, not just the SDK enum - #18

Merged
adambalogh merged 2 commits into
OpenGradient:mainfrom
0xadvait:sync-model-catalog-with-chat-app
Jul 30, 2026
Merged

Advertise the full Chat model catalog, not just the SDK enum#18
adambalogh merged 2 commits into
OpenGradient:mainfrom
0xadvait:sync-model-catalog-with-chat-app

Conversation

@0xadvait

Copy link
Copy Markdown
Contributor

Why

/v1/models and og-veil models were both derived from the SDK's TEE_LLM enum. That enum ships on the SDK's release cadence and lags the network. At the pinned opengradient 1.1.1 it is missing ten models the gateway already serves and the Chat app already offers:

gpt-5.6-luna · gpt-5.6-terra · gpt-5.6-sol · claude-sonnet-5 · claude-opus-5 · claude-fable-5 · gemini-3.6-flash · gemini-3.5-flash-lite · grok-4.5 · grok-4.3

So an agent probing /v1/models never learned they existed. Bumping the SDK doesn't fix it -- 1.1.3 is missing the same ten.

What

veil/models.py, a curated catalog mirroring the Chat app's lib/constants/models.ts: same models, same display names, same order within a provider. Ids are the bare wire names (the gateway is sent claude-opus-5, not anthropic/claude-opus-5) -- matching both the SDK (model.split("/")[1]) and the Chat app (modelToGatewayModel).

The enum is still folded in on top of the catalog, so anything a later SDK adds shows up without an edit here, and nothing that used to be listed can regress. 42 ids advertised before, 59 now, none dropped.

Neither list gates anything: the gateway stays the source of truth for what's routable, and Veil forwards whatever model the agent sends. This is a listing, so it errs toward completeness.

Also in here:

  • /v1/models reports the upstream provider as owned_by instead of a flat "opengradient", and keeps superseded ids listed so an agent already configured for one keeps working.
  • og-veil models groups by provider with descriptions instead of printing one flat sorted list; --all adds superseded and SDK-only ids.
  • og-veil test defaulted to --model gpt-4.1, which is not a model the network serves (the enum has gpt-4.1-nano / -mini / -2025-04-14, no bare gpt-4.1). Now defaults to claude-haiku-4-5, the Chat app's own free-tier default -- cheap, fast, and available on every account.
  • README gains a model table, and drops the superseded claude-sonnet-4-6 from its examples.
  • Image-generation models are included, grouped separately. They're called through the same /v1/chat/completions endpoint, which is how the Chat app's Image Studio reaches them.

og-veil models

Models available through OpenGradient Veil:
Anthropic
claude-haiku-4-5 Fast, low-cost replies for everyday tasks
claude-sonnet-5 Balanced all-rounder for writing and code
claude-opus-5 Latest Opus -- top-tier reasoning for complex work
claude-fable-5 Anthropic's most capable model for demanding work
OpenAI
gpt-4.1-nano Cheapest option for simple tasks
gpt-5-mini Fast and affordable for daily use
gpt-5 Powerful all-rounder, previous generation
gpt-5.6-luna Latest GPT model for fast everyday work
gpt-5.6-terra Latest GPT model with strong reasoning at balanced cost
gpt-5.6-sol Most capable latest GPT model
...

Testing

make check and make test both clean. New tests/test_models.py covers the invariants that matter: ids are bare, the catalog covers the ten the enum lagged on, and known_model_ids() is a superset of the enum -- so the listing can only ever grow.

Follow-up, not in this PR

Keeping this catalog and the Chat app's in sync is manual. If the tee-gateway grows a model-registry endpoint, both should read from it instead. The opengradient floor is also still >=1.1.1 while 1.1.3 is out; bumping it gains nothing here (the union already covers it) so I left it alone.

Advait Jayant added 2 commits July 30, 2026 16:16
/v1/models and `og-veil models` were both derived from the SDK's TEE_LLM
enum. That enum ships on the SDK's release cadence and lags the network:
at the pinned 1.1.1 it was missing ten models the gateway already serves
and the Chat app already offers -- the GPT-5.6 trio, Claude Sonnet 5 /
Opus 5 / Fable 5, Gemini 3.6 Flash and 3.5 Flash Lite, and Grok 4.5 /
4.3 -- so an agent probing /v1/models never learned they existed.
Add veil/models.py, a curated catalog mirroring the Chat app's
lib/constants/models.ts: same models, same display names, same order,
with bare wire ids (the gateway is sent `claude-opus-5`, not
`anthropic/claude-opus-5`, matching both the SDK and the Chat app). The
enum is folded in on top, so anything a later SDK adds still shows up
and nothing that used to be listed can regress -- 42 ids advertised
before, 59 now, none dropped.
- /v1/models reports the provider as `owned_by` instead of a flat
"opengradient", and keeps superseded ids listed so an agent already
configured for one keeps working.
- `og-veil models` groups by provider with descriptions; `--all` adds
superseded and SDK-only ids.
- `og-veil test` defaulted to `--model gpt-4.1`, which is not a model
the network serves (the enum has gpt-4.1-nano / -mini / -2025-04-14).
Default to claude-haiku-4-5, the Chat app's own free-tier default.
- README gains a model table and drops the superseded claude-sonnet-4-6
from its examples.
Two accuracy gaps in the models docs the previous commit added.
Generated image bytes ride out-of-band and are not signed -- the enclave
hashes the assistant text (see the SDK's response_content_for_hash). The
request is OHTTP-sealed exactly as a text prompt is, so privacy is
unchanged, but `X-OpenGradient-Verified: true` on an image-generation
response attests the exchange, not the pixels. Worth stating plainly in
a README whose whole subject is what the verification covers.
And note the absence of video. Chat's Video Studio (Veo, Kling,
Seedance, Wan) doesn't run over this path: those requests go to
chat-api, which holds the fal/BytePlus/Atlas keys and calls the
providers directly -- no enclave, no OHTTP, no signature. Listing those
models here would advertise a guarantee that doesn't exist, so the
README says so rather than leaving the omission to be guessed at.
@0xadvait

Copy link
Copy Markdown
ContributorAuthor

Follow-up commit, prompted by "what about image and video models?" -- both worth answering in the README rather than leaving implicit.

Image models are in (they were in the first commit): gpt-image-2, gemini-3.1-flash-image, seedream-5.0-lite, seedance-4.5, glm-image, plus three superseded. They belong here because resolveGatewayModel puts the image model id on the same OHTTP /v1/chat/completions request as chat -- identical sealed-and-verified path.

But the guarantee is narrower than the surrounding README implies, so it now says so: generated image bytes ride out-of-band and are not signed. From the SDK's response_content_for_hash:

otherwise it hashes the assistant message text (generated image bytes are excluded -- they ride out-of-band and are not signed)

The request is OHTTP-sealed exactly as a text prompt is, so privacy is unchanged. But X-OpenGradient-Verified: true on an image-generation response attests the exchange, not the pixels. Surfacing image models prominently without saying that would have been an over-claim.

Video models are deliberately out. Chat's Video Studio doesn't run over this path at all:

  • lib/api/videoStudio.ts sends to chat-api /api/v1/video over a plain fetch with a Supabase bearer token
  • nothing under chat-app's app/api references ohttp or tee
  • chat-api holds the fal / BytePlus / Atlas keys and calls those providers directly (provider?: "fal" | "byteplus" | "atlas" -- Veo 3.1, Kling v3 Pro, Seedance 2.0, the Wan 2.x line, Happy Horse)
  • the shape is async submit + poll on a statusUrl, not an OpenAI-compatible call

No HPKE sealing, no attestation, no signature anywhere in that chain. Listing those ids in /v1/models would tell an agent to send them down the verified private path when none exists. Making it real is a gateway change -- video generation proxied in-enclave -- not a veil change. The README now states the absence and the reason.

@adambalogh
adambalogh merged commit 6aaa956 into OpenGradient:mainJul 30, 2026
2 checks passed
Sign up for freeto 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

@0xadvait@adambalogh
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Advertise the full Chat model catalog, not just the SDK enum - #18

Merged
adambalogh merged 2 commits into
OpenGradient:mainfrom
0xadvait:sync-model-catalog-with-chat-app
Jul 30, 2026
Merged

Advertise the full Chat model catalog, not just the SDK enum#18
adambalogh merged 2 commits into
OpenGradient:mainfrom
0xadvait:sync-model-catalog-with-chat-app

Conversation

@0xadvait

Copy link
Copy Markdown
Contributor

Why

/v1/models and og-veil models were both derived from the SDK's TEE_LLM enum. That enum ships on the SDK's release cadence and lags the network. At the pinned opengradient 1.1.1 it is missing ten models the gateway already serves and the Chat app already offers:

gpt-5.6-luna · gpt-5.6-terra · gpt-5.6-sol · claude-sonnet-5 · claude-opus-5 · claude-fable-5 · gemini-3.6-flash · gemini-3.5-flash-lite · grok-4.5 · grok-4.3

So an agent probing /v1/models never learned they existed. Bumping the SDK doesn't fix it -- 1.1.3 is missing the same ten.

What

veil/models.py, a curated catalog mirroring the Chat app's lib/constants/models.ts: same models, same display names, same order within a provider. Ids are the bare wire names (the gateway is sent claude-opus-5, not anthropic/claude-opus-5) -- matching both the SDK (model.split("/")[1]) and the Chat app (modelToGatewayModel).

The enum is still folded in on top of the catalog, so anything a later SDK adds shows up without an edit here, and nothing that used to be listed can regress. 42 ids advertised before, 59 now, none dropped.

Neither list gates anything: the gateway stays the source of truth for what's routable, and Veil forwards whatever model the agent sends. This is a listing, so it errs toward completeness.

Also in here:

  • /v1/models reports the upstream provider as owned_by instead of a flat "opengradient", and keeps superseded ids listed so an agent already configured for one keeps working.
  • og-veil models groups by provider with descriptions instead of printing one flat sorted list; --all adds superseded and SDK-only ids.
  • og-veil test defaulted to --model gpt-4.1, which is not a model the network serves (the enum has gpt-4.1-nano / -mini / -2025-04-14, no bare gpt-4.1). Now defaults to claude-haiku-4-5, the Chat app's own free-tier default -- cheap, fast, and available on every account.
  • README gains a model table, and drops the superseded claude-sonnet-4-6 from its examples.
  • Image-generation models are included, grouped separately. They're called through the same /v1/chat/completions endpoint, which is how the Chat app's Image Studio reaches them.

og-veil models

Models available through OpenGradient Veil:
Anthropic
claude-haiku-4-5 Fast, low-cost replies for everyday tasks
claude-sonnet-5 Balanced all-rounder for writing and code
claude-opus-5 Latest Opus -- top-tier reasoning for complex work
claude-fable-5 Anthropic's most capable model for demanding work
OpenAI
gpt-4.1-nano Cheapest option for simple tasks
gpt-5-mini Fast and affordable for daily use
gpt-5 Powerful all-rounder, previous generation
gpt-5.6-luna Latest GPT model for fast everyday work
gpt-5.6-terra Latest GPT model with strong reasoning at balanced cost
gpt-5.6-sol Most capable latest GPT model
...

Testing

make check and make test both clean. New tests/test_models.py covers the invariants that matter: ids are bare, the catalog covers the ten the enum lagged on, and known_model_ids() is a superset of the enum -- so the listing can only ever grow.

Follow-up, not in this PR

Keeping this catalog and the Chat app's in sync is manual. If the tee-gateway grows a model-registry endpoint, both should read from it instead. The opengradient floor is also still >=1.1.1 while 1.1.3 is out; bumping it gains nothing here (the union already covers it) so I left it alone.

Advait Jayant added 2 commits July 30, 2026 16:16
/v1/models and `og-veil models` were both derived from the SDK's TEE_LLM
enum. That enum ships on the SDK's release cadence and lags the network:
at the pinned 1.1.1 it was missing ten models the gateway already serves
and the Chat app already offers -- the GPT-5.6 trio, Claude Sonnet 5 /
Opus 5 / Fable 5, Gemini 3.6 Flash and 3.5 Flash Lite, and Grok 4.5 /
4.3 -- so an agent probing /v1/models never learned they existed.
Add veil/models.py, a curated catalog mirroring the Chat app's
lib/constants/models.ts: same models, same display names, same order,
with bare wire ids (the gateway is sent `claude-opus-5`, not
`anthropic/claude-opus-5`, matching both the SDK and the Chat app). The
enum is folded in on top, so anything a later SDK adds still shows up
and nothing that used to be listed can regress -- 42 ids advertised
before, 59 now, none dropped.
- /v1/models reports the provider as `owned_by` instead of a flat
"opengradient", and keeps superseded ids listed so an agent already
configured for one keeps working.
- `og-veil models` groups by provider with descriptions; `--all` adds
superseded and SDK-only ids.
- `og-veil test` defaulted to `--model gpt-4.1`, which is not a model
the network serves (the enum has gpt-4.1-nano / -mini / -2025-04-14).
Default to claude-haiku-4-5, the Chat app's own free-tier default.
- README gains a model table and drops the superseded claude-sonnet-4-6
from its examples.
Two accuracy gaps in the models docs the previous commit added.
Generated image bytes ride out-of-band and are not signed -- the enclave
hashes the assistant text (see the SDK's response_content_for_hash). The
request is OHTTP-sealed exactly as a text prompt is, so privacy is
unchanged, but `X-OpenGradient-Verified: true` on an image-generation
response attests the exchange, not the pixels. Worth stating plainly in
a README whose whole subject is what the verification covers.
And note the absence of video. Chat's Video Studio (Veo, Kling,
Seedance, Wan) doesn't run over this path: those requests go to
chat-api, which holds the fal/BytePlus/Atlas keys and calls the
providers directly -- no enclave, no OHTTP, no signature. Listing those
models here would advertise a guarantee that doesn't exist, so the
README says so rather than leaving the omission to be guessed at.
@0xadvait

Copy link
Copy Markdown
ContributorAuthor

Follow-up commit, prompted by "what about image and video models?" -- both worth answering in the README rather than leaving implicit.

Image models are in (they were in the first commit): gpt-image-2, gemini-3.1-flash-image, seedream-5.0-lite, seedance-4.5, glm-image, plus three superseded. They belong here because resolveGatewayModel puts the image model id on the same OHTTP /v1/chat/completions request as chat -- identical sealed-and-verified path.

But the guarantee is narrower than the surrounding README implies, so it now says so: generated image bytes ride out-of-band and are not signed. From the SDK's response_content_for_hash:

otherwise it hashes the assistant message text (generated image bytes are excluded -- they ride out-of-band and are not signed)

The request is OHTTP-sealed exactly as a text prompt is, so privacy is unchanged. But X-OpenGradient-Verified: true on an image-generation response attests the exchange, not the pixels. Surfacing image models prominently without saying that would have been an over-claim.

Video models are deliberately out. Chat's Video Studio doesn't run over this path at all:

  • lib/api/videoStudio.ts sends to chat-api /api/v1/video over a plain fetch with a Supabase bearer token
  • nothing under chat-app's app/api references ohttp or tee
  • chat-api holds the fal / BytePlus / Atlas keys and calls those providers directly (provider?: "fal" | "byteplus" | "atlas" -- Veo 3.1, Kling v3 Pro, Seedance 2.0, the Wan 2.x line, Happy Horse)
  • the shape is async submit + poll on a statusUrl, not an OpenAI-compatible call

No HPKE sealing, no attestation, no signature anywhere in that chain. Listing those ids in /v1/models would tell an agent to send them down the verified private path when none exists. Making it real is a gateway change -- video generation proxied in-enclave -- not a veil change. The README now states the absence and the reason.

@adambalogh
adambalogh merged commit 6aaa956 into OpenGradient:mainJul 30, 2026
2 checks passed
Sign up for freeto 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

@0xadvait@adambalogh
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Advertise the full Chat model catalog, not just the SDK enum - #18

Merged
adambalogh merged 2 commits into
OpenGradient:mainfrom
0xadvait:sync-model-catalog-with-chat-app
Jul 30, 2026
Merged

Advertise the full Chat model catalog, not just the SDK enum#18
adambalogh merged 2 commits into
OpenGradient:mainfrom
0xadvait:sync-model-catalog-with-chat-app

Conversation

@0xadvait

Copy link
Copy Markdown
Contributor

Why

/v1/models and og-veil models were both derived from the SDK's TEE_LLM enum. That enum ships on the SDK's release cadence and lags the network. At the pinned opengradient 1.1.1 it is missing ten models the gateway already serves and the Chat app already offers:

gpt-5.6-luna · gpt-5.6-terra · gpt-5.6-sol · claude-sonnet-5 · claude-opus-5 · claude-fable-5 · gemini-3.6-flash · gemini-3.5-flash-lite · grok-4.5 · grok-4.3

So an agent probing /v1/models never learned they existed. Bumping the SDK doesn't fix it -- 1.1.3 is missing the same ten.

What

veil/models.py, a curated catalog mirroring the Chat app's lib/constants/models.ts: same models, same display names, same order within a provider. Ids are the bare wire names (the gateway is sent claude-opus-5, not anthropic/claude-opus-5) -- matching both the SDK (model.split("/")[1]) and the Chat app (modelToGatewayModel).

The enum is still folded in on top of the catalog, so anything a later SDK adds shows up without an edit here, and nothing that used to be listed can regress. 42 ids advertised before, 59 now, none dropped.

Neither list gates anything: the gateway stays the source of truth for what's routable, and Veil forwards whatever model the agent sends. This is a listing, so it errs toward completeness.

Also in here:

  • /v1/models reports the upstream provider as owned_by instead of a flat "opengradient", and keeps superseded ids listed so an agent already configured for one keeps working.
  • og-veil models groups by provider with descriptions instead of printing one flat sorted list; --all adds superseded and SDK-only ids.
  • og-veil test defaulted to --model gpt-4.1, which is not a model the network serves (the enum has gpt-4.1-nano / -mini / -2025-04-14, no bare gpt-4.1). Now defaults to claude-haiku-4-5, the Chat app's own free-tier default -- cheap, fast, and available on every account.
  • README gains a model table, and drops the superseded claude-sonnet-4-6 from its examples.
  • Image-generation models are included, grouped separately. They're called through the same /v1/chat/completions endpoint, which is how the Chat app's Image Studio reaches them.

og-veil models

Models available through OpenGradient Veil:
Anthropic
claude-haiku-4-5 Fast, low-cost replies for everyday tasks
claude-sonnet-5 Balanced all-rounder for writing and code
claude-opus-5 Latest Opus -- top-tier reasoning for complex work
claude-fable-5 Anthropic's most capable model for demanding work
OpenAI
gpt-4.1-nano Cheapest option for simple tasks
gpt-5-mini Fast and affordable for daily use
gpt-5 Powerful all-rounder, previous generation
gpt-5.6-luna Latest GPT model for fast everyday work
gpt-5.6-terra Latest GPT model with strong reasoning at balanced cost
gpt-5.6-sol Most capable latest GPT model
...

Testing

make check and make test both clean. New tests/test_models.py covers the invariants that matter: ids are bare, the catalog covers the ten the enum lagged on, and known_model_ids() is a superset of the enum -- so the listing can only ever grow.

Follow-up, not in this PR

Keeping this catalog and the Chat app's in sync is manual. If the tee-gateway grows a model-registry endpoint, both should read from it instead. The opengradient floor is also still >=1.1.1 while 1.1.3 is out; bumping it gains nothing here (the union already covers it) so I left it alone.

Advait Jayant added 2 commits July 30, 2026 16:16
/v1/models and `og-veil models` were both derived from the SDK's TEE_LLM
enum. That enum ships on the SDK's release cadence and lags the network:
at the pinned 1.1.1 it was missing ten models the gateway already serves
and the Chat app already offers -- the GPT-5.6 trio, Claude Sonnet 5 /
Opus 5 / Fable 5, Gemini 3.6 Flash and 3.5 Flash Lite, and Grok 4.5 /
4.3 -- so an agent probing /v1/models never learned they existed.
Add veil/models.py, a curated catalog mirroring the Chat app's
lib/constants/models.ts: same models, same display names, same order,
with bare wire ids (the gateway is sent `claude-opus-5`, not
`anthropic/claude-opus-5`, matching both the SDK and the Chat app). The
enum is folded in on top, so anything a later SDK adds still shows up
and nothing that used to be listed can regress -- 42 ids advertised
before, 59 now, none dropped.
- /v1/models reports the provider as `owned_by` instead of a flat
"opengradient", and keeps superseded ids listed so an agent already
configured for one keeps working.
- `og-veil models` groups by provider with descriptions; `--all` adds
superseded and SDK-only ids.
- `og-veil test` defaulted to `--model gpt-4.1`, which is not a model
the network serves (the enum has gpt-4.1-nano / -mini / -2025-04-14).
Default to claude-haiku-4-5, the Chat app's own free-tier default.
- README gains a model table and drops the superseded claude-sonnet-4-6
from its examples.
Two accuracy gaps in the models docs the previous commit added.
Generated image bytes ride out-of-band and are not signed -- the enclave
hashes the assistant text (see the SDK's response_content_for_hash). The
request is OHTTP-sealed exactly as a text prompt is, so privacy is
unchanged, but `X-OpenGradient-Verified: true` on an image-generation
response attests the exchange, not the pixels. Worth stating plainly in
a README whose whole subject is what the verification covers.
And note the absence of video. Chat's Video Studio (Veo, Kling,
Seedance, Wan) doesn't run over this path: those requests go to
chat-api, which holds the fal/BytePlus/Atlas keys and calls the
providers directly -- no enclave, no OHTTP, no signature. Listing those
models here would advertise a guarantee that doesn't exist, so the
README says so rather than leaving the omission to be guessed at.
@0xadvait

Copy link
Copy Markdown
ContributorAuthor

Follow-up commit, prompted by "what about image and video models?" -- both worth answering in the README rather than leaving implicit.

Image models are in (they were in the first commit): gpt-image-2, gemini-3.1-flash-image, seedream-5.0-lite, seedance-4.5, glm-image, plus three superseded. They belong here because resolveGatewayModel puts the image model id on the same OHTTP /v1/chat/completions request as chat -- identical sealed-and-verified path.

But the guarantee is narrower than the surrounding README implies, so it now says so: generated image bytes ride out-of-band and are not signed. From the SDK's response_content_for_hash:

otherwise it hashes the assistant message text (generated image bytes are excluded -- they ride out-of-band and are not signed)

The request is OHTTP-sealed exactly as a text prompt is, so privacy is unchanged. But X-OpenGradient-Verified: true on an image-generation response attests the exchange, not the pixels. Surfacing image models prominently without saying that would have been an over-claim.

Video models are deliberately out. Chat's Video Studio doesn't run over this path at all:

  • lib/api/videoStudio.ts sends to chat-api /api/v1/video over a plain fetch with a Supabase bearer token
  • nothing under chat-app's app/api references ohttp or tee
  • chat-api holds the fal / BytePlus / Atlas keys and calls those providers directly (provider?: "fal" | "byteplus" | "atlas" -- Veo 3.1, Kling v3 Pro, Seedance 2.0, the Wan 2.x line, Happy Horse)
  • the shape is async submit + poll on a statusUrl, not an OpenAI-compatible call

No HPKE sealing, no attestation, no signature anywhere in that chain. Listing those ids in /v1/models would tell an agent to send them down the verified private path when none exists. Making it real is a gateway change -- video generation proxied in-enclave -- not a veil change. The README now states the absence and the reason.

@adambalogh
adambalogh merged commit 6aaa956 into OpenGradient:mainJul 30, 2026
2 checks passed
Sign up for freeto 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

@0xadvait@adambalogh
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Advertise the full Chat model catalog, not just the SDK enum - #18

Merged
adambalogh merged 2 commits into
OpenGradient:mainfrom
0xadvait:sync-model-catalog-with-chat-app
Jul 30, 2026
Merged

Advertise the full Chat model catalog, not just the SDK enum#18
adambalogh merged 2 commits into
OpenGradient:mainfrom
0xadvait:sync-model-catalog-with-chat-app

Conversation

@0xadvait

Copy link
Copy Markdown
Contributor

Why

/v1/models and og-veil models were both derived from the SDK's TEE_LLM enum. That enum ships on the SDK's release cadence and lags the network. At the pinned opengradient 1.1.1 it is missing ten models the gateway already serves and the Chat app already offers:

gpt-5.6-luna · gpt-5.6-terra · gpt-5.6-sol · claude-sonnet-5 · claude-opus-5 · claude-fable-5 · gemini-3.6-flash · gemini-3.5-flash-lite · grok-4.5 · grok-4.3

So an agent probing /v1/models never learned they existed. Bumping the SDK doesn't fix it -- 1.1.3 is missing the same ten.

What

veil/models.py, a curated catalog mirroring the Chat app's lib/constants/models.ts: same models, same display names, same order within a provider. Ids are the bare wire names (the gateway is sent claude-opus-5, not anthropic/claude-opus-5) -- matching both the SDK (model.split("/")[1]) and the Chat app (modelToGatewayModel).

The enum is still folded in on top of the catalog, so anything a later SDK adds shows up without an edit here, and nothing that used to be listed can regress. 42 ids advertised before, 59 now, none dropped.

Neither list gates anything: the gateway stays the source of truth for what's routable, and Veil forwards whatever model the agent sends. This is a listing, so it errs toward completeness.

Also in here:

  • /v1/models reports the upstream provider as owned_by instead of a flat "opengradient", and keeps superseded ids listed so an agent already configured for one keeps working.
  • og-veil models groups by provider with descriptions instead of printing one flat sorted list; --all adds superseded and SDK-only ids.
  • og-veil test defaulted to --model gpt-4.1, which is not a model the network serves (the enum has gpt-4.1-nano / -mini / -2025-04-14, no bare gpt-4.1). Now defaults to claude-haiku-4-5, the Chat app's own free-tier default -- cheap, fast, and available on every account.
  • README gains a model table, and drops the superseded claude-sonnet-4-6 from its examples.
  • Image-generation models are included, grouped separately. They're called through the same /v1/chat/completions endpoint, which is how the Chat app's Image Studio reaches them.

og-veil models

Models available through OpenGradient Veil:
Anthropic
claude-haiku-4-5 Fast, low-cost replies for everyday tasks
claude-sonnet-5 Balanced all-rounder for writing and code
claude-opus-5 Latest Opus -- top-tier reasoning for complex work
claude-fable-5 Anthropic's most capable model for demanding work
OpenAI
gpt-4.1-nano Cheapest option for simple tasks
gpt-5-mini Fast and affordable for daily use
gpt-5 Powerful all-rounder, previous generation
gpt-5.6-luna Latest GPT model for fast everyday work
gpt-5.6-terra Latest GPT model with strong reasoning at balanced cost
gpt-5.6-sol Most capable latest GPT model
...

Testing

make check and make test both clean. New tests/test_models.py covers the invariants that matter: ids are bare, the catalog covers the ten the enum lagged on, and known_model_ids() is a superset of the enum -- so the listing can only ever grow.

Follow-up, not in this PR

Keeping this catalog and the Chat app's in sync is manual. If the tee-gateway grows a model-registry endpoint, both should read from it instead. The opengradient floor is also still >=1.1.1 while 1.1.3 is out; bumping it gains nothing here (the union already covers it) so I left it alone.

Advait Jayant added 2 commits July 30, 2026 16:16
/v1/models and `og-veil models` were both derived from the SDK's TEE_LLM
enum. That enum ships on the SDK's release cadence and lags the network:
at the pinned 1.1.1 it was missing ten models the gateway already serves
and the Chat app already offers -- the GPT-5.6 trio, Claude Sonnet 5 /
Opus 5 / Fable 5, Gemini 3.6 Flash and 3.5 Flash Lite, and Grok 4.5 /
4.3 -- so an agent probing /v1/models never learned they existed.
Add veil/models.py, a curated catalog mirroring the Chat app's
lib/constants/models.ts: same models, same display names, same order,
with bare wire ids (the gateway is sent `claude-opus-5`, not
`anthropic/claude-opus-5`, matching both the SDK and the Chat app). The
enum is folded in on top, so anything a later SDK adds still shows up
and nothing that used to be listed can regress -- 42 ids advertised
before, 59 now, none dropped.
- /v1/models reports the provider as `owned_by` instead of a flat
"opengradient", and keeps superseded ids listed so an agent already
configured for one keeps working.
- `og-veil models` groups by provider with descriptions; `--all` adds
superseded and SDK-only ids.
- `og-veil test` defaulted to `--model gpt-4.1`, which is not a model
the network serves (the enum has gpt-4.1-nano / -mini / -2025-04-14).
Default to claude-haiku-4-5, the Chat app's own free-tier default.
- README gains a model table and drops the superseded claude-sonnet-4-6
from its examples.
Two accuracy gaps in the models docs the previous commit added.
Generated image bytes ride out-of-band and are not signed -- the enclave
hashes the assistant text (see the SDK's response_content_for_hash). The
request is OHTTP-sealed exactly as a text prompt is, so privacy is
unchanged, but `X-OpenGradient-Verified: true` on an image-generation
response attests the exchange, not the pixels. Worth stating plainly in
a README whose whole subject is what the verification covers.
And note the absence of video. Chat's Video Studio (Veo, Kling,
Seedance, Wan) doesn't run over this path: those requests go to
chat-api, which holds the fal/BytePlus/Atlas keys and calls the
providers directly -- no enclave, no OHTTP, no signature. Listing those
models here would advertise a guarantee that doesn't exist, so the
README says so rather than leaving the omission to be guessed at.
@0xadvait

Copy link
Copy Markdown
ContributorAuthor

Follow-up commit, prompted by "what about image and video models?" -- both worth answering in the README rather than leaving implicit.

Image models are in (they were in the first commit): gpt-image-2, gemini-3.1-flash-image, seedream-5.0-lite, seedance-4.5, glm-image, plus three superseded. They belong here because resolveGatewayModel puts the image model id on the same OHTTP /v1/chat/completions request as chat -- identical sealed-and-verified path.

But the guarantee is narrower than the surrounding README implies, so it now says so: generated image bytes ride out-of-band and are not signed. From the SDK's response_content_for_hash:

otherwise it hashes the assistant message text (generated image bytes are excluded -- they ride out-of-band and are not signed)

The request is OHTTP-sealed exactly as a text prompt is, so privacy is unchanged. But X-OpenGradient-Verified: true on an image-generation response attests the exchange, not the pixels. Surfacing image models prominently without saying that would have been an over-claim.

Video models are deliberately out. Chat's Video Studio doesn't run over this path at all:

  • lib/api/videoStudio.ts sends to chat-api /api/v1/video over a plain fetch with a Supabase bearer token
  • nothing under chat-app's app/api references ohttp or tee
  • chat-api holds the fal / BytePlus / Atlas keys and calls those providers directly (provider?: "fal" | "byteplus" | "atlas" -- Veo 3.1, Kling v3 Pro, Seedance 2.0, the Wan 2.x line, Happy Horse)
  • the shape is async submit + poll on a statusUrl, not an OpenAI-compatible call

No HPKE sealing, no attestation, no signature anywhere in that chain. Listing those ids in /v1/models would tell an agent to send them down the verified private path when none exists. Making it real is a gateway change -- video generation proxied in-enclave -- not a veil change. The README now states the absence and the reason.

@adambalogh
adambalogh merged commit 6aaa956 into OpenGradient:mainJul 30, 2026
2 checks passed
Sign up for freeto 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

@0xadvait@adambalogh
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Advertise the full Chat model catalog, not just the SDK enum - #18

Merged
adambalogh merged 2 commits into
OpenGradient:mainfrom
0xadvait:sync-model-catalog-with-chat-app
Jul 30, 2026
Merged

Advertise the full Chat model catalog, not just the SDK enum#18
adambalogh merged 2 commits into
OpenGradient:mainfrom
0xadvait:sync-model-catalog-with-chat-app

Conversation

@0xadvait

Copy link
Copy Markdown
Contributor

Why

/v1/models and og-veil models were both derived from the SDK's TEE_LLM enum. That enum ships on the SDK's release cadence and lags the network. At the pinned opengradient 1.1.1 it is missing ten models the gateway already serves and the Chat app already offers:

gpt-5.6-luna · gpt-5.6-terra · gpt-5.6-sol · claude-sonnet-5 · claude-opus-5 · claude-fable-5 · gemini-3.6-flash · gemini-3.5-flash-lite · grok-4.5 · grok-4.3

So an agent probing /v1/models never learned they existed. Bumping the SDK doesn't fix it -- 1.1.3 is missing the same ten.

What

veil/models.py, a curated catalog mirroring the Chat app's lib/constants/models.ts: same models, same display names, same order within a provider. Ids are the bare wire names (the gateway is sent claude-opus-5, not anthropic/claude-opus-5) -- matching both the SDK (model.split("/")[1]) and the Chat app (modelToGatewayModel).

The enum is still folded in on top of the catalog, so anything a later SDK adds shows up without an edit here, and nothing that used to be listed can regress. 42 ids advertised before, 59 now, none dropped.

Neither list gates anything: the gateway stays the source of truth for what's routable, and Veil forwards whatever model the agent sends. This is a listing, so it errs toward completeness.

Also in here:

  • /v1/models reports the upstream provider as owned_by instead of a flat "opengradient", and keeps superseded ids listed so an agent already configured for one keeps working.
  • og-veil models groups by provider with descriptions instead of printing one flat sorted list; --all adds superseded and SDK-only ids.
  • og-veil test defaulted to --model gpt-4.1, which is not a model the network serves (the enum has gpt-4.1-nano / -mini / -2025-04-14, no bare gpt-4.1). Now defaults to claude-haiku-4-5, the Chat app's own free-tier default -- cheap, fast, and available on every account.
  • README gains a model table, and drops the superseded claude-sonnet-4-6 from its examples.
  • Image-generation models are included, grouped separately. They're called through the same /v1/chat/completions endpoint, which is how the Chat app's Image Studio reaches them.

og-veil models

Models available through OpenGradient Veil:
Anthropic
claude-haiku-4-5 Fast, low-cost replies for everyday tasks
claude-sonnet-5 Balanced all-rounder for writing and code
claude-opus-5 Latest Opus -- top-tier reasoning for complex work
claude-fable-5 Anthropic's most capable model for demanding work
OpenAI
gpt-4.1-nano Cheapest option for simple tasks
gpt-5-mini Fast and affordable for daily use
gpt-5 Powerful all-rounder, previous generation
gpt-5.6-luna Latest GPT model for fast everyday work
gpt-5.6-terra Latest GPT model with strong reasoning at balanced cost
gpt-5.6-sol Most capable latest GPT model
...

Testing

make check and make test both clean. New tests/test_models.py covers the invariants that matter: ids are bare, the catalog covers the ten the enum lagged on, and known_model_ids() is a superset of the enum -- so the listing can only ever grow.

Follow-up, not in this PR

Keeping this catalog and the Chat app's in sync is manual. If the tee-gateway grows a model-registry endpoint, both should read from it instead. The opengradient floor is also still >=1.1.1 while 1.1.3 is out; bumping it gains nothing here (the union already covers it) so I left it alone.

Advait Jayant added 2 commits July 30, 2026 16:16
/v1/models and `og-veil models` were both derived from the SDK's TEE_LLM
enum. That enum ships on the SDK's release cadence and lags the network:
at the pinned 1.1.1 it was missing ten models the gateway already serves
and the Chat app already offers -- the GPT-5.6 trio, Claude Sonnet 5 /
Opus 5 / Fable 5, Gemini 3.6 Flash and 3.5 Flash Lite, and Grok 4.5 /
4.3 -- so an agent probing /v1/models never learned they existed.
Add veil/models.py, a curated catalog mirroring the Chat app's
lib/constants/models.ts: same models, same display names, same order,
with bare wire ids (the gateway is sent `claude-opus-5`, not
`anthropic/claude-opus-5`, matching both the SDK and the Chat app). The
enum is folded in on top, so anything a later SDK adds still shows up
and nothing that used to be listed can regress -- 42 ids advertised
before, 59 now, none dropped.
- /v1/models reports the provider as `owned_by` instead of a flat
"opengradient", and keeps superseded ids listed so an agent already
configured for one keeps working.
- `og-veil models` groups by provider with descriptions; `--all` adds
superseded and SDK-only ids.
- `og-veil test` defaulted to `--model gpt-4.1`, which is not a model
the network serves (the enum has gpt-4.1-nano / -mini / -2025-04-14).
Default to claude-haiku-4-5, the Chat app's own free-tier default.
- README gains a model table and drops the superseded claude-sonnet-4-6
from its examples.
Two accuracy gaps in the models docs the previous commit added.
Generated image bytes ride out-of-band and are not signed -- the enclave
hashes the assistant text (see the SDK's response_content_for_hash). The
request is OHTTP-sealed exactly as a text prompt is, so privacy is
unchanged, but `X-OpenGradient-Verified: true` on an image-generation
response attests the exchange, not the pixels. Worth stating plainly in
a README whose whole subject is what the verification covers.
And note the absence of video. Chat's Video Studio (Veo, Kling,
Seedance, Wan) doesn't run over this path: those requests go to
chat-api, which holds the fal/BytePlus/Atlas keys and calls the
providers directly -- no enclave, no OHTTP, no signature. Listing those
models here would advertise a guarantee that doesn't exist, so the
README says so rather than leaving the omission to be guessed at.
@0xadvait

Copy link
Copy Markdown
ContributorAuthor

Follow-up commit, prompted by "what about image and video models?" -- both worth answering in the README rather than leaving implicit.

Image models are in (they were in the first commit): gpt-image-2, gemini-3.1-flash-image, seedream-5.0-lite, seedance-4.5, glm-image, plus three superseded. They belong here because resolveGatewayModel puts the image model id on the same OHTTP /v1/chat/completions request as chat -- identical sealed-and-verified path.

But the guarantee is narrower than the surrounding README implies, so it now says so: generated image bytes ride out-of-band and are not signed. From the SDK's response_content_for_hash:

otherwise it hashes the assistant message text (generated image bytes are excluded -- they ride out-of-band and are not signed)

The request is OHTTP-sealed exactly as a text prompt is, so privacy is unchanged. But X-OpenGradient-Verified: true on an image-generation response attests the exchange, not the pixels. Surfacing image models prominently without saying that would have been an over-claim.

Video models are deliberately out. Chat's Video Studio doesn't run over this path at all:

  • lib/api/videoStudio.ts sends to chat-api /api/v1/video over a plain fetch with a Supabase bearer token
  • nothing under chat-app's app/api references ohttp or tee
  • chat-api holds the fal / BytePlus / Atlas keys and calls those providers directly (provider?: "fal" | "byteplus" | "atlas" -- Veo 3.1, Kling v3 Pro, Seedance 2.0, the Wan 2.x line, Happy Horse)
  • the shape is async submit + poll on a statusUrl, not an OpenAI-compatible call

No HPKE sealing, no attestation, no signature anywhere in that chain. Listing those ids in /v1/models would tell an agent to send them down the verified private path when none exists. Making it real is a gateway change -- video generation proxied in-enclave -- not a veil change. The README now states the absence and the reason.

@adambalogh
adambalogh merged commit 6aaa956 into OpenGradient:mainJul 30, 2026
2 checks passed
Sign up for freeto 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

@0xadvait@adambalogh
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Advertise the full Chat model catalog, not just the SDK enum - #18

Merged
adambalogh merged 2 commits into
OpenGradient:mainfrom
0xadvait:sync-model-catalog-with-chat-app
Jul 30, 2026
Merged

Advertise the full Chat model catalog, not just the SDK enum#18
adambalogh merged 2 commits into
OpenGradient:mainfrom
0xadvait:sync-model-catalog-with-chat-app

Conversation

@0xadvait

Copy link
Copy Markdown
Contributor

Why

/v1/models and og-veil models were both derived from the SDK's TEE_LLM enum. That enum ships on the SDK's release cadence and lags the network. At the pinned opengradient 1.1.1 it is missing ten models the gateway already serves and the Chat app already offers:

gpt-5.6-luna · gpt-5.6-terra · gpt-5.6-sol · claude-sonnet-5 · claude-opus-5 · claude-fable-5 · gemini-3.6-flash · gemini-3.5-flash-lite · grok-4.5 · grok-4.3

So an agent probing /v1/models never learned they existed. Bumping the SDK doesn't fix it -- 1.1.3 is missing the same ten.

What

veil/models.py, a curated catalog mirroring the Chat app's lib/constants/models.ts: same models, same display names, same order within a provider. Ids are the bare wire names (the gateway is sent claude-opus-5, not anthropic/claude-opus-5) -- matching both the SDK (model.split("/")[1]) and the Chat app (modelToGatewayModel).

The enum is still folded in on top of the catalog, so anything a later SDK adds shows up without an edit here, and nothing that used to be listed can regress. 42 ids advertised before, 59 now, none dropped.

Neither list gates anything: the gateway stays the source of truth for what's routable, and Veil forwards whatever model the agent sends. This is a listing, so it errs toward completeness.

Also in here:

  • /v1/models reports the upstream provider as owned_by instead of a flat "opengradient", and keeps superseded ids listed so an agent already configured for one keeps working.
  • og-veil models groups by provider with descriptions instead of printing one flat sorted list; --all adds superseded and SDK-only ids.
  • og-veil test defaulted to --model gpt-4.1, which is not a model the network serves (the enum has gpt-4.1-nano / -mini / -2025-04-14, no bare gpt-4.1). Now defaults to claude-haiku-4-5, the Chat app's own free-tier default -- cheap, fast, and available on every account.
  • README gains a model table, and drops the superseded claude-sonnet-4-6 from its examples.
  • Image-generation models are included, grouped separately. They're called through the same /v1/chat/completions endpoint, which is how the Chat app's Image Studio reaches them.

og-veil models

Models available through OpenGradient Veil:
Anthropic
claude-haiku-4-5 Fast, low-cost replies for everyday tasks
claude-sonnet-5 Balanced all-rounder for writing and code
claude-opus-5 Latest Opus -- top-tier reasoning for complex work
claude-fable-5 Anthropic's most capable model for demanding work
OpenAI
gpt-4.1-nano Cheapest option for simple tasks
gpt-5-mini Fast and affordable for daily use
gpt-5 Powerful all-rounder, previous generation
gpt-5.6-luna Latest GPT model for fast everyday work
gpt-5.6-terra Latest GPT model with strong reasoning at balanced cost
gpt-5.6-sol Most capable latest GPT model
...

Testing

make check and make test both clean. New tests/test_models.py covers the invariants that matter: ids are bare, the catalog covers the ten the enum lagged on, and known_model_ids() is a superset of the enum -- so the listing can only ever grow.

Follow-up, not in this PR

Keeping this catalog and the Chat app's in sync is manual. If the tee-gateway grows a model-registry endpoint, both should read from it instead. The opengradient floor is also still >=1.1.1 while 1.1.3 is out; bumping it gains nothing here (the union already covers it) so I left it alone.

Advait Jayant added 2 commits July 30, 2026 16:16
/v1/models and `og-veil models` were both derived from the SDK's TEE_LLM
enum. That enum ships on the SDK's release cadence and lags the network:
at the pinned 1.1.1 it was missing ten models the gateway already serves
and the Chat app already offers -- the GPT-5.6 trio, Claude Sonnet 5 /
Opus 5 / Fable 5, Gemini 3.6 Flash and 3.5 Flash Lite, and Grok 4.5 /
4.3 -- so an agent probing /v1/models never learned they existed.
Add veil/models.py, a curated catalog mirroring the Chat app's
lib/constants/models.ts: same models, same display names, same order,
with bare wire ids (the gateway is sent `claude-opus-5`, not
`anthropic/claude-opus-5`, matching both the SDK and the Chat app). The
enum is folded in on top, so anything a later SDK adds still shows up
and nothing that used to be listed can regress -- 42 ids advertised
before, 59 now, none dropped.
- /v1/models reports the provider as `owned_by` instead of a flat
"opengradient", and keeps superseded ids listed so an agent already
configured for one keeps working.
- `og-veil models` groups by provider with descriptions; `--all` adds
superseded and SDK-only ids.
- `og-veil test` defaulted to `--model gpt-4.1`, which is not a model
the network serves (the enum has gpt-4.1-nano / -mini / -2025-04-14).
Default to claude-haiku-4-5, the Chat app's own free-tier default.
- README gains a model table and drops the superseded claude-sonnet-4-6
from its examples.
Two accuracy gaps in the models docs the previous commit added.
Generated image bytes ride out-of-band and are not signed -- the enclave
hashes the assistant text (see the SDK's response_content_for_hash). The
request is OHTTP-sealed exactly as a text prompt is, so privacy is
unchanged, but `X-OpenGradient-Verified: true` on an image-generation
response attests the exchange, not the pixels. Worth stating plainly in
a README whose whole subject is what the verification covers.
And note the absence of video. Chat's Video Studio (Veo, Kling,
Seedance, Wan) doesn't run over this path: those requests go to
chat-api, which holds the fal/BytePlus/Atlas keys and calls the
providers directly -- no enclave, no OHTTP, no signature. Listing those
models here would advertise a guarantee that doesn't exist, so the
README says so rather than leaving the omission to be guessed at.
@0xadvait

Copy link
Copy Markdown
ContributorAuthor

Follow-up commit, prompted by "what about image and video models?" -- both worth answering in the README rather than leaving implicit.

Image models are in (they were in the first commit): gpt-image-2, gemini-3.1-flash-image, seedream-5.0-lite, seedance-4.5, glm-image, plus three superseded. They belong here because resolveGatewayModel puts the image model id on the same OHTTP /v1/chat/completions request as chat -- identical sealed-and-verified path.

But the guarantee is narrower than the surrounding README implies, so it now says so: generated image bytes ride out-of-band and are not signed. From the SDK's response_content_for_hash:

otherwise it hashes the assistant message text (generated image bytes are excluded -- they ride out-of-band and are not signed)

The request is OHTTP-sealed exactly as a text prompt is, so privacy is unchanged. But X-OpenGradient-Verified: true on an image-generation response attests the exchange, not the pixels. Surfacing image models prominently without saying that would have been an over-claim.

Video models are deliberately out. Chat's Video Studio doesn't run over this path at all:

  • lib/api/videoStudio.ts sends to chat-api /api/v1/video over a plain fetch with a Supabase bearer token
  • nothing under chat-app's app/api references ohttp or tee
  • chat-api holds the fal / BytePlus / Atlas keys and calls those providers directly (provider?: "fal" | "byteplus" | "atlas" -- Veo 3.1, Kling v3 Pro, Seedance 2.0, the Wan 2.x line, Happy Horse)
  • the shape is async submit + poll on a statusUrl, not an OpenAI-compatible call

No HPKE sealing, no attestation, no signature anywhere in that chain. Listing those ids in /v1/models would tell an agent to send them down the verified private path when none exists. Making it real is a gateway change -- video generation proxied in-enclave -- not a veil change. The README now states the absence and the reason.

@adambalogh
adambalogh merged commit 6aaa956 into OpenGradient:mainJul 30, 2026
2 checks passed
Sign up for freeto 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

@0xadvait@adambalogh