mirror of
https://github.com/BerriAI/litellm.git
synced 2026-09-26 01:12:21 +00:00
Add an aws_textract OCR provider on the Rust route, with no Python path. The detect-document-text model returns plain lines and analyze-document renders layout and tables as markdown. Both use Textract's synchronous API, so a multi-page PDF or TIFF is rejected with an error that names the single-page limit. A call with no region fails instead of falling back to Bedrock's default SigV4 covers the request body, and host hooks can rewrite that body before it is sent. litellm-http now has OutboundRequest, which serializes the body once, shows those bytes to a RequestSigner and is the only thing a route can send. Chat, audio transcription and OCR build it after their hooks ran, so a callback that redacts the body still produces a valid Bedrock or Textract signature ChatCompletionsAuth and AudioTranscriptionAuth are replaced by litellm_auth::RequestAuth, and one helper in core turns it into a signed or unsigned request. Audio transcription now signs only the AWS header set and rejects a forwarded header that SigV4 computes, the same as chat The OCR catalog routes aws_textract as Rust required, and the dispatch context reads the provider from the model prefix so a provider scoped rule can match
23 lines
786 B
Rust
23 lines
786 B
Rust
use std::path::PathBuf;
|
|
|
|
#[derive(Clone, Debug, thiserror::Error, PartialEq, Eq)]
|
|
pub enum Error {
|
|
#[error("could not read {}: {message}", path.display())]
|
|
Read { path: PathBuf, message: String },
|
|
#[error("{} is not a PEM file: {message}", path.display())]
|
|
InvalidPem { path: PathBuf, message: String },
|
|
#[error("could not build the HTTP client: {0}")]
|
|
Client(String),
|
|
#[error("request body could not be serialized: {0}")]
|
|
RequestBody(String),
|
|
#[error("request forwards a header the signer computes: {0}")]
|
|
ComputedHeader(String),
|
|
#[error("request signing failed: {0}")]
|
|
Signature(String),
|
|
}
|
|
|
|
impl From<reqwest::Error> for Error {
|
|
fn from(error: reqwest::Error) -> Self {
|
|
Self::Client(error.without_url().to_string())
|
|
}
|
|
}
|