/v1/messages request builder (cache_control breakpoints on the first 2 system blocks + last 2 messages, tool schema -> input_schema, extended thinking budget) and an SSE decoder built on eventsource-stream, mapping content_block_start/delta/stop and message_delta into our normalized LlmEvent stream (text, thinking+signature, streamed tool-call JSON accumulated and parsed at content_block_stop, usage merged from message_start + message_delta). AnthropicProvider wires this to reqwest with x-api-key/anthropic-version/anthropic-beta headers and classifies HTTP errors into RateLimited/Auth/Overloaded/Http. ProviderRegistry resolves "provider/model" strings. Also tightened processor::process_step's cancellation: the event loop now selects the stream poll against ctx.cancel instead of only checking at the top of the loop, so a blocked provider stream is actually interrupted by abort (matches docs/02-engine.md's cancellation semantics). 127 tests passing, clippy clean.
27 lines
669 B
TOML
27 lines
669 B
TOML
[package]
|
|
name = "harness-providers"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
|
|
[dependencies]
|
|
harness-core = { workspace = true }
|
|
tokio = { workspace = true }
|
|
tokio-util = { workspace = true }
|
|
futures = { workspace = true }
|
|
async-stream = { workspace = true }
|
|
async-trait = { workspace = true }
|
|
reqwest = { workspace = true }
|
|
eventsource-stream = { workspace = true }
|
|
bytes = { workspace = true }
|
|
serde = { workspace = true }
|
|
serde_json = { workspace = true }
|
|
thiserror = { workspace = true }
|
|
tracing = { workspace = true }
|
|
|
|
[dev-dependencies]
|
|
tokio = { workspace = true, features = ["test-util", "macros"] }
|
|
|
|
[lints]
|
|
workspace = true
|