{
  "$type": "site.standard.document",
  "bskyPostRef": {
    "cid": "bafyreialxte4xnt44dytrth6246znz5rmk5sxmb5pktlvzxvgq5zcefzue",
    "uri": "at://did:plc:kfvfl6lsmxg64yzszmfotdq2/app.bsky.feed.post/3mj47mcaleja2"
  },
  "path": "/t/ruby-talk-444789-ann-llm-rb-4-11-0-released/76746#post_1",
  "publishedAt": "2026-04-05T04:23:34.000Z",
  "site": "https://rubytalk.org",
  "tags": [
    "GitHub - llmrb/llm.rb: Ruby toolkit for multiple Large Language Models (LLMs) · GitHub",
    "File: README — Documentation by YARD 0.9.36",
    "(click for more details)"
  ],
  "textContent": "Hi all,\n\nI’ve been working on a Ruby library called llm.rb and wanted to share today's\nrelease (v4.11.0) because it has come a long way.\n\nMost LLM libraries focus on requests and responses. In practice, once you build\nanything non-trivial, you end up dealing with state, tool execution, streaming,\nand concurrency as first-class concerns.\n\nllm.rb is built around that layer.\n\nIt provides:\n\n- Stateful contexts that can be serialized as JSON and restored to a Ruby object.\n- Explicit tool execution (local, remote, and MCP)\n- Streaming with structured callbacks and tool-call events\n- The ability to start tool execution while streaming (overlapping latency)\n- Explicit concurrency (threads, fibers, async tasks)\n- Integration with MCP servers over stdio and HTTP\n- A unified interface across providers (OpenAI, Anthropic, Google, Ollama, etc.)\n- Runs on Ruby's stdlib by default, opt-in to optional features like async and net-http-persistent\n\nThe goal is to treat LLMs as part of your system architecture, not just API calls,\nwhile keeping everything explicit and stdlib-friendly.\n\nRepo: GitHub - llmrb/llm.rb: Ruby toolkit for multiple Large Language Models (LLMs) · GitHub\nDocs: File: README — Documentation by YARD 0.9.36\n\nThanks\n\n··· (click for more details)",
  "title": "[ruby-talk:444789] [ANN] llm.rb 4.11.0 released"
}