JobForecaster-Agent / services /dashboard_data.py
lixiaowww's picture
Sync from GitHub via hub-sync
dddbb8b verified
Raw
History Blame Contribute Delete
2.3 kB
"""Dashboard data access via services layer (no Streamlit)."""
from __future__ import annotations
from datetime import date
from typing import Any
import evolution as ev
import job_radar
from registry import Registry
from schemas import Prediction
from services.config_loader import load_config
from services.read_model import get_ood_assessment, get_scoreboard, search_jobs
from services.track_record import (
partition_by_origin,
scoreboard_subset,
seed_prediction_ids,
upcoming_resolutions,
)
def get_scoreboard_data() -> dict[str, Any]:
return get_scoreboard()
def get_predictions() -> list[Prediction]:
return Registry().load()
def get_track_record_views() -> dict[str, Any]:
"""Predictions partitioned by origin with per-origin scoreboards."""
preds = get_predictions()
seed_ids = seed_prediction_ids()
seed_preds, live_preds = partition_by_origin(preds, seed_ids)
return {
"seed_ids": seed_ids,
"seed_preds": seed_preds,
"live_preds": live_preds,
"seed_scoreboard": scoreboard_subset(seed_preds),
"live_scoreboard": scoreboard_subset(live_preds),
"upcoming_live": upcoming_resolutions(live_preds),
}
def build_evolution_prior(scenario: dict[str, Any], *, n_bootstrap: int | None = None) -> ev.EvolutionPrior:
cfg = load_config()
boot = n_bootstrap if n_bootstrap is not None else int(cfg.get("evolution", {}).get("n_bootstrap", 50))
return ev.build_prior(current_scenario=scenario, n_bootstrap=boot)
def get_ood_for_scenario(scenario: dict[str, Any], *, n_bootstrap: int = 10) -> dict[str, Any]:
return get_ood_assessment(scenario, n_bootstrap=n_bootstrap)
def hybrid_job_search(
query: str,
industry: str,
scenario: dict[str, Any],
*,
limit: int = 50,
) -> list[dict]:
cfg = load_config()
jr = cfg.get("job_radar", {})
kb_path = jr.get("kb_path", "data/jobs_kb.json")
jobs = search_jobs(
query=query,
industry=industry,
scenario_params=scenario,
alpha=float(jr.get("alpha", 0.6)),
beta=float(jr.get("beta", 0.4)),
kb_path=kb_path,
embedder=job_radar._default_embedder(),
)
jobs.sort(key=lambda j: j.get("hybrid_score", 0.0), reverse=True)
return jobs[:limit]