defprotocol GenAI.Legacy.NodeProtocol do
def apply(node, thread_context)
end
defimpl GenAI.Legacy.NodeProtocol, for: [GenAI.Graph.Node] do
def apply(node, thread_context)
def apply(_, thread_context) do
{:ok, thread_context}
end
end
defimpl GenAI.Legacy.NodeProtocol, for: GenAI.Tool do
def apply(node, thread_context)
def apply(node, thread_context) do
GenAI.Thread.LegacyStateProtocol.apply_tool(thread_context, node)
end
end
defimpl GenAI.Legacy.NodeProtocol, for: GenAI.Setting do
def apply(node, thread_context)
def apply(node, thread_context) do
GenAI.Thread.LegacyStateProtocol.apply_setting(thread_context, node)
end
end
defimpl GenAI.Legacy.NodeProtocol, for: GenAI.Setting.SafetySetting do
def apply(node, thread_context)
def apply(node, thread_context) do
GenAI.Thread.LegacyStateProtocol.apply_safety_setting(thread_context, node)
end
end
defimpl GenAI.Legacy.NodeProtocol, for: GenAI.Setting.ModelSetting do
def apply(node, thread_context)
def apply(node, thread_context) do
GenAI.Thread.LegacyStateProtocol.apply_model_setting(thread_context, node)
end
end
defimpl GenAI.Legacy.NodeProtocol, for: GenAI.Setting.ProviderSetting do
def apply(node, thread_context)
def apply(node, thread_context) do
GenAI.Thread.LegacyStateProtocol.apply_provider_setting(thread_context, node)
end
end
defimpl GenAI.Legacy.NodeProtocol, for: GenAI.Model do
def apply(node, thread_context)
def apply(model_or_selector, thread_context) do
cond do
GenAI.ModelProtocol.impl_for(model_or_selector) ->
with {:ok, {registered_model, thread_context}} <-
GenAI.ModelProtocol.register(model_or_selector, thread_context) do
GenAI.Thread.LegacyStateProtocol.apply_model(thread_context, registered_model)
else
x = {:error, _} -> x
x -> {:error, {:unexpected, x}}
end
:else ->
GenAI.Thread.LegacyStateProtocol.apply_model(thread_context, model_or_selector)
end
end
end
defimpl GenAI.Legacy.NodeProtocol, for: GenAI.ExternalModel do
def apply(node, thread_context)
def apply(model_or_selector, thread_context) do
cond do
GenAI.ModelProtocol.impl_for(model_or_selector) ->
with {:ok, {registered_model, thread_context}} <-
GenAI.ModelProtocol.register(model_or_selector, thread_context) do
GenAI.Thread.LegacyStateProtocol.apply_model(thread_context, registered_model)
else
x = {:error, _} -> x
x -> {:error, {:unexpected, x}}
end
:else ->
GenAI.Thread.LegacyStateProtocol.apply_model(thread_context, model_or_selector)
end
end
end
defimpl GenAI.Legacy.NodeProtocol,
for: [GenAI.Message, GenAI.Message.ToolUsage, GenAI.Message.ToolResponse] do
def apply(node, thread_context)
def apply(node, thread_context) do
GenAI.Thread.LegacyStateProtocol.apply_message(thread_context, node)
end
end
defimpl GenAI.Legacy.NodeProtocol, for: GenAI.Graph do
def apply(this, thread_context) do
Enum.reduce(this.nodes, {:ok, thread_context}, fn
_, thread_context = {:error, _} ->
thread_context
node, {:ok, thread_context} ->
GenAI.Legacy.NodeProtocol.apply(node, thread_context)
end)
end
end