1
1
using Mikoto . Helpers . Network ;
2
2
using Mikoto . Translators . Interfaces ;
3
3
using System . Net . Http ;
4
+ using System . Text ;
4
5
using System . Text . Json ;
5
6
using System . Windows ;
6
7
@@ -17,102 +18,126 @@ private ChatGPTTranslator() { }
17
18
public static readonly string SIGN_UP_URL = "https://platform.openai.com" ;
18
19
public static readonly string BILL_URL = "https://platform.openai.com/account/usage" ;
19
20
public static readonly string DOCUMENT_URL = "https://platform.openai.com/docs/introduction/overview" ;
20
-
21
+
21
22
private string ? openai_model = "gpt-3.5-turbo" ;
22
- private string ? apiKey ; //ChatGPT翻译API的密钥
23
- private string ? apiUrl ; //ChatGPT翻译API的URL
24
- private string errorInfo = string . Empty ; //错误信息
23
+ private string ? apiKey ; // ChatGPT 翻译 API 的密钥
24
+ private string ? apiUrl ; // ChatGPT 翻译 API 的 URL
25
+ private string lastErrorMessage = string . Empty ;
25
26
26
- public string TranslatorDisplayName { get { return Application . Current . Resources [ "ChatGPTTranslator" ] . ToString ( ) ! ; } }
27
+ public string TranslatorDisplayName => Application . Current . Resources [ "ChatGPTTranslator" ] ? . ToString ( ) ?? "ChatGPT Translator" ;
27
28
28
29
public string GetLastError ( )
29
30
{
30
- return errorInfo ;
31
+ return lastErrorMessage ;
31
32
}
32
33
33
34
public async Task < string ? > TranslateAsync ( string sourceText , string desLang , string srcLang )
34
35
{
35
- string q = sourceText ;
36
-
37
- if ( sourceText == "" || desLang == "" || srcLang == "" )
36
+ // 参数校验
37
+ if ( string . IsNullOrWhiteSpace ( sourceText ) || string . IsNullOrWhiteSpace ( desLang ) || string . IsNullOrWhiteSpace ( srcLang ) )
38
38
{
39
- errorInfo = "Param Missing" ;
39
+ SetError ( "Missing required parameters." ) ;
40
40
return null ;
41
41
}
42
- string retString ;
43
- string jsonParam = $ "{{\" model\" : \" { openai_model } \" ,\" messages\" : [{{\" role\" : \" system\" , \" content\" : \" Translate { srcLang } To { desLang } \" }},{{\" role\" : \" user\" , \" content\" : \" { q } \" }}]}}";
42
+
43
+ var requestPayload = new
44
+ {
45
+ model = openai_model ,
46
+ messages = new [ ]
47
+ {
48
+ new { role = "system" , content = $ "Translate { srcLang } To { desLang } " } ,
49
+ new { role = "user" , content = sourceText }
50
+ }
51
+ } ;
52
+
53
+ string jsonParam = JsonSerializer . Serialize ( requestPayload , TranslatorCommon . JsonSerializerOptions ) ;
44
54
var hc = CommonHttpClient . Instance ;
45
- var req = new StringContent ( jsonParam , null , "application/json" ) ;
55
+ var req = new StringContent ( jsonParam , Encoding . UTF8 , "application/json" ) ;
46
56
hc . DefaultRequestHeaders . Authorization = new System . Net . Http . Headers . AuthenticationHeaderValue ( "Bearer" , apiKey ) ;
57
+
47
58
try
48
59
{
49
- HttpResponseMessage ? httpResponseMessage = await hc . PostAsync ( apiUrl , req ) ;
50
- retString = await httpResponseMessage . Content . ReadAsStringAsync ( ) ;
60
+ using HttpResponseMessage httpResponseMessage = await hc . PostAsync ( apiUrl , req ) ;
61
+
62
+ // 检查 HTTP 状态码
63
+ if ( ! httpResponseMessage . IsSuccessStatusCode )
64
+ {
65
+ string errorContent = await httpResponseMessage . Content . ReadAsStringAsync ( ) ;
66
+ HandleApiError ( errorContent ) ;
67
+ return null ;
68
+ }
69
+
70
+ string responseString = await httpResponseMessage . Content . ReadAsStringAsync ( ) ;
71
+
72
+ // 解析 API 响应
73
+ if ( JsonSerializer . Deserialize < ChatResponse > ( responseString , TranslatorCommon . JsonSerializerOptions ) is { } oinfo )
74
+ {
75
+ return oinfo . choices . FirstOrDefault ( ) . message . content ?? HandleUnknownError ( responseString ) ;
76
+ }
77
+
78
+ return HandleUnknownError ( responseString ) ;
51
79
}
52
80
catch ( HttpRequestException ex )
53
81
{
54
- errorInfo = ex . Message ;
82
+ SetError ( $ "Network error: { ex . Message } " ) ;
55
83
return null ;
56
84
}
57
85
catch ( TaskCanceledException ex )
58
86
{
59
- errorInfo = ex . Message ;
87
+ SetError ( $ "Request timeout: { ex . Message } " ) ;
60
88
return null ;
61
89
}
62
- finally
63
- {
64
- req . Dispose ( ) ;
65
- }
66
-
67
- ChatResponse oinfo ;
68
-
69
- try
90
+ catch ( Exception ex )
70
91
{
71
- oinfo = JsonSerializer . Deserialize < ChatResponse > ( retString , TranslatorCommon . JsonSerializerOptions ) ;
72
- }
73
- catch
74
- {
75
- errorInfo = "JsonConvert Error" ;
92
+ SetError ( $ "Unexpected error: { ex . Message } ") ;
76
93
return null ;
77
94
}
78
-
79
- try
80
- {
81
- return oinfo . choices [ 0 ] . message . content ;
82
- }
83
- catch
84
- {
85
- try
86
- {
87
- var err = JsonSerializer . Deserialize < ChatResErr > ( retString , TranslatorCommon . JsonSerializerOptions ) ;
88
- errorInfo = err . error . message ;
89
- return null ;
90
- }
91
- catch
92
- {
93
- errorInfo = "Unknown error" ;
94
- return null ;
95
- }
96
- }
97
95
}
98
96
99
97
public static ITranslator TranslatorInit ( params string [ ] param )
100
98
{
101
99
if ( param . Length < 3 )
102
100
throw new ArgumentException ( "Expected 3 parameters: API Key, API URL, Model" ) ;
103
101
104
-
105
- ChatGPTTranslator chatGPTTranslator = new ( )
102
+ return new ChatGPTTranslator
106
103
{
107
104
apiKey = param [ 0 ] ,
108
105
apiUrl = param [ 1 ] ,
109
106
openai_model = param [ 2 ] ,
110
107
} ;
111
- return chatGPTTranslator ;
108
+ }
109
+
110
+ private void SetError ( string message )
111
+ {
112
+ lastErrorMessage = message ;
113
+ }
114
+
115
+ private string ? HandleUnknownError ( string response )
116
+ {
117
+ SetError ( $ "Unknown API response: { response } ") ;
118
+ return null ;
119
+ }
120
+
121
+ private void HandleApiError ( string errorContent )
122
+ {
123
+ try
124
+ {
125
+ if ( JsonSerializer . Deserialize < ChatResErr > ( errorContent , TranslatorCommon . JsonSerializerOptions ) is ChatResErr err && err . error . code != null )
126
+ {
127
+ SetError ( err . error . message ) ;
128
+ }
129
+ else
130
+ {
131
+ HandleUnknownError ( errorContent ) ;
132
+ }
133
+ }
134
+ catch
135
+ {
136
+ HandleUnknownError ( errorContent ) ;
137
+ }
112
138
}
113
139
}
114
140
115
- #pragma warning disable 0649
116
141
public struct ChatResponse
117
142
{
118
143
public string id ;
@@ -156,3 +181,4 @@ public struct ChatError
156
181
public object code ;
157
182
}
158
183
}
184
+
0 commit comments