@@ -5,6 +5,7 @@ use actix_web::Error;
5
5
use actix_web:: HttpResponse ;
6
6
use actix_web:: post;
7
7
use actix_web:: web;
8
+ use anyhow:: anyhow;
8
9
use async_trait:: async_trait;
9
10
use nanoid:: nanoid;
10
11
use serde:: Deserialize ;
@@ -61,16 +62,19 @@ struct OpenAICompletionRequestParams {
61
62
}
62
63
63
64
#[ derive( Clone ) ]
64
- struct OpenAIResponseTransformer {
65
+ struct OpenAIStreamingResponseTransformer {
65
66
model : String ,
66
67
system_fingerprint : String ,
67
68
}
68
69
69
70
#[ async_trait]
70
- impl TransformsOutgoingMessage for OpenAIResponseTransformer {
71
+ impl TransformsOutgoingMessage for OpenAIStreamingResponseTransformer {
71
72
type TransformedMessage = serde_json:: Value ;
72
73
73
- async fn transform ( & self , message : OutgoingMessage ) -> anyhow:: Result < serde_json:: Value > {
74
+ async fn transform (
75
+ & self ,
76
+ message : OutgoingMessage ,
77
+ ) -> anyhow:: Result < Self :: TransformedMessage > {
74
78
match message {
75
79
OutgoingMessage :: Response ( ResponseEnvelope {
76
80
request_id,
@@ -116,6 +120,31 @@ impl TransformsOutgoingMessage for OpenAIResponseTransformer {
116
120
}
117
121
}
118
122
123
+ #[ derive( Clone ) ]
124
+ struct OpenAICombinedResponseTransfomer { }
125
+
126
+ #[ async_trait]
127
+ impl TransformsOutgoingMessage for OpenAICombinedResponseTransfomer {
128
+ type TransformedMessage = String ;
129
+
130
+ async fn transform (
131
+ & self ,
132
+ message : OutgoingMessage ,
133
+ ) -> anyhow:: Result < Self :: TransformedMessage > {
134
+ match message {
135
+ OutgoingMessage :: Response ( ResponseEnvelope {
136
+ response : OutgoingResponse :: GeneratedToken ( GeneratedTokenResult :: Done ) ,
137
+ ..
138
+ } ) => Ok ( "" . to_string ( ) ) ,
139
+ OutgoingMessage :: Response ( ResponseEnvelope {
140
+ response : OutgoingResponse :: GeneratedToken ( GeneratedTokenResult :: Token ( token) ) ,
141
+ ..
142
+ } ) => Ok ( token) ,
143
+ _ => Err ( anyhow ! ( "Unexpected message type: {:?}" , message) ) ,
144
+ }
145
+ }
146
+ }
147
+
119
148
#[ post( "/v1/chat_completions" ) ]
120
149
async fn respond (
121
150
app_data : web:: Data < AppData > ,
@@ -133,24 +162,22 @@ async fn respond(
133
162
tools : vec ! [ ] ,
134
163
} ;
135
164
136
- let response_transformer = OpenAIResponseTransformer {
137
- model : openai_params. model . clone ( ) ,
138
- system_fingerprint : nanoid ! ( ) ,
139
- } ;
140
-
141
165
if openai_params. stream {
142
166
http_stream_from_agent (
143
167
app_data. buffered_request_manager . clone ( ) ,
144
168
app_data. inference_service_configuration . clone ( ) ,
145
169
paddler_params,
146
- response_transformer,
170
+ OpenAIStreamingResponseTransformer {
171
+ model : openai_params. model . clone ( ) ,
172
+ system_fingerprint : nanoid ! ( ) ,
173
+ } ,
147
174
)
148
175
} else {
149
176
let combined_response = unbounded_stream_from_agent (
150
177
app_data. buffered_request_manager . clone ( ) ,
151
178
app_data. inference_service_configuration . clone ( ) ,
152
179
paddler_params,
153
- response_transformer ,
180
+ OpenAICombinedResponseTransfomer { } ,
154
181
) ?
155
182
. collect :: < Vec < String > > ( )
156
183
. await
0 commit comments