Introduction

The core philosophy of DeepSeek Harness (DSH) is that everything is a plugin. When building multi-agent systems, integration with the Agent2Agent (A2A) protocol is a common requirement. dsh-a2a is a standalone open-source plugin that transforms a DSH Profile into a multi-faceted Agent-to-Agent entity: it can expose multiple inbound A2A servers simultaneously while also establishing multiple outbound connections. The lifecycle of all server instances (create, start, stop, edit) is managed through the GUI, without manual configuration file editing.

Plugin Positioning

  • Name: dsh-a2a (NPM package: @hanphone/dsh-a2a)
  • Maintainer: HanphoneJan
  • Core Value: Turns DSH into a gateway supporting the bidirectional A2A v1.0.1 protocol, with multi-preset, multi-skill, and persistent task storage.
  • License: MIT

Core Features

The plugin implements the full A2A v1.0.1 protocol surface and builds complete lifecycle management on top of it:

  1. A2A v1.0.1 Protocol Support

    • Implements SendMessage, SendStreamingMessage, GetTask, ListTasks, CancelTask, GetExtendedAgentCard, and SubscribeToTask.
    • Uses JSON-RPC 2.0 transport and supports SSE streaming.
    • Fully leverages the official TASK_STATE_* and ROLE_* enums.
  2. Multiple Inbound Servers

    • Supports creating independent inbound servers for each Persona.
    • Each inbound instance is bound to a specific Agent preset (e.g., ptc, standard).
    • Automatic skill derivation: The skills in the AgentCard are taken directly from the skill directory of the bound preset, without manually defining typed skills.
  3. Multiple Outbound Connections

    • Each connection can be configured independently with a remote URL, auth environment variables, timeout, and bound preset.
    • Remote skills are mapped to model tools (e.g., a2a__<name>__<skill>).
  4. Persistence and Execution

    • Task storage: Tasks are stored in the a2a domain (default JSON backend, optional SQLite).
    • Executors: Provides two execution modes: session (based on contextId) and subagent (delegates invocation to subagents).
    • Inbound governance: Each inbound task goes through an a2a/inbound-task cascade flow, supporting intervention by policy plugins.
  5. Full Lifecycle Management via GUI

    • Inbound management: Create servers (select a preset, optionally set Auth Env; Bearer Token is managed through the Harness credentials service), and view the real-time AgentCard.
    • Outbound management: Import remote AgentCards, preview skills, and establish connections.
    • Monitoring dashboard: View inbound peer status and context session status (supports canceling active tasks or closing sessions).

Installation and Activation

The installation process depends on the npm registry.

dsh plugin --profile web add @hanphone/dsh-a2a

After installation, restart the GUI to scan and load the new plugin. The restart command varies by profile (e.g., pnpm dsh web).

Typical Usage

After enabling the plugin, open the DeepSeek Harness browser interface at Settings → A2A Connections.

  1. Create an Inbound Server
    Create a new instance in the “Inbound Servers” tab. Select an existing Agent preset; its skill declarations will be automatically populated into the AgentCard. Optionally configure authentication environment variables. After creation, the instance is immediately enabled and listens on the configured port.

  2. Send an A2A Task
    Assume the inbound server ID is my-agent, the listening address is http://127.0.0.1:3080, and the chat skill is used to send a message:

    curl -X POST http://127.0.0.1:3080/a2a/my-agent \
      -H "content-type: application/json" \
      -d '{
        "jsonrpc": "2.0",
        "id": "1",
        "method": "SendMessage",
        "params": {
          "message": {
            "role": "user",
            "parts": [{"text": "hello"}],
            "metadata": {"skill": "chat"}
          }
        }
      }'

Configuration and Considerations

  • Configuration method: The plugin only provides host-level default configuration (e.g., baseUrl, subagentProvider, defaultTimeoutMs), which is set through the profile’s cordis.patch.yml. Instance-specific configurations (e.g., name, preset, token) are created through the GUI and persisted to the a2a domain; instances cannot be configured via patch files.
  • Dependency services: Running this plugin requires the host to mount the following services: webServer, storage stack, tools registry, agent loop, presets, and subagent (if using the subagent executor).
  • Authentication management: Bearer Tokens are not stored directly in the plugin data domain; they are written to the Harness credentials service (which manages .env or credential storage) and resolved at runtime through that service.
  • Storage backend: Tasks and instance data are stored in JSON by default and can be switched to SQLite through configuration.

Conclusion

dsh-a2a provides a complete closed loop from protocol implementation to operational management. It addresses pain points in building multi-agent gateways within the DSH ecosystem, making it ideal for scenarios that need to act as an A2A server to receive requests while also acting as a client to call other services. For more implementation details and architecture design, refer to the project documentation.

  • GitHub: https://github.com/HanphoneJan/dsh-a2a
  • Catalog: https://www.skillhub.cn/plugins/HanphoneJan/dsh-a2a