ElGraph.A2A (ElGraph v0.3.0)

Copy Markdown View Source

A2A(Agent2Agent) 프로토콜 매핑 (SPEC §6, 부록 A2A 표).

조직 경계 밖 에이전트와의 상호운용을 위한 순수 변환 계층이다. ElGraph 실행 결과를 A2A Task 상태로, Skill 설정을 Agent Card로 변환한다. HTTP 서버(REST/JSON-RPC 바인딩, SSE)는 이 매핑 위의 얇은 계층으로 별도 패키지(el_graph_a2a)가 담당한다.

Task 상태 매핑 (M1 프리미티브 ↔ A2A): {:ok, _} → COMPLETED {:error, _} → FAILED {:interrupted, _} → INPUT_REQUIRED (HITL — resume이 입력 제공) 실행 중 → WORKING

Summary

Functions

에이전트 설정을 A2A Agent Card(JSON 직렬화 가능 맵)로 변환한다.

A2A Message(JSON)에서 ElGraph 시그널 입력을 추출한다 (text part들을 이어붙임).

체크포인터에 영속된 durable run을 A2A Task로 변환한다 (thread_id로 조회).

ElGraph 실행 결과를 A2A Task 상태(맵)로 변환한다.

Functions

agent_card(opts)

@spec agent_card(keyword()) :: map()

에이전트 설정을 A2A Agent Card(JSON 직렬화 가능 맵)로 변환한다.

:tools(Action 모듈)의 tool 스펙을 A2A skills로 노출한다.

message_to_input(map)

@spec message_to_input(map()) :: %{question: String.t()}

A2A Message(JSON)에서 ElGraph 시그널 입력을 추출한다 (text part들을 이어붙임).

iex> ElGraph.A2A.message_to_input(%{"parts" => [%{"text" => "엘릭서"}, %{"text" => " 검색"}]})
%{question: "엘릭서 검색"}

task_from_checkpoint(arg, thread_id)

@spec task_from_checkpoint(
  {module(), term()},
  String.t()
) :: map()

체크포인터에 영속된 durable run을 A2A Task로 변환한다 (thread_id로 조회).

최신 체크포인트에서 상태를 도출한다 — 어떤 체크포인터 백엔드(ETS/DETS/Mnesia/Postgres/Redis)든 무관하다(behaviour만 사용). A2A Task 생명주기 ↔ 체크포인트:

  • next == [] → COMPLETED (결과 = 최종 state)
  • 동적 인터럽트 대기 → INPUT_REQUIRED (payload 포함 — resume이 입력 제공)
  • 진행 중(미완·미인터럽트) → WORKING
  • 미존재 → SUBMITTED

to_task_state/1을 재사용해 결과/페이로드 표현을 일관되게 유지한다. 정적 interrupt_before는 체크포인트에 인터럽트 표식을 남기지 않으므로 WORKING으로 보인다(동적 인터럽트가 HITL의 기본 경로).

to_task_state(arg)

@spec to_task_state(tuple()) :: map()

ElGraph 실행 결과를 A2A Task 상태(맵)로 변환한다.

iex> ElGraph.A2A.to_task_state({:ok, %{answer: 42}}).state
"completed"

iex> ElGraph.A2A.to_task_state({:error, :boom}).state
"failed"