@@ -7,7 +7,6 @@ use std::str::FromStr;
7
7
8
8
use crate :: Agent ;
9
9
use crate :: agent:: AgentError ;
10
- use crate :: agent:: AgentError :: SerializationError ;
11
10
use crate :: core:: event:: Event ;
12
11
use crate :: core:: types:: RunAgentInput ;
13
12
use crate :: core:: { AgentState , FwdProps } ;
@@ -61,7 +60,7 @@ impl HttpAgentBuilder {
61
60
62
61
/// Set the base URL from a string, returning Result for validation
63
62
pub fn with_url_str ( mut self , url : & str ) -> Result < Self , AgentError > {
64
- let parsed_url = Url :: parse ( url) . map_err ( |e| AgentError :: ConfigError {
63
+ let parsed_url = Url :: parse ( url) . map_err ( |e| AgentError :: Config {
65
64
message : format ! ( "Invalid URL '{url}': {e}" ) ,
66
65
} ) ?;
67
66
self . base_url = Some ( parsed_url) ;
@@ -76,10 +75,10 @@ impl HttpAgentBuilder {
76
75
77
76
/// Add a single header by name and value strings
78
77
pub fn with_header ( mut self , name : & str , value : & str ) -> Result < Self , AgentError > {
79
- let header_name = HeaderName :: from_str ( name) . map_err ( |e| AgentError :: ConfigError {
78
+ let header_name = HeaderName :: from_str ( name) . map_err ( |e| AgentError :: Config {
80
79
message : format ! ( "Invalid header name '{value}': {e}" ) ,
81
80
} ) ?;
82
- let header_value = HeaderValue :: from_str ( value) . map_err ( |e| AgentError :: ConfigError {
81
+ let header_value = HeaderValue :: from_str ( value) . map_err ( |e| AgentError :: Config {
83
82
message : format ! ( "Invalid header value '{value}': {e}" ) ,
84
83
} ) ?;
85
84
self . header_map . insert ( header_name, header_value) ;
@@ -115,13 +114,13 @@ impl HttpAgentBuilder {
115
114
}
116
115
117
116
pub fn build ( self ) -> Result < HttpAgent , AgentError > {
118
- let base_url = self . base_url . ok_or ( AgentError :: ConfigError {
117
+ let base_url = self . base_url . ok_or ( AgentError :: Config {
119
118
message : "Base URL is required" . to_string ( ) ,
120
119
} ) ?;
121
120
122
121
// Validate URL scheme
123
122
if ![ "http" , "https" ] . contains ( & base_url. scheme ( ) ) {
124
- return Err ( AgentError :: ConfigError {
123
+ return Err ( AgentError :: Config {
125
124
message : format ! ( "Unsupported URL scheme: {}" , base_url. scheme( ) ) ,
126
125
} ) ;
127
126
}
@@ -142,14 +141,6 @@ impl Default for HttpAgentBuilder {
142
141
}
143
142
}
144
143
145
- impl From < reqwest:: Error > for AgentError {
146
- fn from ( err : reqwest:: Error ) -> Self {
147
- AgentError :: ExecutionError {
148
- message : err. to_string ( ) ,
149
- }
150
- }
151
- }
152
-
153
144
#[ async_trait]
154
145
impl < StateT : AgentState , FwdPropsT : FwdProps > Agent < StateT , FwdPropsT > for HttpAgent {
155
146
async fn run (
@@ -165,6 +156,17 @@ impl<StateT: AgentState, FwdPropsT: FwdProps> Agent<StateT, FwdPropsT> for HttpA
165
156
. send ( )
166
157
. await ?;
167
158
159
+ // Check HTTP status and surface structured error on non-success
160
+ let status = response. status ( ) ;
161
+ if !status. is_success ( ) {
162
+ let text = response. text ( ) . await . unwrap_or_default ( ) ;
163
+ let snippet: String = text. chars ( ) . take ( 512 ) . collect ( ) ;
164
+ return Err ( AgentError :: HttpStatus {
165
+ status,
166
+ context : snippet,
167
+ } ) ;
168
+ }
169
+
168
170
// Convert the response to an SSE event stream
169
171
let stream = response
170
172
. event_source ( )
@@ -173,15 +175,12 @@ impl<StateT: AgentState, FwdPropsT: FwdProps> Agent<StateT, FwdPropsT> for HttpA
173
175
Ok ( event) => {
174
176
trace ! ( "Received event: {event:?}" ) ;
175
177
176
- let event_data: Event < StateT > = serde_json:: from_str ( & event. data )
177
- . map_err ( |err| SerializationError { source : err } ) ?;
178
+ let event_data: Event < StateT > = serde_json:: from_str ( & event. data ) ?;
178
179
debug ! ( "Deserialized event: {event_data:?}" ) ;
179
180
180
181
Ok ( event_data)
181
182
}
182
- Err ( err) => Err ( AgentError :: ExecutionError {
183
- message : err. to_string ( ) ,
184
- } ) ,
183
+ Err ( err) => Err ( err) ,
185
184
} )
186
185
. boxed ( ) ;
187
186
Ok ( stream)
0 commit comments