@seanhogg/builderforce-memory 2026.9.30 → 2026.9.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bridges/FetchBridge.d.ts +12 -5
- package/dist/bridges/FetchBridge.d.ts.map +1 -1
- package/dist/bridges/FetchBridge.js +6 -4
- package/dist/bridges/FetchBridge.js.map +1 -1
- package/dist/bridges/OpenAIBridge.d.ts +17 -4
- package/dist/bridges/OpenAIBridge.d.ts.map +1 -1
- package/dist/bridges/OpenAIBridge.js +68 -57
- package/dist/bridges/OpenAIBridge.js.map +1 -1
- package/dist/bridges/TransformerBridge.d.ts +6 -0
- package/dist/bridges/TransformerBridge.d.ts.map +1 -1
- package/dist/evermind/index.d.ts +6 -0
- package/dist/evermind/index.d.ts.map +1 -1
- package/dist/evermind/index.js +5 -0
- package/dist/evermind/index.js.map +1 -1
- package/dist/evermind/runtime.d.ts +158 -0
- package/dist/evermind/runtime.d.ts.map +1 -0
- package/dist/evermind/runtime.js +236 -0
- package/dist/evermind/runtime.js.map +1 -0
- package/dist/evermind/textCoherence.d.ts +55 -0
- package/dist/evermind/textCoherence.d.ts.map +1 -0
- package/dist/evermind/textCoherence.js +218 -0
- package/dist/evermind/textCoherence.js.map +1 -0
- package/dist/evermind/toolCall.d.ts +175 -0
- package/dist/evermind/toolCall.d.ts.map +1 -0
- package/dist/evermind/toolCall.js +398 -0
- package/dist/evermind/toolCall.js.map +1 -0
- package/dist/evermind/wordLexicon.d.ts +103 -0
- package/dist/evermind/wordLexicon.d.ts.map +1 -0
- package/dist/evermind/wordLexicon.js +361 -0
- package/dist/evermind/wordLexicon.js.map +1 -0
- package/dist/wire/chatClient.d.ts +100 -0
- package/dist/wire/chatClient.d.ts.map +1 -0
- package/dist/wire/chatClient.js +123 -0
- package/dist/wire/chatClient.js.map +1 -0
- package/dist/wire/index.d.ts +3 -1
- package/dist/wire/index.d.ts.map +1 -1
- package/dist/wire/index.js +2 -1
- package/dist/wire/index.js.map +1 -1
- package/dist/wire/sse.d.ts +17 -9
- package/dist/wire/sse.d.ts.map +1 -1
- package/dist/wire/sse.js +45 -22
- package/dist/wire/sse.js.map +1 -1
- package/package.json +3 -3
- package/src/bridges/FetchBridge.ts +15 -6
- package/src/bridges/OpenAIBridge.ts +82 -72
- package/src/bridges/TransformerBridge.ts +6 -0
- package/src/evermind/index.ts +48 -0
- package/src/evermind/runtime.ts +364 -0
- package/src/evermind/textCoherence.ts +248 -0
- package/src/evermind/toolCall.ts +523 -0
- package/src/evermind/wordLexicon.ts +395 -0
- package/src/wire/chatClient.ts +196 -0
- package/src/wire/index.ts +3 -1
- package/src/wire/sse.ts +43 -21
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* FetchBridge – generic OpenAI-compatible bridge for local or hosted endpoints.
|
|
3
3
|
*
|
|
4
|
-
* Works with Ollama, LM Studio, vLLM, llama.cpp server, or any
|
|
5
|
-
* exposes a /chat/completions endpoint compatible with the OpenAI
|
|
6
|
-
* and response schema.
|
|
4
|
+
* Works with Ollama, LM Studio, vLLM, llama.cpp server, a routing gateway, or any
|
|
5
|
+
* service that exposes a /chat/completions endpoint compatible with the OpenAI
|
|
6
|
+
* request and response schema.
|
|
7
7
|
*/
|
|
8
8
|
import { OpenAIBridge } from './OpenAIBridge.js';
|
|
9
9
|
import type { BridgeGenerateOptions } from './TransformerBridge.js';
|
|
@@ -12,12 +12,19 @@ export interface FetchBridgeOptions {
|
|
|
12
12
|
baseUrl: string;
|
|
13
13
|
/** API key — many local servers require any non-empty string. Default: 'local'. */
|
|
14
14
|
apiKey?: string;
|
|
15
|
-
/** Model name understood by the server. Default: 'default'. */
|
|
15
|
+
/** Model name understood by the server. Default: 'default' (none with `serverDefaults`). */
|
|
16
16
|
model?: string;
|
|
17
17
|
/** Default system prompt. */
|
|
18
18
|
systemPrompt?: string;
|
|
19
|
-
/** Default max tokens. Default: 512. */
|
|
19
|
+
/** Default max tokens. Default: 512 (none with `serverDefaults`). */
|
|
20
20
|
maxTokens?: number;
|
|
21
|
+
/**
|
|
22
|
+
* Send only what a call states, so a routing gateway picks the model and the
|
|
23
|
+
* sampling settings. Default false.
|
|
24
|
+
*/
|
|
25
|
+
serverDefaults?: boolean;
|
|
26
|
+
/** Abort a request after this long. */
|
|
27
|
+
timeoutMs?: number;
|
|
21
28
|
}
|
|
22
29
|
/**
|
|
23
30
|
* FetchBridge is a thin re-configuration of OpenAIBridge pointed at a custom
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FetchBridge.d.ts","sourceRoot":"","sources":["../../src/bridges/FetchBridge.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEpE,MAAM,WAAW,kBAAkB;IAC/B,iFAAiF;IACjF,OAAO,EAAS,MAAM,CAAC;IACvB,mFAAmF;IACnF,MAAM,CAAC,EAAS,MAAM,CAAC;IACvB
|
|
1
|
+
{"version":3,"file":"FetchBridge.d.ts","sourceRoot":"","sources":["../../src/bridges/FetchBridge.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEpE,MAAM,WAAW,kBAAkB;IAC/B,iFAAiF;IACjF,OAAO,EAAS,MAAM,CAAC;IACvB,mFAAmF;IACnF,MAAM,CAAC,EAAS,MAAM,CAAC;IACvB,4FAA4F;IAC5F,KAAK,CAAC,EAAU,MAAM,CAAC;IACvB,6BAA6B;IAC7B,YAAY,CAAC,EAAG,MAAM,CAAC;IACvB,qEAAqE;IACrE,SAAS,CAAC,EAAM,MAAM,CAAC;IACvB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,uCAAuC;IACvC,SAAS,CAAC,EAAM,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,qBAAa,WAAY,SAAQ,YAAY;gBAC7B,IAAI,EAAE,kBAAkB;CAWvC;AAED,YAAY,EAAE,qBAAqB,EAAE,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* FetchBridge – generic OpenAI-compatible bridge for local or hosted endpoints.
|
|
3
3
|
*
|
|
4
|
-
* Works with Ollama, LM Studio, vLLM, llama.cpp server, or any
|
|
5
|
-
* exposes a /chat/completions endpoint compatible with the OpenAI
|
|
6
|
-
* and response schema.
|
|
4
|
+
* Works with Ollama, LM Studio, vLLM, llama.cpp server, a routing gateway, or any
|
|
5
|
+
* service that exposes a /chat/completions endpoint compatible with the OpenAI
|
|
6
|
+
* request and response schema.
|
|
7
7
|
*/
|
|
8
8
|
import { OpenAIBridge } from './OpenAIBridge.js';
|
|
9
9
|
/**
|
|
@@ -14,10 +14,12 @@ export class FetchBridge extends OpenAIBridge {
|
|
|
14
14
|
constructor(opts) {
|
|
15
15
|
super({
|
|
16
16
|
apiKey: opts.apiKey ?? 'local',
|
|
17
|
-
model: opts.model ?? 'default',
|
|
17
|
+
model: opts.model ?? (opts.serverDefaults ? undefined : 'default'),
|
|
18
18
|
baseUrl: opts.baseUrl,
|
|
19
19
|
systemPrompt: opts.systemPrompt,
|
|
20
20
|
maxTokens: opts.maxTokens,
|
|
21
|
+
serverDefaults: opts.serverDefaults,
|
|
22
|
+
timeoutMs: opts.timeoutMs,
|
|
21
23
|
});
|
|
22
24
|
}
|
|
23
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FetchBridge.js","sourceRoot":"","sources":["../../src/bridges/FetchBridge.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"FetchBridge.js","sourceRoot":"","sources":["../../src/bridges/FetchBridge.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAuBjD;;;GAGG;AACH,MAAM,OAAO,WAAY,SAAQ,YAAY;IACzC,YAAY,IAAwB;QAChC,KAAK,CAAC;YACF,MAAM,EAAS,IAAI,CAAC,MAAM,IAAW,OAAO;YAC5C,KAAK,EAAU,IAAI,CAAC,KAAK,IAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;YAClF,OAAO,EAAQ,IAAI,CAAC,OAAO;YAC3B,YAAY,EAAG,IAAI,CAAC,YAAY;YAChC,SAAS,EAAM,IAAI,CAAC,SAAS;YAC7B,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,SAAS,EAAM,IAAI,CAAC,SAAS;SAChC,CAAC,CAAC;IACP,CAAC;CACJ"}
|
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Supports both non-streaming and streaming (SSE) completions.
|
|
5
5
|
* Compatible with any OpenAI-compatible endpoint via the `baseUrl` option.
|
|
6
|
+
*
|
|
7
|
+
* The request, error mapping and stream reading are the `/wire` chat client's — the
|
|
8
|
+
* same one a host uses for tool-calling turns — so this class only supplies the
|
|
9
|
+
* bridge's defaults and maps usage onto {@link LlmUsage}.
|
|
6
10
|
*/
|
|
7
11
|
import type { TransformerBridge, BridgeGenerateOptions, BridgeCallInfo } from './TransformerBridge.js';
|
|
8
12
|
export interface OpenAIBridgeOptions {
|
|
@@ -16,21 +20,30 @@ export interface OpenAIBridgeOptions {
|
|
|
16
20
|
systemPrompt?: string;
|
|
17
21
|
/** Default max tokens. Default: 512. */
|
|
18
22
|
maxTokens?: number;
|
|
23
|
+
/**
|
|
24
|
+
* Send only what a call states — no model, max-tokens, temperature or top-p
|
|
25
|
+
* defaults — so a routing gateway picks them. Default false.
|
|
26
|
+
*/
|
|
27
|
+
serverDefaults?: boolean;
|
|
28
|
+
/** Abort a request after this long. */
|
|
29
|
+
timeoutMs?: number;
|
|
19
30
|
}
|
|
20
31
|
export declare class OpenAIBridge implements TransformerBridge {
|
|
21
32
|
private _lastCall;
|
|
22
33
|
readonly supportsStreaming: true;
|
|
23
|
-
private readonly
|
|
34
|
+
private readonly _client;
|
|
24
35
|
private readonly _model;
|
|
25
|
-
private readonly _baseUrl;
|
|
26
36
|
private readonly _systemPrompt;
|
|
27
37
|
private readonly _maxTokens;
|
|
38
|
+
private readonly _serverDefaults;
|
|
28
39
|
constructor(opts: OpenAIBridgeOptions);
|
|
29
40
|
/** Provider-reported usage for the last call — see {@link BridgeCallInfo}. */
|
|
30
41
|
get lastCall(): BridgeCallInfo | undefined;
|
|
31
42
|
generate(prompt: string, opts?: BridgeGenerateOptions): Promise<string>;
|
|
32
43
|
stream(prompt: string, opts?: BridgeGenerateOptions): AsyncIterable<string>;
|
|
33
|
-
|
|
34
|
-
private
|
|
44
|
+
/** Text deltas out; the closing event records usage (sent because of `includeUsage`). */
|
|
45
|
+
private _text;
|
|
46
|
+
private _request;
|
|
47
|
+
private _requestError;
|
|
35
48
|
}
|
|
36
49
|
//# sourceMappingURL=OpenAIBridge.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAIBridge.d.ts","sourceRoot":"","sources":["../../src/bridges/OpenAIBridge.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"OpenAIBridge.d.ts","sourceRoot":"","sources":["../../src/bridges/OpenAIBridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAYvG,MAAM,WAAW,mBAAmB;IAChC,kDAAkD;IAClD,MAAM,EAAU,MAAM,CAAC;IACvB,4CAA4C;IAC5C,KAAK,CAAC,EAAU,MAAM,CAAC;IACvB,0DAA0D;IAC1D,OAAO,CAAC,EAAQ,MAAM,CAAC;IACvB,qDAAqD;IACrD,YAAY,CAAC,EAAG,MAAM,CAAC;IACvB,wCAAwC;IACxC,SAAS,CAAC,EAAM,MAAM,CAAC;IACvB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,uCAAuC;IACvC,SAAS,CAAC,EAAM,MAAM,CAAC;CAC1B;AAED,qBAAa,YAAa,YAAW,iBAAiB;IAClD,OAAO,CAAC,SAAS,CAA6B;IAE9C,QAAQ,CAAC,iBAAiB,EAAG,IAAI,CAAU;IAE3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAwB;IACnD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;gBAE9B,IAAI,EAAE,mBAAmB;IAYrC,8EAA8E;IAC9E,IAAI,QAAQ,IAAI,cAAc,GAAG,SAAS,CAEzC;IAEK,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,MAAM,CAAC;IAgB1E,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,qBAA0B,GAAG,aAAa,CAAC,MAAM,CAAC;IActF,yFAAyF;IACzF,OAAO,CAAE,KAAK;IAQd,OAAO,CAAC,QAAQ;IAoBhB,OAAO,CAAC,aAAa;CAWxB"}
|
|
@@ -3,97 +3,108 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Supports both non-streaming and streaming (SSE) completions.
|
|
5
5
|
* Compatible with any OpenAI-compatible endpoint via the `baseUrl` option.
|
|
6
|
+
*
|
|
7
|
+
* The request, error mapping and stream reading are the `/wire` chat client's — the
|
|
8
|
+
* same one a host uses for tool-calling turns — so this class only supplies the
|
|
9
|
+
* bridge's defaults and maps usage onto {@link LlmUsage}.
|
|
6
10
|
*/
|
|
7
11
|
import { SSMError } from '../errors/SSMError.js';
|
|
8
|
-
import {
|
|
12
|
+
import { chatComplete, chatStream, ChatCompletionError, readUsageFields, } from '../wire/index.js';
|
|
9
13
|
export class OpenAIBridge {
|
|
10
14
|
_lastCall;
|
|
11
15
|
supportsStreaming = true;
|
|
12
|
-
|
|
16
|
+
_client;
|
|
13
17
|
_model;
|
|
14
|
-
_baseUrl;
|
|
15
18
|
_systemPrompt;
|
|
16
19
|
_maxTokens;
|
|
20
|
+
_serverDefaults;
|
|
17
21
|
constructor(opts) {
|
|
18
|
-
this.
|
|
19
|
-
this.
|
|
20
|
-
|
|
22
|
+
this._serverDefaults = opts.serverDefaults ?? false;
|
|
23
|
+
this._client = {
|
|
24
|
+
apiKey: opts.apiKey,
|
|
25
|
+
baseUrl: opts.baseUrl ?? 'https://api.openai.com/v1',
|
|
26
|
+
...(opts.timeoutMs ? { timeoutMs: opts.timeoutMs } : {}),
|
|
27
|
+
};
|
|
28
|
+
this._model = opts.model ?? (this._serverDefaults ? undefined : 'gpt-4o-mini');
|
|
21
29
|
this._systemPrompt = opts.systemPrompt ?? '';
|
|
22
|
-
this._maxTokens = opts.maxTokens ?? 512;
|
|
30
|
+
this._maxTokens = opts.maxTokens ?? (this._serverDefaults ? undefined : 512);
|
|
23
31
|
}
|
|
24
32
|
/** Provider-reported usage for the last call — see {@link BridgeCallInfo}. */
|
|
25
33
|
get lastCall() {
|
|
26
34
|
return this._lastCall;
|
|
27
35
|
}
|
|
28
36
|
async generate(prompt, opts = {}) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
const text = await res.text().catch(() => '');
|
|
33
|
-
throw new SSMError('BRIDGE_REQUEST_FAILED', `OpenAI API returned ${res.status}: ${text}`);
|
|
37
|
+
let result;
|
|
38
|
+
try {
|
|
39
|
+
result = await chatComplete(this._client, this._request(prompt, opts));
|
|
34
40
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
41
|
+
catch (err) {
|
|
42
|
+
throw this._requestError('OpenAI API', err);
|
|
43
|
+
}
|
|
44
|
+
if (!result.hasTextContent) {
|
|
38
45
|
throw new SSMError('BRIDGE_RESPONSE_INVALID', 'Unexpected OpenAI response shape.');
|
|
39
46
|
}
|
|
40
47
|
this._lastCall = {
|
|
41
|
-
usage: readOpenAIUsage(
|
|
48
|
+
usage: readOpenAIUsage(result.usage, result.model ?? opts.model ?? this._model ?? ''),
|
|
42
49
|
};
|
|
43
|
-
return content;
|
|
50
|
+
return result.content;
|
|
44
51
|
}
|
|
45
52
|
async *stream(prompt, opts = {}) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
53
|
+
let events;
|
|
54
|
+
try {
|
|
55
|
+
events = chatStream(this._client, { ...this._request(prompt, opts), includeUsage: true });
|
|
56
|
+
// The request is sent on the first pull; surface a failed request as a bridge error.
|
|
57
|
+
const first = await events.next();
|
|
58
|
+
if (first.done)
|
|
59
|
+
return;
|
|
60
|
+
yield* this._text(first.value);
|
|
51
61
|
}
|
|
52
|
-
|
|
53
|
-
throw
|
|
62
|
+
catch (err) {
|
|
63
|
+
throw this._requestError('OpenAI streaming API', err);
|
|
54
64
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
yield delta;
|
|
65
|
+
for await (const event of events)
|
|
66
|
+
yield* this._text(event);
|
|
67
|
+
}
|
|
68
|
+
/** Text deltas out; the closing event records usage (sent because of `includeUsage`). */
|
|
69
|
+
*_text(event) {
|
|
70
|
+
if (event.type === 'text-delta')
|
|
71
|
+
yield event.delta;
|
|
72
|
+
else if (event.type === 'done') {
|
|
73
|
+
const usage = readOpenAIUsage(event.result.usage, event.result.model ?? this._model ?? '');
|
|
74
|
+
this._lastCall = usage ? { usage } : {};
|
|
66
75
|
}
|
|
67
|
-
this._lastCall = usage ? { usage } : {};
|
|
68
76
|
}
|
|
69
|
-
|
|
77
|
+
_request(prompt, opts) {
|
|
70
78
|
const sys = opts.systemPrompt ?? this._systemPrompt;
|
|
71
79
|
const messages = [];
|
|
72
80
|
if (sys)
|
|
73
81
|
messages.push({ role: 'system', content: sys });
|
|
74
82
|
messages.push({ role: 'user', content: prompt });
|
|
75
|
-
|
|
76
|
-
|
|
83
|
+
const d = !this._serverDefaults;
|
|
84
|
+
const model = opts.model ?? this._model;
|
|
85
|
+
const maxTokens = opts.maxTokens ?? this._maxTokens;
|
|
86
|
+
const temperature = opts.temperature ?? (d ? 0.7 : undefined);
|
|
87
|
+
const topP = opts.topP ?? (d ? 0.9 : undefined);
|
|
88
|
+
return {
|
|
77
89
|
messages,
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
// estimate. Non-streaming requests reject the field, hence the guard.
|
|
85
|
-
...(stream ? { stream_options: { include_usage: true } } : {}),
|
|
86
|
-
});
|
|
90
|
+
...(model ? { model } : {}),
|
|
91
|
+
...(maxTokens !== undefined ? { maxTokens } : {}),
|
|
92
|
+
...(temperature !== undefined ? { temperature } : {}),
|
|
93
|
+
...(topP !== undefined ? { topP } : {}),
|
|
94
|
+
...(opts.extra ? { extra: opts.extra } : {}),
|
|
95
|
+
};
|
|
87
96
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
+
_requestError(what, err) {
|
|
98
|
+
if (err instanceof SSMError)
|
|
99
|
+
return err;
|
|
100
|
+
if (err instanceof ChatCompletionError) {
|
|
101
|
+
// A 2xx that still failed is a stream with no body: the server answered, badly.
|
|
102
|
+
if (err.status >= 200 && err.status < 300) {
|
|
103
|
+
return new SSMError('BRIDGE_RESPONSE_INVALID', `${what} returned no response body.`);
|
|
104
|
+
}
|
|
105
|
+
return new SSMError('BRIDGE_REQUEST_FAILED', `${what} returned ${err.status}: ${err.body}`);
|
|
106
|
+
}
|
|
107
|
+
return new SSMError('BRIDGE_REQUEST_FAILED', `${what} request failed: ${err instanceof Error ? err.message : String(err)}`, err);
|
|
97
108
|
}
|
|
98
109
|
}
|
|
99
110
|
/** Maps an OpenAI `usage` object onto the canonical {@link LlmUsage} shape. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAIBridge.js","sourceRoot":"","sources":["../../src/bridges/OpenAIBridge.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"OpenAIBridge.js","sourceRoot":"","sources":["../../src/bridges/OpenAIBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,12 @@ export interface BridgeGenerateOptions {
|
|
|
19
19
|
systemPrompt?: string;
|
|
20
20
|
/** Model string, overriding the adapter's default. */
|
|
21
21
|
model?: string;
|
|
22
|
+
/**
|
|
23
|
+
* Vendor extras merged into an OpenAI-compatible request body (a gateway's
|
|
24
|
+
* routing `provider`, `response_format`, …). Bridges that do not speak that
|
|
25
|
+
* wire format ignore it.
|
|
26
|
+
*/
|
|
27
|
+
extra?: Record<string, unknown>;
|
|
22
28
|
}
|
|
23
29
|
export interface TransformerBridge {
|
|
24
30
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransformerBridge.d.ts","sourceRoot":"","sources":["../../src/bridges/TransformerBridge.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B,MAAM,WAAW,qBAAqB;IAClC,mEAAmE;IACnE,SAAS,CAAC,EAAM,MAAM,CAAC;IACvB,iEAAiE;IACjE,WAAW,CAAC,EAAI,MAAM,CAAC;IACvB,+DAA+D;IAC/D,IAAI,CAAC,EAAW,MAAM,CAAC;IACvB,wEAAwE;IACxE,YAAY,CAAC,EAAG,MAAM,CAAC;IACvB,sDAAsD;IACtD,KAAK,CAAC,EAAU,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"TransformerBridge.d.ts","sourceRoot":"","sources":["../../src/bridges/TransformerBridge.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B,MAAM,WAAW,qBAAqB;IAClC,mEAAmE;IACnE,SAAS,CAAC,EAAM,MAAM,CAAC;IACvB,iEAAiE;IACjE,WAAW,CAAC,EAAI,MAAM,CAAC;IACvB,+DAA+D;IAC/D,IAAI,CAAC,EAAW,MAAM,CAAC;IACvB,wEAAwE;IACxE,YAAY,CAAC,EAAG,MAAM,CAAC;IACvB,sDAAsD;IACtD,KAAK,CAAC,EAAU,MAAM,CAAC;IACvB;;;;OAIG;IACH,KAAK,CAAC,EAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,iBAAiB;IAC9B;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAExE;;;;;;;;;OASG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC;IAEnC;;;OAGG;IACH,MAAM,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,qBAAqB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAE7E,4DAA4D;IAC5D,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;CACvC"}
|
package/dist/evermind/index.d.ts
CHANGED
|
@@ -12,4 +12,10 @@ export { EVERMIND_MIN_TEACH_CHARS } from './contract.js';
|
|
|
12
12
|
export { rankEvermindRecall, hashRecallQuery, countReconciledMemories, } from './recall.js';
|
|
13
13
|
export type { RecallScorable, RankedEvermindRecall } from './recall.js';
|
|
14
14
|
export { formatEvermindMemoryBlock } from './memoryBlock.js';
|
|
15
|
+
export { EVERMIND_ANSWER_MIN_CHARS, assessTextCoherence, looksLikeCoherentText, isServableText, } from './textCoherence.js';
|
|
16
|
+
export type { CoherenceFailure, CoherenceVerdict, CoherenceOptions } from './textCoherence.js';
|
|
17
|
+
export { TOOL_CHOICE_MIN_MARGIN, resolveToolChoiceMinMargin, normalizeEvermindTools, resolveEvermindToolChoice, renderToolsPreamble, planEvermindToolCall, toOpenAIToolCall, } from './toolCall.js';
|
|
18
|
+
export type { NormalizedTool, JsonSchema, ToolChoicePlan, EvermindToolDecoder, EvermindPlannedCall, EvermindToolPlan, } from './toolCall.js';
|
|
19
|
+
export { messagesToPrompt, generateEvermindText, COHERENCE_PROBE_PROMPTS, assessLMCoherence, probeEvermindText, createEvermindToolDecoder, generateEvermindWithTools, } from './runtime.js';
|
|
20
|
+
export type { EvermindTextModel, EvermindTextTokenizer, EvermindUsage, EvermindGenerateOptions, EvermindGeneration, EvermindCoherenceSample, EvermindCoherenceAssessment, EvermindProbeGeneration, MeteredToolDecoder, EvermindToolGeneration, } from './runtime.js';
|
|
15
21
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/evermind/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EACH,kBAAkB,EAClB,eAAe,EACf,uBAAuB,GAC1B,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/evermind/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EACH,kBAAkB,EAClB,eAAe,EACf,uBAAuB,GAC1B,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAI7D,OAAO,EACH,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,GACjB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC/F,OAAO,EACH,sBAAsB,EACtB,0BAA0B,EAC1B,sBAAsB,EACtB,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,GACnB,MAAM,eAAe,CAAC;AACvB,YAAY,EACR,cAAc,EACd,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,GACnB,MAAM,eAAe,CAAC;AACvB,OAAO,EACH,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,iBAAiB,EACjB,iBAAiB,EACjB,yBAAyB,EACzB,yBAAyB,GAC5B,MAAM,cAAc,CAAC;AACtB,YAAY,EACR,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,EACb,uBAAuB,EACvB,kBAAkB,EAClB,uBAAuB,EACvB,2BAA2B,EAC3B,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,GACzB,MAAM,cAAc,CAAC"}
|
package/dist/evermind/index.js
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
export { EVERMIND_MIN_TEACH_CHARS } from './contract.js';
|
|
2
2
|
export { rankEvermindRecall, hashRecallQuery, countReconciledMemories, } from './recall.js';
|
|
3
3
|
export { formatEvermindMemoryBlock } from './memoryBlock.js';
|
|
4
|
+
// Serving: text-quality gate, tool calling by constrained decoding, and the model-driving
|
|
5
|
+
// runtime (structural model/tokenizer shapes — still dependency-free).
|
|
6
|
+
export { EVERMIND_ANSWER_MIN_CHARS, assessTextCoherence, looksLikeCoherentText, isServableText, } from './textCoherence.js';
|
|
7
|
+
export { TOOL_CHOICE_MIN_MARGIN, resolveToolChoiceMinMargin, normalizeEvermindTools, resolveEvermindToolChoice, renderToolsPreamble, planEvermindToolCall, toOpenAIToolCall, } from './toolCall.js';
|
|
8
|
+
export { messagesToPrompt, generateEvermindText, COHERENCE_PROBE_PROMPTS, assessLMCoherence, probeEvermindText, createEvermindToolDecoder, generateEvermindWithTools, } from './runtime.js';
|
|
4
9
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/evermind/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EACH,kBAAkB,EAClB,eAAe,EACf,uBAAuB,GAC1B,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/evermind/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EACH,kBAAkB,EAClB,eAAe,EACf,uBAAuB,GAC1B,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAE7D,0FAA0F;AAC1F,uEAAuE;AACvE,OAAO,EACH,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,GACjB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACH,sBAAsB,EACtB,0BAA0B,EAC1B,sBAAsB,EACtB,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,GACnB,MAAM,eAAe,CAAC;AASvB,OAAO,EACH,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,iBAAiB,EACjB,iBAAiB,EACjB,yBAAyB,EACzB,yBAAyB,GAC5B,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The model-driving half of Evermind serving: flatten a chat into a continuation
|
|
3
|
+
* prompt, generate under a wall-clock budget, grade a head's fitness to serve, and
|
|
4
|
+
* bind a head to the tool planner's decoder port.
|
|
5
|
+
*
|
|
6
|
+
* Written against STRUCTURAL model/tokenizer shapes ({@link EvermindTextModel},
|
|
7
|
+
* {@link EvermindTextTokenizer}) that the engine's `EvermindLM` and `BPETokenizer`
|
|
8
|
+
* satisfy, so this module imports nothing and the `/evermind` subpath stays
|
|
9
|
+
* dependency-free. Where the head comes FROM (an R2 artifact, a file, a freshly merged
|
|
10
|
+
* in-memory model) is the host's business; everything here takes a loaded head.
|
|
11
|
+
*/
|
|
12
|
+
import { type CoherenceFailure } from './textCoherence.js';
|
|
13
|
+
import { type EvermindPlannedCall, type EvermindToolDecoder, type NormalizedTool, type ToolChoicePlan } from './toolCall.js';
|
|
14
|
+
/** What serving needs from a loaded text head (the engine's `EvermindLM`). */
|
|
15
|
+
export interface EvermindTextModel {
|
|
16
|
+
generateText(prompt: string, tok: EvermindTextTokenizer, opts: {
|
|
17
|
+
maxNewTokens: number;
|
|
18
|
+
temperature: number;
|
|
19
|
+
seed?: number;
|
|
20
|
+
}): string;
|
|
21
|
+
forward(ids: number[]): {
|
|
22
|
+
logits: ArrayLike<number>[];
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/** What serving needs from a head's tokenizer (the engine's `BPETokenizer`). */
|
|
26
|
+
export interface EvermindTextTokenizer {
|
|
27
|
+
encode(text: string): number[];
|
|
28
|
+
}
|
|
29
|
+
export interface EvermindUsage {
|
|
30
|
+
prompt_tokens: number;
|
|
31
|
+
completion_tokens: number;
|
|
32
|
+
total_tokens: number;
|
|
33
|
+
}
|
|
34
|
+
export interface EvermindGenerateOptions {
|
|
35
|
+
maxTokens?: number;
|
|
36
|
+
temperature?: number;
|
|
37
|
+
seed?: number;
|
|
38
|
+
/**
|
|
39
|
+
* Wall-clock budget for the generation loop, in ms. Evermind generation is
|
|
40
|
+
* SYNCHRONOUS CPU on the request path, so without this a large head on a slow host
|
|
41
|
+
* runs until the host kills the request — no message and no partial answer. With
|
|
42
|
+
* it, the loop stops at the budget and says so.
|
|
43
|
+
*/
|
|
44
|
+
deadlineMs?: number;
|
|
45
|
+
}
|
|
46
|
+
export interface EvermindGeneration {
|
|
47
|
+
content: string;
|
|
48
|
+
usage: EvermindUsage;
|
|
49
|
+
/** True when the wall-clock budget stopped generation before `maxTokens` or a stop
|
|
50
|
+
* token did — the text is a real partial answer, not a complete one. */
|
|
51
|
+
truncated: boolean;
|
|
52
|
+
/** How long the generation loop actually took. */
|
|
53
|
+
elapsedMs: number;
|
|
54
|
+
}
|
|
55
|
+
/** Flatten chat messages into a single continuation prompt for the LM. */
|
|
56
|
+
export declare function messagesToPrompt(messages: Array<{
|
|
57
|
+
role?: unknown;
|
|
58
|
+
content?: unknown;
|
|
59
|
+
}>): string;
|
|
60
|
+
/**
|
|
61
|
+
* Generate a reply from a loaded head. Deterministic for a given (prompt, seed,
|
|
62
|
+
* maxTokens): each slice derives its seed from the base seed and its index, so two
|
|
63
|
+
* operators running the same probe see the same text.
|
|
64
|
+
*/
|
|
65
|
+
export declare function generateEvermindText(lm: EvermindTextModel, tok: EvermindTextTokenizer, messages: Array<{
|
|
66
|
+
role?: unknown;
|
|
67
|
+
content?: unknown;
|
|
68
|
+
}>, opts?: EvermindGenerateOptions): EvermindGeneration;
|
|
69
|
+
/** Neutral probe prompts a project chat head should answer coherently. Fixed and
|
|
70
|
+
* generic (not project-specific) so the probe measures GENERATION QUALITY, not
|
|
71
|
+
* recall. */
|
|
72
|
+
export declare const COHERENCE_PROBE_PROMPTS: readonly string[];
|
|
73
|
+
/** One graded probe generation. */
|
|
74
|
+
export interface EvermindCoherenceSample {
|
|
75
|
+
prompt: string;
|
|
76
|
+
text: string;
|
|
77
|
+
coherent: boolean;
|
|
78
|
+
/** The failing signal when `coherent` is false (null when it passed) — so an
|
|
79
|
+
* operator sees WHY a head was refused, not just that it was. */
|
|
80
|
+
failure: CoherenceFailure | null;
|
|
81
|
+
/** Short human-readable explanation of {@link failure} (empty when coherent). */
|
|
82
|
+
detail: string;
|
|
83
|
+
}
|
|
84
|
+
/** A head's fitness-to-serve verdict. */
|
|
85
|
+
export interface EvermindCoherenceAssessment {
|
|
86
|
+
ready: boolean;
|
|
87
|
+
/** Fraction of probe samples that were substantive AND coherent (0..1). */
|
|
88
|
+
passRate: number;
|
|
89
|
+
samples: EvermindCoherenceSample[];
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Score a loaded head's fitness to serve chat: generate from the neutral probe
|
|
93
|
+
* prompts and grade each with the serve-time bar ({@link isServableText}).
|
|
94
|
+
* Synchronous and storage-free, so the promote-to-inference gate and a learning
|
|
95
|
+
* coordinator holding a freshly merged model grade it the same way. Deterministic
|
|
96
|
+
* seeds keep the verdict reproducible; a majority must pass by default.
|
|
97
|
+
*/
|
|
98
|
+
export declare function assessLMCoherence(lm: EvermindTextModel, tok: EvermindTextTokenizer, opts?: {
|
|
99
|
+
minPassRate?: number;
|
|
100
|
+
}): EvermindCoherenceAssessment;
|
|
101
|
+
/** One operator-run test-bench generation, graded with the serve-time bar. */
|
|
102
|
+
export interface EvermindProbeGeneration extends EvermindCoherenceSample {
|
|
103
|
+
usage: EvermindUsage;
|
|
104
|
+
/** True when the wall-clock budget stopped generation early — an incoherent verdict
|
|
105
|
+
* on a truncated sample is a statement about the clock, not about the model. */
|
|
106
|
+
truncated: boolean;
|
|
107
|
+
elapsedMs: number;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Test bench: run ONE prompt through a head and grade the output with the SAME bar
|
|
111
|
+
* the serve path uses, so "what will this model actually produce?" is answerable
|
|
112
|
+
* before inference is switched on. Deterministic by default (`seed`).
|
|
113
|
+
*/
|
|
114
|
+
export declare function probeEvermindText(lm: EvermindTextModel, tok: EvermindTextTokenizer, prompt: string, opts?: EvermindGenerateOptions): EvermindProbeGeneration;
|
|
115
|
+
/** A decoder plus the token usage it accumulated, so a tool-calling turn reports real
|
|
116
|
+
* numbers instead of zeros. */
|
|
117
|
+
export interface MeteredToolDecoder extends EvermindToolDecoder {
|
|
118
|
+
usage(): EvermindUsage;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Bind a loaded head to the {@link EvermindToolDecoder} port.
|
|
122
|
+
*
|
|
123
|
+
* `score`: teacher forcing lets one forward pass over `prompt + continuation` yield
|
|
124
|
+
* the log-prob of EVERY continuation token at once (position `t` predicts `t+1`), so
|
|
125
|
+
* ranking a candidate costs one pass. The mean is returned — not the sum — so a long
|
|
126
|
+
* tool name is not out-voted by a short one for its length alone.
|
|
127
|
+
*
|
|
128
|
+
* `generate` is greedy by default: a tool ARGUMENT is a value to get right, not prose
|
|
129
|
+
* to vary, and determinism keeps a replayed run reproducible.
|
|
130
|
+
*/
|
|
131
|
+
export declare function createEvermindToolDecoder(lm: EvermindTextModel, tok: EvermindTextTokenizer, opts?: {
|
|
132
|
+
temperature?: number;
|
|
133
|
+
seed?: number;
|
|
134
|
+
}): MeteredToolDecoder;
|
|
135
|
+
/** A tool-aware generation: either planned calls, or prose when the head chose to
|
|
136
|
+
* answer directly (`tool_choice: 'auto'`). */
|
|
137
|
+
export interface EvermindToolGeneration {
|
|
138
|
+
/** The first planned call, or null for prose. */
|
|
139
|
+
call: EvermindPlannedCall | null;
|
|
140
|
+
/** EVERY call this turn emits (the OpenAI shape is an array; frontier models emit
|
|
141
|
+
* parallel calls). Empty when `call` is null. */
|
|
142
|
+
calls: EvermindPlannedCall[];
|
|
143
|
+
/** Prose answer — populated only when `call` is null. */
|
|
144
|
+
content: string;
|
|
145
|
+
usage: EvermindUsage;
|
|
146
|
+
/** Confidence separation behind the plan — returned unjudged: the host owns the
|
|
147
|
+
* policy of what separation is good enough, because it owns the fallback. */
|
|
148
|
+
margin: number;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Run a TOOL-BEARING request against a loaded head: plan a call by constrained
|
|
152
|
+
* decoding, or fall through to ordinary prose when the head elected to answer directly.
|
|
153
|
+
*/
|
|
154
|
+
export declare function generateEvermindWithTools(lm: EvermindTextModel, tok: EvermindTextTokenizer, messages: Array<{
|
|
155
|
+
role?: unknown;
|
|
156
|
+
content?: unknown;
|
|
157
|
+
}>, tools: NormalizedTool[], choice: ToolChoicePlan, opts?: EvermindGenerateOptions): EvermindToolGeneration;
|
|
158
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/evermind/runtime.ts"],"names":[],"mappings":"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"}
|