Skip to content

feat: add a2a-ord-demo deployment (spaceship-app + super-agent)#2

Open
zongqichen wants to merge 1 commit into
mainfrom
feat/a2a-ord-demo-deploy
Open

feat: add a2a-ord-demo deployment (spaceship-app + super-agent)#2
zongqichen wants to merge 1 commit into
mainfrom
feat/a2a-ord-demo-deploy

Conversation

@zongqichen
Copy link
Copy Markdown
Owner

Summary

Add deployment manifests for the a2a-ord-demo application — two A2A agents that demonstrate ORD-based agent discovery and A2A communication.

Services

Service Description Image
spaceship-app Hosts two A2A crew agents (Solar System Explorer, Repair Technician) discoverable via ORD a2a-spaceship-app:local
super-agent Spaceship Commander — discovers crew agents via ORD and delegates tasks via A2A a2a-super-agent:local

How it works

  1. spaceship-app exposes an ORD document at /.well-known/open-resource-discovery describing two A2A agents
  2. super-agent reads spaceship-app's ORD document (via ORD_SOURCE_URL) to discover available crew agents
  3. When a user sends a message to super-agent, it selects the appropriate crew agent and delegates via A2A

⚠️ Images are local-only (not yet published)

The manifests currently use locally built images with imagePullPolicy: Never. To deploy:

# 1. Clone and build images from source
git clone https://github.com/open-resource-discovery/a2a-ord-demo.git demo/external/a2a-ord-demo
cd demo/external/a2a-ord-demo
docker build -t a2a-spaceship-app:local -f spaceship-app/Dockerfile .
docker build -t a2a-super-agent:local -f super-agent/Dockerfile .

# 2. Load into the target kind cluster
kind load docker-image a2a-spaceship-app:local --name <cluster-name>
kind load docker-image a2a-super-agent:local --name <cluster-name>

# 3. Deploy
kubectl apply -k demo/manifests/examples/kustomize/a2a-ord-demo/

Once the images are published to ghcr.io, update deployment.yaml to use the registry images and remove imagePullPolicy: Never.

Accessing via port-forward

kubectl port-forward svc/spaceship-app 4001:3000 &
kubectl port-forward svc/super-agent 4002:3000 &
Endpoint URL
spaceship-app health http://localhost:4001/health
Solar System Explorer (A2A) http://localhost:4001/solar
Repair Technician (A2A) http://localhost:4001/repair
super-agent (A2A) http://localhost:4002
ORD discovery http://localhost:4001/.well-known/open-resource-discovery

Note on SERVER_URL

SERVER_URL controls the base URL in A2A agent cards and ORD documents. It defaults to in-cluster Service DNS (http://spaceship-app:3000) so that super-agent can reach spaceship-app's A2A endpoints.

When testing agent cards from a browser (e.g. A2A editor) via port-forward, the agent card URLs will point to the in-cluster address which the browser cannot reach. Use the direct endpoints listed above instead, or temporarily override:

kubectl set env deployment/spaceship-app SERVER_URL=http://localhost:4001

⚠️ This will break super-agent → spaceship-app communication (super-agent cannot reach localhost:4001 from inside the cluster). Revert after testing:

kubectl set env deployment/spaceship-app SERVER_URL=http://spaceship-app:3000

Add Kubernetes manifests for deploying the a2a-ord-demo application
(https://github.com/open-resource-discovery/a2a-ord-demo) consisting
of two services:

- spaceship-app: hosts two A2A crew agents (Solar System Explorer,
  Repair Technician) discoverable via ORD
- super-agent: the Spaceship Commander that discovers crew agents
  via ORD and delegates tasks to them via A2A
@zongqichen
Copy link
Copy Markdown
Owner Author

POST http://localhost:4002
Headers (1)
Body

{
  "jsonrpc": "2.0",
  "id": "d0e6d171-5125-41da-a4c3-8fc05d8f7a7a",
  "method": "message/send",
  "params": {
    "message": {
      "role": "user",
      "parts": [
        {
          "text": "The engines are overheating!"
        }
      ],
      "messageId": "f555ac8f-0f0d-42a6-ae09-f74013ca1479",
      "contextId": "aa7274ec-5921-49f0-9ee1-f2e18a073117"
    }
  }
}
Response
200 OK
Headers (2)
Body

{
  "jsonrpc": "2.0",
  "id": "d0e6d171-5125-41da-a4c3-8fc05d8f7a7a",
  "result": {
    "kind": "task",
    "id": "693f25fc-5f6e-4f82-af1c-dec4c8e387f9",
    "contextId": "aa7274ec-5921-49f0-9ee1-f2e18a073117",
    "status": {
      "state": "completed",
      "timestamp": "2026-03-20T18:28:56.494Z",
      "message": {
        "kind": "message",
        "messageId": "46a607bd-3e46-4fb3-a260-9af07e3fb3dd",
        "role": "agent",
        "parts": [
          {
            "kind": "text",
            "text": "**Spaceship Commander**: I found **Repair Technician** for this task.\n\n---\n\n**Engine Repair Report**\n\n**System**: FTL Drive\n**Status**: Warp field asymmetry detected — port nacelle generating 3% more field distortion than starboard.\n**Action Taken**: Recalibrated warp coil phase alignment. Degaussed nacelle cores. Updated field geometry firmware.\n**Result**: Warp field symmetric within 0.1%. Safe for FTL travel up to Warp 7.\n**Note**: Full nacelle inspection recommended before any Warp 9+ attempts."
          }
        ],
        "contextId": "aa7274ec-5921-49f0-9ee1-f2e18a073117",
        "taskId": "693f25fc-5f6e-4f82-af1c-dec4c8e387f9"
      }
    },
    "history": [
      {
        "role": "user",
        "parts": [
          {
            "text": "The engines are overheating!"
          }
        ],
        "messageId": "f555ac8f-0f0d-42a6-ae09-f74013ca1479",
        "contextId": "aa7274ec-5921-49f0-9ee1-f2e18a073117",
        "taskId": "693f25fc-5f6e-4f82-af1c-dec4c8e387f9"
      },
      {
        "kind": "message",
        "messageId": "46a607bd-3e46-4fb3-a260-9af07e3fb3dd",
        "role": "agent",
        "parts": [
          {
            "kind": "text",
            "text": "**Spaceship Commander**: I found **Repair Technician** for this task.\n\n---\n\n**Engine Repair Report**\n\n**System**: FTL Drive\n**Status**: Warp field asymmetry detected — port nacelle generating 3% more field distortion than starboard.\n**Action Taken**: Recalibrated warp coil phase alignment. Degaussed nacelle cores. Updated field geometry firmware.\n**Result**: Warp field symmetric within 0.1%. Safe for FTL travel up to Warp 7.\n**Note**: Full nacelle inspection recommended before any Warp 9+ attempts."
          }
        ],
        "contextId": "aa7274ec-5921-49f0-9ee1-f2e18a073117",
        "taskId": "693f25fc-5f6e-4f82-af1c-dec4c8e387f9"
      }
    ],
    "artifacts": [
      {
        "artifactId": "693f25fc-5f6e-4f82-af1c-dec4c8e387f9-response",
        "name": "response",
        "parts": [
          {
            "kind": "text",
            "text": "**Spaceship"
          },
          {
            "kind": "text",
            "text": " Commander**:"
          },
          {
            "kind": "text",
            "text": " I"
          },
          {
            "kind": "text",
            "text": " found"
          },
          {
            "kind": "text",
            "text": " **Repair"
          },
          {
            "kind": "text",
            "text": " Technician**"
          },
          {
            "kind": "text",
            "text": " for"
          },
          {
            "kind": "text",
            "text": " this"
          },
          {
            "kind": "text",
            "text": " task.\n\n---\n\n**Engine"
          },
          {
            "kind": "text",
            "text": " Repair"
          },
          {
            "kind": "text",
            "text": " Report**\n\n**System**:"
          },
          {
            "kind": "text",
            "text": " FTL"
          },
          {
            "kind": "text",
            "text": " Drive\n**Status**:"
          },
          {
            "kind": "text",
            "text": " Warp"
          },
          {
            "kind": "text",
            "text": " field"
          },
          {
            "kind": "text",
            "text": " asymmetry"
          },
          {
            "kind": "text",
            "text": " detected"
          },
          {
            "kind": "text",
            "text": " —"
          },
          {
            "kind": "text",
            "text": " port"
          },
          {
            "kind": "text",
            "text": " nacelle"
          },
          {
            "kind": "text",
            "text": " generating"
          },
          {
            "kind": "text",
            "text": " 3%"
          },
          {
            "kind": "text",
            "text": " more"
          },
          {
            "kind": "text",
            "text": " field"
          },
          {
            "kind": "text",
            "text": " distortion"
          },
          {
            "kind": "text",
            "text": " than"
          },
          {
            "kind": "text",
            "text": " starboard.\n**Action"
          },
          {
            "kind": "text",
            "text": " Taken**:"
          },
          {
            "kind": "text",
            "text": " Recalibrated"
          },
          {
            "kind": "text",
            "text": " warp"
          },
          {
            "kind": "text",
            "text": " coil"
          },
          {
            "kind": "text",
            "text": " phase"
          },
          {
            "kind": "text",
            "text": " alignment."
          },
          {
            "kind": "text",
            "text": " Degaussed"
          },
          {
            "kind": "text",
            "text": " nacelle"
          },
          {
            "kind": "text",
            "text": " cores."
          },
          {
            "kind": "text",
            "text": " Updated"
          },
          {
            "kind": "text",
            "text": " field"
          },
          {
            "kind": "text",
            "text": " geometry"
          },
          {
            "kind": "text",
            "text": " firmware.\n**Result**:"
          },
          {
            "kind": "text",
            "text": " Warp"
          },
          {
            "kind": "text",
            "text": " field"
          },
          {
            "kind": "text",
            "text": " symmetric"
          },
          {
            "kind": "text",
            "text": " within"
          },
          {
            "kind": "text",
            "text": " 0.1%."
          },
          {
            "kind": "text",
            "text": " Safe"
          },
          {
            "kind": "text",
            "text": " for"
          },
          {
            "kind": "text",
            "text": " FTL"
          },
          {
            "kind": "text",
            "text": " travel"
          },
          {
            "kind": "text",
            "text": " up"
          },
          {
            "kind": "text",
            "text": " to"
          },
          {
            "kind": "text",
            "text": " Warp"
          },
          {
            "kind": "text",
            "text": " 7.\n**Note**:"
          },
          {
            "kind": "text",
            "text": " Full"
          },
          {
            "kind": "text",
            "text": " nacelle"
          },
          {
            "kind": "text",
            "text": " inspection"
          },
          {
            "kind": "text",
            "text": " recommended"
          },
          {
            "kind": "text",
            "text": " before"
          },
          {
            "kind": "text",
            "text": " any"
          },
          {
            "kind": "text",
            "text": " Warp"
          },
          {
            "kind": "text",
            "text": " 9+"
          },
          {
            "kind": "text",
            "text": " attempts."
          }
        ]
      }
    ]
  }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant