50 lines
1.2 KiB
Elixir
50 lines
1.2 KiB
Elixir
defmodule ElixirAi.ConversationManager do
|
|
use GenServer
|
|
|
|
def start_link(_opts), do: GenServer.start_link(__MODULE__, [], name: __MODULE__)
|
|
def init(names), do: {:ok, names}
|
|
|
|
def create_conversation(name) do
|
|
GenServer.call(__MODULE__, {:create, name})
|
|
end
|
|
|
|
def open_conversation(name) do
|
|
GenServer.call(__MODULE__, {:open, name})
|
|
end
|
|
|
|
def list_conversations do
|
|
GenServer.call(__MODULE__, :list)
|
|
end
|
|
|
|
def handle_call({:create, name}, _from, names) do
|
|
if name in names do
|
|
{:reply, {:error, :already_exists}, names}
|
|
else
|
|
{:reply, start_runner(name), [name | names]}
|
|
end
|
|
end
|
|
|
|
def handle_call({:open, name}, _from, names) do
|
|
if name in names do
|
|
{:reply, start_runner(name), names}
|
|
else
|
|
{:reply, {:error, :not_found}, names}
|
|
end
|
|
end
|
|
def handle_call(:list, _from, names) do
|
|
{:reply, names, names}
|
|
end
|
|
|
|
defp start_runner(name) do
|
|
case DynamicSupervisor.start_child(
|
|
ElixirAi.ChatRunnerSupervisor,
|
|
{ElixirAi.ChatRunner, name: name}
|
|
) do
|
|
{:ok, pid} -> {:ok, pid}
|
|
{:error, {:already_started, pid}} -> {:ok, pid}
|
|
error -> error
|
|
end
|
|
end
|
|
|
|
end
|