AstroWay/api v2.190.0 · pl
wszystkie systemy w normie

Jak utrzymujemy dokładność pod kontrolą: CI przeciw swetest i NASA

Dokładność w astro-API łatwo degraduje od jednego refactoringu ephemerid. Rozmawiamy o ochronie: jedno jądro Swiss Ephemeris na przeglądarce i serwer, setki zamrożonych snapshotów na etalonicznych mapach i triangulacja każdego PR przeciw swetest CGI, Kerykeion, Prokerala oraz katalogu zaciemnień NASA.

Dokładność to to, czym użytkownik nieświadomie sprawdza Ciebie na Astrodienst. Jeśli naturalna mapa rozprzestrzeniła się na kątową minutę, skarga przyjdzie szybko. I najgorsze w tym, że dokładność łatwo niszczyć nieświadomie: jeden refaktoring w kodzie ephemerid, i połowa endpointów cicho odjechała na sekundy długości.

Oto jak nie pozwalamy temu się stać.

Pozycje planetarne liczy Swiss Ephemeris, skompilowany w WASM. Kluczowe: to samo jądro i w przeglądarce naszego aplikacji, i na serwerze API. Jedna bazę kodu core/, podciągnięta w tylnej części przez cross-repo alias i wkomponowana w pakiet na budowie. Nie ma „przeglądarczej” i „serwerowej” implementacji, które mogą się rozbiec - rozchodzą się niczym.

Dla dat poza głównym zakresie ephemerid jest fallback analityczny (Moshier), trochę grubiejszy, ale bez przerwań na granicach. Świadoma szczerość: konkretną wersję silnika nie deklarujemy publicznie, bo rzeczywista wersja jądra jest niższa niż najnowszy upstream, i pisać głośną cyfrą byłoby kłamstwem.

Każdy obliczeniowy endpoint ma zestaw zamrożonych snyapshotów - 873 JSON-fikstur w momencie tego buildu. Ranner uruchamia endpoint na kartach etalonowych i pobajtowo (w granicach tolerancji) porównuje z fiktura. Cokolwiek odchylenie pozycji planetarnej większe niż 5e-5° (0,18”) wywaluje test.

Karty etalonowe wybrane tak, aby bijały na krawędziach, a nie tylko na „przyjaznym” centrum:

  • Monroe, Diana, Einstein, Bowie - historyczne karty z znanymi danymi urodzenia
  • północna szerokość - gdzie systemy domów wyrastają
  • ekwatorialna - gdzie się zachowują inaczej
  • południowa półkula - sprawdzanie odbicia

Przypadki graniczne łapią właśnie te regresje, które nie są widoczne na mapie kłamczego chłopa.

Snyapshoty łapią regresje w stosunku do samego siebie. Aby sprawdzić absolutną prawdę, każdy rys zawiązuje się z niezależnymi źródłami:

Przeciwko czemuCo sprawdzaRozchodzenia
swetest CGI (Astrodienst)pozycje planetarne, kuśpidy domów0.000"
Kerykeion (Python, pyswisseph)niezależna implementacja SwEph< 0,2"
Prokerala (sidereal Lahiri)pozycje siedzące8-17", systemowa różnica formuły Ayanamsha, nie silnik
NASA 5-Millennium Eclipse Catalogczas i typ zacienień< 1 min

Rozchodzenia z Prokerala - nie jest to błąd: to różne implementacje formuły Lahiri, i dokumentujemy to otwarcie, a nie ukrywamy. Z swetest, który jest etalonem branży, drętw nulowy.

Astronomiczne linie mapy są osobno sprawdzane geometrycznie - dokładność na ekwatorze lepsza niż 1,5 km.

Dokładność to CI-gate, a nie jednorazowa sprawdzenie:

  • api-accuracy.yml - na każdym PR w kodzie tylnej części uruchamia się cały zestaw snyapshotów + trójkątna. Czerwony test blokuje merge.
  • check-eclipse-accuracy.yml - raz na rok sprawdza zacienienia z katalogiem NASA; rozchodzenia powyżej progu automatycznie uruchamia issue.
  • check-sweph-updates.yml - co tydzień sprawdza upstream Swiss Ephemeris i pakiet WASM; nowa wersja - issue na reviu, bez automerżu (aktualizacja silnika ephemerid - zbyt wrażliwa rzecz na autoaktualizację).

Gwarancja prosta: pozycje planetarne w granicach < 0,1 kątowej sekundy od etalonowego Swiss Ephemeris, i ta granica chroniona jest automatycznie, a nie obietnicą w README. Jeśli kiedykolwiek pojawi się regresja, ona wpadnie w nasz CI, a nie w skargę twojego użytkownika.

Publiczna wersja tych cyfr, z tabelą rozchodzeń na konkretnych kartach, żyje na stronie Dokładność.

MakSeong · AstroWay

I build the AstroWay API: Swiss Ephemeris on a clean REST surface, and I write about the dull parts that turn out to matter.

// zbuduj na tym

Ten sam Swiss Ephemeris, co w Solar Fire - w 4 liniach kodu.

Darmowy klucz bez karty. 5 000 wywołań miesięcznie do pierwszej płatności.

Więcej z bloga wszystkie posty →

Engineering 2026-07-15

Trzy oficjalne SDK: TypeScript, Python, PHP zamiast surowego curl

Surowy HTTP działa, ale typizowany klient oszczędza godziny: autouzupełnianie ścieżek, typy zapytań i odpowiedzi, wbudowany retry dla 408/409/429/5xx i hierarchia błędów w stylu Stainless. Przeanalizowaliśmy trzy oficjalne SDK - @astroway/sdk (npm), astroway (PyPI), astroway/sdk (Packagist) - i czym są generowane z jednego kontraktu OpenAPI.

Industry 2026-06-05

Free Astrology API: Which One Has the Best Free Tier in 2026?

A side-by-side of free tiers across the major astrology APIs - credits, request caps, card requirements - and how much you can actually build for free.

Engineering 2026-06-05

Horoscope API Tutorial: Build a Daily Horoscope Feature

Add daily, weekly and monthly horoscopes to your app via API - sign-based text vs transit-based personalization - with TypeScript and Python code.