Skip to content

Commit 01dba91

Browse files
committed
Updates
1 parent c152562 commit 01dba91

File tree

8 files changed

+2199
-395
lines changed

8 files changed

+2199
-395
lines changed

agixt-sdk/src/client/agents.rs

Lines changed: 578 additions & 91 deletions
Large diffs are not rendered by default.

agixt-sdk/src/client/conversations.rs

Lines changed: 170 additions & 132 deletions
Large diffs are not rendered by default.

agixt-sdk/src/client/mod.rs

Lines changed: 921 additions & 69 deletions
Large diffs are not rendered by default.

agixt-sdk/src/client/providers.rs

Lines changed: 122 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,16 @@
1+
//! Provider operations using /v1 endpoints.
2+
13
use crate::error::Result;
2-
use serde::{Deserialize, Serialize};
34
use std::collections::HashMap;
45

5-
#[derive(Debug, Serialize, Deserialize)]
6-
pub struct ProviderResponse {
7-
pub providers: Vec<String>,
8-
}
9-
10-
#[derive(Debug, Serialize, Deserialize)]
11-
pub struct ProviderSettings {
12-
pub settings: HashMap<String, serde_json::Value>,
13-
}
14-
156
impl super::AGiXTSDK {
16-
/// Get list of available providers
17-
pub async fn get_providers(&self) -> Result<Vec<String>> {
7+
// ==================== Providers ====================
8+
9+
/// Get list of available providers.
10+
pub async fn get_providers(&self) -> Result<Vec<serde_json::Value>> {
1811
let response = self
1912
.client
20-
.get(&format!("{}/api/provider", self.base_uri))
13+
.get(&format!("{}/v1/provider", self.base_uri))
2114
.headers(self.headers.lock().await.clone())
2215
.send()
2316
.await?;
@@ -29,15 +22,24 @@ impl super::AGiXTSDK {
2922
self.parse_response(status, &text).await?;
3023
}
3124

32-
let result: ProviderResponse = serde_json::from_str(&text)?;
33-
Ok(result.providers)
25+
// Handle both list (v1) and dict (legacy) responses
26+
let data: serde_json::Value = serde_json::from_str(&text)?;
27+
if let Some(arr) = data.as_array() {
28+
return Ok(arr.clone());
29+
}
30+
if let Some(obj) = data.as_object() {
31+
if let Some(providers) = obj.get("providers").and_then(|v| v.as_array()) {
32+
return Ok(providers.clone());
33+
}
34+
}
35+
Ok(vec![])
3436
}
3537

36-
/// Get providers by service type
37-
pub async fn get_providers_by_service(&self, service: &str) -> Result<Vec<String>> {
38+
/// Get providers by service type.
39+
pub async fn get_providers_by_service(&self, service: &str) -> Result<Vec<serde_json::Value>> {
3840
let response = self
3941
.client
40-
.get(&format!("{}/api/providers/service/{}", self.base_uri, service))
42+
.get(&format!("{}/v1/providers/service/{}", self.base_uri, service))
4143
.headers(self.headers.lock().await.clone())
4244
.send()
4345
.await?;
@@ -49,15 +51,23 @@ impl super::AGiXTSDK {
4951
self.parse_response(status, &text).await?;
5052
}
5153

52-
let result: ProviderResponse = serde_json::from_str(&text)?;
53-
Ok(result.providers)
54+
let data: serde_json::Value = serde_json::from_str(&text)?;
55+
if let Some(arr) = data.as_array() {
56+
return Ok(arr.clone());
57+
}
58+
if let Some(obj) = data.as_object() {
59+
if let Some(providers) = obj.get("providers").and_then(|v| v.as_array()) {
60+
return Ok(providers.clone());
61+
}
62+
}
63+
Ok(vec![])
5464
}
5565

56-
/// Get settings for a specific provider
66+
/// Get settings for a specific provider.
5767
pub async fn get_provider_settings(&self, provider_name: &str) -> Result<HashMap<String, serde_json::Value>> {
5868
let response = self
5969
.client
60-
.get(&format!("{}/api/provider/{}", self.base_uri, provider_name))
70+
.get(&format!("{}/v1/provider/{}", self.base_uri, provider_name))
6171
.headers(self.headers.lock().await.clone())
6272
.send()
6373
.await?;
@@ -69,15 +79,58 @@ impl super::AGiXTSDK {
6979
self.parse_response(status, &text).await?;
7080
}
7181

72-
let result: ProviderSettings = serde_json::from_str(&text)?;
82+
#[derive(serde::Deserialize)]
83+
struct SettingsResponse {
84+
settings: HashMap<String, serde_json::Value>,
85+
}
86+
87+
let result: SettingsResponse = serde_json::from_str(&text)?;
7388
Ok(result.settings)
7489
}
7590

76-
/// Get list of embedding providers
91+
/// Get list of embedding providers.
7792
pub async fn get_embed_providers(&self) -> Result<Vec<String>> {
93+
let providers = self.get_providers().await?;
94+
let mut embed_providers = Vec::new();
95+
96+
for provider in providers {
97+
if let Some(obj) = provider.as_object() {
98+
if obj.get("supports_embeddings").and_then(|v| v.as_bool()).unwrap_or(false) {
99+
if let Some(name) = obj.get("name").and_then(|v| v.as_str()) {
100+
embed_providers.push(name.to_string());
101+
}
102+
}
103+
}
104+
}
105+
106+
Ok(embed_providers)
107+
}
108+
109+
/// Get details of all embedders.
110+
pub async fn get_embedders(&self) -> Result<HashMap<String, serde_json::Value>> {
111+
let providers = self.get_providers().await?;
112+
let mut embedders = HashMap::new();
113+
114+
for provider in providers {
115+
if let Some(obj) = provider.as_object() {
116+
if obj.get("supports_embeddings").and_then(|v| v.as_bool()).unwrap_or(false) {
117+
if let Some(name) = obj.get("name").and_then(|v| v.as_str()) {
118+
embedders.insert(name.to_string(), provider.clone());
119+
}
120+
}
121+
}
122+
}
123+
124+
Ok(embedders)
125+
}
126+
127+
// ==================== Extensions ====================
128+
129+
/// Get extension settings.
130+
pub async fn get_extension_settings(&self) -> Result<serde_json::Value> {
78131
let response = self
79132
.client
80-
.get(&format!("{}/api/embedding_providers", self.base_uri))
133+
.get(&format!("{}/v1/extensions/settings", self.base_uri))
81134
.headers(self.headers.lock().await.clone())
82135
.send()
83136
.await?;
@@ -89,15 +142,20 @@ impl super::AGiXTSDK {
89142
self.parse_response(status, &text).await?;
90143
}
91144

92-
let result: ProviderResponse = serde_json::from_str(&text)?;
93-
Ok(result.providers)
145+
#[derive(serde::Deserialize)]
146+
struct ExtensionSettingsResponse {
147+
extension_settings: serde_json::Value,
148+
}
149+
150+
let result: ExtensionSettingsResponse = serde_json::from_str(&text)?;
151+
Ok(result.extension_settings)
94152
}
95153

96-
/// Get details of all embedders
97-
pub async fn get_embedders(&self) -> Result<HashMap<String, serde_json::Value>> {
154+
/// Get all available extensions.
155+
pub async fn get_extensions(&self) -> Result<Vec<serde_json::Value>> {
98156
let response = self
99157
.client
100-
.get(&format!("{}/api/embedders", self.base_uri))
158+
.get(&format!("{}/v1/extensions", self.base_uri))
101159
.headers(self.headers.lock().await.clone())
102160
.send()
103161
.await?;
@@ -109,34 +167,40 @@ impl super::AGiXTSDK {
109167
self.parse_response(status, &text).await?;
110168
}
111169

112-
#[derive(Deserialize)]
113-
struct EmbeddersResponse {
114-
embedders: HashMap<String, serde_json::Value>,
170+
let data: serde_json::Value = serde_json::from_str(&text)?;
171+
if let Some(arr) = data.as_array() {
172+
return Ok(arr.clone());
115173
}
116-
117-
let result: EmbeddersResponse = serde_json::from_str(&text)?;
118-
Ok(result.embedders)
174+
if let Some(obj) = data.as_object() {
175+
if let Some(extensions) = obj.get("extensions").and_then(|v| v.as_array()) {
176+
return Ok(extensions.clone());
177+
}
178+
}
179+
Ok(vec![])
119180
}
120-
}
121181

122-
#[cfg(test)]
123-
mod tests {
124-
use crate::AGiXTSDK;
125-
use mockito;
126-
127-
#[tokio::test]
128-
async fn test_get_providers() {
129-
let mut mock_server = mockito::Server::new();
130-
let _mock = mock_server
131-
.mock("GET", "/api/provider")
132-
.with_status(200)
133-
.with_header("content-type", "application/json")
134-
.with_body(r#"{"providers": ["provider1", "provider2"]}"#)
135-
.create();
136-
137-
let client = AGiXTSDK::new(Some(mock_server.url()), None, false);
138-
let providers = client.get_providers().await.unwrap();
139-
140-
assert_eq!(providers, vec!["provider1", "provider2"]);
182+
/// Get arguments for a command.
183+
pub async fn get_command_args(&self, command_name: &str) -> Result<serde_json::Value> {
184+
let response = self
185+
.client
186+
.get(&format!("{}/v1/extensions/{}/args", self.base_uri, command_name))
187+
.headers(self.headers.lock().await.clone())
188+
.send()
189+
.await?;
190+
191+
let status = response.status();
192+
let text = response.text().await?;
193+
194+
if self.verbose {
195+
self.parse_response(status, &text).await?;
196+
}
197+
198+
#[derive(serde::Deserialize)]
199+
struct CommandArgsResponse {
200+
command_args: serde_json::Value,
201+
}
202+
203+
let result: CommandArgsResponse = serde_json::from_str(&text)?;
204+
Ok(result.command_args)
141205
}
142-
}
206+
}

agixt-sdk/src/error.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1+
//! Error types for the AGiXT SDK.
2+
13
use std::fmt;
24

5+
/// Error types for AGiXT SDK operations.
36
#[derive(Debug)]
47
pub enum Error {
58
/// Error from the HTTP client
@@ -15,6 +18,8 @@ pub enum Error {
1518
AuthError(String),
1619
/// Invalid input parameters
1720
InvalidInput(String),
21+
/// Resource not found
22+
NotFound(String),
1823
/// Generic error for other cases
1924
Other(String),
2025
}
@@ -31,6 +36,7 @@ impl fmt::Display for Error {
3136
}
3237
Error::AuthError(msg) => write!(f, "Authentication error: {}", msg),
3338
Error::InvalidInput(msg) => write!(f, "Invalid input: {}", msg),
39+
Error::NotFound(msg) => write!(f, "Not found: {}", msg),
3440
Error::Other(msg) => write!(f, "Error: {}", msg),
3541
}
3642
}
@@ -48,4 +54,5 @@ impl From<serde_json::Error> for Error {
4854
}
4955
}
5056

51-
pub type Result<T> = std::result::Result<T, Error>;
57+
/// Result type alias using the AGiXT Error type.
58+
pub type Result<T> = std::result::Result<T, Error>;

0 commit comments

Comments
 (0)