WardrikProtocol

Wardrik's wire format: events as CloudEvents, operations as one OpenAPI document, and typed Elixir functions like Wardrik.Agent.ask/4.

Install

def deps do
  [
    {:wardrik_protocol, "~> 0.1.0-rc.2"}
  ]
end

Check an event

WardrikProtocol.schema/1 inlines every $ref, so any JSON Schema validator can use it. With JSV:

envelope = JSV.build!(WardrikProtocol.schema("cloudevent"))
data = JSV.build!(WardrikProtocol.schema("run.started"))

{:ok, _event} = JSV.validate(event, envelope)
{:ok, _data} = JSV.validate(event["data"], data)

Look up an operation

%{path: path, conversation: route, input: input} = WardrikProtocol.operation("agent.ask")
path  #=> "/v1/agents/{agent}/messages"
route #=> "/v1/agents/{agent}/conversations/{conversation}/messages"

{:ok, _input} = JSV.validate(%{"agent" => "agt_1", "content" => "Hi"}, JSV.build!(input))

Call an operation

Wardrik.Agent.ask(scope, "agt_1", "Hi", conversation: "C1")
Wardrik.Agent.approve(scope, agent: "agt_1", interrupt: "call_1", conversation: "C1")