veryfront 0.1.498 → 0.1.500
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/esm/cli/auth/provider-store.d.ts +1 -1
- package/esm/cli/auth/provider-store.js +1 -1
- package/esm/cli/commands/doctor/ai-checks.js +1 -1
- package/esm/cli/skills/core-skills.js +1 -1
- package/esm/deno.d.ts +4 -0
- package/esm/deno.js +9 -5
- package/esm/extensions/{ext-anthropic → ext-llm-anthropic}/src/anthropic-provider.d.ts +5 -5
- package/esm/extensions/ext-llm-anthropic/src/anthropic-provider.d.ts.map +1 -0
- package/esm/extensions/{ext-anthropic → ext-llm-anthropic}/src/anthropic-provider.js +2 -2
- package/esm/extensions/{ext-anthropic → ext-llm-anthropic}/src/index.d.ts +3 -3
- package/esm/extensions/ext-llm-anthropic/src/index.d.ts.map +1 -0
- package/esm/extensions/{ext-anthropic → ext-llm-anthropic}/src/index.js +8 -8
- package/esm/extensions/{ext-google → ext-llm-google}/src/google-provider.d.ts +6 -6
- package/esm/extensions/ext-llm-google/src/google-provider.d.ts.map +1 -0
- package/esm/extensions/{ext-google → ext-llm-google}/src/google-provider.js +2 -2
- package/esm/extensions/{ext-google → ext-llm-google}/src/index.d.ts +3 -3
- package/esm/extensions/ext-llm-google/src/index.d.ts.map +1 -0
- package/esm/extensions/ext-llm-google/src/index.js +26 -0
- package/esm/extensions/{ext-openai → ext-llm-openai}/src/index.d.ts +3 -3
- package/esm/extensions/ext-llm-openai/src/index.d.ts.map +1 -0
- package/esm/extensions/ext-llm-openai/src/index.js +28 -0
- package/esm/extensions/{ext-openai → ext-llm-openai}/src/openai-provider.d.ts +7 -7
- package/esm/extensions/ext-llm-openai/src/openai-provider.d.ts.map +1 -0
- package/esm/extensions/{ext-openai → ext-llm-openai}/src/openai-provider.js +2 -2
- package/esm/src/agent/agent-service-server.d.ts +9 -1
- package/esm/src/agent/agent-service-server.d.ts.map +1 -1
- package/esm/src/agent/agent-service-server.js +14 -1
- package/esm/src/agent/hosted-agent-service-runtime.d.ts +10 -1
- package/esm/src/agent/hosted-agent-service-runtime.d.ts.map +1 -1
- package/esm/src/agent/hosted-agent-service-runtime.js +18 -1
- package/esm/src/agent/hosted-stream-terminal-error.js +1 -1
- package/esm/src/agent/index.d.ts +3 -2
- package/esm/src/agent/index.d.ts.map +1 -1
- package/esm/src/agent/index.js +3 -2
- package/esm/src/agent/runtime-agent-definition-files.d.ts.map +1 -1
- package/esm/src/agent/runtime-agent-definition-files.js +8 -3
- package/esm/src/agent/veryfront-cloud-agent-service.d.ts +41 -0
- package/esm/src/agent/veryfront-cloud-agent-service.d.ts.map +1 -0
- package/esm/src/agent/veryfront-cloud-agent-service.js +501 -0
- package/esm/src/chat/provider-errors.js +3 -3
- package/esm/src/config/schemas/config.schema.d.ts +24 -0
- package/esm/src/config/schemas/config.schema.d.ts.map +1 -1
- package/esm/src/config/schemas/config.schema.js +48 -0
- package/esm/src/discovery/index.d.ts +1 -0
- package/esm/src/discovery/index.d.ts.map +1 -1
- package/esm/src/discovery/index.js +1 -0
- package/esm/src/discovery/project-discovery-config.d.ts +30 -0
- package/esm/src/discovery/project-discovery-config.d.ts.map +1 -0
- package/esm/src/discovery/project-discovery-config.js +33 -0
- package/esm/src/embedding/resolve.js +5 -5
- package/esm/src/embedding/veryfront-cloud/provider.js +3 -3
- package/esm/src/extensions/builtin-extensions.d.ts +2 -2
- package/esm/src/extensions/builtin-extensions.d.ts.map +1 -1
- package/esm/src/extensions/builtin-extensions.js +26 -27
- package/esm/src/extensions/interfaces/index.d.ts +9 -5
- package/esm/src/extensions/interfaces/index.d.ts.map +1 -1
- package/esm/src/extensions/interfaces/index.js +7 -3
- package/esm/src/extensions/{interfaces → llm}/embedding-provider.d.ts +1 -1
- package/esm/src/extensions/llm/embedding-provider.d.ts.map +1 -0
- package/esm/src/extensions/{interfaces → llm}/embedding-provider.js +1 -1
- package/esm/src/extensions/llm/index.d.ts +16 -0
- package/esm/src/extensions/llm/index.d.ts.map +1 -0
- package/esm/src/extensions/llm/index.js +13 -0
- package/esm/src/extensions/llm/llm-provider-registry.d.ts +11 -0
- package/esm/src/extensions/llm/llm-provider-registry.d.ts.map +1 -0
- package/esm/src/extensions/{registries/ai-provider-registry.js → llm/llm-provider-registry.js} +6 -6
- package/esm/src/extensions/{interfaces/ai-provider.d.ts → llm/llm-provider.d.ts} +16 -16
- package/esm/src/extensions/llm/llm-provider.d.ts.map +1 -0
- package/esm/src/extensions/{interfaces/ai-provider.js → llm/llm-provider.js} +4 -4
- package/esm/src/extensions/loader.d.ts +1 -1
- package/esm/src/extensions/loader.js +1 -1
- package/esm/src/extensions/orchestrate.d.ts +1 -1
- package/esm/src/extensions/orchestrate.d.ts.map +1 -1
- package/esm/src/extensions/recommendations.js +4 -4
- package/esm/src/provider/local/env.d.ts +1 -1
- package/esm/src/provider/local/env.js +1 -1
- package/esm/src/provider/model-registry.d.ts.map +1 -1
- package/esm/src/provider/model-registry.js +9 -9
- package/esm/src/provider/shared/index.d.ts +1 -1
- package/esm/src/provider/shared/index.js +1 -1
- package/esm/src/provider/veryfront-cloud/openai.js +4 -4
- package/esm/src/provider/veryfront-cloud/provider.js +2 -2
- package/esm/src/server/bootstrap.d.ts.map +1 -1
- package/esm/src/server/bootstrap.js +4 -5
- package/esm/src/server/handlers/request/api/project-discovery.d.ts.map +1 -1
- package/esm/src/server/handlers/request/api/project-discovery.js +6 -22
- package/esm/src/server/index.d.ts +1 -1
- package/esm/src/server/index.d.ts.map +1 -1
- package/esm/src/server/index.js +1 -1
- package/esm/src/server/service-server.d.ts +18 -0
- package/esm/src/server/service-server.d.ts.map +1 -1
- package/esm/src/server/service-server.js +318 -0
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/esm/src/workflow/schemas/workflow.schema.d.ts +1 -1
- package/package.json +6 -1
- package/src/cli/auth/provider-store.ts +1 -1
- package/src/cli/commands/doctor/ai-checks.ts +1 -1
- package/src/cli/skills/core-skills.ts +1 -1
- package/src/deno.js +9 -5
- package/src/extensions/{ext-anthropic → ext-llm-anthropic}/src/anthropic-provider.ts +5 -5
- package/src/extensions/ext-llm-anthropic/src/index.ts +34 -0
- package/src/extensions/{ext-google → ext-llm-google}/src/google-provider.ts +6 -6
- package/src/extensions/ext-llm-google/src/index.ts +31 -0
- package/src/extensions/ext-llm-openai/src/index.ts +33 -0
- package/src/extensions/{ext-openai → ext-llm-openai}/src/openai-provider.ts +7 -7
- package/src/src/agent/agent-service-server.ts +26 -0
- package/src/src/agent/hosted-agent-service-runtime.ts +42 -0
- package/src/src/agent/hosted-stream-terminal-error.ts +1 -1
- package/src/src/agent/index.ts +16 -0
- package/src/src/agent/runtime-agent-definition-files.ts +8 -3
- package/src/src/agent/veryfront-cloud-agent-service.ts +798 -0
- package/src/src/chat/provider-errors.ts +3 -3
- package/src/src/config/schemas/config.schema.ts +48 -0
- package/src/src/discovery/index.ts +4 -0
- package/src/src/discovery/project-discovery-config.ts +89 -0
- package/src/src/embedding/resolve.ts +6 -6
- package/src/src/embedding/veryfront-cloud/provider.ts +4 -4
- package/src/src/extensions/builtin-extensions.ts +32 -33
- package/src/src/extensions/interfaces/index.ts +11 -7
- package/src/src/extensions/{interfaces → llm}/embedding-provider.ts +1 -1
- package/src/src/extensions/llm/index.ts +17 -0
- package/src/src/extensions/{registries/ai-provider-registry.ts → llm/llm-provider-registry.ts} +12 -12
- package/src/src/extensions/{interfaces/ai-provider.ts → llm/llm-provider.ts} +15 -15
- package/src/src/extensions/loader.ts +1 -1
- package/src/src/extensions/orchestrate.ts +1 -1
- package/src/src/extensions/recommendations.ts +4 -4
- package/src/src/provider/local/env.ts +1 -1
- package/src/src/provider/model-registry.ts +11 -10
- package/src/src/provider/shared/index.ts +1 -1
- package/src/src/provider/veryfront-cloud/openai.ts +4 -4
- package/src/src/provider/veryfront-cloud/provider.ts +2 -2
- package/src/src/server/bootstrap.ts +7 -5
- package/src/src/server/handlers/request/api/project-discovery.ts +6 -27
- package/src/src/server/index.ts +4 -0
- package/src/src/server/service-server.ts +428 -0
- package/src/src/utils/version-constant.ts +1 -1
- package/esm/extensions/ext-anthropic/src/anthropic-provider.d.ts.map +0 -1
- package/esm/extensions/ext-anthropic/src/index.d.ts.map +0 -1
- package/esm/extensions/ext-google/src/google-provider.d.ts.map +0 -1
- package/esm/extensions/ext-google/src/index.d.ts.map +0 -1
- package/esm/extensions/ext-google/src/index.js +0 -26
- package/esm/extensions/ext-openai/src/index.d.ts.map +0 -1
- package/esm/extensions/ext-openai/src/index.js +0 -28
- package/esm/extensions/ext-openai/src/openai-provider.d.ts.map +0 -1
- package/esm/src/extensions/interfaces/ai-provider.d.ts.map +0 -1
- package/esm/src/extensions/interfaces/embedding-provider.d.ts.map +0 -1
- package/esm/src/extensions/registries/ai-provider-registry.d.ts +0 -11
- package/esm/src/extensions/registries/ai-provider-registry.d.ts.map +0 -1
- package/src/extensions/ext-anthropic/src/index.ts +0 -34
- package/src/extensions/ext-google/src/index.ts +0 -31
- package/src/extensions/ext-openai/src/index.ts +0 -33
|
@@ -7,7 +7,7 @@ export interface ParsedProviderError {
|
|
|
7
7
|
|
|
8
8
|
const DEFAULT_EXTERNAL_SERVICE_ERROR = {
|
|
9
9
|
code: "EXTERNAL_SERVICE_ERROR",
|
|
10
|
-
message: "
|
|
10
|
+
message: "LLM provider service error",
|
|
11
11
|
} as const;
|
|
12
12
|
|
|
13
13
|
function isErrorRecord(value: unknown): value is Record<string, unknown> {
|
|
@@ -81,7 +81,7 @@ function parseKnownProviderBody(body: unknown): ParsedProviderError | null {
|
|
|
81
81
|
code: "OVERLOADED_ERROR",
|
|
82
82
|
message: typeof body.message === "string"
|
|
83
83
|
? body.message
|
|
84
|
-
: "The
|
|
84
|
+
: "The LLM provider is currently overloaded",
|
|
85
85
|
};
|
|
86
86
|
}
|
|
87
87
|
|
|
@@ -193,7 +193,7 @@ function parseProviderErrorInner(error: unknown, seen: WeakSet<object>): ParsedP
|
|
|
193
193
|
return { code: "INSUFFICIENT_CREDITS", message: "Insufficient AI credits", status: 402 };
|
|
194
194
|
}
|
|
195
195
|
if (normalizedMessage.includes("overload") || normalizedMessage.includes("capacity")) {
|
|
196
|
-
return { code: "OVERLOADED_ERROR", message: "The
|
|
196
|
+
return { code: "OVERLOADED_ERROR", message: "The LLM provider is currently overloaded" };
|
|
197
197
|
}
|
|
198
198
|
if (
|
|
199
199
|
normalizedMessage.includes("rate limit") ||
|
|
@@ -426,6 +426,54 @@ export const veryfrontConfigSchema = z
|
|
|
426
426
|
})
|
|
427
427
|
.partial()
|
|
428
428
|
.optional(),
|
|
429
|
+
resources: z
|
|
430
|
+
.object({
|
|
431
|
+
discovery: z
|
|
432
|
+
.object({
|
|
433
|
+
enabled: z.boolean().optional(),
|
|
434
|
+
paths: z.array(z.string()).optional(),
|
|
435
|
+
})
|
|
436
|
+
.partial()
|
|
437
|
+
.optional(),
|
|
438
|
+
})
|
|
439
|
+
.partial()
|
|
440
|
+
.optional(),
|
|
441
|
+
prompts: z
|
|
442
|
+
.object({
|
|
443
|
+
discovery: z
|
|
444
|
+
.object({
|
|
445
|
+
enabled: z.boolean().optional(),
|
|
446
|
+
paths: z.array(z.string()).optional(),
|
|
447
|
+
})
|
|
448
|
+
.partial()
|
|
449
|
+
.optional(),
|
|
450
|
+
})
|
|
451
|
+
.partial()
|
|
452
|
+
.optional(),
|
|
453
|
+
workflows: z
|
|
454
|
+
.object({
|
|
455
|
+
discovery: z
|
|
456
|
+
.object({
|
|
457
|
+
enabled: z.boolean().optional(),
|
|
458
|
+
paths: z.array(z.string()).optional(),
|
|
459
|
+
})
|
|
460
|
+
.partial()
|
|
461
|
+
.optional(),
|
|
462
|
+
})
|
|
463
|
+
.partial()
|
|
464
|
+
.optional(),
|
|
465
|
+
tasks: z
|
|
466
|
+
.object({
|
|
467
|
+
discovery: z
|
|
468
|
+
.object({
|
|
469
|
+
enabled: z.boolean().optional(),
|
|
470
|
+
paths: z.array(z.string()).optional(),
|
|
471
|
+
})
|
|
472
|
+
.partial()
|
|
473
|
+
.optional(),
|
|
474
|
+
})
|
|
475
|
+
.partial()
|
|
476
|
+
.optional(),
|
|
429
477
|
mcp: z
|
|
430
478
|
.object({
|
|
431
479
|
enabled: z.boolean().optional(),
|
|
@@ -19,6 +19,10 @@ export type {
|
|
|
19
19
|
|
|
20
20
|
// Re-export main discovery function
|
|
21
21
|
export { discoverAll } from "./discovery-engine.js";
|
|
22
|
+
export {
|
|
23
|
+
createProjectDiscoveryConfig,
|
|
24
|
+
DEFAULT_PROJECT_DISCOVERY_DIRS,
|
|
25
|
+
} from "./project-discovery-config.js";
|
|
22
26
|
|
|
23
27
|
// Re-export utilities
|
|
24
28
|
export { clearTrackedAgents, filenameToId, filePathToPattern } from "./discovery-utils.js";
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { VeryfrontConfig } from "../config/index.js";
|
|
2
|
+
import type { FileSystemAdapter } from "../platform/adapters/base.js";
|
|
3
|
+
import type { DiscoveryConfig } from "./types.js";
|
|
4
|
+
|
|
5
|
+
export const DEFAULT_PROJECT_DISCOVERY_DIRS = {
|
|
6
|
+
toolDirs: ["tools"],
|
|
7
|
+
agentDirs: ["agents"],
|
|
8
|
+
skillDirs: ["skills"],
|
|
9
|
+
resourceDirs: ["resources"],
|
|
10
|
+
promptDirs: ["prompts"],
|
|
11
|
+
workflowDirs: ["workflows"],
|
|
12
|
+
taskDirs: ["tasks"],
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
type DiscoverySettings = {
|
|
16
|
+
enabled?: boolean;
|
|
17
|
+
paths?: string[];
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
type ProjectDiscoveryConfigInput = {
|
|
21
|
+
projectDir: string;
|
|
22
|
+
config?: VeryfrontConfig | null;
|
|
23
|
+
fsAdapter?: FileSystemAdapter;
|
|
24
|
+
verbose?: boolean;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export type ProjectDiscoveryConfig = DiscoveryConfig & {
|
|
28
|
+
toolDirs: string[];
|
|
29
|
+
agentDirs: string[];
|
|
30
|
+
skillDirs: string[];
|
|
31
|
+
resourceDirs: string[];
|
|
32
|
+
promptDirs: string[];
|
|
33
|
+
workflowDirs: string[];
|
|
34
|
+
taskDirs: string[];
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
function isDiscoveryEnabled(discovery: DiscoverySettings | undefined): boolean {
|
|
38
|
+
return discovery?.enabled ?? true;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function resolveDiscoveryPaths(
|
|
42
|
+
discovery: DiscoverySettings | undefined,
|
|
43
|
+
defaultPaths: string[],
|
|
44
|
+
): string[] {
|
|
45
|
+
if (!isDiscoveryEnabled(discovery)) {
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
return discovery?.paths ?? defaultPaths;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function createProjectDiscoveryConfig(
|
|
52
|
+
input: ProjectDiscoveryConfigInput,
|
|
53
|
+
): ProjectDiscoveryConfig {
|
|
54
|
+
const aiConfig = input.config?.ai;
|
|
55
|
+
|
|
56
|
+
return {
|
|
57
|
+
baseDir: input.projectDir,
|
|
58
|
+
toolDirs: resolveDiscoveryPaths(
|
|
59
|
+
aiConfig?.tools?.discovery,
|
|
60
|
+
DEFAULT_PROJECT_DISCOVERY_DIRS.toolDirs,
|
|
61
|
+
),
|
|
62
|
+
agentDirs: resolveDiscoveryPaths(
|
|
63
|
+
aiConfig?.agents?.discovery,
|
|
64
|
+
DEFAULT_PROJECT_DISCOVERY_DIRS.agentDirs,
|
|
65
|
+
),
|
|
66
|
+
skillDirs: resolveDiscoveryPaths(
|
|
67
|
+
aiConfig?.skills?.discovery,
|
|
68
|
+
DEFAULT_PROJECT_DISCOVERY_DIRS.skillDirs,
|
|
69
|
+
),
|
|
70
|
+
resourceDirs: resolveDiscoveryPaths(
|
|
71
|
+
aiConfig?.resources?.discovery,
|
|
72
|
+
DEFAULT_PROJECT_DISCOVERY_DIRS.resourceDirs,
|
|
73
|
+
),
|
|
74
|
+
promptDirs: resolveDiscoveryPaths(
|
|
75
|
+
aiConfig?.prompts?.discovery,
|
|
76
|
+
DEFAULT_PROJECT_DISCOVERY_DIRS.promptDirs,
|
|
77
|
+
),
|
|
78
|
+
workflowDirs: resolveDiscoveryPaths(
|
|
79
|
+
aiConfig?.workflows?.discovery,
|
|
80
|
+
DEFAULT_PROJECT_DISCOVERY_DIRS.workflowDirs,
|
|
81
|
+
),
|
|
82
|
+
taskDirs: resolveDiscoveryPaths(
|
|
83
|
+
aiConfig?.tasks?.discovery,
|
|
84
|
+
DEFAULT_PROJECT_DISCOVERY_DIRS.taskDirs,
|
|
85
|
+
),
|
|
86
|
+
fsAdapter: input.fsAdapter,
|
|
87
|
+
verbose: input.verbose ?? false,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
@@ -3,8 +3,8 @@ import { getGoogleGenAIEnvConfig, getOpenAIEnvConfig } from "../config/env.js";
|
|
|
3
3
|
import { createLocalEmbeddingModel } from "../provider/local/embedding-runtime-adapter.js";
|
|
4
4
|
import type { EmbeddingRuntime } from "../provider/types.js";
|
|
5
5
|
import { tryResolve } from "../extensions/contracts.js";
|
|
6
|
-
import type {
|
|
7
|
-
import {
|
|
6
|
+
import type { LLMProviderRegistry } from "../extensions/interfaces/index.js";
|
|
7
|
+
import { LLMProviderRegistryName } from "../extensions/interfaces/index.js";
|
|
8
8
|
import { createVeryfrontCloudEmbeddingModel } from "./veryfront-cloud/provider.js";
|
|
9
9
|
|
|
10
10
|
type EmbeddingProviderFactory = (modelId: string) => EmbeddingRuntime;
|
|
@@ -43,7 +43,7 @@ function autoInitializeFromEnv(): void {
|
|
|
43
43
|
}),
|
|
44
44
|
);
|
|
45
45
|
}
|
|
46
|
-
const registry = tryResolve<
|
|
46
|
+
const registry = tryResolve<LLMProviderRegistry>(LLMProviderRegistryName);
|
|
47
47
|
const provider = registry?.get("openai");
|
|
48
48
|
if (provider?.createEmbedding) {
|
|
49
49
|
return provider.createEmbedding(id, {
|
|
@@ -55,7 +55,7 @@ function autoInitializeFromEnv(): void {
|
|
|
55
55
|
createError({
|
|
56
56
|
type: "config",
|
|
57
57
|
message:
|
|
58
|
-
"OpenAI provider not installed. Add @veryfront/ext-openai to use openai/* embedding models.",
|
|
58
|
+
"OpenAI provider not installed. Add @veryfront/ext-llm-openai to use openai/* embedding models.",
|
|
59
59
|
}),
|
|
60
60
|
);
|
|
61
61
|
});
|
|
@@ -73,7 +73,7 @@ function autoInitializeFromEnv(): void {
|
|
|
73
73
|
}),
|
|
74
74
|
);
|
|
75
75
|
}
|
|
76
|
-
const registry = tryResolve<
|
|
76
|
+
const registry = tryResolve<LLMProviderRegistry>(LLMProviderRegistryName);
|
|
77
77
|
const provider = registry?.get("google");
|
|
78
78
|
if (provider?.createEmbedding) {
|
|
79
79
|
return provider.createEmbedding(id, {
|
|
@@ -84,7 +84,7 @@ function autoInitializeFromEnv(): void {
|
|
|
84
84
|
createError({
|
|
85
85
|
type: "config",
|
|
86
86
|
message:
|
|
87
|
-
"Google provider not installed. Add @veryfront/ext-google to use google/* embedding models.",
|
|
87
|
+
"Google provider not installed. Add @veryfront/ext-llm-google to use google/* embedding models.",
|
|
88
88
|
}),
|
|
89
89
|
);
|
|
90
90
|
});
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { createError, toError } from "../../errors/veryfront-error.js";
|
|
2
2
|
import type { EmbeddingRuntime } from "../../provider/types.js";
|
|
3
3
|
import { tryResolve } from "../../extensions/contracts.js";
|
|
4
|
-
import type {
|
|
5
|
-
import {
|
|
4
|
+
import type { LLMProviderRegistry } from "../../extensions/interfaces/index.js";
|
|
5
|
+
import { LLMProviderRegistryName } from "../../extensions/interfaces/index.js";
|
|
6
6
|
import {
|
|
7
7
|
createVeryfrontCloudFetch,
|
|
8
8
|
getVeryfrontCloudGatewayBaseUrl,
|
|
@@ -26,7 +26,7 @@ export function createVeryfrontCloudEmbeddingModel(modelId: string): EmbeddingRu
|
|
|
26
26
|
});
|
|
27
27
|
|
|
28
28
|
case "google": {
|
|
29
|
-
const registry = tryResolve<
|
|
29
|
+
const registry = tryResolve<LLMProviderRegistry>(LLMProviderRegistryName);
|
|
30
30
|
const google = registry?.get("google");
|
|
31
31
|
if (google?.createEmbedding) {
|
|
32
32
|
return google.createEmbedding(upstreamModelId, {
|
|
@@ -40,7 +40,7 @@ export function createVeryfrontCloudEmbeddingModel(modelId: string): EmbeddingRu
|
|
|
40
40
|
createError({
|
|
41
41
|
type: "config",
|
|
42
42
|
message:
|
|
43
|
-
"Google provider not installed. Add @veryfront/ext-google to use google/* embedding models via veryfront-cloud.",
|
|
43
|
+
"Google provider not installed. Add @veryfront/ext-llm-google to use google/* embedding models via veryfront-cloud.",
|
|
44
44
|
}),
|
|
45
45
|
);
|
|
46
46
|
}
|
|
@@ -1,69 +1,68 @@
|
|
|
1
1
|
import type { ResolvedExtension } from "./types.js";
|
|
2
2
|
import { register, tryResolve } from "./contracts.js";
|
|
3
|
-
import type {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { GoogleProvider } from "../../extensions/ext-google/src/index.js";
|
|
3
|
+
import type { LLMProvider, LLMProviderRegistry } from "./llm/index.js";
|
|
4
|
+
import { createLLMProviderRegistry, LLMProviderRegistryName } from "./llm/index.js";
|
|
5
|
+
import { OpenAIProvider } from "../../extensions/ext-llm-openai/src/index.js";
|
|
6
|
+
import { AnthropicProvider } from "../../extensions/ext-llm-anthropic/src/index.js";
|
|
7
|
+
import { GoogleProvider } from "../../extensions/ext-llm-google/src/index.js";
|
|
9
8
|
import extEsbuild from "../../extensions/ext-esbuild/src/index.js";
|
|
10
9
|
import extBabel from "../../extensions/ext-babel/src/index.js";
|
|
11
10
|
import extMdx from "../../extensions/ext-mdx/src/index.js";
|
|
12
11
|
import extTailwind from "../../extensions/ext-tailwind/src/index.js";
|
|
13
12
|
import extNodeCompat from "../../extensions/ext-node-compat/src/index.js";
|
|
14
13
|
|
|
15
|
-
type
|
|
14
|
+
type BuiltinLLMProviderDefinition = {
|
|
16
15
|
extensionName: string;
|
|
17
16
|
origin: string;
|
|
18
|
-
provider: () =>
|
|
17
|
+
provider: () => LLMProvider;
|
|
19
18
|
};
|
|
20
19
|
|
|
21
|
-
const
|
|
20
|
+
const BUILTIN_LLM_PROVIDERS: BuiltinLLMProviderDefinition[] = [
|
|
22
21
|
{
|
|
23
|
-
extensionName: "ext-openai",
|
|
24
|
-
origin: "veryfront/ext-openai",
|
|
22
|
+
extensionName: "ext-llm-openai",
|
|
23
|
+
origin: "veryfront/ext-llm-openai",
|
|
25
24
|
provider: () => new OpenAIProvider(),
|
|
26
25
|
},
|
|
27
26
|
{
|
|
28
|
-
extensionName: "ext-anthropic",
|
|
29
|
-
origin: "veryfront/ext-anthropic",
|
|
27
|
+
extensionName: "ext-llm-anthropic",
|
|
28
|
+
origin: "veryfront/ext-llm-anthropic",
|
|
30
29
|
provider: () => new AnthropicProvider(),
|
|
31
30
|
},
|
|
32
31
|
{
|
|
33
|
-
extensionName: "ext-google",
|
|
34
|
-
origin: "veryfront/ext-google",
|
|
32
|
+
extensionName: "ext-llm-google",
|
|
33
|
+
origin: "veryfront/ext-llm-google",
|
|
35
34
|
provider: () => new GoogleProvider(),
|
|
36
35
|
},
|
|
37
36
|
];
|
|
38
37
|
|
|
39
|
-
function
|
|
40
|
-
const existing = tryResolve<
|
|
38
|
+
function getOrCreateLLMProviderRegistry(): LLMProviderRegistry {
|
|
39
|
+
const existing = tryResolve<LLMProviderRegistry>(LLMProviderRegistryName);
|
|
41
40
|
if (existing) return existing;
|
|
42
41
|
|
|
43
|
-
const registry =
|
|
44
|
-
register(
|
|
42
|
+
const registry = createLLMProviderRegistry();
|
|
43
|
+
register(LLMProviderRegistryName, registry);
|
|
45
44
|
return registry;
|
|
46
45
|
}
|
|
47
46
|
|
|
48
|
-
function
|
|
49
|
-
registry:
|
|
50
|
-
provider:
|
|
47
|
+
function registerBuiltinLLMProvider(
|
|
48
|
+
registry: LLMProviderRegistry,
|
|
49
|
+
provider: LLMProvider,
|
|
51
50
|
): boolean {
|
|
52
51
|
if (registry.has(provider.id)) return false;
|
|
53
52
|
registry.register(provider);
|
|
54
53
|
return true;
|
|
55
54
|
}
|
|
56
55
|
|
|
57
|
-
export function
|
|
58
|
-
const registry =
|
|
59
|
-
for (const definition of
|
|
60
|
-
|
|
56
|
+
export function ensureBuiltinLLMProviders(): LLMProviderRegistry {
|
|
57
|
+
const registry = getOrCreateLLMProviderRegistry();
|
|
58
|
+
for (const definition of BUILTIN_LLM_PROVIDERS) {
|
|
59
|
+
registerBuiltinLLMProvider(registry, definition.provider());
|
|
61
60
|
}
|
|
62
61
|
return registry;
|
|
63
62
|
}
|
|
64
63
|
|
|
65
|
-
function
|
|
66
|
-
definition:
|
|
64
|
+
function createBuiltinLLMProviderExtension(
|
|
65
|
+
definition: BuiltinLLMProviderDefinition,
|
|
67
66
|
): ResolvedExtension {
|
|
68
67
|
const provider = definition.provider();
|
|
69
68
|
let didRegister = false;
|
|
@@ -74,17 +73,17 @@ function createBuiltinAIProviderExtension(
|
|
|
74
73
|
extension: {
|
|
75
74
|
name: definition.extensionName,
|
|
76
75
|
version: "0.1.0",
|
|
77
|
-
capabilities: [{ type: "contract", name: `
|
|
76
|
+
capabilities: [{ type: "contract", name: `LLMProvider:${provider.id}` }],
|
|
78
77
|
setup(ctx) {
|
|
79
|
-
const registry = ctx.require<
|
|
80
|
-
didRegister =
|
|
78
|
+
const registry = ctx.require<LLMProviderRegistry>(LLMProviderRegistryName);
|
|
79
|
+
didRegister = registerBuiltinLLMProvider(registry, provider);
|
|
81
80
|
if (didRegister) {
|
|
82
81
|
ctx.logger.info(`[${definition.extensionName}] ${provider.id} provider registered`);
|
|
83
82
|
}
|
|
84
83
|
},
|
|
85
84
|
teardown() {
|
|
86
85
|
if (didRegister) {
|
|
87
|
-
const registry = tryResolve<
|
|
86
|
+
const registry = tryResolve<LLMProviderRegistry>(LLMProviderRegistryName);
|
|
88
87
|
registry?.unregister(provider.id);
|
|
89
88
|
didRegister = false;
|
|
90
89
|
}
|
|
@@ -120,6 +119,6 @@ export function createBuiltinExtensions(): ResolvedExtension[] {
|
|
|
120
119
|
origin: "veryfront/ext-node-compat",
|
|
121
120
|
extension: extNodeCompat(),
|
|
122
121
|
},
|
|
123
|
-
...
|
|
122
|
+
...BUILTIN_LLM_PROVIDERS.map(createBuiltinLLMProviderExtension),
|
|
124
123
|
];
|
|
125
124
|
}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Back-compat barrel for extension contract interfaces.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Re-exports the category-folder modules under `../{ai,auth,cache,...}/`.
|
|
5
|
+
* Most entries are interface re-exports (erased at runtime); the
|
|
6
|
+
* `LLMProviderRegistryName` re-export is a runtime value (a const).
|
|
7
|
+
* This file will be deleted once all consumers migrate to the
|
|
8
|
+
* `veryfront/extensions/<category>` paths.
|
|
5
9
|
*
|
|
6
10
|
* @module extensions/interfaces
|
|
7
11
|
*/
|
|
@@ -76,12 +80,12 @@ export type {
|
|
|
76
80
|
// Tracing exporter
|
|
77
81
|
export type { SpanData, TracerProvider, TracingExporter } from "./tracing-exporter.js";
|
|
78
82
|
|
|
79
|
-
//
|
|
80
|
-
export type {
|
|
81
|
-
export {
|
|
83
|
+
// LLM provider (registry + per-provider contract) — moved to ../llm/
|
|
84
|
+
export type { LLMProvider, LLMProviderConfig, LLMProviderRegistry } from "../llm/index.js";
|
|
85
|
+
export { LLMProviderRegistryName } from "../llm/index.js";
|
|
82
86
|
|
|
83
|
-
// Embedding provider
|
|
84
|
-
export type { EmbeddingOptions, EmbeddingProvider, EmbeddingResult } from "
|
|
87
|
+
// Embedding provider — moved to ../llm/
|
|
88
|
+
export type { EmbeddingOptions, EmbeddingProvider, EmbeddingResult } from "../llm/index.js";
|
|
85
89
|
|
|
86
90
|
// Code parser
|
|
87
91
|
export type {
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM category barrel — provider, embedding, and registry contracts.
|
|
3
|
+
*
|
|
4
|
+
* Interfaces re-exported with `export type { ... }` because Deno `--no-check`
|
|
5
|
+
* transpiles each file in isolation and would otherwise emit a runtime value
|
|
6
|
+
* re-export that fails ESM resolution. Reserve plain `export { ... }` for
|
|
7
|
+
* runtime values.
|
|
8
|
+
*
|
|
9
|
+
* @module extensions/llm
|
|
10
|
+
*/
|
|
11
|
+
import "../../../_dnt.polyfills.js";
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
export { LLMProviderRegistryName } from "./llm-provider.js";
|
|
15
|
+
export type { LLMProvider, LLMProviderConfig, LLMProviderRegistry } from "./llm-provider.js";
|
|
16
|
+
export type { EmbeddingOptions, EmbeddingProvider, EmbeddingResult } from "./embedding-provider.js";
|
|
17
|
+
export { createLLMProviderRegistry } from "./llm-provider-registry.js";
|
package/src/src/extensions/{registries/ai-provider-registry.ts → llm/llm-provider-registry.ts}
RENAMED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Default Map-backed implementation of the
|
|
2
|
+
* Default Map-backed implementation of the LLMProviderRegistry contract.
|
|
3
3
|
*
|
|
4
4
|
* Preserves insertion order via Map (used by `list()`). Duplicate ids are
|
|
5
5
|
* first-write-wins so higher-priority extensions keep their provider binding.
|
|
6
6
|
*
|
|
7
|
-
* @module extensions/
|
|
7
|
+
* @module extensions/llm/llm-provider-registry
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import type {
|
|
10
|
+
import type { LLMProvider, LLMProviderRegistry } from "./llm-provider.js";
|
|
11
11
|
|
|
12
|
-
class
|
|
13
|
-
private readonly providers = new Map<string,
|
|
12
|
+
class LLMProviderRegistryImpl implements LLMProviderRegistry {
|
|
13
|
+
private readonly providers = new Map<string, LLMProvider>();
|
|
14
14
|
|
|
15
|
-
register(provider:
|
|
15
|
+
register(provider: LLMProvider): void {
|
|
16
16
|
if (this.providers.has(provider.id)) {
|
|
17
17
|
return;
|
|
18
18
|
}
|
|
@@ -23,16 +23,16 @@ class AIProviderRegistryImpl implements AIProviderRegistry {
|
|
|
23
23
|
this.providers.delete(id);
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
get(id: string):
|
|
26
|
+
get(id: string): LLMProvider | undefined {
|
|
27
27
|
return this.providers.get(id);
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
require(id: string):
|
|
30
|
+
require(id: string): LLMProvider {
|
|
31
31
|
const p = this.providers.get(id);
|
|
32
32
|
if (p) return p;
|
|
33
33
|
const known = [...this.providers.keys()].join(", ") || "(none)";
|
|
34
34
|
throw new Error(
|
|
35
|
-
`No
|
|
35
|
+
`No LLMProvider registered for "${id}". Known providers: ${known}.`,
|
|
36
36
|
);
|
|
37
37
|
}
|
|
38
38
|
|
|
@@ -40,11 +40,11 @@ class AIProviderRegistryImpl implements AIProviderRegistry {
|
|
|
40
40
|
return this.providers.has(id);
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
list():
|
|
43
|
+
list(): LLMProvider[] {
|
|
44
44
|
return [...this.providers.values()];
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
export function
|
|
49
|
-
return new
|
|
48
|
+
export function createLLMProviderRegistry(): LLMProviderRegistry {
|
|
49
|
+
return new LLMProviderRegistryImpl();
|
|
50
50
|
}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Contract interface for LLM provider extensions.
|
|
3
3
|
*
|
|
4
|
-
* A single `
|
|
5
|
-
* {@link
|
|
4
|
+
* A single `LLMProviderRegistry` impl lives in the contract registry under
|
|
5
|
+
* {@link LLMProviderRegistryName}. Each provider extension resolves the
|
|
6
6
|
* registry in its `setup()` and calls `registry.register(provider)`.
|
|
7
7
|
* Core consumers (model-registry, veryfront-cloud) resolve the registry
|
|
8
8
|
* and dispatch on provider id parsed from `"provider/model"` strings.
|
|
9
9
|
*
|
|
10
|
-
* @module extensions/
|
|
10
|
+
* @module extensions/llm/llm-provider
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import type { EmbeddingRuntime, ModelRuntime } from "../../provider/types.js";
|
|
14
14
|
|
|
15
15
|
/** Config passed to any provider's create* method. */
|
|
16
|
-
export interface
|
|
16
|
+
export interface LLMProviderConfig {
|
|
17
17
|
/** API credential — maps to OpenAI `apiKey`, Anthropic `authToken`, Google `apiKey` internally. */
|
|
18
18
|
credential: string;
|
|
19
19
|
/** Override the provider's base URL (e.g. Azure OpenAI, self-hosted gateway). */
|
|
@@ -28,27 +28,27 @@ export interface AIProviderConfig {
|
|
|
28
28
|
|
|
29
29
|
/**
|
|
30
30
|
* An LLM provider implementation. Extensions register one of these with the
|
|
31
|
-
* {@link
|
|
31
|
+
* {@link LLMProviderRegistry} during setup(). `createModel` is required;
|
|
32
32
|
* `createEmbedding` and `createResponses` are optional and absent on
|
|
33
33
|
* providers that don't support them.
|
|
34
34
|
*/
|
|
35
|
-
export interface
|
|
35
|
+
export interface LLMProvider {
|
|
36
36
|
/** Stable id used in model strings: "openai" / "anthropic" / "google". */
|
|
37
37
|
readonly id: string;
|
|
38
|
-
createModel(modelId: string, config:
|
|
39
|
-
createEmbedding?(modelId: string, config:
|
|
40
|
-
createResponses?(modelId: string, config:
|
|
38
|
+
createModel(modelId: string, config: LLMProviderConfig): ModelRuntime;
|
|
39
|
+
createEmbedding?(modelId: string, config: LLMProviderConfig): EmbeddingRuntime;
|
|
40
|
+
createResponses?(modelId: string, config: LLMProviderConfig): ModelRuntime;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
/** Registry contract. Single impl created at bootstrap. */
|
|
44
|
-
export interface
|
|
45
|
-
register(provider:
|
|
44
|
+
export interface LLMProviderRegistry {
|
|
45
|
+
register(provider: LLMProvider): void;
|
|
46
46
|
unregister(id: string): void;
|
|
47
|
-
get(id: string):
|
|
48
|
-
require(id: string):
|
|
49
|
-
list():
|
|
47
|
+
get(id: string): LLMProvider | undefined;
|
|
48
|
+
require(id: string): LLMProvider;
|
|
49
|
+
list(): LLMProvider[];
|
|
50
50
|
has(id: string): boolean;
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
/** Contract name used for `resolve()` / `provide()`. */
|
|
54
|
-
export const
|
|
54
|
+
export const LLMProviderRegistryName = "LLMProviderRegistry" as const;
|
|
@@ -22,7 +22,7 @@ export class ExtensionLoader {
|
|
|
22
22
|
/**
|
|
23
23
|
* Register contracts that will be re-applied after each `setupAll()`
|
|
24
24
|
* teardown pass. Used by `orchestrateExtensions()` to seed infrastructure
|
|
25
|
-
* (e.g. `
|
|
25
|
+
* (e.g. `LLMProviderRegistry`) before per-extension `setup()` runs.
|
|
26
26
|
*/
|
|
27
27
|
primeContracts(contracts: Record<string, unknown>): void {
|
|
28
28
|
this.primed = { ...this.primed, ...contracts };
|
|
@@ -34,7 +34,7 @@ export interface OrchestrateOptions {
|
|
|
34
34
|
primeContracts?: Record<string, unknown>;
|
|
35
35
|
/** Built-in extensions shipped with the framework. Lowest priority — any
|
|
36
36
|
* project, package, or config extension with the same name overrides them.
|
|
37
|
-
* Users can disable them via `{ name: "ext-anthropic", enabled: false }`. */
|
|
37
|
+
* Users can disable them via `{ name: "ext-llm-anthropic", enabled: false }`. */
|
|
38
38
|
builtinExtensions?: ResolvedExtension[];
|
|
39
39
|
/** @internal Override discovery functions in tests. */
|
|
40
40
|
discovery?: {
|
|
@@ -16,10 +16,10 @@ const recommendations = new Map<string, string>([
|
|
|
16
16
|
["DatabaseClient", "@veryfront/ext-postgres"],
|
|
17
17
|
["AuthProvider", "@veryfront/ext-jwt"],
|
|
18
18
|
["TracingExporter", "@veryfront/ext-opentelemetry"],
|
|
19
|
-
["
|
|
20
|
-
["
|
|
21
|
-
["
|
|
22
|
-
["
|
|
19
|
+
["LLMProviderRegistry", "@veryfront/ext-llm-openai"],
|
|
20
|
+
["LLMProvider:openai", "@veryfront/ext-llm-openai"],
|
|
21
|
+
["LLMProvider:anthropic", "@veryfront/ext-llm-anthropic"],
|
|
22
|
+
["LLMProvider:google", "@veryfront/ext-llm-google"],
|
|
23
23
|
["EmbeddingProvider", "@veryfront/ext-embeddings"],
|
|
24
24
|
["CodeParser", "@veryfront/ext-babel"],
|
|
25
25
|
["SchemaValidator", "@veryfront/ext-zod"],
|