更新时间:2024-07-12 GMT+08:00
分享

Agents后端应用接口规则和计费说明

Agents后端应用接口的基本要求

协议类型:http、https

接口类型:get、post

响应类型:同步、流式

返回类型:json、stream

鉴权方式:AK/SK认证(推荐)、自主认证

返回必须要携带tokens使用量usage对象,放在一级结构

响应示例:

{
  "data": "南京,全名南京市,是江苏省的省会,位于中国南部的长江中游,是长江三大口的一个,也是中国古代文化的发祥地。",    //可替换成自己的任意对象结构
  "usage": {                            //usage的对象结构必须一样
      "completion_tokens": 217,   //大模型输出的token数量
      "prompt_tokens": 31,     //用户输入的tokens数量
      "total_tokens": 248      //总tokens数量
  }
}

在实际使用中,如选择是按token数的计费因子,依赖请求响应的tokens使用量usage对象来计算本次调用的计费。

接口调用过程介绍

参数说明:

Agents网关会增加三个请求头信息返回给后端接口,可按需接收和使用:

X-Request-Id:uuid(接口请求唯一编号)

X-Customer-Id:domain id(购买客户华为云账号ID)

X-Customer-Name:domain_name(购买客户华为云账号名称)

AK/SK认证方式(推荐)

验签方法:

  1. 从jwtToken中使用base64解码解析出AK
  2. 根据AK查询本地储存的SK
  3. 根据SK使用jwt工具类验签

引入依赖:

<dependency>

<groupId>com.auth0</groupId>

<artifactId>java-jwt</artifactId>

<version>4.2.1</version>

</dependency>

示例代码:

public class JWTtokenUtil {

      //生成token
     public static String createJwt() {
         Map<String, Object> signHeaders = new HashMap<>();
         signHeaders.put("alg", "HS256"); // 设置签名算法为HS256
         signHeaders.put("sign_type", "SIGN"); // 设置签名类型为SIGN
         Map<String, Object> payload = new HashMap<>();
         payload.put("api_key", "d44cd9aa-e48e-be17-27f4-5ef3474797a1"); // 设置API密钥
         long timestamp = System.currentTimeMillis(); // 获取当前时间戳
         payload.put("timestamp", timestamp); // 将时间戳添加到payload
         // 失效时间5分钟
         payload.put("exp", timestamp + 300000); // 设置令牌的过期时间,这里设置为当前时间戳加上300000毫秒(即5分钟
         String sk ="f980be69-88e6-4f02-9d09-e47326488df2"; // 秘钥
         // 创建JWT,包含headerpayload,并使用秘钥进行签名
         String jwtToken =

JWT.create().withHeader(signHeaders).withPayload(payload).sign(Algorithm.HMAC256(sk)); 

         System.out.println(jwtToken); // 打印生成的JWT

          return jwtToken; // 返回生成的JWT
     }
       //验证Token的有效性
     public static boolean checkToken(String token) {
         //解析出ak
         String payloadBase64=token.split("\\.")[1]; // 使用"."分割token,获取第二部分
         byte[] decodedBytes = DatatypeConverter.parseBase64Binary(payloadBase64); // 将获取到的部分进行Base64解码
         String payloadJson = new String(decodedBytes); // 将解码后的字节数组转换为字符串 
        JSONObject json_test=JSONObject.fromObject(payloadJson); // 将字符串转换为JSON对象
         String ak=json_test.get("api_key").toString(); // JSON对象中获取"api_key"对应的值
         System.out.println(ak); // 打印ak

          //根据ak查询sk,按照自己的数据规则查询
         String sk ="f980be69-88e6-4f02-9d09-e47326488df2"; // 这里直接赋值为一个固定的字符串,实际应用中应根据ak查询获取

          //验证Token(验证失败,会引发异常)
         boolean result=false; // 初始化验证结果为false
         try {
             JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(sk)).build(); // 创建JWTVerifier对象,使用HMAC256算法和sk进行构建
             DecodedJWT verify = jwtVerifier.verify(token); // 使用JWTVerifier对象验证token
             result=true; // 验证成功,将结果设为true
         } catch (Exception e) {
             System.out.println("捕获到异常:" + e.getMessage());// 验证失败,抛出异常
         }
         return result; // 返回验证结果
     }

      public static void main(String[] args) {
         String jwtToken = createJwt();

          System.out.println(checkToken(jwtToken));
     }

  }

自主认证推荐方式

如果选择自主认证方式,则不需要填写AK/SK,建议将自己的认证密钥配置到请求头的常量参数中(网关会加密保存),网关将不再进行加签行为直接转发。

自主认证方式因为没有加签行为,可能会有一定的安全风险,安全认证方式agents应用接口提供方自主负责。

相关文档