refactor: remove LLM from online decisions
This commit is contained in:
@@ -21,9 +21,9 @@ It currently supports:
|
||||
- `hf_discovery.py`: ModelScope model discovery and inspection (keeps the legacy module name)
|
||||
- `modelhub_client.py`: ModelHub API client and token-pool routing
|
||||
- `history_stats.py`: online history aggregation, ranking, and warnings
|
||||
- `candidate_preflight.py`: repository, memory, context, and LLM-assisted compatibility gates
|
||||
- `candidate_preflight.py`: deterministic repository, memory, context, and compatibility gates
|
||||
- `failure_taxonomy.py`: deterministic/platform/semantic failure routing
|
||||
- `llm_classifier.py`: optional cached OpenAI-compatible ambiguity classifier
|
||||
- `llm_classifier.py`: offline-only experimental ambiguity-analysis helper
|
||||
- `template_selector.py`: template lookup and GPU normalization
|
||||
- `task_registry.py`: task-type and framework selection rules
|
||||
- `tests/`: unit tests and regression coverage
|
||||
@@ -165,21 +165,18 @@ The memory gate totals the complete recursive repository and applies the same
|
||||
verifiable GPU types have evidence-backed capacities; an incomplete repository
|
||||
size is deferred instead of estimated. See `../docs/gpu-memory-capacity-2026-08-10.md`.
|
||||
|
||||
Optional Qwen review uses `MODELHUB_QWEN_ENDPOINT`, `MODELHUB_QWEN_MODEL`, and
|
||||
`MODELHUB_QWEN_API_KEY` (or `DASHSCOPE_API_KEY`). The generic
|
||||
`MODELHUB_LLM_CLASSIFIER_*` names remain supported. A root `.env` key named
|
||||
`dashscope` is loaded automatically, and the default model is `qwen3.7-flash`.
|
||||
Qwen is called only for
|
||||
unresolved architecture/remote-code semantics or ambiguous failure roots, with
|
||||
a default rolling limit of 20 calls/hour and one concurrent request. Only
|
||||
high-confidence denials block; an error, timeout, or abstention leaves the
|
||||
already-vetted candidate eligible.
|
||||
The online runner never constructs an LLM client. A DashScope key or any
|
||||
`MODELHUB_QWEN_*`/`MODELHUB_LLM_CLASSIFIER_*` environment variable cannot enable
|
||||
inference. `llm_classifier.py` remains available only for deliberately invoked,
|
||||
offline experiments whose output is reviewed before being converted into a
|
||||
deterministic rule.
|
||||
|
||||
Outcome sync also classifies a bounded set of this worker's failed-task ZIP logs.
|
||||
Hard error signatures run first; ambiguous runtime roots can use the configured
|
||||
LLM. Platform faults are excluded from long-term compatibility scores and use a
|
||||
short 30-minute breaker after three consecutive failures. Failed log downloads
|
||||
are persisted and stop after three attempts.
|
||||
Hard error signatures run first; ambiguous runtime roots remain explicitly
|
||||
unclassified and are never sent to an LLM. Platform faults are excluded from
|
||||
long-term compatibility scores and use a short 30-minute breaker after three
|
||||
consecutive failures. Failed log downloads are persisted and stop after three
|
||||
attempts.
|
||||
|
||||
## Output
|
||||
|
||||
|
||||
@@ -28,7 +28,6 @@ from market_intelligence import (
|
||||
DEFAULT_THROUGHPUT_WINDOW_HOURS,
|
||||
MarketIntelligenceManager,
|
||||
)
|
||||
from llm_classifier import DEFAULT_LLM_CACHE_PATH, LLMAssistedClassifier
|
||||
from modelhub_client import (
|
||||
DEFAULT_CAPACITY_STATE_PATH,
|
||||
ModelHubAPIError,
|
||||
@@ -142,7 +141,7 @@ def build_parser() -> argparse.ArgumentParser:
|
||||
)
|
||||
parser.add_argument(
|
||||
"--llm-classifier-cache-path",
|
||||
default=os.getenv("MODELHUB_LLM_CLASSIFIER_CACHE_PATH", str(DEFAULT_LLM_CACHE_PATH)),
|
||||
default=os.getenv("MODELHUB_LLM_CLASSIFIER_CACHE_PATH", ".modelhub_state/llm_classifications.json"),
|
||||
help=argparse.SUPPRESS,
|
||||
)
|
||||
parser.add_argument("--runs-dir", default=str(DEFAULT_RUNS_DIR), help=argparse.SUPPRESS)
|
||||
@@ -813,6 +812,9 @@ def run_submission(
|
||||
history_archive_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
outcome_tracker = outcome_tracker or OutcomeTracker(Path(args.outcomes_path))
|
||||
# Online decisions are deliberately deterministic. The optional classifier
|
||||
# module remains available for offline, human-reviewed analysis only.
|
||||
outcome_tracker.set_failure_llm_classifier(None)
|
||||
submission_exclusion_store = SubmissionExclusionStore(
|
||||
Path(getattr(args, "submission_exclusions_path", DEFAULT_SUBMISSION_EXCLUSIONS_PATH))
|
||||
)
|
||||
@@ -821,31 +823,7 @@ def run_submission(
|
||||
"MODELHUB_DISABLE_CANDIDATE_PREFLIGHT", ""
|
||||
).strip().lower() in {"1", "true", "yes"}
|
||||
if not disable_preflight:
|
||||
llm_classifier = LLMAssistedClassifier(
|
||||
endpoint=getattr(args, "llm_classifier_endpoint", None)
|
||||
or os.getenv("MODELHUB_LLM_CLASSIFIER_ENDPOINT"),
|
||||
model=getattr(args, "llm_classifier_model", None)
|
||||
or os.getenv("MODELHUB_LLM_CLASSIFIER_MODEL"),
|
||||
api_key=getattr(args, "llm_classifier_api_key", None)
|
||||
or os.getenv("MODELHUB_LLM_CLASSIFIER_API_KEY"),
|
||||
timeout_seconds=max(
|
||||
1,
|
||||
int(
|
||||
getattr(args, "llm_classifier_timeout_seconds", 0)
|
||||
or os.getenv("MODELHUB_LLM_CLASSIFIER_TIMEOUT_SECONDS", "20")
|
||||
),
|
||||
),
|
||||
min_deny_confidence=float(
|
||||
getattr(args, "llm_classifier_min_deny_confidence", 0.0)
|
||||
or os.getenv("MODELHUB_LLM_CLASSIFIER_MIN_DENY_CONFIDENCE", "0.85")
|
||||
),
|
||||
cache_path=Path(
|
||||
getattr(args, "llm_classifier_cache_path", None)
|
||||
or os.getenv("MODELHUB_LLM_CLASSIFIER_CACHE_PATH", str(DEFAULT_LLM_CACHE_PATH))
|
||||
),
|
||||
)
|
||||
outcome_tracker.set_failure_llm_classifier(llm_classifier)
|
||||
preflight_advisor = CandidatePreflightAdvisor(llm_classifier=llm_classifier)
|
||||
preflight_advisor = CandidatePreflightAdvisor(llm_classifier=None)
|
||||
preflight_summary: dict[str, Any] = (
|
||||
preflight_advisor.summary() if preflight_advisor is not None else {"enabled": False}
|
||||
)
|
||||
|
||||
@@ -89,7 +89,6 @@ def _add_token(tokens: list[str], token: str | None) -> None:
|
||||
|
||||
|
||||
def ensure_tokens(args: argparse.Namespace) -> None:
|
||||
ensure_dashscope_key()
|
||||
primary_key_path = Path(getattr(args, "key_path", DEFAULT_KEY_PATH))
|
||||
supplemental_key_path = primary_key_path.with_name(DEFAULT_KEYS_PATH.name)
|
||||
if not primary_key_path.exists():
|
||||
|
||||
@@ -1 +1 @@
|
||||
AGENT_VERSION = "2026.08.11.1"
|
||||
AGENT_VERSION = "2026.08.11.2"
|
||||
|
||||
Reference in New Issue
Block a user