AIMA开放平台文档中心Agent SDK (Android)

扩展技能(ExtSkill)示例 · Android

扩展技能(ExtSkill)示例 · Android

⚠️ 尚未上线:本能力为 v1.5.0-SNAPSHOT 开发中特性,接口与协议可能调整,正式发布前请勿用于生产环境。

v1.5.0 新增。API 与 Java v1.5.0 · 扩展技能示例 完全一致,此处按 Android 惯例(Activity + 主线程回调切换)改写。Android 端没有独立的 ExtSkill 示例源码文件,以下为内联代码。

最小示例

java
import android.os.Bundle;
import android.util.Log;

import androidx.appcompat.app.AppCompatActivity;

import com.agibot.aiem.sdk.AgentAuthCallback;
import com.agibot.aiem.sdk.AgentParam;
import com.agibot.aiem.sdk.AgentSdk;
import com.agibot.aiem.sdk.IdGenerator;
import com.agibot.aiem.sdk.extskill.ExtSkillInvokeCallback;
import com.agibot.aiem.sdk.extskill.ExtSkillQueryCallback;
import com.agibot.aiem.sdk.extskill.ExtSkillRequest;

public class ExtSkillDemoActivity extends AppCompatActivity {

    private static final String TAG = "ExtSkillDemo";

    private static final String URL        = "wss://open.agibot.com/api/V1/open-portal/app/wss/agent-sdk";
    private static final String APP_ID     = "<灵心开放平台应用 appId>";
    private static final String APP_KEY    = "<灵心开放平台应用 appKey>";
    private static final String APP_SECRET = "<灵心开放平台应用 appSecret>";
    private static final String AGENT_ID   = "<目标智能体 agentId>";

    private AgentSdk agentSdk;
    private ExtSkillRequest extSkillRequest;
    private String requestId;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 1. 创建 SDK + 注册鉴权 + 初始化
        agentSdk = AgentSdk.create(URL, APP_ID, APP_KEY, APP_SECRET);
        agentSdk.registerAuth(new AgentAuthCallback() {
            @Override
            public void onAuthState(String appId, int code, String msg) {
                Log.i(TAG, "onAuthState => appId=" + appId + ", code=" + code + ", msg=" + msg);
                if (code == 0) {
                    // 鉴权成功后可开始 query / invoke
                    runOnUiThread(() -> onAuthSuccess());
                }
            }
        });
        agentSdk.initialize();
    }

    private void onAuthSuccess() {
        // 2. 注册扩展技能请求实例
        requestId = IdGenerator.generateExtSkillRequestId();
        extSkillRequest = new ExtSkillRequest(agentSdk, AGENT_ID, requestId);
        agentSdk.registerExtSkill(extSkillRequest);

        // 3. 查询可用扩展技能清单
        querySkills();
    }

    private void querySkills() {
        String queryEventId = extSkillRequest.query(new ExtSkillQueryCallback() {
            @Override
            public void onQueryResult(String agentId, String requestId, String eventId,
                                      int code, String msg, AgentParam result) {
                Log.i(TAG, "onQueryResult => agentId=" + agentId
                        + ", code=" + code + ", msg=" + msg + ", result=" + result);
                // 回调在非 UI 线程,更新界面需切回主线程
                runOnUiThread(() -> {
                    if (code == 0) {
                        // result 承载技能清单,按需展示或触发 invoke
                    } else {
                        // 失败处理:code -1 服务端拒绝;1000 本地连接已关闭
                    }
                });
            }
        }, 2000);
        Log.i(TAG, "query sent, eventId=" + queryEventId);
    }

    private void invokeSkill() {
        // 4. 触发某个扩展技能执行
        String extSkillId = "test_ext_skill_id_001";
        AgentParam input = AgentParam.create();
        input.setString("role", "male");
        input.setInteger("threshold", 0);

        String invokeEventId = extSkillRequest.invoke(extSkillId, input, new ExtSkillInvokeCallback() {
            @Override
            public void onInvokeAck(String agentId, String requestId, String eventId,
                                    int code, String msg) {
                // 第一段:网关已受理(非 UI 线程)
                Log.i(TAG, "onInvokeAck => code=" + code + ", msg=" + msg);
            }

            @Override
            public void onState(String agentId, String requestId, String eventId,
                                String stateName, String stateValue) {
                // 第二段:执行期间状态上报(非 UI 线程,0 到多次)
                Log.i(TAG, "onState => stateName=" + stateName + ", stateValue=" + stateValue);
            }

            @Override
            public void onInvokeResult(String agentId, String requestId, String eventId,
                                       int code, String msg, AgentParam param) {
                // 第三段:技能执行输出(非 UI 线程)
                Log.i(TAG, "onInvokeResult => code=" + code + ", msg=" + msg + ", param=" + param);
                runOnUiThread(() -> {
                    if (code == 0) {
                        // param 承载技能出参,更新 UI
                    }
                });
            }
        }, 2000);
        Log.i(TAG, "invoke sent, eventId=" + invokeEventId);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 5. 释放
        if (agentSdk != null && requestId != null) {
            agentSdk.unregisterExtSkill(requestId);
        }
        // agentSdk.release();  // 整个 SDK 不再使用时调用
    }
}

常见改写要点

想做改哪里
只拉清单不触发只调 query(...),拿到 onQueryResult 的 result 即可;invoke 可省略
触发不同技能换 invoke 的第一个参数 extSkillId;input 按目标技能定义填 AgentParam
传结构化入参AgentParam.create().setString(...).setInteger(...);wire 上以扁平键值下发
只关心最终结果onInvokeAck 可只记日志;真正输出在 onInvokeResult 的 param(code == 0 时非空)
感知 SDK 鉴权 / 断连query / invoke 回调收到 code == 1000 表示本地连接已关闭,应重连后重试
多智能体并行每个 agentId 建一个 ExtSkillRequest(各自独立 requestId);SDK 按 requestId 索引,互不冲突
Activity 生命周期在 onDestroy 中 unregisterExtSkill;避免 Activity 销毁后回调持有旧引用