@uncensoredcode/openbridge 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +117 -0
- package/bin/openbridge.js +10 -0
- package/package.json +85 -0
- package/packages/cli/dist/args.d.ts +30 -0
- package/packages/cli/dist/args.js +160 -0
- package/packages/cli/dist/cli.d.ts +2 -0
- package/packages/cli/dist/cli.js +9 -0
- package/packages/cli/dist/index.d.ts +26 -0
- package/packages/cli/dist/index.js +76 -0
- package/packages/runtime/dist/assistant-protocol.d.ts +34 -0
- package/packages/runtime/dist/assistant-protocol.js +121 -0
- package/packages/runtime/dist/execution/in-process.d.ts +14 -0
- package/packages/runtime/dist/execution/in-process.js +45 -0
- package/packages/runtime/dist/execution/types.d.ts +49 -0
- package/packages/runtime/dist/execution/types.js +20 -0
- package/packages/runtime/dist/index.d.ts +86 -0
- package/packages/runtime/dist/index.js +60 -0
- package/packages/runtime/dist/normalizers/index.d.ts +6 -0
- package/packages/runtime/dist/normalizers/index.js +12 -0
- package/packages/runtime/dist/normalizers/legacy-packet.d.ts +6 -0
- package/packages/runtime/dist/normalizers/legacy-packet.js +131 -0
- package/packages/runtime/dist/output-sanitizer.d.ts +23 -0
- package/packages/runtime/dist/output-sanitizer.js +78 -0
- package/packages/runtime/dist/packet-extractor.d.ts +17 -0
- package/packages/runtime/dist/packet-extractor.js +43 -0
- package/packages/runtime/dist/packet-normalizer.d.ts +21 -0
- package/packages/runtime/dist/packet-normalizer.js +47 -0
- package/packages/runtime/dist/prompt-compiler.d.ts +28 -0
- package/packages/runtime/dist/prompt-compiler.js +301 -0
- package/packages/runtime/dist/protocol.d.ts +44 -0
- package/packages/runtime/dist/protocol.js +165 -0
- package/packages/runtime/dist/provider-failure.d.ts +52 -0
- package/packages/runtime/dist/provider-failure.js +236 -0
- package/packages/runtime/dist/provider.d.ts +40 -0
- package/packages/runtime/dist/provider.js +1 -0
- package/packages/runtime/dist/runtime.d.ts +86 -0
- package/packages/runtime/dist/runtime.js +462 -0
- package/packages/runtime/dist/session-bound-provider.d.ts +52 -0
- package/packages/runtime/dist/session-bound-provider.js +366 -0
- package/packages/runtime/dist/tool-name-aliases.d.ts +5 -0
- package/packages/runtime/dist/tool-name-aliases.js +13 -0
- package/packages/runtime/dist/tools/bash.d.ts +9 -0
- package/packages/runtime/dist/tools/bash.js +157 -0
- package/packages/runtime/dist/tools/edit.d.ts +9 -0
- package/packages/runtime/dist/tools/edit.js +94 -0
- package/packages/runtime/dist/tools/index.d.ts +39 -0
- package/packages/runtime/dist/tools/index.js +27 -0
- package/packages/runtime/dist/tools/list-dir.d.ts +9 -0
- package/packages/runtime/dist/tools/list-dir.js +127 -0
- package/packages/runtime/dist/tools/read.d.ts +9 -0
- package/packages/runtime/dist/tools/read.js +56 -0
- package/packages/runtime/dist/tools/registry.d.ts +15 -0
- package/packages/runtime/dist/tools/registry.js +38 -0
- package/packages/runtime/dist/tools/runtime-path.d.ts +7 -0
- package/packages/runtime/dist/tools/runtime-path.js +22 -0
- package/packages/runtime/dist/tools/search-files.d.ts +9 -0
- package/packages/runtime/dist/tools/search-files.js +149 -0
- package/packages/runtime/dist/tools/text-file.d.ts +32 -0
- package/packages/runtime/dist/tools/text-file.js +101 -0
- package/packages/runtime/dist/tools/workspace-path.d.ts +17 -0
- package/packages/runtime/dist/tools/workspace-path.js +70 -0
- package/packages/runtime/dist/tools/write.d.ts +9 -0
- package/packages/runtime/dist/tools/write.js +59 -0
- package/packages/server/dist/bridge/bridge-model-catalog.d.ts +56 -0
- package/packages/server/dist/bridge/bridge-model-catalog.js +100 -0
- package/packages/server/dist/bridge/bridge-runtime-service.d.ts +61 -0
- package/packages/server/dist/bridge/bridge-runtime-service.js +1386 -0
- package/packages/server/dist/bridge/chat-completions/chat-completion-service.d.ts +127 -0
- package/packages/server/dist/bridge/chat-completions/chat-completion-service.js +1026 -0
- package/packages/server/dist/bridge/index.d.ts +335 -0
- package/packages/server/dist/bridge/index.js +45 -0
- package/packages/server/dist/bridge/live-provider-extraction-canary.d.ts +69 -0
- package/packages/server/dist/bridge/live-provider-extraction-canary.js +186 -0
- package/packages/server/dist/bridge/providers/generic-provider-transport.d.ts +53 -0
- package/packages/server/dist/bridge/providers/generic-provider-transport.js +973 -0
- package/packages/server/dist/bridge/providers/provider-session-resolver.d.ts +17 -0
- package/packages/server/dist/bridge/providers/provider-session-resolver.js +95 -0
- package/packages/server/dist/bridge/providers/provider-streams.d.ts +80 -0
- package/packages/server/dist/bridge/providers/provider-streams.js +844 -0
- package/packages/server/dist/bridge/providers/provider-transport-profile.d.ts +194 -0
- package/packages/server/dist/bridge/providers/provider-transport-profile.js +198 -0
- package/packages/server/dist/bridge/providers/web-provider-transport.d.ts +30 -0
- package/packages/server/dist/bridge/providers/web-provider-transport.js +151 -0
- package/packages/server/dist/bridge/state/file-bridge-state-store.d.ts +36 -0
- package/packages/server/dist/bridge/state/file-bridge-state-store.js +164 -0
- package/packages/server/dist/bridge/stores/local-session-package-store.d.ts +23 -0
- package/packages/server/dist/bridge/stores/local-session-package-store.js +548 -0
- package/packages/server/dist/bridge/stores/provider-store.d.ts +94 -0
- package/packages/server/dist/bridge/stores/provider-store.js +143 -0
- package/packages/server/dist/bridge/stores/session-backed-provider-store.d.ts +7 -0
- package/packages/server/dist/bridge/stores/session-backed-provider-store.js +26 -0
- package/packages/server/dist/bridge/stores/session-package-store.d.ts +286 -0
- package/packages/server/dist/bridge/stores/session-package-store.js +1527 -0
- package/packages/server/dist/bridge/stores/session-store.d.ts +120 -0
- package/packages/server/dist/bridge/stores/session-store.js +139 -0
- package/packages/server/dist/cli/index.d.ts +9 -0
- package/packages/server/dist/cli/index.js +6 -0
- package/packages/server/dist/cli/main.d.ts +2 -0
- package/packages/server/dist/cli/main.js +9 -0
- package/packages/server/dist/cli/run-bridge-server-cli.d.ts +54 -0
- package/packages/server/dist/cli/run-bridge-server-cli.js +371 -0
- package/packages/server/dist/client/bridge-api-client.d.ts +61 -0
- package/packages/server/dist/client/bridge-api-client.js +267 -0
- package/packages/server/dist/client/index.d.ts +11 -0
- package/packages/server/dist/client/index.js +11 -0
- package/packages/server/dist/config/bridge-server-config.d.ts +52 -0
- package/packages/server/dist/config/bridge-server-config.js +118 -0
- package/packages/server/dist/config/index.d.ts +20 -0
- package/packages/server/dist/config/index.js +8 -0
- package/packages/server/dist/http/bridge-api-route-context.d.ts +14 -0
- package/packages/server/dist/http/bridge-api-route-context.js +1 -0
- package/packages/server/dist/http/create-bridge-api-server.d.ts +72 -0
- package/packages/server/dist/http/create-bridge-api-server.js +225 -0
- package/packages/server/dist/http/index.d.ts +5 -0
- package/packages/server/dist/http/index.js +5 -0
- package/packages/server/dist/http/parse-request.d.ts +6 -0
- package/packages/server/dist/http/parse-request.js +27 -0
- package/packages/server/dist/http/register-bridge-api-routes.d.ts +7 -0
- package/packages/server/dist/http/register-bridge-api-routes.js +17 -0
- package/packages/server/dist/http/routes/admin-routes.d.ts +7 -0
- package/packages/server/dist/http/routes/admin-routes.js +135 -0
- package/packages/server/dist/http/routes/chat-completions-route.d.ts +7 -0
- package/packages/server/dist/http/routes/chat-completions-route.js +49 -0
- package/packages/server/dist/http/routes/health-routes.d.ts +6 -0
- package/packages/server/dist/http/routes/health-routes.js +7 -0
- package/packages/server/dist/http/routes/message-routes.d.ts +7 -0
- package/packages/server/dist/http/routes/message-routes.js +7 -0
- package/packages/server/dist/index.d.ts +85 -0
- package/packages/server/dist/index.js +28 -0
- package/packages/server/dist/security/bridge-auth.d.ts +9 -0
- package/packages/server/dist/security/bridge-auth.js +41 -0
- package/packages/server/dist/security/cors-policy.d.ts +5 -0
- package/packages/server/dist/security/cors-policy.js +34 -0
- package/packages/server/dist/security/index.d.ts +16 -0
- package/packages/server/dist/security/index.js +12 -0
- package/packages/server/dist/security/redact-sensitive-values.d.ts +19 -0
- package/packages/server/dist/security/redact-sensitive-values.js +67 -0
- package/packages/server/dist/shared/api-schema.d.ts +133 -0
- package/packages/server/dist/shared/api-schema.js +1 -0
- package/packages/server/dist/shared/bridge-api-error.d.ts +17 -0
- package/packages/server/dist/shared/bridge-api-error.js +19 -0
- package/packages/server/dist/shared/index.d.ts +7 -0
- package/packages/server/dist/shared/index.js +7 -0
- package/packages/server/dist/shared/output.d.ts +5 -0
- package/packages/server/dist/shared/output.js +14 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { mkdir, realpath } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { executionTypesModule } from "../execution/types.js";
|
|
4
|
+
const { ToolExecutionError } = executionTypesModule;
|
|
5
|
+
async function ensureWorkspaceRoot(workspaceRoot) {
|
|
6
|
+
await mkdir(workspaceRoot, { recursive: true });
|
|
7
|
+
return realpath(workspaceRoot);
|
|
8
|
+
}
|
|
9
|
+
async function resolveWorkspacePath(input) {
|
|
10
|
+
const requestPath = input.requestedPath.trim();
|
|
11
|
+
if (!requestPath) {
|
|
12
|
+
throw new ToolExecutionError("invalid_arguments", "path must be a non-empty string.");
|
|
13
|
+
}
|
|
14
|
+
const canonicalRoot = await ensureWorkspaceRoot(input.workspaceRoot);
|
|
15
|
+
const lexicalTarget = path.isAbsolute(requestPath)
|
|
16
|
+
? path.resolve(requestPath)
|
|
17
|
+
: path.resolve(canonicalRoot, requestPath);
|
|
18
|
+
assertWithinWorkspace(canonicalRoot, lexicalTarget);
|
|
19
|
+
const canonicalTarget = input.kind === "read"
|
|
20
|
+
? await realpath(lexicalTarget).catch((error) => {
|
|
21
|
+
if (error.code === "ENOENT") {
|
|
22
|
+
throw new ToolExecutionError("not_found", `File does not exist: ${requestPath}`);
|
|
23
|
+
}
|
|
24
|
+
throw error;
|
|
25
|
+
})
|
|
26
|
+
: await resolveWriteTarget(canonicalRoot, lexicalTarget);
|
|
27
|
+
assertWithinWorkspace(canonicalRoot, canonicalTarget);
|
|
28
|
+
return {
|
|
29
|
+
absolutePath: canonicalTarget,
|
|
30
|
+
relativePath: toWorkspaceRelativePath(canonicalRoot, canonicalTarget),
|
|
31
|
+
workspaceRoot: canonicalRoot
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function assertWithinWorkspace(workspaceRoot, targetPath) {
|
|
35
|
+
const relative = path.relative(workspaceRoot, targetPath);
|
|
36
|
+
if (relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative))) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
throw new ToolExecutionError("workspace_violation", `Path "${targetPath}" resolves outside the configured workspace root.`);
|
|
40
|
+
}
|
|
41
|
+
async function resolveWriteTarget(workspaceRoot, lexicalTarget) {
|
|
42
|
+
const nearestExistingAncestor = await findNearestExistingAncestor(workspaceRoot, lexicalTarget);
|
|
43
|
+
const canonicalAncestor = await realpath(nearestExistingAncestor);
|
|
44
|
+
const suffix = path.relative(nearestExistingAncestor, lexicalTarget);
|
|
45
|
+
return suffix ? path.resolve(canonicalAncestor, suffix) : canonicalAncestor;
|
|
46
|
+
}
|
|
47
|
+
async function findNearestExistingAncestor(workspaceRoot, lexicalTarget) {
|
|
48
|
+
let cursor = lexicalTarget;
|
|
49
|
+
while (true) {
|
|
50
|
+
try {
|
|
51
|
+
await realpath(cursor);
|
|
52
|
+
return cursor;
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
const next = path.dirname(cursor);
|
|
56
|
+
if (next === cursor || next.length < workspaceRoot.length) {
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
cursor = next;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function toWorkspaceRelativePath(workspaceRoot, absolutePath) {
|
|
64
|
+
const relative = path.relative(workspaceRoot, absolutePath);
|
|
65
|
+
return relative || ".";
|
|
66
|
+
}
|
|
67
|
+
export const workspacePathModule = {
|
|
68
|
+
ensureWorkspaceRoot,
|
|
69
|
+
resolveWorkspacePath
|
|
70
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { RuntimeTool } from "../execution/types.ts";
|
|
2
|
+
type WriteToolOptions = {
|
|
3
|
+
runtimeRoot: string;
|
|
4
|
+
};
|
|
5
|
+
declare function createWriteTool(options: WriteToolOptions): RuntimeTool;
|
|
6
|
+
export declare const writeModule: {
|
|
7
|
+
createWriteTool: typeof createWriteTool;
|
|
8
|
+
};
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { mkdir } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { executionTypesModule } from "../execution/types.js";
|
|
4
|
+
import { runtimePathModule } from "./runtime-path.js";
|
|
5
|
+
import { textFileModule } from "./text-file.js";
|
|
6
|
+
const { ToolExecutionError } = executionTypesModule;
|
|
7
|
+
const { assertTextContent, MAX_FILE_WRITE_BYTES, writeTextFileAtomic } = textFileModule;
|
|
8
|
+
const { resolveRuntimePath } = runtimePathModule;
|
|
9
|
+
function createWriteTool(options) {
|
|
10
|
+
return {
|
|
11
|
+
definition: {
|
|
12
|
+
name: "write",
|
|
13
|
+
description: "Create or overwrite a UTF-8 text file on the local filesystem.",
|
|
14
|
+
inputSchema: {
|
|
15
|
+
type: "object",
|
|
16
|
+
properties: {
|
|
17
|
+
path: {
|
|
18
|
+
type: "string",
|
|
19
|
+
description: "Absolute path or path relative to the runtime root."
|
|
20
|
+
},
|
|
21
|
+
content: {
|
|
22
|
+
type: "string",
|
|
23
|
+
description: "Full file contents to write."
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
required: ["path", "content"]
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
async execute(args) {
|
|
30
|
+
const resolvedPath = await resolveRuntimePath(options.runtimeRoot, requireString(args, "path"));
|
|
31
|
+
const content = requireString(args, "content");
|
|
32
|
+
const bytesWritten = assertTextContent(content, resolvedPath, MAX_FILE_WRITE_BYTES);
|
|
33
|
+
try {
|
|
34
|
+
await mkdir(path.dirname(resolvedPath), { recursive: true });
|
|
35
|
+
await writeTextFileAtomic(resolvedPath, content);
|
|
36
|
+
return {
|
|
37
|
+
path: resolvedPath,
|
|
38
|
+
bytesWritten
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
if (error instanceof ToolExecutionError) {
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
throw new ToolExecutionError("io_error", `Unable to write file "${resolvedPath}": ${error instanceof Error ? error.message : String(error)}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function requireString(args, key) {
|
|
51
|
+
const value = args[key];
|
|
52
|
+
if (typeof value === "string") {
|
|
53
|
+
return value;
|
|
54
|
+
}
|
|
55
|
+
throw new ToolExecutionError("invalid_arguments", `${key} must be a string.`);
|
|
56
|
+
}
|
|
57
|
+
export const writeModule = {
|
|
58
|
+
createWriteTool
|
|
59
|
+
};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { ProviderRecord } from "./stores/provider-store.ts";
|
|
3
|
+
declare const bridgeModelSchema: z.ZodObject<{
|
|
4
|
+
id: z.ZodString;
|
|
5
|
+
object: z.ZodLiteral<"model">;
|
|
6
|
+
created: z.ZodNumber;
|
|
7
|
+
owned_by: z.ZodString;
|
|
8
|
+
}, z.core.$strip>;
|
|
9
|
+
type BridgeModelRecord = z.infer<typeof bridgeModelSchema>;
|
|
10
|
+
type ResolvedBridgeModel = {
|
|
11
|
+
provider: ProviderRecord;
|
|
12
|
+
modelId: string;
|
|
13
|
+
publicModelId: string;
|
|
14
|
+
available: boolean;
|
|
15
|
+
};
|
|
16
|
+
declare function buildModelListResponse(providers: ProviderRecord[]): {
|
|
17
|
+
object: "list";
|
|
18
|
+
data: {
|
|
19
|
+
id: string;
|
|
20
|
+
object: "model";
|
|
21
|
+
created: number;
|
|
22
|
+
owned_by: string;
|
|
23
|
+
}[];
|
|
24
|
+
};
|
|
25
|
+
declare function defaultModelForProvider(provider: ProviderRecord | null): string;
|
|
26
|
+
declare function resolveBridgeModel(providers: ProviderRecord[], publicModelId: string): ResolvedBridgeModel | null;
|
|
27
|
+
export declare const bridgeModelCatalogModule: {
|
|
28
|
+
bridgeModelSchema: z.ZodObject<{
|
|
29
|
+
id: z.ZodString;
|
|
30
|
+
object: z.ZodLiteral<"model">;
|
|
31
|
+
created: z.ZodNumber;
|
|
32
|
+
owned_by: z.ZodString;
|
|
33
|
+
}, z.core.$strip>;
|
|
34
|
+
bridgeModelListResponseSchema: z.ZodObject<{
|
|
35
|
+
object: z.ZodLiteral<"list">;
|
|
36
|
+
data: z.ZodArray<z.ZodObject<{
|
|
37
|
+
id: z.ZodString;
|
|
38
|
+
object: z.ZodLiteral<"model">;
|
|
39
|
+
created: z.ZodNumber;
|
|
40
|
+
owned_by: z.ZodString;
|
|
41
|
+
}, z.core.$strip>>;
|
|
42
|
+
}, z.core.$strip>;
|
|
43
|
+
createModelRequestSchema: z.ZodObject<{
|
|
44
|
+
provider: z.ZodString;
|
|
45
|
+
model: z.ZodString;
|
|
46
|
+
}, z.core.$strict>;
|
|
47
|
+
modelMutationResponseSchema: z.ZodObject<{
|
|
48
|
+
ok: z.ZodLiteral<true>;
|
|
49
|
+
providerId: z.ZodString;
|
|
50
|
+
modelId: z.ZodString;
|
|
51
|
+
}, z.core.$strict>;
|
|
52
|
+
buildModelListResponse: typeof buildModelListResponse;
|
|
53
|
+
defaultModelForProvider: typeof defaultModelForProvider;
|
|
54
|
+
resolveBridgeModel: typeof resolveBridgeModel;
|
|
55
|
+
};
|
|
56
|
+
export type { BridgeModelRecord, ResolvedBridgeModel };
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { providerTransportProfileModule } from "./providers/provider-transport-profile.js";
|
|
3
|
+
const { defaultModelForProviderRecord, readConfiguredModelIds } = providerTransportProfileModule;
|
|
4
|
+
const nonEmptyString = (field) => z.string().trim().min(1, `${field} is required.`);
|
|
5
|
+
const bridgeModelSchema = z.object({
|
|
6
|
+
id: nonEmptyString("id"),
|
|
7
|
+
object: z.literal("model"),
|
|
8
|
+
created: z.number().int().nonnegative(),
|
|
9
|
+
owned_by: nonEmptyString("owned_by")
|
|
10
|
+
});
|
|
11
|
+
const bridgeModelListResponseSchema = z.object({
|
|
12
|
+
object: z.literal("list"),
|
|
13
|
+
data: z.array(bridgeModelSchema)
|
|
14
|
+
});
|
|
15
|
+
const createModelRequestSchema = z
|
|
16
|
+
.object({
|
|
17
|
+
provider: nonEmptyString("provider"),
|
|
18
|
+
model: nonEmptyString("model")
|
|
19
|
+
})
|
|
20
|
+
.strict();
|
|
21
|
+
const modelMutationResponseSchema = z
|
|
22
|
+
.object({
|
|
23
|
+
ok: z.literal(true),
|
|
24
|
+
providerId: nonEmptyString("providerId"),
|
|
25
|
+
modelId: nonEmptyString("modelId")
|
|
26
|
+
})
|
|
27
|
+
.strict();
|
|
28
|
+
function buildModelListResponse(providers) {
|
|
29
|
+
const data = providers
|
|
30
|
+
.flatMap((provider) => listModelsForProvider(provider))
|
|
31
|
+
.sort((left, right) => left.id.localeCompare(right.id));
|
|
32
|
+
return bridgeModelListResponseSchema.parse({
|
|
33
|
+
object: "list",
|
|
34
|
+
data
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
function defaultModelForProvider(provider) {
|
|
38
|
+
return defaultModelForProviderRecord(provider);
|
|
39
|
+
}
|
|
40
|
+
function resolveBridgeModel(providers, publicModelId) {
|
|
41
|
+
for (const provider of providers) {
|
|
42
|
+
for (const modelId of resolveModelIdsForProvider(provider)) {
|
|
43
|
+
if (`${provider.id}/${modelId}` !== publicModelId) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
provider,
|
|
48
|
+
modelId,
|
|
49
|
+
publicModelId,
|
|
50
|
+
available: provider.enabled
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const dynamicModelId = readDynamicModelId(provider, publicModelId);
|
|
54
|
+
if (dynamicModelId) {
|
|
55
|
+
return {
|
|
56
|
+
provider,
|
|
57
|
+
modelId: dynamicModelId,
|
|
58
|
+
publicModelId,
|
|
59
|
+
available: provider.enabled
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
function listModelsForProvider(provider) {
|
|
66
|
+
if (!provider.enabled) {
|
|
67
|
+
return [];
|
|
68
|
+
}
|
|
69
|
+
const modelIds = resolveModelIdsForProvider(provider);
|
|
70
|
+
const created = toUnixTimestamp(provider.createdAt);
|
|
71
|
+
return modelIds.map((modelId) => bridgeModelSchema.parse({
|
|
72
|
+
id: `${provider.id}/${modelId}`,
|
|
73
|
+
object: "model",
|
|
74
|
+
created,
|
|
75
|
+
owned_by: provider.id
|
|
76
|
+
}));
|
|
77
|
+
}
|
|
78
|
+
function resolveModelIdsForProvider(provider) {
|
|
79
|
+
return readConfiguredModelIds(provider.config);
|
|
80
|
+
}
|
|
81
|
+
function readDynamicModelId(provider, publicModelId) {
|
|
82
|
+
const prefix = `${provider.id}/`;
|
|
83
|
+
if (!publicModelId.startsWith(prefix)) {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
const modelId = publicModelId.slice(prefix.length).trim();
|
|
87
|
+
return modelId ? modelId : null;
|
|
88
|
+
}
|
|
89
|
+
function toUnixTimestamp(value) {
|
|
90
|
+
return Math.floor(Date.parse(value) / 1000);
|
|
91
|
+
}
|
|
92
|
+
export const bridgeModelCatalogModule = {
|
|
93
|
+
bridgeModelSchema,
|
|
94
|
+
bridgeModelListResponseSchema,
|
|
95
|
+
createModelRequestSchema,
|
|
96
|
+
modelMutationResponseSchema,
|
|
97
|
+
buildModelListResponse,
|
|
98
|
+
defaultModelForProvider,
|
|
99
|
+
resolveBridgeModel
|
|
100
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { AssistantResponse, BridgeSessionTurn, CompiledProviderMessage, ProviderTransport, SessionBindingStore } from "@uncensoredcode/openbridge/runtime";
|
|
2
|
+
import type { BridgeServerConfig } from "../config/index.ts";
|
|
3
|
+
import type { BridgeApiToolProfile, BridgeChatCompletionRequest, BridgeChatCompletionTool, BridgeMessageRequest, BridgeMessageResponse } from "../shared/api-schema.ts";
|
|
4
|
+
import type { ProviderStreamFragment } from "./providers/provider-streams.ts";
|
|
5
|
+
import type { ProviderRecord } from "./stores/provider-store.ts";
|
|
6
|
+
import type { SessionPackageStore } from "./stores/session-package-store.ts";
|
|
7
|
+
type BridgeRuntimeServiceDependencies = {
|
|
8
|
+
config: BridgeServerConfig;
|
|
9
|
+
loadProvider?: (providerId: string) => ProviderRecord | null;
|
|
10
|
+
sessionBindingStore?: SessionBindingStore;
|
|
11
|
+
sessionPackageStore?: SessionPackageStore;
|
|
12
|
+
transport?: ProviderTransport;
|
|
13
|
+
onLog?: (event: BridgeRuntimeServiceLogEvent) => void;
|
|
14
|
+
};
|
|
15
|
+
type BridgeRuntimeService = ReturnType<typeof createBridgeRuntimeService>;
|
|
16
|
+
type BridgeRuntimeServiceLogEvent = {
|
|
17
|
+
scope: "request" | "provider" | "runtime";
|
|
18
|
+
event: string;
|
|
19
|
+
requestId: string;
|
|
20
|
+
detail: Record<string, unknown>;
|
|
21
|
+
};
|
|
22
|
+
type BridgeRuntimeExecutionRequest = {
|
|
23
|
+
sessionId: string;
|
|
24
|
+
input: string;
|
|
25
|
+
providerId: string;
|
|
26
|
+
modelId: string;
|
|
27
|
+
metadata?: Record<string, unknown>;
|
|
28
|
+
toolProfile?: BridgeApiToolProfile;
|
|
29
|
+
sessionHistory?: BridgeSessionTurn[];
|
|
30
|
+
persistSession?: boolean;
|
|
31
|
+
};
|
|
32
|
+
type ChatCompletionPacketRequest = {
|
|
33
|
+
sessionId: string;
|
|
34
|
+
providerId: string;
|
|
35
|
+
modelId: string;
|
|
36
|
+
messages: CompiledProviderMessage[];
|
|
37
|
+
tools: BridgeChatCompletionTool[];
|
|
38
|
+
toolChoice?: BridgeChatCompletionRequest["tool_choice"];
|
|
39
|
+
continuation: boolean;
|
|
40
|
+
toolFollowUp: boolean;
|
|
41
|
+
metadata?: Record<string, unknown>;
|
|
42
|
+
persistSession?: boolean;
|
|
43
|
+
};
|
|
44
|
+
declare function createBridgeRuntimeService(dependencies: BridgeRuntimeServiceDependencies): {
|
|
45
|
+
respond(request: BridgeMessageRequest, pathSessionId?: string): Promise<BridgeMessageResponse>;
|
|
46
|
+
execute(request: BridgeRuntimeExecutionRequest): Promise<BridgeMessageResponse>;
|
|
47
|
+
completeChatCompletionPacket(request: ChatCompletionPacketRequest): Promise<{
|
|
48
|
+
packet: AssistantResponse;
|
|
49
|
+
providerBindingReused: boolean;
|
|
50
|
+
}>;
|
|
51
|
+
streamChatCompletionPacket(request: ChatCompletionPacketRequest): Promise<{
|
|
52
|
+
content: AsyncIterable<ProviderStreamFragment>;
|
|
53
|
+
packet: Promise<AssistantResponse>;
|
|
54
|
+
providerBindingReused: boolean;
|
|
55
|
+
}>;
|
|
56
|
+
streamChatCompletion(request: BridgeRuntimeExecutionRequest): Promise<AsyncIterable<string>>;
|
|
57
|
+
};
|
|
58
|
+
export declare const bridgeRuntimeServiceModule: {
|
|
59
|
+
createBridgeRuntimeService: typeof createBridgeRuntimeService;
|
|
60
|
+
};
|
|
61
|
+
export type { BridgeRuntimeService, BridgeRuntimeServiceDependencies, BridgeRuntimeServiceLogEvent };
|