Skip to main content

src/erlang_adk_a2a_handler.erl

-module(erlang_adk_a2a_handler).
-behavior(cowboy_handler).

-export([init/2]).

init(Req0, State) ->
    case cowboy_req:method(Req0) of
        <<"POST">> ->
            {ok, Body, Req1} = cowboy_req:read_body(Req0),
            try jsx:decode(Body, [return_maps]) of
                #{<<"agent_name">> := AgentName, <<"prompt">> := Prompt} ->
                    AgentAtom = list_to_atom(binary_to_list(AgentName)),
                    case whereis(AgentAtom) of
                        undefined ->
                            Req2 = cowboy_req:reply(404, #{}, <<"Agent not found">>, Req1),
                            {ok, Req2, State};
                        Pid ->
                            case erlang_adk:prompt(Pid, binary_to_list(Prompt)) of
                                {ok, Response} ->
                                    JsonResp = jsx:encode(#{<<"response">> => list_to_binary(Response)}),
                                    Req2 = cowboy_req:reply(200, #{<<"content-type">> => <<"application/json">>}, JsonResp, Req1),
                                    {ok, Req2, State};
                                {error, Reason} ->
                                    Req2 = cowboy_req:reply(500, #{}, list_to_binary(io_lib:format("~p", [Reason])), Req1),
                                    {ok, Req2, State}
                            end
                    end
            catch
                _:_ ->
                    Req2 = cowboy_req:reply(400, #{}, <<"Invalid JSON payload">>, Req1),
                    {ok, Req2, State}
            end;
        _ ->
            Req1 = cowboy_req:reply(405, #{}, <<"Method Not Allowed">>, Req0),
            {ok, Req1, State}
    end.