首先需要登录Deepseek开放平台,申请 appkey。
java 版 demo代码如下所示:
@Slf4j
public class DeepSeekApiDemo {
private static final MediaType MEDIA_APPLICATION_JSON = MediaType.parse("application/json; charset=utf-8");
private static final String URL = "https://api.deepseek.com/chat/completions";
private static final String APP_kEY = "你的appkey";
private static final String MODEL = "deepseek-chat";
private static final String DONE = "[DONE]";
public static void main(String[] args) {
String query = "你是谁";
long start = System.currentTimeMillis();
DeepSeekRequest request = DeepSeekRequest.make(query);
StringBuilder allContent = new StringBuilder();
OkHttpClient client = initOkHttpClient();
EventSource.Factory factory = EventSources.createFactory(client);
Request httpRequest = new Request.Builder()
.url(URL)
.addHeader("Authorization", "Bearer " + APP_kEY)
.post(RequestBody.create(JSON.toJSONString(request), MEDIA_APPLICATION_JSON))
.build();
factory.newEventSource(httpRequest, new EventSourceListener() {
private boolean receiveResponse = false;
@Override
public void onClosed(@NotNull EventSource eventSource) {
super.onClosed(eventSource);
log.info("sse onClosed.");
eventSource.cancel();
}
@Override
public void onEvent(@NotNull EventSource eventSource, @Nullable String id, @Nullable String type, @NotNull String data) {
super.onEvent(eventSource, id, type, data);
if (! receiveResponse) {
receiveResponse = true;
log.info("receive first frame, rt: {}ms", System.currentTimeMillis() - start);
}
if (DONE.equals(data)) {
log.info("sse event response finish, rt: {}ms, allResponse: {}", System.currentTimeMillis() - start, allContent);
// 结束流式响应
return;
}
try {
DeepSeekResponse response = JSON.parseObject(data, DeepSeekResponse.class);
if (CollectionUtils.isEmpty(response.getChoices())) {
return;
}
DeepSeekChoice choice = response.getChoices().get(0);
if (choice.getDelta() == null) {
return;
}
String content = choice.getDelta().getContent();
if (StringUtils.isNotEmpty(content)) {
log.info("sse event response content: {}", content);
allContent.append(content);
}
} catch (Exception e) {
log.error("parse response fail. ", e);
}
}
@Override
public void onFailure(@NotNull EventSource eventSource, @Nullable Throwable t, @Nullable Response response) {
super.onFailure(eventSource, t, response);
int code = response != null ? response.code() : 400;
String msg = response != null ? response.message() : "";
String body = "";
if (response != null) {
body = Optional.of(response).map(Response::body).map(responseBody -> {
try {
return responseBody.string();
} catch (IOException e) {
log.error("parse response.body error. ", e);
return "";
}
}).orElse("");
}
log.info("sse onFailure code:{} msg:{} body:{}. ", code, msg, body, t);
eventSource.cancel();
}
@Override
public void onOpen(@NotNull EventSource eventSource, @NotNull Response response) {
super.onOpen(eventSource, response);
log.info("sse onOpen.");
}
});
log.info("request ok");
}
private static OkHttpClient initOkHttpClient() {
Dispatcher dispatcher = new Dispatcher();
dispatcher.setMaxRequests(12);
return new OkHttpClient.Builder()
.connectTimeout(1000, TimeUnit.MILLISECONDS)
.writeTimeout(16000, TimeUnit.MILLISECONDS)
.readTimeout(5000, TimeUnit.MILLISECONDS)
.dispatcher(dispatcher)
.build();
}
@Setter
@Getter
private static class DeepSeekRequest {
private String model = MODEL;
/**
* 历史对话和当前对话都放在message中,最后一条为当前轮对话。由客户端发送的query,role为user、系统回复为 assistant
*/
private List<DeepSeekContext> messages;
private boolean stream = true;
private DeepSeekRequest() {
}
/**
* 构建请求
* @param query 请求
* @return DeepSeekRequest
*/
public static DeepSeekRequest make(String query) {
DeepSeekRequest request = new DeepSeekRequest();
DeepSeekContext message = new DeepSeekContext();
message.setRole("user");
message.setContent(query);
request.setMessages(Lists.newArrayList(message));
return request;
}
}
@Setter
@Getter
private static class DeepSeekContext {
private String role;
private String content;
}
@Setter
@Getter
private static class DeepSeekResponse {
private String id;
private String object;
private long created;
private String model;
@JSONField(name = "system_fingerprint")
private String systemFingerprint;
private List<DeepSeekChoice> choices;
}
@Setter
@Getter
private static class DeepSeekChoice {
private int index;
private String logprobs;
@JSONField(name = "finish_reason")
private String finishReason;
private DeepSeekContext delta;
}
}