@molroo-io/sdk 0.5.2
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 +251 -0
- package/dist/cjs/api-client.d.ts +23 -0
- package/dist/cjs/api-client.d.ts.map +1 -0
- package/dist/cjs/api-client.js +55 -0
- package/dist/cjs/defaults/index.d.ts +8 -0
- package/dist/cjs/defaults/index.d.ts.map +1 -0
- package/dist/cjs/defaults/index.js +30 -0
- package/dist/cjs/defaults/persona.json +17 -0
- package/dist/cjs/embedding/cloudflare.d.ts +15 -0
- package/dist/cjs/embedding/cloudflare.d.ts.map +1 -0
- package/dist/cjs/embedding/cloudflare.js +16 -0
- package/dist/cjs/embedding/cohere.d.ts +8 -0
- package/dist/cjs/embedding/cohere.d.ts.map +1 -0
- package/dist/cjs/embedding/cohere.js +31 -0
- package/dist/cjs/embedding/index.d.ts +9 -0
- package/dist/cjs/embedding/index.d.ts.map +1 -0
- package/dist/cjs/embedding/index.js +11 -0
- package/dist/cjs/embedding/local.d.ts +6 -0
- package/dist/cjs/embedding/local.d.ts.map +1 -0
- package/dist/cjs/embedding/local.js +28 -0
- package/dist/cjs/embedding/openai.d.ts +9 -0
- package/dist/cjs/embedding/openai.d.ts.map +1 -0
- package/dist/cjs/embedding/openai.js +26 -0
- package/dist/cjs/errors.d.ts +17 -0
- package/dist/cjs/errors.d.ts.map +1 -0
- package/dist/cjs/errors.js +21 -0
- package/dist/cjs/events/console.d.ts +25 -0
- package/dist/cjs/events/console.d.ts.map +1 -0
- package/dist/cjs/events/console.js +41 -0
- package/dist/cjs/events/types.d.ts +28 -0
- package/dist/cjs/events/types.d.ts.map +1 -0
- package/dist/cjs/events/types.js +13 -0
- package/dist/cjs/events/webhook.d.ts +30 -0
- package/dist/cjs/events/webhook.d.ts.map +1 -0
- package/dist/cjs/events/webhook.js +79 -0
- package/dist/cjs/generate/persona.d.ts +16 -0
- package/dist/cjs/generate/persona.d.ts.map +1 -0
- package/dist/cjs/generate/persona.js +42 -0
- package/dist/cjs/generate/prompt.d.ts +7 -0
- package/dist/cjs/generate/prompt.d.ts.map +1 -0
- package/dist/cjs/generate/prompt.js +41 -0
- package/dist/cjs/generate/schema.d.ts +32 -0
- package/dist/cjs/generate/schema.d.ts.map +1 -0
- package/dist/cjs/generate/schema.js +54 -0
- package/dist/cjs/generated/index.d.ts +2 -0
- package/dist/cjs/generated/index.d.ts.map +1 -0
- package/dist/cjs/generated/index.js +2 -0
- package/dist/cjs/index.d.ts +66 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +69 -0
- package/dist/cjs/llm/adapter.d.ts +61 -0
- package/dist/cjs/llm/adapter.d.ts.map +1 -0
- package/dist/cjs/llm/adapter.js +2 -0
- package/dist/cjs/llm/resolve.d.ts +28 -0
- package/dist/cjs/llm/resolve.d.ts.map +1 -0
- package/dist/cjs/llm/resolve.js +20 -0
- package/dist/cjs/llm/schema.d.ts +60 -0
- package/dist/cjs/llm/schema.d.ts.map +1 -0
- package/dist/cjs/llm/schema.js +72 -0
- package/dist/cjs/llm/types.d.ts +24 -0
- package/dist/cjs/llm/types.d.ts.map +1 -0
- package/dist/cjs/llm/types.js +2 -0
- package/dist/cjs/llm/vercel-ai/adapter.d.ts +29 -0
- package/dist/cjs/llm/vercel-ai/adapter.d.ts.map +1 -0
- package/dist/cjs/llm/vercel-ai/adapter.js +234 -0
- package/dist/cjs/llm/vercel-ai/config.d.ts +9 -0
- package/dist/cjs/llm/vercel-ai/config.d.ts.map +1 -0
- package/dist/cjs/llm/vercel-ai/config.js +2 -0
- package/dist/cjs/llm/vercel-ai/index.d.ts +9 -0
- package/dist/cjs/llm/vercel-ai/index.d.ts.map +1 -0
- package/dist/cjs/llm/vercel-ai/index.js +13 -0
- package/dist/cjs/memory/cloudflare/index.d.ts +3 -0
- package/dist/cjs/memory/cloudflare/index.d.ts.map +1 -0
- package/dist/cjs/memory/cloudflare/index.js +5 -0
- package/dist/cjs/memory/cloudflare/vectorize.d.ts +62 -0
- package/dist/cjs/memory/cloudflare/vectorize.d.ts.map +1 -0
- package/dist/cjs/memory/cloudflare/vectorize.js +55 -0
- package/dist/cjs/memory/in-memory-semantic.d.ts +16 -0
- package/dist/cjs/memory/in-memory-semantic.d.ts.map +1 -0
- package/dist/cjs/memory/in-memory-semantic.js +57 -0
- package/dist/cjs/memory/in-memory.d.ts +46 -0
- package/dist/cjs/memory/in-memory.d.ts.map +1 -0
- package/dist/cjs/memory/in-memory.js +115 -0
- package/dist/cjs/memory/pinecone/index.d.ts +7 -0
- package/dist/cjs/memory/pinecone/index.d.ts.map +1 -0
- package/dist/cjs/memory/pinecone/index.js +8 -0
- package/dist/cjs/memory/pinecone/memory-adapter.d.ts +62 -0
- package/dist/cjs/memory/pinecone/memory-adapter.d.ts.map +1 -0
- package/dist/cjs/memory/pinecone/memory-adapter.js +220 -0
- package/dist/cjs/memory/pinecone/semantic.d.ts +44 -0
- package/dist/cjs/memory/pinecone/semantic.d.ts.map +1 -0
- package/dist/cjs/memory/pinecone/semantic.js +90 -0
- package/dist/cjs/memory/recall.d.ts +58 -0
- package/dist/cjs/memory/recall.d.ts.map +1 -0
- package/dist/cjs/memory/recall.js +220 -0
- package/dist/cjs/memory/semantic.d.ts +24 -0
- package/dist/cjs/memory/semantic.d.ts.map +1 -0
- package/dist/cjs/memory/semantic.js +2 -0
- package/dist/cjs/memory/sqlite/index.d.ts +3 -0
- package/dist/cjs/memory/sqlite/index.d.ts.map +1 -0
- package/dist/cjs/memory/sqlite/index.js +5 -0
- package/dist/cjs/memory/sqlite/memory-adapter.d.ts +58 -0
- package/dist/cjs/memory/sqlite/memory-adapter.d.ts.map +1 -0
- package/dist/cjs/memory/sqlite/memory-adapter.js +336 -0
- package/dist/cjs/memory/sqlite/schema.d.ts +4 -0
- package/dist/cjs/memory/sqlite/schema.d.ts.map +1 -0
- package/dist/cjs/memory/sqlite/schema.js +91 -0
- package/dist/cjs/memory/supabase/index.d.ts +7 -0
- package/dist/cjs/memory/supabase/index.d.ts.map +1 -0
- package/dist/cjs/memory/supabase/index.js +8 -0
- package/dist/cjs/memory/supabase/memory-adapter.d.ts +67 -0
- package/dist/cjs/memory/supabase/memory-adapter.d.ts.map +1 -0
- package/dist/cjs/memory/supabase/memory-adapter.js +335 -0
- package/dist/cjs/memory/supabase/semantic.d.ts +44 -0
- package/dist/cjs/memory/supabase/semantic.d.ts.map +1 -0
- package/dist/cjs/memory/supabase/semantic.js +72 -0
- package/dist/cjs/memory/types.d.ts +231 -0
- package/dist/cjs/memory/types.d.ts.map +1 -0
- package/dist/cjs/memory/types.js +12 -0
- package/dist/cjs/persona.d.ts +326 -0
- package/dist/cjs/persona.d.ts.map +1 -0
- package/dist/cjs/persona.js +824 -0
- package/dist/cjs/types.d.ts +263 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +15 -0
- package/dist/cjs/world/client.d.ts +36 -0
- package/dist/cjs/world/client.d.ts.map +1 -0
- package/dist/cjs/world/client.js +59 -0
- package/dist/cjs/world/errors.d.ts +9 -0
- package/dist/cjs/world/errors.d.ts.map +1 -0
- package/dist/cjs/world/errors.js +15 -0
- package/dist/cjs/world/index.d.ts +10 -0
- package/dist/cjs/world/index.d.ts.map +1 -0
- package/dist/cjs/world/index.js +16 -0
- package/dist/cjs/world/types.d.ts +101 -0
- package/dist/cjs/world/types.d.ts.map +1 -0
- package/dist/cjs/world/types.js +8 -0
- package/dist/cjs/world/village.d.ts +75 -0
- package/dist/cjs/world/village.d.ts.map +1 -0
- package/dist/cjs/world/village.js +278 -0
- package/dist/cjs/world/world-persona.d.ts +182 -0
- package/dist/cjs/world/world-persona.d.ts.map +1 -0
- package/dist/cjs/world/world-persona.js +192 -0
- package/dist/cjs/world/world.d.ts +41 -0
- package/dist/cjs/world/world.d.ts.map +1 -0
- package/dist/cjs/world/world.js +91 -0
- package/dist/esm/api-client.d.ts +23 -0
- package/dist/esm/api-client.d.ts.map +1 -0
- package/dist/esm/api-client.js +48 -0
- package/dist/esm/defaults/index.d.ts +8 -0
- package/dist/esm/defaults/index.d.ts.map +1 -0
- package/dist/esm/defaults/index.js +23 -0
- package/dist/esm/defaults/persona.json +17 -0
- package/dist/esm/embedding/cloudflare.d.ts +15 -0
- package/dist/esm/embedding/cloudflare.d.ts.map +1 -0
- package/dist/esm/embedding/cloudflare.js +13 -0
- package/dist/esm/embedding/cohere.d.ts +8 -0
- package/dist/esm/embedding/cohere.d.ts.map +1 -0
- package/dist/esm/embedding/cohere.js +28 -0
- package/dist/esm/embedding/index.d.ts +9 -0
- package/dist/esm/embedding/index.d.ts.map +1 -0
- package/dist/esm/embedding/index.js +4 -0
- package/dist/esm/embedding/local.d.ts +6 -0
- package/dist/esm/embedding/local.d.ts.map +1 -0
- package/dist/esm/embedding/local.js +25 -0
- package/dist/esm/embedding/openai.d.ts +9 -0
- package/dist/esm/embedding/openai.d.ts.map +1 -0
- package/dist/esm/embedding/openai.js +23 -0
- package/dist/esm/errors.d.ts +17 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +17 -0
- package/dist/esm/events/console.d.ts +25 -0
- package/dist/esm/events/console.d.ts.map +1 -0
- package/dist/esm/events/console.js +37 -0
- package/dist/esm/events/types.d.ts +28 -0
- package/dist/esm/events/types.d.ts.map +1 -0
- package/dist/esm/events/types.js +12 -0
- package/dist/esm/events/webhook.d.ts +30 -0
- package/dist/esm/events/webhook.d.ts.map +1 -0
- package/dist/esm/events/webhook.js +75 -0
- package/dist/esm/generate/persona.d.ts +16 -0
- package/dist/esm/generate/persona.d.ts.map +1 -0
- package/dist/esm/generate/persona.js +39 -0
- package/dist/esm/generate/prompt.d.ts +7 -0
- package/dist/esm/generate/prompt.d.ts.map +1 -0
- package/dist/esm/generate/prompt.js +38 -0
- package/dist/esm/generate/schema.d.ts +32 -0
- package/dist/esm/generate/schema.d.ts.map +1 -0
- package/dist/esm/generate/schema.js +51 -0
- package/dist/esm/generated/index.d.ts +2 -0
- package/dist/esm/generated/index.d.ts.map +1 -0
- package/dist/esm/generated/index.js +1 -0
- package/dist/esm/index.d.ts +66 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +49 -0
- package/dist/esm/llm/adapter.d.ts +61 -0
- package/dist/esm/llm/adapter.d.ts.map +1 -0
- package/dist/esm/llm/adapter.js +1 -0
- package/dist/esm/llm/resolve.d.ts +28 -0
- package/dist/esm/llm/resolve.d.ts.map +1 -0
- package/dist/esm/llm/resolve.js +17 -0
- package/dist/esm/llm/schema.d.ts +60 -0
- package/dist/esm/llm/schema.d.ts.map +1 -0
- package/dist/esm/llm/schema.js +69 -0
- package/dist/esm/llm/types.d.ts +24 -0
- package/dist/esm/llm/types.d.ts.map +1 -0
- package/dist/esm/llm/types.js +1 -0
- package/dist/esm/llm/vercel-ai/adapter.d.ts +29 -0
- package/dist/esm/llm/vercel-ai/adapter.d.ts.map +1 -0
- package/dist/esm/llm/vercel-ai/adapter.js +196 -0
- package/dist/esm/llm/vercel-ai/config.d.ts +9 -0
- package/dist/esm/llm/vercel-ai/config.d.ts.map +1 -0
- package/dist/esm/llm/vercel-ai/config.js +1 -0
- package/dist/esm/llm/vercel-ai/index.d.ts +9 -0
- package/dist/esm/llm/vercel-ai/index.d.ts.map +1 -0
- package/dist/esm/llm/vercel-ai/index.js +8 -0
- package/dist/esm/memory/cloudflare/index.d.ts +3 -0
- package/dist/esm/memory/cloudflare/index.d.ts.map +1 -0
- package/dist/esm/memory/cloudflare/index.js +1 -0
- package/dist/esm/memory/cloudflare/vectorize.d.ts +62 -0
- package/dist/esm/memory/cloudflare/vectorize.d.ts.map +1 -0
- package/dist/esm/memory/cloudflare/vectorize.js +51 -0
- package/dist/esm/memory/in-memory-semantic.d.ts +16 -0
- package/dist/esm/memory/in-memory-semantic.d.ts.map +1 -0
- package/dist/esm/memory/in-memory-semantic.js +53 -0
- package/dist/esm/memory/in-memory.d.ts +46 -0
- package/dist/esm/memory/in-memory.d.ts.map +1 -0
- package/dist/esm/memory/in-memory.js +111 -0
- package/dist/esm/memory/pinecone/index.d.ts +7 -0
- package/dist/esm/memory/pinecone/index.d.ts.map +1 -0
- package/dist/esm/memory/pinecone/index.js +3 -0
- package/dist/esm/memory/pinecone/memory-adapter.d.ts +62 -0
- package/dist/esm/memory/pinecone/memory-adapter.d.ts.map +1 -0
- package/dist/esm/memory/pinecone/memory-adapter.js +216 -0
- package/dist/esm/memory/pinecone/semantic.d.ts +44 -0
- package/dist/esm/memory/pinecone/semantic.d.ts.map +1 -0
- package/dist/esm/memory/pinecone/semantic.js +86 -0
- package/dist/esm/memory/recall.d.ts +58 -0
- package/dist/esm/memory/recall.d.ts.map +1 -0
- package/dist/esm/memory/recall.js +215 -0
- package/dist/esm/memory/semantic.d.ts +24 -0
- package/dist/esm/memory/semantic.d.ts.map +1 -0
- package/dist/esm/memory/semantic.js +1 -0
- package/dist/esm/memory/sqlite/index.d.ts +3 -0
- package/dist/esm/memory/sqlite/index.d.ts.map +1 -0
- package/dist/esm/memory/sqlite/index.js +1 -0
- package/dist/esm/memory/sqlite/memory-adapter.d.ts +58 -0
- package/dist/esm/memory/sqlite/memory-adapter.d.ts.map +1 -0
- package/dist/esm/memory/sqlite/memory-adapter.js +296 -0
- package/dist/esm/memory/sqlite/schema.d.ts +4 -0
- package/dist/esm/memory/sqlite/schema.d.ts.map +1 -0
- package/dist/esm/memory/sqlite/schema.js +86 -0
- package/dist/esm/memory/supabase/index.d.ts +7 -0
- package/dist/esm/memory/supabase/index.d.ts.map +1 -0
- package/dist/esm/memory/supabase/index.js +3 -0
- package/dist/esm/memory/supabase/memory-adapter.d.ts +67 -0
- package/dist/esm/memory/supabase/memory-adapter.d.ts.map +1 -0
- package/dist/esm/memory/supabase/memory-adapter.js +331 -0
- package/dist/esm/memory/supabase/semantic.d.ts +44 -0
- package/dist/esm/memory/supabase/semantic.d.ts.map +1 -0
- package/dist/esm/memory/supabase/semantic.js +68 -0
- package/dist/esm/memory/types.d.ts +231 -0
- package/dist/esm/memory/types.d.ts.map +1 -0
- package/dist/esm/memory/types.js +9 -0
- package/dist/esm/persona.d.ts +326 -0
- package/dist/esm/persona.d.ts.map +1 -0
- package/dist/esm/persona.js +787 -0
- package/dist/esm/types.d.ts +263 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +11 -0
- package/dist/esm/world/client.d.ts +36 -0
- package/dist/esm/world/client.d.ts.map +1 -0
- package/dist/esm/world/client.js +52 -0
- package/dist/esm/world/errors.d.ts +9 -0
- package/dist/esm/world/errors.d.ts.map +1 -0
- package/dist/esm/world/errors.js +11 -0
- package/dist/esm/world/index.d.ts +10 -0
- package/dist/esm/world/index.d.ts.map +1 -0
- package/dist/esm/world/index.js +8 -0
- package/dist/esm/world/types.d.ts +101 -0
- package/dist/esm/world/types.d.ts.map +1 -0
- package/dist/esm/world/types.js +7 -0
- package/dist/esm/world/village.d.ts +75 -0
- package/dist/esm/world/village.d.ts.map +1 -0
- package/dist/esm/world/village.js +274 -0
- package/dist/esm/world/world-persona.d.ts +182 -0
- package/dist/esm/world/world-persona.d.ts.map +1 -0
- package/dist/esm/world/world-persona.js +188 -0
- package/dist/esm/world/world.d.ts +41 -0
- package/dist/esm/world/world.d.ts.map +1 -0
- package/dist/esm/world/world.js +87 -0
- package/package.json +207 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { createHmac } from 'node:crypto';
|
|
2
|
+
/**
|
|
3
|
+
* Webhook-based EventAdapter for production event delivery.
|
|
4
|
+
* Sends events as POST requests with optional HMAC signing and retry.
|
|
5
|
+
*/
|
|
6
|
+
export class WebhookEventAdapter {
|
|
7
|
+
constructor(options) {
|
|
8
|
+
this.url = options.url;
|
|
9
|
+
this.secret = options.secret;
|
|
10
|
+
this.maxRetries = options.maxRetries ?? 2;
|
|
11
|
+
this.timeoutMs = options.timeoutMs ?? 5000;
|
|
12
|
+
this.headers = options.headers ?? {};
|
|
13
|
+
}
|
|
14
|
+
async emit(event) {
|
|
15
|
+
await this.post(event);
|
|
16
|
+
}
|
|
17
|
+
async emitBatch(events) {
|
|
18
|
+
await this.post(events);
|
|
19
|
+
}
|
|
20
|
+
async post(body) {
|
|
21
|
+
const jsonBody = JSON.stringify(body);
|
|
22
|
+
const timestamp = Math.floor(Date.now() / 1000);
|
|
23
|
+
const headers = {
|
|
24
|
+
'Content-Type': 'application/json',
|
|
25
|
+
...this.headers,
|
|
26
|
+
};
|
|
27
|
+
if (this.secret) {
|
|
28
|
+
const signature = this.sign(timestamp, jsonBody);
|
|
29
|
+
headers['X-Molroo-Signature'] = `t=${timestamp},v1=${signature}`;
|
|
30
|
+
}
|
|
31
|
+
let lastError;
|
|
32
|
+
for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
|
|
33
|
+
if (attempt > 0) {
|
|
34
|
+
await sleep(200 * Math.pow(2, attempt - 1));
|
|
35
|
+
}
|
|
36
|
+
const controller = new AbortController();
|
|
37
|
+
const timer = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
38
|
+
try {
|
|
39
|
+
const response = await fetch(this.url, {
|
|
40
|
+
method: 'POST',
|
|
41
|
+
headers,
|
|
42
|
+
body: jsonBody,
|
|
43
|
+
signal: controller.signal,
|
|
44
|
+
});
|
|
45
|
+
clearTimeout(timer);
|
|
46
|
+
if (response.ok)
|
|
47
|
+
return;
|
|
48
|
+
if (response.status >= 400 && response.status < 500) {
|
|
49
|
+
throw new Error(`Webhook rejected: ${response.status} ${response.statusText}`);
|
|
50
|
+
}
|
|
51
|
+
lastError = new Error(`Webhook failed: ${response.status} ${response.statusText}`);
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
clearTimeout(timer);
|
|
55
|
+
if (err.name === 'AbortError') {
|
|
56
|
+
lastError = new Error(`Webhook timeout after ${this.timeoutMs}ms`);
|
|
57
|
+
}
|
|
58
|
+
else if (err.message?.startsWith('Webhook rejected')) {
|
|
59
|
+
throw err;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
lastError = err;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
throw lastError ?? new Error('Webhook delivery failed');
|
|
67
|
+
}
|
|
68
|
+
sign(timestamp, body) {
|
|
69
|
+
const payload = `${timestamp}.${body}`;
|
|
70
|
+
return createHmac('sha256', this.secret).update(payload).digest('hex');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function sleep(ms) {
|
|
74
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
75
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { LLMAdapter } from '../llm/adapter';
|
|
2
|
+
import type { PersonaConfigData } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Generate a structured persona from a natural language character description.
|
|
5
|
+
*
|
|
6
|
+
* Uses LLM structured output to extract HEXACO personality traits, identity,
|
|
7
|
+
* goals, and narrative fields from free-form text.
|
|
8
|
+
*
|
|
9
|
+
* Returns a `PersonaConfigData` that can be passed directly to `MolrooPersona.create()`.
|
|
10
|
+
*
|
|
11
|
+
* @param llm - LLMAdapter instance (built-in or custom)
|
|
12
|
+
* @param description - Free-form character description (markdown accepted)
|
|
13
|
+
* @returns Persona config ready for MolrooPersona.create()
|
|
14
|
+
*/
|
|
15
|
+
export declare function generatePersona(llm: LLMAdapter, description: string): Promise<PersonaConfigData>;
|
|
16
|
+
//# sourceMappingURL=persona.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persona.d.ts","sourceRoot":"","sources":["../../../src/generate/persona.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAY,MAAM,UAAU,CAAC;AAI5D;;;;;;;;;;;GAWG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,UAAU,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,iBAAiB,CAAC,CA6B5B"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { GeneratePersonaSchema } from './schema';
|
|
2
|
+
import { buildSystemPrompt } from './prompt';
|
|
3
|
+
/**
|
|
4
|
+
* Generate a structured persona from a natural language character description.
|
|
5
|
+
*
|
|
6
|
+
* Uses LLM structured output to extract HEXACO personality traits, identity,
|
|
7
|
+
* goals, and narrative fields from free-form text.
|
|
8
|
+
*
|
|
9
|
+
* Returns a `PersonaConfigData` that can be passed directly to `MolrooPersona.create()`.
|
|
10
|
+
*
|
|
11
|
+
* @param llm - LLMAdapter instance (built-in or custom)
|
|
12
|
+
* @param description - Free-form character description (markdown accepted)
|
|
13
|
+
* @returns Persona config ready for MolrooPersona.create()
|
|
14
|
+
*/
|
|
15
|
+
export async function generatePersona(llm, description) {
|
|
16
|
+
const system = buildSystemPrompt();
|
|
17
|
+
const { object: raw } = await llm.generateObject({
|
|
18
|
+
system,
|
|
19
|
+
messages: [{ role: 'user', content: description }],
|
|
20
|
+
schema: GeneratePersonaSchema,
|
|
21
|
+
});
|
|
22
|
+
const identity = {
|
|
23
|
+
name: raw.persona.identity.name,
|
|
24
|
+
role: raw.persona.identity.role,
|
|
25
|
+
speakingStyle: raw.persona.identity.speaking_style,
|
|
26
|
+
coreValues: raw.persona.identity.core_values,
|
|
27
|
+
};
|
|
28
|
+
if (raw.character_backstory) {
|
|
29
|
+
identity.description = raw.character_backstory;
|
|
30
|
+
}
|
|
31
|
+
if (raw.behavior_rules) {
|
|
32
|
+
identity.extensions = { 'Behavior Rules': raw.behavior_rules };
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
identity,
|
|
36
|
+
personality: raw.persona.personality,
|
|
37
|
+
goals: raw.persona.goals,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* System prompt for generatePersona() LLM call.
|
|
3
|
+
* Based on packages/api/src/presets/guide-data.ts — embedded as static text
|
|
4
|
+
* to avoid runtime dependency on the API package.
|
|
5
|
+
*/
|
|
6
|
+
export declare function buildSystemPrompt(): string;
|
|
7
|
+
//# sourceMappingURL=prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../src/generate/prompt.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoBH,wBAAgB,iBAAiB,IAAI,MAAM,CAgB1C"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* System prompt for generatePersona() LLM call.
|
|
3
|
+
* Based on packages/api/src/presets/guide-data.ts — embedded as static text
|
|
4
|
+
* to avoid runtime dependency on the API package.
|
|
5
|
+
*/
|
|
6
|
+
const HEXACO_GUIDE = `Personality traits (HEXACO model, each 0.0 to 1.0):
|
|
7
|
+
- O (Openness to Experience): 0.0=prefers familiar routines, practical, concrete → 1.0=highly creative, seeks novel experiences, abstract thinker
|
|
8
|
+
- C (Conscientiousness): 0.0=spontaneous, impulsive, dislikes rigid schedules → 1.0=extremely organized, reliable, self-disciplined
|
|
9
|
+
- E (Extraversion): 0.0=prefers solitude, reserved, finds social interaction draining → 1.0=sociable, energized by crowds, talkative, assertive
|
|
10
|
+
- A (Agreeableness): 0.0=competitive, skeptical of others, blunt and critical → 1.0=warm, trusting, helpful, empathetic, avoids conflict
|
|
11
|
+
- N (Emotionality): 0.0=emotionally stable, handles stress well, calm under pressure → 1.0=emotionally reactive, sensitive to stress, prone to anxiety
|
|
12
|
+
- H (Honesty-Humility): 0.0=strategic with truth, values status, self-promoting → 1.0=sincere, fair, humble, avoids manipulation`;
|
|
13
|
+
const GUIDELINES = `Guidelines:
|
|
14
|
+
- Infer personality values from the character's described behavior, backstory, and temperament.
|
|
15
|
+
- speaking_style must be specific: include tone, speech patterns, verbal habits, language level.
|
|
16
|
+
- core_values: 3-5 abstract values that drive the character's decisions.
|
|
17
|
+
- goals: 0-5 goals the character pursues. priority 0.0-1.0, mutable=false for core goals, true for flexible ones. An empty array is valid for goalless/apathetic characters.
|
|
18
|
+
- character_backstory: background narrative that shapes the character. Expand if sparse, but don't invent contradictions. Max 4000 chars. Omit if not relevant.
|
|
19
|
+
- behavior_rules: explicit behavioral constraints. Max 2000 chars. Omit if not relevant.
|
|
20
|
+
- Keep all text faithful to the original description.
|
|
21
|
+
- Return ONLY the JSON object. No markdown fences, no explanation.`;
|
|
22
|
+
export function buildSystemPrompt() {
|
|
23
|
+
return `You are a character design assistant for an emotion simulation engine.
|
|
24
|
+
Given a character description, extract structured data and return a valid JSON object.
|
|
25
|
+
|
|
26
|
+
The personality values you assign will directly drive a psychological simulation model.
|
|
27
|
+
These are not labels — they are numeric parameters that determine how the character:
|
|
28
|
+
- Processes emotions (reactivity, stability, recovery speed)
|
|
29
|
+
- Pursues goals (persistence, adaptability, reactance to control)
|
|
30
|
+
- Forms relationships (trust speed, attachment style, social energy)
|
|
31
|
+
- Narrates their life (redemption vs contamination arcs, agency, coherence)
|
|
32
|
+
|
|
33
|
+
Be precise and intentional with each value.
|
|
34
|
+
|
|
35
|
+
${HEXACO_GUIDE}
|
|
36
|
+
|
|
37
|
+
${GUIDELINES}`;
|
|
38
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Zod schema for LLM-generated persona output.
|
|
4
|
+
* Used with LLMProvider.generate() for structured extraction.
|
|
5
|
+
*/
|
|
6
|
+
export declare const GeneratePersonaSchema: z.ZodObject<{
|
|
7
|
+
persona: z.ZodObject<{
|
|
8
|
+
identity: z.ZodObject<{
|
|
9
|
+
name: z.ZodString;
|
|
10
|
+
role: z.ZodOptional<z.ZodString>;
|
|
11
|
+
core_values: z.ZodArray<z.ZodString>;
|
|
12
|
+
speaking_style: z.ZodString;
|
|
13
|
+
}, z.core.$strip>;
|
|
14
|
+
personality: z.ZodObject<{
|
|
15
|
+
O: z.ZodNumber;
|
|
16
|
+
C: z.ZodNumber;
|
|
17
|
+
E: z.ZodNumber;
|
|
18
|
+
A: z.ZodNumber;
|
|
19
|
+
N: z.ZodNumber;
|
|
20
|
+
H: z.ZodNumber;
|
|
21
|
+
}, z.core.$strip>;
|
|
22
|
+
goals: z.ZodArray<z.ZodObject<{
|
|
23
|
+
content: z.ZodString;
|
|
24
|
+
priority: z.ZodNumber;
|
|
25
|
+
mutable: z.ZodBoolean;
|
|
26
|
+
}, z.core.$strip>>;
|
|
27
|
+
}, z.core.$strip>;
|
|
28
|
+
character_backstory: z.ZodOptional<z.ZodString>;
|
|
29
|
+
behavior_rules: z.ZodOptional<z.ZodString>;
|
|
30
|
+
}, z.core.$strip>;
|
|
31
|
+
export type GeneratePersonaSchemaOutput = z.infer<typeof GeneratePersonaSchema>;
|
|
32
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/generate/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;GAGG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;iBA+ChC,CAAC;AAEH,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Zod schema for LLM-generated persona output.
|
|
4
|
+
* Used with LLMProvider.generate() for structured extraction.
|
|
5
|
+
*/
|
|
6
|
+
export const GeneratePersonaSchema = z.object({
|
|
7
|
+
persona: z.object({
|
|
8
|
+
identity: z.object({
|
|
9
|
+
name: z.string().describe('Character name'),
|
|
10
|
+
role: z
|
|
11
|
+
.string()
|
|
12
|
+
.optional()
|
|
13
|
+
.describe('One-line role or title'),
|
|
14
|
+
core_values: z
|
|
15
|
+
.array(z.string())
|
|
16
|
+
.min(3)
|
|
17
|
+
.max(5)
|
|
18
|
+
.describe('Abstract values that drive the character (3-5)'),
|
|
19
|
+
speaking_style: z
|
|
20
|
+
.string()
|
|
21
|
+
.describe('Specific speech patterns: tone, mannerisms, verbal habits, language level'),
|
|
22
|
+
}),
|
|
23
|
+
personality: z.object({
|
|
24
|
+
O: z.number().min(0).max(1).describe('Openness to Experience: 0=conventional → 1=creative'),
|
|
25
|
+
C: z.number().min(0).max(1).describe('Conscientiousness: 0=spontaneous → 1=organized'),
|
|
26
|
+
E: z.number().min(0).max(1).describe('Extraversion: 0=introverted → 1=sociable'),
|
|
27
|
+
A: z.number().min(0).max(1).describe('Agreeableness: 0=competitive → 1=cooperative'),
|
|
28
|
+
N: z.number().min(0).max(1).describe('Emotionality: 0=stable → 1=reactive'),
|
|
29
|
+
H: z.number().min(0).max(1).describe('Honesty-Humility: 0=manipulative → 1=sincere'),
|
|
30
|
+
}),
|
|
31
|
+
goals: z
|
|
32
|
+
.array(z.object({
|
|
33
|
+
content: z.string().describe('What the character wants to achieve'),
|
|
34
|
+
priority: z.number().min(0).max(1).describe('Goal importance (0-1)'),
|
|
35
|
+
mutable: z.boolean().describe('false for core identity goals, true for flexible ones'),
|
|
36
|
+
}))
|
|
37
|
+
.min(0)
|
|
38
|
+
.max(5)
|
|
39
|
+
.describe('Character goals (0-5). Empty array for goalless characters.'),
|
|
40
|
+
}),
|
|
41
|
+
character_backstory: z
|
|
42
|
+
.string()
|
|
43
|
+
.max(4000)
|
|
44
|
+
.optional()
|
|
45
|
+
.describe('Background narrative shaping worldview and behavior (max 4000 chars)'),
|
|
46
|
+
behavior_rules: z
|
|
47
|
+
.string()
|
|
48
|
+
.max(2000)
|
|
49
|
+
.optional()
|
|
50
|
+
.describe('Explicit behavior rules and constraints (max 2000 chars)'),
|
|
51
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/generated/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @molroo-io/sdk - Thin Client SDK for molroo emotion engine
|
|
3
|
+
*
|
|
4
|
+
* ## Boundary — this is where LLM orchestration lives:
|
|
5
|
+
* - **LLM calls happen HERE** — consumer's API key, consumer's model.
|
|
6
|
+
* - **Appraisal generation happens HERE** — LLM produces appraisal, SDK sends to API.
|
|
7
|
+
* - **Memory recall happens HERE** — episodic/semantic/reflections from client stores.
|
|
8
|
+
* - **Prompt composition**: API returns persona fragment → SDK adds memory context.
|
|
9
|
+
*
|
|
10
|
+
* The API/engine never call LLM. This SDK is the bridge.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import { MolrooPersona } from '@molroo-io/sdk';
|
|
15
|
+
* import { createVercelAIAdapter } from '@molroo-io/sdk';
|
|
16
|
+
*
|
|
17
|
+
* const llm = createVercelAIAdapter({
|
|
18
|
+
* provider: 'openai',
|
|
19
|
+
* apiKey: process.env.OPENAI_API_KEY!,
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* const persona = await MolrooPersona.create({
|
|
23
|
+
* baseUrl: 'https://api.molroo.io',
|
|
24
|
+
* apiKey: 'your_api_key',
|
|
25
|
+
* llm,
|
|
26
|
+
* }, {
|
|
27
|
+
* config: { identity: { name: 'Sera' }, personality: { O: 0.7, C: 0.6, E: 0.8, A: 0.5, N: 0.3, H: 0.6 } },
|
|
28
|
+
* });
|
|
29
|
+
*
|
|
30
|
+
* const result = await persona.chat('Hello!');
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export { MolrooPersona } from './persona';
|
|
34
|
+
export { MolrooApiError } from './types';
|
|
35
|
+
export type { LLMAdapter, Message, GenerateTextOptions, GenerateObjectOptions, } from './llm/adapter';
|
|
36
|
+
export type { LLMShorthand, LLMInput } from './llm/resolve';
|
|
37
|
+
export { VercelAIAdapter, createVercelAIAdapter } from './llm/vercel-ai';
|
|
38
|
+
export type { VercelAIConfig } from './llm/vercel-ai';
|
|
39
|
+
export type { MemoryAdapter, RecallQuery, SemanticRecallOptions, RecallLimits, } from './memory/types';
|
|
40
|
+
export { isMemoryConfig } from './memory/types';
|
|
41
|
+
export type { EpisodeAdapter, EpisodeQuery, SemanticAdapter, SemanticEntry, SemanticQuery, SemanticResult, EmbeddingAdapter, MemoryConfig, Reflection, } from './memory/types';
|
|
42
|
+
export { InMemoryEpisodeAdapter } from './memory/in-memory';
|
|
43
|
+
export type { RecallConfig } from './memory/recall';
|
|
44
|
+
export type { SemanticMemory, SearchOptions, SearchResult } from './memory/semantic';
|
|
45
|
+
export { InMemorySemanticMemory } from './memory/in-memory-semantic';
|
|
46
|
+
export type { EpisodeStore, SemanticStore, EmbeddingProvider } from './memory/types';
|
|
47
|
+
export { InMemoryEpisodeStore } from './memory/in-memory';
|
|
48
|
+
export type { EventAdapter, SDKEvent, SDKEventType, PersonaEventType } from './events/types';
|
|
49
|
+
export { ConsoleEventAdapter } from './events/console';
|
|
50
|
+
export type { ConsoleEventAdapterOptions } from './events/console';
|
|
51
|
+
export { WebhookEventAdapter } from './events/webhook';
|
|
52
|
+
export type { WebhookEventAdapterOptions } from './events/webhook';
|
|
53
|
+
export { generatePersona } from './generate/persona';
|
|
54
|
+
export { GeneratePersonaSchema } from './generate/schema';
|
|
55
|
+
export type { GeneratePersonaSchemaOutput } from './generate/schema';
|
|
56
|
+
export type { MolrooPersonaConfig, PersonaSummary, PersonaState, PersonaChatResult, } from './persona';
|
|
57
|
+
export type { InterlocutorContext, PerceiveOptions, PerceiveEvent, PerceiveContext, } from './types';
|
|
58
|
+
export type { AgentResponse, VAD, Velocity, AppraisalVector, State, SoulStage, CatastropheState, MetacogState, AffectDynamicsState, InterpersonalState, RegulationState, RegulationStrategy, RegulationPhase, ActiveRegulation, RegulationRecord, EffectivenessRecord, NeedState, Episode, SocialUpdate, ReflectionPrompt, } from './types';
|
|
59
|
+
export type { PersonaSnapshot, PersonaConfigData, PersonalityTraits, Identity, Goal, MotivationContext, } from './types';
|
|
60
|
+
export type { ApiResponse, ApiErrorResponse, PersonaDynamicState, } from './types';
|
|
61
|
+
export { AppraisalVectorSchema, LLMResponseSchema, LLMResponseWithToolsSchema, } from './llm/schema';
|
|
62
|
+
export type { LLMResponseOutput, LLMResponseWithToolsOutput } from './llm/schema';
|
|
63
|
+
export type { LLMPrompt, LLMResponse, } from './llm/types';
|
|
64
|
+
export type { ChatMessage } from './llm/types';
|
|
65
|
+
export { DEFAULT_PERSONA, withDefaults } from './defaults';
|
|
66
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @molroo-io/sdk - Thin Client SDK for molroo emotion engine
|
|
3
|
+
*
|
|
4
|
+
* ## Boundary — this is where LLM orchestration lives:
|
|
5
|
+
* - **LLM calls happen HERE** — consumer's API key, consumer's model.
|
|
6
|
+
* - **Appraisal generation happens HERE** — LLM produces appraisal, SDK sends to API.
|
|
7
|
+
* - **Memory recall happens HERE** — episodic/semantic/reflections from client stores.
|
|
8
|
+
* - **Prompt composition**: API returns persona fragment → SDK adds memory context.
|
|
9
|
+
*
|
|
10
|
+
* The API/engine never call LLM. This SDK is the bridge.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import { MolrooPersona } from '@molroo-io/sdk';
|
|
15
|
+
* import { createVercelAIAdapter } from '@molroo-io/sdk';
|
|
16
|
+
*
|
|
17
|
+
* const llm = createVercelAIAdapter({
|
|
18
|
+
* provider: 'openai',
|
|
19
|
+
* apiKey: process.env.OPENAI_API_KEY!,
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* const persona = await MolrooPersona.create({
|
|
23
|
+
* baseUrl: 'https://api.molroo.io',
|
|
24
|
+
* apiKey: 'your_api_key',
|
|
25
|
+
* llm,
|
|
26
|
+
* }, {
|
|
27
|
+
* config: { identity: { name: 'Sera' }, personality: { O: 0.7, C: 0.6, E: 0.8, A: 0.5, N: 0.3, H: 0.6 } },
|
|
28
|
+
* });
|
|
29
|
+
*
|
|
30
|
+
* const result = await persona.chat('Hello!');
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
// ── Main exports ──
|
|
34
|
+
export { MolrooPersona } from './persona';
|
|
35
|
+
export { MolrooApiError } from './types';
|
|
36
|
+
export { VercelAIAdapter, createVercelAIAdapter } from './llm/vercel-ai';
|
|
37
|
+
export { isMemoryConfig } from './memory/types';
|
|
38
|
+
export { InMemoryEpisodeAdapter } from './memory/in-memory';
|
|
39
|
+
export { InMemorySemanticMemory } from './memory/in-memory-semantic';
|
|
40
|
+
export { InMemoryEpisodeStore } from './memory/in-memory';
|
|
41
|
+
export { ConsoleEventAdapter } from './events/console';
|
|
42
|
+
export { WebhookEventAdapter } from './events/webhook';
|
|
43
|
+
// ── Generate ──
|
|
44
|
+
export { generatePersona } from './generate/persona';
|
|
45
|
+
export { GeneratePersonaSchema } from './generate/schema';
|
|
46
|
+
// ── LLM types & schemas ──
|
|
47
|
+
export { AppraisalVectorSchema, LLMResponseSchema, LLMResponseWithToolsSchema, } from './llm/schema';
|
|
48
|
+
// ── Defaults ──
|
|
49
|
+
export { DEFAULT_PERSONA, withDefaults } from './defaults';
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { ZodSchema } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Message format for LLM conversations.
|
|
4
|
+
* Compatible with Vercel AI SDK message format.
|
|
5
|
+
*/
|
|
6
|
+
export interface Message {
|
|
7
|
+
role: 'user' | 'assistant' | 'system';
|
|
8
|
+
content: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Base options for text generation.
|
|
12
|
+
*/
|
|
13
|
+
export interface GenerateTextOptions {
|
|
14
|
+
model?: string;
|
|
15
|
+
system?: string;
|
|
16
|
+
messages: Message[];
|
|
17
|
+
temperature?: number;
|
|
18
|
+
maxTokens?: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Base options for object generation.
|
|
22
|
+
*/
|
|
23
|
+
export interface GenerateObjectOptions<T> {
|
|
24
|
+
model?: string;
|
|
25
|
+
system?: string;
|
|
26
|
+
messages: Message[];
|
|
27
|
+
schema: ZodSchema<T>;
|
|
28
|
+
temperature?: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* LLM Adapter interface for molroo SDK.
|
|
32
|
+
*
|
|
33
|
+
* Abstracts LLM interactions so consumers can:
|
|
34
|
+
* - Use the built-in adapter (Vercel AI SDK: OpenAI/Anthropic/Vertex)
|
|
35
|
+
* - Bring their own LLM integration (Ollama, vLLM, custom pipeline)
|
|
36
|
+
* - Skip LLM entirely (emotion-only usage)
|
|
37
|
+
*
|
|
38
|
+
* Interface follows Vercel AI SDK conventions for familiarity.
|
|
39
|
+
*/
|
|
40
|
+
export interface LLMAdapter {
|
|
41
|
+
/**
|
|
42
|
+
* Generate plain text from messages.
|
|
43
|
+
*
|
|
44
|
+
* @param options - Generation options including messages and optional system prompt
|
|
45
|
+
* @returns Object containing generated text
|
|
46
|
+
*/
|
|
47
|
+
generateText(options: GenerateTextOptions): Promise<{
|
|
48
|
+
text: string;
|
|
49
|
+
}>;
|
|
50
|
+
/**
|
|
51
|
+
* Generate structured object matching the provided Zod schema.
|
|
52
|
+
*
|
|
53
|
+
* @param options - Generation options including messages, system prompt, and schema
|
|
54
|
+
* @returns Object containing parsed structured output
|
|
55
|
+
*/
|
|
56
|
+
generateObject<T>(options: GenerateObjectOptions<T>): Promise<{
|
|
57
|
+
object: T;
|
|
58
|
+
}>;
|
|
59
|
+
}
|
|
60
|
+
export type { Message as ChatMessage };
|
|
61
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/llm/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAErC;;;GAGG;AACH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,UAAU;IACzB;;;;;OAKG;IACH,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAEtE;;;;;OAKG;IACH,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,CAAC,CAAA;KAAE,CAAC,CAAC;CAC9E;AAGD,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { LLMAdapter } from './adapter';
|
|
2
|
+
/**
|
|
3
|
+
* Shorthand config for creating an LLM adapter without importing a separate package.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```typescript
|
|
7
|
+
* const persona = await MolrooPersona.create({
|
|
8
|
+
* baseUrl, apiKey,
|
|
9
|
+
* llm: { provider: 'openai', apiKey: '...' },
|
|
10
|
+
* }, config);
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export interface LLMShorthand {
|
|
14
|
+
provider: 'openai' | 'anthropic' | 'vertex' | 'openrouter';
|
|
15
|
+
apiKey: string;
|
|
16
|
+
model?: string;
|
|
17
|
+
baseUrl?: string;
|
|
18
|
+
projectId?: string;
|
|
19
|
+
location?: string;
|
|
20
|
+
}
|
|
21
|
+
/** LLM adapter or shorthand config. */
|
|
22
|
+
export type LLMInput = LLMAdapter | LLMShorthand;
|
|
23
|
+
/**
|
|
24
|
+
* Resolve an LLMInput to an LLMAdapter.
|
|
25
|
+
* If a shorthand config is given, creates a VercelAIAdapter directly.
|
|
26
|
+
*/
|
|
27
|
+
export declare function resolveLLM(input: LLMInput): Promise<LLMAdapter>;
|
|
28
|
+
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/llm/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAG5C;;;;;;;;;;GAUG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,YAAY,CAAC;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,uCAAuC;AACvC,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,YAAY,CAAC;AAYjD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAGrE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { createVercelAIAdapter } from './vercel-ai';
|
|
2
|
+
function isShorthand(input) {
|
|
3
|
+
return (input != null &&
|
|
4
|
+
typeof input === 'object' &&
|
|
5
|
+
'provider' in input &&
|
|
6
|
+
'apiKey' in input &&
|
|
7
|
+
!('generateText' in input));
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Resolve an LLMInput to an LLMAdapter.
|
|
11
|
+
* If a shorthand config is given, creates a VercelAIAdapter directly.
|
|
12
|
+
*/
|
|
13
|
+
export async function resolveLLM(input) {
|
|
14
|
+
if (!isShorthand(input))
|
|
15
|
+
return input;
|
|
16
|
+
return createVercelAIAdapter(input);
|
|
17
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* AppraisalVector Schema — Scherer CPM 9-dimensional emotion appraisal.
|
|
4
|
+
* LLM evaluates user input from persona's perspective.
|
|
5
|
+
*
|
|
6
|
+
* Each field accepts any number from LLM output, then clamps to the valid
|
|
7
|
+
* range via .transform(). This tolerates LLM outputs outside the intended
|
|
8
|
+
* range (e.g. -3.0) without failing Zod parsing.
|
|
9
|
+
*/
|
|
10
|
+
export declare const AppraisalVectorSchema: z.ZodObject<{
|
|
11
|
+
goal_relevance: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
12
|
+
goal_congruence: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
13
|
+
expectedness: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
14
|
+
controllability: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
15
|
+
agency: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
16
|
+
norm_compatibility: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
17
|
+
internal_standards: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
18
|
+
adjustment_potential: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
19
|
+
urgency: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
20
|
+
}, z.core.$strip>;
|
|
21
|
+
/**
|
|
22
|
+
* Full LLM response schema — response text + appraisal vector.
|
|
23
|
+
*/
|
|
24
|
+
export declare const LLMResponseSchema: z.ZodObject<{
|
|
25
|
+
response: z.ZodString;
|
|
26
|
+
appraisal: z.ZodObject<{
|
|
27
|
+
goal_relevance: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
28
|
+
goal_congruence: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
29
|
+
expectedness: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
30
|
+
controllability: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
31
|
+
agency: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
32
|
+
norm_compatibility: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
33
|
+
internal_standards: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
34
|
+
adjustment_potential: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
35
|
+
urgency: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
36
|
+
}, z.core.$strip>;
|
|
37
|
+
}, z.core.$strip>;
|
|
38
|
+
export type LLMResponseOutput = z.infer<typeof LLMResponseSchema>;
|
|
39
|
+
/**
|
|
40
|
+
* Tool-use aware LLM response schema.
|
|
41
|
+
* The LLM can either produce a normal response or request a memory search.
|
|
42
|
+
* When search_memory is set, the SDK executes the search and re-invokes the LLM.
|
|
43
|
+
*/
|
|
44
|
+
export declare const LLMResponseWithToolsSchema: z.ZodObject<{
|
|
45
|
+
response: z.ZodString;
|
|
46
|
+
appraisal: z.ZodObject<{
|
|
47
|
+
goal_relevance: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
48
|
+
goal_congruence: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
49
|
+
expectedness: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
50
|
+
controllability: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
51
|
+
agency: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
52
|
+
norm_compatibility: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
53
|
+
internal_standards: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
54
|
+
adjustment_potential: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
55
|
+
urgency: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
56
|
+
}, z.core.$strip>;
|
|
57
|
+
search_memory: z.ZodOptional<z.ZodString>;
|
|
58
|
+
}, z.core.$strip>;
|
|
59
|
+
export type LLMResponseWithToolsOutput = z.infer<typeof LLMResponseWithToolsSchema>;
|
|
60
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/llm/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;iBAuDhC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;iBAK5B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAElE;;;;GAIG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;iBAarC,CAAC;AAEH,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC"}
|