@@ -9,7 +9,6 @@ use futures::{channel::mpsc::UnboundedReceiver, pin_mut, select, FutureExt, Stre
99use hyperapp_macro:: * ;
1010use hyperware_crdt:: yrs:: { Decode , Encode , StateVector } ;
1111use base64:: { engine:: general_purpose, Engine as _} ;
12- use serde:: Deserialize ;
1312use hyperware_process_lib:: {
1413 homepage:: add_to_homepage,
1514 http:: server:: WsMessageType ,
@@ -62,105 +61,6 @@ const OUR_PROCESS_ID: (&str, &str, &str) = ("chat", "homepage", "sys");
6261const REPL_RPC_TIMEOUT_SECS : u64 = 2 ;
6362const ICON : & str = include_str ! ( "./icon" ) ;
6463
65- #[ derive( Deserialize ) ]
66- struct SpiderConversationWire {
67- id : String ,
68- messages : Vec < SpiderMessageWire > ,
69- metadata : SpiderConversationMetadataWire ,
70- #[ serde( rename = "llmProvider" ) ]
71- llm_provider : String ,
72- #[ serde( rename = "mcpServers" ) ]
73- mcp_servers : Vec < String > ,
74- }
75-
76- #[ derive( Deserialize ) ]
77- struct SpiderMessageWire {
78- role : String ,
79- content : serde_json:: Value ,
80- #[ serde( rename = "toolCallsJson" ) ]
81- tool_calls_json : Option < String > ,
82- #[ serde( rename = "toolResultsJson" ) ]
83- tool_results_json : Option < String > ,
84- timestamp : u64 ,
85- }
86-
87- #[ derive( Deserialize ) ]
88- struct SpiderConversationMetadataWire {
89- #[ serde( rename = "startTime" ) ]
90- start_time : String ,
91- client : String ,
92- #[ serde( rename = "fromStt" ) ]
93- from_stt : bool ,
94- }
95-
96- fn convert_spider_message_content ( content : serde_json:: Value ) -> SpiderMessageContent {
97- use serde_json:: Value ;
98-
99- match content {
100- Value :: String ( text) => SpiderMessageContent {
101- text : Some ( text) ,
102- audio : None ,
103- base_six_four_audio : None ,
104- } ,
105- Value :: Object ( map) => {
106- let text = map
107- . get ( "Text" )
108- . or_else ( || map. get ( "text" ) )
109- . and_then ( |value| value. as_str ( ) )
110- . map ( |value| value. to_string ( ) ) ;
111- let base_six_four_audio = map
112- . get ( "BaseSixFourAudio" )
113- . or_else ( || map. get ( "base_six_four_audio" ) )
114- . and_then ( |value| value. as_str ( ) )
115- . map ( |value| value. to_string ( ) ) ;
116- let audio = map. get ( "Audio" ) . or_else ( || map. get ( "audio" ) ) . and_then ( |value| {
117- value. as_array ( ) . map ( |items| {
118- items
119- . iter ( )
120- . filter_map ( |item| item. as_u64 ( ) . map ( |v| v as u8 ) )
121- . collect :: < Vec < u8 > > ( )
122- } )
123- } ) ;
124-
125- SpiderMessageContent {
126- text,
127- audio,
128- base_six_four_audio,
129- }
130- }
131- _ => SpiderMessageContent {
132- text : None ,
133- audio : None ,
134- base_six_four_audio : None ,
135- } ,
136- }
137- }
138-
139- fn convert_spider_conversation ( wire : SpiderConversationWire ) -> SpiderConversation {
140- let messages = wire
141- . messages
142- . into_iter ( )
143- . map ( |message| SpiderMessage {
144- role : message. role ,
145- content : convert_spider_message_content ( message. content ) ,
146- tool_calls_json : message. tool_calls_json ,
147- tool_results_json : message. tool_results_json ,
148- timestamp : message. timestamp ,
149- } )
150- . collect ( ) ;
151-
152- SpiderConversation {
153- id : wire. id ,
154- messages,
155- metadata : SpiderConversationMetadata {
156- start_time : wire. metadata . start_time ,
157- client : wire. metadata . client ,
158- from_stt : wire. metadata . from_stt ,
159- } ,
160- llm_provider : wire. llm_provider ,
161- mcp_servers : wire. mcp_servers ,
162- }
163- }
16464
16565// Helper function to enforce one-way status transitions
16666fn safe_update_message_status ( current : & MessageStatus , new : MessageStatus ) -> MessageStatus {
@@ -3302,42 +3202,16 @@ impl ChatState {
33023202 }
33033203
33043204 #[ http]
3305- async fn spider_list_conversations (
3306- & mut self ,
3307- request : SpiderListConversationsReq ,
3308- ) -> Result < Vec < SpiderConversation > , String > {
3309- const SPIDER_PROCESS_ID : ( & str , & str , & str ) = ( "spider" , "spider" , "sys" ) ;
3310-
3311- let api_key = match self . spider_api_key . clone ( ) {
3312- Some ( key) => key,
3313- None => self . spider_connect ( Some ( false ) ) . await ?. api_key ,
3314- } ;
3315-
3316- let body = serde_json:: json!( {
3317- "ListConversations" : {
3318- "limit" : request. limit,
3319- "offset" : request. offset,
3320- "client" : request. client,
3321- "authKey" : api_key,
3322- }
3323- } ) ;
3324-
3325- let request = ProcessRequest :: to ( Address :: new ( "our" , SPIDER_PROCESS_ID ) )
3326- . body (
3327- serde_json:: to_vec ( & body)
3328- . map_err ( |err| format ! ( "failed to serialize list conversations: {err}" ) ) ?,
3329- )
3330- . expects_response ( 5 ) ;
3331-
3332- let parsed: Result < Vec < SpiderConversationWire > , String > = hyperapp:: send ( request)
3333- . await
3334- . map_err ( |err| format ! ( "failed to contact spider: {err}" ) ) ?;
3205+ async fn spider_get_history ( & self ) -> Result < SpiderHistory , String > {
3206+ Ok ( SpiderHistory {
3207+ messages : self . spider_history . clone ( ) ,
3208+ } )
3209+ }
33353210
3336- let wire_conversations = parsed?;
3337- Ok ( wire_conversations
3338- . into_iter ( )
3339- . map ( convert_spider_conversation)
3340- . collect ( ) )
3211+ #[ http]
3212+ async fn spider_set_history ( & mut self , request : SpiderSetHistoryReq ) -> Result < ( ) , String > {
3213+ self . spider_history = request. messages ;
3214+ Ok ( ( ) )
33413215 }
33423216
33433217 // WEBSOCKET HANDLERS
0 commit comments