Current section

Files

Jump to
dspex examples timeout_test.exs
Raw

examples/timeout_test.exs

# Timeout Configuration Examples - Using Generated Native Bindings
#
# Demonstrates SnakeBridge 0.13+ timeout architecture
#
# Run with: mix run --no-start examples/timeout_test.exs
require SnakeBridge
SnakeBridge.script do
IO.puts("DSPex Timeout Configuration Examples")
IO.puts("=====================================\n")
# Setup using native bindings
{:ok, lm} = Dspy.LM.new("gemini/gemini-flash-lite-latest", [])
{:ok, _} = Dspy.configure(lm: lm)
{:ok, predict} = Dspy.PredictClass.new("question -> answer", [])
# -------------------------------------------------------------------------
# Example 1: Default timeout (10 min via ml_inference profile)
# -------------------------------------------------------------------------
IO.puts("1. Default timeout (ml_inference profile = 10 min)")
IO.puts(" DSPy calls automatically use :ml_inference profile")
{:ok, result} = Dspy.PredictClass.forward(predict, question: "What is 2+2?")
{:ok, answer} = SnakeBridge.attr(result, "answer")
IO.puts(" Answer: #{answer}\n")
# -------------------------------------------------------------------------
# Example 2: Per-call timeout override with exact milliseconds
# -------------------------------------------------------------------------
IO.puts("2. Per-call timeout override (exact milliseconds)")
IO.puts(" Using __runtime__: [timeout: 120_000] for 2 minute timeout")
{:ok, result} =
Dspy.PredictClass.forward(predict,
question: "What is the capital of France?",
__runtime__: [timeout: 120_000]
)
{:ok, answer} = SnakeBridge.attr(result, "answer")
IO.puts(" Answer: #{answer}\n")
# -------------------------------------------------------------------------
# Example 3: Per-call timeout override with profile
# -------------------------------------------------------------------------
IO.puts("3. Per-call timeout with profile")
IO.puts(" Using __runtime__: [timeout_profile: :batch_job] for 1 hour timeout")
{:ok, result} =
Dspy.PredictClass.forward(predict,
question: "Explain quantum computing briefly",
__runtime__: [timeout_profile: :batch_job]
)
{:ok, answer} = SnakeBridge.attr(result, "answer")
IO.puts(" Answer: #{answer}\n")
# -------------------------------------------------------------------------
# Example 4: Direct runtime option passing
# -------------------------------------------------------------------------
IO.puts("4. Direct runtime option passing")
IO.puts(" Passing timeout directly in opts")
{:ok, result} =
Dspy.PredictClass.forward(predict,
question: "What color is the sky?",
__runtime__: [timeout: 60_000]
)
{:ok, answer} = SnakeBridge.attr(result, "answer")
IO.puts(" Answer: #{answer}\n")
# -------------------------------------------------------------------------
# Example 5: Using streaming profile
# -------------------------------------------------------------------------
IO.puts("5. Using streaming timeout profile")
{:ok, result} =
Dspy.PredictClass.forward(predict,
question: "What is 1+1?",
__runtime__: [timeout_profile: :streaming]
)
{:ok, answer} = SnakeBridge.attr(result, "answer")
IO.puts(" Answer: #{answer}\n")
# -------------------------------------------------------------------------
# Example 6: Custom timeout in milliseconds
# -------------------------------------------------------------------------
IO.puts("6. Custom timeout (90 seconds)")
{:ok, result} =
Dspy.PredictClass.forward(predict,
question: "Name a planet",
__runtime__: [timeout: 90_000]
)
{:ok, answer} = SnakeBridge.attr(result, "answer")
IO.puts(" Answer: #{answer}\n")
# -------------------------------------------------------------------------
# Timeout Profile Reference
# -------------------------------------------------------------------------
IO.puts("Timeout Profile Reference:")
IO.puts(" :default - 2 minutes (standard Python calls)")
IO.puts(" :streaming - 30 minutes (streaming responses)")
IO.puts(" :ml_inference - 10 minutes (LLM inference, DSPex default)")
IO.puts(" :batch_job - 1 hour (long-running batch operations)")
IO.puts("\nDone!")
end