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 · 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 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