@astralyn/pi 0.85.1 → 0.85.2
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/CHANGELOG.md +28 -0
- package/dist/cli.js +94 -91
- package/dist/core/agent-session.js +2 -2
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/background/history.d.ts.map +1 -1
- package/dist/core/background/history.js +6 -0
- package/dist/core/background/history.js.map +1 -1
- package/dist/core/background/presentation.d.ts.map +1 -1
- package/dist/core/background/presentation.js +41 -4
- package/dist/core/background/presentation.js.map +1 -1
- package/dist/core/background/service.d.ts +2 -2
- package/dist/core/background/service.d.ts.map +1 -1
- package/dist/core/background/service.js +38 -15
- package/dist/core/background/service.js.map +1 -1
- package/dist/core/background/types.d.ts +9 -0
- package/dist/core/background/types.d.ts.map +1 -1
- package/dist/core/background/types.js +4 -0
- package/dist/core/background/types.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +5 -12
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +11 -19
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/settings.d.ts +27 -0
- package/dist/core/compaction/settings.d.ts.map +1 -0
- package/dist/core/compaction/settings.js +40 -0
- package/dist/core/compaction/settings.js.map +1 -0
- package/dist/core/keybindings.d.ts +15 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +12 -0
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-config.d.ts +32 -10
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +38 -1
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-runtime.d.ts +2 -0
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +4 -0
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/settings-manager.d.ts +4 -7
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +7 -6
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/tools/bash.js +1 -1
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/shell-execution.d.ts.map +1 -1
- package/dist/core/tools/shell-execution.js +3 -1
- package/dist/core/tools/shell-execution.js.map +1 -1
- package/dist/extensions/background/manager.d.ts +8 -5
- package/dist/extensions/background/manager.d.ts.map +1 -1
- package/dist/extensions/background/manager.js +115 -39
- package/dist/extensions/background/manager.js.map +1 -1
- package/dist/extensions/background/task-view.d.ts +5 -0
- package/dist/extensions/background/task-view.d.ts.map +1 -1
- package/dist/extensions/background/task-view.js +4 -0
- package/dist/extensions/background/task-view.js.map +1 -1
- package/dist/extensions/btw/controller.d.ts +1 -1
- package/dist/extensions/btw/controller.d.ts.map +1 -1
- package/dist/extensions/btw/controller.js +4 -4
- package/dist/extensions/btw/controller.js.map +1 -1
- package/dist/extensions/btw/index.js +3 -3
- package/dist/extensions/btw/index.js.map +1 -1
- package/dist/extensions/index.js +2 -2
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/provider/catalog.d.ts +57 -0
- package/dist/extensions/provider/catalog.d.ts.map +1 -0
- package/dist/extensions/provider/catalog.js +181 -0
- package/dist/extensions/provider/catalog.js.map +1 -0
- package/dist/extensions/provider/compat-fields.d.ts +25 -0
- package/dist/extensions/provider/compat-fields.d.ts.map +1 -0
- package/dist/extensions/provider/compat-fields.js +148 -0
- package/dist/extensions/provider/compat-fields.js.map +1 -0
- package/dist/extensions/provider/configuration.d.ts +8 -0
- package/dist/extensions/provider/configuration.d.ts.map +1 -0
- package/dist/extensions/provider/configuration.js +21 -0
- package/dist/extensions/provider/configuration.js.map +1 -0
- package/dist/extensions/provider/connection.d.ts +14 -0
- package/dist/extensions/provider/connection.d.ts.map +1 -0
- package/dist/extensions/provider/connection.js +86 -0
- package/dist/extensions/provider/connection.js.map +1 -0
- package/dist/extensions/provider/constants.d.ts +38 -0
- package/dist/extensions/provider/constants.d.ts.map +1 -0
- package/dist/extensions/provider/constants.js +75 -0
- package/dist/extensions/provider/constants.js.map +1 -0
- package/dist/extensions/provider/index.d.ts +4 -0
- package/dist/extensions/provider/index.d.ts.map +1 -0
- package/dist/extensions/provider/index.js +65 -0
- package/dist/extensions/provider/index.js.map +1 -0
- package/dist/extensions/provider/probe.d.ts +34 -0
- package/dist/extensions/provider/probe.d.ts.map +1 -0
- package/dist/extensions/provider/probe.js +178 -0
- package/dist/extensions/provider/probe.js.map +1 -0
- package/dist/extensions/provider/refresh.d.ts +30 -0
- package/dist/extensions/provider/refresh.d.ts.map +1 -0
- package/dist/extensions/provider/refresh.js +66 -0
- package/dist/extensions/provider/refresh.js.map +1 -0
- package/dist/extensions/provider/store.d.ts +131 -0
- package/dist/extensions/provider/store.d.ts.map +1 -0
- package/dist/extensions/provider/store.js +503 -0
- package/dist/extensions/provider/store.js.map +1 -0
- package/dist/extensions/provider/ui/app.d.ts +25 -0
- package/dist/extensions/provider/ui/app.d.ts.map +1 -0
- package/dist/extensions/provider/ui/app.js +153 -0
- package/dist/extensions/provider/ui/app.js.map +1 -0
- package/dist/extensions/provider/ui/builtin-data.d.ts +53 -0
- package/dist/extensions/provider/ui/builtin-data.d.ts.map +1 -0
- package/dist/extensions/provider/ui/builtin-data.js +315 -0
- package/dist/extensions/provider/ui/builtin-data.js.map +1 -0
- package/dist/extensions/provider/ui/compat.d.ts +57 -0
- package/dist/extensions/provider/ui/compat.d.ts.map +1 -0
- package/dist/extensions/provider/ui/compat.js +427 -0
- package/dist/extensions/provider/ui/compat.js.map +1 -0
- package/dist/extensions/provider/ui/dialogs.d.ts +30 -0
- package/dist/extensions/provider/ui/dialogs.d.ts.map +1 -0
- package/dist/extensions/provider/ui/dialogs.js +89 -0
- package/dist/extensions/provider/ui/dialogs.js.map +1 -0
- package/dist/extensions/provider/ui/dictionary.d.ts +29 -0
- package/dist/extensions/provider/ui/dictionary.d.ts.map +1 -0
- package/dist/extensions/provider/ui/dictionary.js +385 -0
- package/dist/extensions/provider/ui/dictionary.js.map +1 -0
- package/dist/extensions/provider/ui/editor.d.ts +91 -0
- package/dist/extensions/provider/ui/editor.d.ts.map +1 -0
- package/dist/extensions/provider/ui/editor.js +667 -0
- package/dist/extensions/provider/ui/editor.js.map +1 -0
- package/dist/extensions/provider/ui/fetch-models.d.ts +39 -0
- package/dist/extensions/provider/ui/fetch-models.d.ts.map +1 -0
- package/dist/extensions/provider/ui/fetch-models.js +320 -0
- package/dist/extensions/provider/ui/fetch-models.js.map +1 -0
- package/dist/extensions/provider/ui/model-fields.d.ts +43 -0
- package/dist/extensions/provider/ui/model-fields.d.ts.map +1 -0
- package/dist/extensions/provider/ui/model-fields.js +441 -0
- package/dist/extensions/provider/ui/model-fields.js.map +1 -0
- package/dist/extensions/provider/ui/model-options.d.ts +93 -0
- package/dist/extensions/provider/ui/model-options.d.ts.map +1 -0
- package/dist/extensions/provider/ui/model-options.js +529 -0
- package/dist/extensions/provider/ui/model-options.js.map +1 -0
- package/dist/extensions/provider/ui/pane.d.ts +81 -0
- package/dist/extensions/provider/ui/pane.d.ts.map +1 -0
- package/dist/extensions/provider/ui/pane.js +3 -0
- package/dist/extensions/provider/ui/pane.js.map +1 -0
- package/dist/extensions/provider/ui/provider-fields.d.ts +60 -0
- package/dist/extensions/provider/ui/provider-fields.d.ts.map +1 -0
- package/dist/extensions/provider/ui/provider-fields.js +326 -0
- package/dist/extensions/provider/ui/provider-fields.js.map +1 -0
- package/dist/extensions/provider/ui/provider-list.d.ts +34 -0
- package/dist/extensions/provider/ui/provider-list.d.ts.map +1 -0
- package/dist/extensions/provider/ui/provider-list.js +162 -0
- package/dist/extensions/provider/ui/provider-list.js.map +1 -0
- package/dist/extensions/provider/ui/session.d.ts +20 -0
- package/dist/extensions/provider/ui/session.d.ts.map +1 -0
- package/dist/extensions/provider/ui/session.js +52 -0
- package/dist/extensions/provider/ui/session.js.map +1 -0
- package/dist/extensions/provider/ui/thinking-map.d.ts +20 -0
- package/dist/extensions/provider/ui/thinking-map.d.ts.map +1 -0
- package/dist/extensions/provider/ui/thinking-map.js +166 -0
- package/dist/extensions/provider/ui/thinking-map.js.map +1 -0
- package/dist/extensions/provider/ui/value-row.d.ts +88 -0
- package/dist/extensions/provider/ui/value-row.d.ts.map +1 -0
- package/dist/extensions/provider/ui/value-row.js +158 -0
- package/dist/extensions/provider/ui/value-row.js.map +1 -0
- package/dist/extensions/statusline/index.js +2 -2
- package/dist/extensions/statusline/index.js.map +1 -1
- package/dist/extensions/subagent/index.d.ts.map +1 -1
- package/dist/extensions/subagent/index.js +4 -2
- package/dist/extensions/subagent/index.js.map +1 -1
- package/dist/extensions/subagent/resolve.d.ts +5 -0
- package/dist/extensions/subagent/resolve.d.ts.map +1 -1
- package/dist/extensions/subagent/resolve.js +15 -7
- package/dist/extensions/subagent/resolve.js.map +1 -1
- package/dist/extensions/subagent/schema.d.ts +2 -0
- package/dist/extensions/subagent/schema.d.ts.map +1 -1
- package/dist/extensions/subagent/schema.js +1 -0
- package/dist/extensions/subagent/schema.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +10 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +20 -2
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +6 -1
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/rpc-entry.js +94 -91
- package/docs/bundled/README.md +1 -1
- package/docs/bundled/extensions/background.md +5 -5
- package/docs/bundled/extensions/provider.md +117 -0
- package/docs/bundled/extensions/statusline.md +1 -1
- package/docs/bundled/extensions/subagent.md +7 -3
- package/docs/compaction.md +16 -6
- package/docs/docs.json +2 -2
- package/docs/keybindings.md +3 -0
- package/docs/settings.md +11 -7
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/dist/extensions/router/constants.d.ts +0 -23
- package/dist/extensions/router/constants.d.ts.map +0 -1
- package/dist/extensions/router/constants.js +0 -30
- package/dist/extensions/router/constants.js.map +0 -1
- package/dist/extensions/router/dialog-host.d.ts +0 -60
- package/dist/extensions/router/dialog-host.d.ts.map +0 -1
- package/dist/extensions/router/dialog-host.js +0 -196
- package/dist/extensions/router/dialog-host.js.map +0 -1
- package/dist/extensions/router/dialog.d.ts +0 -45
- package/dist/extensions/router/dialog.d.ts.map +0 -1
- package/dist/extensions/router/dialog.js +0 -378
- package/dist/extensions/router/dialog.js.map +0 -1
- package/dist/extensions/router/identity.d.ts +0 -15
- package/dist/extensions/router/identity.d.ts.map +0 -1
- package/dist/extensions/router/identity.js +0 -173
- package/dist/extensions/router/identity.js.map +0 -1
- package/dist/extensions/router/index.d.ts +0 -15
- package/dist/extensions/router/index.d.ts.map +0 -1
- package/dist/extensions/router/index.js +0 -70
- package/dist/extensions/router/index.js.map +0 -1
- package/dist/extensions/router/presets.d.ts +0 -51
- package/dist/extensions/router/presets.d.ts.map +0 -1
- package/dist/extensions/router/presets.js +0 -108
- package/dist/extensions/router/presets.js.map +0 -1
- package/dist/extensions/router/probe.d.ts +0 -26
- package/dist/extensions/router/probe.d.ts.map +0 -1
- package/dist/extensions/router/probe.js +0 -216
- package/dist/extensions/router/probe.js.map +0 -1
- package/dist/extensions/router/register.d.ts +0 -12
- package/dist/extensions/router/register.d.ts.map +0 -1
- package/dist/extensions/router/register.js +0 -90
- package/dist/extensions/router/register.js.map +0 -1
- package/dist/extensions/router/state.d.ts +0 -20
- package/dist/extensions/router/state.d.ts.map +0 -1
- package/dist/extensions/router/state.js +0 -169
- package/dist/extensions/router/state.js.map +0 -1
- package/dist/extensions/router/store.d.ts +0 -12
- package/dist/extensions/router/store.d.ts.map +0 -1
- package/dist/extensions/router/store.js +0 -266
- package/dist/extensions/router/store.js.map +0 -1
- package/dist/extensions/router/stream.d.ts +0 -12
- package/dist/extensions/router/stream.d.ts.map +0 -1
- package/dist/extensions/router/stream.js +0 -233
- package/dist/extensions/router/stream.js.map +0 -1
- package/dist/extensions/router/transport.d.ts +0 -9
- package/dist/extensions/router/transport.d.ts.map +0 -1
- package/dist/extensions/router/transport.js +0 -81
- package/dist/extensions/router/transport.js.map +0 -1
- package/dist/extensions/router/types.d.ts +0 -39
- package/dist/extensions/router/types.d.ts.map +0 -1
- package/dist/extensions/router/types.js +0 -2
- package/dist/extensions/router/types.js.map +0 -1
- package/dist/extensions/router/ui.d.ts +0 -26
- package/dist/extensions/router/ui.d.ts.map +0 -1
- package/dist/extensions/router/ui.js +0 -897
- package/dist/extensions/router/ui.js.map +0 -1
- package/docs/bundled/extensions/router.md +0 -197
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in model catalog index and reference matching for Use Built-in Data.
|
|
3
|
+
*
|
|
4
|
+
* The index is built lazily on first use from pi-ai's raw builtin catalog
|
|
5
|
+
* (never from the runtime's user-modified getAll()). Matching is grouped by
|
|
6
|
+
* exact id, normalized id, then fuzzy match; ties prefer the current API.
|
|
7
|
+
*/
|
|
8
|
+
import type { Api, Model } from "@earendil-works/pi-ai";
|
|
9
|
+
import type { ModelsJsonModel } from "../../core/model-config.ts";
|
|
10
|
+
export interface CatalogEntry {
|
|
11
|
+
providerId: string;
|
|
12
|
+
model: Model<Api>;
|
|
13
|
+
}
|
|
14
|
+
export declare function builtinCatalogIndex(): readonly CatalogEntry[];
|
|
15
|
+
/** True when models.json with this provider id overlays a built-in catalog. */
|
|
16
|
+
export declare function isBuiltinProviderId(providerId: string): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Builtin fallback api/baseUrl for a custom model, mirroring the runtime's
|
|
19
|
+
* findModelDefaults order: same id, then same api, then any openai-completions
|
|
20
|
+
* model, then the first catalog entry.
|
|
21
|
+
*/
|
|
22
|
+
export declare function builtinDefaults(providerId: string, modelId?: string, api?: string): {
|
|
23
|
+
api?: string;
|
|
24
|
+
baseUrl?: string;
|
|
25
|
+
};
|
|
26
|
+
export type MatchTier = "exact" | "normalized" | "fuzzy";
|
|
27
|
+
export interface CatalogMatch {
|
|
28
|
+
entry: CatalogEntry;
|
|
29
|
+
tier: MatchTier;
|
|
30
|
+
}
|
|
31
|
+
/** Grouped reference candidates for a query id; at most `max` entries, best first. */
|
|
32
|
+
export declare function matchBuiltinModels(query: string, preferredApi?: string, max?: number): CatalogMatch[];
|
|
33
|
+
export type ReferenceField = "name" | "reasoning" | "input" | "contextWindow" | "maxTokens" | "thinkingLevelMap" | "compat" | "cost";
|
|
34
|
+
export interface FieldChange {
|
|
35
|
+
field: ReferenceField;
|
|
36
|
+
/** Pre-selected per the completion rules (unset scalar fields are checked; map/compat/cost never are). */
|
|
37
|
+
checked: boolean;
|
|
38
|
+
/** False = cross-API map/compat: view-only, cannot be applied. */
|
|
39
|
+
applicable: boolean;
|
|
40
|
+
/** Left side of the preview, e.g. `not set (falls back to id)`. */
|
|
41
|
+
currentText: string;
|
|
42
|
+
/** Right side of the preview, e.g. the reference value. */
|
|
43
|
+
referenceText: string;
|
|
44
|
+
/** Extra detail lines for the expandable view (thinking map entries, compat keys, cost rates). */
|
|
45
|
+
referenceDetails?: string[];
|
|
46
|
+
/** Reference carries tiers; applying cost keeps current tiers and never imports reference tiers. */
|
|
47
|
+
referenceHasTiers?: boolean;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Compute the per-field change list for applying `reference` onto `current`.
|
|
51
|
+
* Only fields the reference actually has appear; an absent map/compat on the
|
|
52
|
+
* reference never implies clearing the current value.
|
|
53
|
+
*/
|
|
54
|
+
export declare function computeFieldChanges(current: Partial<ModelsJsonModel> & {
|
|
55
|
+
id?: string;
|
|
56
|
+
}, reference: Model<Api>, effectiveApi: string | undefined): FieldChange[];
|
|
57
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../src/extensions/provider/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAGlE,MAAM,WAAW,YAAY;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;CAClB;AAID,wBAAgB,mBAAmB,IAAI,SAAS,YAAY,EAAE,CAQ7D;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC9B,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,EAChB,GAAG,CAAC,EAAE,MAAM,GACV;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAUpC;AAWD,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,YAAY,GAAG,OAAO,CAAC;AAEzD,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;CAChB;AAaD,sFAAsF;AACtF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,GAAE,MAAuB,GAAG,YAAY,EAAE,CA2BrH;AAED,MAAM,MAAM,cAAc,GACvB,MAAM,GACN,WAAW,GACX,OAAO,GACP,eAAe,GACf,WAAW,GACX,kBAAkB,GAClB,QAAQ,GACR,MAAM,CAAC;AAEV,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,cAAc,CAAC;IACtB,0GAA0G;IAC1G,OAAO,EAAE,OAAO,CAAC;IACjB,kEAAkE;IAClE,UAAU,EAAE,OAAO,CAAC;IACpB,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,aAAa,EAAE,MAAM,CAAC;IACtB,kGAAkG;IAClG,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,oGAAoG;IACpG,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC5B;AASD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAClC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,EACnD,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,EACrB,YAAY,EAAE,MAAM,GAAG,SAAS,GAC9B,WAAW,EAAE,CAwFf"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in model catalog index and reference matching for Use Built-in Data.
|
|
3
|
+
*
|
|
4
|
+
* The index is built lazily on first use from pi-ai's raw builtin catalog
|
|
5
|
+
* (never from the runtime's user-modified getAll()). Matching is grouped by
|
|
6
|
+
* exact id, normalized id, then fuzzy match; ties prefer the current API.
|
|
7
|
+
*/
|
|
8
|
+
import { getBuiltinModels, getBuiltinProviders } from "@earendil-works/pi-ai/providers/all";
|
|
9
|
+
import { fuzzyFilter } from "@earendil-works/pi-tui";
|
|
10
|
+
import { MAX_CANDIDATES, plural } from "./constants.js";
|
|
11
|
+
let indexCache;
|
|
12
|
+
export function builtinCatalogIndex() {
|
|
13
|
+
if (indexCache)
|
|
14
|
+
return indexCache;
|
|
15
|
+
const entries = [];
|
|
16
|
+
for (const providerId of getBuiltinProviders()) {
|
|
17
|
+
for (const model of getBuiltinModels(providerId))
|
|
18
|
+
entries.push({ providerId, model });
|
|
19
|
+
}
|
|
20
|
+
indexCache = entries;
|
|
21
|
+
return entries;
|
|
22
|
+
}
|
|
23
|
+
/** True when models.json with this provider id overlays a built-in catalog. */
|
|
24
|
+
export function isBuiltinProviderId(providerId) {
|
|
25
|
+
return getBuiltinProviders().includes(providerId);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Builtin fallback api/baseUrl for a custom model, mirroring the runtime's
|
|
29
|
+
* findModelDefaults order: same id, then same api, then any openai-completions
|
|
30
|
+
* model, then the first catalog entry.
|
|
31
|
+
*/
|
|
32
|
+
export function builtinDefaults(providerId, modelId, api) {
|
|
33
|
+
if (!isBuiltinProviderId(providerId))
|
|
34
|
+
return {};
|
|
35
|
+
const models = getBuiltinModels(providerId);
|
|
36
|
+
if (models.length === 0)
|
|
37
|
+
return {};
|
|
38
|
+
const found = (modelId ? models.find((model) => model.id === modelId) : undefined) ??
|
|
39
|
+
(api ? models.find((model) => model.api === api) : undefined) ??
|
|
40
|
+
models.find((model) => model.api === "openai-completions") ??
|
|
41
|
+
models[0];
|
|
42
|
+
return { api: found.api, baseUrl: found.baseUrl };
|
|
43
|
+
}
|
|
44
|
+
/** Case-insensitive, separator-tolerant comparison key; keeps version/date/thinking variants. */
|
|
45
|
+
function normalizeId(id) {
|
|
46
|
+
const basename = id.includes("/") ? id.slice(id.lastIndexOf("/") + 1) : id;
|
|
47
|
+
return basename
|
|
48
|
+
.toLowerCase()
|
|
49
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
50
|
+
.replace(/^-+|-+$/g, "");
|
|
51
|
+
}
|
|
52
|
+
function sortTier(matches, preferredApi) {
|
|
53
|
+
return matches.sort((a, b) => {
|
|
54
|
+
if (preferredApi) {
|
|
55
|
+
const aPreferred = a.entry.model.api === preferredApi ? 0 : 1;
|
|
56
|
+
const bPreferred = b.entry.model.api === preferredApi ? 0 : 1;
|
|
57
|
+
if (aPreferred !== bPreferred)
|
|
58
|
+
return aPreferred - bPreferred;
|
|
59
|
+
}
|
|
60
|
+
return a.entry.model.id.localeCompare(b.entry.model.id);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/** Grouped reference candidates for a query id; at most `max` entries, best first. */
|
|
64
|
+
export function matchBuiltinModels(query, preferredApi, max = MAX_CANDIDATES) {
|
|
65
|
+
const trimmed = query.trim();
|
|
66
|
+
if (!trimmed)
|
|
67
|
+
return [];
|
|
68
|
+
const index = builtinCatalogIndex();
|
|
69
|
+
const normalizedQuery = normalizeId(trimmed);
|
|
70
|
+
const exact = [];
|
|
71
|
+
const normalized = [];
|
|
72
|
+
const consumed = new Set();
|
|
73
|
+
for (const entry of index) {
|
|
74
|
+
if (entry.model.id === trimmed) {
|
|
75
|
+
exact.push({ entry, tier: "exact" });
|
|
76
|
+
consumed.add(entry);
|
|
77
|
+
}
|
|
78
|
+
else if (normalizeId(entry.model.id) === normalizedQuery) {
|
|
79
|
+
normalized.push({ entry, tier: "normalized" });
|
|
80
|
+
consumed.add(entry);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const remaining = sortTier(index.filter((entry) => !consumed.has(entry)).map((entry) => ({ entry, tier: "fuzzy" })), preferredApi);
|
|
84
|
+
const fuzzy = fuzzyFilter(remaining, trimmed, ({ entry }) => `${entry.model.id} ${entry.model.name} ${entry.providerId}`);
|
|
85
|
+
return [...sortTier(exact, preferredApi), ...sortTier(normalized, preferredApi), ...fuzzy].slice(0, max);
|
|
86
|
+
}
|
|
87
|
+
const DEFAULT_CONTEXT_WINDOW = 128000;
|
|
88
|
+
const DEFAULT_MAX_TOKENS = 16384;
|
|
89
|
+
function formatCostRates(cost) {
|
|
90
|
+
return `$${cost.input} / $${cost.output} in/out (cache $${cost.cacheRead} / $${cost.cacheWrite})`;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Compute the per-field change list for applying `reference` onto `current`.
|
|
94
|
+
* Only fields the reference actually has appear; an absent map/compat on the
|
|
95
|
+
* reference never implies clearing the current value.
|
|
96
|
+
*/
|
|
97
|
+
export function computeFieldChanges(current, reference, effectiveApi) {
|
|
98
|
+
const changes = [];
|
|
99
|
+
const unset = (key) => current[key] === undefined;
|
|
100
|
+
changes.push({
|
|
101
|
+
field: "name",
|
|
102
|
+
checked: unset("name") && reference.name !== reference.id,
|
|
103
|
+
applicable: true,
|
|
104
|
+
currentText: current.name ?? `not set (falls back to id${current.id ? ` "${current.id}"` : ""})`,
|
|
105
|
+
referenceText: reference.name,
|
|
106
|
+
});
|
|
107
|
+
changes.push({
|
|
108
|
+
field: "reasoning",
|
|
109
|
+
checked: unset("reasoning") && reference.reasoning === true,
|
|
110
|
+
applicable: true,
|
|
111
|
+
currentText: current.reasoning === undefined ? "false (default)" : String(current.reasoning),
|
|
112
|
+
referenceText: String(reference.reasoning),
|
|
113
|
+
});
|
|
114
|
+
changes.push({
|
|
115
|
+
field: "input",
|
|
116
|
+
checked: unset("input"),
|
|
117
|
+
applicable: true,
|
|
118
|
+
currentText: current.input ? current.input.join(", ") : "text (default)",
|
|
119
|
+
referenceText: reference.input.join(", "),
|
|
120
|
+
});
|
|
121
|
+
changes.push({
|
|
122
|
+
field: "contextWindow",
|
|
123
|
+
checked: unset("contextWindow"),
|
|
124
|
+
applicable: true,
|
|
125
|
+
currentText: current.contextWindow === undefined ? `${DEFAULT_CONTEXT_WINDOW} (default)` : String(current.contextWindow),
|
|
126
|
+
referenceText: String(reference.contextWindow),
|
|
127
|
+
});
|
|
128
|
+
changes.push({
|
|
129
|
+
field: "maxTokens",
|
|
130
|
+
checked: unset("maxTokens"),
|
|
131
|
+
applicable: true,
|
|
132
|
+
currentText: current.maxTokens === undefined ? `${DEFAULT_MAX_TOKENS} (default)` : String(current.maxTokens),
|
|
133
|
+
referenceText: String(reference.maxTokens),
|
|
134
|
+
});
|
|
135
|
+
const sameApi = effectiveApi !== undefined && reference.api === effectiveApi;
|
|
136
|
+
if (reference.thinkingLevelMap && Object.keys(reference.thinkingLevelMap).length > 0) {
|
|
137
|
+
const details = Object.entries(reference.thinkingLevelMap).map(([level, target]) => `${level}: ${target === null ? "null (hidden)" : target}`);
|
|
138
|
+
changes.push({
|
|
139
|
+
field: "thinkingLevelMap",
|
|
140
|
+
checked: false,
|
|
141
|
+
applicable: sameApi,
|
|
142
|
+
currentText: current.thinkingLevelMap
|
|
143
|
+
? `${Object.keys(current.thinkingLevelMap).length} ${plural(Object.keys(current.thinkingLevelMap).length, "mapping")}`
|
|
144
|
+
: "not set",
|
|
145
|
+
// Cross-api maps are view-only; the preview pane annotates that.
|
|
146
|
+
referenceText: `${details.length} ${plural(details.length, "mapping")}`,
|
|
147
|
+
referenceDetails: details,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
if (reference.compat && Object.keys(reference.compat).length > 0) {
|
|
151
|
+
const details = Object.entries(reference.compat).map(([key, value]) => `${key}: ${JSON.stringify(value)}`);
|
|
152
|
+
changes.push({
|
|
153
|
+
field: "compat",
|
|
154
|
+
checked: false,
|
|
155
|
+
applicable: sameApi,
|
|
156
|
+
currentText: current.compat
|
|
157
|
+
? `${Object.keys(current.compat).length} ${plural(Object.keys(current.compat).length, "entry")}`
|
|
158
|
+
: "not set",
|
|
159
|
+
referenceText: `${details.length} ${plural(details.length, "entry")}`,
|
|
160
|
+
referenceDetails: details,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
if (reference.cost) {
|
|
164
|
+
changes.push({
|
|
165
|
+
field: "cost",
|
|
166
|
+
checked: false,
|
|
167
|
+
applicable: true,
|
|
168
|
+
currentText: current.cost ? formatCostRates(current.cost) : "all 0 (default)",
|
|
169
|
+
referenceText: formatCostRates(reference.cost),
|
|
170
|
+
referenceDetails: [
|
|
171
|
+
`input: $${reference.cost.input} / M tokens`,
|
|
172
|
+
`output: $${reference.cost.output} / M tokens`,
|
|
173
|
+
`cacheRead: $${reference.cost.cacheRead} / M tokens`,
|
|
174
|
+
`cacheWrite: $${reference.cost.cacheWrite} / M tokens`,
|
|
175
|
+
],
|
|
176
|
+
referenceHasTiers: Array.isArray(reference.cost.tiers) && reference.cost.tiers.length > 0,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
return changes;
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/extensions/provider/catalog.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Built-in model catalog index and reference matching for Use Built-in Data.\n *\n * The index is built lazily on first use from pi-ai's raw builtin catalog\n * (never from the runtime's user-modified getAll()). Matching is grouped by\n * exact id, normalized id, then fuzzy match; ties prefer the current API.\n */\n\nimport type { Api, Model } from \"@earendil-works/pi-ai\";\nimport { getBuiltinModels, getBuiltinProviders } from \"@earendil-works/pi-ai/providers/all\";\nimport { fuzzyFilter } from \"@earendil-works/pi-tui\";\nimport type { ModelsJsonModel } from \"../../core/model-config.ts\";\nimport { MAX_CANDIDATES, plural } from \"./constants.ts\";\n\nexport interface CatalogEntry {\n\tproviderId: string;\n\tmodel: Model<Api>;\n}\n\nlet indexCache: readonly CatalogEntry[] | undefined;\n\nexport function builtinCatalogIndex(): readonly CatalogEntry[] {\n\tif (indexCache) return indexCache;\n\tconst entries: CatalogEntry[] = [];\n\tfor (const providerId of getBuiltinProviders()) {\n\t\tfor (const model of getBuiltinModels(providerId)) entries.push({ providerId, model });\n\t}\n\tindexCache = entries;\n\treturn entries;\n}\n\n/** True when models.json with this provider id overlays a built-in catalog. */\nexport function isBuiltinProviderId(providerId: string): boolean {\n\treturn (getBuiltinProviders() as readonly string[]).includes(providerId);\n}\n\n/**\n * Builtin fallback api/baseUrl for a custom model, mirroring the runtime's\n * findModelDefaults order: same id, then same api, then any openai-completions\n * model, then the first catalog entry.\n */\nexport function builtinDefaults(\n\tproviderId: string,\n\tmodelId?: string,\n\tapi?: string,\n): { api?: string; baseUrl?: string } {\n\tif (!isBuiltinProviderId(providerId)) return {};\n\tconst models = getBuiltinModels(providerId as never) as readonly Model<Api>[];\n\tif (models.length === 0) return {};\n\tconst found =\n\t\t(modelId ? models.find((model) => model.id === modelId) : undefined) ??\n\t\t(api ? models.find((model) => model.api === api) : undefined) ??\n\t\tmodels.find((model) => model.api === \"openai-completions\") ??\n\t\tmodels[0];\n\treturn { api: found.api, baseUrl: found.baseUrl };\n}\n\n/** Case-insensitive, separator-tolerant comparison key; keeps version/date/thinking variants. */\nfunction normalizeId(id: string): string {\n\tconst basename = id.includes(\"/\") ? id.slice(id.lastIndexOf(\"/\") + 1) : id;\n\treturn basename\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\");\n}\n\nexport type MatchTier = \"exact\" | \"normalized\" | \"fuzzy\";\n\nexport interface CatalogMatch {\n\tentry: CatalogEntry;\n\ttier: MatchTier;\n}\n\nfunction sortTier(matches: CatalogMatch[], preferredApi: string | undefined): CatalogMatch[] {\n\treturn matches.sort((a, b) => {\n\t\tif (preferredApi) {\n\t\t\tconst aPreferred = a.entry.model.api === preferredApi ? 0 : 1;\n\t\t\tconst bPreferred = b.entry.model.api === preferredApi ? 0 : 1;\n\t\t\tif (aPreferred !== bPreferred) return aPreferred - bPreferred;\n\t\t}\n\t\treturn a.entry.model.id.localeCompare(b.entry.model.id);\n\t});\n}\n\n/** Grouped reference candidates for a query id; at most `max` entries, best first. */\nexport function matchBuiltinModels(query: string, preferredApi?: string, max: number = MAX_CANDIDATES): CatalogMatch[] {\n\tconst trimmed = query.trim();\n\tif (!trimmed) return [];\n\tconst index = builtinCatalogIndex();\n\tconst normalizedQuery = normalizeId(trimmed);\n\tconst exact: CatalogMatch[] = [];\n\tconst normalized: CatalogMatch[] = [];\n\tconst consumed = new Set<CatalogEntry>();\n\tfor (const entry of index) {\n\t\tif (entry.model.id === trimmed) {\n\t\t\texact.push({ entry, tier: \"exact\" });\n\t\t\tconsumed.add(entry);\n\t\t} else if (normalizeId(entry.model.id) === normalizedQuery) {\n\t\t\tnormalized.push({ entry, tier: \"normalized\" });\n\t\t\tconsumed.add(entry);\n\t\t}\n\t}\n\tconst remaining = sortTier(\n\t\tindex.filter((entry) => !consumed.has(entry)).map((entry) => ({ entry, tier: \"fuzzy\" })),\n\t\tpreferredApi,\n\t);\n\tconst fuzzy: CatalogMatch[] = fuzzyFilter(\n\t\tremaining,\n\t\ttrimmed,\n\t\t({ entry }) => `${entry.model.id} ${entry.model.name} ${entry.providerId}`,\n\t);\n\treturn [...sortTier(exact, preferredApi), ...sortTier(normalized, preferredApi), ...fuzzy].slice(0, max);\n}\n\nexport type ReferenceField =\n\t| \"name\"\n\t| \"reasoning\"\n\t| \"input\"\n\t| \"contextWindow\"\n\t| \"maxTokens\"\n\t| \"thinkingLevelMap\"\n\t| \"compat\"\n\t| \"cost\";\n\nexport interface FieldChange {\n\tfield: ReferenceField;\n\t/** Pre-selected per the completion rules (unset scalar fields are checked; map/compat/cost never are). */\n\tchecked: boolean;\n\t/** False = cross-API map/compat: view-only, cannot be applied. */\n\tapplicable: boolean;\n\t/** Left side of the preview, e.g. `not set (falls back to id)`. */\n\tcurrentText: string;\n\t/** Right side of the preview, e.g. the reference value. */\n\treferenceText: string;\n\t/** Extra detail lines for the expandable view (thinking map entries, compat keys, cost rates). */\n\treferenceDetails?: string[];\n\t/** Reference carries tiers; applying cost keeps current tiers and never imports reference tiers. */\n\treferenceHasTiers?: boolean;\n}\n\nconst DEFAULT_CONTEXT_WINDOW = 128000;\nconst DEFAULT_MAX_TOKENS = 16384;\n\nfunction formatCostRates(cost: { input: number; output: number; cacheRead: number; cacheWrite: number }): string {\n\treturn `$${cost.input} / $${cost.output} in/out (cache $${cost.cacheRead} / $${cost.cacheWrite})`;\n}\n\n/**\n * Compute the per-field change list for applying `reference` onto `current`.\n * Only fields the reference actually has appear; an absent map/compat on the\n * reference never implies clearing the current value.\n */\nexport function computeFieldChanges(\n\tcurrent: Partial<ModelsJsonModel> & { id?: string },\n\treference: Model<Api>,\n\teffectiveApi: string | undefined,\n): FieldChange[] {\n\tconst changes: FieldChange[] = [];\n\tconst unset = (key: keyof ModelsJsonModel) => current[key] === undefined;\n\n\tchanges.push({\n\t\tfield: \"name\",\n\t\tchecked: unset(\"name\") && reference.name !== reference.id,\n\t\tapplicable: true,\n\t\tcurrentText: current.name ?? `not set (falls back to id${current.id ? ` \"${current.id}\"` : \"\"})`,\n\t\treferenceText: reference.name,\n\t});\n\tchanges.push({\n\t\tfield: \"reasoning\",\n\t\tchecked: unset(\"reasoning\") && reference.reasoning === true,\n\t\tapplicable: true,\n\t\tcurrentText: current.reasoning === undefined ? \"false (default)\" : String(current.reasoning),\n\t\treferenceText: String(reference.reasoning),\n\t});\n\tchanges.push({\n\t\tfield: \"input\",\n\t\tchecked: unset(\"input\"),\n\t\tapplicable: true,\n\t\tcurrentText: current.input ? current.input.join(\", \") : \"text (default)\",\n\t\treferenceText: reference.input.join(\", \"),\n\t});\n\tchanges.push({\n\t\tfield: \"contextWindow\",\n\t\tchecked: unset(\"contextWindow\"),\n\t\tapplicable: true,\n\t\tcurrentText:\n\t\t\tcurrent.contextWindow === undefined ? `${DEFAULT_CONTEXT_WINDOW} (default)` : String(current.contextWindow),\n\t\treferenceText: String(reference.contextWindow),\n\t});\n\tchanges.push({\n\t\tfield: \"maxTokens\",\n\t\tchecked: unset(\"maxTokens\"),\n\t\tapplicable: true,\n\t\tcurrentText: current.maxTokens === undefined ? `${DEFAULT_MAX_TOKENS} (default)` : String(current.maxTokens),\n\t\treferenceText: String(reference.maxTokens),\n\t});\n\n\tconst sameApi = effectiveApi !== undefined && reference.api === effectiveApi;\n\tif (reference.thinkingLevelMap && Object.keys(reference.thinkingLevelMap).length > 0) {\n\t\tconst details = Object.entries(reference.thinkingLevelMap).map(\n\t\t\t([level, target]) => `${level}: ${target === null ? \"null (hidden)\" : target}`,\n\t\t);\n\t\tchanges.push({\n\t\t\tfield: \"thinkingLevelMap\",\n\t\t\tchecked: false,\n\t\t\tapplicable: sameApi,\n\t\t\tcurrentText: current.thinkingLevelMap\n\t\t\t\t? `${Object.keys(current.thinkingLevelMap).length} ${plural(Object.keys(current.thinkingLevelMap).length, \"mapping\")}`\n\t\t\t\t: \"not set\",\n\t\t\t// Cross-api maps are view-only; the preview pane annotates that.\n\t\t\treferenceText: `${details.length} ${plural(details.length, \"mapping\")}`,\n\t\t\treferenceDetails: details,\n\t\t});\n\t}\n\tif (reference.compat && Object.keys(reference.compat).length > 0) {\n\t\tconst details = Object.entries(reference.compat).map(([key, value]) => `${key}: ${JSON.stringify(value)}`);\n\t\tchanges.push({\n\t\t\tfield: \"compat\",\n\t\t\tchecked: false,\n\t\t\tapplicable: sameApi,\n\t\t\tcurrentText: current.compat\n\t\t\t\t? `${Object.keys(current.compat).length} ${plural(Object.keys(current.compat).length, \"entry\")}`\n\t\t\t\t: \"not set\",\n\t\t\treferenceText: `${details.length} ${plural(details.length, \"entry\")}`,\n\t\t\treferenceDetails: details,\n\t\t});\n\t}\n\tif (reference.cost) {\n\t\tchanges.push({\n\t\t\tfield: \"cost\",\n\t\t\tchecked: false,\n\t\t\tapplicable: true,\n\t\t\tcurrentText: current.cost ? formatCostRates(current.cost) : \"all 0 (default)\",\n\t\t\treferenceText: formatCostRates(reference.cost),\n\t\t\treferenceDetails: [\n\t\t\t\t`input: $${reference.cost.input} / M tokens`,\n\t\t\t\t`output: $${reference.cost.output} / M tokens`,\n\t\t\t\t`cacheRead: $${reference.cost.cacheRead} / M tokens`,\n\t\t\t\t`cacheWrite: $${reference.cost.cacheWrite} / M tokens`,\n\t\t\t],\n\t\t\treferenceHasTiers: Array.isArray(reference.cost.tiers) && reference.cost.tiers.length > 0,\n\t\t});\n\t}\n\treturn changes;\n}\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compat field catalog per effective API, derived from pi-ai's public compat
|
|
3
|
+
* types (OpenAICompletionsCompat / OpenAIResponsesCompat /
|
|
4
|
+
* AnthropicMessagesCompat / BedrockCompat). Each API variant exposes only the settings consumed by its published
|
|
5
|
+
* implementation; existing foreign fields are preserved by the editor.
|
|
6
|
+
*/
|
|
7
|
+
export type CompatValueKind = "boolean" | "enum" | "number" | "stringMap" | "json";
|
|
8
|
+
export type CompatField<Key extends string = string> = {
|
|
9
|
+
key: Key;
|
|
10
|
+
note?: string;
|
|
11
|
+
} & ({
|
|
12
|
+
kind: "enum";
|
|
13
|
+
options: readonly string[];
|
|
14
|
+
} | {
|
|
15
|
+
kind: Exclude<CompatValueKind, "enum">;
|
|
16
|
+
});
|
|
17
|
+
export declare const THINKING_VARIABLES: readonly ["thinking.enabled", "thinking.effort", "thinking.budget"];
|
|
18
|
+
/** Compat fields known for the given effective api; empty when the API consumes no compat object. */
|
|
19
|
+
export declare function compatFieldsForApi(api: string): readonly CompatField[];
|
|
20
|
+
export declare function compatFieldFor(api: string, key: string): CompatField | undefined;
|
|
21
|
+
/** Parse JSON values and reuse the canonical models.json schema, including nested validation. */
|
|
22
|
+
export declare function validateJsonCompatValue(key: string, text: string): string | undefined;
|
|
23
|
+
/** Chat-template values share the core schema and the published pi-ai value contract. */
|
|
24
|
+
export declare function validateChatTemplateKwarg(value: unknown): string | undefined;
|
|
25
|
+
//# sourceMappingURL=compat-fields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compat-fields.d.ts","sourceRoot":"","sources":["../../../src/extensions/provider/compat-fields.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC;AAEnF,MAAM,MAAM,WAAW,CAAC,GAAG,SAAS,MAAM,GAAG,MAAM,IAAI;IACtD,GAAG,EAAE,GAAG,CAAC;IACT,IAAI,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC,CAAC;AAEhG,eAAO,MAAM,kBAAkB,qEAI0D,CAAC;AA6F1F,qGAAqG;AACrG,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,WAAW,EAAE,CA0BtE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAEhF;AAED,iGAAiG;AACjG,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQrF;AAED,yFAAyF;AACzF,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAW5E"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compat field catalog per effective API, derived from pi-ai's public compat
|
|
3
|
+
* types (OpenAICompletionsCompat / OpenAIResponsesCompat /
|
|
4
|
+
* AnthropicMessagesCompat / BedrockCompat). Each API variant exposes only the settings consumed by its published
|
|
5
|
+
* implementation; existing foreign fields are preserved by the editor.
|
|
6
|
+
*/
|
|
7
|
+
import { ModelConfig } from "../../core/model-config.js";
|
|
8
|
+
export const THINKING_VARIABLES = [
|
|
9
|
+
"thinking.enabled",
|
|
10
|
+
"thinking.effort",
|
|
11
|
+
"thinking.budget",
|
|
12
|
+
];
|
|
13
|
+
const SESSION_AFFINITY = ["openai", "openai-nosession", "openrouter"];
|
|
14
|
+
const OPENAI_COMPLETIONS_FIELDS = [
|
|
15
|
+
{ key: "supportsStore", kind: "boolean", note: "Accepts the `store` parameter" },
|
|
16
|
+
{ key: "supportsDeveloperRole", kind: "boolean", note: "Accepts `developer` role messages" },
|
|
17
|
+
{ key: "supportsReasoningEffort", kind: "boolean", note: "Accepts `reasoning_effort`" },
|
|
18
|
+
{ key: "supportsUsageInStreaming", kind: "boolean", note: "Streams usage chunks" },
|
|
19
|
+
{ key: "supportsFinishReason", kind: "boolean", note: "Reports finish reasons" },
|
|
20
|
+
{
|
|
21
|
+
key: "maxTokensField",
|
|
22
|
+
kind: "enum",
|
|
23
|
+
options: ["max_completion_tokens", "max_tokens"],
|
|
24
|
+
note: "Token limit field name",
|
|
25
|
+
},
|
|
26
|
+
{ key: "requiresToolResultName", kind: "boolean", note: "Tool results need a `name`" },
|
|
27
|
+
{ key: "requiresAssistantAfterToolResult", kind: "boolean", note: "Needs assistant message after tool results" },
|
|
28
|
+
{ key: "requiresThinkingAsText", kind: "boolean", note: "Thinking must be plain text" },
|
|
29
|
+
{
|
|
30
|
+
key: "requiresReasoningContentOnAssistantMessages",
|
|
31
|
+
kind: "boolean",
|
|
32
|
+
note: "Assistant messages must carry reasoning content",
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
key: "thinkingFormat",
|
|
36
|
+
kind: "enum",
|
|
37
|
+
options: [
|
|
38
|
+
"openai",
|
|
39
|
+
"openrouter",
|
|
40
|
+
"together",
|
|
41
|
+
"baseten",
|
|
42
|
+
"deepseek",
|
|
43
|
+
"zai",
|
|
44
|
+
"qwen",
|
|
45
|
+
"chat-template",
|
|
46
|
+
"qwen-chat-template",
|
|
47
|
+
"string-thinking",
|
|
48
|
+
"ant-ling",
|
|
49
|
+
],
|
|
50
|
+
note: "Reasoning payload format",
|
|
51
|
+
},
|
|
52
|
+
{ key: "chatTemplateKwargs", kind: "stringMap", note: "Extra chat-template kwargs (open dictionary)" },
|
|
53
|
+
{ key: "chatTemplateArgs", kind: "stringMap", note: "Extra chat-template args (open dictionary)" },
|
|
54
|
+
{ key: "cacheControlFormat", kind: "enum", options: ["anthropic"], note: "Cache-control payload format" },
|
|
55
|
+
{ key: "openRouterRouting", kind: "json", note: "OpenRouter routing preferences object" },
|
|
56
|
+
{ key: "vercelGatewayRouting", kind: "json", note: "Vercel AI Gateway routing object" },
|
|
57
|
+
{ key: "supportsOpenAIGrammarTools", kind: "boolean", note: "Grammar-constrained tool calls" },
|
|
58
|
+
{ key: "supportsStrictMode", kind: "boolean", note: "Strict tool schemas" },
|
|
59
|
+
{ key: "sendSessionAffinityHeaders", kind: "boolean", note: "Send session affinity headers" },
|
|
60
|
+
{ key: "deferredToolsMode", kind: "enum", options: ["kimi"], note: "Deferred tool-call handling" },
|
|
61
|
+
{ key: "sessionAffinityFormat", kind: "enum", options: SESSION_AFFINITY, note: "Affinity header format" },
|
|
62
|
+
{ key: "supportsLongCacheRetention", kind: "boolean", note: "Long-lived prompt cache retention" },
|
|
63
|
+
{ key: "vllmPriority", kind: "number", note: "vLLM scheduling priority" },
|
|
64
|
+
{ key: "zaiToolStream", kind: "boolean", note: "Z.AI streaming tool calls" },
|
|
65
|
+
{ key: "supportsThinkingTokenBudget", kind: "boolean", note: "Enable the thinking-token budget alias" },
|
|
66
|
+
{
|
|
67
|
+
key: "thinkingTokenBudgetField",
|
|
68
|
+
kind: "enum",
|
|
69
|
+
options: ["thinking_token_budget", "thinking_budget", "thinking_budget_tokens"],
|
|
70
|
+
note: "Thinking budget field",
|
|
71
|
+
},
|
|
72
|
+
];
|
|
73
|
+
const OPENAI_RESPONSES_FIELDS = [
|
|
74
|
+
{ key: "supportsDeveloperRole", kind: "boolean", note: "Accepts `developer` role messages" },
|
|
75
|
+
{ key: "sessionAffinityFormat", kind: "enum", options: SESSION_AFFINITY, note: "Affinity header format" },
|
|
76
|
+
{ key: "supportsLongCacheRetention", kind: "boolean", note: "Long-lived prompt cache retention" },
|
|
77
|
+
{ key: "supportsStrictMode", kind: "boolean", note: "Strict tool schemas" },
|
|
78
|
+
{ key: "supportsOpenAIGrammarTools", kind: "boolean", note: "Grammar-constrained tool calls" },
|
|
79
|
+
{ key: "supportsAdditionalTools", kind: "boolean", note: "Accepts additional hosted tools" },
|
|
80
|
+
{ key: "supportsToolSearch", kind: "boolean", note: "Tool search support" },
|
|
81
|
+
{ key: "supportsMaxOutputTokens", kind: "boolean", note: "Accepts `max_output_tokens`" },
|
|
82
|
+
{ key: "supportsExplicitPromptCacheMode", kind: "boolean", note: "Explicit prompt caching" },
|
|
83
|
+
];
|
|
84
|
+
const ANTHROPIC_MESSAGES_FIELDS = [
|
|
85
|
+
{ key: "supportsEagerToolInputStreaming", kind: "boolean", note: "Streams tool input eagerly" },
|
|
86
|
+
{ key: "supportsLongCacheRetention", kind: "boolean", note: "Long-lived prompt cache retention" },
|
|
87
|
+
{ key: "sendSessionAffinityHeaders", kind: "boolean", note: "Send session affinity headers" },
|
|
88
|
+
{ key: "supportsCacheControlOnTools", kind: "boolean", note: "Cache control on tool definitions" },
|
|
89
|
+
{ key: "supportsTemperature", kind: "boolean", note: "Accepts `temperature`" },
|
|
90
|
+
{ key: "forceAdaptiveThinking", kind: "boolean", note: "Force adaptive thinking mode" },
|
|
91
|
+
{ key: "allowEmptySignature", kind: "boolean", note: "Tolerate empty thinking signatures" },
|
|
92
|
+
{ key: "supportsStrictTools", kind: "boolean", note: "Strict tool schemas" },
|
|
93
|
+
{ key: "supportsMidConvoEffort", kind: "boolean", note: "Effort changes mid-conversation" },
|
|
94
|
+
{ key: "supportsToolReferences", kind: "boolean", note: "Tool references support" },
|
|
95
|
+
];
|
|
96
|
+
const BEDROCK_FIELDS = [
|
|
97
|
+
{ key: "supportsStrictMode", kind: "boolean", note: "Strict tool schemas" },
|
|
98
|
+
];
|
|
99
|
+
/** Compat fields known for the given effective api; empty when the API consumes no compat object. */
|
|
100
|
+
export function compatFieldsForApi(api) {
|
|
101
|
+
switch (api) {
|
|
102
|
+
case "openai-completions":
|
|
103
|
+
return OPENAI_COMPLETIONS_FIELDS;
|
|
104
|
+
case "openai-responses":
|
|
105
|
+
return OPENAI_RESPONSES_FIELDS;
|
|
106
|
+
case "azure-openai-responses":
|
|
107
|
+
return OPENAI_RESPONSES_FIELDS.filter((field) => ["supportsDeveloperRole", "supportsStrictMode", "supportsOpenAIGrammarTools"].includes(field.key));
|
|
108
|
+
case "openai-codex-responses":
|
|
109
|
+
return OPENAI_RESPONSES_FIELDS.filter((field) => [
|
|
110
|
+
"supportsStrictMode",
|
|
111
|
+
"supportsOpenAIGrammarTools",
|
|
112
|
+
"supportsAdditionalTools",
|
|
113
|
+
"supportsToolSearch",
|
|
114
|
+
].includes(field.key));
|
|
115
|
+
case "anthropic-messages":
|
|
116
|
+
return ANTHROPIC_MESSAGES_FIELDS;
|
|
117
|
+
case "bedrock-converse-stream":
|
|
118
|
+
return BEDROCK_FIELDS;
|
|
119
|
+
default:
|
|
120
|
+
return [];
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
export function compatFieldFor(api, key) {
|
|
124
|
+
return compatFieldsForApi(api).find((field) => field.key === key);
|
|
125
|
+
}
|
|
126
|
+
/** Parse JSON values and reuse the canonical models.json schema, including nested validation. */
|
|
127
|
+
export function validateJsonCompatValue(key, text) {
|
|
128
|
+
let value;
|
|
129
|
+
try {
|
|
130
|
+
value = JSON.parse(text);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return "Value is not valid JSON.";
|
|
134
|
+
}
|
|
135
|
+
return ModelConfig.validateCompat("openai-completions", { [key]: value });
|
|
136
|
+
}
|
|
137
|
+
/** Chat-template values share the core schema and the published pi-ai value contract. */
|
|
138
|
+
export function validateChatTemplateKwarg(value) {
|
|
139
|
+
if (value !== null &&
|
|
140
|
+
typeof value === "object" &&
|
|
141
|
+
!Array.isArray(value) &&
|
|
142
|
+
!Object.keys(value).every((key) => key === "$var" || key === "omitWhenOff")) {
|
|
143
|
+
return 'Only "$var" and "omitWhenOff" are allowed.';
|
|
144
|
+
}
|
|
145
|
+
const error = ModelConfig.validateCompat("openai-completions", { chatTemplateKwargs: { value } });
|
|
146
|
+
return error ? `Value must be a scalar or valid $var reference: ${error}` : undefined;
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=compat-fields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compat-fields.js","sourceRoot":"","sources":["../../../src/extensions/provider/compat-fields.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Compat field catalog per effective API, derived from pi-ai's public compat\n * types (OpenAICompletionsCompat / OpenAIResponsesCompat /\n * AnthropicMessagesCompat / BedrockCompat). Each API variant exposes only the settings consumed by its published\n * implementation; existing foreign fields are preserved by the editor.\n */\n\nimport type {\n\tAnthropicMessagesCompat,\n\tBedrockCompat,\n\tChatTemplateKwargValue,\n\tOpenAICompletionsCompat,\n\tOpenAIResponsesCompat,\n} from \"@earendil-works/pi-ai\";\nimport { ModelConfig } from \"../../core/model-config.ts\";\n\nexport type CompatValueKind = \"boolean\" | \"enum\" | \"number\" | \"stringMap\" | \"json\";\n\nexport type CompatField<Key extends string = string> = {\n\tkey: Key;\n\tnote?: string;\n} & ({ kind: \"enum\"; options: readonly string[] } | { kind: Exclude<CompatValueKind, \"enum\"> });\n\nexport const THINKING_VARIABLES = [\n\t\"thinking.enabled\",\n\t\"thinking.effort\",\n\t\"thinking.budget\",\n] as const satisfies readonly Extract<ChatTemplateKwargValue, { $var: string }>[\"$var\"][];\n\nconst SESSION_AFFINITY = [\"openai\", \"openai-nosession\", \"openrouter\"] as const;\n\nconst OPENAI_COMPLETIONS_FIELDS: readonly CompatField<keyof OpenAICompletionsCompat>[] = [\n\t{ key: \"supportsStore\", kind: \"boolean\", note: \"Accepts the `store` parameter\" },\n\t{ key: \"supportsDeveloperRole\", kind: \"boolean\", note: \"Accepts `developer` role messages\" },\n\t{ key: \"supportsReasoningEffort\", kind: \"boolean\", note: \"Accepts `reasoning_effort`\" },\n\t{ key: \"supportsUsageInStreaming\", kind: \"boolean\", note: \"Streams usage chunks\" },\n\t{ key: \"supportsFinishReason\", kind: \"boolean\", note: \"Reports finish reasons\" },\n\t{\n\t\tkey: \"maxTokensField\",\n\t\tkind: \"enum\",\n\t\toptions: [\"max_completion_tokens\", \"max_tokens\"],\n\t\tnote: \"Token limit field name\",\n\t},\n\t{ key: \"requiresToolResultName\", kind: \"boolean\", note: \"Tool results need a `name`\" },\n\t{ key: \"requiresAssistantAfterToolResult\", kind: \"boolean\", note: \"Needs assistant message after tool results\" },\n\t{ key: \"requiresThinkingAsText\", kind: \"boolean\", note: \"Thinking must be plain text\" },\n\t{\n\t\tkey: \"requiresReasoningContentOnAssistantMessages\",\n\t\tkind: \"boolean\",\n\t\tnote: \"Assistant messages must carry reasoning content\",\n\t},\n\t{\n\t\tkey: \"thinkingFormat\",\n\t\tkind: \"enum\",\n\t\toptions: [\n\t\t\t\"openai\",\n\t\t\t\"openrouter\",\n\t\t\t\"together\",\n\t\t\t\"baseten\",\n\t\t\t\"deepseek\",\n\t\t\t\"zai\",\n\t\t\t\"qwen\",\n\t\t\t\"chat-template\",\n\t\t\t\"qwen-chat-template\",\n\t\t\t\"string-thinking\",\n\t\t\t\"ant-ling\",\n\t\t],\n\t\tnote: \"Reasoning payload format\",\n\t},\n\t{ key: \"chatTemplateKwargs\", kind: \"stringMap\", note: \"Extra chat-template kwargs (open dictionary)\" },\n\t{ key: \"chatTemplateArgs\", kind: \"stringMap\", note: \"Extra chat-template args (open dictionary)\" },\n\t{ key: \"cacheControlFormat\", kind: \"enum\", options: [\"anthropic\"], note: \"Cache-control payload format\" },\n\t{ key: \"openRouterRouting\", kind: \"json\", note: \"OpenRouter routing preferences object\" },\n\t{ key: \"vercelGatewayRouting\", kind: \"json\", note: \"Vercel AI Gateway routing object\" },\n\t{ key: \"supportsOpenAIGrammarTools\", kind: \"boolean\", note: \"Grammar-constrained tool calls\" },\n\t{ key: \"supportsStrictMode\", kind: \"boolean\", note: \"Strict tool schemas\" },\n\t{ key: \"sendSessionAffinityHeaders\", kind: \"boolean\", note: \"Send session affinity headers\" },\n\t{ key: \"deferredToolsMode\", kind: \"enum\", options: [\"kimi\"], note: \"Deferred tool-call handling\" },\n\t{ key: \"sessionAffinityFormat\", kind: \"enum\", options: SESSION_AFFINITY, note: \"Affinity header format\" },\n\t{ key: \"supportsLongCacheRetention\", kind: \"boolean\", note: \"Long-lived prompt cache retention\" },\n\t{ key: \"vllmPriority\", kind: \"number\", note: \"vLLM scheduling priority\" },\n\t{ key: \"zaiToolStream\", kind: \"boolean\", note: \"Z.AI streaming tool calls\" },\n\t{ key: \"supportsThinkingTokenBudget\", kind: \"boolean\", note: \"Enable the thinking-token budget alias\" },\n\t{\n\t\tkey: \"thinkingTokenBudgetField\",\n\t\tkind: \"enum\",\n\t\toptions: [\"thinking_token_budget\", \"thinking_budget\", \"thinking_budget_tokens\"],\n\t\tnote: \"Thinking budget field\",\n\t},\n];\n\nconst OPENAI_RESPONSES_FIELDS: readonly CompatField<keyof OpenAIResponsesCompat>[] = [\n\t{ key: \"supportsDeveloperRole\", kind: \"boolean\", note: \"Accepts `developer` role messages\" },\n\t{ key: \"sessionAffinityFormat\", kind: \"enum\", options: SESSION_AFFINITY, note: \"Affinity header format\" },\n\t{ key: \"supportsLongCacheRetention\", kind: \"boolean\", note: \"Long-lived prompt cache retention\" },\n\t{ key: \"supportsStrictMode\", kind: \"boolean\", note: \"Strict tool schemas\" },\n\t{ key: \"supportsOpenAIGrammarTools\", kind: \"boolean\", note: \"Grammar-constrained tool calls\" },\n\t{ key: \"supportsAdditionalTools\", kind: \"boolean\", note: \"Accepts additional hosted tools\" },\n\t{ key: \"supportsToolSearch\", kind: \"boolean\", note: \"Tool search support\" },\n\t{ key: \"supportsMaxOutputTokens\", kind: \"boolean\", note: \"Accepts `max_output_tokens`\" },\n\t{ key: \"supportsExplicitPromptCacheMode\", kind: \"boolean\", note: \"Explicit prompt caching\" },\n];\n\nconst ANTHROPIC_MESSAGES_FIELDS: readonly CompatField<keyof AnthropicMessagesCompat>[] = [\n\t{ key: \"supportsEagerToolInputStreaming\", kind: \"boolean\", note: \"Streams tool input eagerly\" },\n\t{ key: \"supportsLongCacheRetention\", kind: \"boolean\", note: \"Long-lived prompt cache retention\" },\n\t{ key: \"sendSessionAffinityHeaders\", kind: \"boolean\", note: \"Send session affinity headers\" },\n\t{ key: \"supportsCacheControlOnTools\", kind: \"boolean\", note: \"Cache control on tool definitions\" },\n\t{ key: \"supportsTemperature\", kind: \"boolean\", note: \"Accepts `temperature`\" },\n\t{ key: \"forceAdaptiveThinking\", kind: \"boolean\", note: \"Force adaptive thinking mode\" },\n\t{ key: \"allowEmptySignature\", kind: \"boolean\", note: \"Tolerate empty thinking signatures\" },\n\t{ key: \"supportsStrictTools\", kind: \"boolean\", note: \"Strict tool schemas\" },\n\t{ key: \"supportsMidConvoEffort\", kind: \"boolean\", note: \"Effort changes mid-conversation\" },\n\t{ key: \"supportsToolReferences\", kind: \"boolean\", note: \"Tool references support\" },\n];\n\nconst BEDROCK_FIELDS: readonly CompatField<keyof BedrockCompat>[] = [\n\t{ key: \"supportsStrictMode\", kind: \"boolean\", note: \"Strict tool schemas\" },\n];\n\n/** Compat fields known for the given effective api; empty when the API consumes no compat object. */\nexport function compatFieldsForApi(api: string): readonly CompatField[] {\n\tswitch (api) {\n\t\tcase \"openai-completions\":\n\t\t\treturn OPENAI_COMPLETIONS_FIELDS;\n\t\tcase \"openai-responses\":\n\t\t\treturn OPENAI_RESPONSES_FIELDS;\n\t\tcase \"azure-openai-responses\":\n\t\t\treturn OPENAI_RESPONSES_FIELDS.filter((field) =>\n\t\t\t\t[\"supportsDeveloperRole\", \"supportsStrictMode\", \"supportsOpenAIGrammarTools\"].includes(field.key),\n\t\t\t);\n\t\tcase \"openai-codex-responses\":\n\t\t\treturn OPENAI_RESPONSES_FIELDS.filter((field) =>\n\t\t\t\t[\n\t\t\t\t\t\"supportsStrictMode\",\n\t\t\t\t\t\"supportsOpenAIGrammarTools\",\n\t\t\t\t\t\"supportsAdditionalTools\",\n\t\t\t\t\t\"supportsToolSearch\",\n\t\t\t\t].includes(field.key),\n\t\t\t);\n\t\tcase \"anthropic-messages\":\n\t\t\treturn ANTHROPIC_MESSAGES_FIELDS;\n\t\tcase \"bedrock-converse-stream\":\n\t\t\treturn BEDROCK_FIELDS;\n\t\tdefault:\n\t\t\treturn [];\n\t}\n}\n\nexport function compatFieldFor(api: string, key: string): CompatField | undefined {\n\treturn compatFieldsForApi(api).find((field) => field.key === key);\n}\n\n/** Parse JSON values and reuse the canonical models.json schema, including nested validation. */\nexport function validateJsonCompatValue(key: string, text: string): string | undefined {\n\tlet value: unknown;\n\ttry {\n\t\tvalue = JSON.parse(text);\n\t} catch {\n\t\treturn \"Value is not valid JSON.\";\n\t}\n\treturn ModelConfig.validateCompat(\"openai-completions\", { [key]: value });\n}\n\n/** Chat-template values share the core schema and the published pi-ai value contract. */\nexport function validateChatTemplateKwarg(value: unknown): string | undefined {\n\tif (\n\t\tvalue !== null &&\n\t\ttypeof value === \"object\" &&\n\t\t!Array.isArray(value) &&\n\t\t!Object.keys(value).every((key) => key === \"$var\" || key === \"omitWhenOff\")\n\t) {\n\t\treturn 'Only \"$var\" and \"omitWhenOff\" are allowed.';\n\t}\n\tconst error = ModelConfig.validateCompat(\"openai-completions\", { chatTemplateKwargs: { value } });\n\treturn error ? `Value must be a scalar or valid $var reference: ${error}` : undefined;\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Provider defaults and draft completeness shared by the editor and persistence layer. */
|
|
2
|
+
import type { ModelsJsonModel, ModelsJsonProvider } from "../../core/model-config.ts";
|
|
3
|
+
export declare function hasProviderSettings(provider: ModelsJsonProvider | undefined): boolean;
|
|
4
|
+
export declare function effectiveModelSettings(providerId: string, provider: ModelsJsonProvider | undefined, model?: Partial<ModelsJsonModel>): {
|
|
5
|
+
api?: string;
|
|
6
|
+
baseUrl?: string;
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=configuration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configuration.d.ts","sourceRoot":"","sources":["../../../src/extensions/provider/configuration.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAE3F,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAGtF,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,SAAS,GAAG,OAAO,CAYrF;AAED,wBAAgB,sBAAsB,CACrC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,kBAAkB,GAAG,SAAS,EACxC,KAAK,GAAE,OAAO,CAAC,eAAe,CAAM,GAClC;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAMpC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Provider defaults and draft completeness shared by the editor and persistence layer. */
|
|
2
|
+
import { builtinDefaults } from "./catalog.js";
|
|
3
|
+
export function hasProviderSettings(provider) {
|
|
4
|
+
return Boolean(provider &&
|
|
5
|
+
(provider.baseUrl ||
|
|
6
|
+
provider.apiKey ||
|
|
7
|
+
provider.headers ||
|
|
8
|
+
provider.compat ||
|
|
9
|
+
provider.oauth ||
|
|
10
|
+
provider.authHeader !== undefined ||
|
|
11
|
+
provider.models?.length ||
|
|
12
|
+
Object.keys(provider.modelOverrides ?? {}).length));
|
|
13
|
+
}
|
|
14
|
+
export function effectiveModelSettings(providerId, provider, model = {}) {
|
|
15
|
+
const fallback = builtinDefaults(providerId, model.id, model.api ?? provider?.api);
|
|
16
|
+
return {
|
|
17
|
+
api: model.api ?? provider?.api ?? fallback.api,
|
|
18
|
+
baseUrl: model.baseUrl ?? provider?.baseUrl ?? fallback.baseUrl,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=configuration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configuration.js","sourceRoot":"","sources":["../../../src/extensions/provider/configuration.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAG3F,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,UAAU,mBAAmB,CAAC,QAAwC;IAC3E,OAAO,OAAO,CACb,QAAQ;QACP,CAAC,QAAQ,CAAC,OAAO;YAChB,QAAQ,CAAC,MAAM;YACf,QAAQ,CAAC,OAAO;YAChB,QAAQ,CAAC,MAAM;YACf,QAAQ,CAAC,KAAK;YACd,QAAQ,CAAC,UAAU,KAAK,SAAS;YACjC,QAAQ,CAAC,MAAM,EAAE,MAAM;YACvB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CACpD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CACrC,UAAkB,EAClB,QAAwC,EACxC,QAAkC,EAAE;IAEpC,MAAM,QAAQ,GAAG,eAAe,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,IAAI,QAAQ,EAAE,GAAG,CAAC,CAAC;IACnF,OAAO;QACN,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,QAAQ,EAAE,GAAG,IAAI,QAAQ,CAAC,GAAG;QAC/C,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,QAAQ,EAAE,OAAO,IAAI,QAAQ,CAAC,OAAO;KAC/D,CAAC;AACH,CAAC","sourcesContent":["/** Provider defaults and draft completeness shared by the editor and persistence layer. */\n\nimport type { ModelsJsonModel, ModelsJsonProvider } from \"../../core/model-config.ts\";\nimport { builtinDefaults } from \"./catalog.ts\";\n\nexport function hasProviderSettings(provider: ModelsJsonProvider | undefined): boolean {\n\treturn Boolean(\n\t\tprovider &&\n\t\t\t(provider.baseUrl ||\n\t\t\t\tprovider.apiKey ||\n\t\t\t\tprovider.headers ||\n\t\t\t\tprovider.compat ||\n\t\t\t\tprovider.oauth ||\n\t\t\t\tprovider.authHeader !== undefined ||\n\t\t\t\tprovider.models?.length ||\n\t\t\t\tObject.keys(provider.modelOverrides ?? {}).length),\n\t);\n}\n\nexport function effectiveModelSettings(\n\tproviderId: string,\n\tprovider: ModelsJsonProvider | undefined,\n\tmodel: Partial<ModelsJsonModel> = {},\n): { api?: string; baseUrl?: string } {\n\tconst fallback = builtinDefaults(providerId, model.id, model.api ?? provider?.api);\n\treturn {\n\t\tapi: model.api ?? provider?.api ?? fallback.api,\n\t\tbaseUrl: model.baseUrl ?? provider?.baseUrl ?? fallback.baseUrl,\n\t};\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Saved provider configuration, canonical authentication, and catalog import operations. */
|
|
2
|
+
import type { ModelRuntime } from "../../core/model-runtime.ts";
|
|
3
|
+
import { type ProbeModel, type ProbeResult } from "./probe.ts";
|
|
4
|
+
import type { RefreshCoordinator } from "./refresh.ts";
|
|
5
|
+
import type { ModelsJsonStore } from "./store.ts";
|
|
6
|
+
export interface ProviderConnectionOptions {
|
|
7
|
+
store: ModelsJsonStore;
|
|
8
|
+
refresher: RefreshCoordinator;
|
|
9
|
+
providerId: string;
|
|
10
|
+
runtime: Pick<ModelRuntime, "getAuth" | "getProviderAuthStatus">;
|
|
11
|
+
}
|
|
12
|
+
export declare function fetchProviderModels(options: ProviderConnectionOptions, signal: AbortSignal): Promise<ProbeResult>;
|
|
13
|
+
export declare function importProviderModels(options: ProviderConnectionOptions, models: readonly ProbeModel[], signal: AbortSignal): Promise<string | undefined>;
|
|
14
|
+
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../src/extensions/provider/connection.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAE7F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAIhE,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAuB,MAAM,YAAY,CAAC;AACpF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,yBAAyB;IACzC,KAAK,EAAE,eAAe,CAAC;IACvB,SAAS,EAAE,kBAAkB,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,uBAAuB,CAAC,CAAC;CACjE;AAED,wBAAsB,mBAAmB,CACxC,OAAO,EAAE,yBAAyB,EAClC,MAAM,EAAE,WAAW,GACjB,OAAO,CAAC,WAAW,CAAC,CA0CtB;AAED,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,yBAAyB,EAClC,MAAM,EAAE,SAAS,UAAU,EAAE,EAC7B,MAAM,EAAE,WAAW,GACjB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA2B7B"}
|