1+ //! Provider operations using /v1 endpoints.
2+
13use crate :: error:: Result ;
2- use serde:: { Deserialize , Serialize } ;
34use 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-
156impl 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+ }
0 commit comments