(
*,
next_upstream: str,
next_api_key: str,
persist: bool,
)
| 2884 | } |
| 2885 | |
| 2886 | async def _reload_primary_connection( |
| 2887 | *, |
| 2888 | next_upstream: str, |
| 2889 | next_api_key: str, |
| 2890 | persist: bool, |
| 2891 | ) -> tuple[bool, dict[str, Any]]: |
| 2892 | nonlocal upstream, _primary_api_key, _mapper, _semantic |
| 2893 | candidate_upstream = str(next_upstream or "").strip() |
| 2894 | candidate_api_key = str(next_api_key or "").strip() |
| 2895 | candidate_mapper = ModelMapper(candidate_upstream) |
| 2896 | |
| 2897 | if candidate_upstream: |
| 2898 | count = await candidate_mapper.discover(candidate_api_key or None) |
| 2899 | if count <= 0: |
| 2900 | detail = candidate_mapper.provider |
| 2901 | if detail != "unknown": |
| 2902 | detail = f"{detail} (discovery failed)" |
| 2903 | return False, { |
| 2904 | "error": "Unable to validate upstream connection", |
| 2905 | "detail": detail or "discovery failed", |
| 2906 | } |
| 2907 | |
| 2908 | previous_upstream = upstream |
| 2909 | previous_api_key = _primary_api_key |
| 2910 | previous_mapper = _mapper |
| 2911 | previous_semantic = _semantic |
| 2912 | |
| 2913 | try: |
| 2914 | upstream = candidate_upstream |
| 2915 | _primary_api_key = candidate_api_key |
| 2916 | _mapper = candidate_mapper |
| 2917 | _semantic = _build_semantic_compressor() |
| 2918 | _refresh_active_pricing() |
| 2919 | if persist: |
| 2920 | _connections_store.set_primary( |
| 2921 | upstream=candidate_upstream, |
| 2922 | api_key=candidate_api_key, |
| 2923 | ) |
| 2924 | return True, _current_connection_payload() |
| 2925 | except Exception as exc: # noqa: BLE001 |
| 2926 | upstream = previous_upstream |
| 2927 | _primary_api_key = previous_api_key |
| 2928 | _mapper = previous_mapper |
| 2929 | _semantic = previous_semantic |
| 2930 | _refresh_active_pricing() |
| 2931 | return False, {"error": "Failed to reload primary connection", "detail": str(exc)} |
| 2932 | |
| 2933 | async def _on_startup() -> None: |
| 2934 | # ─── v2 lifecycle startup ─── |
no test coverage detected