* backend draft * fix for tool and streaming * do frontend side * working * working tools * rm * handle list endpoint * handle for ai agents * fix for models requiring inference id * cleaning * fix desc issue * fix tool usage * fix structured output * cleaning * fix for api * rm * fix input images * cleaning * chore: use aws sdk (#7156) * feat(ai): Add AWS SDK dependencies for Bedrock integration - Add aws-sdk-bedrockruntime v1.113.0 - Add aws-credential-types for bearer token authentication - Update rustls to v0.23.35 for compatibility - Dependencies added to windmill-common for AI features * feat(ai): Add bearer token provider for Bedrock authentication - Implement BearerTokenProvider using aws_credential_types - Simple token-based auth using API keys from Windmill resources - Add basic unit tests for provider creation - Export bedrock_auth module in lib.rs * feat(ai): Add Bedrock client wrapper with region extraction - Implement BedrockClient wrapper around AWS SDK client - Bearer token authentication integration - Extract AWS region from Bedrock base URL automatically - Comprehensive unit tests for region extraction - Make aws-config non-optional dependency for AI features - Update feature flags to reflect new dependency structure * cargo * feat(ai): Implement non-streaming Bedrock via AWS SDK Use official AWS SDK instead of manual HTTP requests for better type safety and maintainability. Implements the Bedrock converse() API for non-streaming requests with proper bearer token authentication and message format conversion between OpenAI and Bedrock formats. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * refactor(ai): Eliminate Simple* conversion types for Bedrock SDK - Move AI types to windmill-common/src/ai_types.rs for shared access - Update bedrock_converters to work directly with OpenAI types - Remove ~200 lines of conversion boilerplate from ai_executor.rs and bedrock.rs - Remove unused imports to clean compilation warnings - Benefits: 50% fewer conversion steps, no information loss, easier maintenance 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * feat(ai): Add streaming support for AWS Bedrock SDK - Implement converse_stream() for Bedrock streaming responses - Use EventReceiver.recv() to process stream events - Extract text deltas using bedrock_stream_event_to_text() - Send TokenDelta events to StreamEventProcessor for real-time updates - Refactor request building to eliminate duplication between streaming and non-streaming - Clean, minimal implementation following AWS SDK patterns 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * revert flake change * fix * feat(ai): Add tool calls and image support for Bedrock streaming **Phase 1: Streaming Tool Call Support** - Add stream event processing functions in bedrock_converters.rs: - bedrock_stream_event_to_tool_start() - Extract tool use start from ContentBlockStart - bedrock_stream_event_to_tool_delta() - Extract tool input deltas from ContentBlockDelta - bedrock_stream_event_is_block_stop() - Detect ContentBlockStop events - streaming_tool_calls_to_openai() - Convert accumulated tool calls to OpenAI format - Update ai_executor.rs streaming loop with tool call accumulator (HashMap) - Track current tool use ID during streaming - Send ToolCallArguments events to StreamEventProcessor - Return accumulated tool calls instead of empty vector **Phase 2: Image Input Support** - Add parse_image_data_url() to extract format and base64 data from data URLs - Add content_part_to_block() to convert ContentPart to Bedrock ContentBlock - Refactor convert_message() to handle multi-part content with images - Support ImageUrl conversion to Bedrock ImageBlock with proper format (png/jpeg/gif/webp) - Import AWS SDK image types: ImageBlock, ImageSource, ImageFormat - Keep content_to_text() helper for system message text extraction **Benefits**: - ✅ Tool calling now works in both streaming and non-streaming modes - ✅ Images are properly converted instead of being silently dropped - ✅ Structured output works in streaming (uses tool calling) - ✅ Full feature parity with manual HTTP implementation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * cleaning * fix(ai): Add S3 image support and structured output for Bedrock **Fixes:** 1. **S3 Image Support**: Call prepare_messages_for_api() before Bedrock SDK path to convert S3Objects to ImageUrls - Downloads images from S3 and encodes as base64 data URLs - Ensures images are properly handled in both streaming and non-streaming modes 2. **Structured Output**: Add ToolChoice::Any when structured output tool is present - Forces Bedrock to call the structured_output tool - Ensures JSON schema compliance for structured output - Works in both streaming and non-streaming modes **Changes:** - ai_executor.rs: Call prepare_messages_for_api() for Bedrock SDK path - ai_executor.rs: Set tool_choice to Any when structured_output_tool_name is present - aws_bedrock.rs: Remove unused ToolChoice imports (used via full path in worker) **Testing:** - ✅ S3 images are now downloaded and converted before API call - ✅ Structured output now forces tool usage with ToolChoice::Any - ✅ Both work in streaming and non-streaming modes 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * cleaning * cleaning * cleaning * better error * cleaning * cleaning * rm * rename * apply region --------- Co-authored-by: Claude <noreply@anthropic.com> * fix default * no panic * no print * use utils file * cleaning --------- Co-authored-by: Claude <noreply@anthropic.com>
158 lines
5.9 KiB
TOML
158 lines
5.9 KiB
TOML
[package]
|
|
name = "windmill-worker"
|
|
version.workspace = true
|
|
authors.workspace = true
|
|
edition.workspace = true
|
|
|
|
[lib]
|
|
name = "windmill_worker"
|
|
path = "src/lib.rs"
|
|
|
|
[features]
|
|
default = []
|
|
private = []
|
|
prometheus = ["dep:prometheus", "windmill-common/prometheus"]
|
|
enterprise = ["windmill-queue/enterprise", "windmill-git-sync/enterprise", "windmill-common/enterprise", "dep:pem", "dep:tokio-util"]
|
|
mssql = ["dep:tiberius"]
|
|
bigquery = ["dep:gcp_auth"]
|
|
benchmark = ["windmill-queue/benchmark", "windmill-common/benchmark"]
|
|
parquet = ["windmill-common/parquet", "dep:object_store"]
|
|
flow_testing = []
|
|
cloud = []
|
|
sqlx = []
|
|
deno_core = ["dep:deno_fetch", "dep:deno_webidl", "dep:deno_web", "dep:deno_net", "dep:deno_console", "dep:deno_url", "dep:deno_core",
|
|
"dep:deno_ast", "dep:deno_tls", "dep:deno_permissions", "dep:deno_io", "dep:deno_runtime", "dep:deno_telemetry", "dep:deno_error", "dep:winapi"]
|
|
libffi_mac = ["dep:libffi-sys"]
|
|
otel = ["windmill-common/otel", "dep:opentelemetry"]
|
|
dind = ["dep:bollard"]
|
|
php = ["dep:windmill-parser-php"]
|
|
mysql = ["dep:mysql_async"]
|
|
oracledb = ["dep:oracle"]
|
|
python = ["dep:windmill-parser-py", "dep:windmill-parser-py-imports"]
|
|
csharp = ["dep:windmill-parser-csharp"]
|
|
rust = ["dep:windmill-parser-rust"]
|
|
nu = ["dep:windmill-parser-nu"]
|
|
java = ["dep:windmill-parser-java"]
|
|
ruby = ["dep:windmill-parser-ruby"]
|
|
duckdb = ["dep:libloading"]
|
|
|
|
[dependencies]
|
|
windmill-queue.workspace = true
|
|
windmill-audit.workspace = true # there isn't really a reason for audit-worth actions to happen in the worker.
|
|
windmill-common = { workspace = true, default-features = false }
|
|
windmill-macros.workspace = true
|
|
windmill-parser.workspace = true
|
|
windmill-parser-ts.workspace = true
|
|
windmill-parser-go.workspace = true
|
|
windmill-parser-rust = { workspace = true, optional = true }
|
|
windmill-parser-csharp = { workspace = true, optional = true }
|
|
windmill-parser-nu = { workspace = true, optional = true }
|
|
windmill-parser-java = { workspace = true, optional = true }
|
|
windmill-parser-ruby = { workspace = true, optional = true }
|
|
windmill-parser-py = { workspace = true, optional = true }
|
|
windmill-parser-yaml.workspace = true
|
|
windmill-parser-py-imports = { workspace = true, optional = true }
|
|
windmill-parser-bash.workspace = true
|
|
windmill-parser-sql.workspace = true
|
|
windmill-parser-graphql.workspace = true
|
|
windmill-parser-php = { workspace = true, optional = true }
|
|
windmill-git-sync.workspace = true
|
|
rmcp = { version = "0.8.1", features = ["client", "transport-streamable-http-client", "transport-streamable-http-client-reqwest"] }
|
|
aws-sdk-bedrockruntime.workspace = true
|
|
aws-config.workspace = true
|
|
aws-credential-types.workspace = true
|
|
aws-smithy-types.workspace = true
|
|
flume.workspace = true
|
|
sqlx.workspace = true
|
|
uuid.workspace = true
|
|
ulid.workspace = true
|
|
tracing.workspace = true
|
|
tokio.workspace = true
|
|
tokio-stream.workspace = true
|
|
serde.workspace = true
|
|
serde_json.workspace = true
|
|
futures.workspace = true
|
|
async-recursion.workspace = true
|
|
async-trait.workspace = true
|
|
anyhow.workspace = true
|
|
itertools.workspace = true
|
|
regex.workspace = true
|
|
prometheus = { workspace = true, optional = true }
|
|
lazy_static.workspace = true
|
|
chrono.workspace = true
|
|
dotenv.workspace = true
|
|
rand.workspace = true # TODO: Remove. only used by token creation hack.
|
|
const_format.workspace = true
|
|
mappable-rc.workspace = true
|
|
git-version.workspace = true
|
|
dyn-iter.workspace = true
|
|
once_cell.workspace = true
|
|
tokio-postgres.workspace = true
|
|
bit-vec.workspace = true
|
|
url.workspace = true
|
|
deno_telemetry = { workspace = true, optional = true }
|
|
deno_fetch = { workspace = true, optional = true }
|
|
deno_webidl = { workspace = true, optional = true }
|
|
deno_web = { workspace = true, optional = true }
|
|
deno_net = { workspace = true, optional = true }
|
|
deno_console = { workspace = true, optional = true }
|
|
deno_url = { workspace = true, optional = true }
|
|
deno_core = { workspace = true, optional = true }
|
|
deno_ast = { workspace = true, optional = true }
|
|
deno_tls = { workspace = true, optional = true }
|
|
deno_permissions = { workspace = true, optional = true }
|
|
deno_io = { workspace = true, optional = true }
|
|
deno_error = { workspace = true, optional = true }
|
|
async-stream.workspace = true
|
|
|
|
postgres-native-tls.workspace = true
|
|
native-tls.workspace = true
|
|
mysql_async = { workspace = true, optional = true }
|
|
base64.workspace = true
|
|
gcp_auth = { workspace = true, optional = true }
|
|
rust_decimal.workspace = true
|
|
jsonwebtoken.workspace = true
|
|
sha2.workspace = true
|
|
pem = { workspace = true, optional = true }
|
|
urlencoding.workspace = true
|
|
nix.workspace = true
|
|
bytes.workspace = true
|
|
reqwest.workspace = true
|
|
reqwest-middleware.workspace = true
|
|
eventsource-stream.workspace = true
|
|
mime_guess.workspace = true
|
|
hex.workspace = true
|
|
tiberius = { workspace = true, optional = true }
|
|
tokio-util = { workspace = true, optional = true }
|
|
tar.workspace = true
|
|
object_store = { workspace = true, optional = true}
|
|
convert_case.workspace = true
|
|
yaml-rust.workspace = true
|
|
backon.workspace = true
|
|
winapi = { workspace = true, optional = true }
|
|
pep440_rs.workspace = true
|
|
process-wrap.workspace = true
|
|
async-once-cell.workspace = true
|
|
libloading = { workspace = true, optional = true }
|
|
|
|
opentelemetry = { workspace = true, optional = true }
|
|
bollard = { workspace = true, optional = true }
|
|
oracle = { workspace = true, optional = true }
|
|
|
|
[build-dependencies]
|
|
deno_fetch = { workspace = true, optional = true }
|
|
deno_webidl = { workspace = true, optional = true }
|
|
deno_web = { workspace = true, optional = true }
|
|
deno_net = { workspace = true, optional = true }
|
|
deno_console = { workspace = true, optional = true }
|
|
deno_url = { workspace = true, optional = true }
|
|
deno_core = { workspace = true, optional = true }
|
|
deno_ast = { workspace = true, optional = true }
|
|
deno_tls = { workspace = true, optional = true }
|
|
deno_permissions = { workspace = true, optional = true }
|
|
deno_io = { workspace = true, optional = true }
|
|
deno_runtime = { workspace = true, optional = true }
|
|
deno_telemetry = { workspace = true, optional = true }
|
|
winapi = { workspace = true, optional = true }
|
|
libffi-sys = { workspace = true, optional = true }
|