Skip to main content

examples/streaming.exs

# Live streaming test against Z.AI (Anthropic format) with glm-4.5-air.
#
#   set -a && . ./.env && set +a && mix run examples/streaming.exs
#
# Prints text deltas as they arrive (typewriter effect) then the final result.

key = System.get_env("ZAI_API_KEY") || System.get_env("ANTHROPIC_AUTH_TOKEN")

unless key do
  IO.puts("ZAI_API_KEY not set — skipping.")
  System.halt(0)
end

alias ExAgent

model =
  ExAgent.Models.Anthropic.new(
    model: System.get_env("ZAI_MODEL", "glm-4.5-air"),
    auth_token: key,
    base_url: "https://api.z.ai/api/anthropic"
  )

agent =
  ExAgent.new(
    model: model,
    instructions: "Count from 1 to 5 slowly, one number per line.",
    model_settings: [max_tokens: 256, temperature: 0]
  )

IO.puts("=== STREAMING ===")

ExAgent.run_stream(agent, "count!")
|> Stream.each(fn
  {:delta, text} ->
    IO.write(text)

  {:result, %{usage: usage}} ->
    IO.puts("\n\n=== FINAL ===\ntokens in=#{usage.input_tokens} out=#{usage.output_tokens}")

  {:error, reason} ->
    IO.puts("\nERROR: #{inspect(reason)}")
end)
|> Stream.run()