diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index b01039c..fcaa9fc 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -69,8 +69,8 @@ dispute. If you are unable to resolve the matter for any reason, or if the behavior is threatening or harassing, report it. We are dedicated to providing an environment where participants feel welcome and safe. -Reports should be directed to *[PROJECT STEWARD NAME(s) AND EMAIL(s)]*, the -Project Steward(s) for *[PROJECT NAME]*. It is the Project Steward’s duty to +Reports should be directed to *Chao Gong (chao.gong@aminer.cn)*, the +Project Steward(s) for *zhipuai-sdk-java-v4*. It is the Project Steward’s duty to receive and address reported violations of the code of conduct. They will then work with a committee consisting of representatives from the Open Source Programs Office and the Z.ai Open Source Strategy team. diff --git a/README.md b/README.md index 3c8cfe3..0b60d61 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,270 @@ private static final ClientV4 client = new ClientV4.Builder(API_SECRET_KEY) ## 💡 Examples +### Chat Model Invocation + +#### Streaming Invocation (SSE) + +- **Basic Chat** + +```java +List messages = new ArrayList<>(); +ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), "What is the relationship between ZhipuAI and ChatGLM?"); +messages.add(chatMessage); +String requestId = String.format("your-request-id-%d", System.currentTimeMillis()); +ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() + .model(Constants.ModelChatGLM4) + .stream(Boolean.TRUE) + .messages(messages) + .requestId(requestId) + .build(); +ModelApiResponse sseModelApiResp = client.invokeModelApi(chatCompletionRequest); +if (sseModelApiResp.isSuccess()) { + AtomicBoolean isFirst = new AtomicBoolean(true); + ChatMessageAccumulator chatMessageAccumulator = mapStreamToAccumulator(sseModelApiResp.getFlowable()) + .doOnNext(accumulator -> { + // Process streaming results + System.out.println("accumulator: " + accumulator); + }) + .doOnComplete(System.out::println) + .lastElement() + .blockingGet(); +} +``` + +- **Function-Calling** + +```java +List messages = new ArrayList<>(); +ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), "How much is a flight ticket from Chengdu to Beijing?"); +messages.add(chatMessage); +String requestId = String.format("your-request-id-%d", System.currentTimeMillis()); +// Function definition +List chatToolList = new ArrayList<>(); +ChatTool chatTool = new ChatTool(); +chatTool.setType(ChatToolType.FUNCTION.value()); +ChatFunctionParameters chatFunctionParameters = new ChatFunctionParameters(); +chatFunctionParameters.setType("object"); +Map properties = new HashMap<>(); +properties.put("departure", new HashMap() {{ + put("type", "string"); + put("description", "Departure city"); +}}); +properties.put("destination", new HashMap() {{ + put("type", "string"); + put("description", "Destination city"); +}}); +chatFunctionParameters.setProperties(properties); +ChatFunction chatFunction = ChatFunction.builder() + .name("query_flight_prices") + .description("Query flight prices") + .parameters(chatFunctionParameters) + .build(); +chatTool.setFunction(chatFunction); +chatToolList.add(chatTool); + +ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() + .model(Constants.ModelChatGLM4) + .stream(Boolean.TRUE) + .messages(messages) + .requestId(requestId) + .tools(chatToolList) + .toolChoice("auto") + .build(); +ModelApiResponse sseModelApiResp = client.invokeModelApi(chatCompletionRequest); +// Process the returned results +``` + +#### Synchronous Invocation + +- **Basic Chat** + +```java +List messages = new ArrayList<>(); +ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), "What is the relationship between ZhipuAI and ChatGLM?"); +messages.add(chatMessage); +String requestId = String.format("your-request-id-%d", System.currentTimeMillis()); +ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() + .model(Constants.ModelChatGLM4) + .stream(Boolean.FALSE) + .invokeMethod(Constants.invokeMethod) + .messages(messages) + .requestId(requestId) + .build(); +ModelApiResponse invokeModelApiResp = client.invokeModelApi(chatCompletionRequest); +System.out.println("model output:" + new ObjectMapper().writeValueAsString(invokeModelApiResp)); +``` + +- **Function-Calling** + +```java +List messages = new ArrayList<>(); +ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), "What can you do?"); +messages.add(chatMessage); +String requestId = String.format("your-request-id-%d", System.currentTimeMillis()); +// Function definition... (refer to streaming Function-Calling) +List chatToolList = new ArrayList<>(); +// ... Add Function and WebSearch tools +ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() + .model(Constants.ModelChatGLM4) + .stream(Boolean.FALSE) + .invokeMethod(Constants.invokeMethod) + .messages(messages) + .requestId(requestId) + .tools(chatToolList) + .toolChoice("auto") + .build(); +ModelApiResponse invokeModelApiResp = client.invokeModelApi(chatCompletionRequest); +``` + +#### Asynchronous Invocation + +```java +// 1. Initiate an asynchronous task +List messages = new ArrayList<>(); +ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), "What is the relationship between ZhipuAI and ChatGLM?"); +messages.add(chatMessage); +ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() + .model(Constants.ModelChatGLM4) + .stream(Boolean.FALSE) + .invokeMethod(Constants.invokeMethodAsync) + .messages(messages) + .build(); +ModelApiResponse invokeModelApiResp = client.invokeModelApi(chatCompletionRequest); +String taskId = invokeModelApiResp.getData().getTaskId(); + +// 2. Query the result by taskId +QueryModelResultRequest request = new QueryModelResultRequest(); +request.setTaskId(taskId); +QueryModelResultResponse queryResultResp = client.queryModelResult(request); +``` + +### Role Playing + +```java +List messages = new ArrayList<>(); +ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), "How have you been lately?"); +messages.add(chatMessage); + +ChatMeta meta = new ChatMeta(); +meta.setUser_info("I am a film director, specializing in music-themed movies."); +meta.setBot_info("You are a popular female singer and actress in the country, with outstanding musical talent."); +meta.setBot_name("Su Mengyuan"); +meta.setUser_name("Lu Xingchen"); + +ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() + .model(Constants.ModelCharGLM3) + .stream(Boolean.FALSE) + .invokeMethod(Constants.invokeMethod) + .messages(messages) + .meta(meta) + .build(); +ModelApiResponse invokeModelApiResp = client.invokeModelApi(chatCompletionRequest); +``` + +### Image Generation + +```java +CreateImageRequest createImageRequest = new CreateImageRequest(); +createImageRequest.setModel(Constants.ModelCogView); +createImageRequest.setPrompt("A futuristic cloud data center"); +ImageApiResponse imageApiResponse = client.createImage(createImageRequest); +``` + +### Vector Models + +```java +EmbeddingRequest embeddingRequest = new EmbeddingRequest(); +embeddingRequest.setInput("hello world"); +embeddingRequest.setModel(Constants.ModelEmbedding2); +EmbeddingApiResponse apiResponse = client.invokeEmbeddingsApi(embeddingRequest); +``` + +### Fine-tuning + +#### Create Fine-tuning Job + +```java +FineTuningJobRequest request = new FineTuningJobRequest(); +request.setModel("chatglm3-6b"); +request.setTraining_file("your-file-id"); +CreateFineTuningJobApiResponse createFineTuningJobApiResponse = client.createFineTuningJob(request); +``` + +#### Retrieve Fine-tuning Job + +```java +QueryFineTuningJobRequest queryFineTuningJobRequest = new QueryFineTuningJobRequest(); +queryFineTuningJobRequest.setJobId("your-job-id"); +QueryFineTuningJobApiResponse queryFineTuningJobApiResponse = client.retrieveFineTuningJobs(queryFineTuningJobRequest); +``` + +#### List Fine-tuning Jobs + +```java +QueryPersonalFineTuningJobRequest queryPersonalFineTuningJobRequest = new QueryPersonalFineTuningJobRequest(); +queryPersonalFineTuningJobRequest.setLimit(10); +QueryPersonalFineTuningJobApiResponse queryPersonalFineTuningJobApiResponse = client.queryPersonalFineTuningJobs(queryPersonalFineTuningJobRequest); +``` + +#### List Fine-tuning Events + +```java +QueryFineTuningJobRequest queryFineTuningJobRequest = new QueryFineTuningJobRequest(); +queryFineTuningJobRequest.setJobId("your-job-id"); +QueryFineTuningEventApiResponse queryFineTuningEventApiResponse = client.queryFineTuningJobsEvents(queryFineTuningJobRequest); +``` + +#### Cancel Fine-tuning Job + +```java +FineTuningJobIdRequest request = FineTuningJobIdRequest.builder().jobId("your-job-id").build(); +QueryFineTuningJobApiResponse queryFineTuningJobApiResponse = client.cancelFineTuningJob(request); +``` + +#### Delete Fine-tuned Model + +```java +FineTuningJobModelRequest request = FineTuningJobModelRequest.builder().fineTunedModel("your-fine-tuned-model").build(); +FineTunedModelsStatusResponse fineTunedModelsStatusResponse = client.deleteFineTuningModel(request); +``` + +### Batch Processing + +#### Create Batch Job + +```java +BatchCreateParams batchCreateParams = new BatchCreateParams( + "24h", + "/v4/chat/completions", + "your-file-id", + new HashMap() {{ + put("model", "glm-4"); + }} +); +BatchResponse batchResponse = client.batchesCreate(batchCreateParams); +``` + +#### Retrieve Batch Job + +```java +BatchResponse batchResponse = client.batchesRetrieve("your-batch-id"); +``` + +#### List Batch Jobs + +```java +QueryBatchRequest queryBatchRequest = new QueryBatchRequest(); +queryBatchRequest.setLimit(10); +QueryBatchResponse queryBatchResponse = client.batchesList(queryBatchRequest); +``` + +#### Cancel Batch Job + +```java +BatchResponse batchResponse = client.batchesCancel("your-batch-id"); +``` + ### Spring Boot Integration ```java diff --git a/README_CN.md b/README_CN.md index b5592f1..2a7307d 100644 --- a/README_CN.md +++ b/README_CN.md @@ -82,7 +82,7 @@ SDK提供了灵活的 `ClientV4` 构建器来自定义您的客户端: ```java String API_SECRET_KEY = "your_api_key_here"; -private static final ClientV4 client = new ClientV4.Builder(API_SECRET_KEY) +ClientV4 client = new ClientV4.Builder(API_SECRET_KEY) .enableTokenCache() .networkConfig(30, 10, 10, 10, TimeUnit.SECONDS) .connectionPool(new okhttp3.ConnectionPool(8, 1, TimeUnit.SECONDS)) @@ -91,6 +91,270 @@ private static final ClientV4 client = new ClientV4.Builder(API_SECRET_KEY) ## 💡 使用示例 +### 对话模型调用 + +#### 流式调用(SSE) + +- **基础对话** + +```java +List messages = new ArrayList<>(); +ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), "智谱AI和ChatGLM是什么关系?"); +messages.add(chatMessage); +String requestId = String.format("your-request-id-%d", System.currentTimeMillis()); +ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() + .model(Constants.ModelChatGLM4) + .stream(Boolean.TRUE) + .messages(messages) + .requestId(requestId) + .build(); +ModelApiResponse sseModelApiResp = client.invokeModelApi(chatCompletionRequest); +if (sseModelApiResp.isSuccess()) { + AtomicBoolean isFirst = new AtomicBoolean(true); + ChatMessageAccumulator chatMessageAccumulator = mapStreamToAccumulator(sseModelApiResp.getFlowable()) + .doOnNext(accumulator -> { + // 处理流式返回结果 + System.out.println("accumulator: " + accumulator); + }) + .doOnComplete(System.out::println) + .lastElement() + .blockingGet(); +} +``` + +- **Function-Calling** + +```java +List messages = new ArrayList<>(); +ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), "从成都到北京的机票多少钱?"); +messages.add(chatMessage); +String requestId = String.format("your-request-id-%d", System.currentTimeMillis()); +// 函数定义 +List chatToolList = new ArrayList<>(); +ChatTool chatTool = new ChatTool(); +chatTool.setType(ChatToolType.FUNCTION.value()); +ChatFunctionParameters chatFunctionParameters = new ChatFunctionParameters(); +chatFunctionParameters.setType("object"); +Map properties = new HashMap<>(); +properties.put("departure", new HashMap() {{ + put("type", "string"); + put("description", "出发地"); +}}); +properties.put("destination", new HashMap() {{ + put("type", "string"); + put("description", "目的地"); +}}); +chatFunctionParameters.setProperties(properties); +ChatFunction chatFunction = ChatFunction.builder() + .name("query_flight_prices") + .description("查询航班价格") + .parameters(chatFunctionParameters) + .build(); +chatTool.setFunction(chatFunction); +chatToolList.add(chatTool); + +ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() + .model(Constants.ModelChatGLM4) + .stream(Boolean.TRUE) + .messages(messages) + .requestId(requestId) + .tools(chatToolList) + .toolChoice("auto") + .build(); +ModelApiResponse sseModelApiResp = client.invokeModelApi(chatCompletionRequest); +// 处理返回结果 +``` + +#### 同步调用 + +- **基础对话** + +```java +List messages = new ArrayList<>(); +ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), "智谱AI和ChatGLM是什么关系?"); +messages.add(chatMessage); +String requestId = String.format("your-request-id-%d", System.currentTimeMillis()); +ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() + .model(Constants.ModelChatGLM4) + .stream(Boolean.FALSE) + .invokeMethod(Constants.invokeMethod) + .messages(messages) + .requestId(requestId) + .build(); +ModelApiResponse invokeModelApiResp = client.invokeModelApi(chatCompletionRequest); +System.out.println("model output:" + new ObjectMapper().writeValueAsString(invokeModelApiResp)); +``` + +- **Function-Calling** + +```java +List messages = new ArrayList<>(); +ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), "你能做什么?"); +messages.add(chatMessage); +String requestId = String.format("your-request-id-%d", System.currentTimeMillis()); +// 函数定义... (参考流式Function-Calling) +List chatToolList = new ArrayList<>(); +// ... 添加Function和WebSearch工具 +ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() + .model(Constants.ModelChatGLM4) + .stream(Boolean.FALSE) + .invokeMethod(Constants.invokeMethod) + .messages(messages) + .requestId(requestId) + .tools(chatToolList) + .toolChoice("auto") + .build(); +ModelApiResponse invokeModelApiResp = client.invokeModelApi(chatCompletionRequest); +``` + +#### 异步调用 + +```java +// 1. 发起异步任务 +List messages = new ArrayList<>(); +ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), "智谱AI和ChatGLM是什么关系?"); +messages.add(chatMessage); +ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() + .model(Constants.ModelChatGLM4) + .stream(Boolean.FALSE) + .invokeMethod(Constants.invokeMethodAsync) + .messages(messages) + .build(); +ModelApiResponse invokeModelApiResp = client.invokeModelApi(chatCompletionRequest); +String taskId = invokeModelApiResp.getData().getTaskId(); + +// 2. 根据taskId查询结果 +QueryModelResultRequest request = new QueryModelResultRequest(); +request.setTaskId(taskId); +QueryModelResultResponse queryResultResp = client.queryModelResult(request); +``` + +### 角色扮演 + +```java +List messages = new ArrayList<>(); +ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), "你最近过得怎么样?"); +messages.add(chatMessage); + +ChatMeta meta = new ChatMeta(); +meta.setUser_info("我是一名电影导演,擅长拍摄音乐主题的电影。"); +meta.setBot_info("你是一位国内当红的女歌手、演员,拥有出色的音乐才华。"); +meta.setBot_name("苏梦远"); +meta.setUser_name("陆星辰"); + +ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() + .model(Constants.ModelCharGLM3) + .stream(Boolean.FALSE) + .invokeMethod(Constants.invokeMethod) + .messages(messages) + .meta(meta) + .build(); +ModelApiResponse invokeModelApiResp = client.invokeModelApi(chatCompletionRequest); +``` + +### 图像生成 + +```java +CreateImageRequest createImageRequest = new CreateImageRequest(); +createImageRequest.setModel(Constants.ModelCogView); +createImageRequest.setPrompt("一个充满未来感的云数据中心"); +ImageApiResponse imageApiResponse = client.createImage(createImageRequest); +``` + +### 向量模型 + +```java +EmbeddingRequest embeddingRequest = new EmbeddingRequest(); +embeddingRequest.setInput("hello world"); +embeddingRequest.setModel(Constants.ModelEmbedding2); +EmbeddingApiResponse apiResponse = client.invokeEmbeddingsApi(embeddingRequest); +``` + +### 微调 + +#### 创建微调任务 + +```java +FineTuningJobRequest request = new FineTuningJobRequest(); +request.setModel("chatglm3-6b"); +request.setTraining_file("your-file-id"); +CreateFineTuningJobApiResponse createFineTuningJobApiResponse = client.createFineTuningJob(request); +``` + +#### 查询微调任务 + +```java +QueryFineTuningJobRequest queryFineTuningJobRequest = new QueryFineTuningJobRequest(); +queryFineTuningJobRequest.setJobId("your-job-id"); +QueryFineTuningJobApiResponse queryFineTuningJobApiResponse = client.retrieveFineTuningJobs(queryFineTuningJobRequest); +``` + +#### 查询个人微调任务 + +```java +QueryPersonalFineTuningJobRequest queryPersonalFineTuningJobRequest = new QueryPersonalFineTuningJobRequest(); +queryPersonalFineTuningJobRequest.setLimit(10); +QueryPersonalFineTuningJobApiResponse queryPersonalFineTuningJobApiResponse = client.queryPersonalFineTuningJobs(queryPersonalFineTuningJobRequest); +``` + +#### 查询微调任务事件 + +```java +QueryFineTuningJobRequest queryFineTuningJobRequest = new QueryFineTuningJobRequest(); +queryFineTuningJobRequest.setJobId("your-job-id"); +QueryFineTuningEventApiResponse queryFineTuningEventApiResponse = client.queryFineTuningJobsEvents(queryFineTuningJobRequest); +``` + +#### 取消微调任务 + +```java +FineTuningJobIdRequest request = FineTuningJobIdRequest.builder().jobId("your-job-id").build(); +QueryFineTuningJobApiResponse queryFineTuningJobApiResponse = client.cancelFineTuningJob(request); +``` + +#### 删除微调模型 + +```java +FineTuningJobModelRequest request = FineTuningJobModelRequest.builder().fineTunedModel("your-fine-tuned-model").build(); +FineTunedModelsStatusResponse fineTunedModelsStatusResponse = client.deleteFineTuningModel(request); +``` + +### 批处理 + +#### 创建批处理任务 + +```java +BatchCreateParams batchCreateParams = new BatchCreateParams( + "24h", + "/v4/chat/completions", + "your-file-id", + new HashMap() {{ + put("model", "glm-4"); + }} +); +BatchResponse batchResponse = client.batchesCreate(batchCreateParams); +``` + +#### 查询批处理任务 + +```java +BatchResponse batchResponse = client.batchesRetrieve("your-batch-id"); +``` + +#### 查询批处理任务列表 + +```java +QueryBatchRequest queryBatchRequest = new QueryBatchRequest(); +queryBatchRequest.setLimit(10); +QueryBatchResponse queryBatchResponse = client.batchesList(queryBatchRequest); +``` + +#### 取消批处理任务 + +```java +BatchResponse batchResponse = client.batchesCancel("your-batch-id"); +``` + ### Spring Boot 集成 ```java