@x12i/ai-profiles 5.1.0 → 5.3.0

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.
Files changed (50) hide show
  1. package/README.md +12 -8
  2. package/dist/constants.d.ts +7 -0
  3. package/dist/constants.d.ts.map +1 -1
  4. package/dist/constants.js +18 -0
  5. package/dist/constants.js.map +1 -1
  6. package/dist/customizationPin.d.ts +15 -0
  7. package/dist/customizationPin.d.ts.map +1 -0
  8. package/dist/customizationPin.js +96 -0
  9. package/dist/customizationPin.js.map +1 -0
  10. package/dist/data/models-profiles.json +550 -412
  11. package/dist/data/models-registry.json +1152 -924
  12. package/dist/data/reasoning-coverage.json +55 -40
  13. package/dist/data/reasoning-directives.json +498 -307
  14. package/dist/finalProfileModelMappingPatch.d.ts.map +1 -1
  15. package/dist/finalProfileModelMappingPatch.js +37 -32
  16. package/dist/finalProfileModelMappingPatch.js.map +1 -1
  17. package/dist/index.d.ts +1 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +1 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/inferModelFamily.d.ts.map +1 -1
  22. package/dist/inferModelFamily.js +2 -0
  23. package/dist/inferModelFamily.js.map +1 -1
  24. package/dist/loader/loadAIProfilesRegistry.d.ts.map +1 -1
  25. package/dist/loader/loadAIProfilesRegistry.js +8 -2
  26. package/dist/loader/loadAIProfilesRegistry.js.map +1 -1
  27. package/dist/loader/loadModelsCatalog.d.ts.map +1 -1
  28. package/dist/loader/loadModelsCatalog.js +8 -6
  29. package/dist/loader/loadModelsCatalog.js.map +1 -1
  30. package/dist/loader/loadModelsProfilesJson.d.ts +5 -0
  31. package/dist/loader/loadModelsProfilesJson.d.ts.map +1 -1
  32. package/dist/loader/loadModelsProfilesJson.js +21 -1
  33. package/dist/loader/loadModelsProfilesJson.js.map +1 -1
  34. package/dist/loader/loadRemoteModelsCatalog.d.ts.map +1 -1
  35. package/dist/loader/loadRemoteModelsCatalog.js +5 -2
  36. package/dist/loader/loadRemoteModelsCatalog.js.map +1 -1
  37. package/dist/loader/loadRemoteModelsProfiles.d.ts.map +1 -1
  38. package/dist/loader/loadRemoteModelsProfiles.js +5 -2
  39. package/dist/loader/loadRemoteModelsProfiles.js.map +1 -1
  40. package/dist/loader/loadRemoteRegistry.d.ts.map +1 -1
  41. package/dist/loader/loadRemoteRegistry.js +5 -2
  42. package/dist/loader/loadRemoteRegistry.js.map +1 -1
  43. package/dist/resolveAIProfile.d.ts.map +1 -1
  44. package/dist/resolveAIProfile.js +14 -3
  45. package/dist/resolveAIProfile.js.map +1 -1
  46. package/dist/types.d.ts +8 -1
  47. package/dist/types.d.ts.map +1 -1
  48. package/dist/vendorModelId.js +1 -1
  49. package/package.json +2 -2
  50. package/dist/data/models-catalog.json +0 -21228
package/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  # @x12i/ai-profiles
10
10
 
11
- Resolve AI profile names into concrete model choices. The package ships JSON in `src/data/` as the offline fallback. By default, registry data is fetched from public assets, validated, and cached in memory.
11
+ Resolve AI profile names into concrete model choices. The package ships JSON in `src/data/` as the offline copy. `source: "auto"` loads `GET /v1/datasets/profiles` and `GET /v1/datasets/catalog` from `https://ai-registry.app.x12i.com` (or `AI_REGISTRY_URL`). A successful document is used as-is and cached for 60 seconds. `refresh: true` bypasses that cache. Network or validation failure uses the bundled JSON. `AI_REGISTRY_SOURCE=bundled` skips those fetches. `loadLatestDataset({ fetch, baseUrl })` is the one-shot profiles read and accepts the same options as the other catalog packages.
12
12
 
13
13
  > **v4.4** ships production routing (OpenRouter default + vendor-direct), product-line `*-latest-model` vendor routes, Gemini-backed google lanes, and **unversioned** open-assets URLs. Pin **`"@x12i/ai-profiles": "^4.4.0"`**. Upload `models-profiles.json` / `models-catalog.json` to open-assets **without** `.v4` / `.v2` suffixes.
14
14
  >
@@ -866,22 +866,26 @@ const model = await resolveAIProfile("balanced/default", {
866
866
 
867
867
  **Default (`source: "auto"`):**
868
868
 
869
- 1. Fetch `models-profiles.json` from the assets URL (see below).
870
- 2. Validate the response; if valid, use it and cache it in process memory for 24 hours.
871
- 3. If fetch or validation fails, use the JSON shipped inside this npm package (bundled fallback).
872
- 4. After TTL, the next call tries fetch again; if that fails but an earlier fetch was cached, reuse the stale cache with a warning.
869
+ 1. Fetch the profiles and catalog datasets from the registry (`AI_REGISTRY_URL`, then `AI_CATALOG_URL`, then `https://ai-registry.app.x12i.com`).
870
+ 2. Validate the response. A valid document is the dataset. Bundled rows are not merged back in. It is cached in process memory for 60 seconds.
871
+ 3. If fetch or validation fails, use the JSON shipped inside this npm package. If an earlier fetch is still in memory, reuse it and add a warning.
872
+ 4. `refresh: true` fetches again before the 60 seconds elapse.
873
873
 
874
- **`source: "bundled"`** — package JSON only, no network.
874
+ **`source: "bundled"`** — package JSON only, no dataset fetch.
875
875
 
876
876
  **`source: "remote"`** — fetch every time (still cached after success); errors propagate, no bundled fallback.
877
877
 
878
- No database. No disk cache in v1.
878
+ `AI_REGISTRY_SOURCE=bundled` forces the bundled datasets even when `source` is `auto` or `remote`.
879
+
880
+ Pass `authixToken` (or set `AUTHIX_TOKEN`) to apply pins from `GET /v1/customization`. `context` or `AI_REGISTRY_CONTEXT` selects the bucket; omitted means `default`. A pin replaces that profile/choice model. Other keys stay on the registry document. If the customization request fails, resolve continues with the published model and a `CUSTOMIZATION_UNAVAILABLE` warning. The token is sent only to the registry customization route.
881
+
882
+ No local database. No disk cache in v1.
879
883
 
880
884
  The `version` field in the JSON files (and `registryVersion` on resolved output) is an optional label for humans or external tooling. This package does not compare versions, enforce semver, or pick assets by version number.
881
885
 
882
886
  ## Remote assets
883
887
 
884
- Upload the bundled JSON files **as-is** (no filename version suffix):
888
+ Registry reads use `/v1/datasets/profiles` and `/v1/datasets/catalog`. Maintainer scripts can still upload the bundled JSON files **as-is** (no filename version suffix):
885
889
 
886
890
  - `https://open-assets.x12i.com/models-profiles.json`
887
891
  - `https://open-assets.x12i.com/models-catalog.json`
@@ -1,6 +1,13 @@
1
1
  import type { AIRuntimeDefaults } from "./types.js";
2
2
  export declare const DEFAULT_CACHE_TTL_MS: number;
3
+ /** Memory cache for a successful registry document. */
4
+ export declare const REGISTRY_CACHE_TTL_MS: number;
3
5
  export declare const DEFAULT_FETCH_TIMEOUT_MS = 5000;
6
+ export declare const DEFAULT_REGISTRY_URL = "https://ai-registry.app.x12i.com";
7
+ /** Worker sets this so package loaders do not call the registry they are serving. */
8
+ export declare function isRegistrySourceBundled(): boolean;
9
+ export declare function registryOrigin(): string;
10
+ export declare function registryDatasetUrl(id: string): string;
4
11
  export declare const REMOTE_MODELS_PROFILES_URL = "https://open-assets.x12i.com/models-profiles.json";
5
12
  export declare const REMOTE_MODELS_CATALOG_URL = "https://open-assets.x12i.com/models-catalog.json";
6
13
  /** Public OpenRouter model list (used by maintainers to regenerate the catalog). */
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,eAAO,MAAM,oBAAoB,QAAsB,CAAC;AACxD,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAE7C,eAAO,MAAM,0BAA0B,sDACc,CAAC;AAEtD,eAAO,MAAM,yBAAyB,qDACc,CAAC;AAErD,oFAAoF;AACpF,eAAO,MAAM,yBAAyB,wCACC,CAAC;AAExC,eAAO,MAAM,yBAAyB,EACpC,oCAA6C,CAAC;AAEhD,eAAO,MAAM,yBAAyB,EACpC,oCAA6C,CAAC;AAEhD,6FAA6F;AAC7F,eAAO,MAAM,uBAAuB,iDAAuC,CAAC;AAC5E,eAAO,MAAM,iBAAiB,0CAA2C,CAAC;AAE1E,eAAO,MAAM,mBAAmB,+GAStB,CAAC;AAEX,8CAA8C;AAC9C,eAAO,MAAM,sBAAsB,uFAOzB,CAAC;AAEX,sFAAsF;AACtF,eAAO,MAAM,gBAAgB,sDAMnB,CAAC;AAEX,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAAC,iBAAiB,CAahE,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,eAAO,MAAM,oBAAoB,QAAsB,CAAC;AACxD,uDAAuD;AACvD,eAAO,MAAM,qBAAqB,QAAY,CAAC;AAC/C,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAC7C,eAAO,MAAM,oBAAoB,qCAAqC,CAAC;AAMvE,qFAAqF;AACrF,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD;AAED,wBAAgB,cAAc,IAAI,MAAM,CAIvC;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,eAAO,MAAM,0BAA0B,sDACc,CAAC;AAEtD,eAAO,MAAM,yBAAyB,qDACc,CAAC;AAErD,oFAAoF;AACpF,eAAO,MAAM,yBAAyB,wCACC,CAAC;AAExC,eAAO,MAAM,yBAAyB,EACpC,oCAA6C,CAAC;AAEhD,eAAO,MAAM,yBAAyB,EACpC,oCAA6C,CAAC;AAEhD,6FAA6F;AAC7F,eAAO,MAAM,uBAAuB,iDAAuC,CAAC;AAC5E,eAAO,MAAM,iBAAiB,0CAA2C,CAAC;AAE1E,eAAO,MAAM,mBAAmB,+GAStB,CAAC;AAEX,8CAA8C;AAC9C,eAAO,MAAM,sBAAsB,uFAOzB,CAAC;AAEX,sFAAsF;AACtF,eAAO,MAAM,gBAAgB,sDAMnB,CAAC;AAEX,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAAC,iBAAiB,CAahE,CAAC"}
package/dist/constants.js CHANGED
@@ -1,5 +1,23 @@
1
1
  export const DEFAULT_CACHE_TTL_MS = 24 * 60 * 60 * 1000;
2
+ /** Memory cache for a successful registry document. */
3
+ export const REGISTRY_CACHE_TTL_MS = 60 * 1000;
2
4
  export const DEFAULT_FETCH_TIMEOUT_MS = 5000;
5
+ export const DEFAULT_REGISTRY_URL = "https://ai-registry.app.x12i.com";
6
+ function processEnv() {
7
+ return globalThis.process?.env;
8
+ }
9
+ /** Worker sets this so package loaders do not call the registry they are serving. */
10
+ export function isRegistrySourceBundled() {
11
+ return processEnv()?.AI_REGISTRY_SOURCE?.trim() === "bundled";
12
+ }
13
+ export function registryOrigin() {
14
+ const env = processEnv();
15
+ const value = env?.AI_REGISTRY_URL?.trim() || env?.AI_CATALOG_URL?.trim();
16
+ return (value || DEFAULT_REGISTRY_URL).replace(/\/+$/, "");
17
+ }
18
+ export function registryDatasetUrl(id) {
19
+ return `${registryOrigin()}/v1/datasets/${encodeURIComponent(id)}`;
20
+ }
3
21
  export const REMOTE_MODELS_PROFILES_URL = "https://open-assets.x12i.com/models-profiles.json";
4
22
  export const REMOTE_MODELS_CATALOG_URL = "https://open-assets.x12i.com/models-catalog.json";
5
23
  /** Public OpenRouter model list (used by maintainers to regenerate the catalog). */
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACxD,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAE7C,MAAM,CAAC,MAAM,0BAA0B,GACrC,mDAAmD,CAAC;AAEtD,MAAM,CAAC,MAAM,yBAAyB,GACpC,kDAAkD,CAAC;AAErD,oFAAoF;AACpF,MAAM,CAAC,MAAM,yBAAyB,GACpC,qCAAqC,CAAC;AAExC,MAAM,CAAC,MAAM,yBAAyB,GACpC,oCAA6C,CAAC;AAEhD,MAAM,CAAC,MAAM,yBAAyB,GACpC,oCAA6C,CAAC;AAEhD,6FAA6F;AAC7F,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,yBAAyB,CAAU,CAAC;AAC5E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW,CAAU,CAAC;AAE1E,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,YAAY;IACZ,WAAW;IACX,QAAQ;IACR,UAAU;IACV,MAAM;IACN,gBAAgB;IAChB,aAAa;IACb,QAAQ;CACA,CAAC;AAEX,8CAA8C;AAC9C,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,WAAW;IACX,QAAQ;IACR,UAAU;IACV,MAAM;IACN,gBAAgB;IAChB,aAAa;CACL,CAAC;AAEX,sFAAsF;AACtF,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;CACE,CAAC;AAEX,MAAM,CAAC,MAAM,wBAAwB,GAAgC;IACnE,eAAe,EAAE,QAAQ;IACzB,UAAU,EAAE,MAAM;IAClB,WAAW,EAAE,GAAG;IAChB,UAAU,EAAE,MAAM;IAClB,aAAa,EAAE,MAAM;IACrB,gBAAgB,EAAE,KAAK;IACvB,QAAQ,EAAE,KAAK;IACf,eAAe,EAAE,KAAK;IACtB,kBAAkB,EAAE,KAAK;IACzB,WAAW,EAAE,MAAM;IACnB,eAAe,EAAE,SAAS;IAC1B,OAAO,EAAE,YAAY;CACtB,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACxD,uDAAuD;AACvD,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,GAAG,IAAI,CAAC;AAC/C,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAC7C,MAAM,CAAC,MAAM,oBAAoB,GAAG,kCAAkC,CAAC;AAEvE,SAAS,UAAU;IACjB,OAAQ,UAAyE,CAAC,OAAO,EAAE,GAAG,CAAC;AACjG,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,uBAAuB;IACrC,OAAO,UAAU,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,KAAK,SAAS,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;IAC1E,OAAO,CAAC,KAAK,IAAI,oBAAoB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EAAU;IAC3C,OAAO,GAAG,cAAc,EAAE,gBAAgB,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC;AACrE,CAAC;AAED,MAAM,CAAC,MAAM,0BAA0B,GACrC,mDAAmD,CAAC;AAEtD,MAAM,CAAC,MAAM,yBAAyB,GACpC,kDAAkD,CAAC;AAErD,oFAAoF;AACpF,MAAM,CAAC,MAAM,yBAAyB,GACpC,qCAAqC,CAAC;AAExC,MAAM,CAAC,MAAM,yBAAyB,GACpC,oCAA6C,CAAC;AAEhD,MAAM,CAAC,MAAM,yBAAyB,GACpC,oCAA6C,CAAC;AAEhD,6FAA6F;AAC7F,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,yBAAyB,CAAU,CAAC;AAC5E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW,CAAU,CAAC;AAE1E,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,YAAY;IACZ,WAAW;IACX,QAAQ;IACR,UAAU;IACV,MAAM;IACN,gBAAgB;IAChB,aAAa;IACb,QAAQ;CACA,CAAC;AAEX,8CAA8C;AAC9C,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,WAAW;IACX,QAAQ;IACR,UAAU;IACV,MAAM;IACN,gBAAgB;IAChB,aAAa;CACL,CAAC;AAEX,sFAAsF;AACtF,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;CACE,CAAC;AAEX,MAAM,CAAC,MAAM,wBAAwB,GAAgC;IACnE,eAAe,EAAE,QAAQ;IACzB,UAAU,EAAE,MAAM;IAClB,WAAW,EAAE,GAAG;IAChB,UAAU,EAAE,MAAM;IAClB,aAAa,EAAE,MAAM;IACrB,gBAAgB,EAAE,KAAK;IACvB,QAAQ,EAAE,KAAK;IACf,eAAe,EAAE,KAAK;IACtB,kBAAkB,EAAE,KAAK;IACzB,WAAW,EAAE,MAAM;IACnB,eAAe,EAAE,SAAS;IAC1B,OAAO,EAAE,YAAY;CACtB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { AIProfileWarning, ModelsCatalogJson, PreferOpenRouterInput, ResolvedAIProfile } from "./types.js";
2
+ export declare function clearCustomizationCache(): void;
3
+ export declare function customizationAuth(options: {
4
+ authixToken?: string;
5
+ context?: string;
6
+ }): {
7
+ token: string;
8
+ context?: string;
9
+ } | undefined;
10
+ export declare function applyProfilePin(resolved: ResolvedAIProfile, modelId: string, catalog: ModelsCatalogJson, preferOpenRouter: PreferOpenRouterInput | undefined): ResolvedAIProfile;
11
+ export declare function loadProfilePins(token: string, context: string | undefined): Promise<{
12
+ profiles: Record<string, string>;
13
+ warning?: AIProfileWarning;
14
+ }>;
15
+ //# sourceMappingURL=customizationPin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customizationPin.d.ts","sourceRoot":"","sources":["../src/customizationPin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAc,iBAAiB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAW5H,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C;AAQD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG;IACtF,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,SAAS,CAKZ;AAcD,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,iBAAiB,EAC1B,gBAAgB,EAAE,qBAAqB,GAAG,SAAS,GAClD,iBAAiB,CAuCnB;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,gBAAgB,CAAA;CAAE,CAAC,CA0B3E"}
@@ -0,0 +1,96 @@
1
+ import { REGISTRY_CACHE_TTL_MS, registryOrigin } from "./constants.js";
2
+ import { resolvePreferOpenRouter } from "./resolveModelRouting.js";
3
+ const cache = new Map();
4
+ export function clearCustomizationCache() {
5
+ cache.clear();
6
+ }
7
+ function envValue(name) {
8
+ const value = globalThis.process?.env?.[name];
9
+ const trimmed = value?.trim();
10
+ return trimmed || undefined;
11
+ }
12
+ export function customizationAuth(options) {
13
+ const token = options.authixToken?.trim() || envValue("AUTHIX_TOKEN");
14
+ if (!token)
15
+ return undefined;
16
+ const context = options.context?.trim() || envValue("AI_REGISTRY_CONTEXT");
17
+ return context ? { token, context } : { token };
18
+ }
19
+ function findEntry(catalog, modelId) {
20
+ const needle = modelId.trim().toLowerCase();
21
+ return catalog.models.find((entry) => {
22
+ const direct = `${entry.direct.provider}/${entry.direct.modelId}`.toLowerCase();
23
+ return (entry.openrouter.modelId.toLowerCase() === needle ||
24
+ direct === needle ||
25
+ entry.direct.modelId.toLowerCase() === needle);
26
+ });
27
+ }
28
+ export function applyProfilePin(resolved, modelId, catalog, preferOpenRouter) {
29
+ const prefer = resolvePreferOpenRouter(preferOpenRouter);
30
+ const entry = findEntry(catalog, modelId);
31
+ const slash = modelId.indexOf("/");
32
+ const provider = (slash > 0 ? modelId.slice(0, slash) : entry?.direct.provider ?? resolved.provider);
33
+ const bareModel = slash > 0 ? modelId.slice(slash + 1) : modelId;
34
+ const openRouterId = entry?.openrouter.modelId ?? modelId;
35
+ const directProvider = (entry?.direct.provider ?? provider);
36
+ const directModel = entry?.direct.modelId ?? bareModel;
37
+ const warnings = [
38
+ ...(resolved.warnings ?? []),
39
+ {
40
+ code: "PROFILE_PIN_APPLIED",
41
+ message: `Profile ${resolved.profile}/${resolved.choice} is pinned to ${modelId}.`,
42
+ },
43
+ ];
44
+ const pricing = entry?.openrouter.pricing;
45
+ return {
46
+ ...resolved,
47
+ provider: prefer ? "openrouter" : directProvider,
48
+ modelId: prefer ? openRouterId : directModel,
49
+ routing: prefer ? "openrouter" : "direct",
50
+ invocation: {
51
+ direct: { provider: directProvider, modelId: directModel },
52
+ openrouter: { provider: "openrouter", modelId: openRouterId },
53
+ },
54
+ ...(pricing && (typeof pricing.input === "number" || typeof pricing.output === "number")
55
+ ? {
56
+ pricing: {
57
+ input: typeof pricing.input === "number" ? pricing.input : 0,
58
+ output: typeof pricing.output === "number" ? pricing.output : 0,
59
+ currency: "USD",
60
+ unit: "1M_tokens",
61
+ ...(typeof pricing.cachedInput === "number" ? { cachedInput: pricing.cachedInput } : {}),
62
+ },
63
+ }
64
+ : {}),
65
+ warnings,
66
+ };
67
+ }
68
+ export async function loadProfilePins(token, context) {
69
+ const key = `${token}\n${context ?? ""}`;
70
+ const cached = cache.get(key);
71
+ if (cached && cached.expiresAt > Date.now()) {
72
+ return { profiles: cached.profiles, ...(cached.warning ? { warning: cached.warning } : {}) };
73
+ }
74
+ const url = `${registryOrigin()}/v1/customization${context ? `?context=${encodeURIComponent(context)}` : ""}`;
75
+ try {
76
+ const response = await fetch(url, {
77
+ headers: { accept: "application/json", authorization: `Bearer ${token}` },
78
+ });
79
+ if (!response.ok) {
80
+ throw new Error(`HTTP ${response.status}`);
81
+ }
82
+ const body = (await response.json());
83
+ const profiles = body.overrides?.profiles ?? {};
84
+ cache.set(key, { expiresAt: Date.now() + REGISTRY_CACHE_TTL_MS, profiles });
85
+ return { profiles };
86
+ }
87
+ catch {
88
+ const warning = {
89
+ code: "CUSTOMIZATION_UNAVAILABLE",
90
+ message: "Customization could not be loaded. Using the published profile model.",
91
+ };
92
+ cache.set(key, { expiresAt: Date.now() + 5_000, profiles: {}, warning });
93
+ return { profiles: {}, warning };
94
+ }
95
+ }
96
+ //# sourceMappingURL=customizationPin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customizationPin.js","sourceRoot":"","sources":["../src/customizationPin.ts"],"names":[],"mappings":"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"}