Enno is a lightweight, provider-neutral Go agent framework. It owns the core Agent loop, explicit session state, tool dispatch, provider interfaces, SDK assembly helpers, and built-in tool implementations.
The former in-repo CLI has moved to the standalone Godo project at
../godo-coding-agent. Enno now focuses
on SDK/provider functionality; applications and CLIs should depend on Enno
through public packages only.
Repository: github.com/dean2021/enno
- Provider-neutral core package:
Agent,Session,RunResult,Provider,Tool,Message,Request, andResponse. - OpenAI-compatible provider via
provider/openai. - Anthropic Messages API provider via
provider/anthropic. - High-level
enno.NewAgentwithenno.Configfor configuring built-in tools, custom tools, permissions, hooks, policies, compaction, and prompt sections. Blank-importgithub.com/dean2021/enno/setupto register built-in tool builders before callingenno.NewAgentwithBuiltinTools. - Built-in tools for task graph, filesystem, shell, grep, glob, fetch_url, subagent, load_skill, and compact.
- Optional events for observing model calls, tool calls, results, and token usage without exposing hidden chain-of-thought.
go get github.com/dean2021/ennoFor the standalone coding-agent CLI, use the Godo project:
cd ../godo-coding-agent
go install ./cmd/godopackage main
import (
"context"
"fmt"
"os"
"time"
"github.com/dean2021/enno"
openaiprovider "github.com/dean2021/enno/provider/openai"
_ "github.com/dean2021/enno/setup"
)
func main() {
provider, err := openaiprovider.New(openaiprovider.Config{
APIKey: os.Getenv("ENNO_API_KEY"),
BaseURL: os.Getenv("ENNO_BASE_URL"),
Model: os.Getenv("ENNO_MODEL"),
})
if err != nil {
panic(err)
}
agent, err := enno.NewAgent(enno.Config{
Provider: provider,
SystemPrompt: "Follow the application-provided sections below.",
SystemPromptSections: []enno.SystemPromptSection{
{Name: "Identity", Content: "You are a helpful coding agent."},
{Name: "Output Style", Content: "Be concise and concrete."},
},
BuiltinTools: enno.BuiltinTools{
TaskGraph: &enno.TaskGraphTool{Root: ".", Timeout: 120 * time.Second},
Filesystem: &enno.FilesystemTool{Root: "."},
Grep: &enno.GrepTool{Root: "."},
Glob: &enno.GlobTool{Root: "."},
FetchURL: &enno.FetchURLTool{Timeout: 30 * time.Second},
},
})
if err != nil {
panic(err)
}
session := &enno.Session{}
result, err := agent.Run(context.Background(), session, "List the files in this workspace.")
if err != nil {
panic(err)
}
fmt.Println(result.Content)
}enno/
agent.go core Agent loop
run_result.go detailed run result types
session.go explicit conversation state
stream.go streaming interfaces and events
request_options.go provider-neutral request options
hooks.go lifecycle control hooks
policy.go loop policies
config.go Agent configuration
message.go provider-neutral messages
tool.go tool declaration and execution API
provider_iface.go provider interface
provider/openai OpenAI-compatible provider
provider/anthropic Anthropic provider
provider/internal provider-shared helpers
setup registers built-in tool builders (blank-import)
builtintools built-in tool implementations
prompt SDK runtime prompt helpers
examples SDK usage examples
docs design, usage, release, and migration docs
See:
make help
make test
make verifymake verify formats code, tidies modules, and runs all SDK tests.
- Avoid enabling
enno.ShellToolin production without sandboxing. - Always configure
enno.FilesystemToolwith a restricted root directory. - Do not hard-code API keys in source code.
- Use separate
Sessionvalues for independent conversations.
Enno is released under the MIT License.