feat(providers): add GreenPT as an OpenAI-compatible provider - #13024
Merged
diegosouzapw merged 2 commits intoSep 10, 2026
Merged
Conversation
…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
force-pushed
the
feat/12986-greenpt
branch
from
September 10, 2026 21:12
aa90f25 to
8f7770c
Compare
diegosouzapw
merged commit Sep 10, 2026
2b9e7fb
into
diegosouzapw:release/v3.8.51
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
This was referenced Sep 11, 2026
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>
7 tasks done
5 tasks done
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #12986.
Registry entry in the
mnn-ai/meganova-aishape — no executor, no translator,passthroughModels: trueso 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:
The endpoint exists and is key-gated — the shape
passthroughModelsneeds. Not verified: catalog contents, a streaming completion, a tool call.So the entry claims only what was established:
models[]hasFreefalsehasFreedrives a "Free" badge in the pickerfreeNoteOne 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_PROVIDERSis derived frompassthroughModels, and that is whatisValidModelconsults. 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 throughREGISTRY/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.