recall method

Future<List<ChatMessage>> recall(
  1. String query, {
  2. int k = 4,
  3. int skipRecent = 0,
})

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 ?? ''),
  ];
}