File size: 2,666 Bytes
d04144c
 
 
a1e4405
d04144c
775cbe6
 
 
 
 
 
 
d04144c
a1e4405
d04144c
a1e4405
d04144c
 
 
 
a1e4405
d04144c
9e95393
 
 
a1e4405
9e95393
775cbe6
d04144c
9e95393
 
 
775cbe6
 
 
 
a1e4405
d04144c
 
a1e4405
 
 
 
9e95393
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
775cbe6
 
 
9e95393
 
 
a1e4405
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
from __future__ import annotations

from dataclasses import dataclass
from typing import Iterable, Mapping

from .hf_client import (
    HF_CHAT_API_ADVERSARIAL,
    HF_CHAT_API_CONSTRUCTIVE,
    HF_CHAT_API_EVIDENCE,
    HF_MODEL_4B,
    HF_MODEL_8B,
)
from .japanese_skills import JapaneseShortQASkillPack
from .runtime_factory import InternalRuntimeDependencies, build_internal_core
from .service import CustomerAIWork


@dataclass(frozen=True)
class RuntimeDependencies:
    live_state_provider: object
    japanese_alias_registry: Mapping[str, Iterable[str]]
    japanese_fuzzy_threshold: float
    canonical_store: object | None = None
    kb_snapshot_path: str | None = None
    kb_generation_id: str | None = None
    hf_token: str | None = None
    role_pool: object | None = None
    shared_head: object | None = None
    max_targeted_retry: int = 1
    constructive_model_id: str = HF_MODEL_4B
    adversarial_model_id: str = HF_MODEL_4B
    evidence_model_id: str = HF_MODEL_8B
    constructive_api_url: str = HF_CHAT_API_CONSTRUCTIVE
    adversarial_api_url: str = HF_CHAT_API_ADVERSARIAL
    evidence_api_url: str = HF_CHAT_API_EVIDENCE
    timeout_seconds: float = 300.0


def build_work(deps: RuntimeDependencies) -> CustomerAIWork:
    if not (0.0 <= float(deps.japanese_fuzzy_threshold) <= 100.0):
        raise ValueError("japanese_fuzzy_threshold_out_of_range")
    if not isinstance(deps.max_targeted_retry, int) or deps.max_targeted_retry < 0:
        raise ValueError("max_targeted_retry_invalid")
    japanese = JapaneseShortQASkillPack(
        alias_registry=deps.japanese_alias_registry,
        fuzzy_threshold=float(deps.japanese_fuzzy_threshold),
    )
    injected_pool = deps.role_pool if deps.role_pool is not None else deps.shared_head
    core = build_internal_core(
        InternalRuntimeDependencies(
            canonical_store=deps.canonical_store,
            kb_snapshot_path=deps.kb_snapshot_path,
            kb_generation_id=deps.kb_generation_id,
            live_state_provider=deps.live_state_provider,
            japanese_skill_pack=japanese,
            hf_token=deps.hf_token,
            role_pool=injected_pool,
            max_targeted_retry=deps.max_targeted_retry,
            constructive_model_id=deps.constructive_model_id,
            adversarial_model_id=deps.adversarial_model_id,
            evidence_model_id=deps.evidence_model_id,
            constructive_api_url=deps.constructive_api_url,
            adversarial_api_url=deps.adversarial_api_url,
            evidence_api_url=deps.evidence_api_url,
            timeout_seconds=deps.timeout_seconds,
        )
    )
    return CustomerAIWork(core)