Uygulamayı aç
Moonborn — Developers

Elixir SDK

Resmi Elixir Moonborn istemcisi. Tesla destekli HTTP, denetlenebilir (supervise edilebilir) süreçler, örüntü eşleşmeli (pattern-match) sonuç tuple'ları. Phoenix / OTP için hazır.

moonborn (Hex.pm) — resmi Elixir SDK'sıdır. Kanonik OpenAPI belirtiminden üretilir; deyimsel Elixir:

  • Tesla destekli HTTP (yapılandırılabilir ara yazılım — middleware)
  • {:ok, result} / {:error, reason} tuple'ları (örüntü eşleşmeli)
  • Denetlenebilir (supervise edilebilir) süreçler
  • Phoenix + OTP ile sorunsuz

Bu sayfayı bitirdiğinde

  • Elixir SDK'sını kurabilecek ve başlatabileceksin.
  • Persona oluşturma + sohbet + akış çağırabileceksin.
  • case ile örüntü eşleşmesi hata işleme desenini uygulayabileceksin.
  • Denetçi ağacına (supervisor tree) SDK'yı entegre edebileceksin.

Ön koşul: Elixir 1.15+, Erlang/OTP 26+, API anahtarı.

Kurulum

mix.exs:

def deps do
  [
    {:moonborn, "~> 1.0"}
  ]
end
mix deps.get

Başlatma

{:ok, client} = Moonborn.client(
  api_key: System.fetch_env!("MOONBORN_API_KEY"),
  # base_url: "https://api.moonborn.co",  # kendi sunucuna kurulum
  # timeout: 60_000,                       # ms
  # max_retries: 3
)

Ortam değişkeni yedeği: MOONBORN_API_KEY.

Persona oluşturma

{:ok, persona} = Moonborn.Personas.create_persona(client,
  intent: "İstanbul'dan 34 yaşında bir kurucu. Parlak ama huzursuz.",
  workspace_id: "ws_..."
)
 
IO.inspect({persona.id, persona.status})
IO.puts(persona.surface.name.display)

Örüntü eşleşmesi ile işaretli (flagged) kontrolü:

case Moonborn.Personas.create_persona(client, intent: "...", workspace_id: "ws_...") do
  {:ok, %{status: "flagged", id: id, audit: %{score: score}}} ->
    Logger.warning("Flagged: #{id} (audit #{score})")
 
  {:ok, persona} ->
    {:ok, persona}
 
  {:error, %Moonborn.ApiError{code: code}} ->
    {:error, code}
end

Sohbet — akışsız

{:ok, session} = Moonborn.Chat.create_session(client, persona_id: persona.id)
 
{:ok, reply} = Moonborn.Chat.send_message(client,
  session_id: session.id,
  content: "Seni ne tetikler?"
)
 
IO.puts(reply.content)
IO.puts("Drift: #{reply.drift_score}, Alert: #{reply.drift_alert}")

Sohbet — akışlı

Moonborn.Chat.stream_message(client,
  session_id: session.id,
  content: "Sessiz bir gerçek söyle."
)
|> Enum.each(fn
  {:token, delta} ->
    IO.write(delta)
 
  {:completed, %{drift_score: ds}} ->
    IO.puts("\ndrift: #{ds}")
 
  {:error, reason} ->
    Logger.error("stream error: #{inspect(reason)}")
end)

Akış bir Enumerable'dır — Enum.each/2, Stream.map/2, özel işleyici (processor) ile çalışır.

Üretim hattı akışı

Moonborn.Personas.create_persona_stream(client, intent: "Lagos'ta bir market satıcısı.")
|> Enum.each(fn
  {:step_started, %{step: step}} ->
    IO.puts("Başladı: #{step}")
 
  {:step_completed, %{step: step, duration_ms: ms}} ->
    IO.puts("Bitti: #{step} (#{ms}ms)")
 
  {:pipeline_completed, %{persona_id: id}} ->
    IO.puts("Persona: #{id}")
end)

Hata işleme

case Moonborn.Personas.get_persona(client, id: "per_...") do
  {:ok, persona} ->
    persona
 
  {:error, %Moonborn.ApiError{code: "rate_limited", retry_after: ms}} ->
    Process.sleep(ms)
    # yeniden dene
 
  {:error, %Moonborn.ApiError{code: "not_found"}} ->
    nil
 
  {:error, %Moonborn.ApiError{code: "validation_failed", details: details}} ->
    Logger.error("invalid body: #{inspect(details)}")
    {:error, :invalid}
 
  {:error, reason} ->
    Logger.error("unknown: #{inspect(reason)}")
    {:error, reason}
end

14 hata kodunun tümü: Hatalar.

Eşgüçlülük (idempotency)

{:ok, persona} = Moonborn.Personas.create_persona(client,
  intent: "...",
  workspace_id: "ws_...",
  idempotency_key: "persona-build-2026-05-17-mert"
)

24 saat içinde yeniden gönderilen istekler orijinal yanıtı döndürür.

Denetçi (supervisor) entegrasyonu

# lib/my_app/application.ex
defmodule MyApp.Application do
  use Application
 
  def start(_type, _args) do
    children = [
      # SDK yapılandırmasını singleton olarak tut
      {Moonborn.Supervisor,
        api_key: System.fetch_env!("MOONBORN_API_KEY"),
        name: MyApp.Moonborn},
 
      # Phoenix uç noktası vb.
      MyAppWeb.Endpoint
    ]
 
    Supervisor.start_link(children, strategy: :one_for_one, name: MyApp.Supervisor)
  end
end
 
# lib/my_app/persona_creator.ex
defmodule MyApp.PersonaCreator do
  def create(intent, workspace_id) do
    Moonborn.Personas.create_persona(MyApp.Moonborn,
      intent: intent,
      workspace_id: workspace_id,
      idempotency_key: "#{workspace_id}-#{:erlang.phash2(intent)}"
    )
  end
end

Phoenix entegrasyonu

# lib/my_app_web/controllers/persona_controller.ex
defmodule MyAppWeb.PersonaController do
  use MyAppWeb, :controller
 
  def create(conn, %{"intent" => intent}) do
    case MyApp.PersonaCreator.create(intent, conn.assigns.workspace_id) do
      {:ok, persona} ->
        conn |> put_status(:created) |> json(persona)
 
      {:error, %Moonborn.ApiError{code: "validation_failed", details: details}} ->
        conn |> put_status(:bad_request) |> json(%{error: "invalid", details: details})
 
      {:error, %Moonborn.ApiError{code: "rate_limited", retry_after: ms}} ->
        conn |> put_resp_header("retry-after", to_string(div(ms, 1000)))
             |> put_status(:too_many_requests)
             |> json(%{error: "rate_limited"})
    end
  end
end

Sık karşılaşılan hatalar

(Mix) Could not compile dependency :moonborn

Erlang/OTP sürümü eski. OTP 26+ zorunludur. asdf install erlang 26.2.1 veya benzeri.

Akış sırasında süreç çökmesi

Akışı sürece bağlı (process-bound) olarak çağır (örn. bir GenServer içinde). Uzun süren akışları ana süreçte tutma — Task.async/1 veya zaman aşımlı GenServer.call kullan.

Plan gereksinimi

Her plan.

İlgili

TypeScript SDK

AsyncIterable akış karşılaştırması.

Open →
Ruby SDK

Örüntü eşleşmesi + deyimsel blok sözdizimi karşılaştırması.

Open →
Hatalar

Moonborn.ApiError kod kataloğu.

Open →
Webhook imza doğrulama

Phoenix uç noktası için HMAC deseni.

Open →