Current section
Files
Jump to
Current section
Files
examples/custom_module.exs
# Custom Module Example - Using Generated Native Bindings
#
# Run with: mix run --no-start examples/custom_module.exs
#
# Requires: GEMINI_API_KEY environment variable
require SnakeBridge
defmodule CustomQA do
def new do
{:ok, extract} = Dspy.PredictClass.new("question -> keywords", [])
{:ok, answer} = Dspy.PredictClass.new("question, keywords -> answer", [])
%{extract: extract, answer: answer}
end
def forward(%{extract: extract, answer: answer}, question) do
{:ok, keywords_result} = Dspy.PredictClass.forward(extract, question: question)
{:ok, keywords} = SnakeBridge.attr(keywords_result, "keywords")
{:ok, answer_result} =
Dspy.PredictClass.forward(answer, question: question, keywords: keywords)
{:ok, final_answer} = SnakeBridge.attr(answer_result, "answer")
{keywords, final_answer}
end
end
SnakeBridge.script do
IO.puts("DSPex Custom Module Example")
IO.puts("===========================\n")
{:ok, lm} = Dspy.LM.new("gemini/gemini-flash-lite-latest", [])
{:ok, _} = Dspy.configure(lm: lm)
qa = CustomQA.new()
question = "How does Elixir build on Erlang's concurrency model?"
{keywords, answer} = CustomQA.forward(qa, question)
IO.puts("Question: #{question}")
IO.puts("Keywords: #{inspect(keywords)}")
IO.puts("Answer: #{answer}\n")
IO.puts("Done!")
end