fix(ayanamsa): pin Lahiri on reference sets and add a user setting

Product default stays Raman. Public-case revalidation and fixture dashas now pass --ayanamsa lahiri; profiles store the four selectable values.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-09-03 16:33:46 +08:00
parent 58cae371bb
commit b6a70aa7df
44 changed files with 425 additions and 30 deletions
+9 -9
View File
@@ -106,7 +106,7 @@ except ModuleNotFoundError: # pragma: no cover - script execution path
release_heavy_compute_slot,
)
from ayanamsa_utils import DEFAULT_AYANAMSA_NAME, UnsupportedAyanamsaError, normalize_ayanamsa_name
from ayanamsa_utils import DEFAULT_AYANAMSA_NAME, UnsupportedAyanamsaError, ayanamsa_display_name, normalize_ayanamsa_name
from raman_support_observations import build_raman_support_observations
load_local_env(REPO_ROOT)
@@ -807,7 +807,7 @@ _CHARA_DASHA_ROUTES = frozenset({'career', 'timing', 'annual', 'marriage'})
def _request_ayanamsa(*sources) -> str:
for source in sources:
if isinstance(source, dict):
raw = source.get('ayanamsa') or source.get('ayanamsa_name')
raw = source.get('ayanamsa') or source.get('ayanamsa_name') or source.get('ayanamsa_policy')
else:
raw = source
if raw not in (None, ''):
@@ -2850,7 +2850,7 @@ def _attach_vedastro_main_entry_overview(chart_result, birth_payload):
'lat': birth_payload.get('lat'),
'lon': birth_payload.get('lon'),
'tz': birth_payload.get('tz'),
'ayanamsa_policy': birth_payload.get('ayanamsa') or 'lahiri',
'ayanamsa_policy': _request_ayanamsa(birth_payload),
'node_policy': birth_payload.get('node_mode') or birth_payload.get('nodeMode') or 'mean',
}, route='overview', reference_date=reference_date, case_id='api_chart')
if isinstance(vedastro_evidence, dict):
@@ -4014,7 +4014,7 @@ class JyotishAPIHandler(BaseHTTPRequestHandler):
'lat': lat,
'lon': lon,
'tz': tz,
'ayanamsa_policy': body.get('ayanamsa_policy') or body.get('ayanamsa') or 'lahiri',
'ayanamsa_policy': _request_ayanamsa(body),
'node_policy': body.get('node_policy') or body.get('node_mode') or 'mean',
}
result = _load_local_module('vedastro_service_adapter').run_range_scan_for_case(
@@ -6944,13 +6944,13 @@ class JyotishAPIHandler(BaseHTTPRequestHandler):
except ImportError:
fallback = self._fallback_chart(
year, month, day, hour, minute, second, lat, lon, tz,
skip_vedastro_main_entry_overview=bool(body.get('skip_vedastro_main_entry_overview')),
skip_vedastro_main_entry_overview=bool(body.get('skip_vedastro_main_entry_overview')), ayanamsa_name=_request_ayanamsa(body),
)
return _store_api_chart_response_cache(cache_payload, fallback)
def _fallback_chart(
self, year, month, day, hour, minute, second, lat, lon, tz,
*, skip_vedastro_main_entry_overview=False,
*, skip_vedastro_main_entry_overview=False, ayanamsa_name=DEFAULT_AYANAMSA_NAME,
):
"""无Swiss Ephemeris时的简化计算"""
import hashlib
@@ -6996,7 +6996,7 @@ class JyotishAPIHandler(BaseHTTPRequestHandler):
'second': int(second),
'tz': f"UTC{'+' if tz >= 0 else ''}{tz}",
'lat': lat,
'lon': lon,
'lon': lon, 'ayanamsa_name': ayanamsa_name, 'ayanamsa_display': ayanamsa_display_name(ayanamsa_name),
},
'ascendant': {'sign': asc_sign, 'sign_idx': asc_sign_idx},
'planets': planets, 'houses': houses,
@@ -7027,7 +7027,7 @@ class JyotishAPIHandler(BaseHTTPRequestHandler):
'lat': lat,
'lon': lon,
'tz': tz,
'ayanamsa': 'lahiri',
'ayanamsa': ayanamsa_name,
'node_mode': 'mean',
})
_attach_guided_topics(result)
@@ -7083,7 +7083,7 @@ class JyotishAPIHandler(BaseHTTPRequestHandler):
if planet in {'Sun', 'Moon', 'Mars', 'Mercury', 'Jupiter', 'Venus', 'Saturn', 'Rahu', 'Ketu'}
and isinstance(pdata, dict)
}
ayanamsa_display = birth.get('ayanamsa_display') or 'Raman'
ayanamsa_display = birth.get('ayanamsa_display') or ayanamsa_display_name(birth.get('ayanamsa_name') or birth.get('ayanamsa'))
node_mode = birth.get('node_mode') or 'mean'
prompt_lines = [
'你是一个审慎的 AI Native 印度/吠陀占星分析助手。',
+1
View File
@@ -227,6 +227,7 @@ def build_report() -> dict[str, Any]:
}
return {
"scope": "local_jyotish_accuracy_report",
"reference_ayanamsa": "lahiri",
"generated_at": datetime.now(timezone.utc).isoformat(),
"summary": summary,
"checks": checks,