Skip to content

feat(providers): add GreenPT as an OpenAI-compatible provider - #13024

Merged
diegosouzapw merged 2 commits into
diegosouzapw:release/v3.8.51from
ntdatt812:feat/12986-greenpt
Sep 10, 2026
Merged

diegosouzapw merged 2 commits into
diegosouzapw:release/v3.8.51from
ntdatt812:feat/12986-greenpt

Conversation

@ntdatt812

Copy link
Copy Markdown
Contributor

Closes #12986.

Registry entry in the mnn-ai / meganova-ai shape — no executor, no translator, passthroughModels: true so the catalog comes from the live upstream rather than a hardcoded list.

What I verified, and what I did not

The request asks for live verification with a real key. I have no GreenPT account, so here is exactly what was checked:

$ curl -o /dev/null -w "%{http_code}" https://api.greenpt.ai/v1/models
401

The endpoint exists and is key-gated — the shape passthroughModels needs. Not verified: catalog contents, a streaming completion, a tool call.

So the entry claims only what was established:

value why
models [] not guessed; discovery is left to the upstream
tool/vision capability not declared #12986 asks that tool support be advertised only if exercised
hasFree false the docs describe a free API subscription with pay-per-token inference — a billing shape, not a free allowance, and hasFree drives a "Free" badge in the picker
freeNote states exactly that no more than the docs say

One deliberate omission

GreenPT is not added to AGGREGATOR_PROVIDER_IDS. The sibling entries this was modelled on are routers; GreenPT is an inference provider, and listing it there would misdescribe it in the UI.

That set is not what gates passthrough validation, which is easy to assume from the neighbours: PASSTHROUGH_PROVIDERS is derived from passthroughModels, and that is what isValidModel consults. There is a test for each half — that an unknown model name is accepted, and that the id is absent from the aggregator set — so neither can be broken silently.

Verification

tests/unit/greenpt-provider.test.ts — 7 passed, covering the registry entry, the wiring through REGISTRY / PROVIDER_ENDPOINTS / APIKEY_PROVIDERS / getExecutor, and each of the claims above.

Pre-commit gates ran clean: prettier, eslint, docs-sync, check:any-budget:t11, tracked-artifacts. Changelog fragment included.

Happy to add capability flags in a follow-up if someone with a key can exercise tools and streaming.

ntdatt812 and others added 2 commits September 10, 2026 18:10
…ouzapw#12986)

Registry entry in the mnn-ai / meganova-ai shape: no executor, no
translator, `passthroughModels: true` so the catalog comes from the live
upstream rather than a hardcoded list.

What was verified here, and what was not, since the request asks for a
live check I could not fully make:

  GET https://api.greenpt.ai/v1/models -> HTTP 401

That is the endpoint existing and being key-gated, which is the shape
passthrough needs. No account was available, so the catalog contents, a
streaming completion and a tool call are unverified.

The entry says only what was verified. `models` is empty rather than
guessed; no tool or vision capability is declared, because diegosouzapw#12986 asks
that tool support be advertised only if exercised; and `hasFree` is false
-- the docs describe a free API subscription with pay-per-token
inference, which is a billing shape and not a free allowance, and
`hasFree` drives a "Free" badge in the picker.

GreenPT is deliberately not added to AGGREGATOR_PROVIDER_IDS. It is an
inference provider rather than a router over other providers, and
passthrough validation does not depend on that set: PASSTHROUGH_PROVIDERS
is derived from `passthroughModels`, which is what isValidModel consults.
A test pins both halves of that.

7 tests pass in tests/unit/greenpt-provider.test.ts.
check:file-size freezes src/shared/constants/providers/apikey/gateways.ts at
1462 lines, so a new catalog entry fails the gate on arrival. This PR's entry
and diegosouzapw#13025's take it to 1502 together.

Annotated rather than split: the file is declarative provider data, already
divided into six family files under apikey/, and every previous gateway entry
took the same route (diegosouzapw#11786 seekai, diegosouzapw#10987 logfare, diegosouzapw#10668 tabitoken, diegosouzapw#10531
freebuff, diegosouzapw#11631 1min.ai). Splitting a catalog for two entries would break the
semantic-families rule instead of helping.

The bump covers both entries because they land in the same batch.
@diegosouzapw
diegosouzapw merged commit 2b9e7fb into diegosouzapw:release/v3.8.51 Sep 10, 2026
9 of 16 checks passed
diegosouzapw pushed a commit that referenced this pull request Sep 10, 2026
#13025)

Rebased onto the release tip after #13024 landed: both PRs extend the same three registration files, so the sibling merge turned this into a conflict. The resolution is additive — both catalog entries kept, both registry imports kept, both base URLs kept — and EURouter stays in AGGREGATOR_PROVIDER_IDS while GreenPT stays out, exactly as each PR argued. 14 provider tests pass on the rebased branch and the file-size gate is green under the annotated rebaseline.

Thank you for re-checking the endpoint live instead of trusting the report, and for the sovereignty caveat. Naming the upstreams from EURouter's own catalog — Claude Sonnet served by AWS Bedrock, 19 models owned by openai — and then writing an apiHint that says routing rather than residency is the kind of care that keeps a provider entry honest. The test asserting the copy contains none of "residency", "stays in the EU", "EU-hosted" or "sovereign" is a good guard against that drifting later.
diegosouzapw added a commit that referenced this pull request Sep 11, 2026
…ount 356 to 358

EURouter (#13025) and GreenPT (#13024) took the live provider modules to
358 unique IDs, so check:docs-all reported 7 STRICT drifts on the tip and
the Release-Green run 34532113514 flagged 'Docs sync + fabricated-docs
(strict)' as a HARD failure.

- docs/reference/PROVIDER_REFERENCE.md: regenerated with the official
  generator (npm run gen:provider-reference), not hand-edited.
- 4 diagrams + 2 tier-flow images: the embedded '356 providers' label.
- AGENTS.md, llm.txt (+ its 50 i18n mirrors) and package.json's
  description: the numeral only, so the mirrors keep matching root.

Only the count changes — no prose, no instruction text. Validation:
npm run check:docs-all goes from '7 STRICT drift(s)' to PASS (docs-sync,
mirrors for 50 locales, doc-links and fabricated-docs all green).

Refs #12732
diegosouzapw added a commit that referenced this pull request Sep 11, 2026
Four base-reds that appeared on the tip today, none owned by any open PR:

- providers-constants-split / provider-node-reserved-prefix: GreenPT (#13024)
  and EURouter (#13025) move the totals 238 -> 240 and 408 -> 410.
- provider-translate-path-golden: same two providers, regenerated with
  UPDATE_GOLDEN=1; the snapshot delta is purely additive.
- glm-sse-transform-arity: #12925 declared the buffer-size slot GLM had been
  filling since #12179. The invariant is unchanged — the value must land in a
  real parameter, never a dropped positional — so the guard now checks it from
  the helper side and requires the named constant at the call site instead of
  a magic literal.
- injection-guard-scan-bound-3932: #13104 split the 16 KB budget between head
  and tail, so 'outside the window' is now the middle of an oversized body,
  not its end. The 16 KB ceiling these cases protect is untouched.

Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com>
JJAbrams-eng added a commit to JJAbrams-eng/OmniRoute that referenced this pull request Sep 22, 2026
Path-space bug (checkout path contains a space, "Claude Code") hit three
more files the same way as the earlier webdav/zai fixes: new URL(...).pathname
double-decodes on macOS with spaces in the path. Switched to fileURLToPath().

Also bumps the hardcoded provider count (238->240) after GreenPT (diegosouzapw#13024)
and EURouter (diegosouzapw#13025) landed in the gateways family, and regenerates the
stale translate-path golden snapshot to match.
muhamadgalihsaputra pushed a commit to niyatna/NiyatnaRoute that referenced this pull request Sep 27, 2026
…ouzapw#13024)

Merged with a rebaseline commit added on top of your branch: check:file-size freezes the gateways catalog at 1462 lines, so any new entry fails the gate on arrival. The annotation covers this entry and EURouter's (diegosouzapw#13025) together, following the route every previous gateway entry took (diegosouzapw#11786 seekai, diegosouzapw#10987 logfare, diegosouzapw#10668 tabitoken, diegosouzapw#10531 freebuff, diegosouzapw#11631 1min.ai) — the file is declarative data already split into six family files, so splitting it for two entries would break the semantic-families rule.

Validated in a combined worktree with 13 sibling PRs: 132 focused tests pass, typecheck:core clean, file-size green after the rebaseline.

Thank you for stating plainly what you did not verify. "The endpoint exists and is key-gated; catalog, streaming and tool calls not exercised" is worth more than a confident entry that turns out to be guesswork, and the conservative entry that follows from it — empty models, no capability declared, hasFree false with the billing shape spelled out — is exactly right.
muhamadgalihsaputra pushed a commit to niyatna/NiyatnaRoute that referenced this pull request Sep 27, 2026
…ouzapw#12985) (diegosouzapw#13025)

Rebased onto the release tip after diegosouzapw#13024 landed: both PRs extend the same three registration files, so the sibling merge turned this into a conflict. The resolution is additive — both catalog entries kept, both registry imports kept, both base URLs kept — and EURouter stays in AGGREGATOR_PROVIDER_IDS while GreenPT stays out, exactly as each PR argued. 14 provider tests pass on the rebased branch and the file-size gate is green under the annotated rebaseline.

Thank you for re-checking the endpoint live instead of trusting the report, and for the sovereignty caveat. Naming the upstreams from EURouter's own catalog — Claude Sonnet served by AWS Bedrock, 19 models owned by openai — and then writing an apiHint that says routing rather than residency is the kind of care that keeps a provider entry honest. The test asserting the copy contains none of "residency", "stays in the EU", "EU-hosted" or "sovereign" is a good guard against that drifting later.
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.

feat(providers): add GreenPT as an OpenAI-compatible provider (passthrough)

2 participants