Extract Structure from Bird Observation Notes

Releasing birdlife-ont-core v0.1.0 — an open source tool for extracting behaviors, breeding evidence, and habitat details from unstructured eBird notes using LLMs.

eBird contains 1.5+ billion bird observations. Many include observer notes like "Singing male on territory, tall oak at forest edge, 2 juveniles nearby" — rich behavioral and ecological data that's impossible to query at scale because it's buried in free text.

Today we're releasing birdlife-ont-core, a Python library that uses LLMs to extract structured data from these notes automatically.

What it extracts

Given a raw observation note, the tagger extracts:

  • Behaviors — singing, foraging, feeding young, mobbing, displaying
  • Breeding evidence — nest building, fledglings, carrying food (mapped to eBird breeding codes)
  • Life stages — adult, juvenile, immature, fledgling
  • Habitat features — dead snag, forest edge, reedbed, cavity
  • Count details — breakdown by age/sex when notes mention it
# Input
"Singing from dead snag at forest edge. 2 fledglings begging nearby."
# Output
{ "behaviors": [{"type": "singing", "context": "territorial"}], "breeding_evidence": {"code": "FL", "description": "fledglings"}, "life_stage": ["adult", "fledgling"], "habitat_features": ["dead_snag", "forest_edge"] }

Why this matters

Researchers today cannot answer questions like "Show me all territorial behavior observations for Cuckoo in April" without manually reading thousands of notes. Breeding phenology studies, habitat preference analyses, and behavioral research all require extracting this data by hand.

With structured extractions, that buried data becomes queryable. A single checklist note can now contribute to population-level insights.

Built for production

This isn't a toy demo. The v0.1.0 release includes:

  • LLM adapter pattern — swap between Ollama (free, local) and Claude/OpenAI (production accuracy) via config
  • Ingest pipeline — load eBird EBD files with parallel workers, crash recovery, and checkpointing
  • Human-in-loop review — low-confidence extractions route to a review queue
  • Hallucination detection — TextGroundingValidator catches claims not supported by the original note
  • Full audit trail — every extraction, validation, and review decision is logged
  • Docker Compose — spin up the full stack locally in minutes

Quick start

pip install birdlife-ont-core

The library requires Python 3.12+ and works with any Ollama-compatible local model or the Claude/OpenAI APIs.

What's next

Version 0.2 will add:

  • Claude adapter for production-grade accuracy
  • GraphQL API (Strawberry) for flexible extraction queries
  • OpenAI adapter as an alternative

Get involved

The tool is open source under MIT license:

We're looking for researchers with eBird datasets who want to try it on real data. If you have a use case in mind, open an issue or reach out on Bluesky.


Questions or feedback? Open an issue on GitHub or join us on Bluesky.