runChat method

Future<void> runChat(
  1. List<ChatMessage> messages, {
  2. int recursiveLimit = 10,
})

Implementation

Future<void> runChat(
  List<ChatMessage> messages, {
  int recursiveLimit = 10,
}) async {
  if (recursiveLimit < 0) {
    error("Recursive limit reached, stopping execution.");
    return;
  }

  final loader =
      Spinner(
        icon: '🧠',
        leftPrompt: (done) => '',
        rightPrompt: (done) => done ? 'Done' : 'Thinking...',
      ).interact();

  List<AgentTool> tools = [ToolRunCommands()];
  ChatResult output = await config.connector
      .createChatModel([...tools.map((i) => i.spec)])
      .invoke(
        PromptValue.chat([ChatMessage.system(systemPrompt()), ...messages]),
      );

  loader.done();
  if (output.output.toolCalls.isNotEmpty) {
    List<ChatMessage> resps = [output.output];
    for (AIChatMessageToolCall tc in output.output.toolCalls) {
      String response = "Unknown tool: ${tc.name}";
      AgentTool? t = tools.select((i) => i.name == tc.name);

      if (t != null) {
        response = await t.call(this, tc);
      }

      resps.add(ChatMessage.tool(toolCallId: tc.id, content: response));
    }

    await runChat([
      ...messages,
      ...resps,
    ], recursiveLimit: recursiveLimit - 1);
  } else {
    print("&2[Agent]: &a${output.outputAsString}".chatColor);
  }
}