1use std::sync::Arc;
2
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6use crate::models::{JsonMap, ResourceList};
7use crate::openapi_paths;
8use crate::transport::Transport;
9use crate::types::Result;
10
11#[derive(Debug, Clone, Serialize, Deserialize, Default)]
12pub struct GraphCompletionRequest {
13 #[serde(skip_serializing_if = "Option::is_none")]
14 pub graph_id: Option<String>,
15 #[serde(skip_serializing_if = "Option::is_none")]
16 pub input: Option<Value>,
17 #[serde(flatten)]
18 pub extra: JsonMap,
19}
20
21#[derive(Debug, Clone, Serialize, Deserialize, Default)]
22pub struct GraphCompletionResponse {
23 #[serde(default)]
24 pub output: Option<Value>,
25 #[serde(default)]
26 pub trace: Option<Value>,
27 #[serde(flatten)]
28 pub extra: JsonMap,
29}
30
31#[derive(Debug, Clone, Serialize, Deserialize, Default)]
32pub struct GraphResource {
33 #[serde(default)]
34 pub graph_id: Option<String>,
35 #[serde(default)]
36 pub id: Option<String>,
37 #[serde(default)]
38 pub status: Option<String>,
39 #[serde(flatten)]
40 pub extra: JsonMap,
41}
42
43#[derive(Clone)]
44pub struct GraphsClient {
45 transport: Arc<Transport>,
46}
47
48impl GraphsClient {
49 pub(crate) fn new(transport: Arc<Transport>) -> Self {
50 Self { transport }
51 }
52
53 pub fn completions(&self) -> GraphCompletionsClient {
54 GraphCompletionsClient {
55 transport: self.transport.clone(),
56 }
57 }
58
59 pub async fn list_evolved(&self) -> Result<ResourceList<GraphResource>> {
60 self.transport
61 .get_json(openapi_paths::GRAPH_EVOLVE_GRAPHS)
62 .await
63 }
64}
65
66#[derive(Clone)]
67pub struct GraphCompletionsClient {
68 transport: Arc<Transport>,
69}
70
71impl GraphCompletionsClient {
72 pub async fn create(&self, request: &GraphCompletionRequest) -> Result<GraphCompletionResponse> {
73 self.transport
74 .post_json(openapi_paths::API_GRAPHS_COMPLETIONS, request)
75 .await
76 }
77}