* feat: add token usage tracking to AI agent output Add TokenUsage struct to track input/output/cache tokens from AI providers. Currently implemented for Bedrock provider, with infrastructure in place for other providers. Usage is included in the AI agent result alongside output and messages when available. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add token usage extraction for Anthropic provider Extract usage from message_delta SSE event and convert to TokenUsage. Includes input_tokens, output_tokens, cache_read_input_tokens, and cache_creation_input_tokens (mapped to cache_write_input_tokens). Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add token usage extraction for Google AI/Gemini provider Extract usage from usageMetadata in Gemini SSE events and convert to TokenUsage. Maps promptTokenCount -> input_tokens, candidatesTokenCount -> output_tokens, totalTokenCount -> total_tokens. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add token usage extraction for OpenAI Responses API provider Extract usage from response.completed SSE event and convert to TokenUsage. Maps input_tokens, output_tokens, and total_tokens directly. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add token usage extraction for Azure OpenAI / Chat Completions API Add stream_options.include_usage to request and parse usage from final SSE chunk for providers using the standard OpenAI Chat Completions API (Azure OpenAI, Mistral, DeepSeek, Groq, TogetherAI, CustomAI). Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: cleanup token usage tracking - remove unused Image usage field and accumulate across iterations - Remove unused `usage` field from ParsedResponse::Image variant - Add TokenUsage::accumulate() method to sum usage across agent iterations - Accumulate input/output/total/cache tokens instead of replacing with last iteration 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * fix: remove verbose debug logging from AI providers Remove tracing::info!("[debug] ...") statements that were too verbose for production. These logged raw events on every streaming event. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * feat: add retry mechanism for OpenAI-compatible providers without stream_options support Some OpenAI-compatible providers don't support the stream_options parameter for usage tracking. This adds a retry mechanism that: - First attempts the request with stream_options.include_usage - If it fails with 400 and error mentions stream_options/include_usage, automatically retries without the parameter 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * fix: remove unnecessary text parsing overhead in image response handlers Revert debugging changes that read response as text before parsing JSON. Using response.json() directly is more efficient. Co-Authored-By: Claude <noreply@anthropic.com> * refactor: centralize TokenUsage conversion with constructor methods Add new(), from_input_output(), and with_cache() constructors to TokenUsage to eliminate duplicate conversion logic across providers. Also fixes potential truncation in Bedrock cache token conversion by using i32::try_from with fallback to i32::MAX. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * refactor: simplify Anthropic usage extraction and add Default derive - Use idiomatic `if let` pattern instead of `is_some()` check for usage extraction - Add Default derive to OpenAIChatUsage for consistency with other usage structs Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: use saturating_add to prevent overflow in token accumulation In long-running agents with many iterations, token counts could potentially overflow. Using saturating_add ensures values cap at i32::MAX instead of wrapping around. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * better claude * nit --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Windmill Worker
The worker. Used to process and execute flows & jobs.
This crate exposes both a library as well as a binary target.