@probeo/anymodel 0.1.0 → 0.3.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 -10
- package/dist/batch/index.d.ts +4 -0
- package/dist/batch/index.d.ts.map +1 -0
- package/dist/batch/index.js +3 -0
- package/dist/batch/index.js.map +1 -0
- package/dist/batch/manager.d.ts +72 -0
- package/dist/batch/manager.d.ts.map +1 -0
- package/dist/batch/manager.js +328 -0
- package/dist/batch/manager.js.map +1 -0
- package/dist/batch/store.d.ts +54 -0
- package/dist/batch/store.d.ts.map +1 -0
- package/dist/batch/store.js +109 -0
- package/dist/batch/store.js.map +1 -0
- package/dist/cli.cjs +112 -19
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +28 -1993
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +42 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +181 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +120 -0
- package/dist/config.js.map +1 -0
- package/dist/index.cjs +112 -19
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -0
- package/dist/index.d.ts +14 -538
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -1972
- package/dist/index.js.map +1 -1
- package/dist/providers/adapter.d.ts +33 -0
- package/dist/providers/adapter.d.ts.map +1 -0
- package/dist/providers/adapter.js +2 -0
- package/dist/providers/adapter.js.map +1 -0
- package/dist/providers/anthropic-batch.d.ts +3 -0
- package/dist/providers/anthropic-batch.d.ts.map +1 -0
- package/dist/providers/anthropic-batch.js +228 -0
- package/dist/providers/anthropic-batch.js.map +1 -0
- package/dist/providers/anthropic.d.ts +3 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +358 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/custom.d.ts +8 -0
- package/dist/providers/custom.d.ts.map +1 -0
- package/dist/providers/custom.js +61 -0
- package/dist/providers/custom.js.map +1 -0
- package/dist/providers/google.d.ts +3 -0
- package/dist/providers/google.d.ts.map +1 -0
- package/dist/providers/google.js +331 -0
- package/dist/providers/google.js.map +1 -0
- package/dist/providers/index.d.ts +6 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +5 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai-batch.d.ts +3 -0
- package/dist/providers/openai-batch.d.ts.map +1 -0
- package/dist/providers/openai-batch.js +208 -0
- package/dist/providers/openai-batch.js.map +1 -0
- package/dist/providers/openai.d.ts +3 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +221 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/registry.d.ts +10 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +27 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/router.d.ts +29 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +212 -0
- package/dist/router.js.map +1 -0
- package/dist/server.d.ts +10 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +149 -0
- package/dist/server.js.map +1 -0
- package/dist/types.d.ts +283 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +21 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/fs-io.d.ts +40 -0
- package/dist/utils/fs-io.d.ts.map +1 -0
- package/dist/utils/fs-io.js +203 -0
- package/dist/utils/fs-io.js.map +1 -0
- package/dist/utils/generation-stats.d.ts +25 -0
- package/dist/utils/generation-stats.d.ts.map +1 -0
- package/dist/utils/generation-stats.js +46 -0
- package/dist/utils/generation-stats.js.map +1 -0
- package/dist/utils/id.d.ts +2 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +6 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/model-parser.d.ts +6 -0
- package/dist/utils/model-parser.d.ts.map +1 -0
- package/dist/utils/model-parser.js +21 -0
- package/dist/utils/model-parser.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +36 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +80 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/retry.d.ts +7 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +54 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/transforms.d.ts +7 -0
- package/dist/utils/transforms.d.ts.map +1 -0
- package/dist/utils/transforms.js +66 -0
- package/dist/utils/transforms.js.map +1 -0
- package/dist/utils/validate.d.ts +3 -0
- package/dist/utils/validate.d.ts.map +1 -0
- package/dist/utils/validate.js +31 -0
- package/dist/utils/validate.js.map +1 -0
- package/package.json +9 -2
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Concurrency-limited filesystem helpers for high-volume file operations.
|
|
3
|
+
*
|
|
4
|
+
* Based on probeo-core/common/fs-io. Provides queued reads/writes,
|
|
5
|
+
* atomic durable writes, directory caching, and path memoization.
|
|
6
|
+
*/
|
|
7
|
+
import { mkdir, open, readFile as fsReadFile, rename, writeFile as fsWriteFile, readdir as fsReaddir, stat as fsStat } from 'node:fs/promises';
|
|
8
|
+
import { createWriteStream } from 'node:fs';
|
|
9
|
+
import path from 'node:path';
|
|
10
|
+
import PQueue from 'p-queue';
|
|
11
|
+
// Concurrency-limited queues to prevent resource exhaustion.
|
|
12
|
+
const writeQueue = new PQueue({ concurrency: 10 });
|
|
13
|
+
const readQueue = new PQueue({ concurrency: 20 });
|
|
14
|
+
// In-memory cache of directories we've already ensured exist.
|
|
15
|
+
const ensuredDirs = new Set();
|
|
16
|
+
// Memoization caches for path operations.
|
|
17
|
+
const joinPathCache = new Map();
|
|
18
|
+
const dirnameCache = new Map();
|
|
19
|
+
const resolvePathCache = new Map();
|
|
20
|
+
// ─── Directory Operations ───────────────────────────────────────────────────
|
|
21
|
+
export async function ensureDir(dir) {
|
|
22
|
+
if (!dir)
|
|
23
|
+
return;
|
|
24
|
+
if (ensuredDirs.has(dir))
|
|
25
|
+
return;
|
|
26
|
+
await mkdir(dir, { recursive: true });
|
|
27
|
+
ensuredDirs.add(dir);
|
|
28
|
+
}
|
|
29
|
+
// ─── Queued Read Operations ─────────────────────────────────────────────────
|
|
30
|
+
export async function readFileQueued(filePath, encoding = 'utf8') {
|
|
31
|
+
return readQueue.add(async () => {
|
|
32
|
+
return fsReadFile(filePath, encoding);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
export async function readJsonQueued(filePath) {
|
|
36
|
+
const raw = (await readFileQueued(filePath, 'utf8'));
|
|
37
|
+
return JSON.parse(raw);
|
|
38
|
+
}
|
|
39
|
+
export async function readDirQueued(dirPath) {
|
|
40
|
+
return readQueue.add(async () => {
|
|
41
|
+
return fsReaddir(dirPath, { withFileTypes: true });
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
export async function statQueued(filePath) {
|
|
45
|
+
return readQueue.add(async () => {
|
|
46
|
+
return fsStat(filePath);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
export async function pathExistsQueued(p) {
|
|
50
|
+
return readQueue.add(async () => {
|
|
51
|
+
try {
|
|
52
|
+
await fsStat(p);
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
export async function fileExistsQueued(filePath) {
|
|
61
|
+
return readQueue.add(async () => {
|
|
62
|
+
try {
|
|
63
|
+
const s = await fsStat(filePath);
|
|
64
|
+
return s.isFile();
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
// ─── Queued Write Operations ────────────────────────────────────────────────
|
|
72
|
+
export async function writeFileQueued(filePath, data) {
|
|
73
|
+
await writeQueue.add(async () => {
|
|
74
|
+
const dir = dirnameOf(filePath);
|
|
75
|
+
await ensureDir(dir);
|
|
76
|
+
await fsWriteFile(filePath, data);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
export async function appendFileQueued(filePath, data) {
|
|
80
|
+
await writeQueue.add(async () => {
|
|
81
|
+
const dir = dirnameOf(filePath);
|
|
82
|
+
await ensureDir(dir);
|
|
83
|
+
await fsWriteFile(filePath, data, { flag: 'a' });
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Atomically write a file with fsync to ensure data hits disk.
|
|
88
|
+
* Uses temp file + rename + directory fsync.
|
|
89
|
+
*/
|
|
90
|
+
export async function writeFileFlushedQueued(filePath, data) {
|
|
91
|
+
await writeQueue.add(async () => {
|
|
92
|
+
const dir = dirnameOf(filePath);
|
|
93
|
+
await ensureDir(dir);
|
|
94
|
+
const tmpPath = joinPath(dir, `.${path.basename(filePath)}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);
|
|
95
|
+
const fh = await open(tmpPath, 'w');
|
|
96
|
+
try {
|
|
97
|
+
await fh.writeFile(data);
|
|
98
|
+
await fh.sync();
|
|
99
|
+
}
|
|
100
|
+
finally {
|
|
101
|
+
await fh.close();
|
|
102
|
+
}
|
|
103
|
+
await rename(tmpPath, filePath);
|
|
104
|
+
try {
|
|
105
|
+
const dh = await open(dir, 'r');
|
|
106
|
+
try {
|
|
107
|
+
await dh.sync();
|
|
108
|
+
}
|
|
109
|
+
finally {
|
|
110
|
+
await dh.close();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// ignore directory fsync errors
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Streamed write with durability: temp file → stream → fsync → atomic rename.
|
|
120
|
+
*/
|
|
121
|
+
export async function writeStreamFlushedQueued(filePath, producer) {
|
|
122
|
+
await writeQueue.add(async () => {
|
|
123
|
+
const dir = dirnameOf(filePath);
|
|
124
|
+
await ensureDir(dir);
|
|
125
|
+
const tmpPath = joinPath(dir, `.${path.basename(filePath)}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);
|
|
126
|
+
const ws = createWriteStream(tmpPath);
|
|
127
|
+
await new Promise((resolve, reject) => {
|
|
128
|
+
let settled = false;
|
|
129
|
+
const onError = (err) => { if (settled)
|
|
130
|
+
return; settled = true; reject(err); };
|
|
131
|
+
const onFinish = () => { if (settled)
|
|
132
|
+
return; settled = true; resolve(); };
|
|
133
|
+
ws.once('error', onError);
|
|
134
|
+
ws.once('finish', onFinish);
|
|
135
|
+
Promise.resolve()
|
|
136
|
+
.then(async () => {
|
|
137
|
+
await producer(ws);
|
|
138
|
+
if (!ws.destroyed && !ws.writableEnded) {
|
|
139
|
+
ws.end();
|
|
140
|
+
}
|
|
141
|
+
})
|
|
142
|
+
.catch(onError);
|
|
143
|
+
});
|
|
144
|
+
const fh = await open(tmpPath, 'r+');
|
|
145
|
+
try {
|
|
146
|
+
await fh.sync();
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
await fh.close();
|
|
150
|
+
}
|
|
151
|
+
await rename(tmpPath, filePath);
|
|
152
|
+
try {
|
|
153
|
+
const dh = await open(dir, 'r');
|
|
154
|
+
try {
|
|
155
|
+
await dh.sync();
|
|
156
|
+
}
|
|
157
|
+
finally {
|
|
158
|
+
await dh.close();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
// ignore directory fsync errors
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
// ─── Path Utilities (Memoized) ──────────────────────────────────────────────
|
|
167
|
+
export function joinPath(...segments) {
|
|
168
|
+
const key = segments.join('\u0000');
|
|
169
|
+
const cached = joinPathCache.get(key);
|
|
170
|
+
if (cached !== undefined)
|
|
171
|
+
return cached;
|
|
172
|
+
const out = path.join(...segments);
|
|
173
|
+
joinPathCache.set(key, out);
|
|
174
|
+
return out;
|
|
175
|
+
}
|
|
176
|
+
export function dirnameOf(p) {
|
|
177
|
+
const cached = dirnameCache.get(p);
|
|
178
|
+
if (cached !== undefined)
|
|
179
|
+
return cached;
|
|
180
|
+
const out = path.dirname(p);
|
|
181
|
+
dirnameCache.set(p, out);
|
|
182
|
+
return out;
|
|
183
|
+
}
|
|
184
|
+
export function resolvePath(...segments) {
|
|
185
|
+
const key = segments.join('\u0000');
|
|
186
|
+
const cached = resolvePathCache.get(key);
|
|
187
|
+
if (cached !== undefined)
|
|
188
|
+
return cached;
|
|
189
|
+
const out = path.resolve(...segments);
|
|
190
|
+
resolvePathCache.set(key, out);
|
|
191
|
+
return out;
|
|
192
|
+
}
|
|
193
|
+
// ─── Queue Status ───────────────────────────────────────────────────────────
|
|
194
|
+
export function getFsQueueStatus() {
|
|
195
|
+
return {
|
|
196
|
+
read: { size: readQueue.size, pending: readQueue.pending },
|
|
197
|
+
write: { size: writeQueue.size, pending: writeQueue.pending },
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
export async function waitForFsQueuesIdle() {
|
|
201
|
+
await Promise.all([writeQueue.onIdle(), readQueue.onIdle()]);
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=fs-io.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-io.js","sourceRoot":"","sources":["../../src/utils/fs-io.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { GenerationStats, FinishReason } from '../types.js';
|
|
2
|
+
export interface GenerationRecord {
|
|
3
|
+
id: string;
|
|
4
|
+
model: string;
|
|
5
|
+
providerName: string;
|
|
6
|
+
promptTokens: number;
|
|
7
|
+
completionTokens: number;
|
|
8
|
+
startTime: number;
|
|
9
|
+
endTime: number;
|
|
10
|
+
finishReason: FinishReason;
|
|
11
|
+
streamed: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* In-memory generation stats store.
|
|
15
|
+
* Tracks recent completions for the generation stats endpoint.
|
|
16
|
+
*/
|
|
17
|
+
export declare class GenerationStatsStore {
|
|
18
|
+
private records;
|
|
19
|
+
private maxRecords;
|
|
20
|
+
constructor(maxRecords?: number);
|
|
21
|
+
record(entry: GenerationRecord): void;
|
|
22
|
+
get(id: string): GenerationStats | undefined;
|
|
23
|
+
list(limit?: number): GenerationStats[];
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=generation-stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generation-stats.d.ts","sourceRoot":"","sources":["../../src/utils/generation-stats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEjE,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,SAAO;IAI7B,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI;IASrC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAoB5C,IAAI,CAAC,KAAK,SAAK,GAAG,eAAe,EAAE;CAOpC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory generation stats store.
|
|
3
|
+
* Tracks recent completions for the generation stats endpoint.
|
|
4
|
+
*/
|
|
5
|
+
export class GenerationStatsStore {
|
|
6
|
+
records = new Map();
|
|
7
|
+
maxRecords;
|
|
8
|
+
constructor(maxRecords = 1000) {
|
|
9
|
+
this.maxRecords = maxRecords;
|
|
10
|
+
}
|
|
11
|
+
record(entry) {
|
|
12
|
+
// Evict oldest if at capacity
|
|
13
|
+
if (this.records.size >= this.maxRecords) {
|
|
14
|
+
const oldest = this.records.keys().next().value;
|
|
15
|
+
if (oldest)
|
|
16
|
+
this.records.delete(oldest);
|
|
17
|
+
}
|
|
18
|
+
this.records.set(entry.id, entry);
|
|
19
|
+
}
|
|
20
|
+
get(id) {
|
|
21
|
+
const rec = this.records.get(id);
|
|
22
|
+
if (!rec)
|
|
23
|
+
return undefined;
|
|
24
|
+
const latency = rec.endTime - rec.startTime;
|
|
25
|
+
return {
|
|
26
|
+
id: rec.id,
|
|
27
|
+
model: rec.model,
|
|
28
|
+
provider_name: rec.providerName,
|
|
29
|
+
total_cost: 0, // Cost calculation requires pricing data
|
|
30
|
+
tokens_prompt: rec.promptTokens,
|
|
31
|
+
tokens_completion: rec.completionTokens,
|
|
32
|
+
latency,
|
|
33
|
+
generation_time: latency,
|
|
34
|
+
created_at: new Date(rec.startTime).toISOString(),
|
|
35
|
+
finish_reason: rec.finishReason,
|
|
36
|
+
streamed: rec.streamed,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
list(limit = 50) {
|
|
40
|
+
const entries = Array.from(this.records.values())
|
|
41
|
+
.slice(-limit)
|
|
42
|
+
.reverse();
|
|
43
|
+
return entries.map(rec => this.get(rec.id));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=generation-stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generation-stats.js","sourceRoot":"","sources":["../../src/utils/generation-stats.ts"],"names":[],"mappings":"AAcA;;;GAGG;AACH,MAAM,OAAO,oBAAoB;IACvB,OAAO,GAAG,IAAI,GAAG,EAA4B,CAAC;IAC9C,UAAU,CAAS;IAE3B,YAAY,UAAU,GAAG,IAAI;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,KAAuB;QAC5B,8BAA8B;QAC9B,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAChD,IAAI,MAAM;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAC;QAE3B,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC;QAC5C,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,aAAa,EAAE,GAAG,CAAC,YAAY;YAC/B,UAAU,EAAE,CAAC,EAAE,yCAAyC;YACxD,aAAa,EAAE,GAAG,CAAC,YAAY;YAC/B,iBAAiB,EAAE,GAAG,CAAC,gBAAgB;YACvC,OAAO;YACP,eAAe,EAAE,OAAO;YACxB,UAAU,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;YACjD,aAAa,EAAE,GAAG,CAAC,YAAY;YAC/B,QAAQ,EAAE,GAAG,CAAC,QAAQ;SACvB,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,KAAK,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;aAC9C,KAAK,CAAC,CAAC,KAAK,CAAC;aACb,OAAO,EAAE,CAAC;QAEb,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,CAAC;IAC/C,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAC,MAAM,GAAE,MAAc,GAAG,MAAM,CAGzD"}
|
package/dist/utils/id.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id.js","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,UAAU,UAAU,CAAC,SAAiB,KAAK;IAC/C,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACrD,OAAO,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-parser.d.ts","sourceRoot":"","sources":["../../src/utils/model-parser.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,WAAW,CAyB7F"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { AnyModelError } from '../types.js';
|
|
2
|
+
export function parseModelString(model, aliases) {
|
|
3
|
+
// Check aliases first
|
|
4
|
+
if (aliases && model in aliases) {
|
|
5
|
+
model = aliases[model];
|
|
6
|
+
}
|
|
7
|
+
const slashIndex = model.indexOf('/');
|
|
8
|
+
if (slashIndex === -1) {
|
|
9
|
+
throw new AnyModelError(400, `Model must be in provider/model format or be a valid alias. Got: '${model}'`);
|
|
10
|
+
}
|
|
11
|
+
const provider = model.substring(0, slashIndex);
|
|
12
|
+
const modelId = model.substring(slashIndex + 1);
|
|
13
|
+
if (!provider) {
|
|
14
|
+
throw new AnyModelError(400, `Invalid model string: missing provider in '${model}'`);
|
|
15
|
+
}
|
|
16
|
+
if (!modelId) {
|
|
17
|
+
throw new AnyModelError(400, `Invalid model string: missing model ID in '${model}'`);
|
|
18
|
+
}
|
|
19
|
+
return { provider, model: modelId };
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=model-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-parser.js","sourceRoot":"","sources":["../../src/utils/model-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAO5C,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,OAAgC;IAC9E,sBAAsB;IACtB,IAAI,OAAO,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC;QAChC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,aAAa,CACrB,GAAG,EACH,qEAAqE,KAAK,GAAG,CAC9E,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IAEhD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,aAAa,CAAC,GAAG,EAAE,8CAA8C,KAAK,GAAG,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,aAAa,CAAC,GAAG,EAAE,8CAA8C,KAAK,GAAG,CAAC,CAAC;IACvF,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-provider rate limit tracker.
|
|
3
|
+
* Tracks rate limit state from provider response headers and 429 errors.
|
|
4
|
+
*/
|
|
5
|
+
export interface RateLimitState {
|
|
6
|
+
provider: string;
|
|
7
|
+
remaining: number | null;
|
|
8
|
+
resetAt: number | null;
|
|
9
|
+
retryAfter: number | null;
|
|
10
|
+
lastUpdated: number;
|
|
11
|
+
}
|
|
12
|
+
export declare class RateLimitTracker {
|
|
13
|
+
private state;
|
|
14
|
+
/**
|
|
15
|
+
* Update rate limit state from response headers.
|
|
16
|
+
*/
|
|
17
|
+
updateFromHeaders(provider: string, headers: Record<string, string>): void;
|
|
18
|
+
/**
|
|
19
|
+
* Record a 429 for a provider.
|
|
20
|
+
*/
|
|
21
|
+
recordRateLimit(provider: string, retryAfterMs?: number): void;
|
|
22
|
+
/**
|
|
23
|
+
* Check if a provider is currently rate-limited.
|
|
24
|
+
*/
|
|
25
|
+
isRateLimited(provider: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Get ms until rate limit resets for a provider.
|
|
28
|
+
*/
|
|
29
|
+
getWaitTime(provider: string): number;
|
|
30
|
+
/**
|
|
31
|
+
* Get state for a provider.
|
|
32
|
+
*/
|
|
33
|
+
getState(provider: string): RateLimitState | undefined;
|
|
34
|
+
private getOrCreate;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=rate-limiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAqC;IAElD;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAuB1E;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAU9D;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAYxC;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAQrC;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAItD,OAAO,CAAC,WAAW;CAcpB"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
export class RateLimitTracker {
|
|
2
|
+
state = new Map();
|
|
3
|
+
/**
|
|
4
|
+
* Update rate limit state from response headers.
|
|
5
|
+
*/
|
|
6
|
+
updateFromHeaders(provider, headers) {
|
|
7
|
+
const state = this.getOrCreate(provider);
|
|
8
|
+
const remaining = headers['x-ratelimit-remaining'] || headers['x-ratelimit-remaining-requests'];
|
|
9
|
+
if (remaining !== undefined) {
|
|
10
|
+
state.remaining = parseInt(remaining, 10);
|
|
11
|
+
}
|
|
12
|
+
const reset = headers['x-ratelimit-reset'] || headers['x-ratelimit-reset-requests'];
|
|
13
|
+
if (reset !== undefined) {
|
|
14
|
+
// Could be epoch seconds or ISO date
|
|
15
|
+
const parsed = Number(reset);
|
|
16
|
+
state.resetAt = parsed > 1e12 ? parsed : parsed * 1000;
|
|
17
|
+
}
|
|
18
|
+
const retryAfter = headers['retry-after'];
|
|
19
|
+
if (retryAfter !== undefined) {
|
|
20
|
+
state.retryAfter = Number(retryAfter) * 1000;
|
|
21
|
+
}
|
|
22
|
+
state.lastUpdated = Date.now();
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Record a 429 for a provider.
|
|
26
|
+
*/
|
|
27
|
+
recordRateLimit(provider, retryAfterMs) {
|
|
28
|
+
const state = this.getOrCreate(provider);
|
|
29
|
+
state.remaining = 0;
|
|
30
|
+
if (retryAfterMs) {
|
|
31
|
+
state.retryAfter = retryAfterMs;
|
|
32
|
+
state.resetAt = Date.now() + retryAfterMs;
|
|
33
|
+
}
|
|
34
|
+
state.lastUpdated = Date.now();
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check if a provider is currently rate-limited.
|
|
38
|
+
*/
|
|
39
|
+
isRateLimited(provider) {
|
|
40
|
+
const state = this.state.get(provider);
|
|
41
|
+
if (!state)
|
|
42
|
+
return false;
|
|
43
|
+
// Check remaining count
|
|
44
|
+
if (state.remaining === 0 && state.resetAt) {
|
|
45
|
+
return Date.now() < state.resetAt;
|
|
46
|
+
}
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get ms until rate limit resets for a provider.
|
|
51
|
+
*/
|
|
52
|
+
getWaitTime(provider) {
|
|
53
|
+
const state = this.state.get(provider);
|
|
54
|
+
if (!state?.resetAt)
|
|
55
|
+
return 0;
|
|
56
|
+
const wait = state.resetAt - Date.now();
|
|
57
|
+
return Math.max(0, wait);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get state for a provider.
|
|
61
|
+
*/
|
|
62
|
+
getState(provider) {
|
|
63
|
+
return this.state.get(provider);
|
|
64
|
+
}
|
|
65
|
+
getOrCreate(provider) {
|
|
66
|
+
let state = this.state.get(provider);
|
|
67
|
+
if (!state) {
|
|
68
|
+
state = {
|
|
69
|
+
provider,
|
|
70
|
+
remaining: null,
|
|
71
|
+
resetAt: null,
|
|
72
|
+
retryAfter: null,
|
|
73
|
+
lastUpdated: Date.now(),
|
|
74
|
+
};
|
|
75
|
+
this.state.set(provider, state);
|
|
76
|
+
}
|
|
77
|
+
return state;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=rate-limiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAuCD,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,OAAO,CAAC,YAAY,CAAM,GAClC,OAAO,CAAC,CAAC,CAAC,CAoBZ"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { AnyModelError } from '../types.js';
|
|
2
|
+
const DEFAULT_RETRY = {
|
|
3
|
+
maxRetries: 2,
|
|
4
|
+
baseDelay: 500,
|
|
5
|
+
maxDelay: 10000,
|
|
6
|
+
};
|
|
7
|
+
// Retryable status codes
|
|
8
|
+
const RETRYABLE_CODES = new Set([429, 502, 503, 529]);
|
|
9
|
+
function isRetryable(error) {
|
|
10
|
+
if (error instanceof AnyModelError) {
|
|
11
|
+
return RETRYABLE_CODES.has(error.code);
|
|
12
|
+
}
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
function getRetryAfter(error) {
|
|
16
|
+
if (error instanceof AnyModelError && error.metadata.raw) {
|
|
17
|
+
const raw = error.metadata.raw;
|
|
18
|
+
// Check for retry-after header value stored in metadata
|
|
19
|
+
if (raw?.retry_after)
|
|
20
|
+
return Number(raw.retry_after) * 1000;
|
|
21
|
+
if (raw?.headers?.['retry-after'])
|
|
22
|
+
return Number(raw.headers['retry-after']) * 1000;
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
function computeDelay(attempt, options, error) {
|
|
27
|
+
const retryAfter = getRetryAfter(error);
|
|
28
|
+
if (retryAfter && retryAfter > 0) {
|
|
29
|
+
return Math.min(retryAfter, options.maxDelay);
|
|
30
|
+
}
|
|
31
|
+
// Exponential backoff with jitter
|
|
32
|
+
const exponential = options.baseDelay * Math.pow(2, attempt);
|
|
33
|
+
const jitter = exponential * 0.2 * Math.random();
|
|
34
|
+
return Math.min(exponential + jitter, options.maxDelay);
|
|
35
|
+
}
|
|
36
|
+
export async function withRetry(fn, options = {}) {
|
|
37
|
+
const opts = { ...DEFAULT_RETRY, ...options };
|
|
38
|
+
let lastError;
|
|
39
|
+
for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {
|
|
40
|
+
try {
|
|
41
|
+
return await fn();
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
lastError = error;
|
|
45
|
+
if (attempt >= opts.maxRetries || !isRetryable(error)) {
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
const delay = computeDelay(attempt, opts, error);
|
|
49
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
throw lastError;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAQ5C,MAAM,aAAa,GAAiB;IAClC,UAAU,EAAE,CAAC;IACb,SAAS,EAAE,GAAG;IACd,QAAQ,EAAE,KAAK;CAChB,CAAC;AAEF,yBAAyB;AACzB,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAEtD,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;QACnC,OAAO,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,KAAK,YAAY,aAAa,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;QACzD,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAU,CAAC;QACtC,wDAAwD;QACxD,IAAI,GAAG,EAAE,WAAW;YAAE,OAAO,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;QAC5D,IAAI,GAAG,EAAE,OAAO,EAAE,CAAC,aAAa,CAAC;YAAE,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC;IACtF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,OAAe,EAAE,OAAqB,EAAE,KAAc;IAC1E,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,UAAU,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IACD,kCAAkC;IAClC,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,WAAW,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IACjD,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,EAAoB,EACpB,UAAiC,EAAE;IAEnC,MAAM,IAAI,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IAC9C,IAAI,SAAkB,CAAC;IAEvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QAC5D,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,CAAC;YAElB,IAAI,OAAO,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtD,MAAM,KAAK,CAAC;YACd,CAAC;YAED,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YACjD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Message } from '../types.js';
|
|
2
|
+
export declare function middleOut(messages: Message[], maxTokens: number): Message[];
|
|
3
|
+
/**
|
|
4
|
+
* Apply a named transform to the request messages.
|
|
5
|
+
*/
|
|
6
|
+
export declare function applyTransform(name: string, messages: Message[], contextLength: number): Message[];
|
|
7
|
+
//# sourceMappingURL=transforms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transforms.d.ts","sourceRoot":"","sources":["../../src/utils/transforms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAW3C,wBAAgB,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE,CAoD3E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,EAAE,EACnB,aAAa,EAAE,MAAM,GACpB,OAAO,EAAE,CAKX"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Middle-out transform: when messages exceed a token budget,
|
|
3
|
+
* remove messages from the middle of the conversation, preserving
|
|
4
|
+
* the system prompt (first) and most recent messages (last).
|
|
5
|
+
*
|
|
6
|
+
* This is a character-based approximation (4 chars ≈ 1 token).
|
|
7
|
+
*/
|
|
8
|
+
const CHARS_PER_TOKEN = 4;
|
|
9
|
+
export function middleOut(messages, maxTokens) {
|
|
10
|
+
if (messages.length <= 2)
|
|
11
|
+
return messages;
|
|
12
|
+
const maxChars = maxTokens * CHARS_PER_TOKEN;
|
|
13
|
+
// Calculate total content length
|
|
14
|
+
function messageLength(msg) {
|
|
15
|
+
const content = typeof msg.content === 'string'
|
|
16
|
+
? msg.content
|
|
17
|
+
: JSON.stringify(msg.content);
|
|
18
|
+
return content.length + 20; // overhead for role, etc.
|
|
19
|
+
}
|
|
20
|
+
const totalChars = messages.reduce((sum, m) => sum + messageLength(m), 0);
|
|
21
|
+
if (totalChars <= maxChars)
|
|
22
|
+
return messages;
|
|
23
|
+
// Separate system messages from conversation
|
|
24
|
+
const systemMessages = messages.filter(m => m.role === 'system');
|
|
25
|
+
const conversationMessages = messages.filter(m => m.role !== 'system');
|
|
26
|
+
if (conversationMessages.length <= 2)
|
|
27
|
+
return messages;
|
|
28
|
+
const systemChars = systemMessages.reduce((sum, m) => sum + messageLength(m), 0);
|
|
29
|
+
const budgetForConversation = maxChars - systemChars;
|
|
30
|
+
if (budgetForConversation <= 0)
|
|
31
|
+
return [...systemMessages, conversationMessages[conversationMessages.length - 1]];
|
|
32
|
+
// Keep messages from both ends, removing from the middle
|
|
33
|
+
const kept = [];
|
|
34
|
+
let usedChars = 0;
|
|
35
|
+
// Always keep the last few messages (recency is most important)
|
|
36
|
+
const tail = [];
|
|
37
|
+
let tailChars = 0;
|
|
38
|
+
for (let i = conversationMessages.length - 1; i >= 0; i--) {
|
|
39
|
+
const len = messageLength(conversationMessages[i]);
|
|
40
|
+
if (tailChars + len > budgetForConversation * 0.7)
|
|
41
|
+
break;
|
|
42
|
+
tail.unshift(conversationMessages[i]);
|
|
43
|
+
tailChars += len;
|
|
44
|
+
}
|
|
45
|
+
// Fill from the head with remaining budget
|
|
46
|
+
const headBudget = budgetForConversation - tailChars;
|
|
47
|
+
const headEnd = conversationMessages.length - tail.length;
|
|
48
|
+
for (let i = 0; i < headEnd; i++) {
|
|
49
|
+
const len = messageLength(conversationMessages[i]);
|
|
50
|
+
if (usedChars + len > headBudget)
|
|
51
|
+
break;
|
|
52
|
+
kept.push(conversationMessages[i]);
|
|
53
|
+
usedChars += len;
|
|
54
|
+
}
|
|
55
|
+
return [...systemMessages, ...kept, ...tail];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Apply a named transform to the request messages.
|
|
59
|
+
*/
|
|
60
|
+
export function applyTransform(name, messages, contextLength) {
|
|
61
|
+
if (name === 'middle-out') {
|
|
62
|
+
return middleOut(messages, contextLength);
|
|
63
|
+
}
|
|
64
|
+
return messages;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=transforms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transforms.js","sourceRoot":"","sources":["../../src/utils/transforms.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/utils/validate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD,wBAAgB,eAAe,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAmCpE"}
|