Packages
opencode_sdk
0.1.80
0.1.84
0.1.83
0.1.82
0.1.81
0.1.80
0.1.79
0.1.78
0.1.77
0.1.76
0.1.75
0.1.74
0.1.73
0.1.72
0.1.71
0.1.70
0.1.69
0.1.68
0.1.67
0.1.66
0.1.65
0.1.64
0.1.63
0.1.62
0.1.61
0.1.60
0.1.59
0.1.58
0.1.57
0.1.56
0.1.55
0.1.54
0.1.53
0.1.52
0.1.51
0.1.50
0.1.49
0.1.48
0.1.47
0.1.46
0.1.45
0.1.44
0.1.43
0.1.42
0.1.41
0.1.40
0.1.39
0.1.38
0.1.37
0.1.36
0.1.35
0.1.34
0.1.33
0.1.32
0.1.31
0.1.30
0.1.29
0.1.28
0.1.27
0.1.26
0.1.25
0.1.24
0.1.23
0.1.22
0.1.21
0.1.20
0.1.19
0.1.18
0.1.17
0.1.16
0.1.15
0.1.14
0.1.13
0.1.12
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Unofficial OpenCode SDK for Elixir. A complete Elixir SDK for OpenCode, providing server creation, session management, messaging, file operations, and more. Mirrors the functionality of the official JavaScript SDK (@opencode-ai/sdk). Not affiliated with or built by the OpenCode team.
Current section
Files
Jump to
Current section
Files
lib/mix/tasks/opencode.gen.client.ex
defmodule Mix.Tasks.Opencode.Gen.Client do
@moduledoc """
Generates Elixir client code from OpenCode CLI OpenAPI specification.
This task:
1. Fetches the OpenAPI spec from the OpenCode CLI (or uses a local spec file)
2. Generates Elixir client code using oapi_generator
## Usage
mix opencode.gen.client
## Options
--spec PATH Path to local OpenAPI spec JSON file (optional)
## Examples
# Generate from running OpenCode CLI
mix opencode.gen.client
# Generate from local spec file
mix opencode.gen.client --spec priv/opencode_openapi.json
"""
use Mix.Task
require Logger
@spec_file "priv/opencode_openapi.json"
@impl Mix.Task
def run(args) do
{opts, _, _} =
OptionParser.parse(args,
switches: [spec: :string],
aliases: [s: :spec]
)
spec_path = opts[:spec] || fetch_spec_from_cli()
unless File.exists?(spec_path) do
Mix.raise("""
OpenAPI spec not found at: #{spec_path}
Please either:
1. Start the OpenCode CLI and run: mix opencode.gen.client
2. Provide a local spec file: mix opencode.gen.client --spec path/to/spec.json
""")
end
Mix.shell().info("🔧 Generating OpenCode client from: #{spec_path}")
Mix.shell().info("")
# Run the OpenAPI generator using the opencode profile
Mix.Task.run("api.gen", ["opencode", spec_path])
Mix.shell().info("")
Mix.shell().info("✅ Client generation complete!")
Mix.shell().info("")
Mix.shell().info("Generated files in: lib/opencode/generated/")
Mix.shell().info("")
Mix.shell().info("Next steps:")
Mix.shell().info(" 1. Review the generated code")
Mix.shell().info(" 2. Run: mix compile")
Mix.shell().info(" 3. Update your code to use the new client module")
:ok
end
defp fetch_spec_from_cli do
# Check if opencode CLI is available in common locations
cli_paths =
[
# From system PATH
System.find_executable("opencode"),
# Local development
"./opencode-cli"
]
|> Enum.reject(&is_nil/1)
|> Enum.filter(&File.exists?/1)
case cli_paths do
[cli_path | _] ->
Mix.shell().info("✓ Found OpenCode CLI at: #{cli_path}")
# Create priv directory if needed
File.mkdir_p!(Path.dirname(@spec_file))
# Generate OpenAPI spec from CLI
case System.cmd(cli_path, ["dev", "generate"], stderr_to_stdout: true) do
{output, 0} ->
File.write!(@spec_file, output)
Mix.shell().info("✓ Fetched OpenAPI spec from CLI")
@spec_file
{error, _} ->
Mix.raise("""
Failed to generate OpenAPI spec from CLI:
#{error}
Make sure the OpenCode CLI is running or provide a local spec file:
mix opencode.gen.client --spec path/to/spec.json
""")
end
[] ->
# Try HTTP endpoint if CLI not found
fetch_spec_from_http()
end
end
defp fetch_spec_from_http do
base_url = System.get_env("OPENCODE_BASE_URL", "http://127.0.0.1:3000")
url = "#{base_url}/openapi.json"
Mix.shell().info("CLI not found, trying HTTP endpoint: #{url}")
case Req.get(url, receive_timeout: 5000) do
{:ok, %{status: 200, body: body}} when is_map(body) ->
File.mkdir_p!(Path.dirname(@spec_file))
File.write!(@spec_file, Jason.encode!(body))
Mix.shell().info("✓ Fetched OpenAPI spec from HTTP endpoint")
@spec_file
{:ok, %{status: status}} ->
Mix.raise("""
HTTP endpoint returned status #{status}
Make sure OpenCode CLI is running at #{base_url}
or provide a local spec file:
mix opencode.gen.client --spec path/to/spec.json
""")
{:error, error} ->
Mix.raise("""
Failed to fetch OpenAPI spec: #{inspect(error)}
Please either:
1. Start the OpenCode CLI and ensure it's accessible
2. Provide a local spec file: mix opencode.gen.client --spec path/to/spec.json
""")
end
end
end