From 48898603ad48d3012e7b78e0daf6f5c6bc68757e Mon Sep 17 00:00:00 2001 From: Alisson Machado Date: Tue, 4 Nov 2025 19:20:09 -0300 Subject: [PATCH] feat: emergencial commit --- config/runtime.exs | 2 + lib/gpt_talkerbot/application.ex | 3 +- lib/gpt_talkerbot/runtime_envs/genserver.ex | 62 ++++++++++++++ .../telegram/handlers/message_handler.ex | 56 +++++++++---- lib/gpt_talkerbot/telegram/schemas/message.ex | 4 +- .../controllers/bot_controller.ex | 84 ++++++++++++++++++- lib/gpt_talkerbot_web/services/grok.ex | 53 ++++++++++++ mix.lock | 49 +++++++++++ scripts/start_application.sh | 4 + 9 files changed, 300 insertions(+), 17 deletions(-) create mode 100644 lib/gpt_talkerbot/runtime_envs/genserver.ex create mode 100644 lib/gpt_talkerbot_web/services/grok.ex create mode 100644 mix.lock diff --git a/config/runtime.exs b/config/runtime.exs index cbea98e..bd4f317 100644 --- a/config/runtime.exs +++ b/config/runtime.exs @@ -91,6 +91,8 @@ if config_env() == :prod do config :gpt_talkerbot, :allowed_users, parse_env_list.("ALLOWED_USERS") config :gpt_talkerbot, :allowed_groups, parse_env_list.("ALLOWED_GROUPS") config :gpt_talkerbot, :openai_api_key, System.get_env("OPENAI_API_KEY", "") + config :gpt_talkerbot, :grok_api_key, System.get_env("GROK_API_KEY", "") + config :gpt_talkerbot, :owner_id, System.get_env("OWNER_ID", "") config :gpt_talkerbot, :default_prompt, System.get_env("DEFAULT_PROMPT", "") config :gpt_talkerbot, :telegram_api_key, System.get_env("TELEGRAM_API_KEY", "") config :gpt_talkerbot, :server_host, System.get_env("SERVER_HOST", "") diff --git a/lib/gpt_talkerbot/application.ex b/lib/gpt_talkerbot/application.ex index a339d69..86947b0 100644 --- a/lib/gpt_talkerbot/application.ex +++ b/lib/gpt_talkerbot/application.ex @@ -22,7 +22,8 @@ defmodule GptTalkerbot.Application do # {GptTalkerbot.Worker, arg} GptTalkerbot.RMQPublisher, - GptTalkerbot.BotProcessor + GptTalkerbot.BotProcessor, + GptTalkerbot.RuntimeEnvs.GenServer ] # See https://hexdocs.pm/elixir/Supervisor.html diff --git a/lib/gpt_talkerbot/runtime_envs/genserver.ex b/lib/gpt_talkerbot/runtime_envs/genserver.ex new file mode 100644 index 0000000..6bca91b --- /dev/null +++ b/lib/gpt_talkerbot/runtime_envs/genserver.ex @@ -0,0 +1,62 @@ +defmodule GptTalkerbot.RuntimeEnvs.GenServer do + @moduledoc """ + GenServer runtime environment configuration + """ + + use GenServer + + def start_link(opts) do + GenServer.start_link(__MODULE__, opts, name: __MODULE__) + end + + # Server Callbacks + + @impl true + def init(_opts) do + openai_api_key = Application.get_env(:gpt_talkerbot, :openai_api_key, "") + + grok_api_key = Application.get_env(:gpt_talkerbot, :grok_api_key, "") + + state = %{ + openai_api_key: openai_api_key, + grok_api_key: grok_api_key, + using: :openai + } + + {:ok, state} + end + + def get_current_service do + GenServer.call(__MODULE__, :get_current_service) + end + + def set_current_service(service) when service in [:openai, :grok] do + GenServer.cast(__MODULE__, {:set_current_service, service}) + end + + def get_openai_api_key do + GenServer.call(__MODULE__, :get_openai_api_key) + end + + def get_grok_api_key do + GenServer.call(__MODULE__, :get_grok_api_key) + end + + @impl true + def handle_call(:get_current_service, _from, state) do + {:reply, state.using, state} + end + + def handle_call(:get_openai_api_key, _from, state) do + {:reply, state.openai_api_key, state} + end + + def handle_call(:get_grok_api_key, _from, state) do + {:reply, state.grok_api_key, state} + end + + @impl true + def handle_cast({:set_current_service, service}, state) do + {:noreply, %{state | using: service}} + end +end diff --git a/lib/gpt_talkerbot/telegram/handlers/message_handler.ex b/lib/gpt_talkerbot/telegram/handlers/message_handler.ex index 34a294d..35f3ecd 100644 --- a/lib/gpt_talkerbot/telegram/handlers/message_handler.ex +++ b/lib/gpt_talkerbot/telegram/handlers/message_handler.ex @@ -4,11 +4,11 @@ defmodule GptTalkerbot.Telegram.Handlers.MessageHandler do """ alias GptTalkerbot.Telegram.Message - alias GptTalkerbotWeb.Services.{Telegram, OpenAI} + alias GptTalkerbotWeb.Services.{Grok, OpenAI, Telegram} alias GptTalkerbot.Access + alias GptTalkerbot.RuntimeEnvs.GenServer, as: RuntimeEnvs @behaviour GptTalkerbot.Telegram.Handlers - def api_key, do: Application.get_env(:gpt_talkerbot, :openai_api_key, "") @impl true def handle( @@ -20,7 +20,8 @@ defmodule GptTalkerbot.Telegram.Handlers.MessageHandler do ) do with user <- Access.get_user_by_telegram_id!(user_id), {:ok, api_key} <- Access.get_key_for_user(user) do - process_gpt_message(api_key, user_id, []) # TODO: NEED TO BE REFACTORED + # TODO: NEED TO BE REFACTORED + process_gpt_message(api_key, user_id, []) |> case do {:ok, response} -> handle_gpt_response(response) @@ -45,7 +46,8 @@ defmodule GptTalkerbot.Telegram.Handlers.MessageHandler do ) when group in ["group_temp", "supergroup_temp"] do with {:ok, api_key} <- Access.get_key_for_group(chat_id) do - process_gpt_message(api_key, user_id, []) # TODO: NEED TO BE REFACTORED + # TODO: NEED TO BE REFACTORED + process_gpt_message(api_key, user_id, []) |> case do {:ok, response} -> handle_gpt_response(response) @@ -63,12 +65,21 @@ defmodule GptTalkerbot.Telegram.Handlers.MessageHandler do def handle( %Message{ text: text, - from: %{telegram_id: user_id}, - reply_to_message: %{text: reply_text, from: %{telegram_id: reply_user_id}} + from: %{telegram_id: user_id, first_name: name}, + reply_to_message: + %{ + from: %{telegram_id: reply_user_id, first_name: reply_name} + } = reply_to_message } = message ) do - with messages <- build_messages([%{user: reply_user_id, text: reply_text}, %{user: user_id, text: text}]), - {:ok, response} <- process_gpt_message(api_key(), user_id, messages) do + reply_text = reply_to_message.caption || reply_to_message.text + + with messages <- + build_messages([ + %{user: "user_name: #{reply_name}, user_id: #{reply_user_id}", text: reply_text}, + %{user: "user_name: #{name}, user_id: #{user_id}", text: text} + ]), + {:ok, response} <- process_ai_message(user_id, messages) do handle_gpt_response(response) |> send_message(message) else @@ -77,15 +88,15 @@ defmodule GptTalkerbot.Telegram.Handlers.MessageHandler do end end - def handle( %Message{ text: text, - from: %{telegram_id: user_id} + from: %{telegram_id: user_id, first_name: name} } = message ) do - with messages <- build_messages(%{user: user_id, text: text}), - {:ok, response} <- process_gpt_message(api_key(), user_id, messages) do + with messages <- + build_messages(%{user: "user_name: #{name}, user_id: #{user_id}", text: text}), + {:ok, response} <- process_ai_message(user_id, messages) do handle_gpt_response(response) |> send_message(message) else @@ -94,12 +105,30 @@ defmodule GptTalkerbot.Telegram.Handlers.MessageHandler do end end + def process_ai_message(user_id, messages) do + case IO.inspect(RuntimeEnvs.get_current_service(), label: "the ai service is") do + :openai -> + openai_api_key = RuntimeEnvs.get_openai_api_key() + process_gpt_message(openai_api_key, user_id, messages) + + :grok -> + grok_api_key = RuntimeEnvs.get_grok_api_key() + process_grok_message(grok_api_key, user_id, messages) + end + end + defp process_gpt_message(api_key, user_id, messages) do api_key |> OpenAI.new() |> OpenAI.gpt_completion(user_id, messages) end + defp process_grok_message(api_key, user_id, messages) do + api_key + |> Grok.new() + |> Grok.grok_completion(user_id, messages) + end + defp handle_gpt_response(response) do response |> Map.get("choices") @@ -115,7 +144,6 @@ defmodule GptTalkerbot.Telegram.Handlers.MessageHandler do Telegram.send_message(%{chat_id: chat_id, text: text, reply_to_message_id: message_id}) end - def build_messages(%{user: user, text: text}) do [build_message(text, user)] end @@ -126,6 +154,6 @@ defmodule GptTalkerbot.Telegram.Handlers.MessageHandler do end defp build_message(text, user) do - %{role: "user", content: "user #{user}: #{text}"} + %{role: "user", content: "#{user}, message: #{text}"} end end diff --git a/lib/gpt_talkerbot/telegram/schemas/message.ex b/lib/gpt_talkerbot/telegram/schemas/message.ex index 6000bfb..f65b66b 100755 --- a/lib/gpt_talkerbot/telegram/schemas/message.ex +++ b/lib/gpt_talkerbot/telegram/schemas/message.ex @@ -27,6 +27,7 @@ defmodule GptTalkerbot.Telegram.Message do field :chat_type, :string field :chat_first_name, :string field :message_id, :string + field :caption, :string field :text, :string embeds_one :from, From end @@ -38,6 +39,7 @@ defmodule GptTalkerbot.Telegram.Message do field :chat_id, :string field :chat_type, :string field :text, :string + field :caption, :string embeds_one :from, From embeds_one :reply_to_message, ReplyToMessage @@ -54,7 +56,7 @@ defmodule GptTalkerbot.Telegram.Message do defp reply_to_message_changeset(schema, params) do schema - |> Changeset.cast(params, [:text, :chat_id, :chat_type, :chat_first_name]) + |> Changeset.cast(params, [:text, :chat_id, :chat_type, :chat_first_name, :caption]) |> put_fields(params) |> Changeset.cast_embed(:from, with: &from_changeset/2) end diff --git a/lib/gpt_talkerbot_web/controllers/bot_controller.ex b/lib/gpt_talkerbot_web/controllers/bot_controller.ex index aef620b..6a233c8 100644 --- a/lib/gpt_talkerbot_web/controllers/bot_controller.ex +++ b/lib/gpt_talkerbot_web/controllers/bot_controller.ex @@ -8,6 +8,9 @@ defmodule GptTalkerbotWeb.BotController do alias GptTalkerbot.Commands alias BotController.Administrator alias GptTalkerbot.Commands + alias GptTalkerbot.RuntimeEnvs.GenServer, as: RuntimeEnvs + + defp owner_id, do: Application.get_env(:gpt_talkerbot, :owner_id, "") @private_commands Administrator.private_commands() @group_commands Administrator.group_commands() @@ -15,6 +18,72 @@ defmodule GptTalkerbotWeb.BotController do defp allowed_users, do: Application.get_env(:gpt_talkerbot, :allowed_users, []) defp allowed_groups, do: Application.get_env(:gpt_talkerbot, :allowed_groups, []) + def receive( + conn, + %{ + "message" => + %{ + "chat" => %{"id" => chat_id}, + "text" => "/setproduction", + "from" => %{"id" => user_id} + } = _message + } = _params + ) do + if is_admin_allowed?(user_id, chat_id) do + GptTalkerbotWeb.Services.Telegram.set_production_mode() + send_resp(conn, 204, "") + else + send_resp(conn, 204, "") + end + rescue + _ -> + send_resp(conn, 204, "") + end + + def receive( + conn, + %{ + "message" => + %{ + "chat" => %{"id" => chat_id}, + "text" => "/setgrok", + "from" => %{"id" => user_id} + } = _message + } = _params + ) do + if is_admin_allowed?(user_id, chat_id) do + RuntimeEnvs.set_current_service(:grok) + send_resp(conn, 204, "") + else + send_resp(conn, 204, "") + end + rescue + _ -> + send_resp(conn, 204, "") + end + + def receive( + conn, + %{ + "message" => + %{ + "chat" => %{"id" => chat_id}, + "text" => "/setopenai", + "from" => %{"id" => user_id} + } = _message + } = _params + ) do + if is_admin_allowed?(user_id, chat_id) do + RuntimeEnvs.set_current_service(:openai) + send_resp(conn, 204, "") + else + send_resp(conn, 204, "") + end + rescue + _ -> + send_resp(conn, 204, "") + end + def receive( conn, %{ @@ -31,6 +100,9 @@ defmodule GptTalkerbotWeb.BotController do else send_resp(conn, 204, "") end + rescue + _ -> + send_resp(conn, 204, "") end def receive( @@ -49,6 +121,9 @@ defmodule GptTalkerbotWeb.BotController do else send_resp(conn, 204, "") end + rescue + _ -> + send_resp(conn, 204, "") end def receive( @@ -82,6 +157,9 @@ defmodule GptTalkerbotWeb.BotController do end send_resp(conn, 204, "") + rescue + _ -> + send_resp(conn, 204, "") end def receive( @@ -133,7 +211,11 @@ defmodule GptTalkerbotWeb.BotController do end end + defp is_admin_allowed?(owner_id, _) do + owner_id == owner_id() + end + defp is_allowed?(user_id, chat_id) do - user_id in allowed_groups() or allowed_groups() == [] or chat_id in allowed_groups() + user_id in allowed_users() or allowed_groups() == [] or chat_id in allowed_groups() end end diff --git a/lib/gpt_talkerbot_web/services/grok.ex b/lib/gpt_talkerbot_web/services/grok.ex new file mode 100644 index 0000000..6fe0cb7 --- /dev/null +++ b/lib/gpt_talkerbot_web/services/grok.ex @@ -0,0 +1,53 @@ +defmodule GptTalkerbotWeb.Services.Grok do + use Tesla + defp default_prompt, do: Application.get_env(:gpt_talkerbot, :default_prompt, "") + + @doc """ + Creates a client to make the OpenAI requests. + """ + def new(api_key) do + middleware = [ + {Tesla.Middleware.BaseUrl, "https://api.x.ai/v1"}, + {Tesla.Middleware.BearerAuth, token: api_key}, + Tesla.Middleware.JSON, + {Tesla.Middleware.Logger, log_level: :warn} + ] + + Tesla.client(middleware) + end + + @doc """ + Creates a grok completion, sending user messages to get a text based on it. + """ + def grok_completion(client, user, messages, settings \\ default_settings()) do + final_messages = build_messages(settings[:prompt], messages) + + Tesla.post(client, "/chat/completions", %{ + "model" => "grok-4-fast-non-reasoning", + "messages" => final_messages, + "temperature" => settings[:temperature], + "top_p" => settings[:top_p], + "max_tokens" => 2300, + "user" => user + }) + |> handle_response() + end + + defp handle_response({:ok, %{status: 200, body: body}}), do: {:ok, body} + defp handle_response(_), do: {:error, "Erro ao chamar GROK"} + + defp build_messages(prompt, messages) when prompt in [nil, ""], do: messages + + defp build_messages(prompt, messages) do + [%{role: "system", content: prompt} | messages] + end + + defp default_settings() do + %{ + prompt: default_prompt(), + temperature: 1.5, + top_p: 0.9, + max_completion_tokens: 2300 + } + end +end diff --git a/mix.lock b/mix.lock new file mode 100644 index 0000000..14ede7f --- /dev/null +++ b/mix.lock @@ -0,0 +1,49 @@ +%{ + "amqp": {:hex, :amqp, "4.1.0", "ab993d7a7adb41bc52fc084224441bad34ba04a6ff97fcd4a17f8281ed010ed1", [:mix], [{:amqp_client, "~> 4.0", [hex: :amqp_client, repo: "hexpm", optional: false]}], "hexpm", "360559cb5a4c4a920806a8c281d0418db3a625ce730008c8460749dd9b1cf838"}, + "amqp_client": {:hex, :amqp_client, "4.0.3", "c7dcc8031c780cd39ec586ba827a8eb26e006e9761af8d3f58fded11f645ebd4", [:make, :rebar3], [{:credentials_obfuscation, "3.4.0", [hex: :credentials_obfuscation, repo: "hexpm", optional: false]}, {:rabbit_common, "4.0.3", [hex: :rabbit_common, repo: "hexpm", optional: false]}], "hexpm", "ae945f7280617e9a4b17a6d49e3a2f496d716e8088ec29d8e94ecc79e5da7458"}, + "broadway": {:hex, :broadway, "1.2.1", "83a1567423c26885e15f6cd8670ca790370af2fcff2ede7fa88c5ea793087a67", [:mix], [{:gen_stage, "~> 1.0", [hex: :gen_stage, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.3.7 or ~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "68ae63d83b55bdca0f95cd49feee5fb74c5a6bec557caf940860fe07dbc8a4fb"}, + "broadway_rabbitmq": {:hex, :broadway_rabbitmq, "0.8.2", "087e2fb0ea2fe6fd941246be6985eccda93ea601bf678c3e8bd5d2a830acb058", [:mix], [{:amqp, "~> 1.3 or ~> 2.0 or ~> 3.0 or ~> 4.0", [hex: :amqp, repo: "hexpm", optional: false]}, {:broadway, "~> 1.0", [hex: :broadway, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.3.5 or ~> 0.4.0 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "762cf2fa7c20027c20ebaf1708570c2101c78824237eb2ab7e3f1158e4003a5a"}, + "castore": {:hex, :castore, "1.0.15", "8aa930c890fe18b6fe0a0cff27b27d0d4d231867897bd23ea772dee561f032a3", [:mix], [], "hexpm", "96ce4c69d7d5d7a0761420ef743e2f4096253931a3ba69e5ff8ef1844fe446d3"}, + "certifi": {:hex, :certifi, "2.15.0", "0e6e882fcdaaa0a5a9f2b3db55b1394dba07e8d6d9bcad08318fb604c6839712", [:rebar3], [], "hexpm", "b147ed22ce71d72eafdad94f055165c1c182f61a2ff49df28bcc71d1d5b94a60"}, + "cowboy": {:hex, :cowboy, "2.14.0", "565dcf221ba99b1255b0adcec24d2d8dbe79e46ec79f30f8373cceadc6a41e2a", [:make, :rebar3], [{:cowlib, ">= 2.16.0 and < 3.0.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, ">= 1.8.0 and < 3.0.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "ea99769574550fe8a83225c752e8a62780a586770ef408816b82b6fe6d46476b"}, + "cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"}, + "cowlib": {:hex, :cowlib, "2.16.0", "54592074ebbbb92ee4746c8a8846e5605052f29309d3a873468d76cdf932076f", [:make, :rebar3], [], "hexpm", "7f478d80d66b747344f0ea7708c187645cfcc08b11aa424632f78e25bf05db51"}, + "credentials_obfuscation": {:hex, :credentials_obfuscation, "3.4.0", "34e18b126b3aefd6e8143776fbe1ceceea6792307c99ac5ee8687911f048cfd7", [:rebar3], [], "hexpm", "738ace0ed5545d2710d3f7383906fc6f6b582d019036e5269c4dbd85dbced566"}, + "db_connection": {:hex, :db_connection, "2.8.1", "9abdc1e68c34c6163f6fb96a96532272d13ad7ca45262156ae8b7ec6d9dc4bec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a61a3d489b239d76f326e03b98794fb8e45168396c925ef25feb405ed09da8fd"}, + "decimal": {:hex, :decimal, "2.3.0", "3ad6255aa77b4a3c4f818171b12d237500e63525c2fd056699967a3e7ea20f62", [:mix], [], "hexpm", "a4d66355cb29cb47c3cf30e71329e58361cfcb37c34235ef3bf1d7bf3773aeac"}, + "ecto": {:hex, :ecto, "3.13.3", "6a983f0917f8bdc7a89e96f2bf013f220503a0da5d8623224ba987515b3f0d80", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "1927db768f53a88843ff25b6ba7946599a8ca8a055f69ad8058a1432a399af94"}, + "ecto_sql": {:hex, :ecto_sql, "3.13.2", "a07d2461d84107b3d037097c822ffdd36ed69d1cf7c0f70e12a3d1decf04e2e1", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.13.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.19 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "539274ab0ecf1a0078a6a72ef3465629e4d6018a3028095dc90f60a19c371717"}, + "esbuild": {:hex, :esbuild, "0.10.0", "b0aa3388a1c23e727c5a3e7427c932d89ee791746b0081bbe56103e9ef3d291f", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "468489cda427b974a7cc9f03ace55368a83e1a7be12fba7e30969af78e5f8c70"}, + "expo": {:hex, :expo, "1.1.0", "f7b9ed7fb5745ebe1eeedf3d6f29226c5dd52897ac67c0f8af62a07e661e5c75", [:mix], [], "hexpm", "fbadf93f4700fb44c331362177bdca9eeb8097e8b0ef525c9cc501cb9917c960"}, + "gen_stage": {:hex, :gen_stage, "1.3.2", "7c77e5d1e97de2c6c2f78f306f463bca64bf2f4c3cdd606affc0100b89743b7b", [:mix], [], "hexpm", "0ffae547fa777b3ed889a6b9e1e64566217413d018cabd825f786e843ffe63e7"}, + "gettext": {:hex, :gettext, "0.26.2", "5978aa7b21fada6deabf1f6341ddba50bc69c999e812211903b169799208f2a8", [:mix], [{:expo, "~> 0.5.1 or ~> 1.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "aa978504bcf76511efdc22d580ba08e2279caab1066b76bb9aa81c4a1e0a32a5"}, + "hackney": {:hex, :hackney, "1.25.0", "390e9b83f31e5b325b9f43b76e1a785cbdb69b5b6cd4e079aa67835ded046867", [:rebar3], [{:certifi, "~> 2.15.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~> 6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~> 1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~> 1.4", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.4.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~> 1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~> 0.7.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "7209bfd75fd1f42467211ff8f59ea74d6f2a9e81cbcee95a56711ee79fd6b1d4"}, + "httpoison": {:hex, :httpoison, "2.2.3", "a599d4b34004cc60678999445da53b5e653630651d4da3d14675fedc9dd34bd6", [:mix], [{:hackney, "~> 1.21", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "fa0f2e3646d3762fdc73edb532104c8619c7636a6997d20af4003da6cfc53e53"}, + "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, + "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, + "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, + "mime": {:hex, :mime, "2.0.7", "b8d739037be7cd402aee1ba0306edfdef982687ee7e9859bee6198c1e7e2f128", [:mix], [], "hexpm", "6171188e399ee16023ffc5b76ce445eb6d9672e2e241d2df6050f3c771e80ccd"}, + "mimerl": {:hex, :mimerl, "1.4.0", "3882a5ca67fbbe7117ba8947f27643557adec38fa2307490c4c4207624cb213b", [:rebar3], [], "hexpm", "13af15f9f68c65884ecca3a3891d50a7b57d82152792f3e19d88650aa126b144"}, + "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, + "parse_trans": {:hex, :parse_trans, "3.4.1", "6e6aa8167cb44cc8f39441d05193be6e6f4e7c2946cb2759f015f8c56b76e5ff", [:rebar3], [], "hexpm", "620a406ce75dada827b82e453c19cf06776be266f5a67cff34e1ef2cbb60e49a"}, + "phoenix": {:hex, :phoenix, "1.6.16", "e5bdd18c7a06da5852a25c7befb72246de4ddc289182285f8685a40b7b5f5451", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 1.0 or ~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e15989ff34f670a96b95ef6d1d25bad0d9c50df5df40b671d8f4a669e050ac39"}, + "phoenix_ecto": {:hex, :phoenix_ecto, "4.6.5", "c4ef322acd15a574a8b1a08eff0ee0a85e73096b53ce1403b6563709f15e1cea", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.1", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "26ec3208eef407f31b748cadd044045c6fd485fbff168e35963d2f9dfff28d4b"}, + "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"}, + "phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"}, + "phoenix_view": {:hex, :phoenix_view, "2.0.4", "b45c9d9cf15b3a1af5fb555c674b525391b6a1fe975f040fb4d913397b31abf4", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}], "hexpm", "4e992022ce14f31fe57335db27a28154afcc94e9983266835bb3040243eb620b"}, + "plug": {:hex, :plug, "1.18.1", "5067f26f7745b7e31bc3368bc1a2b818b9779faa959b49c934c17730efc911cf", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "57a57db70df2b422b564437d2d33cf8d33cd16339c1edb190cd11b1a3a546cc2"}, + "plug_cowboy": {:hex, :plug_cowboy, "2.7.4", "729c752d17cf364e2b8da5bdb34fb5804f56251e88bb602aff48ae0bd8673d11", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "9b85632bd7012615bae0a5d70084deb1b25d2bcbb32cab82d1e9a1e023168aa3"}, + "plug_crypto": {:hex, :plug_crypto, "1.2.5", "918772575e48e81e455818229bf719d4ab4181fcbf7f85b68a35620f78d89ced", [:mix], [], "hexpm", "26549a1d6345e2172eb1c233866756ae44a9609bd33ee6f99147ab3fd87fd842"}, + "postgrex": {:hex, :postgrex, "0.21.1", "2c5cc830ec11e7a0067dd4d623c049b3ef807e9507a424985b8dcf921224cd88", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "27d8d21c103c3cc68851b533ff99eef353e6a0ff98dc444ea751de43eb48bdac"}, + "rabbit_common": {:hex, :rabbit_common, "4.0.3", "e927b882733d122f6802662220bdb1a83774852dbe67d21d4e33aaf54f3998dd", [:make, :rebar3], [{:credentials_obfuscation, "3.4.0", [hex: :credentials_obfuscation, repo: "hexpm", optional: false]}, {:ranch, "2.1.0", [hex: :ranch, repo: "hexpm", optional: false]}, {:recon, "2.5.6", [hex: :recon, repo: "hexpm", optional: false]}, {:thoas, "1.2.1", [hex: :thoas, repo: "hexpm", optional: false]}], "hexpm", "ead31ba292c2cc5fda48a486417d7cfe8966f661994d7ed6c3e5f8840828e8ec"}, + "ranch": {:hex, :ranch, "2.1.0", "2261f9ed9574dcfcc444106b9f6da155e6e540b2f82ba3d42b339b93673b72a3", [:make, :rebar3], [], "hexpm", "244ee3fa2a6175270d8e1fc59024fd9dbc76294a321057de8f803b1479e76916"}, + "recon": {:hex, :recon, "2.5.6", "9052588e83bfedfd9b72e1034532aee2a5369d9d9343b61aeb7fbce761010741", [:mix, :rebar3], [], "hexpm", "96c6799792d735cc0f0fd0f86267e9d351e63339cbe03df9d162010cefc26bb0"}, + "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"}, + "swoosh": {:hex, :swoosh, "1.19.6", "9af1db39ac3c8825eea8888992b6e08ef694e9d51709cac0541fd4e459cbd476", [:mix], [{:bandit, ">= 1.0.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mua, "~> 0.2.3", [hex: :mua, repo: "hexpm", optional: true]}, {:multipart, "~> 0.4", [hex: :multipart, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:req, "~> 0.5.10 or ~> 0.6 or ~> 1.0", [hex: :req, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dd42a5fb9a682df2383559d912b2ed987c455e242cd2ee4a2a4256e1f05e8568"}, + "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, + "telemetry_metrics": {:hex, :telemetry_metrics, "0.6.2", "2caabe9344ec17eafe5403304771c3539f3b6e2f7fb6a6f602558c825d0d0bfb", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9b43db0dc33863930b9ef9d27137e78974756f5f198cae18409970ed6fa5b561"}, + "telemetry_poller": {:hex, :telemetry_poller, "1.3.0", "d5c46420126b5ac2d72bc6580fb4f537d35e851cc0f8dbd571acf6d6e10f5ec7", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "51f18bed7128544a50f75897db9974436ea9bfba560420b646af27a9a9b35211"}, + "tesla": {:hex, :tesla, "1.15.3", "3a2b5c37f09629b8dcf5d028fbafc9143c0099753559d7fe567eaabfbd9b8663", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:finch, "~> 0.13", [hex: :finch, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, ">= 1.0.0", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.21", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "4.4.2", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:mox, "~> 1.0", [hex: :mox, repo: "hexpm", optional: true]}, {:msgpax, "~> 2.3", [hex: :msgpax, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "98bb3d4558abc67b92fb7be4cd31bb57ca8d80792de26870d362974b58caeda7"}, + "thoas": {:hex, :thoas, "1.2.1", "19a25f31177a17e74004d4840f66d791d4298c5738790fa2cc73731eb911f195", [:rebar3], [], "hexpm", "e38697edffd6e91bd12cea41b155115282630075c2a727e7a6b2947f5408b86a"}, + "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.1", "a48703a25c170eedadca83b11e88985af08d35f37c6f664d6dcfb106a97782fc", [:rebar3], [], "hexpm", "b3a917854ce3ae233619744ad1e0102e05673136776fb2fa76234f3e03b23642"}, +} diff --git a/scripts/start_application.sh b/scripts/start_application.sh index a2e7b69..548e0c9 100755 --- a/scripts/start_application.sh +++ b/scripts/start_application.sh @@ -7,6 +7,8 @@ DB_URL=$(aws ssm get-parameter --name "/gpt_talkerbot/prod/database_url" --with- KEY_BASE=$(aws ssm get-parameter --name "/gpt_talkerbot/prod/secret_key_base" --with-decryption --query Parameter.Value --output text) ALLOWED_GROUPS=$(aws ssm get-parameter --name "/gpt_talkerbot/prod/allowed_groups" --with-decryption --query Parameter.Value --output text) OPENAI_API_KEY=$(aws ssm get-parameter --name "/gpt_talkerbot/prod/openai_api_key" --with-decryption --query Parameter.Value --output text) +GROK_API_KEY=$(aws ssm get-parameter --name "/gpt_talkerbot/prod/grok_api_key" --with-decryption --query Parameter.Value --output text) +OWNER_ID=$(aws ssm get-parameter --name "/gpt_talkerbot/prod/owner_id" --with-decryption --query Parameter.Value --output text) DEFAULT_PROMPT=$(aws ssm get-parameter --name "/gpt_talkerbot/prod/default_prompt" --with-decryption --query Parameter.Value --output text) TELEGRAM_API_KEY=$(aws ssm get-parameter --name "/gpt_talkerbot/prod/telegram_api_key" --with-decryption --query Parameter.Value --output text) SERVER_HOST=$(aws ssm get-parameter --name "/gpt_talkerbot/prod/server_host" --with-decryption --query Parameter.Value --output text) @@ -39,6 +41,8 @@ Environment="DATABASE_URL=${DB_URL}" Environment="SECRET_KEY_BASE=${KEY_BASE}" Environment="ALLOWED_GROUPS=${ALLOWED_GROUPS}" Environment="OPENAI_API_KEY=${OPENAI_API_KEY}" +Environment="GROK_API_KEY=${GROK_API_KEY}" +Environment="OWNER_ID=${OWNER_ID}" Environment="DEFAULT_PROMPT=${DEFAULT_PROMPT}" Environment="TELEGRAM_API_KEY=${TELEGRAM_API_KEY}" Environment="SERVER_HOST=${SERVER_HOST}"