Changelog
Changelog
v1.5.0-SNAPSHOT (Current Development)
⚠️ This is an in-development (SNAPSHOT) release. The v1.5.0 additions below (teleop / extended skills / Function Call & Arbiter) are not yet released and the interfaces may change.
Release Date: In Development
🆕 New capability: beyond-line-of-sight teleop
v1.5.0 opens a third interaction path on top of passive / active — remote-operator teleop.
- New classes:
com.agibot.aiem.sdk.teleop.TeleopRequest— session entity:enter/startAudio(AgentParam)/appendAudioDelta/doneAudio/keepalive/exitcom.agibot.aiem.sdk.teleop.TeleopEnterCallback—onEnterAck(teleopId, eventId, code, msg)com.agibot.aiem.sdk.teleop.TeleopKeepaliveCallback—onKeepaliveAck(teleopId, eventId, code, msg); robot online probe, recommend calling every 10 seconds during the session,code != 0means the robot is offlinecom.agibot.aiem.sdk.teleop.TeleopExitCallback—onExitAck(teleopId, eventId, code, msg)com.agibot.aiem.sdk.mgr.AgentSdkTeleopMgr— global request index, 7200 s idle sweepercom.agibot.aiem.sdk.client.TeleopMsgHandler— inbound routing
- New
AgentSdkpublic methods:registerTeleop(TeleopRequest)unregisterTeleop(String teleopId)
- New policy enum:
AgentPolicy.TELEOP(wire value"teleop") - Nine new event types under
AGENTSDK_TELEOP_*(includesagentsdk.teleop.keepalive/agentsdk.teleop.keepalive_ack) - New id-prefix generator:
IdGenerator.generateTeleopId()→teleop_<21 chars> - New example:
com.agibot.aiem.teleop.TeleopExample - New docs: Teleop guide · Teleop API · Teleop example
🆕 New capability: extended skills (ExtSkill)
v1.5.0 also introduces ExtSkill — query a robot's available extended-skill catalogue via query and trigger execution via invoke. Results are returned asynchronously through a three-phase receipt (invoke_ack confirms acceptance → report_state reports progress → invoke_result returns execution outcome); invoke_ack and invoke_result each fire once, and during execution the skill side may report progress repeatedly via agentsdk.ext_skill.report_state (mapped to onState). Unlike Teleop which uses sn+teleopId, ExtSkill identifies sessions by agentId+requestId.
- New classes:
com.agibot.aiem.sdk.extskill.ExtSkillRequest— request entity:query/invokecom.agibot.aiem.sdk.extskill.ExtSkillQueryCallback—onQueryResult(agentId, requestId, eventId, code, msg, result)com.agibot.aiem.sdk.extskill.ExtSkillInvokeCallback—onInvokeAck(agentId, requestId, eventId, code, msg)+onState(agentId, requestId, eventId, stateName, stateValue)+onInvokeResult(agentId, requestId, eventId, code, msg, param)com.agibot.aiem.sdk.mgr.AgentSdkExtSkillMgr— indexed by requestId, 7200 s idle sweepercom.agibot.aiem.sdk.client.ExtSkillMsgHandler— inbound routing
- New
AgentSdkpublic methods:registerExtSkill(ExtSkillRequest)unregisterExtSkill(String requestId)
- New policy enum:
AgentPolicy.EXT_SKILL(wire value"extskill") - Six new event types:
agentsdk.ext_skill.query/agentsdk.ext_skill.query_resultagentsdk.ext_skill.invoke/agentsdk.ext_skill.invoke_ack/agentsdk.ext_skill.report_state/agentsdk.ext_skill.invoke_result
- New id-prefix generator:
IdGenerator.generateExtSkillRequestId()→extskill_<21 chars> - New example:
com.agibot.aiem.extskill.ExtSkillExample - New docs: ExtSkill guide · ExtSkill API · ExtSkill example
🆕 New capability: Function Call exposure & Arbiter
v1.5.0 opens up Function Call dispatch and Arbiter arbitration on the passive interaction path: the gateway forwards a pending function call to the SDK, and the application returns an arbitration decision that determines whether the function call is handled by the agent's default pipeline or taken over by the application.
- New callback method (on all 8 passive callback classes):
onFunctionCall(String agentId, String eventId, FunctionCallInfo functionCall, <XxxResponse> response), default no-op, override as needed - New response method (on all 8 Response classes):
onArbiter(String eventId, String decision, AgentParam arbParam) - New entity class:
com.agibot.aiem.sdk.FunctionCallInfo(fieldssource/policy/type/value/param) - New enum:
com.agibot.aiem.sdk.enums.ArbiterDecision(DELEGATE="delegate"/OVERRIDE="override") - New message handler:
com.agibot.aiem.sdk.client.passive.FunctionCallMsgHandler - New event types:
agentsdk.function_call.expose(gateway → SDK, triggersonFunctionCall)agentsdk.function_call.arbiter(SDK → gateway, emitted byonArbiter)
- Docs: Passive Callbacks Guide · Function Call exposure & Arbiter · Passive Callbacks API · Function Call & Arbiter
- Note: currently opened up in the Java SDK only; other language SDKs have not implemented it yet
⚠️ Breaking change: console "Skill Invocation Method = Agent Invocation" removed (v1.5.0 required)
With the introduction of Function Call + Arbiter in v1.5.0, the platform's skill-forwarding mode — setting Skill Invocation Method to Agent Invocation in the custom-agent configuration — has been removed and replaced by the arbiter:
- Before (≤ v1.4.0): with Skill Invocation Method set to Agent Invocation, the platform forwarded triggered skill requests to your agent (SDK) for custom handling.
- Now (v1.5.0): that platform option is removed; the platform no longer forwards skills. Instead it surfaces pending skill requests as function calls to the SDK (
onFunctionCall), and your agent decides delegation explicitly via the Arbiter interface (response.onArbiter(...)):ArbiterDecision.DELEGATE(hand off to the default chain) orArbiterDecision.OVERRIDE(agent takes over).
If your agent relies on the "Skill Invocation Method = Agent Invocation" forwarding behaviour, you must upgrade to v1.5.0 and reimplement skill delegation on top of Function Call + Arbiter, otherwise skills will no longer be handled.
Contract
register → enter → (startAudio(param) → appendAudioDelta* → doneAudio)+ → exit → unregister
Call keepalive at any frequency during the session (recommended every 10 seconds). If any onKeepaliveAck returns code != 0, treat the robot as offline and exit + unregisterTeleop immediately.
enter/keepalive/exitare ack'd via callback (code == 0OK,code == 1000local close,code == -1server reject).startAudio/appendAudioDelta/doneAudioare fire-and-forget.startAudio(AgentParam)supports voice / VAD tuning per segment:role("male"/"female"),threshold(-14 – 14).timeoutis a placeholder (clamped to ≥50 ms) — no timeout callback yet.
Compatibility
- API-level fully backward-compatible with v1.4.0: existing
registerAuth, passive callbacks, and task-flow APIs are unchanged. Bumppom.xmlversion from1.4.0-SNAPSHOT→1.5.0-SNAPSHOT. - If you don't use teleop or Function Call, runtime behaviour is identical to v1.4.0.
- One breaking change applies: agents that relied on the console's "Skill Invocation Method = Agent Invocation" forwarding must be migrated to Function Call + Arbiter as described above.
Dependencies
Same as v1.4.0 — no third-party upgrades.
v1.4.0-SNAPSHOT
Release Date: In Development
⚠️ Breaking change — auth/signing standardised (NOT compatible with v1.3.0 or earlier)
v1.4.0 standardises the AgentSDK signing scheme to align with the LinkSoul open-platform
spec. The change touches the gateway URL, the credential source, the AgentSdk.create()
signature and the wire-protocol headers. v1.3.0 (and earlier) clients cannot upgrade in
place; every item below has to be migrated together:
| Item | v1.3.0 and earlier | v1.4.0 |
|---|---|---|
| Gateway URL | wss://agentsdk.agibot.com/v1/agentsdk | wss://open.agibot.com/api/V1/open-portal/app/wss/agent-sdk |
| Credential source | Custom-agent template on the legacy platform | Application on the LinkSoul open platform (issues an additional appKey) |
| Factory | AgentSdk.create(url, appId, appSecret) | AgentSdk.create(url, appId, appKey, appSecret) |
| Algorithm | JWT (HS256) sent via AGIBOT_AUTHORIZATION | HMAC-SHA256("GET\n{path}\n{timestamp}\n{nonce}"), delivered across five signed headers |
| Auth headers | 1 header: AGIBOT_AUTHORIZATION | 5 headers: X-App-Id / X-App-Key / X-Timestamp / X-Nonce / X-Signature |
callbackTypes transport | JWT payload field | Standalone header X-Callback-Types (JSON array string) |
| Internal impact | LinkskyClient depends on JwtUtil | LinkskyClient drops JwtUtil, adds hmacSha256(); AgentSdk no longer exposes the appSecret getter |
Migration checklist:
- Re-issue
appId/appKey/appSecreton the open-platform application page — old credentials cannot be reused. - Switch the WebSocket gateway URL to
wss://open.agibot.com/api/V1/open-portal/app/wss/agent-sdk. - Update every
AgentSdk.create(url, appId, appSecret)call toAgentSdk.create(url, appId, appKey, appSecret). - If you forward SDK traffic through a custom proxy / gateway, parse and propagate the new
five-header signature plus
X-Callback-Types, and stop relying onAGIBOT_AUTHORIZATION. - Make sure nothing in your code still reads
AgentSdk.getAppSecret()(getter removed).
Added
- Three-in-one active greeting:
PassiveCallbackbase class addsonGreetSignal(agentId, eventId, param, GreetResponse). Reply via eitherGreetResponse.onGreetVlmDelta/Done(VLM streaming text) oronGreetTtsDelta/Done(base64-encoded chunks of synthesised audio bytes) - New protocol events
agentsdk.greet_response.tts.delta/agentsdk.greet_response.tts.done(alongside the existingagentsdk.greet_response.vlm.delta/done) - UID (face / voiceprint) exposure: base class adds
onFaceInfo(agentId, eventId, param)andonVideoFrame(agentId, eventId, flag, buf, isKeyFrame, localTs, param) - State push merged into passive callback:
PassiveCallback.onState(agentId, eventId, stateName, stateValue) - New protocol event
agentsdk.state_request.meta(robot state push)
Changed
- Greeting capability consolidated:
Greet2VlmCallbackandGreet2VlmResponseare removed. Greeting signals are delivered throughPassiveCallback.onGreetSignal, and both VLM and TTS replies share a singleGreetResponse. Greeting no longer uses a dedicatedAgentCallbackType; any registered passive callback can receive it. - State listening consolidated:
StateListenCallbackandAgentSdk.registerStateListen(...)are removed. State changes now arrive viaPassiveCallback.onState(...)shared by every callback subclass. - Fixed
GreetResponse.onGreetTtsDelta/Donemistakenly emitting VLM event types
Removed
Greet2VlmCallback/Greet2VlmResponse/StateListenCallback(merged intoPassiveCallback)AgentSdk.registerStateListen(...)(folded into the passive callback registration flow)- Deleted passive callback classes (and their corresponding Response classes):
Audio2Asr/Audio2Audio/AudioVideo2Audio/Text2Tts - Public
AgentSdkmethods removed (underlying Callback/Request classes kept on disk):- Passive callback registration:
registerPushListen - Active APIs:
querySkill,queryState,registerPullStream/unregisterPullStream
- Passive callback registration:
AgentCallbackTypeenum dropsAUDIO_2_ASR,AUDIO_2_AUDIO,AUDIO_VIDEO_2_AUDIO,TEXT_2_TTS,STATE_LISTEN,GEET_2_VLM,GEET_2_TTS(PUSH_LISTENis kept but no longer exposed publicly)- Public passive-callback surface narrows to 8 types:
Audio2Llm/Audio2Tts/Asr2Llm/Asr2Tts/AsrVideo2Vlm/AsrVideo2Tts/AudioVideo2Vlm/AudioVideo2Tts - Public active surface narrows to
registerTaskFlow/unregisterTaskFlow
v1.3.0
Added
- Milestone release with all features enabled
- Active interaction: Skill Query (
querySkill) — query robot skills and parameters - Active interaction: State Query (
queryState) — query robot current state - Active interaction: Task Flow (
TaskFlowRequest) — orchestrate multi-step tasks (startRequest/taskRequest/endRequest/interruptRequest) - Active interaction: Pull Stream (
PullStreamRequest) —startRequest/keepaliveRequest/endRequest - Active interaction: Push Stream Listen (
PushListenCallback) — receive robot-pushed video streams - Active interaction: State Listen (
StateListenCallback) — real-time state change notifications - Passive interaction skill return:
response.onSkill(eventId, itemId, skillType, skillName, skillParam) - Passive interaction interrupt:
response.onInterrupt(eventId, interruptType, interruptTips) AgentParamsupports generic parameters (getObject/setObject,getList/setList)- Passive callbacks receive
AgentParam paramextension parameter - Protocol adds
policyfield to identify interaction mode - Response includes
eventIdfield for caller-side session tracking FlowStartCallback/FlowTaskCallbackdistinguishRequestAckvsExecuteAcktwo-phase confirmation- Automatic timeout cleanup mechanism
AgentThreadPoolthread pool management (per-agent binding, ordered message processing)AgentDelayedPooldelayed task framework (heartbeat timeout detection)- Active interaction example programs
- Skill return and interrupt example programs
Changed
- Gateway URL switched (2026-06-25): WebSocket endpoint moves from
wss://agentsdk.agibot.com/v1/agentsdktowss://open.agibot.com/api/V1/open-portal/app/wss/agent-sdk. Credentials (appId/appKey/appSecret) are now issued by the application page on the LinkSoul open platform (replaces the previous "custom agent template") - Authentication upgrade (2026-06-24):
AgentSdk.create()addsappKeyparameter; auth method changed from JWT to HMAC-SHA256 gateway signing- Old signature:
AgentSdk.create(url, appId, appSecret)— generated JWT token sent viaAGIBOT_AUTHORIZATIONheader - New signature:
AgentSdk.create(url, appId, appKey, appSecret)— authenticates via five headers:X-App-Id,X-App-Key,X-Timestamp,X-Nonce,X-Signature; signature algorithm:HMAC-SHA256("GET\n{path}\n{timestamp}\n{nonce}") LinkskyClientremovesJwtUtildependency; built-inhmacSha256method addedAgentSdkremovesappSecretgetter; auth credentials are now held internally byLinkskyClientcallbackTypesmoved from JWT payload field to a standaloneX-Callback-Typesrequest header (JSON array string)
- Old signature:
timeoutparameter type upgraded frominttolongfor larger ranges- All
onRequestcallback signatures gainAgentParam paramparameter - Optimized log output, reduced redundant logging
v1.1.0
Added
- Multimodal passive callbacks:
AsrVideo2Vlm,AsrVideo2Tts,AudioVideo2Vlm,AudioVideo2Tts,AudioVideo2Audio AgentMetawrapper replacing raw JSONObject- Video stream passthrough support (H264 + Image)
- Image frame size limits
Changed
- Project restructured, migrated to independent repository
- Configurable appId/appSecret for custom agents
v1.0.0
Release Date: 2025-02-27
Initial Release
- SDK core framework:
AgentSdksingleton factory pattern - WebSocket client:
LinkskyClient(Netty-based, auto-reconnect, JWT auth) - Basic passive callbacks:
Audio2Asr,Audio2Llm,Audio2Tts,Asr2Llm,Asr2Tts,Audio2Audio,Text2Tts AgentParamtype-safe parameter wrapperIdGeneratorunique ID generationJwtUtilJWT signing utility- Example programs
Dependency Versions
| Dependency | Version |
|---|---|
| Java | 17+ |
| Netty | 4.1.116.Final |
| fastjson2 | 2.0.53 |
| jjwt | 0.11.5 |
| Lombok | 1.18.36 |
| commons-lang3 | 3.14.0 |
| SLF4J | 2.0.16 |
| Logback | 1.5.13 |