cover/Elixir.Tools.Sys.Ask.html

1 defmodule Tools.Sys.Ask.Schema do
2 def get(name, _state) do
3 %{name: name, description: description(), parameters: params()}
4 end
5
6 defp description do
7 "Ask question to another agent and get response"
8 end
9
10 defp params do
11 %{type: "object", properties: properties(), required: required()}
12 end
13
14 defp required do
15 ["recipient", "question"]
16 end
17
18 defp properties do
19 %{
20 recipient: %{type: "string", description: "Agent name to ask question to"},
21 question: %{type: "string", description: "Question to ask"}
22 }
23 end
24 end
25
26 defmodule Tools.Sys.Ask do
27 import Agent.Harness, only: [dispatch: 3]
28 import Log, only: [write: 1, agent: 5, trace: 1]
29 import String, only: [trim: 1]
30
31 @icon "🤔"
32 @reply "✨"
33
34 47 defdelegate spec(name, state), to: Tools.Sys.Ask.Schema, as: :get
35
36
:-(
def icon, do: @icon
37
38 17 def exec(_, %{"recipient" => r, "question" => q}, %{name: s, skip_logs: l} = state) do
39 17 query(s, r, q, l)
40 17 result = dispatch(r, q, :ask)
41 17 reply(r, s, result, l)
42 {result, state}
43 end
44
45
:-(
def exec(_, _, state) do
46 {"ask needs recipient and question", state}
47 end
48
49 def query(sender, recipient, question) do
50
:-(
query(sender, recipient, question, false)
51 end
52
53 def query(sender, recipient, question, silent) do
54 17 record(sender, recipient, question, silent)
55 end
56
57
:-(
defp record(_sender, _recipient, _question, true) do
58 :ok
59 end
60
61
:-(
defp record("el", _recipient, _question, _) do
62 :ok
63 end
64
65 defp record(sender, recipient, question, _) do
66 17 msg = "#{@icon} #{sender} → #{recipient} | #{question}\n"
67 17 write(msg)
68 17 trace(msg)
69 17 agent(@icon, "#{sender} → #{recipient}", " | ", question, %{name: sender})
70 end
71
72 def answer(agent, text) when is_binary(text) do
73 101 emit(agent, text)
74 101 log(agent, text)
75 end
76
77
:-(
def answer(_agent, _text), do: :ok
78
79 defp emit(agent, text) do
80 101 msg = "#{@reply} #{agent} | #{trim(text)}\n"
81 101 write(msg)
82 101 trace(msg)
83 end
84
85 defp log(agent, text) do
86 101 agent(@reply, agent, " | ", text, %{name: agent})
87 end
88
89 defp reply(replier, asker, text, silent) when is_binary(text) do
90 17 log(replier, asker, text, silent)
91 end
92
93
:-(
defp reply(_replier, _asker, _text, _silent), do: :ok
94
95
:-(
defp log(_replier, _asker, _text, true) do
96 :ok
97 end
98
99 defp log(replier, asker, text, _) do
100 17 msg = "#{@reply} #{replier} → #{asker} | #{trim(text)}\n"
101 17 write(msg)
102 17 trace(msg)
103 17 agent(@reply, "#{replier} → #{asker}", " | ", text, %{name: asker})
104 end
105 end
Line Hits Source