or

module
v0.6.16 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 24, 2026 License: MIT

README

Or swirl logo

Choose the path from intent to action.

English | 简体中文

Go Reference CI Release Go Version

About

or is a modular Go toolkit for building applications with language models and higher-level agents. A provider-neutral LLM package keeps conversations, tools, reasoning, and streaming events stable while models and wire protocols change underneath, and an agent package builds the tool-call loop, state, and streaming events on top. The repository also includes Or, a coding agent built with these packages.

Why or

  • Use one conversation model across OpenAI-compatible and Anthropic-compatible providers.
  • Stream text, reasoning, tool calls, usage, and errors through typed events.
  • Define tools from Go structs and validate model-generated arguments.
  • Preserve provider metadata needed for multi-turn reasoning and tool use.
  • Switch models between requests without rebuilding conversation history.
  • Add custom model protocols without expanding the shared request API.
  • Run autonomous multi-step tool loops with streaming events, mid-run steering, and per-step model switching.
  • Layer transcript persistence, context compaction, per-step system prompts, and skills on top with the harness.

Packages

Package Status Description
or/llm Available Unified model access, streaming, tools, reasoning, images, and conversation history
or/agent Available Stateful agent loop with tools, streaming events, steering, follow-ups, and abort
or/harness Available Orchestration over the agent: transcript persistence, context compaction, per-step system prompt, and skills
Or Product Coding agent service, React client, and Electron desktop application

Future packages can build higher-level orchestration on the same foundations without turning the root package into a single large API.

Catalog

The project maintains a curated catalog of Agent Skills, recommended MCP servers, and useful CLI tools. These are source and recommendation collections rather than runtime configuration; review each entry and follow its collection-specific setup before use.

Requirements

  • Go 1.25 or later
  • An API key for the selected hosted provider, or a compatible local endpoint

Install

Install the LLM package:

go get github.com/ktsoator/or/llm@latest

Set the API key expected by the selected provider. For example:

export DEEPSEEK_API_KEY=your-deepseek-api-key

See Providers and models for supported provider IDs, environment variables, catalog discovery, and custom endpoints.

Quick start

package main

import (
	"context"
	"fmt"
	"log"

	"github.com/ktsoator/or/llm"
	_ "github.com/ktsoator/or/llm/openai" // registers the OpenAI-compatible protocol (DeepSeek, Groq, xAI, ...)
)

func main() {
	model := llm.GetModel("deepseek", "deepseek-v4-flash")
	response, err := llm.Complete(
		context.Background(),
		model,
		llm.Prompt("Explain Go channels briefly."),
		llm.StreamOptions{},
	)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println(response.Text())
}

Each protocol lives in a provider package that registers itself on import. Pull in the protocols you use — and only their vendor SDKs — by importing the matching provider package for its side effects (llm/openai, llm/anthropic), or import llm/all for every built-in protocol at once.

Use llm.Stream instead of llm.Complete to consume deltas while the model is generating:

events, err := llm.Stream(ctx, model, input, llm.StreamOptions{})
if err != nil {
	log.Fatal(err)
}
for event := range events {
	switch event.Type {
	case llm.EventTextDelta:
		fmt.Print(event.Delta)
	case llm.EventError:
		log.Fatal(event.Err)
	}
}

Documentation

Guides for the SDK packages live at ktsoator.github.io/or.

API reference: or/llm · or/agent · or/harness

Releases

The Go SDK and Or share a version. Pushing a vX.Y.Z tag creates the GitHub Release and attaches the macOS builds. See RELEASING.md.

Supported protocols

The built-in adapters implement:

  • OpenAI Responses
  • OpenAI-compatible Chat Completions
  • Anthropic-compatible Messages

The model catalog includes explicit compatibility metadata for DeepSeek, MiniMax, Xiaomi MiMo, Z.AI, Moonshot AI, Kimi, Anthropic, OpenCode, and other compatible providers. Catalog presence is not a guarantee that every model has been live-tested; all built-in wire adapters are covered by automated mock-server tests.

Project status

v0.6.0 is the first public release of Or. It also moves or/harness, the stateful orchestration layer for or/agent, to a top-level package. The project remains pre-1.0, so APIs may continue to evolve between minor versions. Breaking changes will be called out in release notes.

Acknowledgements

This project is inspired by and partially adapted from earendil-works/pi, created by Mario Zechner.

License

Released under the MIT License.

Directories

Path Synopsis
Package agent is a provider-neutral orchestration layer built on the llm package.
Package agent is a provider-neutral orchestration layer built on the llm package.
coding
cmd/coding-desktop command
Command coding-desktop runs the authenticated loopback server supervised by the Electron main process.
Command coding-desktop runs the authenticated loopback server supervised by the Electron main process.
cmd/mcp-test-server command
Command mcp-test-server runs a deterministic local MCP server for manually exercising Or's tool discovery and result handling.
Command mcp-test-server runs a deterministic local MCP server for manually exercising Or's tool discovery and result handling.
internal/compaction
Package compaction prepares and summarizes old coding-session context.
Package compaction prepares and summarizes old coding-session context.
internal/contextprojection
Package contextprojection manages product-generated context that is projected into model requests without becoming canonical conversation input.
Package contextprojection manages product-generated context that is projected into model requests without becoming canonical conversation input.
internal/desktopserver
Package desktopserver serves the Electron renderer and product API from one authenticated loopback origin.
Package desktopserver serves the Electron renderer and product API from one authenticated loopback origin.
internal/engine
Package engine owns one stateful coding-agent session.
Package engine owns one stateful coding-agent session.
internal/httpapi
Package httpapi is the product's HTTP delivery layer.
Package httpapi is the product's HTTP delivery layer.
internal/httpapi/internal/genwire command
Command genwire generates the browser's TypeScript wire DTOs from the Go structs and string enums in wire_contract.go.
Command genwire generates the browser's TypeScript wire DTOs from the Go structs and string enums in wire_contract.go.
internal/imageprep
Package imageprep validates and normalizes raster images before they enter provider-independent model content.
Package imageprep validates and normalizes raster images before they enter provider-independent model content.
internal/mcp
Package mcp owns Or's product-level MCP configuration, connection manager, leases, diagnostics, and adaptation of protocol tools to coding-agent tools.
Package mcp owns Or's product-level MCP configuration, connection manager, leases, diagnostics, and adaptation of protocol tools to coding-agent tools.
internal/mcp/client
Package client owns protocol-native Model Context Protocol connections, transports, tool discovery, and tool calls.
Package client owns protocol-native Model Context Protocol connections, transports, tool discovery, and tool calls.
internal/observability
Package observability records privacy-safe product lifecycle events.
Package observability records privacy-safe product lifecycle events.
internal/permission
Package permission owns the coding product's tool authorization policy.
Package permission owns the coding product's tool authorization policy.
internal/prompt
Package prompt deterministically renders the coding agent's stable system prompt, discovers the instruction files and environment that make up its dynamic context, and renders those as model-visible attachments.
Package prompt deterministically renders the coding agent's stable system prompt, discovers the instruction files and environment that make up its dynamic context, and renders those as model-visible attachments.
internal/provider
Package provider manages the coding product's persisted provider connection profiles.
Package provider manages the coding product's persisted provider connection profiles.
internal/skills
Package skills loads file-backed skills and exposes them to a coding agent.
Package skills loads file-backed skills and exposes them to a coding agent.
internal/snapshot
Package snapshot projects inspectable, provider-neutral model exchanges from committed transcripts.
Package snapshot projects inspectable, provider-neutral model exchanges from committed transcripts.
internal/tools
Package tools implements the coding agent's built-in tools and the product bridges those tools use to interact with the desktop surface.
Package tools implements the coding agent's built-in tools and the product bridges those tools use to interact with the desktop surface.
internal/trace
Package trace assembles performance events and private request snapshots into one UI-facing diagnostic read model.
Package trace assembles performance events and private request snapshots into one UI-facing diagnostic read model.
internal/transcript
Package transcript defines the durable, append-only history of a coding session.
Package transcript defines the durable, append-only history of a coding session.
internal/usage
Package usage is the coding product's token and cost ledger.
Package usage is the coding product's token and cost ledger.
internal/workspace
Package workspace owns the directories a coding session runs in: the project roots a user registers, and the scratch directories the server generates for standalone chats.
Package workspace owns the directories a coding session runs in: the project roots a user registers, and the scratch directories the server generates for standalone chats.
example
agent/basic command
Command basic runs one prompt through a stateful agent and prints the final assistant message from the transcript.
Command basic runs one prompt through a stateful agent and prints the final assistant message from the transcript.
agent/events command
Command events prints an agent run as it happens: assistant deltas, tool starts, tool progress updates, and tool completion events.
Command events prints an agent run as it happens: assistant deltas, tool starts, tool progress updates, and tool completion events.
agent/tools command
Command tools lets an agent run a typed tool loop for a weather question.
Command tools lets an agent run a typed tool loop for a weather question.
llm/advanced command
Command advanced shows two lower-level controls layered on a normal request:
Command advanced shows two lower-level controls layered on a normal request:
llm/basic command
Command basic sends a single prompt to a model and prints the reply.
Command basic sends a single prompt to a model and prints the reply.
llm/conversation command
Command conversation carries history across multiple turns.
Command conversation carries history across multiple turns.
llm/model_switch command
Command model_switch continues one conversation across two protocols.
Command model_switch continues one conversation across two protocols.
llm/options command
Command options sends a prompt with a system message and per-request options.
Command options sends a prompt with a system message and per-request options.
llm/providers command
Command providers inspects and configures providers at runtime.
Command providers inspects and configures providers at runtime.
llm/reasoning command
Command reasoning asks a reasoning-capable model to think before answering and streams the reasoning and the final answer as separate phases.
Command reasoning asks a reasoning-capable model to think before answering and streams the reasoning and the final answer as separate phases.
llm/streaming command
Command streaming consumes a response as a live event stream instead of waiting for the final message.
Command streaming consumes a response as a live event stream instead of waiting for the final message.
llm/tools command
Command tools runs a streaming tool loop with reasoning: the model thinks, optionally calls a typed tool, sees the result, and continues until it gives a final answer.
Command tools runs a streaming tool loop with reasoning: the model thinks, optionally calls a typed tool, sees the result, and continues until it gives a final answer.
llm/whoami command
Command whoami reports which providers are configured and lists their models.
Command whoami reports which providers are configured and lists their models.
Package harness is a stateful orchestration layer over the core agent.
Package harness is a stateful orchestration layer over the core agent.
llm
Package llm is a unified, provider-neutral API for large language models.
Package llm is a unified, provider-neutral API for large language models.
all
Package all registers every built-in protocol adapter into the llm package default registry.
Package all registers every built-in protocol adapter into the llm package default registry.
anthropic
Package anthropic implements the Anthropic Messages protocol on top of the official anthropic-sdk-go.
Package anthropic implements the Anthropic Messages protocol on top of the official anthropic-sdk-go.
internal/genmodels command
Command genmodels builds llm's checked-in model catalog from public model catalogs.
Command genmodels builds llm's checked-in model catalog from public model catalogs.
internal/httpheader
Package httpheader contains HTTP header helpers shared by protocol adapters.
Package httpheader contains HTTP header helpers shared by protocol adapters.
internal/jsonx
Package jsonx provides best-effort JSON recovery for model output.
Package jsonx provides best-effort JSON recovery for model output.
internal/openaicompat
Package openaicompat resolves the effective wire behavior of models served through OpenAI-compatible Chat Completions endpoints.
Package openaicompat resolves the effective wire behavior of models served through OpenAI-compatible Chat Completions endpoints.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL