Core Interfaces
Rule: All interfaces have 1-3 methods and follow the
-ersuffix convention. Rule: Every I/O method acceptsctx context.Contextas its first parameter. Rule: Implementations satisfy interfaces — never depend on concrete types.
LLM (pkg/llm/)
type ChatCompleter interface {
Chat(ctx context.Context, messages []Message) (*Response, error)
}
type StreamCompleter interface {
ChatStream(ctx context.Context, messages []Message) (<-chan Chunk, error)
}
type TokenCounter interface {
CountTokens(ctx context.Context, model, text string) (int, error)
}
One provider can implement all three interfaces. Consumers declare only what they need:
func simple(c ChatCompleter) { ... }
func withStream(c StreamCompleter) { ... }
func advanced(c ChatCompleter, t TokenCounter) { ... }
Embedding (pkg/embedding/)
type Embedder interface {
Embed(ctx context.Context, text string) ([]float64, error)
EmbedBatch(ctx context.Context, texts []string) ([][]float64, error)
}
Note:
Embedfor single texts,EmbedBatchfor bulk. Providers may batch API calls internally forEmbedBatchto reduce latency.
Vector Store (pkg/vectordb/)
type VectorSearcher interface {
Search(ctx context.Context, vector []float64, opts ...SearchOption) ([]ScoredDocument, error)
}
type VectorInserter interface {
Insert(ctx context.Context, documents []Document) error
}
type VectorDeleter interface {
Delete(ctx context.Context, ids []string) error
}
RAG indexing needs
VectorInserter. RAG querying needsVectorSearcher. Simple stores implement all three; read-only replicas might only implementVectorSearcher.
Document Loader (pkg/loader/)
type DocumentLoader interface {
Load(ctx context.Context, source string) ([]Document, error)
}
Implementations: file loader, URL loader, PDF parser, database loader.
Text Splitter (pkg/splitter/)
type TextSplitter interface {
Split(ctx context.Context, documents []Document) ([]Chunk, error)
}
Implementations: recursive character split, token-based split, semantic split.
Retriever (pkg/retriever/)
type Retriever interface {
Retrieve(ctx context.Context, query []float64, opts ...RetrieveOption) ([]ScoredDocument, error)
}
Wraps VectorSearcher with strategy: top-K, MMR, hybrid, multi-query.
Reranker (pkg/reranker/)
type Reranker interface {
Rerank(ctx context.Context, query string, documents []Document) ([]ScoredDocument, error)
}
Cross-encoder or LLM-based re-ranking for improved result quality.
Prompt Builder (pkg/prompt/)
type PromptBuilder interface {
Build(ctx context.Context, template string, context map[string]any) ([]Message, error)
}
Builds the final prompt from templates, retrieved documents, and conversation history. Supports chat message formatting (system, user, assistant roles).
Tool (pkg/tools/)
type Tool interface {
Name() string
Description() string
InputSchema() *JSONSchema
Execute(ctx context.Context, input json.RawMessage) (json.RawMessage, error)
}
LLM function calling. One tool = one function the LLM can request.
See docs/12-TOOLS.md for details.
Future Interfaces (Defined in Later Phases)
Memory (pkg/memory/) — Phase 6
type ConversationStore interface {
Append(ctx context.Context, msg Message) error
History(ctx context.Context, limit int) ([]Message, error)
}
Agent (pkg/agent/) — Phase 7
type Planner interface { ... }
type Executor interface { ... }
Workflow (pkg/workflow/) — Phase 8
type WorkflowRunner interface { ... }
Summary
| Interface | Package | Methods |
|---|---|---|
ChatCompleter |
pkg/llm/ |
Chat |
StreamCompleter |
pkg/llm/ |
ChatStream |
TokenCounter |
pkg/llm/ |
CountTokens |
Embedder |
pkg/embedding/ |
Embed, EmbedBatch |
VectorSearcher |
pkg/vectordb/ |
Search |
VectorInserter |
pkg/vectordb/ |
Insert |
VectorDeleter |
pkg/vectordb/ |
Delete |
DocumentLoader |
pkg/loader/ |
Load |
TextSplitter |
pkg/splitter/ |
Split |
Retriever |
pkg/retriever/ |
Retrieve |
Reranker |
pkg/reranker/ |
Rerank |
PromptBuilder |
pkg/prompt/ |
Build |
Tool |
pkg/tools/ |
Name, Description, InputSchema, Execute |