@molroo-io/sdk 0.6.2 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +100 -194
- package/dist/cjs/api-client.d.ts +2 -12
- package/dist/cjs/api-client.d.ts.map +1 -1
- package/dist/cjs/api-client.js +4 -42
- package/dist/cjs/errors.d.ts +1 -16
- package/dist/cjs/errors.d.ts.map +1 -1
- package/dist/cjs/errors.js +2 -18
- package/dist/cjs/events/types.d.ts +14 -21
- package/dist/cjs/events/types.d.ts.map +1 -1
- package/dist/cjs/events/types.js +0 -11
- package/dist/cjs/index.d.ts +26 -48
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +29 -52
- package/dist/cjs/llm/resolve.d.ts +4 -22
- package/dist/cjs/llm/resolve.d.ts.map +1 -1
- package/dist/cjs/llm/resolve.js +19 -7
- package/dist/cjs/llm/vercel-ai/adapter.d.ts +4 -10
- package/dist/cjs/llm/vercel-ai/adapter.d.ts.map +1 -1
- package/dist/cjs/llm/vercel-ai/adapter.js +6 -152
- package/dist/cjs/llm/vercel-ai/config.d.ts +8 -5
- package/dist/cjs/llm/vercel-ai/config.d.ts.map +1 -1
- package/dist/cjs/memory/in-memory.d.ts +14 -37
- package/dist/cjs/memory/in-memory.d.ts.map +1 -1
- package/dist/cjs/memory/in-memory.js +22 -85
- package/dist/cjs/memory/recall.d.ts +10 -21
- package/dist/cjs/memory/recall.d.ts.map +1 -1
- package/dist/cjs/memory/recall.js +12 -91
- package/dist/cjs/memory/types.d.ts +46 -186
- package/dist/cjs/memory/types.d.ts.map +1 -1
- package/dist/cjs/memory/types.js +0 -10
- package/dist/cjs/persona/chat-orchestrator.d.ts +46 -0
- package/dist/cjs/persona/chat-orchestrator.d.ts.map +1 -0
- package/dist/cjs/persona/chat-orchestrator.js +240 -0
- package/dist/cjs/persona/event-emitter.d.ts +7 -0
- package/dist/cjs/persona/event-emitter.d.ts.map +1 -0
- package/dist/cjs/persona/event-emitter.js +53 -0
- package/dist/cjs/persona/memory-pipeline.d.ts +26 -0
- package/dist/cjs/persona/memory-pipeline.d.ts.map +1 -0
- package/dist/cjs/persona/memory-pipeline.js +69 -0
- package/dist/cjs/persona.d.ts +56 -187
- package/dist/cjs/persona.d.ts.map +1 -1
- package/dist/cjs/persona.js +62 -638
- package/dist/cjs/shared/appraisal.d.ts +26 -0
- package/dist/cjs/shared/appraisal.d.ts.map +1 -0
- package/dist/cjs/shared/appraisal.js +45 -0
- package/dist/cjs/shared/client-factory.d.ts +23 -0
- package/dist/cjs/shared/client-factory.d.ts.map +1 -0
- package/dist/cjs/shared/client-factory.js +48 -0
- package/dist/cjs/shared/errors.d.ts +21 -0
- package/dist/cjs/shared/errors.d.ts.map +1 -0
- package/dist/cjs/shared/errors.js +29 -0
- package/dist/cjs/world/client.d.ts +2 -9
- package/dist/cjs/world/client.d.ts.map +1 -1
- package/dist/cjs/world/client.js +7 -34
- package/dist/cjs/world/errors.d.ts +1 -8
- package/dist/cjs/world/errors.d.ts.map +1 -1
- package/dist/cjs/world/errors.js +2 -12
- package/dist/cjs/world/index.d.ts +2 -2
- package/dist/cjs/world/index.d.ts.map +1 -1
- package/dist/cjs/world/types.d.ts +32 -5
- package/dist/cjs/world/types.d.ts.map +1 -1
- package/dist/cjs/world/world-domain.d.ts.map +1 -1
- package/dist/cjs/world/world-domain.js +4 -32
- package/dist/cjs/world/world-persona.d.ts +17 -12
- package/dist/cjs/world/world-persona.d.ts.map +1 -1
- package/dist/cjs/world/world-persona.js +6 -18
- package/dist/cjs/world/world.d.ts +28 -5
- package/dist/cjs/world/world.d.ts.map +1 -1
- package/dist/cjs/world/world.js +13 -11
- package/dist/esm/api-client.d.ts +2 -12
- package/dist/esm/api-client.d.ts.map +1 -1
- package/dist/esm/api-client.js +3 -38
- package/dist/esm/errors.d.ts +1 -16
- package/dist/esm/errors.d.ts.map +1 -1
- package/dist/esm/errors.js +1 -17
- package/dist/esm/events/types.d.ts +14 -21
- package/dist/esm/events/types.d.ts.map +1 -1
- package/dist/esm/events/types.js +0 -11
- package/dist/esm/index.d.ts +26 -48
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +25 -38
- package/dist/esm/llm/resolve.d.ts +4 -22
- package/dist/esm/llm/resolve.d.ts.map +1 -1
- package/dist/esm/llm/resolve.js +20 -8
- package/dist/esm/llm/vercel-ai/adapter.d.ts +4 -10
- package/dist/esm/llm/vercel-ai/adapter.d.ts.map +1 -1
- package/dist/esm/llm/vercel-ai/adapter.js +6 -119
- package/dist/esm/llm/vercel-ai/config.d.ts +8 -5
- package/dist/esm/llm/vercel-ai/config.d.ts.map +1 -1
- package/dist/esm/memory/in-memory.d.ts +14 -37
- package/dist/esm/memory/in-memory.d.ts.map +1 -1
- package/dist/esm/memory/in-memory.js +20 -83
- package/dist/esm/memory/recall.d.ts +10 -21
- package/dist/esm/memory/recall.d.ts.map +1 -1
- package/dist/esm/memory/recall.js +12 -91
- package/dist/esm/memory/types.d.ts +46 -186
- package/dist/esm/memory/types.d.ts.map +1 -1
- package/dist/esm/memory/types.js +1 -9
- package/dist/esm/persona/chat-orchestrator.d.ts +46 -0
- package/dist/esm/persona/chat-orchestrator.d.ts.map +1 -0
- package/dist/esm/persona/chat-orchestrator.js +204 -0
- package/dist/esm/persona/event-emitter.d.ts +7 -0
- package/dist/esm/persona/event-emitter.d.ts.map +1 -0
- package/dist/esm/persona/event-emitter.js +50 -0
- package/dist/esm/persona/memory-pipeline.d.ts +26 -0
- package/dist/esm/persona/memory-pipeline.d.ts.map +1 -0
- package/dist/esm/persona/memory-pipeline.js +65 -0
- package/dist/esm/persona.d.ts +56 -187
- package/dist/esm/persona.d.ts.map +1 -1
- package/dist/esm/persona.js +62 -638
- package/dist/esm/shared/appraisal.d.ts +26 -0
- package/dist/esm/shared/appraisal.d.ts.map +1 -0
- package/dist/esm/shared/appraisal.js +40 -0
- package/dist/esm/shared/client-factory.d.ts +23 -0
- package/dist/esm/shared/client-factory.d.ts.map +1 -0
- package/dist/esm/shared/client-factory.js +41 -0
- package/dist/esm/shared/errors.d.ts +21 -0
- package/dist/esm/shared/errors.d.ts.map +1 -0
- package/dist/esm/shared/errors.js +24 -0
- package/dist/esm/world/client.d.ts +2 -9
- package/dist/esm/world/client.d.ts.map +1 -1
- package/dist/esm/world/client.js +6 -30
- package/dist/esm/world/errors.d.ts +1 -8
- package/dist/esm/world/errors.d.ts.map +1 -1
- package/dist/esm/world/errors.js +1 -11
- package/dist/esm/world/index.d.ts +2 -2
- package/dist/esm/world/index.d.ts.map +1 -1
- package/dist/esm/world/types.d.ts +32 -5
- package/dist/esm/world/types.d.ts.map +1 -1
- package/dist/esm/world/world-domain.d.ts.map +1 -1
- package/dist/esm/world/world-domain.js +4 -32
- package/dist/esm/world/world-persona.d.ts +17 -12
- package/dist/esm/world/world-persona.d.ts.map +1 -1
- package/dist/esm/world/world-persona.js +6 -18
- package/dist/esm/world/world.d.ts +28 -5
- package/dist/esm/world/world.d.ts.map +1 -1
- package/dist/esm/world/world.js +13 -11
- package/package.json +4 -101
- package/dist/cjs/embedding/cloudflare.d.ts +0 -15
- package/dist/cjs/embedding/cloudflare.d.ts.map +0 -1
- package/dist/cjs/embedding/cloudflare.js +0 -16
- package/dist/cjs/embedding/cohere.d.ts +0 -8
- package/dist/cjs/embedding/cohere.d.ts.map +0 -1
- package/dist/cjs/embedding/cohere.js +0 -31
- package/dist/cjs/embedding/index.d.ts +0 -9
- package/dist/cjs/embedding/index.d.ts.map +0 -1
- package/dist/cjs/embedding/index.js +0 -11
- package/dist/cjs/embedding/local.d.ts +0 -6
- package/dist/cjs/embedding/local.d.ts.map +0 -1
- package/dist/cjs/embedding/local.js +0 -28
- package/dist/cjs/embedding/openai.d.ts +0 -9
- package/dist/cjs/embedding/openai.d.ts.map +0 -1
- package/dist/cjs/embedding/openai.js +0 -26
- package/dist/cjs/events/console.d.ts +0 -25
- package/dist/cjs/events/console.d.ts.map +0 -1
- package/dist/cjs/events/console.js +0 -41
- package/dist/cjs/events/webhook.d.ts +0 -30
- package/dist/cjs/events/webhook.d.ts.map +0 -1
- package/dist/cjs/events/webhook.js +0 -79
- package/dist/cjs/memory/cloudflare/index.d.ts +0 -3
- package/dist/cjs/memory/cloudflare/index.d.ts.map +0 -1
- package/dist/cjs/memory/cloudflare/index.js +0 -5
- package/dist/cjs/memory/cloudflare/vectorize.d.ts +0 -62
- package/dist/cjs/memory/cloudflare/vectorize.d.ts.map +0 -1
- package/dist/cjs/memory/cloudflare/vectorize.js +0 -55
- package/dist/cjs/memory/in-memory-semantic.d.ts +0 -16
- package/dist/cjs/memory/in-memory-semantic.d.ts.map +0 -1
- package/dist/cjs/memory/in-memory-semantic.js +0 -57
- package/dist/cjs/memory/pinecone/index.d.ts +0 -7
- package/dist/cjs/memory/pinecone/index.d.ts.map +0 -1
- package/dist/cjs/memory/pinecone/index.js +0 -8
- package/dist/cjs/memory/pinecone/memory-adapter.d.ts +0 -62
- package/dist/cjs/memory/pinecone/memory-adapter.d.ts.map +0 -1
- package/dist/cjs/memory/pinecone/memory-adapter.js +0 -220
- package/dist/cjs/memory/pinecone/semantic.d.ts +0 -44
- package/dist/cjs/memory/pinecone/semantic.d.ts.map +0 -1
- package/dist/cjs/memory/pinecone/semantic.js +0 -90
- package/dist/cjs/memory/sqlite/index.d.ts +0 -3
- package/dist/cjs/memory/sqlite/index.d.ts.map +0 -1
- package/dist/cjs/memory/sqlite/index.js +0 -5
- package/dist/cjs/memory/sqlite/memory-adapter.d.ts +0 -58
- package/dist/cjs/memory/sqlite/memory-adapter.d.ts.map +0 -1
- package/dist/cjs/memory/sqlite/memory-adapter.js +0 -336
- package/dist/cjs/memory/sqlite/schema.d.ts +0 -4
- package/dist/cjs/memory/sqlite/schema.d.ts.map +0 -1
- package/dist/cjs/memory/sqlite/schema.js +0 -91
- package/dist/cjs/memory/supabase/index.d.ts +0 -7
- package/dist/cjs/memory/supabase/index.d.ts.map +0 -1
- package/dist/cjs/memory/supabase/index.js +0 -8
- package/dist/cjs/memory/supabase/memory-adapter.d.ts +0 -67
- package/dist/cjs/memory/supabase/memory-adapter.d.ts.map +0 -1
- package/dist/cjs/memory/supabase/memory-adapter.js +0 -335
- package/dist/cjs/memory/supabase/semantic.d.ts +0 -44
- package/dist/cjs/memory/supabase/semantic.d.ts.map +0 -1
- package/dist/cjs/memory/supabase/semantic.js +0 -72
- package/dist/esm/embedding/cloudflare.d.ts +0 -15
- package/dist/esm/embedding/cloudflare.d.ts.map +0 -1
- package/dist/esm/embedding/cloudflare.js +0 -13
- package/dist/esm/embedding/cohere.d.ts +0 -8
- package/dist/esm/embedding/cohere.d.ts.map +0 -1
- package/dist/esm/embedding/cohere.js +0 -28
- package/dist/esm/embedding/index.d.ts +0 -9
- package/dist/esm/embedding/index.d.ts.map +0 -1
- package/dist/esm/embedding/index.js +0 -4
- package/dist/esm/embedding/local.d.ts +0 -6
- package/dist/esm/embedding/local.d.ts.map +0 -1
- package/dist/esm/embedding/local.js +0 -25
- package/dist/esm/embedding/openai.d.ts +0 -9
- package/dist/esm/embedding/openai.d.ts.map +0 -1
- package/dist/esm/embedding/openai.js +0 -23
- package/dist/esm/events/console.d.ts +0 -25
- package/dist/esm/events/console.d.ts.map +0 -1
- package/dist/esm/events/console.js +0 -37
- package/dist/esm/events/webhook.d.ts +0 -30
- package/dist/esm/events/webhook.d.ts.map +0 -1
- package/dist/esm/events/webhook.js +0 -75
- package/dist/esm/memory/cloudflare/index.d.ts +0 -3
- package/dist/esm/memory/cloudflare/index.d.ts.map +0 -1
- package/dist/esm/memory/cloudflare/index.js +0 -1
- package/dist/esm/memory/cloudflare/vectorize.d.ts +0 -62
- package/dist/esm/memory/cloudflare/vectorize.d.ts.map +0 -1
- package/dist/esm/memory/cloudflare/vectorize.js +0 -51
- package/dist/esm/memory/in-memory-semantic.d.ts +0 -16
- package/dist/esm/memory/in-memory-semantic.d.ts.map +0 -1
- package/dist/esm/memory/in-memory-semantic.js +0 -53
- package/dist/esm/memory/pinecone/index.d.ts +0 -7
- package/dist/esm/memory/pinecone/index.d.ts.map +0 -1
- package/dist/esm/memory/pinecone/index.js +0 -3
- package/dist/esm/memory/pinecone/memory-adapter.d.ts +0 -62
- package/dist/esm/memory/pinecone/memory-adapter.d.ts.map +0 -1
- package/dist/esm/memory/pinecone/memory-adapter.js +0 -216
- package/dist/esm/memory/pinecone/semantic.d.ts +0 -44
- package/dist/esm/memory/pinecone/semantic.d.ts.map +0 -1
- package/dist/esm/memory/pinecone/semantic.js +0 -86
- package/dist/esm/memory/sqlite/index.d.ts +0 -3
- package/dist/esm/memory/sqlite/index.d.ts.map +0 -1
- package/dist/esm/memory/sqlite/index.js +0 -1
- package/dist/esm/memory/sqlite/memory-adapter.d.ts +0 -58
- package/dist/esm/memory/sqlite/memory-adapter.d.ts.map +0 -1
- package/dist/esm/memory/sqlite/memory-adapter.js +0 -296
- package/dist/esm/memory/sqlite/schema.d.ts +0 -4
- package/dist/esm/memory/sqlite/schema.d.ts.map +0 -1
- package/dist/esm/memory/sqlite/schema.js +0 -86
- package/dist/esm/memory/supabase/index.d.ts +0 -7
- package/dist/esm/memory/supabase/index.d.ts.map +0 -1
- package/dist/esm/memory/supabase/index.js +0 -3
- package/dist/esm/memory/supabase/memory-adapter.d.ts +0 -67
- package/dist/esm/memory/supabase/memory-adapter.d.ts.map +0 -1
- package/dist/esm/memory/supabase/memory-adapter.js +0 -331
- package/dist/esm/memory/supabase/semantic.d.ts +0 -44
- package/dist/esm/memory/supabase/semantic.d.ts.map +0 -1
- package/dist/esm/memory/supabase/semantic.js +0 -68
|
@@ -2,28 +2,22 @@ import type { LLMAdapter, GenerateTextOptions, GenerateObjectOptions } from '../
|
|
|
2
2
|
import type { VercelAIConfig } from './config';
|
|
3
3
|
/**
|
|
4
4
|
* Vercel AI SDK adapter for molroo.
|
|
5
|
-
*
|
|
5
|
+
* Wraps a pre-configured Vercel AI SDK provider instance.
|
|
6
6
|
*/
|
|
7
7
|
export declare class VercelAIAdapter implements LLMAdapter {
|
|
8
|
-
private
|
|
8
|
+
private provider;
|
|
9
|
+
private model?;
|
|
9
10
|
constructor(config: VercelAIConfig);
|
|
10
|
-
private getProvider;
|
|
11
|
-
/**
|
|
12
|
-
* Create a language model instance.
|
|
13
|
-
* For OpenAI-compatible APIs with custom baseUrl, uses .chat() to force
|
|
14
|
-
* Chat Completions API instead of the default Responses API.
|
|
15
|
-
*/
|
|
16
|
-
private getModel;
|
|
17
11
|
generateText(options: GenerateTextOptions): Promise<{
|
|
18
12
|
text: string;
|
|
19
13
|
}>;
|
|
20
14
|
generateObject<T>(options: GenerateObjectOptions<T>): Promise<{
|
|
21
15
|
object: T;
|
|
22
16
|
}>;
|
|
23
|
-
private getDefaultModel;
|
|
24
17
|
}
|
|
25
18
|
/**
|
|
26
19
|
* Factory function to create a VercelAIAdapter instance.
|
|
20
|
+
* @deprecated Create adapter directly: `new VercelAIAdapter({ provider })`
|
|
27
21
|
*/
|
|
28
22
|
export declare function createVercelAIAdapter(config: VercelAIConfig): VercelAIAdapter;
|
|
29
23
|
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../src/llm/vercel-ai/adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACzF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../src/llm/vercel-ai/adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACzF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAiD/C;;;GAGG;AACH,qBAAa,eAAgB,YAAW,UAAU;IAChD,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,KAAK,CAAC,CAAS;gBAEX,MAAM,EAAE,cAAc;IAK5B,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAYrE,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,CAAC,CAAA;KAAE,CAAC;CAiBnF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,eAAe,CAE7E"}
|
|
@@ -39,116 +39,18 @@ function strictifySchema(schema) {
|
|
|
39
39
|
function isZodSchema(schema) {
|
|
40
40
|
return schema && typeof schema === 'object' && '_def' in schema;
|
|
41
41
|
}
|
|
42
|
-
/**
|
|
43
|
-
* Recursively strip `$schema` keys from any object.
|
|
44
|
-
* AI SDK's Zod->JSON Schema converter adds `$schema` which some
|
|
45
|
-
* OpenAI-compatible APIs (e.g. Kimi/Moonshot) reject.
|
|
46
|
-
*/
|
|
47
|
-
function stripDollarSchema(obj) {
|
|
48
|
-
if (!obj || typeof obj !== 'object')
|
|
49
|
-
return obj;
|
|
50
|
-
if (Array.isArray(obj))
|
|
51
|
-
return obj.map(stripDollarSchema);
|
|
52
|
-
const result = {};
|
|
53
|
-
for (const [k, v] of Object.entries(obj)) {
|
|
54
|
-
if (k === '$schema')
|
|
55
|
-
continue;
|
|
56
|
-
result[k] = stripDollarSchema(v);
|
|
57
|
-
}
|
|
58
|
-
return result;
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Create a fetch wrapper that strips `$schema` from JSON request bodies.
|
|
62
|
-
* Used for OpenAI-compatible APIs that reject non-standard schema keywords.
|
|
63
|
-
*/
|
|
64
|
-
function createSchemaStrippingFetch() {
|
|
65
|
-
return async (input, init) => {
|
|
66
|
-
if (init?.body && typeof init.body === 'string') {
|
|
67
|
-
try {
|
|
68
|
-
const parsed = JSON.parse(init.body);
|
|
69
|
-
if (parsed.response_format?.json_schema?.schema) {
|
|
70
|
-
parsed.response_format.json_schema.schema =
|
|
71
|
-
stripDollarSchema(parsed.response_format.json_schema.schema);
|
|
72
|
-
init = { ...init, body: JSON.stringify(parsed) };
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
catch {
|
|
76
|
-
// Not JSON, pass through
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
const response = await globalThis.fetch(input, init);
|
|
80
|
-
// Debug: log error responses from provider
|
|
81
|
-
if (!response.ok && process.env.DEBUG_LLM) {
|
|
82
|
-
const cloned = response.clone();
|
|
83
|
-
try {
|
|
84
|
-
const body = await cloned.text();
|
|
85
|
-
console.error(`[adapter-llm] ${response.status} ${response.statusText}: ${body.slice(0, 500)}`);
|
|
86
|
-
}
|
|
87
|
-
catch { /* ignore */ }
|
|
88
|
-
}
|
|
89
|
-
return response;
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
42
|
/**
|
|
93
43
|
* Vercel AI SDK adapter for molroo.
|
|
94
|
-
*
|
|
44
|
+
* Wraps a pre-configured Vercel AI SDK provider instance.
|
|
95
45
|
*/
|
|
96
46
|
export class VercelAIAdapter {
|
|
97
47
|
constructor(config) {
|
|
98
|
-
this.
|
|
99
|
-
|
|
100
|
-
async getProvider() {
|
|
101
|
-
switch (this.config.provider) {
|
|
102
|
-
case 'openai': {
|
|
103
|
-
const { createOpenAI } = await import('@ai-sdk/openai');
|
|
104
|
-
return createOpenAI({
|
|
105
|
-
apiKey: this.config.apiKey,
|
|
106
|
-
...(this.config.baseUrl ? {
|
|
107
|
-
baseURL: this.config.baseUrl,
|
|
108
|
-
fetch: createSchemaStrippingFetch(),
|
|
109
|
-
} : {}),
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
case 'anthropic': {
|
|
113
|
-
const { createAnthropic } = await import('@ai-sdk/anthropic');
|
|
114
|
-
return createAnthropic({ apiKey: this.config.apiKey });
|
|
115
|
-
}
|
|
116
|
-
case 'openrouter': {
|
|
117
|
-
const { createOpenAI } = await import('@ai-sdk/openai');
|
|
118
|
-
return createOpenAI({
|
|
119
|
-
apiKey: this.config.apiKey,
|
|
120
|
-
baseURL: 'https://openrouter.ai/api/v1',
|
|
121
|
-
fetch: createSchemaStrippingFetch(),
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
case 'vertex': {
|
|
125
|
-
const { createVertex } = await import('@ai-sdk/google-vertex');
|
|
126
|
-
return createVertex({
|
|
127
|
-
project: this.config.projectId,
|
|
128
|
-
location: this.config.location || 'us-central1'
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
default:
|
|
132
|
-
throw new Error(`Unknown provider: ${this.config.provider}`);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Create a language model instance.
|
|
137
|
-
* For OpenAI-compatible APIs with custom baseUrl, uses .chat() to force
|
|
138
|
-
* Chat Completions API instead of the default Responses API.
|
|
139
|
-
*/
|
|
140
|
-
async getModel(modelName) {
|
|
141
|
-
const provider = await this.getProvider();
|
|
142
|
-
if (this.config.provider === 'openrouter' || (this.config.provider === 'openai' && this.config.baseUrl)) {
|
|
143
|
-
return provider.chat(modelName);
|
|
144
|
-
}
|
|
145
|
-
return provider(modelName);
|
|
48
|
+
this.provider = config.provider;
|
|
49
|
+
this.model = config.model;
|
|
146
50
|
}
|
|
147
51
|
async generateText(options) {
|
|
148
|
-
const modelName = this.config.model || this.getDefaultModel();
|
|
149
|
-
const model = await this.getModel(modelName);
|
|
150
52
|
const result = await generateTextAI({
|
|
151
|
-
model,
|
|
53
|
+
model: this.provider,
|
|
152
54
|
system: options.system,
|
|
153
55
|
messages: options.messages,
|
|
154
56
|
...(options.temperature !== undefined && { temperature: options.temperature }),
|
|
@@ -157,39 +59,24 @@ export class VercelAIAdapter {
|
|
|
157
59
|
return { text: result.text };
|
|
158
60
|
}
|
|
159
61
|
async generateObject(options) {
|
|
160
|
-
const modelName = this.config.model || this.getDefaultModel();
|
|
161
|
-
const model = await this.getModel(modelName);
|
|
162
62
|
// Zod schemas can be passed directly to AI SDK.
|
|
163
63
|
// Plain JSON schemas need strictification for OpenAI compatibility.
|
|
164
64
|
const resolvedSchema = isZodSchema(options.schema)
|
|
165
65
|
? options.schema
|
|
166
66
|
: jsonSchema(strictifySchema(options.schema));
|
|
167
|
-
// OpenRouter and custom baseUrl providers often don't support strict
|
|
168
|
-
// json_schema mode. Use tool calling mode which is more widely supported.
|
|
169
|
-
const isProxied = this.config.provider === 'openrouter' ||
|
|
170
|
-
(this.config.provider === 'openai' && !!this.config.baseUrl);
|
|
171
67
|
const result = await generateObject({
|
|
172
|
-
model,
|
|
68
|
+
model: this.provider,
|
|
173
69
|
schema: resolvedSchema,
|
|
174
70
|
system: options.system,
|
|
175
71
|
messages: options.messages,
|
|
176
|
-
...(isProxied && { mode: 'tool' }),
|
|
177
72
|
...(options.temperature !== undefined && { temperature: options.temperature }),
|
|
178
73
|
});
|
|
179
74
|
return { object: result.object };
|
|
180
75
|
}
|
|
181
|
-
getDefaultModel() {
|
|
182
|
-
switch (this.config.provider) {
|
|
183
|
-
case 'openai': return 'gpt-4o';
|
|
184
|
-
case 'anthropic': return 'claude-sonnet-4-5-20250929';
|
|
185
|
-
case 'openrouter': return 'anthropic/claude-sonnet-4-5';
|
|
186
|
-
case 'vertex': return 'gemini-2.0-flash';
|
|
187
|
-
default: return 'gpt-4o';
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
76
|
}
|
|
191
77
|
/**
|
|
192
78
|
* Factory function to create a VercelAIAdapter instance.
|
|
79
|
+
* @deprecated Create adapter directly: `new VercelAIAdapter({ provider })`
|
|
193
80
|
*/
|
|
194
81
|
export function createVercelAIAdapter(config) {
|
|
195
82
|
return new VercelAIAdapter(config);
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
import type { LanguageModel } from 'ai';
|
|
2
|
+
/**
|
|
3
|
+
* Configuration for VercelAIAdapter.
|
|
4
|
+
* Accepts a pre-configured Vercel AI SDK provider instance.
|
|
5
|
+
*/
|
|
1
6
|
export interface VercelAIConfig {
|
|
2
|
-
|
|
3
|
-
|
|
7
|
+
/** Pre-configured Vercel AI SDK provider instance (e.g., from createOpenAI()) */
|
|
8
|
+
provider: LanguageModel;
|
|
9
|
+
/** Default model name. If not provided, uses provider's default */
|
|
4
10
|
model?: string;
|
|
5
|
-
baseUrl?: string;
|
|
6
|
-
projectId?: string;
|
|
7
|
-
location?: string;
|
|
8
11
|
}
|
|
9
12
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/llm/vercel-ai/config.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/llm/vercel-ai/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAExC;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,iFAAiF;IACjF,QAAQ,EAAE,aAAa,CAAC;IACxB,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -1,46 +1,23 @@
|
|
|
1
|
-
import type { Episode } from '../types';
|
|
2
|
-
import type { EpisodeAdapter, EpisodeQuery, MemoryAdapter, RecallQuery, Reflection } from './types';
|
|
3
1
|
/**
|
|
4
|
-
* In-memory
|
|
5
|
-
*
|
|
6
|
-
* Useful for demos, testing, and prototyping. Data is lost on process exit
|
|
7
|
-
* unless explicitly serialized via `toJSON()` / `fromJSON()`.
|
|
8
|
-
*
|
|
9
|
-
* Can be used as:
|
|
10
|
-
* - `memory: { episodes: new InMemoryEpisodeAdapter() }` (split config)
|
|
11
|
-
* - `memory: new InMemoryEpisodeAdapter()` (single adapter)
|
|
2
|
+
* In-memory adapter for testing purposes.
|
|
3
|
+
* Not recommended for production use (data is lost on restart).
|
|
12
4
|
*/
|
|
13
|
-
|
|
5
|
+
import type { Episode, Reflection } from './types';
|
|
6
|
+
import type { MemoryAdapter, RecallQuery } from './types';
|
|
7
|
+
/**
|
|
8
|
+
* Simple in-memory adapter for testing.
|
|
9
|
+
* Stores episodes in memory only.
|
|
10
|
+
*/
|
|
11
|
+
export declare class InMemoryAdapter implements MemoryAdapter {
|
|
14
12
|
private episodes;
|
|
15
13
|
private reflections;
|
|
16
14
|
saveEpisode(episode: Episode): Promise<void>;
|
|
17
|
-
|
|
18
|
-
* Recall episodes by query.
|
|
19
|
-
* Accepts both `EpisodeQuery` (with `contextContains`) and `RecallQuery` (with `context`).
|
|
20
|
-
*/
|
|
21
|
-
recall(query: EpisodeQuery | RecallQuery): Promise<Episode[]>;
|
|
22
|
-
getByIds(ids: string[]): Promise<Episode[]>;
|
|
15
|
+
recall(query: RecallQuery): Promise<Episode[]>;
|
|
23
16
|
saveReflection(reflection: Reflection): Promise<void>;
|
|
24
|
-
getReflections(sourceEntity?: string
|
|
25
|
-
/**
|
|
26
|
-
toJSON(): {
|
|
27
|
-
episodes: Episode[];
|
|
28
|
-
reflections: Reflection[];
|
|
29
|
-
};
|
|
30
|
-
/** Restore data from a previous export. */
|
|
31
|
-
fromJSON(data: {
|
|
32
|
-
episodes?: Episode[];
|
|
33
|
-
reflections?: Reflection[];
|
|
34
|
-
}): void;
|
|
35
|
-
/** Number of stored episodes. */
|
|
36
|
-
get episodeCount(): number;
|
|
37
|
-
/** Number of stored reflections. */
|
|
38
|
-
get reflectionCount(): number;
|
|
39
|
-
/** Clear all data. */
|
|
17
|
+
getReflections(sourceEntity?: string): Promise<Reflection[]>;
|
|
18
|
+
/** Clear all stored data (for testing). */
|
|
40
19
|
clear(): void;
|
|
41
20
|
}
|
|
42
|
-
/** @deprecated Use
|
|
43
|
-
export declare const
|
|
44
|
-
/** @deprecated Use InMemoryEpisodeAdapter */
|
|
45
|
-
export type InMemoryEpisodeStore = InMemoryEpisodeAdapter;
|
|
21
|
+
/** @deprecated Use InMemoryAdapter */
|
|
22
|
+
export declare const InMemoryEpisodeAdapter: typeof InMemoryAdapter;
|
|
46
23
|
//# sourceMappingURL=in-memory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"in-memory.d.ts","sourceRoot":"","sources":["../../../src/memory/in-memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"in-memory.d.ts","sourceRoot":"","sources":["../../../src/memory/in-memory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE1D;;;GAGG;AACH,qBAAa,eAAgB,YAAW,aAAa;IACnD,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,WAAW,CAAoB;IAEjC,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAwB9C,cAAc,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAOlE,2CAA2C;IAC3C,KAAK,IAAI,IAAI;CAId;AAED,sCAAsC;AACtC,eAAO,MAAM,sBAAsB,wBAAkB,CAAC"}
|
|
@@ -1,111 +1,48 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Useful for demos, testing, and prototyping. Data is lost on process exit
|
|
5
|
-
* unless explicitly serialized via `toJSON()` / `fromJSON()`.
|
|
6
|
-
*
|
|
7
|
-
* Can be used as:
|
|
8
|
-
* - `memory: { episodes: new InMemoryEpisodeAdapter() }` (split config)
|
|
9
|
-
* - `memory: new InMemoryEpisodeAdapter()` (single adapter)
|
|
2
|
+
* Simple in-memory adapter for testing.
|
|
3
|
+
* Stores episodes in memory only.
|
|
10
4
|
*/
|
|
11
|
-
export class
|
|
5
|
+
export class InMemoryAdapter {
|
|
12
6
|
constructor() {
|
|
13
7
|
this.episodes = [];
|
|
14
8
|
this.reflections = [];
|
|
15
9
|
}
|
|
16
10
|
async saveEpisode(episode) {
|
|
17
|
-
|
|
18
|
-
if (idx >= 0) {
|
|
19
|
-
this.episodes[idx] = episode;
|
|
20
|
-
}
|
|
21
|
-
else {
|
|
22
|
-
this.episodes.push(episode);
|
|
23
|
-
}
|
|
11
|
+
this.episodes.push(episode);
|
|
24
12
|
}
|
|
25
|
-
/**
|
|
26
|
-
* Recall episodes by query.
|
|
27
|
-
* Accepts both `EpisodeQuery` (with `contextContains`) and `RecallQuery` (with `context`).
|
|
28
|
-
*/
|
|
29
13
|
async recall(query) {
|
|
30
14
|
let results = [...this.episodes];
|
|
31
15
|
if (query.sourceEntity) {
|
|
32
|
-
results = results.filter(
|
|
16
|
+
results = results.filter(ep => ep.sourceEntity === query.sourceEntity);
|
|
33
17
|
}
|
|
34
|
-
|
|
35
|
-
const contextSearch = ('contextContains' in query ? query.contextContains : undefined)
|
|
36
|
-
?? ('context' in query ? query.context : undefined);
|
|
37
|
-
if (contextSearch) {
|
|
38
|
-
const lower = contextSearch.toLowerCase();
|
|
39
|
-
results = results.filter(e => e.context?.toLowerCase().includes(lower));
|
|
40
|
-
}
|
|
41
|
-
if (query.type !== undefined) {
|
|
18
|
+
if (query.type) {
|
|
42
19
|
const types = Array.isArray(query.type) ? query.type : [query.type];
|
|
43
|
-
results = results.filter(
|
|
20
|
+
results = results.filter(ep => ep.type && types.includes(ep.type));
|
|
44
21
|
}
|
|
45
22
|
if (query.minImportance !== undefined) {
|
|
46
|
-
results = results.filter(
|
|
47
|
-
}
|
|
48
|
-
if (query.timeRange) {
|
|
49
|
-
const [from, to] = query.timeRange;
|
|
50
|
-
results = results.filter(e => e.timestamp >= from && e.timestamp <= to);
|
|
23
|
+
results = results.filter(ep => ep.importance >= query.minImportance);
|
|
51
24
|
}
|
|
52
|
-
|
|
53
|
-
const [min, max] = query.valenceRange;
|
|
54
|
-
results = results.filter(e => e.emotionSnapshot.V >= min && e.emotionSnapshot.V <= max);
|
|
55
|
-
}
|
|
56
|
-
// Sort by timestamp descending (most recent first)
|
|
25
|
+
// Sort by timestamp desc
|
|
57
26
|
results.sort((a, b) => b.timestamp - a.timestamp);
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const idSet = new Set(ids);
|
|
63
|
-
return this.episodes.filter(e => idSet.has(e.id));
|
|
27
|
+
if (query.limit) {
|
|
28
|
+
results = results.slice(0, query.limit);
|
|
29
|
+
}
|
|
30
|
+
return results;
|
|
64
31
|
}
|
|
65
32
|
async saveReflection(reflection) {
|
|
66
|
-
|
|
67
|
-
if (idx >= 0) {
|
|
68
|
-
this.reflections[idx] = reflection;
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
this.reflections.push(reflection);
|
|
72
|
-
}
|
|
33
|
+
this.reflections.push(reflection);
|
|
73
34
|
}
|
|
74
|
-
async getReflections(sourceEntity
|
|
75
|
-
let results = [...this.reflections];
|
|
35
|
+
async getReflections(sourceEntity) {
|
|
76
36
|
if (sourceEntity) {
|
|
77
|
-
|
|
37
|
+
return this.reflections.filter(r => r.sourceEntity === sourceEntity);
|
|
78
38
|
}
|
|
79
|
-
|
|
80
|
-
results.sort((a, b) => b.timestamp - a.timestamp);
|
|
81
|
-
return results.slice(0, limit ?? 10);
|
|
82
|
-
}
|
|
83
|
-
// ── Serialization helpers ──
|
|
84
|
-
/** Export all data for persistence (save slots, etc.). */
|
|
85
|
-
toJSON() {
|
|
86
|
-
return {
|
|
87
|
-
episodes: [...this.episodes],
|
|
88
|
-
reflections: [...this.reflections],
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
/** Restore data from a previous export. */
|
|
92
|
-
fromJSON(data) {
|
|
93
|
-
this.episodes = data.episodes ? [...data.episodes] : [];
|
|
94
|
-
this.reflections = data.reflections ? [...data.reflections] : [];
|
|
95
|
-
}
|
|
96
|
-
/** Number of stored episodes. */
|
|
97
|
-
get episodeCount() {
|
|
98
|
-
return this.episodes.length;
|
|
99
|
-
}
|
|
100
|
-
/** Number of stored reflections. */
|
|
101
|
-
get reflectionCount() {
|
|
102
|
-
return this.reflections.length;
|
|
39
|
+
return [...this.reflections];
|
|
103
40
|
}
|
|
104
|
-
/** Clear all data. */
|
|
41
|
+
/** Clear all stored data (for testing). */
|
|
105
42
|
clear() {
|
|
106
43
|
this.episodes = [];
|
|
107
44
|
this.reflections = [];
|
|
108
45
|
}
|
|
109
46
|
}
|
|
110
|
-
/** @deprecated Use
|
|
111
|
-
export const
|
|
47
|
+
/** @deprecated Use InMemoryAdapter */
|
|
48
|
+
export const InMemoryEpisodeAdapter = InMemoryAdapter;
|
|
@@ -1,20 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared memory recall and prompt-building utilities.
|
|
3
3
|
*
|
|
4
|
-
* Used by
|
|
5
|
-
* format them for LLM system prompts.
|
|
6
|
-
* - Single MemoryAdapter (new, preferred)
|
|
7
|
-
* - Split EpisodeAdapter + SemanticAdapter + EmbeddingAdapter (backward compat)
|
|
4
|
+
* Used by Molroo to recall episodic/semantic memories and
|
|
5
|
+
* format them for LLM system prompts.
|
|
8
6
|
*/
|
|
9
7
|
import type { Episode } from '../types';
|
|
10
|
-
import type {
|
|
8
|
+
import type { MemoryAdapter, Reflection } from './types';
|
|
11
9
|
/**
|
|
12
10
|
* Strip leading `[...]` metadata tags from text before embedding.
|
|
13
11
|
* These tags (channel info, scene hints, timestamps) add noise to
|
|
14
12
|
* semantic similarity and should not influence vector search.
|
|
15
13
|
*/
|
|
16
14
|
export declare function stripMetaTags(text: string): string;
|
|
17
|
-
/** Recall
|
|
15
|
+
/** Recall configuration. */
|
|
18
16
|
export interface RecallConfig {
|
|
19
17
|
episodicLimit?: number;
|
|
20
18
|
semanticLimit?: number;
|
|
@@ -30,25 +28,16 @@ export interface RecallResult {
|
|
|
30
28
|
reflections: Reflection[];
|
|
31
29
|
}
|
|
32
30
|
/**
|
|
33
|
-
* Recall episodic + semantic + reflection memories
|
|
34
|
-
*
|
|
35
|
-
* Supports two paths:
|
|
36
|
-
* 1. Single MemoryAdapter (`memoryAdapter` param) — adapter handles everything
|
|
37
|
-
* 2. Split stores (`episodeStore` + `semanticStore` + `embeddingProvider`) — legacy
|
|
31
|
+
* Recall episodic + semantic + reflection memories from a MemoryAdapter.
|
|
38
32
|
*
|
|
39
33
|
* @param message - Current user message (used for semantic embedding).
|
|
40
|
-
* @param
|
|
34
|
+
* @param adapter - MemoryAdapter instance.
|
|
35
|
+
* @param config - Recall configuration.
|
|
36
|
+
* @param sourceEntity - Filter episodes by source entity.
|
|
37
|
+
* @param reflectionEntity - Filter reflections by entity.
|
|
41
38
|
* @returns Recalled memories grouped by type.
|
|
42
39
|
*/
|
|
43
|
-
export declare function recallMemories(message: string,
|
|
44
|
-
memoryAdapter?: MemoryAdapter | null;
|
|
45
|
-
episodeStore: EpisodeAdapter | null;
|
|
46
|
-
semanticStore: SemanticAdapter | null;
|
|
47
|
-
embeddingProvider: EmbeddingAdapter | null;
|
|
48
|
-
config?: RecallConfig;
|
|
49
|
-
sourceEntity?: string;
|
|
50
|
-
reflectionEntity?: string;
|
|
51
|
-
}): Promise<RecallResult>;
|
|
40
|
+
export declare function recallMemories(message: string, adapter: MemoryAdapter, config?: RecallConfig, sourceEntity?: string, reflectionEntity?: string): Promise<RecallResult>;
|
|
52
41
|
/**
|
|
53
42
|
* Format recalled memories into a text block for LLM system prompt injection.
|
|
54
43
|
* Groups episodic memories by type: conversations vs events.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../../../src/memory/recall.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../../../src/memory/recall.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAgB,MAAM,SAAS,CAAC;AAEvE;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,4BAA4B;AAC5B,MAAM,WAAW,YAAY;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,2CAA2C;AAC3C,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa,EACtB,MAAM,GAAE,YAAiB,EACzB,YAAY,CAAC,EAAE,MAAM,EACrB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,YAAY,CAAC,CAkEvB;AAcD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,gBAAgB,CAAC,EAAE,OAAO,EAAE,EAC5B,gBAAgB,CAAC,EAAE,OAAO,EAAE,EAC5B,WAAW,CAAC,EAAE,UAAU,EAAE,GACzB,MAAM,CAwCR"}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared memory recall and prompt-building utilities.
|
|
3
3
|
*
|
|
4
|
-
* Used by
|
|
5
|
-
* format them for LLM system prompts.
|
|
6
|
-
* - Single MemoryAdapter (new, preferred)
|
|
7
|
-
* - Split EpisodeAdapter + SemanticAdapter + EmbeddingAdapter (backward compat)
|
|
4
|
+
* Used by Molroo to recall episodic/semantic memories and
|
|
5
|
+
* format them for LLM system prompts.
|
|
8
6
|
*/
|
|
9
7
|
/**
|
|
10
8
|
* Strip leading `[...]` metadata tags from text before embedding.
|
|
@@ -15,10 +13,16 @@ export function stripMetaTags(text) {
|
|
|
15
13
|
return text.replace(/^\s*(\[.*?\]\s*)+/s, '').trim();
|
|
16
14
|
}
|
|
17
15
|
/**
|
|
18
|
-
* Recall
|
|
19
|
-
*
|
|
16
|
+
* Recall episodic + semantic + reflection memories from a MemoryAdapter.
|
|
17
|
+
*
|
|
18
|
+
* @param message - Current user message (used for semantic embedding).
|
|
19
|
+
* @param adapter - MemoryAdapter instance.
|
|
20
|
+
* @param config - Recall configuration.
|
|
21
|
+
* @param sourceEntity - Filter episodes by source entity.
|
|
22
|
+
* @param reflectionEntity - Filter reflections by entity.
|
|
23
|
+
* @returns Recalled memories grouped by type.
|
|
20
24
|
*/
|
|
21
|
-
async function
|
|
25
|
+
export async function recallMemories(message, adapter, config = {}, sourceEntity, reflectionEntity) {
|
|
22
26
|
const episodicLimit = config.episodicLimit ?? 5;
|
|
23
27
|
const semanticLimit = config.semanticLimit ?? 3;
|
|
24
28
|
const reflectionLimit = config.reflectionLimit ?? 3;
|
|
@@ -48,7 +52,7 @@ async function recallFromAdapter(message, adapter, config, sourceEntity, reflect
|
|
|
48
52
|
? adapter
|
|
49
53
|
.semanticRecall(stripMetaTags(message), {
|
|
50
54
|
topK: semanticLimit,
|
|
51
|
-
|
|
55
|
+
minImportance,
|
|
52
56
|
})
|
|
53
57
|
.catch(() => [])
|
|
54
58
|
: Promise.resolve([]);
|
|
@@ -78,89 +82,6 @@ async function recallFromAdapter(message, adapter, config, sourceEntity, reflect
|
|
|
78
82
|
episodic.splice(episodicLimit);
|
|
79
83
|
return { episodic, semantic, reflections };
|
|
80
84
|
}
|
|
81
|
-
/**
|
|
82
|
-
* Recall episodic + semantic + reflection memories in parallel.
|
|
83
|
-
*
|
|
84
|
-
* Supports two paths:
|
|
85
|
-
* 1. Single MemoryAdapter (`memoryAdapter` param) — adapter handles everything
|
|
86
|
-
* 2. Split stores (`episodeStore` + `semanticStore` + `embeddingProvider`) — legacy
|
|
87
|
-
*
|
|
88
|
-
* @param message - Current user message (used for semantic embedding).
|
|
89
|
-
* @param opts - Stores, provider, config, and entity filter.
|
|
90
|
-
* @returns Recalled memories grouped by type.
|
|
91
|
-
*/
|
|
92
|
-
export async function recallMemories(message, opts) {
|
|
93
|
-
const config = opts.config ?? {};
|
|
94
|
-
// Path 1: Single MemoryAdapter
|
|
95
|
-
if (opts.memoryAdapter) {
|
|
96
|
-
return recallFromAdapter(message, opts.memoryAdapter, config, opts.sourceEntity, opts.reflectionEntity);
|
|
97
|
-
}
|
|
98
|
-
// Path 2: Split stores (backward compat)
|
|
99
|
-
const { episodeStore, semanticStore, embeddingProvider } = opts;
|
|
100
|
-
const episodicLimit = config.episodicLimit ?? 5;
|
|
101
|
-
const semanticLimit = config.semanticLimit ?? 3;
|
|
102
|
-
const reflectionLimit = config.reflectionLimit ?? 3;
|
|
103
|
-
const minImportance = config.minImportance ?? 0;
|
|
104
|
-
// Episodic recall — conversations (filtered by sourceEntity)
|
|
105
|
-
const conversationP = episodeStore
|
|
106
|
-
? episodeStore
|
|
107
|
-
.recall({
|
|
108
|
-
sourceEntity: opts.sourceEntity,
|
|
109
|
-
limit: episodicLimit,
|
|
110
|
-
minImportance,
|
|
111
|
-
...(config.types ? { type: config.types } : {}),
|
|
112
|
-
})
|
|
113
|
-
.catch(() => [])
|
|
114
|
-
: Promise.resolve([]);
|
|
115
|
-
// Episodic recall — non-chat events (no sourceEntity filter).
|
|
116
|
-
// Events like attacks/gifts come from various entities and must be
|
|
117
|
-
// recalled regardless of who the persona is currently talking to.
|
|
118
|
-
const hasTypeFilter = config.types && config.types.length > 0;
|
|
119
|
-
const eventP = (episodeStore && !hasTypeFilter)
|
|
120
|
-
? episodeStore
|
|
121
|
-
.recall({
|
|
122
|
-
// No sourceEntity — recall events from all sources
|
|
123
|
-
limit: episodicLimit,
|
|
124
|
-
minImportance,
|
|
125
|
-
})
|
|
126
|
-
.then((all) => all.filter((ep) => ep.type && ep.type !== 'chat_message'))
|
|
127
|
-
.catch(() => [])
|
|
128
|
-
: Promise.resolve([]);
|
|
129
|
-
// Semantic recall (vector)
|
|
130
|
-
const semanticP = semanticStore && embeddingProvider && episodeStore?.getByIds
|
|
131
|
-
? embeddingProvider
|
|
132
|
-
.embed(stripMetaTags(message))
|
|
133
|
-
.then((embedding) => semanticStore.search({ embedding, topK: semanticLimit, filter: { minImportance } }))
|
|
134
|
-
.then((results) => results.length > 0
|
|
135
|
-
? episodeStore.getByIds(results.map((r) => r.id))
|
|
136
|
-
: [])
|
|
137
|
-
.catch(() => [])
|
|
138
|
-
: Promise.resolve([]);
|
|
139
|
-
// Reflection recall (RDB)
|
|
140
|
-
const reflectionP = episodeStore
|
|
141
|
-
? episodeStore
|
|
142
|
-
.getReflections(opts.reflectionEntity, reflectionLimit)
|
|
143
|
-
.catch(() => [])
|
|
144
|
-
: Promise.resolve([]);
|
|
145
|
-
const [conversations, events, semantic, reflections] = await Promise.all([
|
|
146
|
-
conversationP,
|
|
147
|
-
eventP,
|
|
148
|
-
semanticP,
|
|
149
|
-
reflectionP,
|
|
150
|
-
]);
|
|
151
|
-
// Merge conversations + events, deduplicate, and re-sort by recency
|
|
152
|
-
const seenIds = new Set();
|
|
153
|
-
const episodic = [];
|
|
154
|
-
for (const ep of [...conversations, ...events]) {
|
|
155
|
-
if (!seenIds.has(ep.id)) {
|
|
156
|
-
seenIds.add(ep.id);
|
|
157
|
-
episodic.push(ep);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
episodic.sort((a, b) => b.timestamp - a.timestamp);
|
|
161
|
-
episodic.splice(episodicLimit);
|
|
162
|
-
return { episodic, semantic, reflections };
|
|
163
|
-
}
|
|
164
85
|
/** Format a single episode into a display line. */
|
|
165
86
|
function formatEpisodeLine(ep) {
|
|
166
87
|
const v = ep.emotionSnapshot;
|