artificial_core/
client.rs1use std::{future::Future, pin::Pin, sync::Arc};
33
34use crate::{
35 error::Result,
36 generic::{GenericChatCompletionResponse, StreamingEventsProvider},
37 provider::{
38 ChatCompleteParameters, ChatCompletionProvider, PromptExecutionProvider,
39 StreamingChatProvider,
40 },
41 template::{IntoPrompt, PromptTemplate},
42};
43
44#[derive(Debug, Clone)]
49pub struct ArtificialClient<B> {
50 backend: Arc<B>,
51}
52
53impl<B> ArtificialClient<B>
54where
55 B: PromptExecutionProvider,
56{
57 pub fn new(backend: B) -> Self {
59 Self {
60 backend: Arc::new(backend),
61 }
62 }
63
64 pub fn backend(&self) -> &B {
66 &self.backend
67 }
68}
69
70impl<B: PromptExecutionProvider> PromptExecutionProvider for ArtificialClient<B> {
71 type Message = B::Message;
72
73 fn prompt_execute<'a, 'p, P>(
74 &'a self,
75 prompt: P,
76 ) -> Pin<Box<dyn Future<Output = Result<GenericChatCompletionResponse<P::Output>>> + Send + 'p>>
77 where
78 'a: 'p,
79 P: PromptTemplate + Send + Sync + 'p,
80 <P as IntoPrompt>::Message: Into<Self::Message>,
81 {
82 let backend = Arc::clone(&self.backend);
83 Box::pin(async move { backend.prompt_execute(prompt).await })
84 }
85}
86
87impl<B: ChatCompletionProvider> ChatCompletionProvider for ArtificialClient<B> {
88 type Message = B::Message;
89
90 fn chat_complete<'p, M>(
91 &self,
92 params: ChatCompleteParameters<M>,
93 ) -> Pin<
94 Box<
95 dyn Future<
96 Output = Result<GenericChatCompletionResponse<crate::generic::GenericMessage>>,
97 > + Send
98 + 'p,
99 >,
100 >
101 where
102 M: Into<Self::Message> + Send + Sync + 'p,
103 {
104 self.backend.chat_complete(params)
105 }
106}
107
108impl<B: StreamingChatProvider> StreamingChatProvider for ArtificialClient<B> {
109 type Delta<'s>
110 = B::Delta<'s>
111 where
112 Self: 's;
113
114 fn chat_complete_stream<'p, M>(&self, params: ChatCompleteParameters<M>) -> Self::Delta<'p>
115 where
116 M: Into<Self::Message> + Send + Sync + 'p,
117 {
118 self.backend.chat_complete_stream(params)
119 }
120}
121
122impl<B: StreamingEventsProvider> StreamingEventsProvider for ArtificialClient<B> {
123 type EventStream<'s>
124 = B::EventStream<'s>
125 where
126 Self: 's;
127
128 fn chat_complete_events_stream<'p, M>(
129 &self,
130 params: crate::provider::ChatCompleteParameters<M>,
131 ) -> Self::EventStream<'p>
132 where
133 M: Into<Self::Message> + Send + Sync + 'p,
134 {
135 self.backend.chat_complete_events_stream(params)
136 }
137}