跳转至

Client API

Java SDK 的客户端 API 位于 com.iwhaleai.byai.framework.client 包下,提供了向 Agent 网关发送消息、取消任务以及拦截器机制的能力。

GatewayClient\<T>

GatewayClient 是泛型客户端基类,通过 Redis 与 Gateway 通信,支持消息发送、任务取消和拦截器链。

构造方法

/**
 * 构造一个 GatewayClient 实例。
 *
 * @param redisClient Redis 客户端实例
 */
public GatewayClient(RedisClient redisClient);

使用示例:

RedisClient redisClient = new RedisClient("localhost", 6379);
GatewayClient<Object> client = new GatewayClient<>(redisClient);

sendMessage (简易版)

/**
 * 简化版消息发送。
 *
 * @param targetAgentType 目标 Agent 类型
 * @param sessionId       会话 ID
 * @param content         消息内容
 * @return SendResponse 响应对象
 */
public SendResponse sendMessage(
    String targetAgentType,
    String sessionId,
    Object content
);

使用示例:

SendResponse response = client.sendMessage("my_agent", "session_001", "帮我分析数据");
if (response.isSuccess()) {
    System.out.println("消息已发送,messageId: " + response.getMessageId());
}

sendMessage (完整版)

GatewayClient 实际上有多个 sendMessage 重载(3 参 / 4 参 / 11 参 / 13 参 / 16 参),下面是参数最全的 16 参重载,其余重载都是在这个基础上给未传的参数填默认值:

/**
 * 完整版消息发送,支持路由策略与可用性控制的全部参数。
 *
 * @param targetAgentType       目标 Agent 类型
 * @param sessionId             会话 ID
 * @param content               消息内容
 * @param userCode              用户编码
 * @param userName              用户名称
 * @param actionType            动作类型(字符串,如 "ASK_AGENT")
 * @param parentMessageId       父消息 ID,用于消息链路追踪
 * @param messageId             消息 ID(传 null 则自动生成)
 * @param traceId               追踪 ID(传 null 则自动生成)
 * @param payload               额外负载
 * @param metadata              元数据
 * @param targetWorkerId        直接指定目标 Worker(跳过 agent type 路由),可为 null
 * @param routePolicy           路由策略:FAIL_FAST / SEND_ANYWAY / WAKE_AND_WAIT / WAKE_AND_QUEUE / QUEUE_ONLY
 * @param availabilityTimeoutMs WAKE_AND_WAIT 策略下的超时时间(毫秒)
 * @param region                路由用的可选 region
 * @param priority              路由用的可选优先级
 * @return SendResponse 响应对象
 */
public SendResponse sendMessage(
    String targetAgentType,
    String sessionId,
    T content,
    String userCode,
    String userName,
    String actionType,
    String parentMessageId,
    String messageId,
    String traceId,
    Map<String, Object> payload,
    Map<String, Object> metadata,
    String targetWorkerId,
    String routePolicy,
    long availabilityTimeoutMs,
    String region,
    String priority
);

使用示例:

SendResponse response = client.sendMessage(
    "report_agent",
    "session_001",
    "生成月度销售报表",
    "user_123",
    "张三",
    ActionType.ASK_AGENT,
    "",                             // parentMessageId
    null,                           // messageId(自动生成)
    null,                           // traceId(自动生成)
    Map.of("format", "pdf", "language", "zh"),  // payload
    Map.of("priority", "high"),     // metadata
    null,                           // targetWorkerId
    RoutePolicy.FAIL_FAST,
    0L,                             // availabilityTimeoutMs
    null,                           // region
    null                            // priority
);

向后兼容的 requireOnlineWorker 重载

还有一个 13 参重载接收 boolean requireOnlineWorker 而不是 String routePolicy(内部会自动转换: true → FAIL_FASTfalse → SEND_ANYWAY),供从旧版本升级的调用方使用,新代码建议直接用 routePolicy

sendCommand

/**
 * 发送预构造的 GatewayCommand 对象。
 *
 * @param command 预构造的命令对象
 * @return SendResponse 响应对象
 */
public SendResponse sendCommand(GatewayCommand command);

使用示例:

MessageHeader header = MessageHeader.builder()
    .messageId("msg_001")
    .sessionId("session_001")
    .traceId("trace_001")
    .targetAgentType("my_agent")
    .build();

AskAgentCommand command = AskAgentCommand.builder()
    .header(header)
    .content("分析这组数据")
    .build();

SendResponse response = client.sendCommand(command);

cancelTask

/**
 * 取消指定的任务。
 *
 * @param messageId       目标消息 ID
 * @param sessionId       会话 ID
 * @param reason          取消原因
 * @param targetAgentType 目标 Agent 类型(可选,传空字符串即可)
 * @param requestedBy     取消发起方标识
 * @param cancelMode      取消模式("graceful" 或 "force")
 * @return CancelTaskResponse 响应对象
 */
public CancelTaskResponse cancelTask(
    String messageId,
    String sessionId,
    String reason,
    String targetAgentType,
    String requestedBy,
    String cancelMode
);

// 还有一个 2 参简化重载:cancelTask(messageId, sessionId),
// 等价于 cancelTask(messageId, sessionId, "", "", "client", "graceful")

使用示例:

CancelTaskResponse cancelResp = client.cancelTask(
    "msg_001",
    "session_001",
    "用户手动取消",
    "",
    "client",
    "graceful"
);

if (cancelResp.isSuccess()) {
    System.out.println("任务已成功取消");
}

addInterceptor

/**
 * 添加网关拦截器。
 *
 * @param interceptor 拦截器实例
 */
public void addInterceptor(GatewayInterceptor interceptor);

使用示例:

client.addInterceptor(params -> {
    System.out.println("即将发送消息到: " + params.getTargetAgentType());
    return params;  // 可以在返回前修改 params 的字段
});

ByaiGatewayClient

ByaiGatewayClient 继承自 GatewayClient,自动注册了 ByaiMessageInterceptor,用于适配 BeyonAI 平台内部的消息格式。

/**
 * ByaiGatewayClient 构造方法。
 * 自动包含 ByaiMessageInterceptor,无需手动添加。
 *
 * @param redisClient Redis 客户端实例
 */
public ByaiGatewayClient(RedisClient redisClient);

使用示例:

RedisClient redisClient = new RedisClient("localhost", 6379);
ByaiGatewayClient client = new ByaiGatewayClient(redisClient);

// 直接使用,无需额外配置拦截器
SendResponse response = client.sendMessage("agent_type", "session_001", "Hello");

GatewayInterceptor

GatewayInterceptor 是一个单方法函数式接口,在消息发送前执行,接收并返回 SendMessageParams——可以用来 修改即将发出的请求参数(日志记录、参数校验、内容转换等)。它只有 beforeSend没有 afterSend 钩子; 如果需要观察发送结果,在调用 sendMessage(...) 之后直接检查返回的 SendResponse 即可。

public interface GatewayInterceptor {
    /**
     * 发送前拦截,接收当前参数并返回(可能修改过的)参数。
     */
    SendMessageParams beforeSend(SendMessageParams params);
}

使用示例:

GatewayInterceptor logInterceptor = params -> {
    System.out.println("[INFO] 发送消息 - target: " + params.getTargetAgentType());
    return params;
};

client.addInterceptor(logInterceptor);

SendResponse response = client.sendMessage("my_agent", "session_001", "帮我分析数据");
if (response.isSuccess()) {
    System.out.println("[INFO] 消息发送成功 - messageId: " + response.getMessageId());
} else {
    System.err.println("[ERROR] 消息发送失败 - " + response.getError());
}

SendResponse

SendResponseGatewayClient 的内部类,封装了消息发送的响应结果。

public class SendResponse {
    /** 消息发送是否成功 */
    public boolean isSuccess();

    /** 获取分配的消息 ID */
    public String getMessageId();

    /** 获取本次发送使用的 trace ID */
    public String getTraceId();

    /** 获取目标 Worker ID */
    public String getTargetWorkerId();

    /** 获取发送状态 */
    public String getStatus();

    /** 获取时间戳 */
    public long getTimestamp();

    /** 获取错误信息(如有) */
    public String getError();

    /** 获取错误码(如有) */
    public String getErrorCode();
}

属性表

方法 返回类型 描述
isSuccess() boolean 消息是否发送成功
getMessageId() String 分配的消息 ID
getTraceId() String 本次发送使用的 trace ID
getTargetWorkerId() String 目标 Worker ID
getStatus() String 发送状态
getTimestamp() long 时间戳
getError() String 错误信息(成功时为空字符串)
getErrorCode() String 错误码(成功时为空)

CancelTaskResponse

CancelTaskResponseGatewayClient 的内部类,封装了任务取消操作的响应结果。

public class CancelTaskResponse {
    /** 取消操作是否成功 */
    public boolean isSuccess();

    /** 被取消的消息 ID */
    public String getMessageId();

    /** 被取消的执行 ID */
    public String getExecutionId();

    /** 处理该执行的 Worker ID */
    public String getWorkerId();

    /** 取消状态 */
    public String getStatus();

    /** 时间戳 */
    public long getTimestamp();

    /** 错误信息(如有) */
    public String getError();
}

属性表

方法 返回类型 描述
isSuccess() boolean 取消操作是否成功
getMessageId() String 被取消的消息 ID
getExecutionId() String 被取消的执行 ID
getWorkerId() String 处理该执行的 Worker ID
getStatus() String 取消操作状态
getTimestamp() long 时间戳
getError() String 错误信息(成功时为空字符串)

完整使用示例

// 1. 初始化客户端
RedisClient redisClient = new RedisClient("localhost", 6379);
ByaiGatewayClient client = new ByaiGatewayClient(redisClient);

// 2. 添加自定义拦截器(单方法接口,发送前执行,返回可能修改过的参数)
client.addInterceptor(params -> {
    System.out.println("[LOG] 准备发送消息到: " + params.getTargetAgentType());
    return params;
});

// 3. 发送消息(11 参重载:不需要路由策略控制时用这个更简单)
SendResponse response = client.sendMessage(
    "data_analyzer",
    "session_abc",
    "请分析最近一周的数据",
    "user_001",
    "李四",
    ActionType.ASK_AGENT,
    "",                                    // parentMessageId
    null,                                  // messageId(自动生成)
    null,                                  // traceId(自动生成)
    Map.of("dataSource", "mysql"),         // payload
    Map.of("priority", "normal")           // metadata
);

// 4. 检查响应
if (response.isSuccess()) {
    System.out.println("消息发送成功,messageId: " + response.getMessageId());
    System.out.println("目标 Worker: " + response.getTargetWorkerId());
} else {
    System.err.println("消息发送失败: " + response.getError());
}

// 5. 取消任务(如果需要)
CancelTaskResponse cancelResp = client.cancelTask(
    response.getMessageId(),
    "session_abc",
    "不再需要结果",
    "",              // targetAgentType
    "client",        // requestedBy
    "graceful"       // cancelMode
);

System.out.println("取消结果: " + cancelResp.isSuccess());