-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathassembler.ts
More file actions
81 lines (68 loc) · 2.33 KB
/
Copy pathassembler.ts
File metadata and controls
81 lines (68 loc) · 2.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import type { SlotWriterInternal } from './slot-writer.js';
import type {
ImageAsset,
Message,
PromptResult,
ResolvedMessage,
Slot,
TraceEntry,
} from './types.js';
function mergeSlotPair(
bodyWriter: SlotWriterInternal | undefined,
contextWriter: SlotWriterInternal | undefined,
): ResolvedMessage | null {
const bodyText = bodyWriter?.getText() ?? '';
const contextText = contextWriter?.getText() ?? '';
if (!bodyText && !contextText) return null;
const parts: string[] = [];
if (bodyText) parts.push(bodyText);
if (contextText) parts.push(contextText);
const images: ImageAsset[] = [
...(bodyWriter?.getImages() ?? []),
...(contextWriter?.getImages() ?? []),
];
const msg: ResolvedMessage = { role: 'user', content: parts.join('\n') };
if (images.length > 0) msg.images = images;
return msg;
}
function segmentsToMessages(writer: SlotWriterInternal | undefined): ResolvedMessage[] {
if (!writer) return [];
const images = writer.getImages();
return writer.getSegments().map((text, i) => {
const msg: ResolvedMessage = { role: 'user', content: text };
if (i === 0 && images.length > 0) msg.images = images;
return msg;
});
}
export function assembleResult(
writers: Map<Slot, SlotWriterInternal>,
threadHistory: Message[],
trace: TraceEntry[],
): PromptResult {
const systemWriter = writers.get('system');
const system = systemWriter?.getText() ?? '';
const afterSystemMessages = segmentsToMessages(writers.get('afterSystem'));
const afterSystem = writers.get('afterSystem')?.getSegments() ?? [];
const firstMessage = mergeSlotPair(
writers.get('firstUserMessage'),
writers.get('firstUserMessageContext'),
);
const historyMessages: ResolvedMessage[] = threadHistory.map((m) => {
const msg: ResolvedMessage = { role: m.role, content: m.content };
if (m.images?.length) msg.images = m.images;
return msg;
});
const lastMessage = mergeSlotPair(
writers.get('lastUserMessage'),
writers.get('lastUserMessageContext'),
);
const afterUserMessages = segmentsToMessages(writers.get('afterUser'));
const messages: ResolvedMessage[] = [
...afterSystemMessages,
...(firstMessage ? [firstMessage] : []),
...historyMessages,
...(lastMessage ? [lastMessage] : []),
...afterUserMessages,
];
return { system, afterSystem, messages, trace };
}