# A2A JSON-RPC API Contract ## 계약 메타 - id: `iop.a2a-json-rpc-api` - boundary: `outer` - status: active-mvp - 원본 경로: - `apps/edge/internal/input/a2a/types.go` - `apps/edge/internal/input/a2a/server.go` - `packages/go/config/config.go` - `configs/edge.yaml` - human docs: `apps/edge/README.md` ## 읽는 조건 - Edge A2A HTTP 입력 표면, JSON-RPC, `message/send`, `tasks/get`, `tasks/cancel`을 다룰 때 - 외부 agent 또는 다른 프로젝트가 Edge 실행 그룹에 작업을 위임하는 요청/응답을 바꿀 때 - A2A task 상태, artifact, blocking/background 동작, bearer auth를 검토할 때 ## 범위 이 계약은 Edge의 A2A JSON-RPC HTTP 입력 표면이다. 외부 caller는 JSON-RPC 2.0 envelope로 작업을 보내고, Edge는 내부 `adapter + target` 실행으로 변환한다. OpenAI-compatible API와 달리 A2A는 task 상태 공유와 agent-to-agent 작업 위임에 맞춘 표면이다. 내부 Edge-Node protobuf transport를 대체하지 않는다. ## 최소 요청 형태 - endpoint: `POST `; 기본 path는 `/a2a` - agent card: `GET /.well-known/agent.json` - auth: `a2a.bearer_token`이 비어 있지 않으면 `Authorization: Bearer ` 필요 - supported methods: `message/send`, `tasks/get`, `tasks/cancel` `message/send`의 최소 params는 `message.role`과 text `parts[]`다. `configuration.blocking`은 생략 시 `true`로 동작한다. ## 필드 의미 - `jsonrpc`: 반드시 `"2.0"`이어야 한다. - `method`: 지원 method 중 하나다. - `params.message.parts[].text`: 내부 실행 prompt로 추출되는 text다. - `configuration.blocking`: `true` 또는 생략이면 완료까지 대기하고, `false`이면 working task를 즉시 반환한다. - `Task.id`: Edge-local task id다. - `Task.status.state`: 현재 MVP 값은 `working`, `completed`, `failed`, `canceled`다. - `Artifact.parts`: 완료 결과 text를 담는 최소 artifact 표현이다. ## 금지 사항 - A2A 요청에 특정 외부 제품 전용 wrapper field를 추가하지 않는다. - A2A를 OpenAI-compatible chat/completions 대체 표면으로 만들지 않는다. - Edge 내부 실행을 `model` 중심으로 표현하지 않는다. 입력 표면에서만 A2A Task/JSON-RPC 표현을 유지하고 내부는 `adapter + target`으로 변환한다. - Node address, token, transport client 내부 상태를 A2A 응답에 노출하지 않는다. ## 변경 시 확인할 코드/테스트 - `apps/edge/internal/input/a2a/types.go` - `apps/edge/internal/input/a2a/server.go` - `apps/edge/internal/input/a2a/server_test.go` - `apps/edge/internal/input/a2a/task_store_test.go` - `packages/go/config/config.go` - `apps/edge/README.md`