Examples
kundli-match
A matrimonial matcher for two people. Three independent compatibility systems computed on the same pair of charts, a dosha screen, a chart-integrity check on each person, and the marriage promise for each, shown side by side rather than blended into one number.
Tool chain
Three compatibility systems, computed independently and never blended: get_ashta_koota_milan (the familiar 36 point traditional score, Vedic Parashari), check_compatibility (the KP seven factor verdict) and get_compatibility_advanced (six cuspal factors computed in both directions, the rigorous KP read). Doshas come from check_doshas and get_kalsarpa_variants, which names which variant applies rather than only that one is present. get_spouse_characteristics supplies the partner facets, and get_boundary_warnings runs once per chart as the confidence pill.
Inputs
- Two full birth profiles:
name,birth_date,birth_time,birth_time_known,location_name - Each defaults to noon with a precision caveat if the time is unknown, same as the single-person examples
Call it
const ALLOWED_TOOLS = [
"get_ashta_koota_milan", // Vedic Parashari, the familiar 36 point score
"check_compatibility", // KP, the 7 factor score
"get_compatibility_advanced", // KP, six cuspal factors computed both ways
"check_doshas", // Vedic Parashari, carries the KP dissent
"get_kalsarpa_variants", // Vedic Parashari, names which variant applies
"get_spouse_characteristics",
"get_boundary_warnings", // run once per chart, the confidence pill
] as const;
const result = await runLumin({
allowedTools: ALLOWED_TOOLS,
system: buildSystemPrompt(),
user: buildUserPrompt(personA, personB),
maxTokens: 16000,
effort: "xhigh",
signal: req.signal,
});
const parsed = ensureShape(
parseJsonBlock<KundliMatchResponse>(result.text),
validateShape,
);Seven tools on the allowlist, called against two profiles. A typical run is 11 metered calls, because the three compatibility tools each run once while the dosha checks, the spouse description and the boundary warnings run per person.
A faster path exists
Response shape
{
"personA": { "name": "Nimasha", "resolved_location": { "latitude": 6.9271, "longitude": 79.8612, "utc_offset_minutes": 330 } },
"personB": { "name": "Kavindu", "resolved_location": { "latitude": 6.0535, "longitude": 80.2210, "utc_offset_minutes": 330 } },
"systems": {
"ashtakoota": {
"total_points": 24, "max_points": 36,
"kootas": [
{ "name": "Varna", "points": 1, "max": 1, "note": "Compatible" },
{ "name": "Nadi", "points": 0, "max": 8, "note": "Same Nadi, the koota most weight is placed on traditionally." }
]
},
"kp_compatibility": { "verdict": "favourable, with one caution", "reasoning": "..." },
"advanced_compatibility": { "verdict": "moderate", "factors": ["Venus-Mars mutual aspect", "7th lords in mutual stars"] }
},
"doshas": {
"manglik": { "personA": false, "personB": true },
"kalsarpa": { "personA": null, "personB": "Vasuki Kalsarpa, partial" }
},
"chart_confidence": {
"personA": { "band": "high", "modifier": 0, "summary": "No boundary flags." },
"personB": { "band": "moderate", "modifier": -10, "summary": "7th cusp sub lord within 6 arc-minutes of a boundary." }
},
"promise": {
"personA": { "marriage_promised": true, "reasoning": "..." },
"personB": { "marriage_promised": true, "reasoning": "..." }
},
"spouse_description": { "personA": "...", "personB": "..." },
"disagreements": [
"Ashtakoota flags a Nadi mismatch (0/8); KP compatibility does not treat Nadi as decisive and reads the pair favourably overall."
],
"summary": "Three systems broadly agree, with one traditional flag KP does not weight the same way.",
"disclaimer": "Compatibility output is one input among many. Never present a low score as a reason a relationship will fail."
}Screens
- Two birth-detail forms, side by side
- Three system cards: Ashta Koota Milan (with the 8-koota breakdown), KP compatibility, and the advanced-compatibility read
- A dosha panel per person
- A disagreements callout, shown only when the systems diverge
- A chart-confidence pill per person
The interesting engineering detail
The disagreements array is a first-class field, not an afterthought. Most matching products blend every signal into one score because a single number is easier to render; this app's prompt is explicitly instructed to name where the three systems disagree rather than average them away. That is the entire pitch of the product: three independent compatibility systems computed on the same two charts, with disagreements surfaced rather than blended into one number, which no generic horoscope API can produce because it only implements one system to begin with.
Where to next
- Matrimonial and dating use cases for the match-score, dosha-filter and prefill rows this app implements.
- Responsible use for the three advisor-only separation and infidelity tools this app must never call.