SiliconFlow 平台兼容 OpenAI 的 Chat Completions API 协议,这意味着在 Java 中调用 SiliconFlow 的大模型(如 Qwen、Llama 等)与调用 OpenAI GPT 模型的代码逻辑高度相似。核心区别仅在于 baseURL(接口地址)、apiKey(密钥)以及 model(模型名称)。
以下是使用 Java 原生 HTTP 客户端(Java 11+ 内置 java.net.http)和 Gson 库实现的完整实战示例,包含非流式(同步)和流式(SSE)两种调用方式。
核心实现要点
协议兼容:请求体结构遵循 OpenAI 标准,包含 model, messages, stream 等字段。
流式解析:流式响应基于 Server-Sent Events (SSE) 协议,数据以 data: {…} 格式逐行推送,需解析 delta.content 并拼接,直到遇到 [DONE] 标记。
**依赖管理:**仅需引入 Gson 用于 JSON 序列化/反序列化,HTTP 请求使用 JDK 内置库,无需额外引入 OkHttp 或 Apache HttpClient,降低项目依赖复杂度。
pom文件引入依赖:
<?xml version="1.0"encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>siliconflow-demo</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!--GsonforJSONprocessing--><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.10.1</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>17</source><target>17</target></configuration></plugin><plugin><groupId>org.codehaus.mojo</groupId><artifactId>exec-maven-plugin</artifactId><version>3.1.0</version><configuration><mainClass>com.example.SiliconFlowClient</mainClass></configuration></plugin></plugins></build></project>代码实现
packagecom.example;importcom.google.gson.Gson;importcom.google.gson.JsonObject;importcom.google.gson.JsonArray;importcom.google.gson.JsonElement;importcom.google.gson.JsonParser;importjava.io.BufferedReader;importjava.io.IOException;importjava.net.URI;importjava.net.http.HttpClient;importjava.net.http.HttpRequest;importjava.net.http.HttpResponse;importjava.nio.charset.StandardCharsets;importjava.util.HashMap;importjava.util.Map;/** * SiliconFlow API 调用示例 * 兼容 OpenAI 协议,支持非流式和流式输出 */publicclassSiliconFlowClient{// 请替换为你的 SiliconFlow API KeyprivatestaticfinalStringAPI_KEY="YOUR_SILICONFLOW_API_KEY";// SiliconFlow 兼容 OpenAI 的接口地址privatestaticfinalStringBASE_URL="https://api.siliconflow.cn/v1/chat/completions";// 使用的模型,例如 Qwen/Qwen2.5-7B-InstructprivatestaticfinalStringMODEL="Qwen/Qwen2.5-7B-Instruct";privatestaticfinalGsongson=newGson();privatestaticfinalHttpClienthttpClient=HttpClient.newBuilder().build();publicstaticvoidmain(String[]args){System.out.println("=== 开始测试 SiliconFlow API ===");// 1. 测试非流式调用System.out.println("\n--- 1. 非流式调用 (Sync) ---");StringnonStreamResponse=callNonStream("你好,请介绍一下你自己。");System.out.println("完整回答: "+nonStreamResponse);// 2. 测试流式调用System.out.println("\n--- 2. 流式调用 (Stream) ---");callStream("请用Python写一个快速排序算法。");}/** * 非流式调用:一次性获取完整响应 */publicstaticStringcallNonStream(StringuserMessage){try{// 构建请求体Map<String,Object>requestBody=newHashMap<>();requestBody.put("model",MODEL);requestBody.put("stream",false);// 构建 messagesJsonArraymessages=newJsonArray();JsonObjectsystemMsg=newJsonObject();systemMsg.addProperty("role","system");systemMsg.addProperty("content","你是一个有用的AI助手。");messages.add(systemMsg);JsonObjectuserMsg=newJsonObject();userMsg.addProperty("role","user");userMsg.addProperty("content",userMessage);messages.add(userMsg);requestBody.put("messages",messages);StringjsonBody=gson.toJson(requestBody);// 创建 HTTP 请求HttpRequestrequest=HttpRequest.newBuilder().uri(URI.create(BASE_URL)).header("Content-Type","application/json").header("Authorization","Bearer "+API_KEY).POST(HttpRequest.BodyPublishers.ofString(jsonBody,StandardCharsets.UTF_8)).build();// 发送请求并获取响应HttpResponse<String>response=httpClient.send(request,HttpResponse.BodyHandlers.ofString());if(response.statusCode()!=200){thrownewRuntimeException("API 请求失败: "+response.statusCode()+" - "+response.body());}// 解析响应JsonObjectjsonResponse=JsonParser.parseString(response.body()).getAsJsonObject();JsonArraychoices=jsonResponse.getAsJsonArray("choices");if(choices!=null&&!choices.isEmpty()){JsonObjectmessage=choices.get(0).getAsJsonObject().getAsJsonObject("message");returnmessage.get("content").getAsString();}return"无返回内容";}catch(Exceptione){e.printStackTrace();return"发生错误: "+e.getMessage();}}/** * 流式调用:实时逐字输出响应 */publicstaticvoidcallStream(StringuserMessage){try{// 构建请求体Map<String,Object>requestBody=newHashMap<>();requestBody.put("model",MODEL);requestBody.put("stream",true);// 开启流式JsonArraymessages=newJsonArray();JsonObjectuserMsg=newJsonObject();userMsg.addProperty("role","user");userMsg.addProperty("content",userMessage);messages.add(userMsg);requestBody.put("messages",messages);StringjsonBody=gson.toJson(requestBody);// 创建 HTTP 请求HttpRequestrequest=HttpRequest.newBuilder().uri(URI.create(BASE_URL)).header("Content-Type","application/json").header("Authorization","Bearer "+API_KEY).POST(HttpRequest.BodyPublishers.ofString(jsonBody,StandardCharsets.UTF_8)).build();// 发送异步流式请求httpClient.sendAsync(request,HttpResponse.BodyHandlers.ofLines()).thenAccept(response->{if(response.statusCode()!=200){System.err.println("API 请求失败: "+response.statusCode());return;}// 处理每一行 SSE 数据response.body().forEach(line->{if(line.startsWith("data: ")){Stringdata=line.substring(6);if("[DONE]".equals(data)){System.out.println("\n[流式传输结束]");return;}try{JsonObjectjson=JsonParser.parseString(data).getAsJsonObject();JsonArraychoices=json.getAsJsonArray("choices");if(choices!=null&&!choices.isEmpty()){JsonObjectdelta=choices.get(0).getAsJsonObject().getAsJsonObject("delta");if(delta.has("content")){Stringcontent=delta.get("content").getAsString();// 实时打印内容,模拟打字机效果System.out.print(content);}}}catch(Exceptione){// 忽略解析错误,有时空行或格式异常}}});}).join();// 等待完成}catch(Exceptione){e.printStackTrace();}}}代码功能与特点说明
零额外 HTTP 依赖:
利用 Java 11 引入的 java.net.http.HttpClient,无需引入 OkHttp 或 Apache HttpClient,简化了 Maven 依赖结构,适合轻量级集成。
标准 OpenAI 协议适配:
请求体构造完全符合 OpenAI Chat Completions 规范,只需修改 BASE_URL 和 API_KEY 即可无缝切换至 SiliconFlow 或其他兼容平台(如 DeepSeek、阿里云百炼等)。
双模式支持:
非流式 (callNonStream):适用于后台批量处理、日志分析等不需要实时交互的场景,代码逻辑简单,直接解析完整 JSON。
流式 (callStream):适用于聊天机器人、实时问答等前端交互场景。通过 HttpResponse.BodyHandlers.ofLines() 处理 SSE 流,逐行解析 data: 前缀的内容,提取 delta.content 实现低延迟的“打字机”输出效果。
健壮的错误处理:
包含 HTTP 状态码检查,针对流式解析中的异常(如空行、格式错误)进行了捕获处理,确保程序不会因为单个数据片段的解析失败而崩溃。
可扩展性:
messages 数组支持多轮对话上下文维护,只需在调用前将历史对话记录加入 JsonArray 即可实现记忆功能。