pub struct EndpointResponse {
pub status: StatusCode,
pub body: Value,
}Expand description
Response from an endpoint handler.
Fields§
§status: StatusCodeHTTP status code.
body: ValueResponse body as JSON.
Implementations§
Source§impl EndpointResponse
impl EndpointResponse
Sourcepub fn ok(body: Value) -> Self
pub fn ok(body: Value) -> Self
Creates a new successful response (200 OK).
Examples found in repository?
examples/serve_simple_endpoints.rs (lines 65-68)
8async fn main() -> helios_engine::Result<()> {
9 // Initialize tracing
10 tracing_subscriber::fmt()
11 .with_max_level(tracing::Level::INFO)
12 .init();
13
14 // Load configuration
15 let config = Config::from_file("config.toml")?;
16
17 // Create an agent with tools
18 let agent = Agent::builder("API Agent")
19 .config(config)
20 .system_prompt("You are a helpful AI assistant with access to a calculator tool.")
21 .tool(Box::new(CalculatorTool))
22 .max_iterations(5)
23 .build()
24 .await?;
25
26 // Create custom endpoints using the new simplified API
27 println!("🎉 Creating custom endpoints with the new simplified API!\n");
28
29 // Method 1: Super simple static endpoints
30 let version_endpoint = helios_engine::get(
31 "/api/version",
32 serde_json::json!({
33 "version": "0.4.4",
34 "service": "Helios Engine",
35 "features": ["agents", "tools", "streaming", "custom_endpoints"]
36 }),
37 );
38
39 let status_endpoint = helios_engine::get(
40 "/api/status",
41 serde_json::json!({
42 "status": "operational",
43 "model": "agent-based"
44 }),
45 );
46
47 // Method 2: Using the builder pattern for more control
48 let info_endpoint = EndpointBuilder::get("/api/info")
49 .json(serde_json::json!({
50 "name": "Helios Engine API",
51 "description": "AI Agent Server with Custom Endpoints",
52 "documentation": "https://helios-engine.vercel.app/"
53 }))
54 .description("API information endpoint")
55 .build();
56
57 // Method 3: Dynamic responses with a handler function
58 let echo_endpoint = EndpointBuilder::post("/api/echo")
59 .handle(|req| {
60 let message = req
61 .and_then(|r| r.body)
62 .and_then(|b| b.get("message").cloned())
63 .unwrap_or_else(|| serde_json::json!("No message provided"));
64
65 helios_engine::EndpointResponse::ok(serde_json::json!({
66 "echo": message,
67 "timestamp": chrono::Utc::now().to_rfc3339()
68 }))
69 })
70 .description("Echo endpoint that returns your message")
71 .build();
72
73 // Method 4: Different HTTP methods
74 let create_endpoint = EndpointBuilder::post("/api/create")
75 .json(serde_json::json!({
76 "message": "Resource created",
77 "id": "12345"
78 }))
79 .description("Simulates creating a resource")
80 .build();
81
82 let update_endpoint = EndpointBuilder::put("/api/update")
83 .json(serde_json::json!({
84 "message": "Resource updated"
85 }))
86 .description("Simulates updating a resource")
87 .build();
88
89 let delete_endpoint = helios_engine::delete(
90 "/api/delete",
91 serde_json::json!({
92 "message": "Resource deleted"
93 }),
94 );
95
96 // Collect all endpoints into a vector
97 let custom_endpoints = vec![
98 version_endpoint,
99 status_endpoint,
100 info_endpoint,
101 echo_endpoint,
102 create_endpoint,
103 update_endpoint,
104 delete_endpoint,
105 ];
106
107 // Start the server with the new ServerBuilder API
108 println!("🚀 Starting server with custom endpoints...\n");
109 println!("📡 OpenAI-compatible API endpoints:");
110 println!(" POST /v1/chat/completions");
111 println!(" GET /v1/models");
112 println!("\n📡 Custom endpoints:");
113 println!(" GET /api/version");
114 println!(" GET /api/status");
115 println!(" GET /api/info");
116 println!(" POST /api/echo");
117 println!(" POST /api/create");
118 println!(" PUT /api/update");
119 println!(" DELETE /api/delete");
120 println!("\n💡 Try these commands:");
121 println!(" curl http://127.0.0.1:8000/api/version");
122 println!(" curl http://127.0.0.1:8000/api/status");
123 println!(" curl -X POST http://127.0.0.1:8000/api/echo \\");
124 println!(" -H 'Content-Type: application/json' \\");
125 println!(" -d '{{\"message\": \"Hello, Helios!\"}}'");
126 println!();
127
128 // Method 1: Pass a vector of endpoints (recommended)
129 ServerBuilder::with_agent(agent, "local-model")
130 .address("127.0.0.1:8000")
131 .endpoints(custom_endpoints)
132 .serve()
133 .await?;
134
135 // Method 2: Alternative - you can also use individual .endpoint() calls
136 // ServerBuilder::with_agent(agent, "local-model")
137 // .address("127.0.0.1:8000")
138 // .endpoint(version_endpoint)
139 // .endpoint(status_endpoint)
140 // // ... etc
141 // .serve()
142 // .await?;
143
144 Ok(())
145}Sourcepub fn bad_request(message: &str) -> Self
pub fn bad_request(message: &str) -> Self
Creates a new bad request response (400 BAD REQUEST).
Sourcepub fn internal_error(message: &str) -> Self
pub fn internal_error(message: &str) -> Self
Creates a new internal server error response (500 INTERNAL SERVER ERROR).
Sourcepub fn with_status(status: StatusCode, body: Value) -> Self
pub fn with_status(status: StatusCode, body: Value) -> Self
Creates a custom response with a specific status code.
Trait Implementations§
Source§impl Clone for EndpointResponse
impl Clone for EndpointResponse
Source§fn clone(&self) -> EndpointResponse
fn clone(&self) -> EndpointResponse
Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Debug for EndpointResponse
impl Debug for EndpointResponse
Source§impl IntoResponse for EndpointResponse
impl IntoResponse for EndpointResponse
Source§fn into_response(self) -> Response
fn into_response(self) -> Response
Create a response.
Auto Trait Implementations§
impl Freeze for EndpointResponse
impl RefUnwindSafe for EndpointResponse
impl Send for EndpointResponse
impl Sync for EndpointResponse
impl Unpin for EndpointResponse
impl UnsafeUnpin for EndpointResponse
impl UnwindSafe for EndpointResponse
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T, S> Handler<IntoResponseHandler, S> for T
impl<T, S> Handler<IntoResponseHandler, S> for T
Source§fn call(
self,
_req: Request<Body>,
_state: S,
) -> <T as Handler<IntoResponseHandler, S>>::Future
fn call( self, _req: Request<Body>, _state: S, ) -> <T as Handler<IntoResponseHandler, S>>::Future
Call the handler with the given request.
Source§fn layer<L>(self, layer: L) -> Layered<L, Self, T, S>where
L: Layer<HandlerService<Self, T, S>> + Clone,
<L as Layer<HandlerService<Self, T, S>>>::Service: Service<Request<Body>>,
fn layer<L>(self, layer: L) -> Layered<L, Self, T, S>where
L: Layer<HandlerService<Self, T, S>> + Clone,
<L as Layer<HandlerService<Self, T, S>>>::Service: Service<Request<Body>>,
Apply a
tower::Layer to the handler. Read moreSource§fn with_state(self, state: S) -> HandlerService<Self, T, S>
fn with_state(self, state: S) -> HandlerService<Self, T, S>
Convert the handler into a
Service by providing the stateSource§impl<H, T> HandlerWithoutStateExt<T> for H
impl<H, T> HandlerWithoutStateExt<T> for H
Source§fn into_service(self) -> HandlerService<H, T, ()>
fn into_service(self) -> HandlerService<H, T, ()>
Convert the handler into a
Service and no state.Source§fn into_make_service(self) -> IntoMakeService<HandlerService<H, T, ()>>
fn into_make_service(self) -> IntoMakeService<HandlerService<H, T, ()>>
Convert the handler into a
MakeService and no state. Read moreSource§fn into_make_service_with_connect_info<C>(
self,
) -> IntoMakeServiceWithConnectInfo<HandlerService<H, T, ()>, C>
fn into_make_service_with_connect_info<C>( self, ) -> IntoMakeServiceWithConnectInfo<HandlerService<H, T, ()>, C>
Convert the handler into a
MakeService which stores information
about the incoming connection and has no state. Read more