fix(health): suppress 404 when health monitor disabled + fix audit test assertion
- Sidebar.svelte: defer healthStore.refresh() until feature flags confirm health_monitor is enabled; skip entirely when disabled - health.js: remove throw error from catch block — log and return null instead, preventing 'Uncaught (in promise)' on expected 404 - test_report_audit_immutability.py: fix mock assertions — audit_service uses logger.reason/reflect/explore, not logger.info - HealthStore and Sidebar now produce zero network noise when FEATURES__HEALTH_MONITOR=false
This commit is contained in:
@@ -41,7 +41,7 @@ from ._token_budget import DEFAULT_CONTEXT_WINDOW, estimate_token_budget
|
||||
from .dictionary import DictionaryManager
|
||||
|
||||
# #region DEFAULT_EXECUTION_PROMPT_TEMPLATE [TYPE Constant]
|
||||
# @BRIEF Default prompt template for batch LLM translation execution (no context columns — faster).
|
||||
|
||||
# Supports both single-language and multi-language modes via {target_languages} placeholder.
|
||||
DEFAULT_EXECUTION_PROMPT_TEMPLATE: str = (
|
||||
"Translate the following database content from {source_language} to the following language(s): {target_languages}.\n\n"
|
||||
@@ -63,9 +63,9 @@ DEFAULT_EXECUTION_PROMPT_TEMPLATE: str = (
|
||||
)
|
||||
# #endregion DEFAULT_EXECUTION_PROMPT_TEMPLATE
|
||||
|
||||
|
||||
# #region DEFAULT_PREVIEW_PROMPT_TEMPLATE [TYPE Constant]
|
||||
# @BRIEF Default prompt template for LLM translation preview.
|
||||
# #region DEFAULT_PREVIEW_PROMPT_TEMPLATE [TYPE Constant]
|
||||
|
||||
DEFAULT_PREVIEW_PROMPT_TEMPLATE: str = (
|
||||
"Translate the following database content.\n\n"
|
||||
"Source dialect: {source_dialect}\n"
|
||||
@@ -1038,19 +1038,37 @@ class TranslationPreview:
|
||||
"Authorization": f"Bearer {api_key}",
|
||||
"Content-Type": "application/json",
|
||||
}
|
||||
# Reasoning-safe system prompt: always forbid chain-of-thought in output.
|
||||
# Reasoning models (DeepSeek, QwQ, etc.) may leak reasoning into content
|
||||
# when response_format=json_object is set. Explicit suppression in the
|
||||
# system message prevents this regardless of the disable_reasoning flag.
|
||||
system_content = (
|
||||
"You are a database content translation assistant. "
|
||||
"Translate the provided text accurately, preserving data semantics. "
|
||||
"Respond directly with ONLY the JSON result. "
|
||||
"Do NOT include any reasoning, thinking, chain-of-thought, analysis, "
|
||||
"or explanation. Output ONLY valid JSON."
|
||||
)
|
||||
|
||||
payload = {
|
||||
"model": model,
|
||||
"messages": [
|
||||
{"role": "system", "content": "You are a database content translation assistant. Translate the provided text accurately, preserving data semantics."},
|
||||
{"role": "system", "content": system_content},
|
||||
{"role": "user", "content": prompt},
|
||||
],
|
||||
"temperature": 0.1,
|
||||
"max_tokens": max_tokens,
|
||||
}
|
||||
|
||||
# Structured output — Kilo gateway supports response_format, but upstream providers
|
||||
# (e.g. StepFun) may reject it. We try with response_format and fall back on 400.
|
||||
# NOTE: Reasoning models (deepseek variants, qwen with reasoning) often break with
|
||||
# response_format=json_object, producing reasoning text instead of JSON.
|
||||
# When disable_reasoning is set, we skip response_format and rely on the
|
||||
# system prompt to enforce JSON-only output.
|
||||
if provider_type in ("openai", "openai_compatible", "kilo", "openrouter", "litellm"):
|
||||
payload["response_format"] = {"type": "json_object"}
|
||||
if not disable_reasoning:
|
||||
payload["response_format"] = {"type": "json_object"}
|
||||
|
||||
# Suppress Chain of Thought reasoning to save output tokens
|
||||
# NOTE: Kilo/OpenRouter/LiteLLM reject reasoning_effort — only use for native OpenAI-compatible
|
||||
@@ -1058,13 +1076,10 @@ class TranslationPreview:
|
||||
# Kilo/OpenRouter/LiteLLM reject reasoning_effort — only use for native OpenAI-compatible
|
||||
if provider_type not in ("kilo", "openrouter", "litellm"):
|
||||
payload["reasoning_effort"] = "none"
|
||||
payload.pop("response_format", None) # JSON mode triggers reasoning on some models
|
||||
# response_format already skipped above when disable_reasoning is True
|
||||
# Use caller-provided max_tokens instead of hardcoded 8192
|
||||
# This ensures multi-language batches with large output get enough token budget.
|
||||
payload["max_tokens"] = max_tokens
|
||||
# Universal instruction — all models understand "respond directly without reasoning"
|
||||
system_content = "You are a database content translation assistant. Translate the provided text accurately, preserving data semantics. Respond directly with ONLY the JSON result. Do NOT include any reasoning, thinking, chain-of-thought, analysis, or explanation. Output ONLY valid JSON."
|
||||
payload["messages"][0] = {"role": "system", "content": system_content}
|
||||
|
||||
logger.reason(
|
||||
f"LLM request url={base_url} model={payload.get('model')} "
|
||||
|
||||
Reference in New Issue
Block a user