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;
}
|