Commit b3d2255

mo khan <mo@mokhan.ca>
2026-02-02 05:40:21
feat: add plugin api for registering new providers
1 parent f5f7b57
lib/elelem/builtins/anthropic.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+Elelem::Providers.register(:anthropic) do
+  Elelem::Net::Claude.anthropic(
+    model: ENV.fetch("ANTHROPIC_MODEL", "claude-opus-4-5-20250514"),
+    api_key: ENV.fetch("ANTHROPIC_API_KEY")
+  )
+end
lib/elelem/builtins/ollama.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+Elelem::Providers.register(:ollama) do
+  Elelem::Net::Ollama.new(
+    model: ENV.fetch("OLLAMA_MODEL", "gpt-oss:latest"),
+    host: ENV.fetch("OLLAMA_HOST", "localhost:11434")
+  )
+end
lib/elelem/builtins/openai.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+Elelem::Providers.register(:openai) do
+  Elelem::Net::OpenAI.new(
+    model: ENV.fetch("OPENAI_MODEL", "gpt-4o"),
+    api_key: ENV.fetch("OPENAI_API_KEY")
+  )
+end
lib/elelem/builtins/provider.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+Elelem::Plugins.register(:provider) do |agent|
+  agent.commands.register("provider", description: "Switch provider", completions: -> { Elelem::Providers.names }) do |name|
+    if name.nil? || name.empty?
+      agent.terminal.say "  → available: #{Elelem::Providers.names.join(", ")}"
+    else
+      agent.client = Elelem::Providers.build(name)
+      agent.terminal.say "  → switched to #{name}"
+    end
+  end
+end
lib/elelem/builtins/vertex.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+Elelem::Providers.register(:vertex) do
+  Elelem::Net::Claude.vertex(
+    model: ENV.fetch("VERTEX_MODEL", "claude-opus-4-5@20251101"),
+    project: ENV.fetch("GOOGLE_CLOUD_PROJECT"),
+    region: ENV.fetch("GOOGLE_CLOUD_REGION", "us-east5")
+  )
+end