@molroo-io/sdk 0.9.0 → 0.9.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/dist/cjs/events/types.d.ts +1 -1
- package/dist/cjs/events/types.d.ts.map +1 -1
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/llm/resolve.d.ts.map +1 -1
- package/dist/cjs/llm/resolve.js +2 -1
- package/dist/cjs/llm/schema.d.ts +0 -114
- package/dist/cjs/llm/schema.d.ts.map +1 -1
- package/dist/cjs/llm/schema.js +1 -44
- package/dist/cjs/persona/chat-orchestrator.d.ts +18 -3
- package/dist/cjs/persona/chat-orchestrator.d.ts.map +1 -1
- package/dist/cjs/persona/chat-orchestrator.js +29 -109
- package/dist/cjs/persona/conversation.d.ts +22 -1
- package/dist/cjs/persona/conversation.d.ts.map +1 -1
- package/dist/cjs/persona/conversation.js +2 -0
- package/dist/cjs/persona/memory-pipeline.d.ts.map +1 -1
- package/dist/cjs/persona/memory-pipeline.js +30 -4
- package/dist/cjs/persona.d.ts +270 -36
- package/dist/cjs/persona.d.ts.map +1 -1
- package/dist/cjs/persona.js +238 -19
- package/dist/cjs/shared/errors.d.ts +5 -1
- package/dist/cjs/shared/errors.d.ts.map +1 -1
- package/dist/cjs/shared/errors.js +4 -0
- package/dist/cjs/types.d.ts +18 -0
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/cjs/world/world-persona.d.ts +20 -5
- package/dist/cjs/world/world-persona.d.ts.map +1 -1
- package/dist/cjs/world/world-persona.js +21 -5
- package/dist/cjs/world/world.d.ts +23 -3
- package/dist/cjs/world/world.d.ts.map +1 -1
- package/dist/cjs/world/world.js +24 -1
- package/dist/esm/events/types.d.ts +1 -1
- package/dist/esm/events/types.d.ts.map +1 -1
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/llm/resolve.d.ts.map +1 -1
- package/dist/esm/llm/resolve.js +2 -1
- package/dist/esm/llm/schema.d.ts +0 -114
- package/dist/esm/llm/schema.d.ts.map +1 -1
- package/dist/esm/llm/schema.js +0 -43
- package/dist/esm/persona/chat-orchestrator.d.ts +18 -3
- package/dist/esm/persona/chat-orchestrator.d.ts.map +1 -1
- package/dist/esm/persona/chat-orchestrator.js +29 -109
- package/dist/esm/persona/conversation.d.ts +22 -1
- package/dist/esm/persona/conversation.d.ts.map +1 -1
- package/dist/esm/persona/conversation.js +2 -0
- package/dist/esm/persona/memory-pipeline.d.ts.map +1 -1
- package/dist/esm/persona/memory-pipeline.js +30 -4
- package/dist/esm/persona.d.ts +270 -36
- package/dist/esm/persona.d.ts.map +1 -1
- package/dist/esm/persona.js +237 -19
- package/dist/esm/shared/errors.d.ts +5 -1
- package/dist/esm/shared/errors.d.ts.map +1 -1
- package/dist/esm/shared/errors.js +4 -0
- package/dist/esm/types.d.ts +18 -0
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/world/world-persona.d.ts +20 -5
- package/dist/esm/world/world-persona.d.ts.map +1 -1
- package/dist/esm/world/world-persona.js +21 -5
- package/dist/esm/world/world.d.ts +23 -3
- package/dist/esm/world/world.d.ts.map +1 -1
- package/dist/esm/world/world.js +24 -1
- package/package.json +1 -1
|
@@ -1,10 +1,30 @@
|
|
|
1
1
|
import { emitResponseEvents } from './event-emitter';
|
|
2
|
+
/** Emit pipeline error or log warning if no EventAdapter. */
|
|
3
|
+
function handlePipelineError(deps, stage, error) {
|
|
4
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
5
|
+
if (deps.events) {
|
|
6
|
+
deps.events.emit({
|
|
7
|
+
type: 'pipeline_error',
|
|
8
|
+
personaId: deps.personaId,
|
|
9
|
+
timestamp: Date.now(),
|
|
10
|
+
payload: { stage, error: message },
|
|
11
|
+
}).catch(() => {
|
|
12
|
+
// Last resort: log to console if event emit itself fails
|
|
13
|
+
console.warn(`[molroo-sdk] Pipeline error (${stage}):`, message);
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
console.warn(`[molroo-sdk] Pipeline error (${stage}):`, message);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
2
20
|
/** Save episode (shared between perceive and chat pipelines). */
|
|
3
21
|
function saveEpisode(deps, response) {
|
|
4
22
|
if (!response.memoryEpisode)
|
|
5
23
|
return;
|
|
6
24
|
if (deps.memoryAdapter) {
|
|
7
|
-
deps.memoryAdapter.saveEpisode(response.memoryEpisode).catch(() => {
|
|
25
|
+
deps.memoryAdapter.saveEpisode(response.memoryEpisode).catch((err) => {
|
|
26
|
+
handlePipelineError(deps, 'save_episode', err);
|
|
27
|
+
});
|
|
8
28
|
}
|
|
9
29
|
}
|
|
10
30
|
/** Handle reflection generation (LLM call + save). */
|
|
@@ -44,7 +64,9 @@ export function postPerceive(deps, response) {
|
|
|
44
64
|
return;
|
|
45
65
|
saveEpisode(deps, response);
|
|
46
66
|
if (deps.events) {
|
|
47
|
-
emitResponseEvents(deps.events, deps.personaId, response, Date.now()).catch(() => {
|
|
67
|
+
emitResponseEvents(deps.events, deps.personaId, response, Date.now()).catch((err) => {
|
|
68
|
+
handlePipelineError(deps, 'event_emit', err);
|
|
69
|
+
});
|
|
48
70
|
}
|
|
49
71
|
}
|
|
50
72
|
/**
|
|
@@ -57,9 +79,13 @@ export function postChat(deps, response) {
|
|
|
57
79
|
const hasLlm = deps.engineLlm || deps.llm;
|
|
58
80
|
const hasMemory = deps.memoryAdapter;
|
|
59
81
|
if (hasLlm && hasMemory && response.reflectionPrompt) {
|
|
60
|
-
handleReflection(deps, response.reflectionPrompt, response.emotion.vad).catch(() => {
|
|
82
|
+
handleReflection(deps, response.reflectionPrompt, response.emotion.vad).catch((err) => {
|
|
83
|
+
handlePipelineError(deps, 'reflection', err);
|
|
84
|
+
});
|
|
61
85
|
}
|
|
62
86
|
if (deps.events) {
|
|
63
|
-
emitResponseEvents(deps.events, deps.personaId, response, now).catch(() => {
|
|
87
|
+
emitResponseEvents(deps.events, deps.personaId, response, now).catch((err) => {
|
|
88
|
+
handlePipelineError(deps, 'event_emit', err);
|
|
89
|
+
});
|
|
64
90
|
}
|
|
65
91
|
}
|
package/dist/esm/persona.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { LLMAdapter, Message } from './llm/adapter';
|
|
|
2
2
|
import { type LLMInput } from './llm/resolve';
|
|
3
3
|
import type { MemoryAdapter, RecallLimits } from './memory/types';
|
|
4
4
|
import type { EventAdapter } from './events/types';
|
|
5
|
-
import type { AgentResponse,
|
|
5
|
+
import type { AgentResponse, AppraisalVector, InterlocutorContext, RelationshipContext, PersonaSnapshot, PersonaConfigData, PerceiveOptions, PersonaIdentity } from './types';
|
|
6
6
|
import type { StyleProfile } from './expression';
|
|
7
7
|
import { Conversation, type ConversationOptions } from './persona/conversation';
|
|
8
8
|
/** Configuration for connecting to a standalone persona instance. */
|
|
@@ -32,8 +32,6 @@ export interface MolrooPersonaConfig {
|
|
|
32
32
|
* memory_consolidated, reflection_generated, etc.).
|
|
33
33
|
*/
|
|
34
34
|
events?: EventAdapter;
|
|
35
|
-
/** Appraisal generation mode for `chat()`. Defaults to `direct`. */
|
|
36
|
-
appraisalMode?: AppraisalMode;
|
|
37
35
|
}
|
|
38
36
|
/** Summary of a persona instance, returned by list operations. */
|
|
39
37
|
export interface PersonaSummary {
|
|
@@ -43,37 +41,140 @@ export interface PersonaSummary {
|
|
|
43
41
|
engineVersion: string;
|
|
44
42
|
createdAt: number;
|
|
45
43
|
}
|
|
46
|
-
/**
|
|
44
|
+
/**
|
|
45
|
+
* Current emotional and psychological state of a persona, as returned by {@link MolrooPersona.getState}.
|
|
46
|
+
*
|
|
47
|
+
* This is the primary data structure apps use to assemble system prompts without relying on
|
|
48
|
+
* `chat()`. All subsystems computed by the emotion engine are included here.
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* const state = await persona.getState();
|
|
53
|
+
*
|
|
54
|
+
* // Build your own system prompt
|
|
55
|
+
* const systemPrompt = [
|
|
56
|
+
* `You are ${myPersonaName}.`,
|
|
57
|
+
* `Current emotion: ${state.emotion.discrete?.primary} (intensity ${state.emotion.discrete?.intensity.toFixed(2)})`,
|
|
58
|
+
* state.mood ? `Mood: V=${state.mood.V.toFixed(2)} A=${state.mood.A.toFixed(2)}` : '',
|
|
59
|
+
* state.selfEsteem ? `Self-esteem: ${state.selfEsteem.global.toFixed(2)}` : '',
|
|
60
|
+
* ].filter(Boolean).join('\n');
|
|
61
|
+
*
|
|
62
|
+
* const { text } = await myLLM.generate({ system: systemPrompt, messages });
|
|
63
|
+
* await persona.hear(lastUserMessage);
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
47
66
|
export interface PersonaState {
|
|
48
|
-
/**
|
|
67
|
+
/**
|
|
68
|
+
* Current emotion in VAD (Valence-Arousal-Dominance) space with discrete label.
|
|
69
|
+
* Use this to communicate the persona's felt emotional tone to the LLM.
|
|
70
|
+
* - `vad.V`: Valence (−1 = negative, +1 = positive)
|
|
71
|
+
* - `vad.A`: Arousal (0 = calm, 1 = activated)
|
|
72
|
+
* - `vad.D`: Dominance (0 = submissive, 1 = dominant)
|
|
73
|
+
* - `discrete.primary`: Named emotion label (e.g. "joy", "anger", "sadness")
|
|
74
|
+
*/
|
|
49
75
|
emotion: {
|
|
50
76
|
vad: {
|
|
51
77
|
V: number;
|
|
52
78
|
A: number;
|
|
53
79
|
D: number;
|
|
54
80
|
};
|
|
55
|
-
discrete
|
|
81
|
+
discrete: {
|
|
56
82
|
primary: string;
|
|
57
83
|
secondary?: string;
|
|
58
84
|
intensity: number;
|
|
59
85
|
};
|
|
60
86
|
};
|
|
61
|
-
/**
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
87
|
+
/**
|
|
88
|
+
* Soul stage — the persona's current developmental/personality phase.
|
|
89
|
+
* Governs the blending ratio between rational and irrational response styles.
|
|
90
|
+
* Include in prompts to modulate how impulsive or deliberate the persona acts.
|
|
91
|
+
*/
|
|
92
|
+
soulStage: {
|
|
93
|
+
id: number;
|
|
94
|
+
name: string;
|
|
95
|
+
blendTable: {
|
|
96
|
+
rational: number;
|
|
97
|
+
irrational: number;
|
|
67
98
|
};
|
|
99
|
+
turnsInStage: number;
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Persona mask — the gap between true emotion and presented face.
|
|
103
|
+
* - `integrity`: 0 (mask fully intact) to 1 (mask broken, raw emotion exposed)
|
|
104
|
+
* - `state`: "stable" | "cracking" | "broken"
|
|
105
|
+
* Low integrity indicates emotional leakage — the persona may show truer feelings.
|
|
106
|
+
*/
|
|
107
|
+
mask: {
|
|
108
|
+
integrity: number;
|
|
109
|
+
state: string;
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* Background mood — slower-changing than emotion, sets the ambient emotional color.
|
|
113
|
+
* VAD values directly (not nested): `{ V, A, D }`.
|
|
114
|
+
* Useful for setting a sustained tone across a conversation (e.g., melancholy all day).
|
|
115
|
+
*/
|
|
116
|
+
mood?: {
|
|
117
|
+
V: number;
|
|
118
|
+
A: number;
|
|
119
|
+
D: number;
|
|
68
120
|
};
|
|
69
|
-
/**
|
|
70
|
-
|
|
71
|
-
|
|
121
|
+
/**
|
|
122
|
+
* Active somatic (body) sensations as intensity values.
|
|
123
|
+
* Keys are sensation names (e.g. "chest_tightness", "warmth"), values are 0–1 intensities.
|
|
124
|
+
* Use this to add embodied, physical descriptions to the persona's responses.
|
|
125
|
+
*/
|
|
126
|
+
somatic?: {
|
|
127
|
+
[key: string]: number;
|
|
128
|
+
};
|
|
129
|
+
/**
|
|
130
|
+
* Narrative self-perception — how the persona understands their own story.
|
|
131
|
+
* - `tone`: −1 (tragic) to +1 (hopeful)
|
|
132
|
+
* - `agency`: 0 (helpless) to 1 (in control)
|
|
133
|
+
* - `coherence`: 0 (fragmented) to 1 (integrated)
|
|
134
|
+
* High agency + high tone = optimistic protagonist. Low agency + low tone = victim narrative.
|
|
135
|
+
*/
|
|
72
136
|
narrative?: {
|
|
73
137
|
tone: number;
|
|
74
138
|
agency: number;
|
|
75
139
|
coherence: number;
|
|
76
140
|
};
|
|
141
|
+
/**
|
|
142
|
+
* Active emotion regulation strategy.
|
|
143
|
+
* `null` if the persona is not actively regulating.
|
|
144
|
+
* Include to let the LLM know whether the persona is suppressing, reappraising, etc.
|
|
145
|
+
*/
|
|
146
|
+
regulation?: {
|
|
147
|
+
activeStrategy: string | null;
|
|
148
|
+
};
|
|
149
|
+
/**
|
|
150
|
+
* Global self-esteem level (0–1).
|
|
151
|
+
* Low self-esteem shapes how the persona responds to praise, criticism, and challenges.
|
|
152
|
+
*/
|
|
153
|
+
selfEsteem?: {
|
|
154
|
+
global: number;
|
|
155
|
+
};
|
|
156
|
+
/**
|
|
157
|
+
* Terror Management Theory (TMT) state — existential anxiety subsystem.
|
|
158
|
+
* - `mortalitySalience`: how front-of-mind death awareness is (0–1)
|
|
159
|
+
* - `deathAnxiety`: underlying anxiety level (0–1)
|
|
160
|
+
* - `defenseMode`: "proximal" (denial) | "distal" (worldview defense) | "none"
|
|
161
|
+
*/
|
|
162
|
+
tmt?: {
|
|
163
|
+
mortalitySalience: number;
|
|
164
|
+
deathAnxiety: number;
|
|
165
|
+
defenseMode: 'proximal' | 'distal' | 'none';
|
|
166
|
+
};
|
|
167
|
+
/**
|
|
168
|
+
* Relationship state with the current interlocutor.
|
|
169
|
+
* - `trust`: 0–1
|
|
170
|
+
* - `intimacy`: 0–1
|
|
171
|
+
* - `attachmentStyle`: e.g. "secure" | "anxious" | "avoidant"
|
|
172
|
+
*/
|
|
173
|
+
relationship?: {
|
|
174
|
+
trust: number;
|
|
175
|
+
intimacy: number;
|
|
176
|
+
attachmentStyle?: string;
|
|
177
|
+
};
|
|
77
178
|
}
|
|
78
179
|
/** Result of a persona chat interaction, including LLM text and emotion data. */
|
|
79
180
|
export interface PersonaChatResult {
|
|
@@ -99,7 +200,6 @@ export declare class MolrooPersona {
|
|
|
99
200
|
private memoryRecallConfig;
|
|
100
201
|
private events;
|
|
101
202
|
private _personaId;
|
|
102
|
-
private appraisalMode;
|
|
103
203
|
constructor(config: MolrooPersonaConfig & {
|
|
104
204
|
llm?: LLMAdapter;
|
|
105
205
|
engineLlm?: LLMAdapter;
|
|
@@ -128,7 +228,6 @@ export declare class MolrooPersona {
|
|
|
128
228
|
memory?: MemoryAdapter;
|
|
129
229
|
recall?: RecallLimits;
|
|
130
230
|
events?: EventAdapter;
|
|
131
|
-
appraisalMode?: AppraisalMode;
|
|
132
231
|
}, description: string): Promise<MolrooPersona>;
|
|
133
232
|
/**
|
|
134
233
|
* Create a new persona with explicit configuration.
|
|
@@ -149,7 +248,6 @@ export declare class MolrooPersona {
|
|
|
149
248
|
memory?: MemoryAdapter;
|
|
150
249
|
recall?: RecallLimits;
|
|
151
250
|
events?: EventAdapter;
|
|
152
|
-
appraisalMode?: AppraisalMode;
|
|
153
251
|
}, personaConfig: PersonaConfigData): Promise<MolrooPersona>;
|
|
154
252
|
/**
|
|
155
253
|
* Internal implementation for creating persona with resolved config.
|
|
@@ -168,7 +266,6 @@ export declare class MolrooPersona {
|
|
|
168
266
|
memory?: MemoryAdapter;
|
|
169
267
|
recall?: RecallLimits;
|
|
170
268
|
events?: EventAdapter;
|
|
171
|
-
appraisalMode?: AppraisalMode;
|
|
172
269
|
}, description: string): Promise<MolrooPersona>;
|
|
173
270
|
/**
|
|
174
271
|
* Connect to an existing persona by ID.
|
|
@@ -195,7 +292,6 @@ export declare class MolrooPersona {
|
|
|
195
292
|
memory?: MemoryAdapter;
|
|
196
293
|
recall?: RecallLimits;
|
|
197
294
|
events?: EventAdapter;
|
|
198
|
-
appraisalMode?: AppraisalMode;
|
|
199
295
|
}, personaId: string): Promise<MolrooPersona>;
|
|
200
296
|
/**
|
|
201
297
|
* List all personas for the authenticated tenant.
|
|
@@ -231,15 +327,41 @@ export declare class MolrooPersona {
|
|
|
231
327
|
appraisal: AppraisalVector;
|
|
232
328
|
}): Promise<AgentResponse>;
|
|
233
329
|
/**
|
|
234
|
-
*
|
|
330
|
+
* Register a received message with the emotion engine and update the persona's emotional state.
|
|
235
331
|
*
|
|
236
|
-
*
|
|
237
|
-
*
|
|
238
|
-
*
|
|
332
|
+
* This is the **core API** for the `hear() + getState()` pattern. Apps that build their own
|
|
333
|
+
* LLM prompts should call `hear()` after each user message to keep the emotion engine in sync,
|
|
334
|
+
* then call `getState()` to read updated state for prompt assembly.
|
|
239
335
|
*
|
|
240
|
-
* @
|
|
336
|
+
* Use {@link chat} when you want the SDK to handle prompt assembly and LLM orchestration.
|
|
337
|
+
* Use `hear()` + `getState()` when your app owns the LLM call.
|
|
338
|
+
*
|
|
339
|
+
* @param message - The incoming message text (user utterance, narration, etc.).
|
|
340
|
+
* @param from - Who sent the message. A plain string is used as the source entity name.
|
|
341
|
+
* Pass an {@link InterlocutorContext} object for richer context (description, extensions).
|
|
342
|
+
* @returns Emotion engine response with updated VAD, discrete emotion, and any side effects
|
|
343
|
+
* (memory episodes, social updates, stage transitions, etc.).
|
|
344
|
+
*
|
|
345
|
+
* @example Basic hear + getState pattern
|
|
346
|
+
* ```typescript
|
|
347
|
+
* // Step 1: register message with emotion engine
|
|
348
|
+
* await persona.hear('You did a great job today!', 'Alice');
|
|
349
|
+
*
|
|
350
|
+
* // Step 2: read updated psychological state
|
|
351
|
+
* const state = await persona.getState();
|
|
352
|
+
*
|
|
353
|
+
* // Step 3: assemble your own system prompt
|
|
354
|
+
* const systemPrompt = buildPrompt(myPersonaConfig, state);
|
|
355
|
+
* const { text } = await myLLM.generate({ system: systemPrompt, messages });
|
|
356
|
+
* ```
|
|
357
|
+
*
|
|
358
|
+
* @example With structured interlocutor context
|
|
241
359
|
* ```typescript
|
|
242
|
-
*
|
|
360
|
+
* await persona.hear('I need your help', {
|
|
361
|
+
* name: 'Alice',
|
|
362
|
+
* description: 'A regular customer, slightly anxious',
|
|
363
|
+
* extensions: { mood: 'stressed' },
|
|
364
|
+
* });
|
|
243
365
|
* ```
|
|
244
366
|
*/
|
|
245
367
|
hear(message: string, from?: string | InterlocutorContext): Promise<AgentResponse>;
|
|
@@ -302,7 +424,18 @@ export declare class MolrooPersona {
|
|
|
302
424
|
chat(message: string, options?: {
|
|
303
425
|
from?: string | InterlocutorContext;
|
|
304
426
|
history?: Message[];
|
|
427
|
+
/** Free-form app-specific context appended to the system prompt as-is. */
|
|
305
428
|
consumerSuffix?: string;
|
|
429
|
+
/**
|
|
430
|
+
* Behavioral constraints and absolute rules for this conversation.
|
|
431
|
+
* Examples: "Never break character", "Always respond in Korean".
|
|
432
|
+
*/
|
|
433
|
+
consumerRules?: string;
|
|
434
|
+
/**
|
|
435
|
+
* Few-shot example messages that demonstrate the desired style or behavior.
|
|
436
|
+
* Used to guide the LLM's tone and response format.
|
|
437
|
+
*/
|
|
438
|
+
consumerExamples?: string;
|
|
306
439
|
onToolCall?: (call: {
|
|
307
440
|
name: string;
|
|
308
441
|
args: Record<string, unknown>;
|
|
@@ -366,11 +499,53 @@ export declare class MolrooPersona {
|
|
|
366
499
|
otherMessages?: string[];
|
|
367
500
|
}): Promise<Record<string, unknown>>;
|
|
368
501
|
/**
|
|
369
|
-
*
|
|
502
|
+
* Fetch the full psychological state of this persona from the emotion engine.
|
|
503
|
+
*
|
|
504
|
+
* Returns all active subsystems: emotion, soul stage, mask, mood, somatic sensations,
|
|
505
|
+
* narrative self-perception, emotion regulation, self-esteem, TMT state, and relationship.
|
|
506
|
+
*
|
|
507
|
+
* This is the primary data source for apps that build their own LLM prompts. Combine with
|
|
508
|
+
* `hear()` to implement the recommended `hear() + getState()` pattern:
|
|
509
|
+
*
|
|
510
|
+
* ```
|
|
511
|
+
* user message → hear() → emotion engine updates state → getState() → build prompt → LLM
|
|
512
|
+
* ```
|
|
513
|
+
*
|
|
514
|
+
* @returns All psychological subsystems as a {@link PersonaState} object.
|
|
515
|
+
*
|
|
516
|
+
* @example Building a custom system prompt
|
|
517
|
+
* ```typescript
|
|
518
|
+
* const state = await persona.getState();
|
|
370
519
|
*
|
|
371
|
-
*
|
|
520
|
+
* const lines: string[] = [
|
|
521
|
+
* `You are ${name}.`,
|
|
522
|
+
* `Emotion: ${state.emotion.discrete.primary} (${state.emotion.discrete.intensity.toFixed(2)})`,
|
|
523
|
+
* ];
|
|
524
|
+
*
|
|
525
|
+
* if (state.mood) {
|
|
526
|
+
* lines.push(`Mood: valence=${state.mood.V.toFixed(2)} arousal=${state.mood.A.toFixed(2)}`);
|
|
527
|
+
* }
|
|
528
|
+
* if (state.narrative) {
|
|
529
|
+
* lines.push(`Narrative: agency=${state.narrative.agency.toFixed(2)} tone=${state.narrative.tone.toFixed(2)}`);
|
|
530
|
+
* }
|
|
531
|
+
* if (state.selfEsteem) {
|
|
532
|
+
* lines.push(`Self-esteem: ${state.selfEsteem.global.toFixed(2)}`);
|
|
533
|
+
* }
|
|
534
|
+
* if (state.tmt && state.tmt.mortalitySalience > 0.5) {
|
|
535
|
+
* lines.push(`Existential tension is high. Defense mode: ${state.tmt.defenseMode}`);
|
|
536
|
+
* }
|
|
537
|
+
*
|
|
538
|
+
* const systemPrompt = lines.join('\n');
|
|
539
|
+
* ```
|
|
372
540
|
*/
|
|
373
541
|
getState(): Promise<PersonaState>;
|
|
542
|
+
/**
|
|
543
|
+
* Fetch this persona's identity config (identity, personality, goals).
|
|
544
|
+
*
|
|
545
|
+
* Returns a {@link PersonaIdentity} suitable for passing to {@link buildPrompt}
|
|
546
|
+
* when assembling system prompts entirely client-side.
|
|
547
|
+
*/
|
|
548
|
+
getIdentity(): Promise<PersonaIdentity>;
|
|
374
549
|
/**
|
|
375
550
|
* Get a full snapshot of the persona (config + engine state).
|
|
376
551
|
* Useful for backup, migration, or debugging.
|
|
@@ -400,17 +575,56 @@ export declare class MolrooPersona {
|
|
|
400
575
|
restore(): Promise<void>;
|
|
401
576
|
/**
|
|
402
577
|
* Fetch the server-assembled system prompt for this persona.
|
|
403
|
-
* Includes identity, behavioral instructions, psychological state,
|
|
404
|
-
* expression style (if StyleProfile set), and consumerSuffix.
|
|
405
578
|
*
|
|
406
|
-
*
|
|
579
|
+
* The server builds a complete system prompt from the persona's live state. It includes:
|
|
580
|
+
* 1. **Identity** — name, role, core values, speaking style, description
|
|
581
|
+
* 2. **Behavioral instructions** — stay in character, embody state, match language
|
|
582
|
+
* 3. **Psychological state** — emotion, mood, somatic, narrative, goals (from live engine)
|
|
583
|
+
* 4. **Expression constraints** — message length, formality, patterns (only if StyleProfile set)
|
|
584
|
+
* 5. **consumerRules** — behavioral constraints and absolute rules (e.g., "Never break character")
|
|
585
|
+
* 6. **consumerExamples** — few-shot example messages for style/behavior reference
|
|
586
|
+
* 7. **consumerSuffix** — your app-specific context, appended last
|
|
587
|
+
*
|
|
588
|
+
* This is a **middle-tier API** — between the low-level `getState()` (raw data) and the
|
|
589
|
+
* high-level `chat()` (full orchestration). Use it when you want to drive the LLM yourself
|
|
590
|
+
* but still benefit from server-side prompt assembly.
|
|
591
|
+
*
|
|
592
|
+
* Called automatically by {@link chat}. Call directly when:
|
|
593
|
+
* - You use a custom LLM framework not supported by the SDK
|
|
594
|
+
* - You need to inspect or transform the system prompt before sending
|
|
595
|
+
* - You need prompt + state in a single round-trip (avoids a separate `getState()` call)
|
|
596
|
+
*
|
|
597
|
+
* **Do NOT** include identity, personality, or emotion in `consumerSuffix` — those are
|
|
598
|
+
* already present. Duplicating them wastes tokens and may confuse the LLM.
|
|
599
|
+
*
|
|
600
|
+
* @param options - Prompt context options.
|
|
601
|
+
* @param options.consumerSuffix - Free-form app-specific context appended to the system prompt as-is.
|
|
602
|
+
* Examples: scene description, available actions, current quest objective.
|
|
603
|
+
* @param options.consumerRules - Behavioral constraints and absolute rules.
|
|
604
|
+
* Examples: "Never break character", "Always respond in Korean", "Do not discuss competitors".
|
|
605
|
+
* @param options.consumerExamples - Few-shot example messages for style/behavior reference.
|
|
606
|
+
* Helps the LLM match a specific tone or response format.
|
|
607
|
+
* @param options.sourceEntity - Name of the conversation partner for interlocutor-aware rendering.
|
|
608
|
+
* @returns `systemPrompt` (ready to pass to LLM), `personaPrompt` (structured breakdown),
|
|
609
|
+
* and optional `tools` (if the persona has tools configured).
|
|
407
610
|
*
|
|
408
|
-
* @
|
|
409
|
-
*
|
|
410
|
-
*
|
|
411
|
-
*
|
|
611
|
+
* @example Custom LLM call with server-assembled prompt
|
|
612
|
+
* ```typescript
|
|
613
|
+
* const { systemPrompt } = await persona.getPromptContext({
|
|
614
|
+
* consumerSuffix: 'Available actions: [flee, fight, negotiate]',
|
|
615
|
+
* consumerRules: 'Always respond in English. Never break character.',
|
|
616
|
+
* sourceEntity: 'Alice',
|
|
617
|
+
* });
|
|
618
|
+
* const response = await myLLM.complete({ system: systemPrompt, messages });
|
|
619
|
+
* await persona.hear(userMessage, 'Alice');
|
|
620
|
+
* ```
|
|
412
621
|
*/
|
|
413
|
-
getPromptContext(
|
|
622
|
+
getPromptContext(options?: {
|
|
623
|
+
consumerSuffix?: string;
|
|
624
|
+
consumerRules?: string;
|
|
625
|
+
consumerExamples?: string;
|
|
626
|
+
sourceEntity?: string;
|
|
627
|
+
}): Promise<{
|
|
414
628
|
systemPrompt: string;
|
|
415
629
|
personaPrompt: Record<string, unknown>;
|
|
416
630
|
tools?: Array<Record<string, unknown>>;
|
|
@@ -434,4 +648,24 @@ export declare class MolrooPersona {
|
|
|
434
648
|
private get memoryPipelineDeps();
|
|
435
649
|
private requireLLM;
|
|
436
650
|
}
|
|
651
|
+
/**
|
|
652
|
+
* Assemble a system prompt entirely client-side from a {@link PersonaIdentity} and
|
|
653
|
+
* {@link PersonaState}.
|
|
654
|
+
*
|
|
655
|
+
* Use this with the `hear() + getState()` pattern when you own the LLM call:
|
|
656
|
+
* ```
|
|
657
|
+
* await persona.hear(userMessage);
|
|
658
|
+
* const [identity, state] = await Promise.all([persona.getIdentity(), persona.getState()]);
|
|
659
|
+
* const systemPrompt = buildPrompt(identity, state, { consumerSuffix: 'Scene: coffee shop.' });
|
|
660
|
+
* ```
|
|
661
|
+
*
|
|
662
|
+
* @param identity - Persona config from {@link MolrooPersona.getIdentity}.
|
|
663
|
+
* @param state - Live emotional state from {@link MolrooPersona.getState}.
|
|
664
|
+
* @param options - Optional consumer-provided context appended to the prompt.
|
|
665
|
+
*/
|
|
666
|
+
export declare function buildPrompt(identity: PersonaIdentity, state: PersonaState, options?: {
|
|
667
|
+
consumerRules?: string;
|
|
668
|
+
consumerExamples?: string;
|
|
669
|
+
consumerSuffix?: string;
|
|
670
|
+
}): string;
|
|
437
671
|
//# sourceMappingURL=persona.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persona.d.ts","sourceRoot":"","sources":["../../src/persona.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EACV,aAAa,EACb,
|
|
1
|
+
{"version":3,"file":"persona.d.ts","sourceRoot":"","sources":["../../src/persona.ts"],"names":[],"mappings":"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"}
|