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认证方式(推荐)
验签方法:
- 从jwtToken中使用base64解码解析出AK
- 根据AK查询本地储存的SK
- 根据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,包含header和payload,并使用秘钥进行签名 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应用接口提供方自主负责。