@dexto/server 1.10.1 → 1.10.3
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/dist/events/usage-event-subscriber.cjs +6 -1
- package/dist/events/usage-event-subscriber.d.ts +3 -0
- package/dist/events/usage-event-subscriber.d.ts.map +1 -1
- package/dist/events/usage-event-subscriber.js +7 -2
- package/dist/hono/routes/llm.cjs +37 -25
- package/dist/hono/routes/llm.d.ts +2 -2
- package/dist/hono/routes/llm.d.ts.map +1 -1
- package/dist/hono/routes/llm.js +39 -29
- package/package.json +8 -8
|
@@ -49,6 +49,7 @@ class UsageEventSubscriber {
|
|
|
49
49
|
database;
|
|
50
50
|
targetUrl;
|
|
51
51
|
authToken;
|
|
52
|
+
llmRegistry;
|
|
52
53
|
runtimeId;
|
|
53
54
|
runId;
|
|
54
55
|
deliveryOptions;
|
|
@@ -62,6 +63,7 @@ class UsageEventSubscriber {
|
|
|
62
63
|
this.database = config.database;
|
|
63
64
|
this.targetUrl = config.targetUrl;
|
|
64
65
|
this.authToken = config.authToken;
|
|
66
|
+
this.llmRegistry = config.llmRegistry ?? import_llm.DEFAULT_MODEL_REGISTRY;
|
|
65
67
|
this.runtimeId = config.runtimeId;
|
|
66
68
|
this.runId = config.runId;
|
|
67
69
|
const flushIntervalMs = requirePositiveIntegerOption(
|
|
@@ -130,7 +132,10 @@ class UsageEventSubscriber {
|
|
|
130
132
|
return null;
|
|
131
133
|
}
|
|
132
134
|
const resolvedCostBreakdown = payload.costBreakdown ?? (payload.provider && payload.model ? (() => {
|
|
133
|
-
const pricing =
|
|
135
|
+
const pricing = this.llmRegistry.getModelPricing(
|
|
136
|
+
payload.provider,
|
|
137
|
+
payload.model
|
|
138
|
+
);
|
|
134
139
|
if (!pricing) {
|
|
135
140
|
return void 0;
|
|
136
141
|
}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { AgentEventBus, type Database } from '@dexto/core';
|
|
2
|
+
import { type ModelRegistry } from '@dexto/llm';
|
|
2
3
|
import type { EventSubscriber } from './types.js';
|
|
3
4
|
import type { UsageEventDeliveryOptions } from './usage-event-types.js';
|
|
4
5
|
interface UsageEventSubscriberConfig extends UsageEventDeliveryOptions {
|
|
5
6
|
database: Database;
|
|
6
7
|
targetUrl: string;
|
|
7
8
|
authToken: string;
|
|
9
|
+
llmRegistry?: ModelRegistry;
|
|
8
10
|
runtimeId?: string;
|
|
9
11
|
runId?: string;
|
|
10
12
|
}
|
|
@@ -12,6 +14,7 @@ export declare class UsageEventSubscriber implements EventSubscriber {
|
|
|
12
14
|
private readonly database;
|
|
13
15
|
private readonly targetUrl;
|
|
14
16
|
private readonly authToken;
|
|
17
|
+
private readonly llmRegistry;
|
|
15
18
|
private readonly runtimeId;
|
|
16
19
|
private readonly runId;
|
|
17
20
|
private readonly deliveryOptions;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage-event-subscriber.d.ts","sourceRoot":"","sources":["../../src/events/usage-event-subscriber.ts"],"names":[],"mappings":"AACA,OAAO,EACH,aAAa,EAIb,KAAK,QAAQ,EAChB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"usage-event-subscriber.d.ts","sourceRoot":"","sources":["../../src/events/usage-event-subscriber.ts"],"names":[],"mappings":"AACA,OAAO,EACH,aAAa,EAIb,KAAK,QAAQ,EAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAkD,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAChG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAGR,yBAAyB,EAC5B,MAAM,wBAAwB,CAAC;AAqBhC,UAAU,0BAA2B,SAAQ,yBAAyB;IAClE,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAcD,qBAAa,oBAAqB,YAAW,eAAe;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAC3C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsC;IACtE,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,+BAA+B,CAAC,CAAkB;IAC1D,OAAO,CAAC,aAAa,CAAC,CAAiC;IACvD,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,0BAA0B,CAAS;IAC3C,OAAO,CAAC,YAAY,CAAS;gBAEjB,MAAM,EAAE,0BAA0B;IA2B9C,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IA2BxC,OAAO,IAAI,IAAI;IAmBF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAInC,OAAO,CAAC,eAAe;YA0CT,iBAAiB;YAajB,kBAAkB;YA2BlB,YAAY;YAsBZ,cAAc;CA2E/B"}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
hasMeaningfulTokenUsage,
|
|
4
4
|
logger
|
|
5
5
|
} from "@dexto/core";
|
|
6
|
-
import { calculateCostBreakdown,
|
|
6
|
+
import { calculateCostBreakdown, DEFAULT_MODEL_REGISTRY } from "@dexto/llm";
|
|
7
7
|
const OUTBOX_KEY_PREFIX = "usage-outbox:";
|
|
8
8
|
const DEFAULT_DELIVERY_OPTIONS = {
|
|
9
9
|
fetchFn: fetch,
|
|
@@ -29,6 +29,7 @@ class UsageEventSubscriber {
|
|
|
29
29
|
database;
|
|
30
30
|
targetUrl;
|
|
31
31
|
authToken;
|
|
32
|
+
llmRegistry;
|
|
32
33
|
runtimeId;
|
|
33
34
|
runId;
|
|
34
35
|
deliveryOptions;
|
|
@@ -42,6 +43,7 @@ class UsageEventSubscriber {
|
|
|
42
43
|
this.database = config.database;
|
|
43
44
|
this.targetUrl = config.targetUrl;
|
|
44
45
|
this.authToken = config.authToken;
|
|
46
|
+
this.llmRegistry = config.llmRegistry ?? DEFAULT_MODEL_REGISTRY;
|
|
45
47
|
this.runtimeId = config.runtimeId;
|
|
46
48
|
this.runId = config.runId;
|
|
47
49
|
const flushIntervalMs = requirePositiveIntegerOption(
|
|
@@ -110,7 +112,10 @@ class UsageEventSubscriber {
|
|
|
110
112
|
return null;
|
|
111
113
|
}
|
|
112
114
|
const resolvedCostBreakdown = payload.costBreakdown ?? (payload.provider && payload.model ? (() => {
|
|
113
|
-
const pricing = getModelPricing(
|
|
115
|
+
const pricing = this.llmRegistry.getModelPricing(
|
|
116
|
+
payload.provider,
|
|
117
|
+
payload.model
|
|
118
|
+
);
|
|
114
119
|
if (!pricing) {
|
|
115
120
|
return void 0;
|
|
116
121
|
}
|
package/dist/hono/routes/llm.cjs
CHANGED
|
@@ -49,7 +49,7 @@ const CatalogQuerySchema = import_zod_openapi.z.object({
|
|
|
49
49
|
).describe("Include only default models (true or false)"),
|
|
50
50
|
mode: import_zod_openapi.z.enum(["grouped", "flat"]).default("grouped").describe("Response format mode (grouped by provider or flat list)")
|
|
51
51
|
}).strict().describe("Query parameters for filtering and formatting the LLM catalog");
|
|
52
|
-
const SwitchLLMBodySchema = import_core.
|
|
52
|
+
const SwitchLLMBodySchema = import_core.LLMUpdatesShapeSchema.and(
|
|
53
53
|
import_zod_openapi.z.object({
|
|
54
54
|
sessionId: import_zod_openapi.z.string().optional().describe("Session identifier for session-specific LLM configuration")
|
|
55
55
|
})
|
|
@@ -478,12 +478,12 @@ function createLlmRouter(getAgent) {
|
|
|
478
478
|
}
|
|
479
479
|
return deduped;
|
|
480
480
|
};
|
|
481
|
-
const buildModelPickerSections = async () => {
|
|
481
|
+
const buildModelPickerSections = async (registry) => {
|
|
482
482
|
const byKey = /* @__PURE__ */ new Map();
|
|
483
483
|
const customSection = [];
|
|
484
484
|
const hydrateStateEntry = (entry) => {
|
|
485
|
-
const providerInfo =
|
|
486
|
-
const modelInfo =
|
|
485
|
+
const providerInfo = registry.getProvider(entry.provider);
|
|
486
|
+
const modelInfo = registry.getModel(entry.provider, entry.model);
|
|
487
487
|
const supportedFileTypes = Array.isArray(modelInfo?.supportedFileTypes) && modelInfo.supportedFileTypes.length > 0 ? modelInfo.supportedFileTypes : providerInfo.supportedFileTypes;
|
|
488
488
|
const source = entry.provider === "local" ? "local-installed" : entry.baseURL ? "custom" : "catalog";
|
|
489
489
|
return {
|
|
@@ -499,8 +499,8 @@ function createLlmRouter(getAgent) {
|
|
|
499
499
|
if (!isProviderEnabled(provider)) {
|
|
500
500
|
continue;
|
|
501
501
|
}
|
|
502
|
-
const providerInfo =
|
|
503
|
-
for (const model of (0, import_core.getAllModelsForProvider)(provider)) {
|
|
502
|
+
const providerInfo = registry.getProvider(provider);
|
|
503
|
+
for (const model of (0, import_core.getAllModelsForProvider)(provider, registry)) {
|
|
504
504
|
const supportedFileTypes = Array.isArray(model.supportedFileTypes) && model.supportedFileTypes.length > 0 ? model.supportedFileTypes : providerInfo.supportedFileTypes;
|
|
505
505
|
const entry = {
|
|
506
506
|
provider,
|
|
@@ -521,7 +521,7 @@ function createLlmRouter(getAgent) {
|
|
|
521
521
|
if (!isProviderEnabled(provider)) {
|
|
522
522
|
continue;
|
|
523
523
|
}
|
|
524
|
-
const providerInfo =
|
|
524
|
+
const providerInfo = registry.getProvider(provider);
|
|
525
525
|
const entry = {
|
|
526
526
|
provider,
|
|
527
527
|
model: customModel.name,
|
|
@@ -533,7 +533,7 @@ function createLlmRouter(getAgent) {
|
|
|
533
533
|
byKey.set((0, import_agent_management.toModelPickerKey)(entry), entry);
|
|
534
534
|
customSection.push(entry);
|
|
535
535
|
}
|
|
536
|
-
const localProviderSupportedFileTypes =
|
|
536
|
+
const localProviderSupportedFileTypes = registry.getProvider("local").supportedFileTypes;
|
|
537
537
|
const installedLocalModels = await (0, import_agent_management.getAllInstalledModels)();
|
|
538
538
|
for (const installedModel of installedLocalModels) {
|
|
539
539
|
const modelInfo = (0, import_core.getLocalModelById)(installedModel.id);
|
|
@@ -547,10 +547,13 @@ function createLlmRouter(getAgent) {
|
|
|
547
547
|
byKey.set((0, import_agent_management.toModelPickerKey)(entry), entry);
|
|
548
548
|
}
|
|
549
549
|
const featuredProviders = import_llm.LLM_PROVIDERS.filter((provider) => isProviderEnabled(provider));
|
|
550
|
-
const featured = (0, import_core.getCuratedModelRefsForProviders)(
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
550
|
+
const featured = (0, import_core.getCuratedModelRefsForProviders)(
|
|
551
|
+
{
|
|
552
|
+
providers: featuredProviders,
|
|
553
|
+
max: MODEL_PICKER_FEATURED_LIMIT
|
|
554
|
+
},
|
|
555
|
+
registry
|
|
556
|
+
).map((ref) => byKey.get((0, import_agent_management.toModelPickerKey)(ref))).filter((entry) => Boolean(entry));
|
|
554
557
|
const state = await (0, import_agent_management.loadModelPickerState)();
|
|
555
558
|
for (const entry of [...state.recents, ...state.favorites]) {
|
|
556
559
|
if (!isProviderEnabled(entry.provider)) {
|
|
@@ -584,13 +587,12 @@ function createLlmRouter(getAgent) {
|
|
|
584
587
|
};
|
|
585
588
|
return app.openapi(currentRoute, async (ctx) => {
|
|
586
589
|
const agent = await getAgent(ctx);
|
|
590
|
+
const registry = agent.llmRegistry;
|
|
587
591
|
const { sessionId } = ctx.req.valid("query");
|
|
588
592
|
const currentConfig = sessionId ? agent.getEffectiveConfig(sessionId).llm : agent.getCurrentLLMConfig();
|
|
589
593
|
let displayName;
|
|
590
594
|
try {
|
|
591
|
-
const model =
|
|
592
|
-
(m) => m.name.toLowerCase() === String(currentConfig.model).toLowerCase()
|
|
593
|
-
);
|
|
595
|
+
const model = registry.getModel(currentConfig.provider, currentConfig.model);
|
|
594
596
|
displayName = model?.displayName || void 0;
|
|
595
597
|
if (!displayName) {
|
|
596
598
|
const customModels = await (0, import_agent_management.loadCustomModels)();
|
|
@@ -616,7 +618,9 @@ function createLlmRouter(getAgent) {
|
|
|
616
618
|
},
|
|
617
619
|
200
|
|
618
620
|
);
|
|
619
|
-
}).openapi(catalogRoute, (ctx) => {
|
|
621
|
+
}).openapi(catalogRoute, async (ctx) => {
|
|
622
|
+
const agent = await getAgent(ctx);
|
|
623
|
+
const registry = agent.llmRegistry;
|
|
620
624
|
const queryParams = ctx.req.valid("query");
|
|
621
625
|
const includeModels = queryParams.includeModels ?? true;
|
|
622
626
|
const scope = queryParams.scope ?? "all";
|
|
@@ -625,21 +629,21 @@ function createLlmRouter(getAgent) {
|
|
|
625
629
|
if (provider === "dexto-nova" && !(0, import_agent_management.isDextoAuthEnabled)()) {
|
|
626
630
|
continue;
|
|
627
631
|
}
|
|
628
|
-
const info =
|
|
632
|
+
const info = registry.getProvider(provider);
|
|
629
633
|
const displayName = provider === "dexto-nova" ? "Dexto Nova" : provider.charAt(0).toUpperCase() + provider.slice(1);
|
|
630
634
|
const keyStatus = (0, import_agent_management.getProviderKeyStatus)(provider);
|
|
631
635
|
const models = (() => {
|
|
632
636
|
if (!includeModels) return [];
|
|
633
637
|
if (scope === "all") {
|
|
634
|
-
return (0, import_core.getAllModelsForProvider)(provider);
|
|
638
|
+
return (0, import_core.getAllModelsForProvider)(provider, registry);
|
|
635
639
|
}
|
|
636
|
-
return (0, import_core.getCuratedModelsForProvider)(provider);
|
|
640
|
+
return (0, import_core.getCuratedModelsForProvider)(provider, void 0, registry);
|
|
637
641
|
})();
|
|
638
642
|
providers[provider] = {
|
|
639
643
|
name: displayName,
|
|
640
644
|
hasApiKey: keyStatus.hasApiKey,
|
|
641
645
|
primaryEnvVar: keyStatus.envVar,
|
|
642
|
-
supportsBaseURL:
|
|
646
|
+
supportsBaseURL: registry.supportsBaseURL(provider),
|
|
643
647
|
models,
|
|
644
648
|
supportedFileTypes: info.supportedFileTypes
|
|
645
649
|
};
|
|
@@ -747,7 +751,8 @@ function createLlmRouter(getAgent) {
|
|
|
747
751
|
}
|
|
748
752
|
return ctx.json({ ok: true, deleted: name }, 200);
|
|
749
753
|
}).openapi(modelPickerStateRoute, async (ctx) => {
|
|
750
|
-
const
|
|
754
|
+
const agent = await getAgent(ctx);
|
|
755
|
+
const sections = await buildModelPickerSections(agent.llmRegistry);
|
|
751
756
|
return ctx.json(sections, 200);
|
|
752
757
|
}).openapi(recordRecentModelRoute, async (ctx) => {
|
|
753
758
|
const modelRef = ctx.req.valid("json");
|
|
@@ -775,16 +780,23 @@ function createLlmRouter(getAgent) {
|
|
|
775
780
|
},
|
|
776
781
|
200
|
|
777
782
|
);
|
|
778
|
-
}).openapi(capabilitiesRoute, (ctx) => {
|
|
783
|
+
}).openapi(capabilitiesRoute, async (ctx) => {
|
|
784
|
+
const agent = await getAgent(ctx);
|
|
785
|
+
const registry = agent.llmRegistry;
|
|
779
786
|
const { provider, model } = ctx.req.valid("query");
|
|
780
787
|
let supportedFileTypes;
|
|
781
788
|
try {
|
|
782
|
-
supportedFileTypes = (0, import_core.getSupportedFileTypesForModel)(
|
|
789
|
+
supportedFileTypes = (0, import_core.getSupportedFileTypesForModel)(
|
|
790
|
+
provider,
|
|
791
|
+
model,
|
|
792
|
+
void 0,
|
|
793
|
+
registry
|
|
794
|
+
);
|
|
783
795
|
} catch {
|
|
784
|
-
const providerInfo =
|
|
796
|
+
const providerInfo = registry.getProvider(provider);
|
|
785
797
|
supportedFileTypes = providerInfo?.supportedFileTypes ?? [];
|
|
786
798
|
}
|
|
787
|
-
const reasoning = (0, import_llm.getReasoningProfile)(provider, model);
|
|
799
|
+
const reasoning = (0, import_llm.getReasoningProfile)(provider, model, registry);
|
|
788
800
|
return ctx.json(
|
|
789
801
|
{
|
|
790
802
|
provider,
|
|
@@ -57,7 +57,7 @@ declare const SwitchLLMBodySchema: z.ZodIntersection<z.ZodObject<{
|
|
|
57
57
|
maxOutputTokens: z.ZodOptional<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
|
|
58
58
|
temperature: z.ZodOptional<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
|
|
59
59
|
allowedMediaTypes: z.ZodOptional<z.ZodOptional<z.ZodArray<z.ZodString>>>;
|
|
60
|
-
}, z.core.$
|
|
60
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
61
61
|
sessionId: z.ZodOptional<z.ZodString>;
|
|
62
62
|
}, z.core.$strip>>;
|
|
63
63
|
declare const ModelPickerModelRefSchema: z.ZodObject<{
|
|
@@ -1156,7 +1156,7 @@ declare const switchRoute: {
|
|
|
1156
1156
|
maxOutputTokens: z.ZodOptional<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
|
|
1157
1157
|
temperature: z.ZodOptional<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
|
|
1158
1158
|
allowedMediaTypes: z.ZodOptional<z.ZodOptional<z.ZodArray<z.ZodString>>>;
|
|
1159
|
-
}, z.core.$
|
|
1159
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
1160
1160
|
sessionId: z.ZodOptional<z.ZodString>;
|
|
1161
1161
|
}, z.core.$strip>>;
|
|
1162
1162
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../../src/hono/routes/llm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAe,CAAC,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../../src/hono/routes/llm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAe,CAAC,EAAE,MAAM,mBAAmB,CAAC;AAsBhE,OAAO,EAaH,iBAAiB,EAEpB,MAAM,yBAAyB,CAAC;AAWjC,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGlE,QAAA,MAAM,kBAAkB;;kBAQ+C,CAAC;AAExE,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;kBA0DsD,CAAC;AAI/E,QAAA,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAOoD,CAAC;AAE9E,QAAA,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;kBAOuC,CAAC;AAiDvE,QAAA,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;kBASgC,CAAC;AAE9D,QAAA,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;kBAO6B,CAAC;AAE1D,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsChB,CAAC;AAEH,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6ChB,CAAC;AAEH,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCf,CAAC;AAEH,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqBzB,CAAC;AAEH,QAAA,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0B1B,CAAC;AAEH,QAAA,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2B1B,CAAC;AAEH,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqFrB,CAAC;AAEH,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCzB,CAAC;AAEH,QAAA,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiC1B,CAAC;AAEH,QAAA,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkC5B,CAAC;AAEH,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsCrB,CAAC;AAEH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAgdnD;AAED,KAAK,kBAAkB,GAAG,kBAAkB,CACxC,OAAO,YAAY,EACnB;IAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;CAAE,CAChD,CAAC;AACF,KAAK,kBAAkB,GAAG,kBAAkB,CACxC,OAAO,YAAY,EACnB;IAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;CAAE,CAChD,CAAC;AACF,KAAK,iBAAiB,GAAG,kBAAkB,CACvC,OAAO,WAAW,EAClB;IAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;CAAE,CAChD,CAAC;AACF,KAAK,2BAA2B,GAAG,kBAAkB,CAAC,OAAO,qBAAqB,EAAE,EAAE,CAAC,CAAC;AACxF,KAAK,4BAA4B,GAAG,kBAAkB,CAClD,OAAO,sBAAsB,EAC7B;IAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;CAAE,CAC9C,CAAC;AACF,KAAK,4BAA4B,GAAG,kBAAkB,CAClD,OAAO,sBAAsB,EAC7B;IAAE,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAC9B,CAAC;AACF,KAAK,uBAAuB,GAAG,kBAAkB,CAC7C,OAAO,iBAAiB,EACxB;IAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA;CAAE,CACrD,CAAC;AACF,KAAK,2BAA2B,GAAG,kBAAkB,CAAC,OAAO,qBAAqB,EAAE,EAAE,CAAC,CAAC;AACxF,KAAK,4BAA4B,GAAG,kBAAkB,CAClD,OAAO,sBAAsB,EAC7B;IAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAA;CAAE,CACtD,CAAC;AACF,KAAK,8BAA8B,GAAG,kBAAkB,CACpD,OAAO,wBAAwB,EAC/B;IAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAA;CAAE,CACtD,CAAC;AACF,KAAK,uBAAuB,GAAG,kBAAkB,CAC7C,OAAO,iBAAiB,EACxB;IAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;CAAE,CACnD,CAAC;AAEF,MAAM,MAAM,eAAe,GACrB,kBAAkB,GAClB,kBAAkB,GAClB,iBAAiB,GACjB,2BAA2B,GAC3B,4BAA4B,GAC5B,4BAA4B,GAC5B,uBAAuB,GACvB,2BAA2B,GAC3B,4BAA4B,GAC5B,8BAA8B,GAC9B,uBAAuB,CAAC"}
|
package/dist/hono/routes/llm.js
CHANGED
|
@@ -9,14 +9,12 @@ import {
|
|
|
9
9
|
getCuratedModelRefsForProviders,
|
|
10
10
|
getSupportedFileTypesForModel,
|
|
11
11
|
getLocalModelById,
|
|
12
|
-
|
|
12
|
+
LLMUpdatesShapeSchema
|
|
13
13
|
} from "@dexto/core";
|
|
14
14
|
import {
|
|
15
|
-
LLM_REGISTRY,
|
|
16
15
|
LLM_PROVIDERS,
|
|
17
16
|
SUPPORTED_FILE_TYPES,
|
|
18
|
-
getReasoningProfile
|
|
19
|
-
supportsBaseURL
|
|
17
|
+
getReasoningProfile
|
|
20
18
|
} from "@dexto/llm";
|
|
21
19
|
import {
|
|
22
20
|
getProviderKeyStatus,
|
|
@@ -67,7 +65,7 @@ const CatalogQuerySchema = z.object({
|
|
|
67
65
|
).describe("Include only default models (true or false)"),
|
|
68
66
|
mode: z.enum(["grouped", "flat"]).default("grouped").describe("Response format mode (grouped by provider or flat list)")
|
|
69
67
|
}).strict().describe("Query parameters for filtering and formatting the LLM catalog");
|
|
70
|
-
const SwitchLLMBodySchema =
|
|
68
|
+
const SwitchLLMBodySchema = LLMUpdatesShapeSchema.and(
|
|
71
69
|
z.object({
|
|
72
70
|
sessionId: z.string().optional().describe("Session identifier for session-specific LLM configuration")
|
|
73
71
|
})
|
|
@@ -496,12 +494,12 @@ function createLlmRouter(getAgent) {
|
|
|
496
494
|
}
|
|
497
495
|
return deduped;
|
|
498
496
|
};
|
|
499
|
-
const buildModelPickerSections = async () => {
|
|
497
|
+
const buildModelPickerSections = async (registry) => {
|
|
500
498
|
const byKey = /* @__PURE__ */ new Map();
|
|
501
499
|
const customSection = [];
|
|
502
500
|
const hydrateStateEntry = (entry) => {
|
|
503
|
-
const providerInfo =
|
|
504
|
-
const modelInfo =
|
|
501
|
+
const providerInfo = registry.getProvider(entry.provider);
|
|
502
|
+
const modelInfo = registry.getModel(entry.provider, entry.model);
|
|
505
503
|
const supportedFileTypes = Array.isArray(modelInfo?.supportedFileTypes) && modelInfo.supportedFileTypes.length > 0 ? modelInfo.supportedFileTypes : providerInfo.supportedFileTypes;
|
|
506
504
|
const source = entry.provider === "local" ? "local-installed" : entry.baseURL ? "custom" : "catalog";
|
|
507
505
|
return {
|
|
@@ -517,8 +515,8 @@ function createLlmRouter(getAgent) {
|
|
|
517
515
|
if (!isProviderEnabled(provider)) {
|
|
518
516
|
continue;
|
|
519
517
|
}
|
|
520
|
-
const providerInfo =
|
|
521
|
-
for (const model of getAllModelsForProvider(provider)) {
|
|
518
|
+
const providerInfo = registry.getProvider(provider);
|
|
519
|
+
for (const model of getAllModelsForProvider(provider, registry)) {
|
|
522
520
|
const supportedFileTypes = Array.isArray(model.supportedFileTypes) && model.supportedFileTypes.length > 0 ? model.supportedFileTypes : providerInfo.supportedFileTypes;
|
|
523
521
|
const entry = {
|
|
524
522
|
provider,
|
|
@@ -539,7 +537,7 @@ function createLlmRouter(getAgent) {
|
|
|
539
537
|
if (!isProviderEnabled(provider)) {
|
|
540
538
|
continue;
|
|
541
539
|
}
|
|
542
|
-
const providerInfo =
|
|
540
|
+
const providerInfo = registry.getProvider(provider);
|
|
543
541
|
const entry = {
|
|
544
542
|
provider,
|
|
545
543
|
model: customModel.name,
|
|
@@ -551,7 +549,7 @@ function createLlmRouter(getAgent) {
|
|
|
551
549
|
byKey.set(toModelPickerKey(entry), entry);
|
|
552
550
|
customSection.push(entry);
|
|
553
551
|
}
|
|
554
|
-
const localProviderSupportedFileTypes =
|
|
552
|
+
const localProviderSupportedFileTypes = registry.getProvider("local").supportedFileTypes;
|
|
555
553
|
const installedLocalModels = await getAllInstalledModels();
|
|
556
554
|
for (const installedModel of installedLocalModels) {
|
|
557
555
|
const modelInfo = getLocalModelById(installedModel.id);
|
|
@@ -565,10 +563,13 @@ function createLlmRouter(getAgent) {
|
|
|
565
563
|
byKey.set(toModelPickerKey(entry), entry);
|
|
566
564
|
}
|
|
567
565
|
const featuredProviders = LLM_PROVIDERS.filter((provider) => isProviderEnabled(provider));
|
|
568
|
-
const featured = getCuratedModelRefsForProviders(
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
566
|
+
const featured = getCuratedModelRefsForProviders(
|
|
567
|
+
{
|
|
568
|
+
providers: featuredProviders,
|
|
569
|
+
max: MODEL_PICKER_FEATURED_LIMIT
|
|
570
|
+
},
|
|
571
|
+
registry
|
|
572
|
+
).map((ref) => byKey.get(toModelPickerKey(ref))).filter((entry) => Boolean(entry));
|
|
572
573
|
const state = await loadModelPickerState();
|
|
573
574
|
for (const entry of [...state.recents, ...state.favorites]) {
|
|
574
575
|
if (!isProviderEnabled(entry.provider)) {
|
|
@@ -602,13 +603,12 @@ function createLlmRouter(getAgent) {
|
|
|
602
603
|
};
|
|
603
604
|
return app.openapi(currentRoute, async (ctx) => {
|
|
604
605
|
const agent = await getAgent(ctx);
|
|
606
|
+
const registry = agent.llmRegistry;
|
|
605
607
|
const { sessionId } = ctx.req.valid("query");
|
|
606
608
|
const currentConfig = sessionId ? agent.getEffectiveConfig(sessionId).llm : agent.getCurrentLLMConfig();
|
|
607
609
|
let displayName;
|
|
608
610
|
try {
|
|
609
|
-
const model =
|
|
610
|
-
(m) => m.name.toLowerCase() === String(currentConfig.model).toLowerCase()
|
|
611
|
-
);
|
|
611
|
+
const model = registry.getModel(currentConfig.provider, currentConfig.model);
|
|
612
612
|
displayName = model?.displayName || void 0;
|
|
613
613
|
if (!displayName) {
|
|
614
614
|
const customModels = await loadCustomModels();
|
|
@@ -634,7 +634,9 @@ function createLlmRouter(getAgent) {
|
|
|
634
634
|
},
|
|
635
635
|
200
|
|
636
636
|
);
|
|
637
|
-
}).openapi(catalogRoute, (ctx) => {
|
|
637
|
+
}).openapi(catalogRoute, async (ctx) => {
|
|
638
|
+
const agent = await getAgent(ctx);
|
|
639
|
+
const registry = agent.llmRegistry;
|
|
638
640
|
const queryParams = ctx.req.valid("query");
|
|
639
641
|
const includeModels = queryParams.includeModels ?? true;
|
|
640
642
|
const scope = queryParams.scope ?? "all";
|
|
@@ -643,21 +645,21 @@ function createLlmRouter(getAgent) {
|
|
|
643
645
|
if (provider === "dexto-nova" && !isDextoAuthEnabled()) {
|
|
644
646
|
continue;
|
|
645
647
|
}
|
|
646
|
-
const info =
|
|
648
|
+
const info = registry.getProvider(provider);
|
|
647
649
|
const displayName = provider === "dexto-nova" ? "Dexto Nova" : provider.charAt(0).toUpperCase() + provider.slice(1);
|
|
648
650
|
const keyStatus = getProviderKeyStatus(provider);
|
|
649
651
|
const models = (() => {
|
|
650
652
|
if (!includeModels) return [];
|
|
651
653
|
if (scope === "all") {
|
|
652
|
-
return getAllModelsForProvider(provider);
|
|
654
|
+
return getAllModelsForProvider(provider, registry);
|
|
653
655
|
}
|
|
654
|
-
return getCuratedModelsForProvider(provider);
|
|
656
|
+
return getCuratedModelsForProvider(provider, void 0, registry);
|
|
655
657
|
})();
|
|
656
658
|
providers[provider] = {
|
|
657
659
|
name: displayName,
|
|
658
660
|
hasApiKey: keyStatus.hasApiKey,
|
|
659
661
|
primaryEnvVar: keyStatus.envVar,
|
|
660
|
-
supportsBaseURL: supportsBaseURL(provider),
|
|
662
|
+
supportsBaseURL: registry.supportsBaseURL(provider),
|
|
661
663
|
models,
|
|
662
664
|
supportedFileTypes: info.supportedFileTypes
|
|
663
665
|
};
|
|
@@ -765,7 +767,8 @@ function createLlmRouter(getAgent) {
|
|
|
765
767
|
}
|
|
766
768
|
return ctx.json({ ok: true, deleted: name }, 200);
|
|
767
769
|
}).openapi(modelPickerStateRoute, async (ctx) => {
|
|
768
|
-
const
|
|
770
|
+
const agent = await getAgent(ctx);
|
|
771
|
+
const sections = await buildModelPickerSections(agent.llmRegistry);
|
|
769
772
|
return ctx.json(sections, 200);
|
|
770
773
|
}).openapi(recordRecentModelRoute, async (ctx) => {
|
|
771
774
|
const modelRef = ctx.req.valid("json");
|
|
@@ -793,16 +796,23 @@ function createLlmRouter(getAgent) {
|
|
|
793
796
|
},
|
|
794
797
|
200
|
|
795
798
|
);
|
|
796
|
-
}).openapi(capabilitiesRoute, (ctx) => {
|
|
799
|
+
}).openapi(capabilitiesRoute, async (ctx) => {
|
|
800
|
+
const agent = await getAgent(ctx);
|
|
801
|
+
const registry = agent.llmRegistry;
|
|
797
802
|
const { provider, model } = ctx.req.valid("query");
|
|
798
803
|
let supportedFileTypes;
|
|
799
804
|
try {
|
|
800
|
-
supportedFileTypes = getSupportedFileTypesForModel(
|
|
805
|
+
supportedFileTypes = getSupportedFileTypesForModel(
|
|
806
|
+
provider,
|
|
807
|
+
model,
|
|
808
|
+
void 0,
|
|
809
|
+
registry
|
|
810
|
+
);
|
|
801
811
|
} catch {
|
|
802
|
-
const providerInfo =
|
|
812
|
+
const providerInfo = registry.getProvider(provider);
|
|
803
813
|
supportedFileTypes = providerInfo?.supportedFileTypes ?? [];
|
|
804
814
|
}
|
|
805
|
-
const reasoning = getReasoningProfile(provider, model);
|
|
815
|
+
const reasoning = getReasoningProfile(provider, model, registry);
|
|
806
816
|
return ctx.json(
|
|
807
817
|
{
|
|
808
818
|
provider,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dexto/server",
|
|
3
|
-
"version": "1.10.
|
|
3
|
+
"version": "1.10.3",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -31,13 +31,13 @@
|
|
|
31
31
|
"ws": "^8.18.1",
|
|
32
32
|
"yaml": "^2.8.3",
|
|
33
33
|
"@modelcontextprotocol/sdk": "^1.28.0",
|
|
34
|
-
"@dexto/agent-config": "1.10.
|
|
35
|
-
"@dexto/agent-management": "1.10.
|
|
36
|
-
"@dexto/core": "1.10.
|
|
37
|
-
"@dexto/image-local": "1.10.
|
|
38
|
-
"@dexto/llm": "1.10.
|
|
39
|
-
"@dexto/storage": "1.10.
|
|
40
|
-
"@dexto/tools-scheduler": "1.10.
|
|
34
|
+
"@dexto/agent-config": "1.10.3",
|
|
35
|
+
"@dexto/agent-management": "1.10.3",
|
|
36
|
+
"@dexto/core": "1.10.3",
|
|
37
|
+
"@dexto/image-local": "1.10.3",
|
|
38
|
+
"@dexto/llm": "1.10.3",
|
|
39
|
+
"@dexto/storage": "1.10.3",
|
|
40
|
+
"@dexto/tools-scheduler": "1.10.3"
|
|
41
41
|
},
|
|
42
42
|
"files": [
|
|
43
43
|
"dist",
|