Skip to content

Commit 2e68296

Browse files
authored
chore: log v1/chat/completion event (#4042)
1 parent f59f4ad commit 2e68296

File tree

2 files changed

+23
-7
lines changed

2 files changed

+23
-7
lines changed

crates/tabby/src/routes/chat.rs

+14-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ use axum::{
99
use axum_extra::TypedHeader;
1010
use futures::{Stream, StreamExt};
1111
use hyper::StatusCode;
12-
use tabby_common::axum::MaybeUser;
12+
use tabby_common::{
13+
api::event::{Event as LoggerEvent, EventLogger},
14+
axum::MaybeUser,
15+
};
1316
use tabby_inference::ChatCompletionStream;
1417
use tracing::{error, instrument, warn};
1518

@@ -32,17 +35,23 @@ pub async fn chat_completions_utoipa(_request: Json<serde_json::Value>) -> Statu
3235
unimplemented!()
3336
}
3437

38+
pub struct ChatState {
39+
pub chat_completion: Arc<dyn ChatCompletionStream>,
40+
pub logger: Arc<dyn EventLogger>,
41+
}
42+
3543
#[instrument(skip(state, request))]
3644
pub async fn chat_completions(
37-
State(state): State<Arc<dyn ChatCompletionStream>>,
45+
State(state): State<Arc<ChatState>>,
3846
TypedHeader(MaybeUser(user)): TypedHeader<MaybeUser>,
3947
Json(mut request): Json<async_openai_alt::types::CreateChatCompletionRequest>,
4048
) -> Result<Sse<impl Stream<Item = Result<Event, anyhow::Error>>>, StatusCode> {
4149
if let Some(user) = user {
4250
request.user.replace(user);
4351
}
52+
let user = request.user.clone();
4453

45-
let s = match state.chat_stream(request).await {
54+
let s = match state.chat_completion.chat_stream(request).await {
4655
Ok(s) => s,
4756
Err(err) => {
4857
warn!("Error happens during chat completion: {}", err);
@@ -71,5 +80,7 @@ pub async fn chat_completions(
7180
}
7281
};
7382

83+
state.logger.log(user, LoggerEvent::ChatCompletion {});
84+
7485
Ok(Sse::new(s).keep_alive(KeepAlive::default()))
7586
}

crates/tabby/src/serve.rs

+9-4
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ use tabby_common::{
1111
usage,
1212
};
1313
use tabby_download::ModelKind;
14-
use tabby_inference::ChatCompletionStream;
1514
use tokio::{sync::oneshot::Sender, time::sleep};
1615
use tower_http::timeout::TimeoutLayer;
1716
use tracing::{debug, warn};
@@ -22,7 +21,7 @@ use utoipa::{
2221
use utoipa_swagger_ui::SwaggerUi;
2322

2423
use crate::{
25-
routes::{self, run_app},
24+
routes::{self, run_app, ChatState},
2625
services::{
2726
self,
2827
code::create_code_search,
@@ -160,13 +159,19 @@ pub async fn main(config: &Config, args: &ServeArgs) {
160159
)
161160
.await;
162161

162+
let chat_state = chat.as_ref().map(|c| {
163+
Arc::new(ChatState {
164+
chat_completion: c.clone(),
165+
logger: logger.clone(),
166+
})
167+
});
163168
let mut api = api_router(
164169
args,
165170
&config,
166171
logger.clone(),
167172
code.clone(),
168173
completion,
169-
chat.clone(),
174+
chat_state,
170175
webserver,
171176
)
172177
.await;
@@ -220,7 +225,7 @@ async fn api_router(
220225
logger: Arc<dyn EventLogger>,
221226
_code: Arc<dyn CodeSearch>,
222227
completion_state: Option<CompletionService>,
223-
chat_state: Option<Arc<dyn ChatCompletionStream>>,
228+
chat_state: Option<Arc<ChatState>>,
224229
webserver: Option<bool>,
225230
) -> Router {
226231
let mut routers = vec![];

0 commit comments

Comments
 (0)