Skip to content
docs
UseBuildChangelog
Open Lumin

Examples

weather-windows

The first example built on the astrometeorology family, the non-natal side of the catalog. It reads the weather signature for a location, never a person, so it takes a place and a date range and never calls set_birth_profile at all.

Tool chain

  • get_seasonal_outlook, the four cardinal-ingress season themes for a year. The theme covering the requested range becomes the banner.
  • get_weather_windows, the primary tool: roughly 14-day windows across the date range, each cast from a lunation chart, with temperature, precipitation and wind/storm channels plus a 4th-cusp CSL verdict.
  • get_astro_weather, the signature for the place at the present moment, wired as an "as of today" card beside the future windows.
  • get_monsoon_forecast, conditional: populated only when the place sits in a monsoon climate and the range overlaps the season, from the Ardra Pravesha chart; null otherwise.

Inputs

  • location_name, free text (e.g. "Colombo, Sri Lanka"), resolved by the model
  • start_date and end_date (YYYY-MM-DD)

Call it

typescript
const ALLOWED_TOOLS = [
  "get_seasonal_outlook",
  "get_weather_windows",
  "get_astro_weather",
  "get_monsoon_forecast",
] as const;

const result = await runLumin({
  allowedTools: ALLOWED_TOOLS,
  system: buildSystemPrompt(),
  user: buildUserPrompt(input),
  maxTokens: 16000,
  effort: "xhigh",
  signal: req.signal,
});

const parsed = ensureShape(
  parseJsonBlock<ForecastResponse>(result.text),
  validateShape,
);

The route sets a 120 second maxDuration to accommodate per-lunation chart computations; a typical run finishes in 30 to 70 seconds.

Response shape

json
{
  "resolved_location": { "latitude": 6.9271, "longitude": 79.8612, "utc_offset_minutes": 330, "label": "Colombo, Sri Lanka", "note": "Resolved from free text." },
  "range": { "start": "2027-05-01", "end": "2027-08-31" },
  "season": { "season": "Summer ingress", "theme": "Active, storm-leaning; the cardinal ingress chart shows a mixed Mars-Rahu signature." },
  "current": {
    "datetime": "2027-05-01T06:00:00Z",
    "temperature": { "level": "active", "band": "warm", "score": 68, "note": "..." },
    "precipitation": { "level": "mild", "band": "occasional showers", "score": 32, "note": "..." },
    "wind": { "level": "calm", "band": "light", "score": 18, "note": "..." },
    "csl_verdict": "4th cusp sub lord favourable, settled conditions likely near-term.",
    "summary": "A settled opening to the window."
  },
  "monsoon": {
    "year": 2027, "onset": "2027-05-24",
    "precipitation": { "level": "active", "band": "heavy", "score": 71, "note": "..." },
    "summary": "Southwest monsoon onset read from the Ardra Pravesha chart."
  },
  "windows": [
    {
      "label": "New moon window, mid May",
      "start": "2027-05-06", "end": "2027-05-20", "lunation": "new-moon",
      "temperature": { "level": "active", "band": "warm", "score": 64, "note": "..." },
      "precipitation": { "level": "intense", "band": "heavy, storm risk", "score": 82, "note": "..." },
      "wind": { "level": "active", "band": "gusty", "score": 58, "note": "..." },
      "csl_verdict": "4th cusp sub lord afflicted by Rahu, unsettled.",
      "outdoor_rating": "unfavourable",
      "summary": "The least settled window in range; pair with a real forecast before committing a date."
    }
  ],
  "best_window": "New moon window, late July",
  "disclaimer": "A KP astrometeorology signature, an astrological weather lens, not a meteorological forecast."
}

Screens

  • A hero and a place-and-range form: free-text location, start date, end date
  • A season banner naming the theme covering the range
  • A present-conditions card, always shown
  • A monsoon-onset card, shown only when populated
  • A grid of weather-window cards, one per lunation, each carrying its outdoor rating
  • A disclaimer banner on every result

Not a forecast, a planning prompt

Conventional forecasts are sharp inside about 10 days and vague beyond. This lens gives a structured fortnightly lean for months ahead, useful when a date has to be picked early. It pairs with a real meteorological API; it does not replace one.

The interesting engineering detail

This app never calls set_birth_profile, which every other worked example calls first. The astrometeorology family reads a location and a moment, not a person, so the whole product runs with zero personal data: no consent flow, no privacy notice about birth data, cacheable per city per day. It is the cleanest demonstration in this repo of the input-class table on the use-cases page: what you can ask for decides what you can build, and here the answer is nothing at all.

Where to next