@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.
Files changed (54) hide show
  1. package/dist/bridges/FetchBridge.d.ts +12 -5
  2. package/dist/bridges/FetchBridge.d.ts.map +1 -1
  3. package/dist/bridges/FetchBridge.js +6 -4
  4. package/dist/bridges/FetchBridge.js.map +1 -1
  5. package/dist/bridges/OpenAIBridge.d.ts +17 -4
  6. package/dist/bridges/OpenAIBridge.d.ts.map +1 -1
  7. package/dist/bridges/OpenAIBridge.js +68 -57
  8. package/dist/bridges/OpenAIBridge.js.map +1 -1
  9. package/dist/bridges/TransformerBridge.d.ts +6 -0
  10. package/dist/bridges/TransformerBridge.d.ts.map +1 -1
  11. package/dist/evermind/index.d.ts +6 -0
  12. package/dist/evermind/index.d.ts.map +1 -1
  13. package/dist/evermind/index.js +5 -0
  14. package/dist/evermind/index.js.map +1 -1
  15. package/dist/evermind/runtime.d.ts +158 -0
  16. package/dist/evermind/runtime.d.ts.map +1 -0
  17. package/dist/evermind/runtime.js +236 -0
  18. package/dist/evermind/runtime.js.map +1 -0
  19. package/dist/evermind/textCoherence.d.ts +55 -0
  20. package/dist/evermind/textCoherence.d.ts.map +1 -0
  21. package/dist/evermind/textCoherence.js +218 -0
  22. package/dist/evermind/textCoherence.js.map +1 -0
  23. package/dist/evermind/toolCall.d.ts +175 -0
  24. package/dist/evermind/toolCall.d.ts.map +1 -0
  25. package/dist/evermind/toolCall.js +398 -0
  26. package/dist/evermind/toolCall.js.map +1 -0
  27. package/dist/evermind/wordLexicon.d.ts +103 -0
  28. package/dist/evermind/wordLexicon.d.ts.map +1 -0
  29. package/dist/evermind/wordLexicon.js +361 -0
  30. package/dist/evermind/wordLexicon.js.map +1 -0
  31. package/dist/wire/chatClient.d.ts +100 -0
  32. package/dist/wire/chatClient.d.ts.map +1 -0
  33. package/dist/wire/chatClient.js +123 -0
  34. package/dist/wire/chatClient.js.map +1 -0
  35. package/dist/wire/index.d.ts +3 -1
  36. package/dist/wire/index.d.ts.map +1 -1
  37. package/dist/wire/index.js +2 -1
  38. package/dist/wire/index.js.map +1 -1
  39. package/dist/wire/sse.d.ts +17 -9
  40. package/dist/wire/sse.d.ts.map +1 -1
  41. package/dist/wire/sse.js +45 -22
  42. package/dist/wire/sse.js.map +1 -1
  43. package/package.json +3 -3
  44. package/src/bridges/FetchBridge.ts +15 -6
  45. package/src/bridges/OpenAIBridge.ts +82 -72
  46. package/src/bridges/TransformerBridge.ts +6 -0
  47. package/src/evermind/index.ts +48 -0
  48. package/src/evermind/runtime.ts +364 -0
  49. package/src/evermind/textCoherence.ts +248 -0
  50. package/src/evermind/toolCall.ts +523 -0
  51. package/src/evermind/wordLexicon.ts +395 -0
  52. package/src/wire/chatClient.ts +196 -0
  53. package/src/wire/index.ts +3 -1
  54. 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 service that
5
- * exposes a /chat/completions endpoint compatible with the OpenAI request
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,+DAA+D;IAC/D,KAAK,CAAC,EAAU,MAAM,CAAC;IACvB,6BAA6B;IAC7B,YAAY,CAAC,EAAG,MAAM,CAAC;IACvB,wCAAwC;IACxC,SAAS,CAAC,EAAM,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,qBAAa,WAAY,SAAQ,YAAY;gBAC7B,IAAI,EAAE,kBAAkB;CASvC;AAED,YAAY,EAAE,qBAAqB,EAAE,CAAC"}
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 service that
5
- * exposes a /chat/completions endpoint compatible with the OpenAI request
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;AAgBjD;;;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,SAAS;YAC9C,OAAO,EAAQ,IAAI,CAAC,OAAO;YAC3B,YAAY,EAAG,IAAI,CAAC,YAAY;YAChC,SAAS,EAAM,IAAI,CAAC,SAAS;SAChC,CAAC,CAAC;IACP,CAAC;CACJ"}
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 _apiKey;
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
- private _buildBody;
34
- private _fetch;
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;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGvG,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;CAC1B;AAED,qBAAa,YAAa,YAAW,iBAAiB;IAClD,OAAO,CAAC,SAAS,CAA6B;IAE9C,QAAQ,CAAC,iBAAiB,EAAG,IAAI,CAAU;IAE3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;gBAE3B,IAAI,EAAE,mBAAmB;IAQrC,8EAA8E;IAC9E,IAAI,QAAQ,IAAI,cAAc,GAAG,SAAS,CAEzC;IAEK,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,MAAM,CAAC;IAuB1E,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,qBAA0B,GAAG,aAAa,CAAC,MAAM,CAAC;IA+BtF,OAAO,CAAC,UAAU;IAoBlB,OAAO,CAAC,MAAM;CAUjB"}
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 { readSseDataFrames, readUsageFields } from '../wire/index.js';
12
+ import { chatComplete, chatStream, ChatCompletionError, readUsageFields, } from '../wire/index.js';
9
13
  export class OpenAIBridge {
10
14
  _lastCall;
11
15
  supportsStreaming = true;
12
- _apiKey;
16
+ _client;
13
17
  _model;
14
- _baseUrl;
15
18
  _systemPrompt;
16
19
  _maxTokens;
20
+ _serverDefaults;
17
21
  constructor(opts) {
18
- this._apiKey = opts.apiKey;
19
- this._model = opts.model ?? 'gpt-4o-mini';
20
- this._baseUrl = (opts.baseUrl ?? 'https://api.openai.com/v1').replace(/\/$/, '');
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
- const body = this._buildBody(prompt, opts, false);
30
- const res = await this._fetch(body);
31
- if (!res.ok) {
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
- const json = await res.json();
36
- const content = json.choices?.[0]?.message?.content;
37
- if (typeof content !== 'string') {
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(json.usage, json.model ?? opts.model ?? this._model),
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
- const body = this._buildBody(prompt, opts, true);
47
- const res = await this._fetch(body);
48
- if (!res.ok) {
49
- const text = await res.text().catch(() => '');
50
- throw new SSMError('BRIDGE_REQUEST_FAILED', `OpenAI streaming API returned ${res.status}: ${text}`);
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
- if (!res.body) {
53
- throw new SSMError('BRIDGE_RESPONSE_INVALID', 'OpenAI streaming response has no body.');
62
+ catch (err) {
63
+ throw this._requestError('OpenAI streaming API', err);
54
64
  }
55
- const model = opts.model ?? this._model;
56
- let usage;
57
- for await (const chunk of readSseDataFrames(res.body)) {
58
- // Usage is only emitted because `_buildBody` sets `stream_options.include_usage`;
59
- // without it OpenAI streams no usage at all and cost would be a guess.
60
- const reported = readOpenAIUsage(chunk.usage, chunk.model ?? model);
61
- if (reported)
62
- usage = reported;
63
- const delta = chunk.choices?.[0]?.delta?.content;
64
- if (typeof delta === 'string' && delta.length > 0)
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
- _buildBody(prompt, opts, stream) {
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
- return JSON.stringify({
76
- model: opts.model ?? this._model,
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
- max_tokens: opts.maxTokens ?? this._maxTokens,
79
- temperature: opts.temperature ?? 0.7,
80
- top_p: opts.topP ?? 0.9,
81
- stream,
82
- // Without this the streaming response carries no usage block, so
83
- // cost-per-request on streamed calls would silently fall back to an
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
- _fetch(body) {
89
- return fetch(`${this._baseUrl}/chat/completions`, {
90
- method: 'POST',
91
- headers: {
92
- 'Content-Type': 'application/json',
93
- 'Authorization': `Bearer ${this._apiKey}`,
94
- },
95
- body,
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":"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"}
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;CAC1B;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"}
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"}
@@ -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"}
@@ -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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"}