Skip to content
docs
UseBuildChangelog
Open Lumin

Examples

today-panel

A daily almanac panel for a city and a date: the five limbs of the panchang, the sunrise-to-sunrise inauspicious bands, 16 choghadiya periods, 24 planetary hours, and the Moon's current sub lord. Five tools, zero PII, no birth data anywhere in the request.

Tool chain

Five tools, all independent, called together rather than in sequence: get_panchang (KP: the five limbs, sunrise and sunset, and the three inauspicious bands), get_choghadiya_today and get_hora_today (Vedic muhurta adjuncts, not orthodox KP, presented side by side with the KP layer but never described as a KP finding), get_moon_transit (KP: the Moon's sign, star lord, sub lord and minutes left in it, the fastest hand on the KP clock), and get_sublord_changes (KP: hours until each planet's sub lord changes, no location needed at all).

get_panchang and get_moon_transit are declared with birth-data-shaped field names, but the values carried are the query moment and place, never a person, which is what makes this whole app free of personal data.

Inputs

  • city, free text (e.g. "Colombo, Sri Lanka"), resolved by the model
  • utcOffsetMinutes, required, not inferred. The astrological day runs sunrise to sunrise, so the offset decides which civil day is meant; getting it wrong lands the whole panel a day early east of Greenwich
  • date (YYYY-MM-DD), defaults to the visitor's today

Call it

typescript
const ALLOWED_TOOLS = [
  "get_panchang",
  "get_choghadiya_today",
  "get_hora_today",
  "get_moon_transit",
  "get_sublord_changes",
] as const;

const result = await runLumin({
  allowedTools: ALLOWED_TOOLS,
  system: buildSystemPrompt(),
  user: buildUserPrompt(input),
  // Five tool calls plus a 16-period and 24-hour payload. Costs nothing when
  // the answer is shorter, because the client streams.
  maxTokens: 16000,
  // This is a lookup, not an investigation. High is enough and it is faster.
  effort: "high",
  signal: req.signal,
});

const data = ensureShape(
  parseJsonBlock<TodayResponse>(result.text),
  validateShape,
);

Response shape

json
{
  "place": { "label": "Colombo, Sri Lanka", "latitude": 6.9271, "longitude": 79.8612, "utcOffsetMinutes": 330 },
  "date": "2027-05-01",
  "panchang": {
    "tithi": "Shukla Panchami", "nakshatra": "Rohini", "yoga": "Siddhi", "karana": "Balava",
    "weekday": "Saturday",
    "sunriseUTC": "2027-05-01T00:03:00Z", "sunsetUTC": "2027-04-30T12:47:00Z",
    "rahuKaal": { "startUTC": "2027-05-01T03:15:00Z", "endUTC": "2027-05-01T04:45:00Z" },
    "yamagandaKaal": { "startUTC": "2027-05-01T06:15:00Z", "endUTC": "2027-05-01T07:45:00Z" },
    "gulikaiKaal": { "startUTC": "2027-05-01T09:15:00Z", "endUTC": "2027-05-01T10:45:00Z" }
  },
  "choghadiya": [
    { "name": "Amrit", "lord": "Moon", "quality": "auspicious", "startUTC": "2027-05-01T00:03:00Z", "endUTC": "2027-05-01T01:32:00Z", "interpretation": "Favourable for new beginnings.", "isCurrent": false }
  ],
  "hora": [
    { "lord": "Saturn", "quality": "inauspicious", "startUTC": "2027-05-01T00:03:00Z", "endUTC": "2027-05-01T01:03:00Z", "interpretation": "A slower, disciplined hour.", "isCurrent": true }
  ],
  "moon": { "sign": "Taurus", "starLord": "Rohini (Moon)", "subLord": "Mercury", "minutesRemainingInSub": 42, "nextSubLord": "Ketu" },
  "nextChanges": [
    { "planet": "Moon", "currentSubLord": "Mercury", "nextSubLord": "Ketu", "hoursUntilChange": 0.7 }
  ],
  "summary": "A settled Saturday with the Moon nearing a sub-lord change in Rohini.",
  "disclaimer": "A traditional almanac panel, computed for the place and date you chose. It describes conventional timing categories, not advice."
}

Screens

  • A city and date form with the UTC offset resolved alongside the free-text city
  • A panchang card: the five limbs, sunrise and sunset, the three inauspicious bands
  • Two scrolling period strips, choghadiya and hora, each with the current period highlighted
  • A moon-now card: sign, star lord, sub lord, minutes remaining
  • A next-changes list: what shifts next and in how many hours

Validation the route enforces before it responds

Every timestamp must be ISO 8601 UTC. Choghadiya carries 16 entries and hora 24 unless a tool returned fewer. At most one period per track is marked current. Quality is one of auspicious, neutral or inauspicious, lowercase.

The interesting engineering detail

The system prompt sets effort: "high" rather than the xhigh every other example in this repo uses. This is a lookup, not an investigation: five independent, unconditional tool calls with no branching logic between them, so the model does not need the extra reasoning budget an investigative reading spends deciding what to call next. Matching effort to the shape of the task, not defaulting it everywhere, is what keeps a zero-PII, cacheable-per-city product fast.

Where to next