Add D9 and Moon evidence to synastry API

This commit is contained in:
732642856
2026-07-17 17:39:55 +08:00
parent a6aa84e905
commit f7674cca66
3 changed files with 50 additions and 6 deletions
+42 -3
View File
@@ -42,6 +42,32 @@ function moonLongitude(chart: Record<string, unknown>) {
return numeric;
}
function moonSummary(chart: Record<string, unknown>) {
const planets = chart.planets && typeof chart.planets === "object" ? chart.planets as Record<string, unknown> : {};
const moon = planets.Moon && typeof planets.Moon === "object" ? planets.Moon as Record<string, unknown> : {};
return {
sign: moon.sign,
nakshatra: moon.nakshatra,
pada: moon.nakshatra_pada,
lord: moon.nakshatra_lord,
longitude: moonLongitude(chart),
};
}
function d9Summary(varga: Record<string, unknown>) {
const result = varga.result && typeof varga.result === "object" ? varga.result as Record<string, unknown> : {};
const d9 = result.D9_Navamsa && typeof result.D9_Navamsa === "object" ? result.D9_Navamsa as Record<string, unknown> : {};
const ascendant = d9.ascendant && typeof d9.ascendant === "object" ? d9.ascendant as Record<string, unknown> : {};
const planets = d9.planets && typeof d9.planets === "object" ? d9.planets as Record<string, unknown> : {};
return {
ascendant,
moon: planets.Moon,
venus: planets.Venus,
mars: planets.Mars,
source: varga.source,
};
}
async function postPython(path: string, body: unknown) {
const response = await fetch(`${apiBase}${path}`, {
method: "POST",
@@ -64,15 +90,28 @@ export async function POST(request: Request) {
}
const selfChart = await postPython("/api/chart", birthPayload(body.selfProfile));
const partnerChart = await postPython("/api/chart", birthPayload(body.partnerProfile));
const selfD9 = await postPython("/api/varga_full", {
...birthPayload(body.selfProfile),
planets: selfChart.planets,
ascendant: selfChart.ascendant,
divisions: ["D9"],
});
const partnerD9 = await postPython("/api/varga_full", {
...birthPayload(body.partnerProfile),
planets: partnerChart.planets,
ascendant: partnerChart.ascendant,
divisions: ["D9"],
});
const synastry = await postPython("/api/synastry", {
male_moon: moonLongitude(selfChart),
female_moon: moonLongitude(partnerChart),
});
return NextResponse.json({
status: "ok",
method: "ashtakoot_from_computed_moon",
selfChart: { moon: moonLongitude(selfChart) },
partnerChart: { moon: moonLongitude(partnerChart) },
method: "ashtakoot_plus_moon_nakshatra_d9",
evidenceLayers: ["ashtakoot", "moon_nakshatra", "d9_navamsa"],
selfChart: { moon: moonSummary(selfChart), d9: d9Summary(selfD9) },
partnerChart: { moon: moonSummary(partnerChart), d9: d9Summary(partnerD9) },
synastry,
});
} catch (error) {
+3 -2
View File
@@ -1256,15 +1256,16 @@ export default function Home() {
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ selfProfile: profile, partnerProfile: record.profile }),
});
const payload = await response.json().catch(() => null) as { status?: string; synastry?: { total_score?: number; max_score?: number; assessment?: string } } | null;
const payload = await response.json().catch(() => null) as { status?: string; evidenceLayers?: string[]; synastry?: { total_score?: number; max_score?: number; assessment?: string } } | null;
if (response.ok && payload?.status === "ok") {
const score = payload.synastry?.total_score;
const max = payload.synastry?.max_score;
const assessment = payload.synastry?.assessment;
const layers = (payload.evidenceLayers || []).join(" / ") || "Ashtakoot / Moon / D9";
chooseSuggestedQuestion([
baseQuestion,
"",
`已计算基础合盘证据:Ashtakoot ${score ?? "?"}/${max ?? "?"},初步评级:${assessment || "待解释"}。请基于这个证据包继续分析。`,
`已计算基础合盘证据:${layers}Ashtakoot ${score ?? "?"}/${max ?? "?"},初步评级:${assessment || "待解释"}。请基于这个证据包继续分析。`,
].join("\n"), "marriage");
} else {
chooseSuggestedQuestion(baseQuestion, "marriage");
+5 -1
View File
@@ -163,9 +163,13 @@ def test_synastry_route_orchestrates_python_chart_and_ashtakoot() -> None:
'const apiBase = process.env.JYOTISH_API_BASE ?? "http://127.0.0.1:5200"',
'postPython("/api/chart", birthPayload(body.selfProfile))',
'postPython("/api/chart", birthPayload(body.partnerProfile))',
'postPython("/api/varga_full"',
'postPython("/api/synastry"',
"moonLongitude(selfChart)",
"ashtakoot_from_computed_moon",
"moonSummary(selfChart)",
"d9Summary(selfD9)",
"ashtakoot_plus_moon_nakshatra_d9",
'evidenceLayers: ["ashtakoot", "moon_nakshatra", "d9_navamsa"]',
'status: "blocked"',
):
assert token in route