| 257 | } |
| 258 | |
| 259 | function deriveStepStopReason(response: LLMChatResponse): LoopStepStopReason { |
| 260 | switch (response.providerFinishReason) { |
| 261 | case 'truncated': |
| 262 | return 'max_tokens'; |
| 263 | case 'filtered': |
| 264 | return 'filtered'; |
| 265 | case 'paused': |
| 266 | return 'paused'; |
| 267 | case 'other': |
| 268 | return 'unknown'; |
| 269 | case 'completed': |
| 270 | case undefined: |
| 271 | return response.toolCalls.length > 0 ? 'tool_use' : 'end_turn'; |
| 272 | case 'tool_calls': |
| 273 | return response.toolCalls.length > 0 ? 'tool_use' : 'unknown'; |
| 274 | default: { |
| 275 | const _exhaustive: never = response.providerFinishReason; |
| 276 | return _exhaustive; |
| 277 | } |
| 278 | } |
| 279 | } |
| 280 | |
| 281 | function stepEndProviderDiagnostics( |
| 282 | response: LLMChatResponse, |