@@ -91,6 +91,7 @@ async function handleAiRequest(request, config) {
9191 try {
9292 const payload = await request . json ( ) ;
9393 const article = normalizeAiArticlePayload ( payload ) ;
94+ const isChineseArticle = hasChineseText ( article . title ) ;
9495 const upstream = await fetch ( `${ aiConfig . baseUrl } /responses` , {
9596 method : "POST" ,
9697 headers : {
@@ -99,7 +100,7 @@ async function handleAiRequest(request, config) {
99100 } ,
100101 body : JSON . stringify ( {
101102 model : aiConfig . model ,
102- instructions : buildAiInstructions ( ) ,
103+ instructions : buildAiInstructions ( isChineseArticle ) ,
103104 input : buildAiInput ( article ) ,
104105 max_output_tokens : aiConfig . maxOutputTokens ,
105106 store : false ,
@@ -160,19 +161,30 @@ function normalizeAiArticlePayload(payload) {
160161 } ;
161162}
162163
163- function buildAiInstructions ( ) {
164- return [
164+ function buildAiInstructions ( isChineseArticle ) {
165+ const sharedRules = [
165166 "你是 RSS 阅读器内置的中文阅读助手。" ,
166- "先判断文章主要语言。" ,
167- "如果文章主要语言是中文,只输出少量中文总结,不要翻译。" ,
168- "如果文章主要语言不是中文,先输出少量中文总结,再输出全文简体中文翻译。" ,
169- "非中文文章的总结要短,只保留 3 到 5 个核心要点;全文翻译必须覆盖原文正文,不要只概括,不要省略主要段落。" ,
170- "翻译要自然、准确,保留原文信息顺序、段落层次、列表关系和必要术语。" ,
171167 "输出必须是可直接插入页面的 HTML 片段,不要 Markdown,不要代码围栏。" ,
172168 "只允许使用 h2、h3、p、ul、ol、li、strong、em、blockquote 标签。" ,
173- "中文文章结构:h2 标题“AI 摘要”,后面给出摘要。" ,
174- "非中文文章结构:h2 标题“AI 摘要”,后面给出短摘要;再给出 h2 标题“全文翻译”,后面给出完整翻译。" ,
175- "不要编造原文没有的信息;如果原文内容明显不完整,在摘要中简短说明。" ,
169+ "不要编造原文没有的信息;如果原文内容明显不完整,简短说明。" ,
170+ ] ;
171+
172+ if ( isChineseArticle ) {
173+ return [
174+ ...sharedRules ,
175+ "这篇文章的标题包含中文字符,按中文文章处理。" ,
176+ "任务:只输出简体中文摘要,不要翻译正文,不要输出全文改写。" ,
177+ "结构:先给出 h2 标题“AI 摘要”,后面用 3 到 7 个要点或短段落概括核心事实、背景、结论和不确定性。" ,
178+ ] . join ( "\n" ) ;
179+ }
180+
181+ return [
182+ ...sharedRules ,
183+ "这篇文章的标题不包含中文字符,按非中文文章处理。" ,
184+ "任务:只输出全文简体中文翻译,不要输出摘要,不要输出要点,不要评价文章。" ,
185+ "结构:先给出 h2 标题“全文翻译”,后面给出完整翻译。" ,
186+ "翻译必须覆盖原文正文,不要只概括,不要省略主要段落。" ,
187+ "翻译要自然、准确,保留原文信息顺序、段落层次、列表关系和必要术语。" ,
176188 ] . join ( "\n" ) ;
177189}
178190
@@ -206,6 +218,10 @@ function extractResponseText(result) {
206218 . trim ( ) ;
207219}
208220
221+ function hasChineseText ( value ) {
222+ return / [ \u3400 - \u4dbf \u4e00 - \u9fff \uf900 - \ufaff ] / u. test ( String ( value || "" ) ) ;
223+ }
224+
209225function normalizeBaseUrl ( value ) {
210226 const url = new URL ( String ( value || DEFAULT_AI_BASE_URL ) ) ;
211227 url . pathname = url . pathname . replace ( / \/ + $ / , "" ) ;
0 commit comments