Spaces:
Running
Running
Update backend/server.py
Browse files- backend/server.py +15 -22
backend/server.py
CHANGED
|
@@ -369,23 +369,18 @@ def _has_complete_marker_sequence(ai_text_full: str, expected_paras: int) -> boo
|
|
| 369 |
|
| 370 |
def _build_ai_prompt_packet_custom(target_lang: str, original_text_full: str, prompt_editable: str, is_retry: bool = False) -> tuple[str, List[str]]:
|
| 371 |
lang = _normalize_lang(target_lang)
|
| 372 |
-
style_prompt = (prompt_editable or "").strip()
|
| 373 |
-
if not style_prompt:
|
| 374 |
-
style_prompt = (
|
| 375 |
-
getattr(core, "ai_prompt_user_default",
|
| 376 |
-
lambda _l, _m=None: "")(lang)
|
| 377 |
-
or ""
|
| 378 |
-
).strip()
|
| 379 |
|
| 380 |
base = (getattr(core, "AI_PROMPT_SYSTEM_BASE", "") or "").strip()
|
| 381 |
-
|
| 382 |
-
|
| 383 |
-
|
| 384 |
-
|
| 385 |
-
|
|
|
|
|
|
|
|
|
|
| 386 |
|
| 387 |
contract_parts: List[str] = [
|
| 388 |
-
"Follow the user's StylePrompt as hard constraints (unless it would break marker rules).",
|
| 389 |
"Output ONLY the translated text (no JSON, no markdown, no extra commentary).",
|
| 390 |
"Markers: Keep every paragraph marker like <<TP_P0>> unchanged and in order. Do not remove, rename, or add markers.",
|
| 391 |
"For each marker, output the marker followed by that paragraph's translated text.",
|
|
@@ -396,12 +391,10 @@ def _build_ai_prompt_packet_custom(target_lang: str, original_text_full: str, pr
|
|
| 396 |
)
|
| 397 |
|
| 398 |
system_text = "\n\n".join(
|
| 399 |
-
[p for p in [base, style, "\n".join(contract_parts)] if p]
|
|
|
|
| 400 |
|
| 401 |
-
user_parts: List[str] = []
|
| 402 |
-
if style_prompt:
|
| 403 |
-
user_parts.append("StylePrompt:\n" + style_prompt)
|
| 404 |
-
user_parts.append("Input:\n" + str(original_text_full or ""))
|
| 405 |
return system_text, user_parts
|
| 406 |
|
| 407 |
def ai_translate_text(original_text_full: str, target_lang: str, ai: AiConfig, is_retry: bool = False) -> dict:
|
|
@@ -977,6 +970,7 @@ async def ai_resolve(payload: Dict[str, Any]):
|
|
| 977 |
api_key = str(payload.get('api_key') or '').strip() or (
|
| 978 |
os.getenv('AI_API_KEY') or '').strip()
|
| 979 |
lang = _normalize_lang(str(payload.get('lang') or 'en'))
|
|
|
|
| 980 |
if not api_key:
|
| 981 |
return {
|
| 982 |
'ok': False,
|
|
@@ -985,7 +979,7 @@ async def ai_resolve(payload: Dict[str, Any]):
|
|
| 985 |
'default_model': '',
|
| 986 |
'models': [],
|
| 987 |
'lang': lang,
|
| 988 |
-
'prompt_editable_default':
|
| 989 |
}
|
| 990 |
|
| 991 |
provider = core._canonical_provider(str(payload.get('provider') or 'auto'))
|
|
@@ -1076,8 +1070,7 @@ async def ai_resolve(payload: Dict[str, Any]):
|
|
| 1076 |
if models and resolved_model not in models:
|
| 1077 |
resolved_model = models[0]
|
| 1078 |
|
| 1079 |
-
prompt_default =
|
| 1080 |
-
lambda _l: '')(lang) or '').strip()
|
| 1081 |
|
| 1082 |
return {
|
| 1083 |
'ok': True,
|
|
@@ -1107,7 +1100,7 @@ async def ai_prompt_default(lang: str = 'en'):
|
|
| 1107 |
return {
|
| 1108 |
'ok': True,
|
| 1109 |
'lang': l,
|
| 1110 |
-
'prompt_editable_default':
|
| 1111 |
'lang_style': style,
|
| 1112 |
'system_base': base,
|
| 1113 |
'contract': contract,
|
|
|
|
| 369 |
|
| 370 |
def _build_ai_prompt_packet_custom(target_lang: str, original_text_full: str, prompt_editable: str, is_retry: bool = False) -> tuple[str, List[str]]:
|
| 371 |
lang = _normalize_lang(target_lang)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 372 |
|
| 373 |
base = (getattr(core, "AI_PROMPT_SYSTEM_BASE", "") or "").strip()
|
| 374 |
+
|
| 375 |
+
style = (prompt_editable or "").strip()
|
| 376 |
+
if not style:
|
| 377 |
+
style = (
|
| 378 |
+
(getattr(core, "AI_LANG_STYLE", {}) or {}).get(lang)
|
| 379 |
+
or (getattr(core, "AI_LANG_STYLE", {}) or {}).get("default")
|
| 380 |
+
or ""
|
| 381 |
+
).strip()
|
| 382 |
|
| 383 |
contract_parts: List[str] = [
|
|
|
|
| 384 |
"Output ONLY the translated text (no JSON, no markdown, no extra commentary).",
|
| 385 |
"Markers: Keep every paragraph marker like <<TP_P0>> unchanged and in order. Do not remove, rename, or add markers.",
|
| 386 |
"For each marker, output the marker followed by that paragraph's translated text.",
|
|
|
|
| 391 |
)
|
| 392 |
|
| 393 |
system_text = "\n\n".join(
|
| 394 |
+
[p for p in [base, style, "\n".join(contract_parts)] if p]
|
| 395 |
+
)
|
| 396 |
|
| 397 |
+
user_parts: List[str] = ["Input:\n" + str(original_text_full or "")]
|
|
|
|
|
|
|
|
|
|
| 398 |
return system_text, user_parts
|
| 399 |
|
| 400 |
def ai_translate_text(original_text_full: str, target_lang: str, ai: AiConfig, is_retry: bool = False) -> dict:
|
|
|
|
| 970 |
api_key = str(payload.get('api_key') or '').strip() or (
|
| 971 |
os.getenv('AI_API_KEY') or '').strip()
|
| 972 |
lang = _normalize_lang(str(payload.get('lang') or 'en'))
|
| 973 |
+
style_default = ((getattr(core, 'AI_LANG_STYLE', {}) or {}).get(lang) or (getattr(core, 'AI_LANG_STYLE', {}) or {}).get('default') or '').strip()
|
| 974 |
if not api_key:
|
| 975 |
return {
|
| 976 |
'ok': False,
|
|
|
|
| 979 |
'default_model': '',
|
| 980 |
'models': [],
|
| 981 |
'lang': lang,
|
| 982 |
+
'prompt_editable_default': style_default,
|
| 983 |
}
|
| 984 |
|
| 985 |
provider = core._canonical_provider(str(payload.get('provider') or 'auto'))
|
|
|
|
| 1070 |
if models and resolved_model not in models:
|
| 1071 |
resolved_model = models[0]
|
| 1072 |
|
| 1073 |
+
prompt_default = style_default
|
|
|
|
| 1074 |
|
| 1075 |
return {
|
| 1076 |
'ok': True,
|
|
|
|
| 1100 |
return {
|
| 1101 |
'ok': True,
|
| 1102 |
'lang': l,
|
| 1103 |
+
'prompt_editable_default': style,
|
| 1104 |
'lang_style': style,
|
| 1105 |
'system_base': base,
|
| 1106 |
'contract': contract,
|