home / skills / lookatitude / beluga-ai / go-interfaces
This skill helps design Go interfaces with registry, middleware, and hooks for Beluga AI v2, enabling extensible contracts and runtime customization.
npx playbooks add skill lookatitude/beluga-ai --skill go-interfacesReview the files below or copy the command above to add this skill to your agents.
---
name: go-interfaces
description: Go interface design with registry, middleware, and hooks for Beluga AI v2. Use when creating interfaces, extension contracts, or adding hooks/middleware.
---
# Go Interface Design
## Extension Contract (4 parts)
### 1. Interface (small, 1-4 methods)
```go
type ChatModel interface {
Generate(ctx context.Context, msgs []schema.Message, opts ...GenerateOption) (*schema.AIMessage, error)
Stream(ctx context.Context, msgs []schema.Message, opts ...GenerateOption) iter.Seq2[schema.StreamChunk, error]
BindTools(tools []tool.Tool) ChatModel
ModelID() string
}
```
### 2. Hooks (all fields optional, nil = skip)
```go
type Hooks struct {
BeforeGenerate func(ctx context.Context, msgs []schema.Message) (context.Context, []schema.Message, error)
AfterGenerate func(ctx context.Context, resp *schema.AIMessage, err error) (*schema.AIMessage, error)
OnError func(ctx context.Context, err error) error
}
func ComposeHooks(hooks ...Hooks) Hooks { /* chain: each receives output of previous */ }
```
### 3. Middleware: `func(T) T`
```go
type Middleware func(ChatModel) ChatModel
func ApplyMiddleware(model ChatModel, mws ...Middleware) ChatModel {
for i := len(mws) - 1; i >= 0; i-- { model = mws[i](model) }
return model
}
```
### 4. Registry
See `go-framework` skill.
## Rules
- Accept interfaces, return structs.
- If interface > 4 methods, split it.
- Optional capabilities via type assertion: `if br, ok := r.(BatchRetriever); ok { ... }`
- Embed for composition: `type MyAgent struct { agent.BaseAgent; ... }`
- Hook naming: `Before<Action>` (modify input), `After<Action>` (modify output), `On<Event>` (observe/modify).
- Middleware applies first (outermost), hooks fire within execution.
This skill describes a compact Go interface design pattern for AI models, with a small interface, optional hooks, composable middleware, and a registry approach. It helps you build extensible, testable model adapters and agent components for Beluga AI v2 while keeping implementations minimal and orthogonal.
Define a small interface (1–4 methods) that accepts interfaces and returns concrete structs. Provide optional Hooks where nil fields are skipped, allowing pre/post processing and error observation. Wrap models with Middleware functions of type func(ChatModel) ChatModel that compose outer-to-inner. Register implementations in a registry for discovery and optional capability checks via type assertions.
Why keep interfaces small?
Small interfaces enforce separation of concerns, make mocking and testing easier, and allow optional features via additional sub-interfaces and type assertions.
How do middleware and hooks interact?
Middleware wraps the model call outer-to-inner. Within execution, hooks run: Before* can modify inputs, After* can modify outputs, and On* observes errors. ComposeHooks chains hooks so each receives the prior output.