diff --git a/src/LLMOrbiter.js b/src/LLMOrbiter.js index b293d8f..30610b9 100644 --- a/src/LLMOrbiter.js +++ b/src/LLMOrbiter.js @@ -221,12 +221,11 @@ class LLMOrbiter { break; } - // Execute each tool call locally + const pendingAppendedMessages = []; for (let callIdx = 0; callIdx < toolCalls.length; callIdx++) { const callItem = toolCalls[callIdx]; - const fnName = callItem.function?.name; + const fnName = callItem.function.name; const invokeFn = toolMap.get(fnName); - let result; let isError = false; let errorMsg = null; @@ -251,7 +250,11 @@ class LLMOrbiter { call(onToolCall, { name: fnName, args }); try { - result = await invokeFn(args, { signal: runSignal }); + result = await invokeFn(args, { + signal: runSignal, + messages, + appendMessage: (msg) => pendingAppendedMessages.push(msg), + }); } catch (err) { // An abort must propagate, not be recorded as a tool error. if (runSignal.aborted) throw ensureAbortError(runSignal.reason); @@ -291,6 +294,12 @@ class LLMOrbiter { errorMsg = typeof result.error === 'string' ? result.error : JSON.stringify(result.error); call(onToolError, { name: fnName, error: errorMsg, args }); } + + if (result && typeof result === 'object' && Array.isArray(result.appendMessages)) { + for (const msg of result.appendMessages) { + pendingAppendedMessages.push(msg); + } + } } } @@ -309,6 +318,12 @@ class LLMOrbiter { } if (hasDirectReturn) break; + + if (pendingAppendedMessages.length > 0) { + for (const msg of pendingAppendedMessages) { + messages.push(msg); + } + } }