# 多轮对话
chat.completions接口是无状态的，不会存储历史对话。为了实现多轮对话，模型需要在每次请求时，将历史信息都放在messages中，并通过role字段设置，让模型了解之前不同角色的不同对话内容（系统消息、用户消息、模型回复的消息），以便进行主题相关的延续性对话。
表1单轮对话与多轮对话的messages对比 
| 单轮对话                                                                              | 多轮对话                                                                                                                                                                      |
|:---|:---|
| ``` "messages": [ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "9.11和9.8哪个大？"} ] ``` | ``` "messages": [ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "9.11和9.8哪个大？"}, {"role": "assistant", "content": "9.8更大"}, {"role": "user", "content": "它们相加等于多少？"} ] ``` |
   
#### API说明
模型调用的完整参数列表请见[对话Chat/Post](https://support.huaweicloud.com/model-call-maas/model-call-018.html)。
#### 前提条件
- 已在"模型推理 \> 在线推理 \> 预置服务"页签开通预置服务。详情请见[开通MaaS预置服务](https://support.huaweicloud.com/model-call-maas/model-call-052.html)。
- （可选）如果需要控制服务调用流量，可提前创建自定义接入点，详情请参见[创建自定义接入点](https://support.huaweicloud.com/model-call-maas/model-call-048.html#ZH-CN_TOPIC_0000002549717747__zh-cn_topic_0000002397381901_section446813817237)。

- 已获取API Key。详情请见[在MaaS管理API Key](https://support.huaweicloud.com/model-call-maas/model-call-049.html)。
- 已获取模型服务的model参数值。支持的模型信息和接口详情请见[对话Chat/Post](https://support.huaweicloud.com/model-call-maas/model-call-018.html)。
 
#### 快速入门
以下为多轮对话的示例代码，可通过model参数替换模型，model参数详情请参见[文本生成](https://support.huaweicloud.com/model-list-maas/model_list_0001.html#section1)。
![](https://support.huaweicloud.com/model-call-maas/public_sys-resources/notice_3.0-zh-cn.png)
**思考模式**下，reasoning_content是模型的思考内容，多轮对话场景下，不应作为输入。如果在输入的messages数组中包含此字段，将被忽略，不作为模型输入。进行多轮对话时，应只保留上一轮模型返回的role和content字段。
- [Python]
  ```
  import requests
  import json
  if __name__ == '__main__':
      url = "https://api.modelarts-maas.com/v2/chat/completions"  # API地址
      api_key = "MAAS_API_KEY"  # 把MAAS_API_KEY替换成已获取的API Key
      # Send request.
      headers = {
          'Content-Type': 'application/json',
          'Authorization': f'Bearer {api_key}'
      }
      data = {
           "model": "glm-5.2",  # model参数
           "messages": [
               {"role": "system", "content": "You are a helpful assistant."},
               {"role": "user", "content": "9.11和9.8哪个大？"},
               {"role": "assistant", "content": "9.8更大"},
               {"role": "user", "content": "它们相加等于多少？"}
           ]
       }
      response = requests.post(url, headers=headers, data=json.dumps(data), verify=False)
      # Print result.
      print(response.status_code)
      print(response.text)
  ```
  模型返回的content：
  ```
  它们相加等于18.91。
  ```
- [Curl]
  ```
  curl -X POST "https://api.modelarts-maas.com/v2/chat/completions" \   
  -H "Content-Type: application/json" \   
  -H "Authorization: Bearer $MAAS_API_KEY" \   
  -d '{     
      "model": "glm-5.2",     
      "messages": [       
          {"role": "system", "content": "You are a helpful assistant."},     
          {"role": "user", "content": "9.11和9.8哪个大？"}, 
          {"role": "assistant", "content": "9.8更大"},     
          {"role": "user", "content": "它们相加等于多少？"}
      ]
  }'
  ```
  模型返回的content：
  ```
  它们相加等于18.91。
  ```
- [Java]
  建议JDK版本为15+。
  ```
  import java.net.URI;
  import java.net.http.HttpClient;
  import java.net.http.HttpRequest;
  import java.net.http.HttpResponse;
  import java.time.Duration;
  public class ChatCompletionsExample {
      public static void main(String[] args) {
          // 接口地址
          String apiUrl =  "https://api.modelarts-maas.com/v2/chat/completions";
          // 把MAAS_API_KEY替换成已获取的API Key
          String apiKey = "MAAS_API_KEY";
          // 替换为你要调用的模型名称，例如 "glm-5.2" 等
          String modelName = "glm-5.2";
          // 构造请求体
          String requestBody = String.format(
                  """
                          {
                              "model": "%s",
                              "messages": [
                                  {"role": "system", "content": "You are a helpful assistant."},
                                  {"role": "user", "content": "9.11和9.8哪个大？"},
                                  {"role": "assistant", "content": "9.8更大"},
                                  {"role": "user", "content": "它们相加等于多少？"}
                              ]
                          }""", modelName);
          // 创建 HttpClient
          HttpClient client = HttpClient.newBuilder()
                  .connectTimeout(Duration.ofSeconds(10))
                  .build();
          // 创建请求
          HttpRequest request = HttpRequest.newBuilder()
                  .uri(URI.create(apiUrl))
                  .header("Content-Type", "application/json")
                  .header("Authorization", "Bearer " + apiKey)
                  .POST(HttpRequest.BodyPublishers.ofString(requestBody))
                  .build();
          try {
              // 发送请求并打印结果
              HttpResponse<String> response = client.send(
                      request, HttpResponse.BodyHandlers.ofString());
              System.out.println("HTTP Status: " + response.statusCode());
              System.out.println("Response Body:\n" + response.body());
          } catch (Exception e) {
              e.printStackTrace();
          }
      }
  }
  ```
  模型返回的content：
  ```
  它们相加等于18.91。
  ```
#### 设置模型回答长度限制
多轮对话场景下，随着对话轮数的增加，每次调用消耗的Token数量也会增加，从而增加了使用成本。
这种情况下，可在请求时设置max_tokens字段明确限制模型生成的最大token数量，来限制模型回答长度。各模型的max_tokens取值可参考模型详情页的**最大输出长度**。
下面是设置模型回答长度限制的示例代码，可通过model参数替换模型，model参数详情请参见[文本生成](https://support.huaweicloud.com/model-list-maas/model_list_0001.html#section1)。
- [Python]
  ```
  import requests 
  import json  
  if __name__ == '__main__':     
      url = "https://api.modelarts-maas.com/v2/chat/completions"  # API地址     
      api_key = "MAAS_API_KEY"  # 把MAAS_API_KEY替换成已获取的API Key      
      # Send request.     
      headers = {         
          'Content-Type': 'application/json',         
          'Authorization': f'Bearer {api_key}'     
      }     
      data = {         
           "model": "glm-5.2",  # model参数         
           "messages": [
               {"role": "system", "content": "You are a helpful assistant." },             
               {"role": "user","content": "你好" }         
           ],
           "max_tokens": 1024
       }     
      response = requests.post(url, headers=headers, data=json.dumps(data), verify=False)      
      # Print result.     
      print(response.status_code)     
      print(response.text)
  ```
- [Curl]
  ```
  curl -X POST "https://api.modelarts-maas.com/v2/chat/completions" \   
  -H "Content-Type: application/json" \   
  -H "Authorization: Bearer $MAAS_API_KEY" \   
  -d '{     
      "model": "glm-5.2",     
      "messages": [       
          {"role": "system", "content": "You are a helpful assistant."},     
          {"role": "user", "content": "你好"}    
      ],
      "max_tokens": 1024
  }'
  ```
- [Java]
  建议JDK版本为15+。
  ```
  import java.net.URI;
  import java.net.http.HttpClient;
  import java.net.http.HttpRequest;
  import java.net.http.HttpResponse;
  import java.time.Duration;
  public class ChatCompletionsExample {
      public static void main(String[] args) {
          // 接口地址
          String apiUrl =  "https://api.modelarts-maas.com/v2/chat/completions";
          // 把MAAS_API_KEY替换成已获取的API Key
          String apiKey = "MAAS_API_KEY";
          // 替换为你要调用的模型名称，例如 "glm-5.2" 等
          String modelName = "glm-5.2";
          // 构造请求体
          String requestBody = String.format(
                  """
                          {
                              "model": "%s",
                              "messages": [
                                  {"role": "system", "content": "You are a helpful assistant."},
                                  {"role": "user", "content": "你好"}
                              ],
                              "max_tokens": 1024
                          }""", modelName);
          // 创建 HttpClient
          HttpClient client = HttpClient.newBuilder()
                  .connectTimeout(Duration.ofSeconds(10))
                  .build();
          // 创建请求
          HttpRequest request = HttpRequest.newBuilder()
                  .uri(URI.create(apiUrl))
                  .header("Content-Type", "application/json")
                  .header("Authorization", "Bearer " + apiKey)
                  .POST(HttpRequest.BodyPublishers.ofString(requestBody))
                  .build();
          try {
              // 发送请求并打印结果
              HttpResponse<String> response = client.send(
                      request, HttpResponse.BodyHandlers.ofString());
              System.out.println("HTTP Status: " + response.statusCode());
              System.out.println("Response Body:\n" + response.body());
          } catch (Exception e) {
              e.printStackTrace();
          }
      }
  }
  ```
#### 错误码
模型调用过程中，如有报错，请参考[错误码](https://support.huaweicloud.com/model-call-maas/model-call-035.html)排查并处理。
