Files
yoyo/internal/provider/provider.go

109 lines
2.7 KiB
Go
Raw Normal View History

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
}