( responseMessages: (FunctionMessage | AssistantMessage)[], )
| 181 | } |
| 182 | |
| 183 | export function getAssistantFnMessagePairs( |
| 184 | responseMessages: (FunctionMessage | AssistantMessage)[], |
| 185 | ): (AssistantMessage & { |
| 186 | functionMessages: FunctionMessage[]; |
| 187 | })[] { |
| 188 | /** Split responseMessages into an array of objects, each with an assistant |
| 189 | * message and sequence of function messages that follow it |
| 190 | **/ |
| 191 | // TODO: known bug that if the LLM outputs identical assistant messages then this will include |
| 192 | // too many function messages in the functionMessages arrays of later repetitions of the repeated |
| 193 | // assistant message |
| 194 | // Get the assistant messages |
| 195 | const assistantMessages = responseMessages.filter( |
| 196 | (m) => m.role === "assistant", |
| 197 | ) as AssistantMessage[]; |
| 198 | |
| 199 | return assistantMessages.map((assistMsg: AssistantMessage, idx: number) => { |
| 200 | const currentAssistantMessageIdx = responseMessages.findIndex((m) => |
| 201 | _.isEqual(m, assistMsg), |
| 202 | ); |
| 203 | const nextAssistantMessage = assistantMessages[idx + 1]; |
| 204 | const nextAssistantMessageIdx = nextAssistantMessage |
| 205 | ? responseMessages.findIndex((m) => _.isEqual(m, nextAssistantMessage)) |
| 206 | : responseMessages.length + 1; |
| 207 | const functionMessages = responseMessages.filter( |
| 208 | (m, mi) => |
| 209 | m.role === "function" && |
| 210 | currentAssistantMessageIdx < mi && |
| 211 | mi < nextAssistantMessageIdx, |
| 212 | ) as FunctionMessage[]; |
| 213 | return { |
| 214 | ...assistMsg, |
| 215 | functionMessages, |
| 216 | }; |
| 217 | }); |
| 218 | } |
no outgoing calls
no test coverage detected