@x12i/ai-profiles 1.2.7 → 1.4.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.
- package/README.md +94 -4
- package/dist/buildResolvedProfile.d.ts +1 -0
- package/dist/buildResolvedProfile.d.ts.map +1 -1
- package/dist/buildResolvedProfile.js +10 -6
- package/dist/buildResolvedProfile.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/resolveAIProfile.d.ts.map +1 -1
- package/dist/resolveAIProfile.js +1 -0
- package/dist/resolveAIProfile.js.map +1 -1
- package/dist/resolveModelRouting.d.ts +19 -0
- package/dist/resolveModelRouting.d.ts.map +1 -0
- package/dist/resolveModelRouting.js +71 -0
- package/dist/resolveModelRouting.js.map +1 -0
- package/dist/types.d.ts +10 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -1
package/README.md
CHANGED
|
@@ -15,6 +15,8 @@ npm install @x12i/ai-profiles
|
|
|
15
15
|
| `listAIProfiles(options?)` | No (async) | Profile summaries: primary `profile` key, `aliases[]`, choices, defaults |
|
|
16
16
|
| `listAIShortcuts()` | Yes | Shortcut table: `{ key, profile, choice?, description? }[]` |
|
|
17
17
|
| `resolveAIProfile(input, options?)` | No (async) | Resolve input → model, pricing, runtime, canonical `profile` key |
|
|
18
|
+
| `resolveUseOpenRouter(explicit?)` | Yes | Resolve OpenRouter vs vendor-direct routing (option → env → default) |
|
|
19
|
+
| `buildOpenRouterModelId(provider, modelId)` | Yes | Build an OpenRouter slug (`openai/gpt-5.4`) from registry fields |
|
|
18
20
|
| `isKnownProfileOrShortcut(input)` | Yes (bundled only) | Whether input is a known primary key, shortcut, or alias |
|
|
19
21
|
| `AIProfilesError` | — | Typed errors (`UNKNOWN_PROFILE`, …) |
|
|
20
22
|
|
|
@@ -34,8 +36,9 @@ const profiles = await listAIProfiles();
|
|
|
34
36
|
const model = await resolveAIProfile("cheap");
|
|
35
37
|
|
|
36
38
|
console.log(model.profile); // canonical primary key: cheap
|
|
37
|
-
console.log(model.provider);
|
|
38
|
-
console.log(model.modelId);
|
|
39
|
+
console.log(model.provider); // "openrouter" by default for remote profiles
|
|
40
|
+
console.log(model.modelId); // "google/gemini-2.5-flash-lite"
|
|
41
|
+
console.log(model.routing); // "openrouter" | "direct"
|
|
39
42
|
console.log(model.pricing);
|
|
40
43
|
console.log(model.instructionTier);
|
|
41
44
|
console.log(model.backend);
|
|
@@ -106,6 +109,79 @@ const model = await resolveAIProfile("cheap", {
|
|
|
106
109
|
});
|
|
107
110
|
```
|
|
108
111
|
|
|
112
|
+
## OpenRouter vs vendor-direct routing
|
|
113
|
+
|
|
114
|
+
Remote profiles (anything that is not `local` / on-device) can be resolved for **OpenRouter** or for a **vendor API directly**. Local CPU profiles are always returned as-is.
|
|
115
|
+
|
|
116
|
+
### Resolution priority
|
|
117
|
+
|
|
118
|
+
1. **`options.useOpenRouter`** when passed to `resolveAIProfile`
|
|
119
|
+
2. **`USE_OPENROUTER`** in `.env` / process env
|
|
120
|
+
3. **Default: `true`** (OpenRouter)
|
|
121
|
+
|
|
122
|
+
Supported today: **OpenRouter** and **vendor-direct**. Azure and AWS routing are not supported yet.
|
|
123
|
+
|
|
124
|
+
### OpenRouter (default)
|
|
125
|
+
|
|
126
|
+
```ts
|
|
127
|
+
const resolved = await resolveAIProfile("cheap");
|
|
128
|
+
// or explicitly:
|
|
129
|
+
await resolveAIProfile("cheap", { useOpenRouter: true });
|
|
130
|
+
|
|
131
|
+
// resolved.provider === "openrouter"
|
|
132
|
+
// resolved.modelId === "google/gemini-2.5-flash-lite"
|
|
133
|
+
// resolved.routing === "openrouter"
|
|
134
|
+
// resolved.backend === "openrouter"
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Registry choices store vendor-native ids (e.g. `gpt-5.4`, `gemini-2.5-flash-lite`). When routing via OpenRouter, this package rewrites them to full slugs: `{vendor}/{model}` (e.g. `openai/gpt-5.4`, `anthropic/claude-sonnet-4.6`). Anthropic version segments are normalized to dotted form (`4.6`, not `4-6`).
|
|
138
|
+
|
|
139
|
+
This applies to **primary keys, aliases, and shortcuts** — any input that resolves to a remote profile choice.
|
|
140
|
+
|
|
141
|
+
### Vendor-direct
|
|
142
|
+
|
|
143
|
+
```ts
|
|
144
|
+
const resolved = await resolveAIProfile("cheap", { useOpenRouter: false });
|
|
145
|
+
|
|
146
|
+
// resolved.provider === "google"
|
|
147
|
+
// resolved.modelId === "gemini-2.5-flash-lite"
|
|
148
|
+
// resolved.routing === "direct"
|
|
149
|
+
// resolved.backend === "custom"
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Use this when calling OpenAI, Anthropic, Google, etc. APIs directly instead of through OpenRouter.
|
|
153
|
+
|
|
154
|
+
### Env fallback
|
|
155
|
+
|
|
156
|
+
Set in `.env` or the process environment:
|
|
157
|
+
|
|
158
|
+
```env
|
|
159
|
+
USE_OPENROUTER=1 # or true, yes, on → OpenRouter
|
|
160
|
+
USE_OPENROUTER=0 # or false, no, off → vendor-direct
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
When `useOpenRouter` is omitted from `resolveAIProfile`, the env value is used. An explicit option always wins over env.
|
|
164
|
+
|
|
165
|
+
```ts
|
|
166
|
+
process.env.USE_OPENROUTER = "0";
|
|
167
|
+
await resolveAIProfile("cheap"); // vendor-direct
|
|
168
|
+
|
|
169
|
+
await resolveAIProfile("cheap", { useOpenRouter: true }); // still OpenRouter
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Helper exports:
|
|
173
|
+
|
|
174
|
+
```ts
|
|
175
|
+
import { resolveUseOpenRouter, buildOpenRouterModelId } from "@x12i/ai-profiles";
|
|
176
|
+
|
|
177
|
+
resolveUseOpenRouter(); // true by default
|
|
178
|
+
resolveUseOpenRouter(false); // explicit override
|
|
179
|
+
|
|
180
|
+
buildOpenRouterModelId("openai", "gpt-5.4"); // "openai/gpt-5.4"
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
Tests: `test/resolveModelRouting.test.ts`.
|
|
184
|
+
|
|
109
185
|
## Use bundled only
|
|
110
186
|
|
|
111
187
|
```ts
|
|
@@ -154,6 +230,7 @@ const resolved = await resolveAIProfile(
|
|
|
154
230
|
const modelConfig = {
|
|
155
231
|
provider: resolved.provider,
|
|
156
232
|
model: resolved.modelId,
|
|
233
|
+
routing: resolved.routing,
|
|
157
234
|
instructionTier: resolved.instructionTier,
|
|
158
235
|
backend: resolved.backend,
|
|
159
236
|
temperature: resolved.runtime.temperature,
|
|
@@ -161,6 +238,13 @@ const modelConfig = {
|
|
|
161
238
|
toolPolicy: resolved.runtime.toolPolicy,
|
|
162
239
|
reasoningEffort: resolved.runtime.reasoningEffort,
|
|
163
240
|
};
|
|
241
|
+
|
|
242
|
+
// Default OpenRouter routing:
|
|
243
|
+
// provider: "openrouter", model: "openai/gpt-5.4", routing: "openrouter"
|
|
244
|
+
|
|
245
|
+
// Vendor-direct:
|
|
246
|
+
// await resolveAIProfile(..., { useOpenRouter: false })
|
|
247
|
+
// provider: "openai", model: "gpt-5.4", routing: "direct"
|
|
164
248
|
```
|
|
165
249
|
|
|
166
250
|
## Profile matrix (FuncX contract)
|
|
@@ -181,7 +265,13 @@ Local CPU choices expose FuncX env keys in `resolved.metadata` (e.g. `LLAMA_CPP_
|
|
|
181
265
|
|
|
182
266
|
### OpenRouter model ids
|
|
183
267
|
|
|
184
|
-
Remote profile choices use vendor-native `modelId` values (e.g. `gpt-5.4`, `gemini-2.5-flash-lite`).
|
|
268
|
+
Remote profile choices in `models-profiles.json` use vendor-native `modelId` values (e.g. `gpt-5.4`, `gemini-2.5-flash-lite`). By default, `resolveAIProfile` returns OpenRouter-ready output:
|
|
269
|
+
|
|
270
|
+
- `provider`: `"openrouter"`
|
|
271
|
+
- `modelId`: full slug such as `openai/gpt-5.4`
|
|
272
|
+
- `routing`: `"openrouter"`
|
|
273
|
+
|
|
274
|
+
Pass `useOpenRouter: false` (or `USE_OPENROUTER=0`) to get vendor-native `provider` + `modelId` for direct API calls. `@x12i/ai-tools` can still remap deprecated OpenRouter ids when the bundled catalog is stale.
|
|
185
275
|
|
|
186
276
|
### Keeping models aligned over time
|
|
187
277
|
|
|
@@ -196,7 +286,7 @@ npm run verify:openrouter # bundled profiles vs ai-tools catalog (sibling
|
|
|
196
286
|
npm run verify:openrouter:live # same vs live open-assets catalog (pre-release)
|
|
197
287
|
```
|
|
198
288
|
|
|
199
|
-
Unit tests in `test/openrouterAlignment.test.ts` guard resolution rules offline. Use `verify:openrouter` when updating profile model ids; use `verify:openrouter:live` after refreshing [open-assets](https://open-assets.x12i.com/openrouter-models-catalog.json).
|
|
289
|
+
Unit tests in `test/openrouterAlignment.test.ts` and `test/resolveModelRouting.test.ts` guard resolution rules offline. Use `verify:openrouter` when updating profile model ids; use `verify:openrouter:live` after refreshing [open-assets](https://open-assets.x12i.com/openrouter-models-catalog.json).
|
|
200
290
|
|
|
201
291
|
Vendor-direct-only choices (not routed via OpenRouter) can opt out:
|
|
202
292
|
|
|
@@ -7,6 +7,7 @@ interface BuildResolvedProfileInput {
|
|
|
7
7
|
shortcut?: AIProfileShortcut;
|
|
8
8
|
registry: AIProfilesRegistry;
|
|
9
9
|
loaderWarnings?: AIProfileWarning[];
|
|
10
|
+
useOpenRouter?: boolean;
|
|
10
11
|
}
|
|
11
12
|
export declare function buildResolvedProfile(params: BuildResolvedProfileInput): ResolvedAIProfile;
|
|
12
13
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildResolvedProfile.d.ts","sourceRoot":"","sources":["../src/buildResolvedProfile.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"buildResolvedProfile.d.ts","sourceRoot":"","sources":["../src/buildResolvedProfile.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAEpB,UAAU,yBAAyB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,MAAM,EAAE,eAAe,CAAC;IACxB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,cAAc,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACpC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,yBAAyB,GAChC,iBAAiB,CA2GnB"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { DEFAULT_CACHE_TTL_MS, DEFAULT_RUNTIME_DEFAULTS } from "./constants.js";
|
|
2
2
|
import { getMemoryCache } from "./loader/memoryCache.js";
|
|
3
3
|
import { resolveBackend, resolveInstructionTier, } from "./resolveInstructionTierAndBackend.js";
|
|
4
|
+
import { applyModelRouting, resolveUseOpenRouter, } from "./resolveModelRouting.js";
|
|
4
5
|
export function buildResolvedProfile(params) {
|
|
5
|
-
const { input, shortcutKey, profile, choice, shortcut, registry, loaderWarnings = [], } = params;
|
|
6
|
+
const { input, shortcutKey, profile, choice, shortcut, registry, loaderWarnings = [], useOpenRouter: explicitUseOpenRouter, } = params;
|
|
6
7
|
const warnings = [...loaderWarnings];
|
|
7
8
|
const cache = getMemoryCache();
|
|
8
9
|
const cacheLoadedAt = cache?.loadedAt ?? Date.parse(registry.loadedAt);
|
|
@@ -38,11 +39,13 @@ export function buildResolvedProfile(params) {
|
|
|
38
39
|
...(choice.runtime ?? {}),
|
|
39
40
|
};
|
|
40
41
|
const instructionTier = resolveInstructionTier(profile, mergedRuntime.instructionTier);
|
|
41
|
-
const
|
|
42
|
+
const resolvedBackend = resolveBackend(profile, choice, mergedRuntime.backend);
|
|
43
|
+
const useOpenRouter = resolveUseOpenRouter(explicitUseOpenRouter);
|
|
44
|
+
const routed = applyModelRouting(choice, resolvedBackend, useOpenRouter);
|
|
42
45
|
const runtime = {
|
|
43
46
|
...mergedRuntime,
|
|
44
47
|
instructionTier,
|
|
45
|
-
backend,
|
|
48
|
+
backend: routed.backend,
|
|
46
49
|
};
|
|
47
50
|
const resolved = {
|
|
48
51
|
input,
|
|
@@ -53,10 +56,11 @@ export function buildResolvedProfile(params) {
|
|
|
53
56
|
choice: choice.choice,
|
|
54
57
|
choiceDisplayName: choice.displayName,
|
|
55
58
|
choiceDescription: choice.description,
|
|
56
|
-
provider:
|
|
57
|
-
modelId:
|
|
59
|
+
provider: routed.provider,
|
|
60
|
+
modelId: routed.modelId,
|
|
61
|
+
routing: routed.routing,
|
|
58
62
|
instructionTier,
|
|
59
|
-
backend,
|
|
63
|
+
backend: routed.backend,
|
|
60
64
|
pricing,
|
|
61
65
|
runtime,
|
|
62
66
|
...(choice.metadata !== undefined ? { metadata: choice.metadata } : {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildResolvedProfile.js","sourceRoot":"","sources":["../src/buildResolvedProfile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EACL,cAAc,EACd,sBAAsB,GACvB,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"buildResolvedProfile.js","sourceRoot":"","sources":["../src/buildResolvedProfile.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,7 +2,9 @@ export { listAIProfiles } from "./listAIProfiles.js";
|
|
|
2
2
|
export { listAIShortcuts } from "./listAIShortcuts.js";
|
|
3
3
|
export { resolveAIProfile } from "./resolveAIProfile.js";
|
|
4
4
|
export { isKnownProfileOrShortcut } from "./isKnownProfileOrShortcut.js";
|
|
5
|
+
export { resolveUseOpenRouter, readUseOpenRouterFromEnv, buildOpenRouterModelId, } from "./resolveModelRouting.js";
|
|
5
6
|
export type { AIProfilesRegistry, AIProfileDefinition, AIProfileChoice, AIProfileShortcut, AIProfileSummary, AIShortcutSummary, ResolvedAIProfile, ListAIProfilesOptions, ResolveAIProfileOptions, AIProvider, AIModelPricing, AIRuntimeDefaults, AIProfileBackend, AIProfileWarning, InstructionTier, RegistrySourceMode, } from "./types.js";
|
|
7
|
+
export type { AIModelRoutingMode } from "./resolveModelRouting.js";
|
|
6
8
|
export { AIProfilesError } from "./errors.js";
|
|
7
9
|
export type { AIProfilesErrorCode } from "./errors.js";
|
|
8
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAElC,YAAY,EACV,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,5 +2,6 @@ export { listAIProfiles } from "./listAIProfiles.js";
|
|
|
2
2
|
export { listAIShortcuts } from "./listAIShortcuts.js";
|
|
3
3
|
export { resolveAIProfile } from "./resolveAIProfile.js";
|
|
4
4
|
export { isKnownProfileOrShortcut } from "./isKnownProfileOrShortcut.js";
|
|
5
|
+
export { resolveUseOpenRouter, readUseOpenRouterFromEnv, buildOpenRouterModelId, } from "./resolveModelRouting.js";
|
|
5
6
|
export { AIProfilesError } from "./errors.js";
|
|
6
7
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAuBlC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveAIProfile.d.ts","sourceRoot":"","sources":["../src/resolveAIProfile.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE7E,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"file":"resolveAIProfile.d.ts","sourceRoot":"","sources":["../src/resolveAIProfile.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE7E,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,iBAAiB,CAAC,CA8E5B"}
|
package/dist/resolveAIProfile.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveAIProfile.js","sourceRoot":"","sources":["../src/resolveAIProfile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,kCAAkC,EAAE,MAAM,oCAAoC,CAAC;AACxF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAa,EACb,UAAmC,EAAE;IAErC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,MAAM,kCAAkC,CAAC;QACtE,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAEjD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,eAAe,CACvB,iBAAiB,EACjB,2CAA2C,KAAK,EAAE,EAClD,EAAE,KAAK,EAAE,CACV,CAAC;IACJ,CAAC;IAED,IAAI,UAAkB,CAAC;IACvB,IAAI,SAA6B,CAAC;IAClC,IAAI,eAAgE,CAAC;IAErE,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,SAAS;YACZ,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;YAC9B,SAAS;gBACP,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,aAAa,CAAC;YAChE,eAAe,GAAG,SAAS,CAAC;YAC5B,MAAM;QACR,KAAK,UAAU;YACb,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;YAC9B,SAAS,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;YACpD,eAAe,GAAG,KAAK,CAAC,QAAQ,CAAC;YACjC,MAAM;QACR,KAAK,OAAO;YACV,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;YAC9B,SAAS;gBACP,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,aAAa,CAAC;YAChE,eAAe,GAAG,SAAS,CAAC;YAC5B,MAAM;IACV,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAE9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,eAAe,CACvB,iBAAiB,EACjB,uBAAuB,UAAU,EAAE,EACnC,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,CAC/B,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC;IAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAE/C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,OAAO,CAAC,4BAA4B,EAAE,CAAC;YACzC,OAAO,gBAAgB,CAAC,UAAU,EAAE;gBAClC,GAAG,OAAO;gBACV,MAAM,EAAE,OAAO,CAAC,aAAa;aAC9B,CAAC,CAAC;QACL,CAAC;QAED,MAAM,IAAI,eAAe,CACvB,gBAAgB,EAChB,mBAAmB,cAAc,qBAAqB,UAAU,GAAG,EACnE,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,CACvD,CAAC;IACJ,CAAC;IAED,OAAO,oBAAoB,CAAC;QAC1B,KAAK;QACL,WAAW,EAAE,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;QACtE,OAAO;QACP,MAAM;QACN,QAAQ,EAAE,eAAe;QACzB,QAAQ;QACR,cAAc,EAAE,QAAQ;
|
|
1
|
+
{"version":3,"file":"resolveAIProfile.js","sourceRoot":"","sources":["../src/resolveAIProfile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { AIProfileBackend, AIProfileChoice, AIProvider } from "./types.js";
|
|
2
|
+
export type AIModelRoutingMode = "openrouter" | "direct";
|
|
3
|
+
/** Reads `USE_OPENROUTER` from process env (loading `.env` once when unset). */
|
|
4
|
+
export declare function readUseOpenRouterFromEnv(): boolean | undefined;
|
|
5
|
+
/**
|
|
6
|
+
* Resolves whether to route via OpenRouter.
|
|
7
|
+
* Explicit option wins, then `USE_OPENROUTER` env, then default `true`.
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveUseOpenRouter(explicit?: boolean): boolean;
|
|
10
|
+
export declare function isRemoteProfileChoice(choice: AIProfileChoice): boolean;
|
|
11
|
+
export declare function buildOpenRouterModelId(provider: string, modelId: string): string;
|
|
12
|
+
export interface AppliedModelRouting {
|
|
13
|
+
provider: AIProvider;
|
|
14
|
+
modelId: string;
|
|
15
|
+
backend: AIProfileBackend;
|
|
16
|
+
routing: AIModelRoutingMode;
|
|
17
|
+
}
|
|
18
|
+
export declare function applyModelRouting(choice: AIProfileChoice, backend: AIProfileBackend, useOpenRouter: boolean): AppliedModelRouting;
|
|
19
|
+
//# sourceMappingURL=resolveModelRouting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveModelRouting.d.ts","sourceRoot":"","sources":["../src/resolveModelRouting.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGhF,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,QAAQ,CAAC;AAyBzD,gFAAgF;AAChF,wBAAgB,wBAAwB,IAAI,OAAO,GAAG,SAAS,CAU9D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAMhE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAUtE;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAOhF;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,UAAU,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,OAAO,EAAE,kBAAkB,CAAC;CAC7B;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE,gBAAgB,EACzB,aAAa,EAAE,OAAO,GACrB,mBAAmB,CAgBrB"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { loadDotenv } from "@x12i/env";
|
|
2
|
+
import { normalizeAnthropicVersionSlug } from "./validation/openRouterAlignment.js";
|
|
3
|
+
let dotenvLoaded = false;
|
|
4
|
+
function ensureDotenvLoaded() {
|
|
5
|
+
if (!dotenvLoaded) {
|
|
6
|
+
loadDotenv();
|
|
7
|
+
dotenvLoaded = true;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
function parseBooleanEnv(value) {
|
|
11
|
+
const normalized = value.trim().toLowerCase();
|
|
12
|
+
if (["1", "true", "yes", "on"].includes(normalized)) {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
if (["0", "false", "no", "off"].includes(normalized)) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
/** Reads `USE_OPENROUTER` from process env (loading `.env` once when unset). */
|
|
21
|
+
export function readUseOpenRouterFromEnv() {
|
|
22
|
+
ensureDotenvLoaded();
|
|
23
|
+
const raw = process.env.USE_OPENROUTER;
|
|
24
|
+
if (raw === undefined || raw.trim() === "") {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
return parseBooleanEnv(raw);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Resolves whether to route via OpenRouter.
|
|
31
|
+
* Explicit option wins, then `USE_OPENROUTER` env, then default `true`.
|
|
32
|
+
*/
|
|
33
|
+
export function resolveUseOpenRouter(explicit) {
|
|
34
|
+
if (explicit !== undefined) {
|
|
35
|
+
return explicit;
|
|
36
|
+
}
|
|
37
|
+
return readUseOpenRouterFromEnv() ?? true;
|
|
38
|
+
}
|
|
39
|
+
export function isRemoteProfileChoice(choice) {
|
|
40
|
+
if (choice.provider === "local") {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
if (choice.modelId.startsWith("funcx:") || choice.modelId.startsWith("Xenova/")) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
export function buildOpenRouterModelId(provider, modelId) {
|
|
49
|
+
if (modelId.includes("/")) {
|
|
50
|
+
return modelId;
|
|
51
|
+
}
|
|
52
|
+
const normalizedModel = normalizeAnthropicVersionSlug(modelId);
|
|
53
|
+
return `${provider}/${normalizedModel}`;
|
|
54
|
+
}
|
|
55
|
+
export function applyModelRouting(choice, backend, useOpenRouter) {
|
|
56
|
+
if (!isRemoteProfileChoice(choice) || !useOpenRouter) {
|
|
57
|
+
return {
|
|
58
|
+
provider: choice.provider,
|
|
59
|
+
modelId: choice.modelId,
|
|
60
|
+
backend: useOpenRouter ? backend : backend === "openrouter" ? "custom" : backend,
|
|
61
|
+
routing: "direct",
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
provider: "openrouter",
|
|
66
|
+
modelId: buildOpenRouterModelId(choice.provider, choice.modelId),
|
|
67
|
+
backend: "openrouter",
|
|
68
|
+
routing: "openrouter",
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=resolveModelRouting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveModelRouting.js","sourceRoot":"","sources":["../src/resolveModelRouting.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type AIProvider = "openai" | "anthropic" | "google" | "deepseek" | "mistral" | "groq" | "xai" | "local" | "custom";
|
|
1
|
+
export type AIProvider = "openai" | "anthropic" | "google" | "deepseek" | "mistral" | "groq" | "xai" | "local" | "custom" | "openrouter";
|
|
2
2
|
export type InstructionTier = "default" | "cpu" | "reasoning";
|
|
3
3
|
export type AIProfileBackend = "openrouter" | "llama-cpp" | "transformersjs" | "custom";
|
|
4
4
|
export interface AIModelPricing {
|
|
@@ -125,6 +125,8 @@ export interface ResolvedAIProfile {
|
|
|
125
125
|
choiceDescription: string;
|
|
126
126
|
provider: AIProvider;
|
|
127
127
|
modelId: string;
|
|
128
|
+
/** How the resolved provider/model were routed (`openrouter` vs vendor-direct). */
|
|
129
|
+
routing: "openrouter" | "direct";
|
|
128
130
|
instructionTier: InstructionTier;
|
|
129
131
|
backend: AIProfileBackend;
|
|
130
132
|
pricing?: AIModelPricing & {
|
|
@@ -159,6 +161,13 @@ export interface ResolveAIProfileOptions {
|
|
|
159
161
|
refresh?: boolean;
|
|
160
162
|
allowFallbackToDefaultChoice?: boolean;
|
|
161
163
|
strict?: boolean;
|
|
164
|
+
/**
|
|
165
|
+
* When true (default), remote models resolve via OpenRouter (`provider: "openrouter"`,
|
|
166
|
+
* `modelId: "{vendor}/{model}"`). When false, use the choice's vendor provider and model id.
|
|
167
|
+
* Falls back to `USE_OPENROUTER` in `.env` when omitted (`1`/`true` → OpenRouter,
|
|
168
|
+
* `0`/`false` → direct). Azure and AWS routing are not supported yet.
|
|
169
|
+
*/
|
|
170
|
+
useOpenRouter?: boolean;
|
|
162
171
|
}
|
|
163
172
|
export interface LoadRegistryOptions {
|
|
164
173
|
source?: RegistrySourceMode;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAClB,QAAQ,GACR,WAAW,GACX,QAAQ,GACR,UAAU,GACV,SAAS,GACT,MAAM,GACN,KAAK,GACL,OAAO,GACP,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@x12i/ai-profiles",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -63,5 +63,8 @@
|
|
|
63
63
|
"@types/node": "^22.15.21",
|
|
64
64
|
"typescript": "^5.8.3",
|
|
65
65
|
"vitest": "^3.1.4"
|
|
66
|
+
},
|
|
67
|
+
"dependencies": {
|
|
68
|
+
"@x12i/env": "^4.0.1"
|
|
66
69
|
}
|
|
67
70
|
}
|