provider-implementation
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseProvider Implementation
Provider 实现
Checklist
检查清单
- Implement the full interface (ChatModel, Embedder, VectorStore, STT, TTS, etc.).
- Register via with parent package's
init().Register() - Map provider errors to with correct ErrorCode.
core.Error - Support context cancellation.
- Include token/usage metrics where applicable.
- Compile-time check: .
var _ Interface = (*Impl)(nil) - Unit tests with mocked HTTP responses (httptest).
- 实现完整的接口(ChatModel、Embedder、VectorStore、STT、TTS等)。
- 通过父包的方法,在
Register()中完成注册。init() - 将Provider错误映射为带有正确ErrorCode的。
core.Error - 支持上下文取消(context cancellation)。
- 适用时包含token/使用量指标。
- 编译时检查:。
var _ Interface = (*Impl)(nil) - 使用模拟HTTP响应(httptest)编写单元测试。
File Structure
文件结构
llm/providers/openai/
├── openai.go # Implementation + New() + init()
├── stream.go # Streaming
├── errors.go # Error mapping
├── openai_test.go # Tests
└── testdata/ # Recorded HTTP responsesllm/providers/openai/
├── openai.go # 实现代码 + New() + init()
├── stream.go # 流式处理
├── errors.go # 错误映射
├── openai_test.go # 测试代码
└── testdata/ # 录制的HTTP响应Template
模板
go
var _ llm.ChatModel = (*Model)(nil)
func init() {
llm.Register("openai", func(cfg llm.ProviderConfig) (llm.ChatModel, error) { return New(cfg) })
}
func New(cfg llm.ProviderConfig) (*Model, error) {
if cfg.APIKey == "" { return nil, &core.Error{Op: "openai.new", Code: core.ErrAuth, Message: "API key required"} }
return &Model{client: newClient(cfg.APIKey, cfg.BaseURL), model: cfg.Model}, nil
}
func (m *Model) Stream(ctx context.Context, msgs []schema.Message, opts ...llm.GenerateOption) iter.Seq2[schema.StreamChunk, error] {
return func(yield func(schema.StreamChunk, error) bool) { /* stream implementation */ }
}go
var _ llm.ChatModel = (*Model)(nil)
func init() {
llm.Register("openai", func(cfg llm.ProviderConfig) (llm.ChatModel, error) { return New(cfg) })
}
func New(cfg llm.ProviderConfig) (*Model, error) {
if cfg.APIKey == "" { return nil, &core.Error{Op: "openai.new", Code: core.ErrAuth, Message: "API key required"} }
return &Model{client: newClient(cfg.APIKey, cfg.BaseURL), model: cfg.Model}, nil
}
func (m *Model) Stream(ctx context.Context, msgs []schema.Message, opts ...llm.GenerateOption) iter.Seq2[schema.StreamChunk, error] {
return func(yield func(schema.StreamChunk, error) bool) { /* 流式处理实现 */ }
}Error Mapping
错误映射
go
switch apiErr.StatusCode {
case 401: code = core.ErrAuth
case 429: code = core.ErrRateLimit
case 408, 504: code = core.ErrTimeout
case 400: code = core.ErrInvalidInput
}See for provider categories and priorities.
docs/providers.mdgo
switch apiErr.StatusCode {
case 401: code = core.ErrAuth
case 429: code = core.ErrRateLimit
case 408, 504: code = core.ErrTimeout
case 400: code = core.ErrInvalidInput
}请查看了解Provider的分类和优先级。
docs/providers.md