| name | extract_price_table |
| description | Parse web page text into a structured price table; feeds compute_group_price + save_venue. |
| when_to_use | Right after web_extract returned a page with pricing prose ("Eintritt
5,90 €", "Kinder ab 3 Jahre: 11,90 €", "10er-Karte 89 €"), call this
skill to convert the prose into a structured list of priced tickets.
Typical chain:
1. web_search → result cards
2. web_extract(urls=[...]) → text wrapped in UNTRUSTED markers
3. extract_price_table(page_text=…, url=…, venue_name=…)
→ {venue, prices: [{label, unit_eur, age_min?, age_max?, kind?, …}]}
4. (clarify with user if ambiguous — see CLARIFY-BEFORE-CALCULATING)
5. compute_group_price(items=[…matched subset…])
6. (optional) save_venue(…, price_table=prices)
Pass `page_text` with the `[UNTRUSTED CONTENT FROM …]` markers intact — the extractor uses them to ignore instructions inside.
|
| inputs | {"page_text":{"type":"string","required":true,"description":"The text body to extract from. Usually the `content` field returned by web_extract (which already includes UNTRUSTED markers — leave them in)."},"url":{"type":"string","required":false,"description":"Source URL — passed to compute_group_price / save_venue downstream for citation."},"venue_name":{"type":"string","required":false,"description":"Best-guess display name of the place (from the page title or the user's question)."},"currency":{"type":"string","required":false,"default":"EUR","description":"ISO 4217 hint. EUR is default since most German content; extractor reads \"€\" / \"EUR\" markers regardless."}} |
| outputs | {"venue":{"type":"string"},"url":{"type":"string"},"currency":{"type":"string"},"prices":{"type":"array","description":"List of {label, unit_eur, age_min?, age_max?, kind?} dicts where\nkind is one of 'child' / 'adult' / 'bundle' / 'discount' / 'other'.\n"},"notes":{"type":"string","description":"Anything else worth remembering (open hours hint, group bookings, etc.) — short prose."}} |
| permissions | ["admin","member","restricted"] |
| side_effects | One LLM call to qwen via the local llama-swap (no network beyond that).
No DB writes. No ui_action — this is plumbing for the next-call chain.
|
| tags | ["web","prices","extraction"] |