采用 Vert.x Web Client 对 OpenAI 的 API进行一层薄封装,兼容 DeepSeek、SiliconFlow
implementation(" net.ximatai:vertx-openai:1.25.6" )
<dependency >
<groupId >net.ximatai</groupId >
<artifactId >vertx-openai</artifactId >
<version >1.25.6</version >
</dependency >
package net .ximatai .vertxopenai ;
import io .vertx .junit5 .VertxExtension ;
import io .vertx .junit5 .VertxTestContext ;
import net .ximatai .vertxopenai .message .IMessage ;
import net .ximatai .vertxopenai .service .IOpenService ;
import net .ximatai .vertxopenai .session .ChatSession ;
import org .junit .jupiter .api .Assertions ;
import org .junit .jupiter .api .BeforeAll ;
import org .junit .jupiter .api .DisplayName ;
import org .junit .jupiter .api .Test ;
import org .junit .jupiter .api .TestInstance ;
import org .junit .jupiter .api .extension .ExtendWith ;
@ ExtendWith (VertxExtension .class )
@ TestInstance (TestInstance .Lifecycle .PER_CLASS )
public class ChatTest {
// 此处的 key 仅供示意,不能用的哦。
String key = "sk-ztesneqsatkvopokaxwhjwchpzgubsstdzevzzkvrtrolaqs" ;
String url = "https://api.siliconflow.cn/v1/chat/completions" ;
ChatSession chatSession ;
@ BeforeAll
void beforeAll () {
IOpenService service = IOpenService .create (key , url );
chatSession = service .connect ("deepseek-ai/DeepSeek-R1-Distill-Qwen-7B" );
}
@ Test
@ DisplayName ("对话测试(异步)" )
void testChat (VertxTestContext testContext ) {
chatSession .clear ();
chatSession .setSystemMessage ("你是一个翻译器,我说中文你返回英文,不需要返回其他多余的内容" );
chatSession .open ()
.addMessage ("你好,你是谁?" )
.send ()
.onSuccess (message -> {
String content = message .content ();
logger .info (content );
Assertions .assertNotNull (content );
Assertions .assertEquals (2 , chatSession .getMessages ().size ());
testContext .completeNow ();
})
.onFailure (testContext ::failNow );
}
@ Test
@ DisplayName ("对话测试(同步)" )
void testChatSync () {
AssistantMessage message = chatSession
.open ()
.addMessage ("你好,你是谁?" )
.send ()
.toCompletionStage ()
.toCompletableFuture ()
.join ();
Assertions .assertNotNull (message .content ());
}
@ Test
@ DisplayName ("测试Stream版本会话" )
void testStream (VertxTestContext testContext ) {
chatSession
.clear ()
.setSystemMessage ("你是一个翻译器,我说中文你返回英文,不需要返回其他多余的内容" )
.open ()
.addMessage ("你好,你是谁?" )
.stream (msg -> {
if (msg .isReasoning ()) {
logger .info (msg .reasoning ()); // 持续输出推理过程
} else {
logger .info (msg .content ()); // 持续输出结果
}
})
.send ()
.onSuccess (msg -> {
logger .info (msg .content ()); // 最终输出结果
testContext .completeNow ();
})
.onFailure (testContext ::failNow );
}
}