recall method
Up to k earlier messages most relevant to query, oldest first,
excluding the last skipRecent (which recent already covers).
Implementation
Future<List<ChatMessage>> recall(
String query, {
int k = 4,
int skipRecent = 0,
}) async {
if (k <= 0) return const [];
var scope = _scope;
if (skipRecent > 0) {
final newest = await store.list(
filter: _scope,
limit: skipRecent,
newestFirst: true,
);
if (newest.length < skipRecent) return const [];
// Everything strictly older than the oldest message `recent` will show.
scope = scope & Filter.lt('seq', _stampOf(newest.last));
}
final hits = [
...await store.query(
CollectionQuery(
vector: await embedder.embedOne(query, purpose: EmbedPurpose.query),
text: query,
filter: scope,
k: k,
),
),
];
hits.sort((a, b) {
final x = a.metadata?['seq'];
final y = b.metadata?['seq'];
return (x is num ? x : 0).compareTo(y is num ? y : 0);
});
return [
for (final h in hits)
ChatMessage(switch (h.metadata?['role']) {
final String role => ChatRole.values.byName(role),
_ => ChatRole.user,
}, h.text ?? ''),
];
}