Skip to content

Commit 4abc964

Browse files
committed
Chat completion intercept adapter
1 parent 54f3383 commit 4abc964

File tree

3 files changed

+83
-2
lines changed

3 files changed

+83
-2
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package io.cequence.openaiscala.domain
2+
3+
import io.cequence.openaiscala.domain.response.ChatCompletionResponse
4+
import io.cequence.openaiscala.domain.settings.CreateChatCompletionSettings
5+
6+
case class ChatCompletionInterceptData(
7+
messages: Seq[BaseMessage],
8+
setting: CreateChatCompletionSettings,
9+
response: ChatCompletionResponse,
10+
timeRequestReceived: java.util.Date,
11+
timeResponseReceived: java.util.Date
12+
)
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package io.cequence.openaiscala.service.adapter
2+
3+
import io.cequence.openaiscala.domain.{BaseMessage, ChatCompletionInterceptData}
4+
import io.cequence.openaiscala.domain.response.ChatCompletionResponse
5+
import io.cequence.openaiscala.domain.settings.CreateChatCompletionSettings
6+
import io.cequence.openaiscala.service.OpenAIChatCompletionService
7+
import io.cequence.wsclient.service.CloseableService
8+
import io.cequence.wsclient.service.adapter.ServiceWrapper
9+
10+
import scala.concurrent.{ExecutionContext, Future}
11+
12+
private class ChatCompletionInterceptAdapter[S <: OpenAIChatCompletionService](
13+
intercept: ChatCompletionInterceptData => Future[Unit]
14+
)(
15+
underlying: S
16+
)(
17+
implicit ec: ExecutionContext
18+
) extends ServiceWrapper[S]
19+
with CloseableService
20+
with OpenAIChatCompletionService {
21+
22+
// we just delegate all the calls to the underlying service
23+
override def wrap[T](
24+
fun: S => Future[T]
25+
): Future[T] = fun(underlying)
26+
27+
// but for the chat completion we adapt the messages and settings
28+
override def createChatCompletion(
29+
messages: Seq[BaseMessage],
30+
settings: CreateChatCompletionSettings
31+
): Future[ChatCompletionResponse] = {
32+
val timeRequestReceived = new java.util.Date()
33+
34+
for {
35+
response <- underlying.createChatCompletion(
36+
messages,
37+
settings
38+
)
39+
40+
_ <- {
41+
val timeResponseReceived = new java.util.Date()
42+
43+
intercept(
44+
ChatCompletionInterceptData(
45+
messages,
46+
settings,
47+
response,
48+
timeRequestReceived,
49+
timeResponseReceived
50+
)
51+
)
52+
}
53+
} yield response
54+
}
55+
56+
override def close(): Unit =
57+
underlying.close()
58+
}

openai-core/src/main/scala/io/cequence/openaiscala/service/adapter/OpenAIServiceAdapters.scala

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package io.cequence.openaiscala.service.adapter
22

3-
import io.cequence.openaiscala.domain.BaseMessage
3+
import io.cequence.openaiscala.domain.{BaseMessage, ChatCompletionInterceptData}
44
import io.cequence.openaiscala.domain.settings.CreateChatCompletionSettings
55
import io.cequence.openaiscala.service._
66
import io.cequence.openaiscala.service.adapter.ServiceWrapperTypes._
77
import io.cequence.wsclient.service.CloseableService
88
import io.cequence.wsclient.service.adapter.ServiceWrapperTypes.CloseableServiceWrapper
99

10-
import scala.concurrent.ExecutionContext
10+
import scala.concurrent.{ExecutionContext, Future}
1111

1212
object OpenAIServiceAdapters {
1313

@@ -41,6 +41,17 @@ trait OpenAIServiceAdapters[S <: CloseableService] extends ServiceAdapters[S] {
4141
new ChatCompletionInputAdapter(adaptMessages, adaptSettings)(service)
4242
)
4343

44+
def chatCompletionIntercept(
45+
intercept: ChatCompletionInterceptData => Future[Unit]
46+
)(
47+
service: S with OpenAIChatCompletionService
48+
)(
49+
implicit ec: ExecutionContext
50+
): S =
51+
wrapAndDelegateChatCompletion(
52+
new ChatCompletionInterceptAdapter(intercept)(service)
53+
)
54+
4455
def chatCompletionRouter(
4556
serviceModels: Map[OpenAIChatCompletionService, Seq[String]],
4657
service: S with OpenAIChatCompletionService

0 commit comments

Comments
 (0)