优化重试机制
This commit is contained in:
@@ -32,9 +32,10 @@ class AgentResultError(ValueError):
|
|||||||
class PartialAgentResultError(ValueError):
|
class PartialAgentResultError(ValueError):
|
||||||
"""一个特殊的异常,用于表示结果不完整但包含了部分成功的数据,以便触发重试。该错误不计入总错误数"""
|
"""一个特殊的异常,用于表示结果不完整但包含了部分成功的数据,以便触发重试。该错误不计入总错误数"""
|
||||||
|
|
||||||
def __init__(self, message, partial_result: dict):
|
def __init__(self, message, partial_result: dict,append_prompt:str=None):
|
||||||
super().__init__(message)
|
super().__init__(message)
|
||||||
self.partial_result = partial_result
|
self.partial_result = partial_result
|
||||||
|
self.append_prompt=append_prompt
|
||||||
|
|
||||||
|
|
||||||
@dataclass(kw_only=True)
|
@dataclass(kw_only=True)
|
||||||
@@ -327,6 +328,8 @@ class Agent:
|
|||||||
self.logger.error(f"收到部分返回结果,将尝试重试: {e}")
|
self.logger.error(f"收到部分返回结果,将尝试重试: {e}")
|
||||||
current_partial_result = e.partial_result
|
current_partial_result = e.partial_result
|
||||||
should_retry = True
|
should_retry = True
|
||||||
|
if e.append_prompt:
|
||||||
|
prompt+=e.append_prompt
|
||||||
# is_hard_error 保持 False
|
# is_hard_error 保持 False
|
||||||
|
|
||||||
# 捕获硬错误
|
# 捕获硬错误
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ class SegmentsTranslateAgentConfig(AgentConfig):
|
|||||||
to_lang: str
|
to_lang: str
|
||||||
custom_prompt: str | None = None
|
custom_prompt: str | None = None
|
||||||
glossary_dict: dict[str, str] | None = None
|
glossary_dict: dict[str, str] | None = None
|
||||||
json_format:bool = True
|
json_format:bool = False
|
||||||
|
|
||||||
|
|
||||||
class SegmentsTranslateAgent(Agent):
|
class SegmentsTranslateAgent(Agent):
|
||||||
@@ -147,8 +147,9 @@ class SegmentsTranslateAgent(Agent):
|
|||||||
for key in missing_keys:
|
for key in missing_keys:
|
||||||
final_chunk[key] = str(original_chunk[key])
|
final_chunk[key] = str(original_chunk[key])
|
||||||
|
|
||||||
|
|
||||||
# 抛出自定义异常,将部分结果和错误信息一起传递出去
|
# 抛出自定义异常,将部分结果和错误信息一起传递出去
|
||||||
raise PartialAgentResultError("键不匹配,触发重试", partial_result=final_chunk)
|
raise PartialAgentResultError("键不匹配,触发重试", partial_result=final_chunk,append_prompt=f"\nThe following keys must be included:{','.join(sorted(list(missing_keys)))}")
|
||||||
|
|
||||||
# 如果键完全匹配(理想情况),正常返回
|
# 如果键完全匹配(理想情况),正常返回
|
||||||
for key, value in repaired_result.items():
|
for key, value in repaired_result.items():
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ class TXTTranslatorConfig(AiTranslatorConfig):
|
|||||||
"""
|
"""
|
||||||
insert_mode: Literal["replace", "append", "prepend"] = "replace"
|
insert_mode: Literal["replace", "append", "prepend"] = "replace"
|
||||||
separator: str = "\n"
|
separator: str = "\n"
|
||||||
segment_mode: Literal["line", "paragraph"] = "line"
|
segment_mode: Literal["line", "paragraph", "none"] = "line"
|
||||||
|
|
||||||
|
|
||||||
class TXTTranslator(AiTranslator):
|
class TXTTranslator(AiTranslator):
|
||||||
@@ -91,8 +91,10 @@ class TXTTranslator(AiTranslator):
|
|||||||
|
|
||||||
if self.segment_mode == "line":
|
if self.segment_mode == "line":
|
||||||
return self._segment_by_line(txt_content)
|
return self._segment_by_line(txt_content)
|
||||||
else: # paragraph mode
|
elif self.segment_mode == "paragraph": # paragraph mode
|
||||||
return self._segment_by_paragraph(txt_content)
|
return self._segment_by_paragraph(txt_content)
|
||||||
|
else:
|
||||||
|
return [txt_content]
|
||||||
|
|
||||||
def _segment_by_line(self, txt_content: str) -> List[str]:
|
def _segment_by_line(self, txt_content: str) -> List[str]:
|
||||||
"""
|
"""
|
||||||
@@ -153,8 +155,10 @@ class TXTTranslator(AiTranslator):
|
|||||||
"""
|
"""
|
||||||
if self.segment_mode == "line":
|
if self.segment_mode == "line":
|
||||||
return self._reconstruct_by_line(translated_texts, original_texts)
|
return self._reconstruct_by_line(translated_texts, original_texts)
|
||||||
else: # paragraph mode
|
elif self.segment_mode == "paragraph": # paragraph mode
|
||||||
return self._reconstruct_by_paragraph(translated_texts, original_texts)
|
return self._reconstruct_by_paragraph(translated_texts, original_texts)
|
||||||
|
else:
|
||||||
|
return self._reconstruct_none(translated_texts, original_texts)
|
||||||
|
|
||||||
def _reconstruct_by_line(self, translated_texts: List[str], original_lines: List[str]) -> bytes:
|
def _reconstruct_by_line(self, translated_texts: List[str], original_lines: List[str]) -> bytes:
|
||||||
"""
|
"""
|
||||||
@@ -230,6 +234,36 @@ class TXTTranslator(AiTranslator):
|
|||||||
|
|
||||||
return "\n".join(result_lines).encode('utf-8')
|
return "\n".join(result_lines).encode('utf-8')
|
||||||
|
|
||||||
|
def _reconstruct_none(self, translated_texts: List[str], original_texts: List[str]) -> bytes:
|
||||||
|
"""
|
||||||
|
不分段模式重建文档。
|
||||||
|
|
||||||
|
Args:
|
||||||
|
translated_texts (List[str]): 翻译后的文本列表(应只包含一个元素)
|
||||||
|
original_texts (List[str]): 原始文本列表(应只包含一个元素)
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bytes: 重建的文档内容
|
||||||
|
"""
|
||||||
|
if not translated_texts or not original_texts:
|
||||||
|
return b""
|
||||||
|
|
||||||
|
original_text = original_texts[0]
|
||||||
|
translated_text = translated_texts[0]
|
||||||
|
|
||||||
|
# 根据插入模式处理
|
||||||
|
if self.insert_mode == "replace":
|
||||||
|
result_text = translated_text
|
||||||
|
elif self.insert_mode == "append":
|
||||||
|
result_text = original_text + self.separator + translated_text
|
||||||
|
elif self.insert_mode == "prepend":
|
||||||
|
result_text = translated_text + self.separator + original_text
|
||||||
|
else:
|
||||||
|
self.logger.error(f"不正确的insert_mode参数: '{self.insert_mode}'")
|
||||||
|
result_text = translated_text
|
||||||
|
|
||||||
|
return result_text.encode('utf-8')
|
||||||
|
|
||||||
def translate(self, document: Document) -> Self:
|
def translate(self, document: Document) -> Self:
|
||||||
"""
|
"""
|
||||||
同步翻译TXT文档。
|
同步翻译TXT文档。
|
||||||
|
|||||||
Reference in New Issue
Block a user