109 lines
2.7 KiB
Go
109 lines
2.7 KiB
Go
|
|
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
|
||
|
|
}
|