@nyte-ai/ai 0.0.0-stage → 0.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +170 -2
- package/THIRD-PARTY-NOTICES.md +800 -0
- package/dist/chunks/account-limits-cache-031vfpt3.js +37 -0
- package/dist/chunks/account-limits-cache-09vs98g6.js +41 -0
- package/dist/chunks/account-limits-cache-0af5gqeg.js +15 -0
- package/dist/chunks/account-limits-cache-0yd6bde8.js +103 -0
- package/dist/chunks/account-limits-cache-1jv43fhh.js +22 -0
- package/dist/chunks/account-limits-cache-3ykqmnj5.js +88 -0
- package/dist/chunks/account-limits-cache-4b8ckwqw.js +293 -0
- package/dist/chunks/account-limits-cache-4fn5w63p.js +295 -0
- package/dist/chunks/account-limits-cache-4hptgd2h.js +49 -0
- package/dist/chunks/account-limits-cache-53e64mhx.js +417 -0
- package/dist/chunks/account-limits-cache-5jdhn0e1.js +562 -0
- package/dist/chunks/account-limits-cache-5rx2pfm5.js +8 -0
- package/dist/chunks/account-limits-cache-5ygxyyss.js +19 -0
- package/dist/chunks/account-limits-cache-6250ykn6.js +21 -0
- package/dist/chunks/account-limits-cache-6x05n06z.js +49 -0
- package/dist/chunks/account-limits-cache-736tdyme.js +6 -0
- package/dist/chunks/account-limits-cache-75smws02.js +213 -0
- package/dist/chunks/account-limits-cache-7z9s8j16.js +139 -0
- package/dist/chunks/account-limits-cache-8137j3zp.js +37 -0
- package/dist/chunks/account-limits-cache-8qzk56vj.js +160 -0
- package/dist/chunks/account-limits-cache-8s8bz4dr.js +36 -0
- package/dist/chunks/account-limits-cache-8vzx8k6r.js +166 -0
- package/dist/chunks/account-limits-cache-8wfqg73s.js +135 -0
- package/dist/chunks/account-limits-cache-90c9c2eb.js +50 -0
- package/dist/chunks/account-limits-cache-9wqk28n5.js +25 -0
- package/dist/chunks/account-limits-cache-a1jyaq00.js +56 -0
- package/dist/chunks/account-limits-cache-a558rjbg.js +138 -0
- package/dist/chunks/account-limits-cache-a55e14fr.js +70 -0
- package/dist/chunks/account-limits-cache-a6cgeagz.js +77 -0
- package/dist/chunks/account-limits-cache-ag5b8dja.js +38 -0
- package/dist/chunks/account-limits-cache-b0x2sfya.js +45 -0
- package/dist/chunks/account-limits-cache-b23sbrke.js +26 -0
- package/dist/chunks/account-limits-cache-b4edaybk.js +8 -0
- package/dist/chunks/account-limits-cache-bsknrh6t.js +74 -0
- package/dist/chunks/account-limits-cache-c7v93krb.js +235 -0
- package/dist/chunks/account-limits-cache-csbxvam7.js +12 -0
- package/dist/chunks/account-limits-cache-cw7q7vfy.js +293 -0
- package/dist/chunks/account-limits-cache-d1ypzqzp.js +27 -0
- package/dist/chunks/account-limits-cache-d2a51dka.js +17 -0
- package/dist/chunks/account-limits-cache-dejeygdt.js +114 -0
- package/dist/chunks/account-limits-cache-eejm0vth.js +11 -0
- package/dist/chunks/account-limits-cache-ehy0ze2b.js +33 -0
- package/dist/chunks/account-limits-cache-emg5b4hj.js +53 -0
- package/dist/chunks/account-limits-cache-eqwweapz.js +6 -0
- package/dist/chunks/account-limits-cache-eyx1jcxc.js +8 -0
- package/dist/chunks/account-limits-cache-f9z00x8c.js +36 -0
- package/dist/chunks/account-limits-cache-fbkaq46e.js +113 -0
- package/dist/chunks/account-limits-cache-fdwad56n.js +399 -0
- package/dist/chunks/account-limits-cache-fht68jp2.js +22 -0
- package/dist/chunks/account-limits-cache-fp03ztsw.js +17 -0
- package/dist/chunks/account-limits-cache-fsktnetm.js +69 -0
- package/dist/chunks/account-limits-cache-fvadc36m.js +110 -0
- package/dist/chunks/account-limits-cache-ghe9ne4j.js +69 -0
- package/dist/chunks/account-limits-cache-gknnm1kv.js +13 -0
- package/dist/chunks/account-limits-cache-gqsrbky9.js +40 -0
- package/dist/chunks/account-limits-cache-gr671dr2.js +0 -0
- package/dist/chunks/account-limits-cache-gs8a3fhw.js +32 -0
- package/dist/chunks/account-limits-cache-gsa5tzck.js +37 -0
- package/dist/chunks/account-limits-cache-h92bzz1j.js +235 -0
- package/dist/chunks/account-limits-cache-hemxtapd.js +142 -0
- package/dist/chunks/account-limits-cache-hj1h48sc.js +92 -0
- package/dist/chunks/account-limits-cache-hj3ek3ty.js +128 -0
- package/dist/chunks/account-limits-cache-hwehc67r.js +509 -0
- package/dist/chunks/account-limits-cache-hyzn1jmk.js +46 -0
- package/dist/chunks/account-limits-cache-j2bt392s.js +63 -0
- package/dist/chunks/account-limits-cache-k0pkzhbx.js +74 -0
- package/dist/chunks/account-limits-cache-kjx405q0.js +277 -0
- package/dist/chunks/account-limits-cache-ks1sjym9.js +37 -0
- package/dist/chunks/account-limits-cache-me1x57bs.js +89 -0
- package/dist/chunks/account-limits-cache-n3yk6g5c.js +314 -0
- package/dist/chunks/account-limits-cache-nbhht7xz.js +72 -0
- package/dist/chunks/account-limits-cache-nbkyhs6v.js +42 -0
- package/dist/chunks/account-limits-cache-nn9jebsj.js +26 -0
- package/dist/chunks/account-limits-cache-nxkprk3g.js +13 -0
- package/dist/chunks/account-limits-cache-nyy770yd.js +38 -0
- package/dist/chunks/account-limits-cache-pfa86y8e.js +45 -0
- package/dist/chunks/account-limits-cache-pfr14mcn.js +59 -0
- package/dist/chunks/account-limits-cache-q1ebtvet.js +8 -0
- package/dist/chunks/account-limits-cache-q63mc41j.js +51 -0
- package/dist/chunks/account-limits-cache-re8hpzwn.js +104 -0
- package/dist/chunks/account-limits-cache-rz8p1g5y.js +9 -0
- package/dist/chunks/account-limits-cache-skbfmzqe.js +7 -0
- package/dist/chunks/account-limits-cache-tc38g0ca.js +20 -0
- package/dist/chunks/account-limits-cache-v4n30az2.js +24 -0
- package/dist/chunks/account-limits-cache-vwgfz727.js +281 -0
- package/dist/chunks/account-limits-cache-x9fvb3s5.js +8 -0
- package/dist/chunks/account-limits-cache-xds88kxd.js +209 -0
- package/dist/chunks/account-limits-cache-xz65wyd1.js +428 -0
- package/dist/chunks/account-limits-cache-ydq8p8qp.js +39 -0
- package/dist/chunks/account-limits-cache-ykbqsvv6.js +134 -0
- package/dist/chunks/account-limits-cache-za42x8a3.js +25 -0
- package/dist/chunks/account-limits-cache-zcbkmrvy.js +79 -0
- package/dist/chunks/account-limits-cache-zgzptd0z.js +62 -0
- package/dist/chunks/account-limits-cache-zn01kscn.js +252 -0
- package/dist/chunks/account-limits-cache-zpjmeyt0.js +113 -0
- package/dist/chunks/account-limits-cache-zqdb4yh4.js +8 -0
- package/dist/src/account-limits-cache.d.ts +16 -0
- package/dist/src/account-limits-cache.js +7 -0
- package/dist/src/api/anthropic-client.d.ts +25 -0
- package/dist/src/api/anthropic-client.js +30 -0
- package/dist/src/api/anthropic-convert.d.ts +17 -0
- package/dist/src/api/anthropic-convert.js +14 -0
- package/dist/src/api/anthropic-events.d.ts +101 -0
- package/dist/src/api/anthropic-events.js +11 -0
- package/dist/src/api/anthropic-messages.d.ts +88 -0
- package/dist/src/api/anthropic-messages.js +578 -0
- package/dist/src/api/anthropic-messages.lazy.d.ts +2 -0
- package/dist/src/api/anthropic-messages.lazy.js +11 -0
- package/dist/src/api/assistant-stream.d.ts +23 -0
- package/dist/src/api/assistant-stream.js +15 -0
- package/dist/src/api/claude-code.d.ts +12 -0
- package/dist/src/api/claude-code.js +12 -0
- package/dist/src/api/cloudflare.d.ts +8 -0
- package/dist/src/api/cloudflare.js +11 -0
- package/dist/src/api/constrained-sampling.d.ts +24 -0
- package/dist/src/api/constrained-sampling.js +16 -0
- package/dist/src/api/deferred.d.ts +7 -0
- package/dist/src/api/deferred.js +10 -0
- package/dist/src/api/github-copilot-headers.d.ts +15 -0
- package/dist/src/api/github-copilot-headers.js +12 -0
- package/dist/src/api/google-generative-ai.d.ts +22 -0
- package/dist/src/api/google-generative-ai.js +583 -0
- package/dist/src/api/google-generative-ai.lazy.d.ts +2 -0
- package/dist/src/api/google-generative-ai.lazy.js +11 -0
- package/dist/src/api/lazy.d.ts +18 -0
- package/dist/src/api/lazy.js +12 -0
- package/dist/src/api/openai-codex-compact.d.ts +14 -0
- package/dist/src/api/openai-codex-compact.js +389 -0
- package/dist/src/api/openai-codex-compaction-error.d.ts +7 -0
- package/dist/src/api/openai-codex-compaction-error.js +6 -0
- package/dist/src/api/openai-codex-protocol.d.ts +125 -0
- package/dist/src/api/openai-codex-protocol.js +48 -0
- package/dist/src/api/openai-codex-responses.d.ts +4 -0
- package/dist/src/api/openai-codex-responses.js +175 -0
- package/dist/src/api/openai-codex-responses.lazy.d.ts +2 -0
- package/dist/src/api/openai-codex-responses.lazy.js +11 -0
- package/dist/src/api/openai-codex-websocket.d.ts +13 -0
- package/dist/src/api/openai-codex-websocket.js +37 -0
- package/dist/src/api/openai-codex-wire.d.ts +44 -0
- package/dist/src/api/openai-codex-wire.js +34 -0
- package/dist/src/api/openai-compact.d.ts +9 -0
- package/dist/src/api/openai-compact.js +12 -0
- package/dist/src/api/openai-completions-convert.d.ts +58 -0
- package/dist/src/api/openai-completions-convert.js +21 -0
- package/dist/src/api/openai-completions-params.d.ts +29 -0
- package/dist/src/api/openai-completions-params.js +20 -0
- package/dist/src/api/openai-completions-reasoning.d.ts +54 -0
- package/dist/src/api/openai-completions-reasoning.js +22 -0
- package/dist/src/api/openai-completions.d.ts +22 -0
- package/dist/src/api/openai-completions.js +484 -0
- package/dist/src/api/openai-completions.lazy.d.ts +5 -0
- package/dist/src/api/openai-completions.lazy.js +11 -0
- package/dist/src/api/openai-prompt-cache.d.ts +1 -0
- package/dist/src/api/openai-prompt-cache.js +6 -0
- package/dist/src/api/openai-responses-convert.d.ts +58 -0
- package/dist/src/api/openai-responses-convert.js +16 -0
- package/dist/src/api/openai-responses-events.d.ts +379 -0
- package/dist/src/api/openai-responses-events.js +12 -0
- package/dist/src/api/openai-responses-stream.d.ts +36 -0
- package/dist/src/api/openai-responses-stream.js +25 -0
- package/dist/src/api/openai-responses.d.ts +18 -0
- package/dist/src/api/openai-responses.js +276 -0
- package/dist/src/api/openai-responses.lazy.d.ts +2 -0
- package/dist/src/api/openai-responses.lazy.js +11 -0
- package/dist/src/api/simple-options.d.ts +17 -0
- package/dist/src/api/simple-options.js +18 -0
- package/dist/src/api/token-count.d.ts +5 -0
- package/dist/src/api/token-count.js +8 -0
- package/dist/src/api/transform-messages.d.ts +9 -0
- package/dist/src/api/transform-messages.js +6 -0
- package/dist/src/api-options.d.ts +27 -0
- package/dist/src/api-options.js +0 -0
- package/dist/src/auth/context.d.ts +11 -0
- package/dist/src/auth/context.js +6 -0
- package/dist/src/auth/credential-store.d.ts +17 -0
- package/dist/src/auth/credential-store.js +7 -0
- package/dist/src/auth/helpers.d.ts +24 -0
- package/dist/src/auth/helpers.js +8 -0
- package/dist/src/auth/oauth/anthropic.d.ts +7 -0
- package/dist/src/auth/oauth/anthropic.js +12 -0
- package/dist/src/auth/oauth/authorization-input.d.ts +14 -0
- package/dist/src/auth/oauth/authorization-input.js +6 -0
- package/dist/src/auth/oauth/device-code.d.ts +29 -0
- package/dist/src/auth/oauth/device-code.js +9 -0
- package/dist/src/auth/oauth/github-copilot.d.ts +23 -0
- package/dist/src/auth/oauth/github-copilot.js +12 -0
- package/dist/src/auth/oauth/load.d.ts +14 -0
- package/dist/src/auth/oauth/load.js +10 -0
- package/dist/src/auth/oauth/oauth-page.d.ts +13 -0
- package/dist/src/auth/oauth/oauth-page.js +8 -0
- package/dist/src/auth/oauth/openai-codex.d.ts +10 -0
- package/dist/src/auth/oauth/openai-codex.js +18 -0
- package/dist/src/auth/oauth/pkce.d.ts +12 -0
- package/dist/src/auth/oauth/pkce.js +6 -0
- package/dist/src/auth/resolve.d.ts +38 -0
- package/dist/src/auth/resolve.js +12 -0
- package/dist/src/auth/store.d.ts +29 -0
- package/dist/src/auth/store.js +10 -0
- package/dist/src/auth/types.d.ts +291 -0
- package/dist/src/auth/types.js +8 -0
- package/dist/src/auth/verify.d.ts +13 -0
- package/dist/src/auth/verify.js +7 -0
- package/dist/src/bun-oauth.d.ts +2 -0
- package/dist/src/bun-oauth.js +25 -0
- package/dist/src/env-api-keys.d.ts +32 -0
- package/dist/src/env-api-keys.js +27 -0
- package/dist/src/file-models-store.d.ts +18 -0
- package/dist/src/file-models-store.js +9 -0
- package/dist/src/index.d.ts +62 -0
- package/dist/src/index.js +372 -0
- package/dist/src/model-capabilities.d.ts +21 -0
- package/dist/src/model-capabilities.js +14 -0
- package/dist/src/model-pricing.d.ts +6 -0
- package/dist/src/model-pricing.js +10 -0
- package/dist/src/model-variants.d.ts +21 -0
- package/dist/src/model-variants.js +19 -0
- package/dist/src/models-refresh.d.ts +27 -0
- package/dist/src/models-refresh.js +9 -0
- package/dist/src/models-store.d.ts +31 -0
- package/dist/src/models-store.js +6 -0
- package/dist/src/models-types.d.ts +206 -0
- package/dist/src/models-types.js +0 -0
- package/dist/src/models.d.ts +7 -0
- package/dist/src/models.js +44 -0
- package/dist/src/prompt-cache.d.ts +5 -0
- package/dist/src/prompt-cache.js +9 -0
- package/dist/src/provider.d.ts +23 -0
- package/dist/src/provider.js +14 -0
- package/dist/src/providers/account-limits.d.ts +13 -0
- package/dist/src/providers/account-limits.js +8 -0
- package/dist/src/providers/anthropic-limits.d.ts +9 -0
- package/dist/src/providers/anthropic-limits.js +10 -0
- package/dist/src/providers/anthropic.d.ts +2 -0
- package/dist/src/providers/anthropic.js +25 -0
- package/dist/src/providers/github-copilot-catalog.d.ts +5 -0
- package/dist/src/providers/github-copilot-catalog.js +7 -0
- package/dist/src/providers/github-copilot.d.ts +2 -0
- package/dist/src/providers/github-copilot.js +23 -0
- package/dist/src/providers/nyte-catalog.d.ts +15 -0
- package/dist/src/providers/nyte-catalog.js +63 -0
- package/dist/src/providers/openai-codex-limits.d.ts +8 -0
- package/dist/src/providers/openai-codex-limits.js +14 -0
- package/dist/src/providers/openai-codex.d.ts +2 -0
- package/dist/src/providers/openai-codex.js +23 -0
- package/dist/src/providers/openai.d.ts +2 -0
- package/dist/src/providers/openai.js +19 -0
- package/dist/src/providers/opencode-go.d.ts +5 -0
- package/dist/src/providers/opencode-go.js +22 -0
- package/dist/src/providers/opencode-headers.d.ts +5 -0
- package/dist/src/providers/opencode-headers.js +6 -0
- package/dist/src/providers/opencode.d.ts +14 -0
- package/dist/src/providers/opencode.js +23 -0
- package/dist/src/providers/openrouter.d.ts +2 -0
- package/dist/src/providers/openrouter.js +19 -0
- package/dist/src/providers/vercel-ai-gateway.d.ts +3 -0
- package/dist/src/providers/vercel-ai-gateway.js +19 -0
- package/dist/src/session-resources.d.ts +9 -0
- package/dist/src/session-resources.js +10 -0
- package/dist/src/types.d.ts +210 -0
- package/dist/src/types.js +1 -0
- package/dist/src/utils/abort.d.ts +12 -0
- package/dist/src/utils/abort.js +10 -0
- package/dist/src/utils/deferred-tools.d.ts +11 -0
- package/dist/src/utils/deferred-tools.js +6 -0
- package/dist/src/utils/diagnostics.d.ts +11 -0
- package/dist/src/utils/diagnostics.js +12 -0
- package/dist/src/utils/error-body.d.ts +26 -0
- package/dist/src/utils/error-body.js +10 -0
- package/dist/src/utils/estimate.d.ts +20 -0
- package/dist/src/utils/estimate.js +14 -0
- package/dist/src/utils/event-stream.d.ts +22 -0
- package/dist/src/utils/event-stream.js +11 -0
- package/dist/src/utils/failure.d.ts +49 -0
- package/dist/src/utils/failure.js +10 -0
- package/dist/src/utils/fifo-queue.d.ts +11 -0
- package/dist/src/utils/fifo-queue.js +6 -0
- package/dist/src/utils/hash.d.ts +5 -0
- package/dist/src/utils/hash.js +6 -0
- package/dist/src/utils/headers.d.ts +12 -0
- package/dist/src/utils/headers.js +14 -0
- package/dist/src/utils/json-parse.d.ts +33 -0
- package/dist/src/utils/json-parse.js +12 -0
- package/dist/src/utils/node-http-proxy.d.ts +6 -0
- package/dist/src/utils/node-http-proxy.js +9 -0
- package/dist/src/utils/nyte-home.d.ts +2 -0
- package/dist/src/utils/nyte-home.js +6 -0
- package/dist/src/utils/nyte-user-agent.d.ts +1 -0
- package/dist/src/utils/nyte-user-agent.js +6 -0
- package/dist/src/utils/overflow.d.ts +18 -0
- package/dist/src/utils/overflow.js +9 -0
- package/dist/src/utils/provider-env.d.ts +9 -0
- package/dist/src/utils/provider-env.js +6 -0
- package/dist/src/utils/provider-retry.d.ts +22 -0
- package/dist/src/utils/provider-retry.js +9 -0
- package/dist/src/utils/retry.d.ts +66 -0
- package/dist/src/utils/retry.js +18 -0
- package/dist/src/utils/sanitize-unicode.d.ts +24 -0
- package/dist/src/utils/sanitize-unicode.js +6 -0
- package/dist/src/utils/sse.d.ts +21 -0
- package/dist/src/utils/sse.js +6 -0
- package/dist/src/utils/text.d.ts +5 -0
- package/dist/src/utils/text.js +10 -0
- package/dist/src/utils/transcript.d.ts +5 -0
- package/dist/src/utils/transcript.js +36 -0
- package/dist/src/utils/typebox-helpers.d.ts +19 -0
- package/dist/src/utils/typebox-helpers.js +6 -0
- package/dist/src/utils/uuid.d.ts +2 -0
- package/dist/src/utils/uuid.js +6 -0
- package/dist/src/utils/validation.d.ts +13 -0
- package/dist/src/utils/validation.js +8 -0
- package/package.json +152 -3
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Nyte contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,171 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @nyte-ai/ai
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Provider streaming, authentication, and model catalogs. Every Nyte client composes the same
|
|
4
|
+
providers through `createNyteModels()` over the shared `~/.nyte` credential and model stores
|
|
5
|
+
(`NYTE_HOME` overrides the directory). Catalogs come from the R2 bucket named by
|
|
6
|
+
`DEFAULT_MODELS_CATALOG_URL` in `src/models.ts` and are cached in `~/.nyte/models-store.json`;
|
|
7
|
+
`NYTE_MODELS_URL` overrides the catalog origin. A login made in one client is a login in all of
|
|
8
|
+
them.
|
|
9
|
+
|
|
10
|
+
## Layout
|
|
11
|
+
|
|
12
|
+
| Path | Responsibility |
|
|
13
|
+
| --- | --- |
|
|
14
|
+
| `src/models.ts` | `Provider`, `Models`, `createProvider`, auth resolution, hosted catalog refresh and caching |
|
|
15
|
+
| `src/auth/` | Credential types and stores, api-key helpers, OAuth flows under `auth/oauth/` |
|
|
16
|
+
| `src/api/` | Wire adapters: Anthropic Messages, OpenAI Responses and Chat Completions, Codex, Google |
|
|
17
|
+
| `src/api/github-copilot-headers.ts` | Copilot identity shared by auth, catalog generation, and request adapters |
|
|
18
|
+
| `src/providers/` | Provider factories and provider-specific account filtering |
|
|
19
|
+
| `src/providers/opencode-headers.ts` | Maps `sessionId` to `x-opencode-session` for OpenCode Zen and Go requests |
|
|
20
|
+
| `src/providers/nyte-catalog.ts` | The provider list and default models each client starts from |
|
|
21
|
+
| `scripts/` | Hosted catalog generation and R2 publishing (`pnpm models:generate`, `pnpm models:publish`) |
|
|
22
|
+
|
|
23
|
+
## Providers
|
|
24
|
+
|
|
25
|
+
| Provider | Auth | Catalog |
|
|
26
|
+
| --- | --- | --- |
|
|
27
|
+
| `openai-codex` | ChatGPT OAuth (browser or device code) | Hosted JSON feed |
|
|
28
|
+
| `openai`, `anthropic` | API key from the environment or a stored key; Anthropic also offers OAuth | Hosted JSON feed |
|
|
29
|
+
| `opencode`, `opencode-go` | `OPENCODE_API_KEY` or a stored key | Hosted JSON feed |
|
|
30
|
+
| `github-copilot` | GitHub device sign-in or an injected bearer token | Hosted JSON feed, filtered by OAuth account model IDs |
|
|
31
|
+
|
|
32
|
+
`pnpm models:generate` writes one JSON array per provider under `catalog/`, and
|
|
33
|
+
`pnpm models:publish` uploads those files to Cloudflare R2. Clients fetch the file for their
|
|
34
|
+
provider and cache the result.
|
|
35
|
+
|
|
36
|
+
## Credential storage
|
|
37
|
+
|
|
38
|
+
`FileCredentialStore` keeps one credential per provider in `~/.nyte/auth.json`. A TUI, a desktop
|
|
39
|
+
window, and a host can all write that file, so every mutation takes `auth.json.lock` and holds it
|
|
40
|
+
across the whole read-modify-write, including the OAuth refresh that `Models` runs inside `modify`.
|
|
41
|
+
A rotating refresh token is therefore spent once, not once per client. The lock names its owning
|
|
42
|
+
process, host, and acquisition, so a crashed client's lock is taken over at once when it came from
|
|
43
|
+
this machine. Any lock older than a minute is reclaimed even if a process still claims it, because
|
|
44
|
+
pids get reused and a suspended machine wakes with held locks; a refresh interrupted that way costs
|
|
45
|
+
the user a sign-in, so refreshes are capped well below that. A holder whose lock was reclaimed
|
|
46
|
+
reports that nothing was written instead of publishing over the client that holds it now.
|
|
47
|
+
|
|
48
|
+
Writes publish by renaming a temporary file over `auth.json`, so readers take no lock and never
|
|
49
|
+
observe a half-written file. A file that cannot be read fails the operation instead of resolving
|
|
50
|
+
empty, including for providers that would otherwise fall back to an environment variable: an
|
|
51
|
+
unparseable `auth.json` is a typo to fix, not a reason to overwrite every stored login. Entries
|
|
52
|
+
that this version cannot parse are reported as no credential and left on disk untouched, so a
|
|
53
|
+
downgrade cannot drop credentials a newer build wrote.
|
|
54
|
+
|
|
55
|
+
## GitHub Copilot
|
|
56
|
+
|
|
57
|
+
The OAuth flow follows [Pi at `71dca871`](https://github.com/earendil-works/pi/blob/71dca871bc80b6bc97be37f0ca3189399d651fff/packages/ai/src/auth/oauth/github-copilot.ts):
|
|
58
|
+
|
|
59
|
+
```text
|
|
60
|
+
Host starts GitHub device authorization
|
|
61
|
+
-> UI displays verification URL and code
|
|
62
|
+
-> host polls GitHub for its access token
|
|
63
|
+
-> host exchanges that token at /copilot_internal/v2/token
|
|
64
|
+
-> host fetches /models with the Copilot session token
|
|
65
|
+
-> credential store saves both tokens and account model IDs
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
`refresh` stores the GitHub token. `access` stores the short-lived Copilot session token.
|
|
69
|
+
`expires` is the session token's actual expiry; shared auth resolution already refreshes five
|
|
70
|
+
minutes early under the credential store lock. Refresh repeats the exchange and account model
|
|
71
|
+
lookup without another device login. A failed lookup does not persist a partial login or refresh.
|
|
72
|
+
Credential reads validate both tokens, expiry, and account model IDs through one schema. Incomplete
|
|
73
|
+
or old direct-token credentials require a fresh sign-in.
|
|
74
|
+
|
|
75
|
+
Client identity is GitHub's Copilot OAuth client, `Iv1.b507a08c87ecfe98`, with Copilot's
|
|
76
|
+
editor headers. This is not Nyte's OAuth app, and the device-code instructions say so. The
|
|
77
|
+
`clientId` option or `NYTE_GITHUB_COPILOT_CLIENT_ID` can select a host's own client, but that client
|
|
78
|
+
must be permitted to use Copilot's token exchange. A successful GitHub device grant alone does
|
|
79
|
+
not establish that permission. This integration does not establish official Copilot client support.
|
|
80
|
+
|
|
81
|
+
The session token's `proxy-ep` chooses the API origin. Only HTTPS origins under
|
|
82
|
+
`*.githubcopilot.com` on the default port are accepted; an untrusted endpoint fails before the
|
|
83
|
+
session token leaves the host. A token without `proxy-ep` uses
|
|
84
|
+
`https://api.individual.githubcopilot.com`. Requests refuse redirects, time out after 15 seconds
|
|
85
|
+
including body reading, and expose fixed errors with HTTP status or known OAuth error codes,
|
|
86
|
+
never remote response bodies or token-bearing transport messages. Device polling is cancellable
|
|
87
|
+
and bounded by the code's lifetime. Verification URLs must name a GitHub HTTPS login page.
|
|
88
|
+
|
|
89
|
+
### Model definitions and account access
|
|
90
|
+
|
|
91
|
+
The hosted catalog supplies Copilot endpoint routes, limits, reasoning controls, and prices. The
|
|
92
|
+
authenticated `/models` response supplies account availability, not a second complete model schema.
|
|
93
|
+
Missing `supported_endpoints`, limits, or billing metadata therefore does not drop a known model.
|
|
94
|
+
Unknown IDs wait for a catalog update rather than receiving guessed routes.
|
|
95
|
+
|
|
96
|
+
`getModels()` returns the cached hosted definitions. `getAvailable()` applies the account's
|
|
97
|
+
`availableModelIds`. Those IDs live with the credential, so another client can restore them offline
|
|
98
|
+
without a separate Copilot model-cache entry. Login and token refresh replace the list, including
|
|
99
|
+
an empty list. Disabled policies and explicit lack of tool support are excluded. When every picker
|
|
100
|
+
flag is false, only the Individual endpoint falls back to explicitly enabled policies, as Pi does.
|
|
101
|
+
Unlike Pi, Nyte does not automatically enable unconfigured model policies. It reports that account
|
|
102
|
+
approval is needed and leaves those models unavailable until enabled.
|
|
103
|
+
|
|
104
|
+
Catalog prices are model-rate estimates, not a calculation of Copilot subscription charges or
|
|
105
|
+
premium-request usage. Request adapters retain Copilot headers, vision declarations, opaque
|
|
106
|
+
Chat Completions reasoning, and encrypted Responses reasoning across turns.
|
|
107
|
+
|
|
108
|
+
### Browser and server hosts
|
|
109
|
+
|
|
110
|
+
Use the narrow package exports instead of the main index, which also exports Node file stores:
|
|
111
|
+
|
|
112
|
+
```ts
|
|
113
|
+
import { InMemoryCredentialStore } from "@nyte-ai/ai/auth/credential-store";
|
|
114
|
+
import type { AuthInteraction } from "@nyte-ai/ai/auth/types";
|
|
115
|
+
import { createModels } from "@nyte-ai/ai/models";
|
|
116
|
+
import { githubCopilotProvider } from "@nyte-ai/ai/providers/github-copilot";
|
|
117
|
+
|
|
118
|
+
const credentials = new InMemoryCredentialStore();
|
|
119
|
+
const models = createModels({ credentials });
|
|
120
|
+
models.setProvider(githubCopilotProvider());
|
|
121
|
+
|
|
122
|
+
async function connect(interaction: AuthInteraction) {
|
|
123
|
+
await models.refresh({ providers: ["github-copilot"] });
|
|
124
|
+
await models.login("github-copilot", "oauth", interaction);
|
|
125
|
+
return models.getAvailable("github-copilot");
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
`@nyte-ai/ai/auth/oauth/github-copilot` also exposes the fetch-only flow directly. Both entrypoints
|
|
130
|
+
accept an injected `fetch`. No terminal, browser opener, callback listener, or filesystem is needed.
|
|
131
|
+
The browser-bundle test runs login in a realm without Node globals using a simulated HTTP boundary;
|
|
132
|
+
it does not prove GitHub CORS support.
|
|
133
|
+
|
|
134
|
+
For a web application, keep both tokens and credential storage on the server. Send the browser only
|
|
135
|
+
device-code instructions, progress, and safe completion metadata. The server polls and refreshes;
|
|
136
|
+
the browser's cancel action aborts the host-owned signal. Nyte's remote protocol does not yet expose
|
|
137
|
+
provider-login operations, so these exports support embedding hosts, not remote login in the shipped
|
|
138
|
+
web client. Use a durable, user-isolated `CredentialStore` in a server instead of the example's
|
|
139
|
+
in-memory store. Do not share one user's credentials across tenants.
|
|
140
|
+
|
|
141
|
+
Like Pi, the API-key method accepts `COPILOT_GITHUB_TOKEN`, a stored bearer token, or an explicit
|
|
142
|
+
request token for headless hosts. That method passes the token through and does not exchange or
|
|
143
|
+
refresh it, or discover account model IDs. Hosts must supply a token accepted by the Copilot API;
|
|
144
|
+
OAuth is the path that manages token exchange, expiry, and account filtering.
|
|
145
|
+
|
|
146
|
+
Not covered: GitHub Enterprise domains, automatic model-policy opt-in, subagent/title/compaction
|
|
147
|
+
interaction types, remote provider-login protocol operations, and live validation of this rewritten
|
|
148
|
+
flow with a fresh sign-in and inference request.
|
|
149
|
+
|
|
150
|
+
## Verification
|
|
151
|
+
|
|
152
|
+
```sh
|
|
153
|
+
pnpm --dir packages/ai test
|
|
154
|
+
pnpm --dir packages/ai typecheck
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
`pnpm --dir packages/ai test` runs Vitest. All tests live in
|
|
158
|
+
`test/`, including cases ported from Pi. There is no separate upstream suite. Package typecheck
|
|
159
|
+
includes every test and fixture recursively and rejects unused locals and parameters.
|
|
160
|
+
|
|
161
|
+
Transport tests inject HTTP or WebSocket fixtures at the network boundary and exercise the real
|
|
162
|
+
adapters. They run without provider credentials or live API calls.
|
|
163
|
+
|
|
164
|
+
## Account usage windows
|
|
165
|
+
|
|
166
|
+
The Claude and Codex account-limit fetchers normalize percentages used and reset
|
|
167
|
+
timestamps separately from token consumption. Claude supports the named 5-hour
|
|
168
|
+
and weekly buckets plus model-specific `weekly_scoped` entries in the response's
|
|
169
|
+
`limits` array, including Fable. Scoped windows use `seven_day_<display_name>` ids and `<display_name> weekly` labels.
|
|
170
|
+
Missing or malformed windows are omitted; a missing reset stays unknown.
|
|
171
|
+
Requests remain cancellable through response-body reading.
|