File size: 1,355 Bytes
68d7816
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import type { Message } from '#/llm/message';
import type { MessageResolver } from '#/llm/requester/actor';

import type { ToolSelectState } from './state';

export function createToolSelectMessageResolver(state: ToolSelectState): MessageResolver {
  return {
    id: 'tool-select',
    resolve: (messages) => {
      let shaped: Message[] | undefined;
      for (let i = 0; i < messages.length; i += 1) {
        const message = messages[i] as Message;
        const next = shapeMessage(message, state);
        if (next === message) {
          if (shaped !== undefined) shaped.push(message);
          continue;
        }
        shaped ??= messages.slice(0, i);
        if (next !== undefined) shaped.push(next);
      }
      return Promise.resolve(shaped ?? messages);
    },
  };
}

function shapeMessage(message: Message, state: ToolSelectState): Message | undefined {
  if (message.role !== 'system' || message.tools === undefined || message.tools.length === 0) {
    return message;
  }
  const kept = state.enabled()
    ? message.tools.filter((tool) => state.isLoadable(tool.name))
    : [];
  if (kept.length === message.tools.length) return message;
  if (kept.length > 0) return { ...message, tools: kept };
  if (message.content.length === 0) return undefined;
  const { tools: _tools, ...rest } = message;
  void _tools;
  return rest;
}