АРЧ - UI и domain loop: синхронизировать локальную LLM-модель через shared config + КВИН 3

This commit is contained in:
2026-04-15 09:15:35 +03:00
parent bc381c012e
commit 8866176be6
24 changed files with 801 additions and 73 deletions
+51 -5
View File
@@ -19,14 +19,15 @@ DEFAULT_ARTIFACTS_ROOT = REPO_ROOT / "artifacts" / "domain_runs"
DEFAULT_SESSIONS_DIR = REPO_ROOT / "llm_normalizer" / "data" / "assistant_sessions"
DEFAULT_REPORTS_DIR = REPO_ROOT / "llm_normalizer" / "reports"
DEFAULT_LOOP_SCHEMA_DIR = REPO_ROOT / "docs" / "orchestration" / "schemas"
SHARED_LLM_CONNECTION_CONFIG = REPO_ROOT / "llm_normalizer" / "data" / "shared_llm_connection.json"
DEFAULT_BACKEND_URL = "http://127.0.0.1:8787"
DEFAULT_PROMPT_VERSION = "address_query_runtime_v1"
DEFAULT_LLM_PROVIDER = "local"
DEFAULT_LLM_MODEL = "qwen2.5-14b-instruct-1m"
DEFAULT_LLM_BASE_URL = "http://127.0.0.1:1234/v1"
BASE_DEFAULT_LLM_PROVIDER = "local"
BASE_DEFAULT_LLM_MODEL = "qwen2.5-14b-instruct-1m"
BASE_DEFAULT_LLM_BASE_URL = "http://127.0.0.1:1234/v1"
DEFAULT_LLM_API_KEY = ""
DEFAULT_TEMPERATURE = 0.0
DEFAULT_MAX_OUTPUT_TOKENS = 900
BASE_DEFAULT_TEMPERATURE = 0.0
BASE_DEFAULT_MAX_OUTPUT_TOKENS = 900
TECH_SECTION_HEADER = "### technical_debug_payload_json"
SCENARIO_MANIFEST_SCHEMA_VERSION = "domain_scenario_manifest_v1"
SCENARIO_STATE_SCHEMA_VERSION = "domain_scenario_state_v1"
@@ -35,6 +36,51 @@ SCENARIO_PACK_SCHEMA_VERSION = "domain_scenario_pack_v1"
ACTIVE_DOMAIN_CONTRACT_SCHEMA_VERSION = "active_domain_contract_v1"
AUTONOMOUS_LOOP_SCHEMA_VERSION = "domain_autonomous_loop_v1"
def load_shared_local_llm_defaults(config_path: Path | None = None) -> dict[str, Any]:
defaults: dict[str, Any] = {
"llm_provider": BASE_DEFAULT_LLM_PROVIDER,
"llm_model": BASE_DEFAULT_LLM_MODEL,
"llm_base_url": BASE_DEFAULT_LLM_BASE_URL,
"temperature": BASE_DEFAULT_TEMPERATURE,
"max_output_tokens": BASE_DEFAULT_MAX_OUTPUT_TOKENS,
}
target = config_path or SHARED_LLM_CONNECTION_CONFIG
if not target.exists():
return defaults
try:
raw = json.loads(target.read_text(encoding="utf-8"))
except (OSError, json.JSONDecodeError):
return defaults
connection = raw.get("connection")
if not isinstance(connection, dict):
return defaults
if str(connection.get("llmProvider") or "").strip().lower() != "local":
return defaults
model = str(connection.get("model") or "").strip()
base_url = str(connection.get("baseUrl") or "").strip()
temperature = connection.get("temperature")
max_output_tokens = connection.get("maxOutputTokens")
if model:
defaults["llm_model"] = model
if base_url:
defaults["llm_base_url"] = base_url
if isinstance(temperature, (int, float)) and not isinstance(temperature, bool):
defaults["temperature"] = float(temperature)
if isinstance(max_output_tokens, (int, float)) and not isinstance(max_output_tokens, bool):
defaults["max_output_tokens"] = max(1, int(max_output_tokens))
return defaults
SHARED_LLM_DEFAULTS = load_shared_local_llm_defaults()
DEFAULT_LLM_PROVIDER = str(SHARED_LLM_DEFAULTS["llm_provider"])
DEFAULT_LLM_MODEL = str(SHARED_LLM_DEFAULTS["llm_model"])
DEFAULT_LLM_BASE_URL = str(SHARED_LLM_DEFAULTS["llm_base_url"])
DEFAULT_TEMPERATURE = float(SHARED_LLM_DEFAULTS["temperature"])
DEFAULT_MAX_OUTPUT_TOKENS = int(SHARED_LLM_DEFAULTS["max_output_tokens"])
TOP_LEVEL_NOISE_PATTERNS = (
re.compile(r"^(?:status|статус(?: результата)?)\b", re.IGNORECASE),
re.compile(r"^(?:что учтено|сводка)\b", re.IGNORECASE),