defmodule IbmWatsonAssistant do
@moduledoc """
Module responsible for assistant messages
## Start
```elixir
# application.ex
children = [
{IbmWatsonAssistant, id: "", environment_id: "", url: "", version: "", api_key: "", }
]
```
"""
use GenServer
alias IbmWatsonAssistant.IamAuth
def start_link(config) do
IamAuth.start_link(config)
id = Keyword.fetch!(config, :id)
environment_id = Keyword.fetch!(config, :environment_id)
url = Keyword.fetch!(config, :url)
version = Keyword.fetch!(config, :version)
access_token = IamAuth.get_token()
middleware = [
{Tesla.Middleware.BaseUrl, "#{url}/v2/assistants/#{environment_id}"},
Tesla.Middleware.JSON,
{Tesla.Middleware.BearerAuth, token: access_token}
]
client_http = Tesla.client(middleware)
GenServer.start_link(
__MODULE__,
[
client_http: client_http,
version: version
],
name: id
)
end
@doc """
Module to send message for assistant
# Example
```elixir
iex> {text, context} = IbmWatsonAssistant.message_stateless id, "Hi"
{"Hi, how are you?",
%{
"global" => %{
"session_id" => "1fd59cdd-9658-44c3-b0ff-d2ab144ef64f",
"system" => %{
"session_start_time" => "2023-03-21T18:49:41.635Z",
"state" => "eyJza2lsbHMiOlt7InNraWxsX3JlZmVyZW5jZSI6InNlYXJjaCBza2lsbCIsImxhbmd1YWdlIjoieHgiLCJza2lsbF90eXBlIjoic2VhcmNoIiwid29ya2VyX2RlZmluaXRpb25faWQiOiIyOWE0NzZiMi00OTNkLTRlOTQtOGEwOC1mZjY4MWUxNGQ2MjkiLCJza2lsbF9zbmFwc2hvdF9pZCI6bnVsbCwic2tpbGxfc25hcHNob3RfbmFtZSI6bnVsbCwiZGlzYWJsZWQiOnRydWUsImNvbmZpZyI6eyJiYXNpY19hdXRoZW50aWNhdGlvbiI6bnVsbCwiYmVhcmVyX2F1dGhlbnRpY2F0aW9uIjpudWxsLCJwYWdpbmF0aW9uX2VuYWJsZWQiOmZhbHNlLCJ2ZXJzaW9uIjoiMjAxOC0xMi0wMyJ9fSx7InNraWxsX3R5cGUiOiJhY3Rpb24iLCJ3b3JrZXJfZGVmaW5pdGlvbl9pZCI6IjFkMjIxOWI4LWY4M2MtNDI5MS05NTk0LTI3ZjU0MzM0YzljYyIsInNraWxsX3JlZmVyZW5jZSI6ImFjdGlvbnMgc2tpbGwiLCJsYW5ndWFnZSI6InB0LWJyIiwiY29uZmlnIjp7IndvcmtzcGFjZV9pZCI6IjFkMjIxOWI4LWY4M2MtNDI5MS05NTk0LTI3ZjU0MzM0YzljYyIsInNvdXJjZV9hc3Npc3RhbnQiOiIzMDdkOTVkOS0xZGVmLTQyMGQtYjI0Ni0yZGQ2NGFmOGMzYmYiLCJza2lsbF9yZWZlcmVuY2VfaWQiOm51bGx9LCJkaXNhYmxlZCI6ZmFsc2UsInNraWxsX3NuYXBzaG90X2lkIjpudWxsLCJza2lsbF9zbmFwc2hvdF9uYW1lIjpudWxsfSx7InNraWxsX3R5cGUiOiJkaWFsb2ciLCJ3b3JrZXJfZGVmaW5pdGlvbl9pZCI6IjhlZGNlNGY3LTE5ZGYtNDVlOS04Yzk0LWJiYzY3MWEwMmYwNyIsInNraWxsX3JlZmVyZW5jZSI6Im1haW4gc2tpbGwiLCJsYW5ndWFnZSI6InB0LWJyIiwiY29uZmlnIjp7IndvcmtzcGFjZV9pZCI6IjhlZGNlNGY3LTE5ZGYtNDVlOS04Yzk0LWJiYzY3MWEwMmYwNyIsInNvdXJjZV9hc3Npc3RhbnQiOiIzMDdkOTVkOS0xZGVmLTQyMGQtYjI0Ni0yZGQ2NGFmOGMzYmYiLCJza2lsbF9yZWZlcmVuY2VfaWQiOm51bGx9LCJkaXNhYmxlZCI6dHJ1ZSwic2tpbGxfc25hcHNob3RfaWQiOm51bGwsInNraWxsX3NuYXBzaG90X25hbWUiOm51bGx9XSwiYWdlbnRfZGVmaW5pdGlvbl9pZCI6IjU1YzkzOWE0LTA0M2QtNDBiYy1iNDk3LTkxY2ZjZjE2MmFkZCIsInRlbmFudF9pZCI6Ijg1NWVjMmNlLTgxNzItNGUwZi04OWZiLThhOGZiZDMwODVhNSIsImRlZmF1bHRfaW5zdGFuY2UiOnRydWUsImRpc2FibGVfZmFsbGJhY2siOnRydWV9",
"turn_count" => 1,
"user_id" => "1fd59cdd-9658-44c3-b0ff-d2ab144ef64f"
}
},
"skills" => %{
"actions skill" => %{
"action_variables" => %{},
"skill_variables" => %{"action" => "show_menu"},
"system" => %{
"state" => "eyJzZXNzaW9uX3N0YXJ0X3RpbWUiOiIyMDIzLTAzLTIxVDE4OjQ5OjQxLjYzNVoiLCJzZXNzaW9uX2lkIjoiMWZkNTljZGQtOTY1OC00NGMzLWIwZmYtZDJhYjE0NGVmNjRmIiwic2tpbGxfcmVmZXJlbmNlIjoiYWN0aW9ucyBza2lsbCIsImFzc2lzdGFudF9pZCI6IjU1YzkzOWE0LTA0M2QtNDBiYy1iNDk3LTkxY2ZjZjE2MmFkZCIsImRpZ3Jlc3NlZF9mcm9tIjpudWxsLCJzaGFkb3dfdmFyaWFibGVzIjp7fSwibm9fYWN0aW9uX21hdGNoZXNfY291bnQiOjEsIl9ub2RlX291dHB1dF9tYXAiOnsiYW55dGhpbmdfZWxzZSBzdGVwXzAwMSI6eyIwIjpbMF19fSwiYWN0aW9uX3N0YWNrIjpbXSwic3RyaWtlX2NvdW50IjoxfQ=="
}
}
}
}}
```
"""
def message_stateless(id, text, context \\ %{}) do
GenServer.call(id, {:message_stateless, text, context})
end
@impl true
def init(state), do: {:ok, state}
@impl true
def handle_call({:message_stateless, text, context}, _from, state) do
with {:ok, client_http} <- Keyword.fetch(state, :client_http),
{:ok, version} <- Keyword.fetch(state, :version) do
case Tesla.post(client_http, "/message?version=#{version}", %{
input: %{text: text},
context: context
}) do
{:ok,
%Tesla.Env{
body: %{
"output" => %{
"generic" => generic
},
"context" => context
}
}} ->
{:reply,
{
generic
|> Enum.at(0)
|> Map.fetch!("text"),
context
}, state}
{:ok,
%Tesla.Env{
body: %{"error" => _} = body
}} ->
IO.inspect(body)
{
:reply,
{
"Desculpe, ocorreu um erro interno ao tentar acessar o recurso que você solicitou. Por favor, entre em contato com nossa equipe de suporte para que possamos ajudá-lo a resolver o problema. Obrigado pela sua compreensão!",
%{}
},
state
}
{:error, _} ->
{
:reply,
{
"Desculpe, ocorreu um erro interno ao tentar acessar o recurso que você solicitou. Por favor, entre em contato com nossa equipe de suporte para que possamos ajudá-lo a resolver o problema. Obrigado pela sua compreensão!",
%{}
},
state
}
end
end
end
end