feat: implement core architecture (v0.0.2)
- Implement Config class with YAML loading and environment variable support - Implement Provider interface and factory pattern - Implement SiliconFlow provider as example - Implement Translator core class with prompt management - Create CLI entry point - Add configuration template and unit tests - Update changelog and discussion records Version: 0.0.2
This commit is contained in:
108
internal/provider/provider.go
Normal file
108
internal/provider/provider.go
Normal file
@@ -0,0 +1,108 @@
|
||||
package provider
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// Provider 厂商接口
|
||||
type Provider interface {
|
||||
// Translate 调用厂商API进行翻译
|
||||
Translate(ctx context.Context, req *TranslateRequest) (*TranslateResponse, error)
|
||||
|
||||
// Name 返回厂商名称
|
||||
Name() string
|
||||
|
||||
// Validate 验证配置是否有效
|
||||
Validate() error
|
||||
}
|
||||
|
||||
// TranslateRequest 翻译请求
|
||||
type TranslateRequest struct {
|
||||
Text string `json:"text"`
|
||||
FromLang string `json:"from_lang"`
|
||||
ToLang string `json:"to_lang"`
|
||||
Prompt string `json:"prompt"`
|
||||
Model string `json:"model"`
|
||||
Options map[string]interface{} `json:"options"`
|
||||
}
|
||||
|
||||
// TranslateResponse 翻译响应
|
||||
type TranslateResponse struct {
|
||||
Text string `json:"text"`
|
||||
FromLang string `json:"from_lang"`
|
||||
ToLang string `json:"to_lang"`
|
||||
Model string `json:"model"`
|
||||
Usage *Usage `json:"usage"`
|
||||
RawResponse []byte `json:"raw_response,omitempty"`
|
||||
}
|
||||
|
||||
// Usage 用量统计
|
||||
type Usage struct {
|
||||
PromptTokens int `json:"prompt_tokens"`
|
||||
CompletionTokens int `json:"completion_tokens"`
|
||||
TotalTokens int `json:"total_tokens"`
|
||||
}
|
||||
|
||||
// ProviderConfig 厂商配置
|
||||
type ProviderConfig struct {
|
||||
APIHost string `json:"api_host"`
|
||||
APIKey string `json:"api_key"`
|
||||
Model string `json:"model"`
|
||||
}
|
||||
|
||||
// TranslateError 翻译错误
|
||||
type TranslateError struct {
|
||||
Code string `json:"code"`
|
||||
Message string `json:"message"`
|
||||
Details string `json:"details,omitempty"`
|
||||
}
|
||||
|
||||
// Error 实现error接口
|
||||
func (e *TranslateError) Error() string {
|
||||
if e.Details != "" {
|
||||
return fmt.Sprintf("%s: %s (%s)", e.Code, e.Message, e.Details)
|
||||
}
|
||||
return fmt.Sprintf("%s: %s", e.Code, e.Message)
|
||||
}
|
||||
|
||||
// NewTranslateError 创建翻译错误
|
||||
func NewTranslateError(code, message string) *TranslateError {
|
||||
return &TranslateError{
|
||||
Code: code,
|
||||
Message: message,
|
||||
}
|
||||
}
|
||||
|
||||
// NewTranslateErrorWithDetails 创建带详情的翻译错误
|
||||
func NewTranslateErrorWithDetails(code, message, details string) *TranslateError {
|
||||
return &TranslateError{
|
||||
Code: code,
|
||||
Message: message,
|
||||
Details: details,
|
||||
}
|
||||
}
|
||||
|
||||
// IsNetworkError 检查是否为网络错误
|
||||
func IsNetworkError(err error) bool {
|
||||
if translateErr, ok := err.(*TranslateError); ok {
|
||||
return translateErr.Code == "NETWORK_ERROR"
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// IsRateLimitError 检查是否为限流错误
|
||||
func IsRateLimitError(err error) bool {
|
||||
if translateErr, ok := err.(*TranslateError); ok {
|
||||
return translateErr.Code == "RATE_LIMIT"
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// IsAuthError 检查是否为认证错误
|
||||
func IsAuthError(err error) bool {
|
||||
if translateErr, ok := err.(*TranslateError); ok {
|
||||
return translateErr.Code == "AUTH_ERROR" || translateErr.Code == "INVALID_API_KEY"
|
||||
}
|
||||
return false
|
||||
}
|
||||
Reference in New Issue
Block a user