pi-leo-bridge 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/CONTRIBUTING.md +16 -0
- package/LICENSE +21 -0
- package/README.md +195 -0
- package/SECURITY.md +23 -0
- package/bin/pi-leo +229 -0
- package/dist/src/check-model.d.ts +1 -0
- package/dist/src/check-model.js +47 -0
- package/dist/src/check-model.js.map +1 -0
- package/dist/src/config.d.ts +23 -0
- package/dist/src/config.js +81 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +60 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/list-models.d.ts +1 -0
- package/dist/src/list-models.js +54 -0
- package/dist/src/list-models.js.map +1 -0
- package/dist/src/openai.d.ts +47 -0
- package/dist/src/openai.js +210 -0
- package/dist/src/openai.js.map +1 -0
- package/dist/src/output-filter.d.ts +21 -0
- package/dist/src/output-filter.js +129 -0
- package/dist/src/output-filter.js.map +1 -0
- package/dist/src/pi-runner.d.ts +16 -0
- package/dist/src/pi-runner.js +220 -0
- package/dist/src/pi-runner.js.map +1 -0
- package/dist/src/server.d.ts +13 -0
- package/dist/src/server.js +342 -0
- package/dist/src/server.js.map +1 -0
- package/docs/RELEASING.md +28 -0
- package/package.json +63 -0
- package/scripts/configure-install.py +530 -0
- package/scripts/doctor.py +192 -0
- package/scripts/install.sh +406 -0
- package/scripts/remove-brave-models.py +112 -0
- package/scripts/set-brave-default.py +119 -0
- package/scripts/uninstall.sh +133 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { mkdir } from "node:fs/promises";
|
|
2
|
+
import { defaultConfigPath, loadConfig } from "./config.js";
|
|
3
|
+
import { PiCompletionRunner } from "./pi-runner.js";
|
|
4
|
+
import { createBridgeServer } from "./server.js";
|
|
5
|
+
function configPathFromArguments(arguments_) {
|
|
6
|
+
const index = arguments_.indexOf("--config");
|
|
7
|
+
if (index < 0) {
|
|
8
|
+
return process.env.PI_LEO_CONFIG || defaultConfigPath();
|
|
9
|
+
}
|
|
10
|
+
const value = arguments_[index + 1];
|
|
11
|
+
if (!value) {
|
|
12
|
+
throw new Error("--config requires a path");
|
|
13
|
+
}
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
async function main() {
|
|
17
|
+
process.title = "pi-leo-bridge";
|
|
18
|
+
const configPath = configPathFromArguments(process.argv.slice(2));
|
|
19
|
+
const config = await loadConfig(configPath);
|
|
20
|
+
await mkdir(config.workspace, { recursive: true, mode: 0o700 });
|
|
21
|
+
console.info(`${new Date().toISOString()} initializing ${config.provider}/${config.modelId}`);
|
|
22
|
+
const runner = await PiCompletionRunner.create(config);
|
|
23
|
+
const bridge = createBridgeServer(config, runner);
|
|
24
|
+
await new Promise((resolve, reject) => {
|
|
25
|
+
const onError = (error) => reject(error);
|
|
26
|
+
bridge.server.once("error", onError);
|
|
27
|
+
bridge.server.listen(config.port, config.host, () => {
|
|
28
|
+
bridge.server.off("error", onError);
|
|
29
|
+
resolve();
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
console.info(`${new Date().toISOString()} listening=http://${config.host}:${config.port} model=${runner.provider}/${runner.modelId} profiles=${runner.profiles.map((profile) => `${profile.publicModelId}:${profile.thinkingLevel}`).join(",")} tools=disabled`);
|
|
33
|
+
let shuttingDown = false;
|
|
34
|
+
const shutdown = (signal) => {
|
|
35
|
+
if (shuttingDown) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
shuttingDown = true;
|
|
39
|
+
console.info(`${new Date().toISOString()} shutdown=${signal} active=${bridge.activeRequests()}`);
|
|
40
|
+
bridge.server.close(() => process.exit(0));
|
|
41
|
+
setTimeout(() => {
|
|
42
|
+
bridge.server.closeAllConnections();
|
|
43
|
+
process.exit(0);
|
|
44
|
+
}, 10_000).unref();
|
|
45
|
+
};
|
|
46
|
+
process.on("SIGTERM", () => shutdown("SIGTERM"));
|
|
47
|
+
process.on("SIGINT", () => shutdown("SIGINT"));
|
|
48
|
+
}
|
|
49
|
+
main().catch((error) => {
|
|
50
|
+
const name = error instanceof Error ? error.name : "UnknownError";
|
|
51
|
+
const message = (error instanceof Error ? error.message : String(error))
|
|
52
|
+
.replace(/Bearer\s+[A-Za-z0-9._~-]+/gi, "Bearer <redacted>")
|
|
53
|
+
.replace(/\bsk-[A-Za-z0-9_-]{12,}\b/g, "<redacted-api-key>")
|
|
54
|
+
.replace(/\/auth\/[A-Za-z0-9_-]{20,}\//g, "/auth/<redacted>/")
|
|
55
|
+
.replace(/[\r\n]+/g, " ")
|
|
56
|
+
.slice(0, 500);
|
|
57
|
+
console.error(`${new Date().toISOString()} fatal=${name}:${message}`);
|
|
58
|
+
process.exitCode = 1;
|
|
59
|
+
});
|
|
60
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { ModelRuntime } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
const args = process.argv.slice(2);
|
|
3
|
+
const jsonOutput = args.includes("--json");
|
|
4
|
+
const provider = args.find((argument) => !argument.startsWith("-"));
|
|
5
|
+
const runtime = await ModelRuntime.create({
|
|
6
|
+
allowModelNetwork: false,
|
|
7
|
+
refreshOnCreate: true,
|
|
8
|
+
signal: AbortSignal.timeout(30_000),
|
|
9
|
+
});
|
|
10
|
+
const providerIds = provider
|
|
11
|
+
? [provider]
|
|
12
|
+
: runtime
|
|
13
|
+
.getProviders()
|
|
14
|
+
.map((candidate) => candidate.id)
|
|
15
|
+
.filter((providerId) => runtime.hasConfiguredAuth(providerId));
|
|
16
|
+
const models = [];
|
|
17
|
+
for (const providerId of providerIds) {
|
|
18
|
+
if (!runtime.getProvider(providerId)) {
|
|
19
|
+
throw new Error(`Unknown Pi provider: ${providerId}`);
|
|
20
|
+
}
|
|
21
|
+
if (!runtime.hasConfiguredAuth(providerId)) {
|
|
22
|
+
if (provider) {
|
|
23
|
+
throw new Error(`Pi authentication is not configured for provider: ${providerId}`);
|
|
24
|
+
}
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
const available = await runtime.getAvailable(providerId, {
|
|
28
|
+
signal: AbortSignal.timeout(30_000),
|
|
29
|
+
});
|
|
30
|
+
for (const model of available) {
|
|
31
|
+
models.push({
|
|
32
|
+
provider: model.provider,
|
|
33
|
+
id: model.id,
|
|
34
|
+
name: model.name,
|
|
35
|
+
reasoning: model.reasoning,
|
|
36
|
+
vision: model.input.includes("image"),
|
|
37
|
+
contextWindow: model.contextWindow,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
models.sort((left, right) => `${left.provider}/${left.id}`.localeCompare(`${right.provider}/${right.id}`));
|
|
42
|
+
if (jsonOutput) {
|
|
43
|
+
process.stdout.write(`${JSON.stringify(models, null, 2)}\n`);
|
|
44
|
+
}
|
|
45
|
+
else if (models.length === 0) {
|
|
46
|
+
process.stdout.write("No available models were found for configured Pi providers.\n");
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
for (const model of models) {
|
|
50
|
+
const capabilities = [model.reasoning ? "reasoning" : "no-reasoning", model.vision ? "vision" : "text"];
|
|
51
|
+
process.stdout.write(`${model.provider}/${model.id}\t${model.name}\t${capabilities.join(",")}\tcontext=${model.contextWindow}\n`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=list-models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-models.js","sourceRoot":"","sources":["../../src/list-models.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export interface EmbeddedImage {
|
|
2
|
+
data: string;
|
|
3
|
+
mimeType: string;
|
|
4
|
+
}
|
|
5
|
+
export interface NormalizedTurn {
|
|
6
|
+
role: "user" | "assistant";
|
|
7
|
+
text: string;
|
|
8
|
+
images: EmbeddedImage[];
|
|
9
|
+
}
|
|
10
|
+
export interface NormalizedConversation {
|
|
11
|
+
requestedModel: string;
|
|
12
|
+
stream: boolean;
|
|
13
|
+
systemInstructions: string;
|
|
14
|
+
assistantPrefix: string | null;
|
|
15
|
+
stopSequences: string[];
|
|
16
|
+
maxOutputTokens: number | null;
|
|
17
|
+
history: NormalizedTurn[];
|
|
18
|
+
prompt: NormalizedTurn;
|
|
19
|
+
messageCount: number;
|
|
20
|
+
textCharacters: number;
|
|
21
|
+
}
|
|
22
|
+
export interface CompletionUsage {
|
|
23
|
+
input: number;
|
|
24
|
+
output: number;
|
|
25
|
+
total: number;
|
|
26
|
+
}
|
|
27
|
+
export interface CompletionResult {
|
|
28
|
+
text: string;
|
|
29
|
+
finishReason: "stop" | "length";
|
|
30
|
+
usage: CompletionUsage;
|
|
31
|
+
}
|
|
32
|
+
export interface CompletionProfile {
|
|
33
|
+
publicModelId: string;
|
|
34
|
+
thinkingLevel: string;
|
|
35
|
+
}
|
|
36
|
+
export interface CompletionRunner {
|
|
37
|
+
readonly provider: string;
|
|
38
|
+
readonly modelId: string;
|
|
39
|
+
readonly profiles: readonly CompletionProfile[];
|
|
40
|
+
complete(conversation: NormalizedConversation, onTextDelta: (delta: string) => void, signal: AbortSignal): Promise<CompletionResult>;
|
|
41
|
+
}
|
|
42
|
+
export declare class RequestError extends Error {
|
|
43
|
+
readonly status: number;
|
|
44
|
+
readonly code: string;
|
|
45
|
+
constructor(status: number, code: string, message: string);
|
|
46
|
+
}
|
|
47
|
+
export declare function normalizeChatRequest(body: unknown): NormalizedConversation;
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
export class RequestError extends Error {
|
|
2
|
+
status;
|
|
3
|
+
code;
|
|
4
|
+
constructor(status, code, message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = "RequestError";
|
|
7
|
+
this.status = status;
|
|
8
|
+
this.code = code;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
function isRecord(value) {
|
|
12
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
13
|
+
}
|
|
14
|
+
function parseDataImage(url) {
|
|
15
|
+
const match = /^data:(image\/(?:png|jpeg|webp|gif));base64,([A-Za-z0-9+/=\s]+)$/i.exec(url);
|
|
16
|
+
if (!match?.[1] || !match[2]) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
const encoded = match[2].replace(/\s/g, "");
|
|
20
|
+
if (encoded.length === 0 || encoded.length % 4 === 1) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
const decoded = Buffer.from(encoded, "base64");
|
|
24
|
+
if (decoded.length === 0 || decoded.length > 8 * 1024 * 1024) {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
data: decoded.toString("base64"),
|
|
29
|
+
mimeType: match[1].toLowerCase(),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function normalizeContent(content) {
|
|
33
|
+
if (typeof content === "string") {
|
|
34
|
+
return { text: content, images: [] };
|
|
35
|
+
}
|
|
36
|
+
if (content === null || content === undefined) {
|
|
37
|
+
return { text: "", images: [] };
|
|
38
|
+
}
|
|
39
|
+
if (!Array.isArray(content)) {
|
|
40
|
+
throw new RequestError(400, "invalid_messages", "Message content must be text or an array of content blocks");
|
|
41
|
+
}
|
|
42
|
+
const textParts = [];
|
|
43
|
+
const images = [];
|
|
44
|
+
for (const block of content) {
|
|
45
|
+
if (typeof block === "string") {
|
|
46
|
+
textParts.push(block);
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (!isRecord(block)) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const type = block.type;
|
|
53
|
+
if ((type === "text" || type === "input_text") && typeof block.text === "string") {
|
|
54
|
+
textParts.push(block.text);
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (type === "image_url" || type === "input_image") {
|
|
58
|
+
let url;
|
|
59
|
+
if (typeof block.image_url === "string") {
|
|
60
|
+
url = block.image_url;
|
|
61
|
+
}
|
|
62
|
+
else if (isRecord(block.image_url) && typeof block.image_url.url === "string") {
|
|
63
|
+
url = block.image_url.url;
|
|
64
|
+
}
|
|
65
|
+
else if (typeof block.image_url === "undefined" && typeof block.url === "string") {
|
|
66
|
+
url = block.url;
|
|
67
|
+
}
|
|
68
|
+
if (url) {
|
|
69
|
+
const image = parseDataImage(url);
|
|
70
|
+
if (image) {
|
|
71
|
+
images.push(image);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
textParts.push("[An image URL was supplied, but the local bridge only accepts embedded PNG, JPEG, WebP, or GIF data images.]");
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return { text: textParts.join("\n"), images };
|
|
80
|
+
}
|
|
81
|
+
function normalizeMaxOutputTokens(body) {
|
|
82
|
+
const value = body.max_completion_tokens ?? body.max_tokens;
|
|
83
|
+
if (value === undefined || value === null) {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
if (!Number.isInteger(value) || value < 1 || value > 1_000_000) {
|
|
87
|
+
throw new RequestError(400, "unsupported_parameter", "max_tokens must be a positive integer");
|
|
88
|
+
}
|
|
89
|
+
return value;
|
|
90
|
+
}
|
|
91
|
+
function normalizeStopSequences(value) {
|
|
92
|
+
if (value === undefined || value === null) {
|
|
93
|
+
return [];
|
|
94
|
+
}
|
|
95
|
+
const values = typeof value === "string" ? [value] : value;
|
|
96
|
+
if (!Array.isArray(values) || values.some((item) => typeof item !== "string")) {
|
|
97
|
+
throw new RequestError(400, "unsupported_parameter", "stop must be a string or an array of strings");
|
|
98
|
+
}
|
|
99
|
+
const stops = values.filter((item) => item.length > 0);
|
|
100
|
+
if (stops.length > 16 || stops.some((item) => item.length > 1000)) {
|
|
101
|
+
throw new RequestError(400, "unsupported_parameter", "Too many or excessively long stop sequences");
|
|
102
|
+
}
|
|
103
|
+
return stops;
|
|
104
|
+
}
|
|
105
|
+
export function normalizeChatRequest(body) {
|
|
106
|
+
if (!isRecord(body)) {
|
|
107
|
+
throw new RequestError(400, "invalid_request", "The request body must be a JSON object");
|
|
108
|
+
}
|
|
109
|
+
if (typeof body.model !== "string" || body.model.trim() === "") {
|
|
110
|
+
throw new RequestError(400, "invalid_model", "A model name is required");
|
|
111
|
+
}
|
|
112
|
+
if (!Array.isArray(body.messages) || body.messages.length === 0) {
|
|
113
|
+
throw new RequestError(400, "invalid_messages", "At least one message is required");
|
|
114
|
+
}
|
|
115
|
+
if (body.messages.length > 200) {
|
|
116
|
+
throw new RequestError(400, "invalid_messages", "Too many messages");
|
|
117
|
+
}
|
|
118
|
+
if (Array.isArray(body.tools) && body.tools.length > 0) {
|
|
119
|
+
throw new RequestError(400, "tools_disabled", "Tools are disabled for this bridge profile");
|
|
120
|
+
}
|
|
121
|
+
if (typeof body.n === "number" && body.n !== 1) {
|
|
122
|
+
throw new RequestError(400, "unsupported_parameter", "Only one completion is supported");
|
|
123
|
+
}
|
|
124
|
+
const parsed = body.messages.map((raw, index) => {
|
|
125
|
+
if (!isRecord(raw) || typeof raw.role !== "string") {
|
|
126
|
+
throw new RequestError(400, "invalid_messages", `Invalid message at index ${index}`);
|
|
127
|
+
}
|
|
128
|
+
const normalized = normalizeContent(raw.content);
|
|
129
|
+
return { role: raw.role, ...normalized };
|
|
130
|
+
});
|
|
131
|
+
let finalConversationIndex = -1;
|
|
132
|
+
for (let index = parsed.length - 1; index >= 0; index -= 1) {
|
|
133
|
+
const message = parsed[index];
|
|
134
|
+
if (message
|
|
135
|
+
&& (message.role === "user" || message.role === "assistant")
|
|
136
|
+
&& (message.text !== "" || message.images.length > 0)) {
|
|
137
|
+
finalConversationIndex = index;
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (finalConversationIndex < 0) {
|
|
142
|
+
throw new RequestError(400, "invalid_messages", "The conversation must contain a user message");
|
|
143
|
+
}
|
|
144
|
+
const finalConversationMessage = parsed[finalConversationIndex];
|
|
145
|
+
if (!finalConversationMessage) {
|
|
146
|
+
throw new RequestError(400, "invalid_messages", "The conversation is empty");
|
|
147
|
+
}
|
|
148
|
+
let lastUserIndex = finalConversationIndex;
|
|
149
|
+
let assistantPrefix = null;
|
|
150
|
+
if (finalConversationMessage.role === "assistant") {
|
|
151
|
+
assistantPrefix = finalConversationMessage.text;
|
|
152
|
+
for (let index = finalConversationIndex - 1; index >= 0; index -= 1) {
|
|
153
|
+
if (parsed[index]?.role === "user") {
|
|
154
|
+
lastUserIndex = index;
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (parsed[lastUserIndex]?.role !== "user") {
|
|
160
|
+
throw new RequestError(400, "invalid_messages", "The conversation must contain a user message");
|
|
161
|
+
}
|
|
162
|
+
const systemInstructions = parsed
|
|
163
|
+
.filter((message) => message.role === "system" || message.role === "developer")
|
|
164
|
+
.map((message) => message.text)
|
|
165
|
+
.filter(Boolean)
|
|
166
|
+
.join("\n\n");
|
|
167
|
+
const history = [];
|
|
168
|
+
for (const message of parsed.slice(0, lastUserIndex)) {
|
|
169
|
+
if (message.role !== "user" && message.role !== "assistant") {
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
if (message.text === "" && message.images.length === 0) {
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
history.push({
|
|
176
|
+
role: message.role,
|
|
177
|
+
text: message.text,
|
|
178
|
+
images: message.role === "user" ? message.images : [],
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
const latest = parsed[lastUserIndex];
|
|
182
|
+
if (!latest) {
|
|
183
|
+
throw new RequestError(400, "invalid_messages", "The conversation must contain a user message");
|
|
184
|
+
}
|
|
185
|
+
let promptText = latest.text || (latest.images.length > 0 ? "Please respond to the attached image." : "");
|
|
186
|
+
if (assistantPrefix !== null) {
|
|
187
|
+
promptText += `\n\n[Local bridge continuation instruction]\nThe assistant response has already begun with the exact prefix below. Continue it and return only the text that follows the prefix; do not repeat the prefix.\n\n${assistantPrefix}`;
|
|
188
|
+
}
|
|
189
|
+
const prompt = {
|
|
190
|
+
role: "user",
|
|
191
|
+
text: promptText,
|
|
192
|
+
images: latest.images,
|
|
193
|
+
};
|
|
194
|
+
if (prompt.text === "" && prompt.images.length === 0) {
|
|
195
|
+
throw new RequestError(400, "invalid_messages", "The final user message is empty");
|
|
196
|
+
}
|
|
197
|
+
return {
|
|
198
|
+
requestedModel: body.model,
|
|
199
|
+
stream: body.stream === true,
|
|
200
|
+
systemInstructions,
|
|
201
|
+
assistantPrefix,
|
|
202
|
+
stopSequences: normalizeStopSequences(body.stop),
|
|
203
|
+
maxOutputTokens: normalizeMaxOutputTokens(body),
|
|
204
|
+
history,
|
|
205
|
+
prompt,
|
|
206
|
+
messageCount: parsed.length,
|
|
207
|
+
textCharacters: parsed.reduce((total, message) => total + message.text.length, 0),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare function filterCompleteOutput(text: string, assistantPrefix: string | null, stopSequences: string[]): {
|
|
2
|
+
text: string;
|
|
3
|
+
stopped: boolean;
|
|
4
|
+
};
|
|
5
|
+
export declare class StreamingOutputFilter {
|
|
6
|
+
private readonly assistantPrefix;
|
|
7
|
+
private readonly stopSequences;
|
|
8
|
+
private readonly emit;
|
|
9
|
+
private undecidedPrefix;
|
|
10
|
+
private prefixDecided;
|
|
11
|
+
private pendingStop;
|
|
12
|
+
private stopped_;
|
|
13
|
+
private output_;
|
|
14
|
+
constructor(assistantPrefix: string | null, stopSequences: string[], emit: (text: string) => void);
|
|
15
|
+
get output(): string;
|
|
16
|
+
get stopped(): boolean;
|
|
17
|
+
push(delta: string): void;
|
|
18
|
+
finish(): void;
|
|
19
|
+
private pushAfterPrefix;
|
|
20
|
+
private emitText;
|
|
21
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
function firstStopIndex(text, stopSequences) {
|
|
2
|
+
let first = -1;
|
|
3
|
+
for (const stop of stopSequences) {
|
|
4
|
+
const index = text.indexOf(stop);
|
|
5
|
+
if (index >= 0 && (first < 0 || index < first)) {
|
|
6
|
+
first = index;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
return first;
|
|
10
|
+
}
|
|
11
|
+
function partialStopSuffixLength(text, stopSequences) {
|
|
12
|
+
let longest = 0;
|
|
13
|
+
for (const stop of stopSequences) {
|
|
14
|
+
const maximum = Math.min(text.length, stop.length - 1);
|
|
15
|
+
for (let length = maximum; length > longest; length -= 1) {
|
|
16
|
+
if (stop.startsWith(text.slice(-length))) {
|
|
17
|
+
longest = length;
|
|
18
|
+
break;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return longest;
|
|
23
|
+
}
|
|
24
|
+
export function filterCompleteOutput(text, assistantPrefix, stopSequences) {
|
|
25
|
+
let output = text;
|
|
26
|
+
if (assistantPrefix && output.startsWith(assistantPrefix)) {
|
|
27
|
+
output = output.slice(assistantPrefix.length);
|
|
28
|
+
}
|
|
29
|
+
const stopIndex = firstStopIndex(output, stopSequences);
|
|
30
|
+
if (stopIndex >= 0) {
|
|
31
|
+
return { text: output.slice(0, stopIndex), stopped: true };
|
|
32
|
+
}
|
|
33
|
+
return { text: output, stopped: false };
|
|
34
|
+
}
|
|
35
|
+
export class StreamingOutputFilter {
|
|
36
|
+
assistantPrefix;
|
|
37
|
+
stopSequences;
|
|
38
|
+
emit;
|
|
39
|
+
undecidedPrefix = "";
|
|
40
|
+
prefixDecided;
|
|
41
|
+
pendingStop = "";
|
|
42
|
+
stopped_ = false;
|
|
43
|
+
output_ = "";
|
|
44
|
+
constructor(assistantPrefix, stopSequences, emit) {
|
|
45
|
+
this.assistantPrefix = assistantPrefix;
|
|
46
|
+
this.stopSequences = stopSequences;
|
|
47
|
+
this.emit = emit;
|
|
48
|
+
this.prefixDecided = !assistantPrefix;
|
|
49
|
+
}
|
|
50
|
+
get output() {
|
|
51
|
+
return this.output_;
|
|
52
|
+
}
|
|
53
|
+
get stopped() {
|
|
54
|
+
return this.stopped_;
|
|
55
|
+
}
|
|
56
|
+
push(delta) {
|
|
57
|
+
if (delta === "" || this.stopped_) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (!this.prefixDecided && this.assistantPrefix) {
|
|
61
|
+
this.undecidedPrefix += delta;
|
|
62
|
+
if (this.assistantPrefix.startsWith(this.undecidedPrefix)) {
|
|
63
|
+
if (this.undecidedPrefix.length < this.assistantPrefix.length) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
this.undecidedPrefix = "";
|
|
67
|
+
this.prefixDecided = true;
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (this.undecidedPrefix.startsWith(this.assistantPrefix)) {
|
|
71
|
+
const remainder = this.undecidedPrefix.slice(this.assistantPrefix.length);
|
|
72
|
+
this.undecidedPrefix = "";
|
|
73
|
+
this.prefixDecided = true;
|
|
74
|
+
this.pushAfterPrefix(remainder);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const buffered = this.undecidedPrefix;
|
|
78
|
+
this.undecidedPrefix = "";
|
|
79
|
+
this.prefixDecided = true;
|
|
80
|
+
this.pushAfterPrefix(buffered);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
this.pushAfterPrefix(delta);
|
|
84
|
+
}
|
|
85
|
+
finish() {
|
|
86
|
+
if (this.stopped_) {
|
|
87
|
+
this.undecidedPrefix = "";
|
|
88
|
+
this.pendingStop = "";
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (!this.prefixDecided && this.undecidedPrefix !== "") {
|
|
92
|
+
// Do not discard an incomplete partial match.
|
|
93
|
+
this.pushAfterPrefix(this.undecidedPrefix);
|
|
94
|
+
this.undecidedPrefix = "";
|
|
95
|
+
this.prefixDecided = true;
|
|
96
|
+
}
|
|
97
|
+
if (this.pendingStop !== "") {
|
|
98
|
+
this.emitText(this.pendingStop);
|
|
99
|
+
this.pendingStop = "";
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
pushAfterPrefix(delta) {
|
|
103
|
+
if (delta === "" || this.stopped_) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
this.pendingStop += delta;
|
|
107
|
+
const stopIndex = firstStopIndex(this.pendingStop, this.stopSequences);
|
|
108
|
+
if (stopIndex >= 0) {
|
|
109
|
+
this.emitText(this.pendingStop.slice(0, stopIndex));
|
|
110
|
+
this.pendingStop = "";
|
|
111
|
+
this.stopped_ = true;
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const heldCharacters = partialStopSuffixLength(this.pendingStop, this.stopSequences);
|
|
115
|
+
const emitLength = this.pendingStop.length - heldCharacters;
|
|
116
|
+
if (emitLength > 0) {
|
|
117
|
+
this.emitText(this.pendingStop.slice(0, emitLength));
|
|
118
|
+
this.pendingStop = this.pendingStop.slice(emitLength);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
emitText(text) {
|
|
122
|
+
if (text === "") {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
this.output_ += text;
|
|
126
|
+
this.emit(text);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=output-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-filter.js","sourceRoot":"","sources":["../../src/output-filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { BridgeConfig } from "./config.js";
|
|
2
|
+
import type { CompletionResult, CompletionRunner, NormalizedConversation } from "./openai.js";
|
|
3
|
+
export declare class PiCompletionRunner implements CompletionRunner {
|
|
4
|
+
private readonly config;
|
|
5
|
+
private readonly modelRuntime;
|
|
6
|
+
private readonly model;
|
|
7
|
+
readonly provider: string;
|
|
8
|
+
readonly modelId: string;
|
|
9
|
+
readonly profiles: readonly {
|
|
10
|
+
publicModelId: string;
|
|
11
|
+
thinkingLevel: string;
|
|
12
|
+
}[];
|
|
13
|
+
private constructor();
|
|
14
|
+
static create(config: BridgeConfig): Promise<PiCompletionRunner>;
|
|
15
|
+
complete(conversation: NormalizedConversation, onTextDelta: (delta: string) => void, signal: AbortSignal): Promise<CompletionResult>;
|
|
16
|
+
}
|