Skip to content

v0.3.0 — HTTP+SSE API, structured answers, registry pricing, silas:doctor

Choose a tag to compare

@danielstpaul danielstpaul released this 25 Jul 00:03
0668e49

The second half of the pre-1.0 push. Chaos-gated: 235 kill/deploy cycles across worker/supervisor/SIGTERM/parked on SQLite and Postgres — 100% completion, byte-identical replay, zero duplicate side effects.

  • A public HTTP + SSE session API at /silas/api/v1 — sessions (create/show, ?trace=1 for the full transcript), turns (create — 409 while one is active — and cancel), and approvals (list/approve/decline, the exact same approve!/decline! as the inbox, Slack, and email, stamped with config.api_actor). Deny-by-default via config.api_auth. GET .../sessions/:id/stream is server-sent events at row granularity with Last-Event-ID resume — at-least-once, epoch-ms watermark ids, ?poll=1 for a curl-friendly backlog-and-close, self-closing after api_stream_max_duration.
  • Structured final answers — declare a JSON schema under final_answer: in agent.yml and read the parsed Hash from Turn#answer_data (API answer_data, inbox trace, REPL, and a new assert_answer_data eval assertion). Schema-less agents keep a byte-identical definitions digest, so turns parked across the upgrade never trip NondeterminismError.
  • Cost accounting prices itself from RubyLLM's model registry (1,100+ models) per (model, provider) — steps stamp the provider at persist time; config.model_prices is now an override map; unknown models stay unpriced, never a lying $0.00. Default model is now claude-sonnet-4-5.
  • Inbox at scale — the budget "raise & resume" top-up card the 0.1.5 changelog promised, keyset pagination (?before=), and a 2-query session index.
  • bin/rails silas:doctor — provider key, queue adapter, model resolution, migrations, tool validation, rescuer entry, cable adapter, auth wiring. Exits non-zero on failures.
  • The 0.2 agent_sdk config shims are hard-removed (NoMethodError now); workflows on actions/checkout@v5.

Upgrade: bin/rails silas:install:migrations db:migrate (adds silas_steps.provider, drops the write-only silas_turns.cost_microcents). Full details in CHANGELOG.md.