@seanhogg/builderforce-memory 2026.6.18
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/LICENSE +21 -0
- package/README.md +582 -0
- package/dist/agent/SSMAgent.d.ts +146 -0
- package/dist/agent/SSMAgent.d.ts.map +1 -0
- package/dist/agent/SSMAgent.js +231 -0
- package/dist/agent/SSMAgent.js.map +1 -0
- package/dist/agent/index.d.ts +3 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +2 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/bridges/AnthropicBridge.d.ts +47 -0
- package/dist/bridges/AnthropicBridge.d.ts.map +1 -0
- package/dist/bridges/AnthropicBridge.js +120 -0
- package/dist/bridges/AnthropicBridge.js.map +1 -0
- package/dist/bridges/CachingBridge.d.ts +44 -0
- package/dist/bridges/CachingBridge.d.ts.map +1 -0
- package/dist/bridges/CachingBridge.js +62 -0
- package/dist/bridges/CachingBridge.js.map +1 -0
- package/dist/bridges/FetchBridge.d.ts +30 -0
- package/dist/bridges/FetchBridge.d.ts.map +1 -0
- package/dist/bridges/FetchBridge.js +24 -0
- package/dist/bridges/FetchBridge.js.map +1 -0
- package/dist/bridges/OpenAIBridge.d.ts +33 -0
- package/dist/bridges/OpenAIBridge.d.ts.map +1 -0
- package/dist/bridges/OpenAIBridge.js +110 -0
- package/dist/bridges/OpenAIBridge.js.map +1 -0
- package/dist/bridges/ResponseCache.d.ts +65 -0
- package/dist/bridges/ResponseCache.d.ts.map +1 -0
- package/dist/bridges/ResponseCache.js +97 -0
- package/dist/bridges/ResponseCache.js.map +1 -0
- package/dist/bridges/SemanticCachingBridge.d.ts +31 -0
- package/dist/bridges/SemanticCachingBridge.d.ts.map +1 -0
- package/dist/bridges/SemanticCachingBridge.js +44 -0
- package/dist/bridges/SemanticCachingBridge.js.map +1 -0
- package/dist/bridges/TransformerBridge.d.ts +35 -0
- package/dist/bridges/TransformerBridge.d.ts.map +1 -0
- package/dist/bridges/TransformerBridge.js +10 -0
- package/dist/bridges/TransformerBridge.js.map +1 -0
- package/dist/bridges/index.d.ts +14 -0
- package/dist/bridges/index.d.ts.map +1 -0
- package/dist/bridges/index.js +7 -0
- package/dist/bridges/index.js.map +1 -0
- package/dist/cache/FetchSemanticCacheBackend.d.ts +40 -0
- package/dist/cache/FetchSemanticCacheBackend.d.ts.map +1 -0
- package/dist/cache/FetchSemanticCacheBackend.js +61 -0
- package/dist/cache/FetchSemanticCacheBackend.js.map +1 -0
- package/dist/cache/SemanticCache.d.ts +105 -0
- package/dist/cache/SemanticCache.d.ts.map +1 -0
- package/dist/cache/SemanticCache.js +130 -0
- package/dist/cache/SemanticCache.js.map +1 -0
- package/dist/cache/index.d.ts +5 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +3 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/distillation/DistillationEngine.d.ts +107 -0
- package/dist/distillation/DistillationEngine.d.ts.map +1 -0
- package/dist/distillation/DistillationEngine.js +152 -0
- package/dist/distillation/DistillationEngine.js.map +1 -0
- package/dist/distillation/index.d.ts +3 -0
- package/dist/distillation/index.d.ts.map +1 -0
- package/dist/distillation/index.js +2 -0
- package/dist/distillation/index.js.map +1 -0
- package/dist/errors/SSMError.d.ts +14 -0
- package/dist/errors/SSMError.d.ts.map +1 -0
- package/dist/errors/SSMError.js +18 -0
- package/dist/errors/SSMError.js.map +1 -0
- package/dist/errors/index.d.ts +3 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +2 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +65 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/MemoryStore.d.ts +152 -0
- package/dist/memory/MemoryStore.d.ts.map +1 -0
- package/dist/memory/MemoryStore.js +290 -0
- package/dist/memory/MemoryStore.js.map +1 -0
- package/dist/memory/index.d.ts +3 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +2 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/router/InferenceRouter.d.ts +92 -0
- package/dist/router/InferenceRouter.d.ts.map +1 -0
- package/dist/router/InferenceRouter.js +113 -0
- package/dist/router/InferenceRouter.js.map +1 -0
- package/dist/router/index.d.ts +3 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +2 -0
- package/dist/router/index.js.map +1 -0
- package/dist/runtime/SSMRuntime.d.ts +167 -0
- package/dist/runtime/SSMRuntime.d.ts.map +1 -0
- package/dist/runtime/SSMRuntime.js +199 -0
- package/dist/runtime/SSMRuntime.js.map +1 -0
- package/dist/runtime/index.d.ts +3 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +2 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/session/errors.d.ts +10 -0
- package/dist/session/errors.d.ts.map +1 -0
- package/dist/session/errors.js +14 -0
- package/dist/session/errors.js.map +1 -0
- package/dist/session/index.d.ts +11 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +7 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/persistence.d.ts +14 -0
- package/dist/session/persistence.d.ts.map +1 -0
- package/dist/session/persistence.js +100 -0
- package/dist/session/persistence.js.map +1 -0
- package/dist/session/presets.d.ts +31 -0
- package/dist/session/presets.d.ts.map +1 -0
- package/dist/session/presets.js +91 -0
- package/dist/session/presets.js.map +1 -0
- package/dist/session/session.d.ts +186 -0
- package/dist/session/session.d.ts.map +1 -0
- package/dist/session/session.js +358 -0
- package/dist/session/session.js.map +1 -0
- package/dist/session/streaming.d.ts +13 -0
- package/dist/session/streaming.d.ts.map +1 -0
- package/dist/session/streaming.js +74 -0
- package/dist/session/streaming.js.map +1 -0
- package/dist/session/tokenizer.d.ts +18 -0
- package/dist/session/tokenizer.d.ts.map +1 -0
- package/dist/session/tokenizer.js +11 -0
- package/dist/session/tokenizer.js.map +1 -0
- package/dist/similarity/index.d.ts +19 -0
- package/dist/similarity/index.d.ts.map +1 -0
- package/dist/similarity/index.js +42 -0
- package/dist/similarity/index.js.map +1 -0
- package/package.json +120 -0
- package/src/agent/SSMAgent.ts +327 -0
- package/src/agent/index.ts +2 -0
- package/src/bridges/AnthropicBridge.ts +166 -0
- package/src/bridges/CachingBridge.ts +79 -0
- package/src/bridges/FetchBridge.ts +41 -0
- package/src/bridges/OpenAIBridge.ts +143 -0
- package/src/bridges/ResponseCache.ts +131 -0
- package/src/bridges/SemanticCachingBridge.ts +60 -0
- package/src/bridges/TransformerBridge.ts +38 -0
- package/src/bridges/index.ts +13 -0
- package/src/cache/FetchSemanticCacheBackend.ts +79 -0
- package/src/cache/SemanticCache.ts +196 -0
- package/src/cache/index.ts +9 -0
- package/src/distillation/DistillationEngine.ts +248 -0
- package/src/distillation/index.ts +2 -0
- package/src/errors/SSMError.ts +26 -0
- package/src/errors/index.ts +2 -0
- package/src/index.ts +128 -0
- package/src/memory/MemoryStore.ts +408 -0
- package/src/memory/index.ts +2 -0
- package/src/router/InferenceRouter.ts +201 -0
- package/src/router/index.ts +2 -0
- package/src/runtime/SSMRuntime.ts +309 -0
- package/src/runtime/index.ts +2 -0
- package/src/session/errors.ts +24 -0
- package/src/session/index.ts +25 -0
- package/src/session/persistence.ts +142 -0
- package/src/session/presets.ts +122 -0
- package/src/session/session.ts +657 -0
- package/src/session/streaming.ts +97 -0
- package/src/session/tokenizer.ts +18 -0
- package/src/similarity/index.ts +42 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CachingBridge – a read-through caching decorator for any TransformerBridge.
|
|
3
|
+
*
|
|
4
|
+
* Wraps an inner bridge and memoises `generate()` keyed on the full request
|
|
5
|
+
* shape (model, system, prompt, sampling). Identical completions are served
|
|
6
|
+
* from memory instead of re-billing the provider — the single most effective
|
|
7
|
+
* lever for cutting LLM spend on repeated prompts (distillation passes, retries,
|
|
8
|
+
* fan-out over duplicate inputs).
|
|
9
|
+
*
|
|
10
|
+
* Composes with every bridge, so the caching policy lives in one place rather
|
|
11
|
+
* than being reimplemented per provider:
|
|
12
|
+
*
|
|
13
|
+
* const bridge = new CachingBridge(new AnthropicBridge({ apiKey }));
|
|
14
|
+
*
|
|
15
|
+
* Streaming is delegated straight through and never cached — a token stream is
|
|
16
|
+
* consumed once and caching it would defeat its purpose.
|
|
17
|
+
*/
|
|
18
|
+
import { ResponseCache, buildCacheKey } from './ResponseCache.js';
|
|
19
|
+
export class CachingBridge {
|
|
20
|
+
_inner;
|
|
21
|
+
_cache;
|
|
22
|
+
constructor(inner, opts = {}) {
|
|
23
|
+
this._inner = inner;
|
|
24
|
+
this._cache = opts.cache ?? new ResponseCache(opts);
|
|
25
|
+
}
|
|
26
|
+
/** Mirrors the wrapped bridge so callers can still gate on streaming support. */
|
|
27
|
+
get supportsStreaming() {
|
|
28
|
+
return this._inner.supportsStreaming;
|
|
29
|
+
}
|
|
30
|
+
/** The underlying cache — exposed for stats inspection and manual eviction. */
|
|
31
|
+
get cache() {
|
|
32
|
+
return this._cache;
|
|
33
|
+
}
|
|
34
|
+
async generate(prompt, opts = {}) {
|
|
35
|
+
const key = buildCacheKey({
|
|
36
|
+
prompt,
|
|
37
|
+
model: opts.model,
|
|
38
|
+
systemPrompt: opts.systemPrompt,
|
|
39
|
+
maxTokens: opts.maxTokens,
|
|
40
|
+
temperature: opts.temperature,
|
|
41
|
+
topP: opts.topP,
|
|
42
|
+
});
|
|
43
|
+
const cached = this._cache.get(key);
|
|
44
|
+
if (cached !== undefined)
|
|
45
|
+
return cached;
|
|
46
|
+
const value = await this._inner.generate(prompt, opts);
|
|
47
|
+
this._cache.set(key, value, Date.now());
|
|
48
|
+
return value;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Streaming is delegated to the inner bridge unchanged and is never cached.
|
|
52
|
+
* Present only when the inner bridge supports it, so `supportsStreaming`
|
|
53
|
+
* stays an accurate gate.
|
|
54
|
+
*/
|
|
55
|
+
stream(prompt, opts) {
|
|
56
|
+
if (!this._inner.stream) {
|
|
57
|
+
throw new Error('Wrapped bridge does not support streaming.');
|
|
58
|
+
}
|
|
59
|
+
return this._inner.stream(prompt, opts);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=CachingBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CachingBridge.js","sourceRoot":"","sources":["../../src/bridges/CachingBridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,aAAa,EAAE,aAAa,EAA6B,MAAM,oBAAoB,CAAC;AAW7F,MAAM,OAAO,aAAa;IACL,MAAM,CAAqB;IAC3B,MAAM,CAAiB;IAExC,YAAY,KAAwB,EAAE,OAA6B,EAAE;QACjE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,iFAAiF;IACjF,IAAI,iBAAiB;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;IACzC,CAAC;IAED,+EAA+E;IAC/E,IAAI,KAAK;QACL,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,OAA8B,EAAE;QAC3D,MAAM,GAAG,GAAG,aAAa,CAAC;YACtB,MAAM;YACN,KAAK,EAAS,IAAI,CAAC,KAAK;YACxB,YAAY,EAAG,IAAI,CAAC,YAAY;YAChC,SAAS,EAAK,IAAI,CAAC,SAAS;YAC5B,WAAW,EAAG,IAAI,CAAC,WAAW;YAC9B,IAAI,EAAU,IAAI,CAAC,IAAI;SAC1B,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QAExC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACxC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,MAAc,EAAE,IAA4B;QAC/C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC;CACJ"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FetchBridge – generic OpenAI-compatible bridge for local or hosted endpoints.
|
|
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.
|
|
7
|
+
*/
|
|
8
|
+
import { OpenAIBridge } from './OpenAIBridge.js';
|
|
9
|
+
import type { BridgeGenerateOptions } from './TransformerBridge.js';
|
|
10
|
+
export interface FetchBridgeOptions {
|
|
11
|
+
/** Base URL of the OpenAI-compatible server, e.g. 'http://localhost:1234/v1'. */
|
|
12
|
+
baseUrl: string;
|
|
13
|
+
/** API key — many local servers require any non-empty string. Default: 'local'. */
|
|
14
|
+
apiKey?: string;
|
|
15
|
+
/** Model name understood by the server. Default: 'default'. */
|
|
16
|
+
model?: string;
|
|
17
|
+
/** Default system prompt. */
|
|
18
|
+
systemPrompt?: string;
|
|
19
|
+
/** Default max tokens. Default: 512. */
|
|
20
|
+
maxTokens?: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* FetchBridge is a thin re-configuration of OpenAIBridge pointed at a custom
|
|
24
|
+
* base URL. All streaming and request logic is inherited.
|
|
25
|
+
*/
|
|
26
|
+
export declare class FetchBridge extends OpenAIBridge {
|
|
27
|
+
constructor(opts: FetchBridgeOptions);
|
|
28
|
+
}
|
|
29
|
+
export type { BridgeGenerateOptions };
|
|
30
|
+
//# sourceMappingURL=FetchBridge.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FetchBridge – generic OpenAI-compatible bridge for local or hosted endpoints.
|
|
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.
|
|
7
|
+
*/
|
|
8
|
+
import { OpenAIBridge } from './OpenAIBridge.js';
|
|
9
|
+
/**
|
|
10
|
+
* FetchBridge is a thin re-configuration of OpenAIBridge pointed at a custom
|
|
11
|
+
* base URL. All streaming and request logic is inherited.
|
|
12
|
+
*/
|
|
13
|
+
export class FetchBridge extends OpenAIBridge {
|
|
14
|
+
constructor(opts) {
|
|
15
|
+
super({
|
|
16
|
+
apiKey: opts.apiKey ?? 'local',
|
|
17
|
+
model: opts.model ?? 'default',
|
|
18
|
+
baseUrl: opts.baseUrl,
|
|
19
|
+
systemPrompt: opts.systemPrompt,
|
|
20
|
+
maxTokens: opts.maxTokens,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=FetchBridge.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAIBridge – TransformerBridge implementation for the OpenAI Chat API.
|
|
3
|
+
*
|
|
4
|
+
* Supports both non-streaming and streaming (SSE) completions.
|
|
5
|
+
* Compatible with any OpenAI-compatible endpoint via the `baseUrl` option.
|
|
6
|
+
*/
|
|
7
|
+
import type { TransformerBridge, BridgeGenerateOptions } from './TransformerBridge.js';
|
|
8
|
+
export interface OpenAIBridgeOptions {
|
|
9
|
+
/** OpenAI API key (or compatible service key). */
|
|
10
|
+
apiKey: string;
|
|
11
|
+
/** Model to use. Default: 'gpt-4o-mini'. */
|
|
12
|
+
model?: string;
|
|
13
|
+
/** API base URL. Default: 'https://api.openai.com/v1'. */
|
|
14
|
+
baseUrl?: string;
|
|
15
|
+
/** Default system prompt sent with every request. */
|
|
16
|
+
systemPrompt?: string;
|
|
17
|
+
/** Default max tokens. Default: 512. */
|
|
18
|
+
maxTokens?: number;
|
|
19
|
+
}
|
|
20
|
+
export declare class OpenAIBridge implements TransformerBridge {
|
|
21
|
+
readonly supportsStreaming: true;
|
|
22
|
+
private readonly _apiKey;
|
|
23
|
+
private readonly _model;
|
|
24
|
+
private readonly _baseUrl;
|
|
25
|
+
private readonly _systemPrompt;
|
|
26
|
+
private readonly _maxTokens;
|
|
27
|
+
constructor(opts: OpenAIBridgeOptions);
|
|
28
|
+
generate(prompt: string, opts?: BridgeGenerateOptions): Promise<string>;
|
|
29
|
+
stream(prompt: string, opts?: BridgeGenerateOptions): AsyncIterable<string>;
|
|
30
|
+
private _buildBody;
|
|
31
|
+
private _fetch;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=OpenAIBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OpenAIBridge.d.ts","sourceRoot":"","sources":["../../src/bridges/OpenAIBridge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEvF,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,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;IAQ/B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,MAAM,CAAC;IAoB1E,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,qBAA0B,GAAG,aAAa,CAAC,MAAM,CAAC;IAmBtF,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,MAAM;CAUjB"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAIBridge – TransformerBridge implementation for the OpenAI Chat API.
|
|
3
|
+
*
|
|
4
|
+
* Supports both non-streaming and streaming (SSE) completions.
|
|
5
|
+
* Compatible with any OpenAI-compatible endpoint via the `baseUrl` option.
|
|
6
|
+
*/
|
|
7
|
+
import { SSMError } from '../errors/SSMError.js';
|
|
8
|
+
export class OpenAIBridge {
|
|
9
|
+
supportsStreaming = true;
|
|
10
|
+
_apiKey;
|
|
11
|
+
_model;
|
|
12
|
+
_baseUrl;
|
|
13
|
+
_systemPrompt;
|
|
14
|
+
_maxTokens;
|
|
15
|
+
constructor(opts) {
|
|
16
|
+
this._apiKey = opts.apiKey;
|
|
17
|
+
this._model = opts.model ?? 'gpt-4o-mini';
|
|
18
|
+
this._baseUrl = (opts.baseUrl ?? 'https://api.openai.com/v1').replace(/\/$/, '');
|
|
19
|
+
this._systemPrompt = opts.systemPrompt ?? '';
|
|
20
|
+
this._maxTokens = opts.maxTokens ?? 512;
|
|
21
|
+
}
|
|
22
|
+
async generate(prompt, opts = {}) {
|
|
23
|
+
const body = this._buildBody(prompt, opts, false);
|
|
24
|
+
const res = await this._fetch(body);
|
|
25
|
+
if (!res.ok) {
|
|
26
|
+
const text = await res.text().catch(() => '');
|
|
27
|
+
throw new SSMError('BRIDGE_REQUEST_FAILED', `OpenAI API returned ${res.status}: ${text}`);
|
|
28
|
+
}
|
|
29
|
+
const json = await res.json();
|
|
30
|
+
const content = json.choices?.[0]?.message?.content;
|
|
31
|
+
if (typeof content !== 'string') {
|
|
32
|
+
throw new SSMError('BRIDGE_RESPONSE_INVALID', 'Unexpected OpenAI response shape.');
|
|
33
|
+
}
|
|
34
|
+
return content;
|
|
35
|
+
}
|
|
36
|
+
async *stream(prompt, opts = {}) {
|
|
37
|
+
const body = this._buildBody(prompt, opts, true);
|
|
38
|
+
const res = await this._fetch(body);
|
|
39
|
+
if (!res.ok) {
|
|
40
|
+
const text = await res.text().catch(() => '');
|
|
41
|
+
throw new SSMError('BRIDGE_REQUEST_FAILED', `OpenAI streaming API returned ${res.status}: ${text}`);
|
|
42
|
+
}
|
|
43
|
+
if (!res.body) {
|
|
44
|
+
throw new SSMError('BRIDGE_RESPONSE_INVALID', 'OpenAI streaming response has no body.');
|
|
45
|
+
}
|
|
46
|
+
yield* parseOpenAIStream(res.body);
|
|
47
|
+
}
|
|
48
|
+
_buildBody(prompt, opts, stream) {
|
|
49
|
+
const sys = opts.systemPrompt ?? this._systemPrompt;
|
|
50
|
+
const messages = [];
|
|
51
|
+
if (sys)
|
|
52
|
+
messages.push({ role: 'system', content: sys });
|
|
53
|
+
messages.push({ role: 'user', content: prompt });
|
|
54
|
+
return JSON.stringify({
|
|
55
|
+
model: opts.model ?? this._model,
|
|
56
|
+
messages,
|
|
57
|
+
max_tokens: opts.maxTokens ?? this._maxTokens,
|
|
58
|
+
temperature: opts.temperature ?? 0.7,
|
|
59
|
+
top_p: opts.topP ?? 0.9,
|
|
60
|
+
stream,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
_fetch(body) {
|
|
64
|
+
return fetch(`${this._baseUrl}/chat/completions`, {
|
|
65
|
+
method: 'POST',
|
|
66
|
+
headers: {
|
|
67
|
+
'Content-Type': 'application/json',
|
|
68
|
+
'Authorization': `Bearer ${this._apiKey}`,
|
|
69
|
+
},
|
|
70
|
+
body,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// ── SSE parser ────────────────────────────────────────────────────────────────
|
|
75
|
+
async function* parseOpenAIStream(body) {
|
|
76
|
+
const reader = body.getReader();
|
|
77
|
+
const decoder = new TextDecoder();
|
|
78
|
+
let buffer = '';
|
|
79
|
+
try {
|
|
80
|
+
while (true) {
|
|
81
|
+
const { done, value } = await reader.read();
|
|
82
|
+
if (done)
|
|
83
|
+
break;
|
|
84
|
+
buffer += decoder.decode(value, { stream: true });
|
|
85
|
+
const lines = buffer.split('\n');
|
|
86
|
+
buffer = lines.pop(); // keep the last (possibly partial) line; split() always yields ≥1 element
|
|
87
|
+
for (const line of lines) {
|
|
88
|
+
const trimmed = line.trim();
|
|
89
|
+
if (!trimmed.startsWith('data: '))
|
|
90
|
+
continue;
|
|
91
|
+
const data = trimmed.slice(6);
|
|
92
|
+
if (data === '[DONE]')
|
|
93
|
+
return;
|
|
94
|
+
try {
|
|
95
|
+
const chunk = JSON.parse(data);
|
|
96
|
+
const delta = chunk.choices?.[0]?.delta?.content;
|
|
97
|
+
if (typeof delta === 'string' && delta.length > 0)
|
|
98
|
+
yield delta;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// Malformed JSON in stream — skip silently
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
reader.releaseLock();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=OpenAIBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OpenAIBridge.js","sourceRoot":"","sources":["../../src/bridges/OpenAIBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ResponseCache – a small, dependency-free read-through cache for transformer
|
|
3
|
+
* bridge completions.
|
|
4
|
+
*
|
|
5
|
+
* This is the canonical cache for this library: a single bounded LRU with an
|
|
6
|
+
* optional TTL, not an ad-hoc Map inlined at a call site. It exists because an
|
|
7
|
+
* external LLM call is the most expensive thing the runtime does — identical
|
|
8
|
+
* (model, system, prompt, sampling) requests should never be billed twice.
|
|
9
|
+
*
|
|
10
|
+
* Scope is in-process by design: this package targets the browser and Node, so
|
|
11
|
+
* there is no shared KV / cross-isolate tier to propagate to (unlike the
|
|
12
|
+
* BuilderForce.ai gateway, whose read-through cache is L1 Map + L2 KV). A
|
|
13
|
+
* consumer that needs cross-process sharing can wrap a bridge with its own
|
|
14
|
+
* distributed cache using the same `CachingBridge` shape.
|
|
15
|
+
*/
|
|
16
|
+
export interface ResponseCacheOptions {
|
|
17
|
+
/**
|
|
18
|
+
* Maximum number of entries retained. Oldest-accessed entries are evicted
|
|
19
|
+
* first once the bound is reached. Default: 500.
|
|
20
|
+
*/
|
|
21
|
+
maxEntries?: number;
|
|
22
|
+
/**
|
|
23
|
+
* Optional time-to-live in milliseconds. Entries older than this are treated
|
|
24
|
+
* as misses and dropped on access. Omit for no expiry (cache until evicted).
|
|
25
|
+
*/
|
|
26
|
+
ttlMs?: number;
|
|
27
|
+
}
|
|
28
|
+
export declare class ResponseCache {
|
|
29
|
+
private readonly _maxEntries;
|
|
30
|
+
private readonly _ttlMs;
|
|
31
|
+
private readonly _store;
|
|
32
|
+
private _hits;
|
|
33
|
+
private _misses;
|
|
34
|
+
constructor(opts?: ResponseCacheOptions);
|
|
35
|
+
/**
|
|
36
|
+
* Returns the cached value for `key`, or `undefined` on a miss (including an
|
|
37
|
+
* expired entry, which is also evicted). A hit refreshes recency.
|
|
38
|
+
*/
|
|
39
|
+
get(key: string): string | undefined;
|
|
40
|
+
/** Stores `value` under `key`, evicting the least-recently-used entry if full. */
|
|
41
|
+
set(key: string, value: string, now: number): void;
|
|
42
|
+
/** Drops all cached entries. */
|
|
43
|
+
clear(): void;
|
|
44
|
+
/** Current entry count (including not-yet-evicted expired entries). */
|
|
45
|
+
get size(): number;
|
|
46
|
+
/** Cumulative hit / miss counters, for observability and cache-tuning. */
|
|
47
|
+
get stats(): {
|
|
48
|
+
hits: number;
|
|
49
|
+
misses: number;
|
|
50
|
+
};
|
|
51
|
+
private _isExpired;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Builds a stable, collision-resistant cache key from the request shape. Any
|
|
55
|
+
* field that changes the model's output must be part of the key.
|
|
56
|
+
*/
|
|
57
|
+
export declare function buildCacheKey(parts: {
|
|
58
|
+
prompt: string;
|
|
59
|
+
model?: string;
|
|
60
|
+
systemPrompt?: string;
|
|
61
|
+
maxTokens?: number;
|
|
62
|
+
temperature?: number;
|
|
63
|
+
topP?: number;
|
|
64
|
+
}): string;
|
|
65
|
+
//# sourceMappingURL=ResponseCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResponseCache.d.ts","sourceRoot":"","sources":["../../src/bridges/ResponseCache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,oBAAoB;IACjC;;;OAGG;IACH,UAAU,CAAC,EAAG,MAAM,CAAC;IACrB;;;OAGG;IACH,KAAK,CAAC,EAAQ,MAAM,CAAC;CACxB;AASD,qBAAa,aAAa;IACtB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAElD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;IAEzD,OAAO,CAAC,KAAK,CAAO;IACpB,OAAO,CAAC,OAAO,CAAK;gBAER,IAAI,GAAE,oBAAyB;IAK3C;;;OAGG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAkBpC,kFAAkF;IAClF,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAYlD,gCAAgC;IAChC,KAAK,IAAI,IAAI;IAIb,uEAAuE;IACvE,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,0EAA0E;IAC1E,IAAI,KAAK,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAE5C;IAED,OAAO,CAAC,UAAU;CAMrB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACjC,MAAM,EAAS,MAAM,CAAC;IACtB,KAAK,CAAC,EAAS,MAAM,CAAC;IACtB,YAAY,CAAC,EAAG,MAAM,CAAC;IACvB,SAAS,CAAC,EAAK,MAAM,CAAC;IACtB,WAAW,CAAC,EAAG,MAAM,CAAC;IACtB,IAAI,CAAC,EAAU,MAAM,CAAC;CACzB,GAAG,MAAM,CAWT"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ResponseCache – a small, dependency-free read-through cache for transformer
|
|
3
|
+
* bridge completions.
|
|
4
|
+
*
|
|
5
|
+
* This is the canonical cache for this library: a single bounded LRU with an
|
|
6
|
+
* optional TTL, not an ad-hoc Map inlined at a call site. It exists because an
|
|
7
|
+
* external LLM call is the most expensive thing the runtime does — identical
|
|
8
|
+
* (model, system, prompt, sampling) requests should never be billed twice.
|
|
9
|
+
*
|
|
10
|
+
* Scope is in-process by design: this package targets the browser and Node, so
|
|
11
|
+
* there is no shared KV / cross-isolate tier to propagate to (unlike the
|
|
12
|
+
* BuilderForce.ai gateway, whose read-through cache is L1 Map + L2 KV). A
|
|
13
|
+
* consumer that needs cross-process sharing can wrap a bridge with its own
|
|
14
|
+
* distributed cache using the same `CachingBridge` shape.
|
|
15
|
+
*/
|
|
16
|
+
const DEFAULT_MAX_ENTRIES = 500;
|
|
17
|
+
export class ResponseCache {
|
|
18
|
+
_maxEntries;
|
|
19
|
+
_ttlMs;
|
|
20
|
+
// Map preserves insertion order; re-insertion on hit gives us LRU ordering.
|
|
21
|
+
_store = new Map();
|
|
22
|
+
_hits = 0;
|
|
23
|
+
_misses = 0;
|
|
24
|
+
constructor(opts = {}) {
|
|
25
|
+
this._maxEntries = opts.maxEntries ?? DEFAULT_MAX_ENTRIES;
|
|
26
|
+
this._ttlMs = opts.ttlMs;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Returns the cached value for `key`, or `undefined` on a miss (including an
|
|
30
|
+
* expired entry, which is also evicted). A hit refreshes recency.
|
|
31
|
+
*/
|
|
32
|
+
get(key) {
|
|
33
|
+
const record = this._store.get(key);
|
|
34
|
+
if (!record) {
|
|
35
|
+
this._misses++;
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
if (this._isExpired(record)) {
|
|
39
|
+
this._store.delete(key);
|
|
40
|
+
this._misses++;
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
// Refresh recency: delete + re-insert moves the key to the newest slot.
|
|
44
|
+
this._store.delete(key);
|
|
45
|
+
this._store.set(key, record);
|
|
46
|
+
this._hits++;
|
|
47
|
+
return record.value;
|
|
48
|
+
}
|
|
49
|
+
/** Stores `value` under `key`, evicting the least-recently-used entry if full. */
|
|
50
|
+
set(key, value, now) {
|
|
51
|
+
if (this._store.has(key))
|
|
52
|
+
this._store.delete(key);
|
|
53
|
+
this._store.set(key, { value, timestamp: now });
|
|
54
|
+
while (this._store.size > this._maxEntries) {
|
|
55
|
+
// size > maxEntries (≥ 0) guarantees the map is non-empty, so the
|
|
56
|
+
// oldest key always exists — the non-null assertion is safe.
|
|
57
|
+
const oldest = this._store.keys().next().value;
|
|
58
|
+
this._store.delete(oldest);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** Drops all cached entries. */
|
|
62
|
+
clear() {
|
|
63
|
+
this._store.clear();
|
|
64
|
+
}
|
|
65
|
+
/** Current entry count (including not-yet-evicted expired entries). */
|
|
66
|
+
get size() {
|
|
67
|
+
return this._store.size;
|
|
68
|
+
}
|
|
69
|
+
/** Cumulative hit / miss counters, for observability and cache-tuning. */
|
|
70
|
+
get stats() {
|
|
71
|
+
return { hits: this._hits, misses: this._misses };
|
|
72
|
+
}
|
|
73
|
+
_isExpired(record) {
|
|
74
|
+
if (this._ttlMs == null)
|
|
75
|
+
return false;
|
|
76
|
+
// `now` is read at access time so a single import of Date is enough; the
|
|
77
|
+
// caller-supplied `now` on set() keeps insertion timestamps consistent.
|
|
78
|
+
return Date.now() > record.timestamp + this._ttlMs;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Builds a stable, collision-resistant cache key from the request shape. Any
|
|
83
|
+
* field that changes the model's output must be part of the key.
|
|
84
|
+
*/
|
|
85
|
+
export function buildCacheKey(parts) {
|
|
86
|
+
// JSON of a fixed-order tuple — deterministic and unambiguous (a delimiter
|
|
87
|
+
// string could collide across fields; positional JSON cannot).
|
|
88
|
+
return JSON.stringify([
|
|
89
|
+
parts.model ?? '',
|
|
90
|
+
parts.systemPrompt ?? '',
|
|
91
|
+
parts.maxTokens ?? '',
|
|
92
|
+
parts.temperature ?? '',
|
|
93
|
+
parts.topP ?? '',
|
|
94
|
+
parts.prompt,
|
|
95
|
+
]);
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=ResponseCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResponseCache.js","sourceRoot":"","sources":["../../src/bridges/ResponseCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SemanticCachingBridge – a read-through *semantic* caching decorator for any
|
|
3
|
+
* TransformerBridge. The semantic sibling of CachingBridge: where CachingBridge
|
|
4
|
+
* only reuses byte-identical prompts, this reuses a prior answer when the new
|
|
5
|
+
* prompt is within `threshold` cosine similarity of one already answered.
|
|
6
|
+
*
|
|
7
|
+
* const bridge = new SemanticCachingBridge(new AnthropicBridge({ apiKey }), {
|
|
8
|
+
* embed: (t) => runtime.embed(t), // on-device SSM, free
|
|
9
|
+
* l2: new FetchSemanticCacheBackend({ baseUrl, apiKey }), // shared via gateway
|
|
10
|
+
* });
|
|
11
|
+
*
|
|
12
|
+
* Streaming is delegated straight through and never cached.
|
|
13
|
+
*/
|
|
14
|
+
import type { TransformerBridge, BridgeGenerateOptions } from './TransformerBridge.js';
|
|
15
|
+
import { SemanticCache, type SemanticCacheOptions } from '../cache/SemanticCache.js';
|
|
16
|
+
export interface SemanticCachingBridgeOptions extends Omit<SemanticCacheOptions, never> {
|
|
17
|
+
/** Provide a shared SemanticCache instance instead of constructing one. */
|
|
18
|
+
cache?: SemanticCache;
|
|
19
|
+
}
|
|
20
|
+
export declare class SemanticCachingBridge implements TransformerBridge {
|
|
21
|
+
private readonly _inner;
|
|
22
|
+
private readonly _cache;
|
|
23
|
+
constructor(inner: TransformerBridge, opts: SemanticCachingBridgeOptions);
|
|
24
|
+
get supportsStreaming(): boolean;
|
|
25
|
+
/** The underlying SemanticCache — exposed for stats inspection. */
|
|
26
|
+
get cache(): SemanticCache;
|
|
27
|
+
generate(prompt: string, opts?: BridgeGenerateOptions): Promise<string>;
|
|
28
|
+
/** Streaming is delegated unchanged and never cached. */
|
|
29
|
+
stream(prompt: string, opts?: BridgeGenerateOptions): AsyncIterable<string>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=SemanticCachingBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SemanticCachingBridge.d.ts","sourceRoot":"","sources":["../../src/bridges/SemanticCachingBridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAErF,MAAM,WAAW,4BAA6B,SAAQ,IAAI,CAAC,oBAAoB,EAAE,KAAK,CAAC;IACnF,2EAA2E;IAC3E,KAAK,CAAC,EAAG,aAAa,CAAC;CAC1B;AAED,qBAAa,qBAAsB,YAAW,iBAAiB;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;gBAE5B,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,4BAA4B;IAKxE,IAAI,iBAAiB,IAAI,OAAO,CAE/B;IAED,mEAAmE;IACnE,IAAI,KAAK,IAAI,aAAa,CAEzB;IAEK,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,MAAM,CAAC;IAYjF,yDAAyD;IACzD,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,qBAAqB,GAAG,aAAa,CAAC,MAAM,CAAC;CAM9E"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SemanticCachingBridge – a read-through *semantic* caching decorator for any
|
|
3
|
+
* TransformerBridge. The semantic sibling of CachingBridge: where CachingBridge
|
|
4
|
+
* only reuses byte-identical prompts, this reuses a prior answer when the new
|
|
5
|
+
* prompt is within `threshold` cosine similarity of one already answered.
|
|
6
|
+
*
|
|
7
|
+
* const bridge = new SemanticCachingBridge(new AnthropicBridge({ apiKey }), {
|
|
8
|
+
* embed: (t) => runtime.embed(t), // on-device SSM, free
|
|
9
|
+
* l2: new FetchSemanticCacheBackend({ baseUrl, apiKey }), // shared via gateway
|
|
10
|
+
* });
|
|
11
|
+
*
|
|
12
|
+
* Streaming is delegated straight through and never cached.
|
|
13
|
+
*/
|
|
14
|
+
import { SemanticCache } from '../cache/SemanticCache.js';
|
|
15
|
+
export class SemanticCachingBridge {
|
|
16
|
+
_inner;
|
|
17
|
+
_cache;
|
|
18
|
+
constructor(inner, opts) {
|
|
19
|
+
this._inner = inner;
|
|
20
|
+
this._cache = opts.cache ?? new SemanticCache(opts);
|
|
21
|
+
}
|
|
22
|
+
get supportsStreaming() {
|
|
23
|
+
return this._inner.supportsStreaming;
|
|
24
|
+
}
|
|
25
|
+
/** The underlying SemanticCache — exposed for stats inspection. */
|
|
26
|
+
get cache() {
|
|
27
|
+
return this._cache;
|
|
28
|
+
}
|
|
29
|
+
async generate(prompt, opts = {}) {
|
|
30
|
+
// Match on system + prompt meaning so different system contexts don't
|
|
31
|
+
// cross-hit; partition further by model via the stored meta.
|
|
32
|
+
const queryText = opts.systemPrompt ? `${opts.systemPrompt}\n${prompt}` : prompt;
|
|
33
|
+
const { response } = await this._cache.getOrGenerate(queryText, () => this._inner.generate(prompt, opts), opts.model ? { model: opts.model } : undefined);
|
|
34
|
+
return response;
|
|
35
|
+
}
|
|
36
|
+
/** Streaming is delegated unchanged and never cached. */
|
|
37
|
+
stream(prompt, opts) {
|
|
38
|
+
if (!this._inner.stream) {
|
|
39
|
+
throw new Error('Wrapped bridge does not support streaming.');
|
|
40
|
+
}
|
|
41
|
+
return this._inner.stream(prompt, opts);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=SemanticCachingBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SemanticCachingBridge.js","sourceRoot":"","sources":["../../src/bridges/SemanticCachingBridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,aAAa,EAA6B,MAAM,2BAA2B,CAAC;AAOrF,MAAM,OAAO,qBAAqB;IACb,MAAM,CAAqB;IAC3B,MAAM,CAAiB;IAExC,YAAY,KAAwB,EAAE,IAAkC;QACpE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,iBAAiB;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;IACzC,CAAC;IAED,mEAAmE;IACnE,IAAI,KAAK;QACL,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,OAA8B,EAAE;QAC3D,sEAAsE;QACtE,6DAA6D;QAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QACjF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAChD,SAAS,EACT,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,EACxC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CACjD,CAAC;QACF,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,yDAAyD;IACzD,MAAM,CAAC,MAAc,EAAE,IAA4B;QAC/C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC;CACJ"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TransformerBridge – pluggable interface for any transformer LLM backend.
|
|
3
|
+
*
|
|
4
|
+
* Implementations (OpenAIBridge, AnthropicBridge, FetchBridge) satisfy this
|
|
5
|
+
* interface and are passed to SSMRuntime to enable hybrid inference and
|
|
6
|
+
* distillation. The interface is structural — any object with the right
|
|
7
|
+
* shape works, no base class required.
|
|
8
|
+
*/
|
|
9
|
+
export interface BridgeGenerateOptions {
|
|
10
|
+
/** Max tokens to generate. Default per-adapter (typically 512). */
|
|
11
|
+
maxTokens?: number;
|
|
12
|
+
/** Sampling temperature. Default per-adapter (typically 0.7). */
|
|
13
|
+
temperature?: number;
|
|
14
|
+
/** Nucleus sampling p. Default per-adapter (typically 0.9). */
|
|
15
|
+
topP?: number;
|
|
16
|
+
/** System prompt for this request, overriding the adapter's default. */
|
|
17
|
+
systemPrompt?: string;
|
|
18
|
+
/** Model string, overriding the adapter's default. */
|
|
19
|
+
model?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface TransformerBridge {
|
|
22
|
+
/**
|
|
23
|
+
* Generates a completion for the given prompt.
|
|
24
|
+
* Must resolve to the assistant's reply text only (not including the prompt).
|
|
25
|
+
*/
|
|
26
|
+
generate(prompt: string, opts?: BridgeGenerateOptions): Promise<string>;
|
|
27
|
+
/**
|
|
28
|
+
* Streaming variant — yields tokens incrementally.
|
|
29
|
+
* Check `supportsStreaming` before calling.
|
|
30
|
+
*/
|
|
31
|
+
stream?(prompt: string, opts?: BridgeGenerateOptions): AsyncIterable<string>;
|
|
32
|
+
/** True when this bridge supports the `stream()` method. */
|
|
33
|
+
readonly supportsStreaming: boolean;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=TransformerBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TransformerBridge.d.ts","sourceRoot":"","sources":["../../src/bridges/TransformerBridge.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,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;;;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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TransformerBridge – pluggable interface for any transformer LLM backend.
|
|
3
|
+
*
|
|
4
|
+
* Implementations (OpenAIBridge, AnthropicBridge, FetchBridge) satisfy this
|
|
5
|
+
* interface and are passed to SSMRuntime to enable hybrid inference and
|
|
6
|
+
* distillation. The interface is structural — any object with the right
|
|
7
|
+
* shape works, no base class required.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=TransformerBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TransformerBridge.js","sourceRoot":"","sources":["../../src/bridges/TransformerBridge.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type { TransformerBridge, BridgeGenerateOptions } from './TransformerBridge.js';
|
|
2
|
+
export { OpenAIBridge } from './OpenAIBridge.js';
|
|
3
|
+
export { AnthropicBridge } from './AnthropicBridge.js';
|
|
4
|
+
export { FetchBridge } from './FetchBridge.js';
|
|
5
|
+
export { CachingBridge } from './CachingBridge.js';
|
|
6
|
+
export { SemanticCachingBridge } from './SemanticCachingBridge.js';
|
|
7
|
+
export { ResponseCache, buildCacheKey } from './ResponseCache.js';
|
|
8
|
+
export type { OpenAIBridgeOptions } from './OpenAIBridge.js';
|
|
9
|
+
export type { AnthropicBridgeOptions } from './AnthropicBridge.js';
|
|
10
|
+
export type { FetchBridgeOptions } from './FetchBridge.js';
|
|
11
|
+
export type { CachingBridgeOptions } from './CachingBridge.js';
|
|
12
|
+
export type { SemanticCachingBridgeOptions } from './SemanticCachingBridge.js';
|
|
13
|
+
export type { ResponseCacheOptions } from './ResponseCache.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bridges/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAS,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAU,kBAAkB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAQ,oBAAoB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAClE,YAAY,EAAE,mBAAmB,EAAE,MAAS,mBAAmB,CAAC;AAChE,YAAY,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACnE,YAAY,EAAE,kBAAkB,EAAE,MAAU,kBAAkB,CAAC;AAC/D,YAAY,EAAE,oBAAoB,EAAE,MAAQ,oBAAoB,CAAC;AACjE,YAAY,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAC/E,YAAY,EAAE,oBAAoB,EAAE,MAAQ,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { OpenAIBridge } from './OpenAIBridge.js';
|
|
2
|
+
export { AnthropicBridge } from './AnthropicBridge.js';
|
|
3
|
+
export { FetchBridge } from './FetchBridge.js';
|
|
4
|
+
export { CachingBridge } from './CachingBridge.js';
|
|
5
|
+
export { SemanticCachingBridge } from './SemanticCachingBridge.js';
|
|
6
|
+
export { ResponseCache, buildCacheKey } from './ResponseCache.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bridges/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAS,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAU,kBAAkB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAQ,oBAAoB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
|