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 / exit
    • com.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 != 0 means the robot is offline
    • com.agibot.aiem.sdk.teleop.TeleopExitCallback — onExitAck(teleopId, eventId, code, msg)
    • com.agibot.aiem.sdk.mgr.AgentSdkTeleopMgr — global request index, 7200 s idle sweeper
    • com.agibot.aiem.sdk.client.TeleopMsgHandler — inbound routing
  • New AgentSdk public methods:
    • registerTeleop(TeleopRequest)
    • unregisterTeleop(String teleopId)
  • New policy enum: AgentPolicy.TELEOP (wire value "teleop")
  • Nine new event types under AGENTSDK_TELEOP_* (includes agentsdk.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 / invoke
    • com.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 sweeper
    • com.agibot.aiem.sdk.client.ExtSkillMsgHandler — inbound routing
  • New AgentSdk public 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_result
    • agentsdk.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 (fields source / 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, triggers onFunctionCall)
    • agentsdk.function_call.arbiter (SDK → gateway, emitted by onArbiter)
  • 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) or ArbiterDecision.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

text
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 / exit are ack'd via callback (code == 0 OK, code == 1000 local close, code == -1 server reject).
  • startAudio / appendAudioDelta / doneAudio are fire-and-forget.
  • startAudio(AgentParam) supports voice / VAD tuning per segment: role ("male" / "female"), threshold (-14 – 14).
  • timeout is 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. Bump pom.xml version from 1.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:

Itemv1.3.0 and earlierv1.4.0
Gateway URLwss://agentsdk.agibot.com/v1/agentsdkwss://open.agibot.com/api/V1/open-portal/app/wss/agent-sdk
Credential sourceCustom-agent template on the legacy platformApplication on the LinkSoul open platform (issues an additional appKey)
FactoryAgentSdk.create(url, appId, appSecret)AgentSdk.create(url, appId, appKey, appSecret)
AlgorithmJWT (HS256) sent via AGIBOT_AUTHORIZATIONHMAC-SHA256("GET\n{path}\n{timestamp}\n{nonce}"), delivered across five signed headers
Auth headers1 header: AGIBOT_AUTHORIZATION5 headers: X-App-Id / X-App-Key / X-Timestamp / X-Nonce / X-Signature
callbackTypes transportJWT payload fieldStandalone header X-Callback-Types (JSON array string)
Internal impactLinkskyClient depends on JwtUtilLinkskyClient drops JwtUtil, adds hmacSha256(); AgentSdk no longer exposes the appSecret getter

Migration checklist:

  1. Re-issue appId / appKey / appSecret on the open-platform application page — old credentials cannot be reused.
  2. Switch the WebSocket gateway URL to wss://open.agibot.com/api/V1/open-portal/app/wss/agent-sdk.
  3. Update every AgentSdk.create(url, appId, appSecret) call to AgentSdk.create(url, appId, appKey, appSecret).
  4. 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 on AGIBOT_AUTHORIZATION.
  5. Make sure nothing in your code still reads AgentSdk.getAppSecret() (getter removed).

Added

  • Three-in-one active greeting: PassiveCallback base class adds onGreetSignal(agentId, eventId, param, GreetResponse). Reply via either GreetResponse.onGreetVlmDelta/Done (VLM streaming text) or onGreetTtsDelta/Done (base64-encoded chunks of synthesised audio bytes)
  • New protocol events agentsdk.greet_response.tts.delta / agentsdk.greet_response.tts.done (alongside the existing agentsdk.greet_response.vlm.delta/done)
  • UID (face / voiceprint) exposure: base class adds onFaceInfo(agentId, eventId, param) and onVideoFrame(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: Greet2VlmCallback and Greet2VlmResponse are removed. Greeting signals are delivered through PassiveCallback.onGreetSignal, and both VLM and TTS replies share a single GreetResponse. Greeting no longer uses a dedicated AgentCallbackType; any registered passive callback can receive it.
  • State listening consolidated: StateListenCallback and AgentSdk.registerStateListen(...) are removed. State changes now arrive via PassiveCallback.onState(...) shared by every callback subclass.
  • Fixed GreetResponse.onGreetTtsDelta/Done mistakenly emitting VLM event types

Removed

  • Greet2VlmCallback / Greet2VlmResponse / StateListenCallback (merged into PassiveCallback)
  • AgentSdk.registerStateListen(...) (folded into the passive callback registration flow)
  • Deleted passive callback classes (and their corresponding Response classes): Audio2Asr / Audio2Audio / AudioVideo2Audio / Text2Tts
  • Public AgentSdk methods removed (underlying Callback/Request classes kept on disk):
    • Passive callback registration: registerPushListen
    • Active APIs: querySkill, queryState, registerPullStream / unregisterPullStream
  • AgentCallbackType enum drops AUDIO_2_ASR, AUDIO_2_AUDIO, AUDIO_VIDEO_2_AUDIO, TEXT_2_TTS, STATE_LISTEN, GEET_2_VLM, GEET_2_TTS (PUSH_LISTEN is 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)
  • AgentParam supports generic parameters (getObject/setObject, getList/setList)
  • Passive callbacks receive AgentParam param extension parameter
  • Protocol adds policy field to identify interaction mode
  • Response includes eventId field for caller-side session tracking
  • FlowStartCallback/FlowTaskCallback distinguish RequestAck vs ExecuteAck two-phase confirmation
  • Automatic timeout cleanup mechanism
  • AgentThreadPool thread pool management (per-agent binding, ordered message processing)
  • AgentDelayedPool delayed 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/agentsdk to wss://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() adds appKey parameter; auth method changed from JWT to HMAC-SHA256 gateway signing
    • Old signature: AgentSdk.create(url, appId, appSecret) — generated JWT token sent via AGIBOT_AUTHORIZATION header
    • 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}")
    • LinkskyClient removes JwtUtil dependency; built-in hmacSha256 method added
    • AgentSdk removes appSecret getter; auth credentials are now held internally by LinkskyClient
    • callbackTypes moved from JWT payload field to a standalone X-Callback-Types request header (JSON array string)
  • timeout parameter type upgraded from int to long for larger ranges
  • All onRequest callback signatures gain AgentParam param parameter
  • Optimized log output, reduced redundant logging

v1.1.0

Added

  • Multimodal passive callbacks: AsrVideo2Vlm, AsrVideo2Tts, AudioVideo2Vlm, AudioVideo2Tts, AudioVideo2Audio
  • AgentMeta wrapper 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: AgentSdk singleton factory pattern
  • WebSocket client: LinkskyClient (Netty-based, auto-reconnect, JWT auth)
  • Basic passive callbacks: Audio2Asr, Audio2Llm, Audio2Tts, Asr2Llm, Asr2Tts, Audio2Audio, Text2Tts
  • AgentParam type-safe parameter wrapper
  • IdGenerator unique ID generation
  • JwtUtil JWT signing utility
  • Example programs

Dependency Versions

DependencyVersion
Java17+
Netty4.1.116.Final
fastjson22.0.53
jjwt0.11.5
Lombok1.18.36
commons-lang33.14.0
SLF4J2.0.16
Logback1.5.13