This is an automated email from the ASF dual-hosted git repository.
bowenliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kyuubi.git
The following commit(s) were added to refs/heads/master by this push:
new 7225f338f [KYUUBI #4809] [CHAT] Set session user in ChatGPT request
7225f338f is described below
commit 7225f338f6bc93cc242afce9a9b018d05cdae258
Author: bowenliang <[email protected]>
AuthorDate: Tue May 9 14:21:27 2023 +0800
[KYUUBI #4809] [CHAT] Set session user in ChatGPT request
### _Why are the changes needed?_
- set session user when opening instance of ChatProvider
- use session user in ChatGPT request, to identify user of message and
better monitor and abuse detection by OpenAI report(
https://platform.openai.com/docs/api-reference/chat/create#chat/create-user)
### _How was this patch tested?_
- [ ] Add some test cases that check the changes thoroughly including
negative and positive cases if possible
- [ ] Add screenshots for manual tests if appropriate
- [x] [Run
test](https://kyuubi.readthedocs.io/en/master/develop_tools/testing.html#running-tests)
locally before make a pull request
Closes #4809 from bowenliang123/chat-user.
Closes #4809
615d2385a [bowenliang] set session user in chatgpt request
Authored-by: bowenliang <[email protected]>
Signed-off-by: bowenliang <[email protected]>
---
.../apache/kyuubi/engine/chat/provider/ChatGPTProvider.scala | 10 +++++++---
.../org/apache/kyuubi/engine/chat/provider/ChatProvider.scala | 2 +-
.../org/apache/kyuubi/engine/chat/provider/EchoProvider.scala | 2 +-
.../apache/kyuubi/engine/chat/session/ChatSessionImpl.scala | 2 +-
4 files changed, 10 insertions(+), 6 deletions(-)
diff --git
a/externals/kyuubi-chat-engine/src/main/scala/org/apache/kyuubi/engine/chat/provider/ChatGPTProvider.scala
b/externals/kyuubi-chat-engine/src/main/scala/org/apache/kyuubi/engine/chat/provider/ChatGPTProvider.scala
index cdea89d2a..03bf0b820 100644
---
a/externals/kyuubi-chat-engine/src/main/scala/org/apache/kyuubi/engine/chat/provider/ChatGPTProvider.scala
+++
b/externals/kyuubi-chat-engine/src/main/scala/org/apache/kyuubi/engine/chat/provider/ChatGPTProvider.scala
@@ -26,7 +26,7 @@ import scala.collection.JavaConverters._
import com.google.common.cache.{CacheBuilder, CacheLoader, LoadingCache}
import com.theokanning.openai.OpenAiApi
-import com.theokanning.openai.completion.chat.{ChatCompletionRequest,
ChatMessage}
+import com.theokanning.openai.completion.chat.{ChatCompletionRequest,
ChatMessage, ChatMessageRole}
import com.theokanning.openai.service.OpenAiService
import com.theokanning.openai.service.OpenAiService.{defaultClient,
defaultObjectMapper, defaultRetrofit}
@@ -60,6 +60,8 @@ class ChatGPTProvider(conf: KyuubiConf) extends ChatProvider {
new OpenAiService(api)
}
+ private var sessionUser: Option[String] = None
+
private val chatHistory: LoadingCache[String, util.ArrayDeque[ChatMessage]] =
CacheBuilder.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES)
@@ -68,17 +70,19 @@ class ChatGPTProvider(conf: KyuubiConf) extends
ChatProvider {
new util.ArrayDeque[ChatMessage]
})
- override def open(sessionId: String): Unit = {
+ override def open(sessionId: String, user: Option[String]): Unit = {
+ sessionUser = user
chatHistory.getIfPresent(sessionId)
}
override def ask(sessionId: String, q: String): String = {
val messages = chatHistory.get(sessionId)
try {
- messages.addLast(new ChatMessage("user", q))
+ messages.addLast(new ChatMessage(ChatMessageRole.USER.value(), q))
val completionRequest = ChatCompletionRequest.builder()
.model(conf.get(KyuubiConf.ENGINE_CHAT_GPT_MODEL))
.messages(messages.asScala.toList.asJava)
+ .user(sessionUser.orNull)
.build()
val responseText =
openAiService.createChatCompletion(completionRequest).getChoices.asScala
.map(c => c.getMessage.getContent).mkString
diff --git
a/externals/kyuubi-chat-engine/src/main/scala/org/apache/kyuubi/engine/chat/provider/ChatProvider.scala
b/externals/kyuubi-chat-engine/src/main/scala/org/apache/kyuubi/engine/chat/provider/ChatProvider.scala
index af1ba434b..f9fa8bb5a 100644
---
a/externals/kyuubi-chat-engine/src/main/scala/org/apache/kyuubi/engine/chat/provider/ChatProvider.scala
+++
b/externals/kyuubi-chat-engine/src/main/scala/org/apache/kyuubi/engine/chat/provider/ChatProvider.scala
@@ -28,7 +28,7 @@ import org.apache.kyuubi.reflection.DynConstructors
trait ChatProvider {
- def open(sessionId: String): Unit
+ def open(sessionId: String, user: Option[String] = None): Unit
def ask(sessionId: String, q: String): String
diff --git
a/externals/kyuubi-chat-engine/src/main/scala/org/apache/kyuubi/engine/chat/provider/EchoProvider.scala
b/externals/kyuubi-chat-engine/src/main/scala/org/apache/kyuubi/engine/chat/provider/EchoProvider.scala
index 31ad3b8e3..1116ea785 100644
---
a/externals/kyuubi-chat-engine/src/main/scala/org/apache/kyuubi/engine/chat/provider/EchoProvider.scala
+++
b/externals/kyuubi-chat-engine/src/main/scala/org/apache/kyuubi/engine/chat/provider/EchoProvider.scala
@@ -19,7 +19,7 @@ package org.apache.kyuubi.engine.chat.provider
class EchoProvider extends ChatProvider {
- override def open(sessionId: String): Unit = {}
+ override def open(sessionId: String, user: Option[String]): Unit = {}
override def ask(sessionId: String, q: String): String =
"This is ChatKyuubi, nice to meet you!"
diff --git
a/externals/kyuubi-chat-engine/src/main/scala/org/apache/kyuubi/engine/chat/session/ChatSessionImpl.scala
b/externals/kyuubi-chat-engine/src/main/scala/org/apache/kyuubi/engine/chat/session/ChatSessionImpl.scala
index 29f420768..6ec6d0626 100644
---
a/externals/kyuubi-chat-engine/src/main/scala/org/apache/kyuubi/engine/chat/session/ChatSessionImpl.scala
+++
b/externals/kyuubi-chat-engine/src/main/scala/org/apache/kyuubi/engine/chat/session/ChatSessionImpl.scala
@@ -38,7 +38,7 @@ class ChatSessionImpl(
override def open(): Unit = {
info(s"Starting to open chat session.")
- chatProvider.open(handle.identifier.toString)
+ chatProvider.open(handle.identifier.toString, Some(user))
super.open()
info(s"The chat session is started.")
}