affaan-m/ECC · error · MissingKeyError

FAL_KEY is not set. Get a key at…

Error message

FAL_KEY is not set.
  Get a key at https://fal.ai/dashboard/keys, then either:
    export FAL_KEY='...'
  or run the pipeline offline with no key and no spend:
    export TASTE_FORGE_DRY_RUN=1      (or pass --dry-run)

What it means

Error "FAL_KEY is not set. Get a key at https://fal.ai/dashboard/keys, then either: export FAL_KEY='...' or run the pipeline offline with no key and no spend: export TASTE_FORGE_DRY_RUN=1 (or pass --dry-run)" thrown in affaan-m/ECC.

Solutions

  1. export FAL_KEY='<your key>' after creating one at https://fal.ai/dashboard/keys
  2. Or run fully offline with TASTE_FORGE_DRY_RUN=1 / --dry-run (no key, no spend)
Defensive patterns

Strategy: fallback

When it happens

Trigger: Thrown at skills/taste-application/scripts/falapi.py:199 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of affaan-m/ECC@8321021c54 (2026-09-16). Data as JSON: /api/errors/e41633a23ef2123b. Report an issue: GitHub.

Appendix: source

Thrown at skills/taste-application/scripts/falapi.py:199

    if os.environ.get("TASTE_FORGE_ALLOW_LIVE") != "1":
        raise FalError("live transport requires TASTE_FORGE_ALLOW_LIVE=1")


def safe_url(url: str) -> str:
    """Log only origin: paths, queries and userinfo can carry signed secrets."""
    try:
        parsed = urllib.parse.urlsplit(url)
        return f"{parsed.scheme}://{parsed.hostname or '[invalid-host]'}"
    except ValueError:
        return "[invalid-url]"


def api_key() -> str:
    """Return ``FAL_KEY`` after live opt-in. Never logs the value."""
    require_live()
    key = os.environ.get("FAL_KEY", "").strip()
    if not key:
        raise MissingKeyError(
            "FAL_KEY is not set.\n"
            "  Get a key at https://fal.ai/dashboard/keys, then either:\n"
            "    export FAL_KEY='...'\n"
            "  or run the pipeline offline with no key and no spend:\n"
            f"    export {DRY_RUN_ENV}=1      (or pass --dry-run)"
        )
    return key


def _fal():
    """Import ``fal_client`` lazily so dry runs work even if it is absent."""
    try:
        import fal_client  # noqa: PLC0415 - deliberate lazy import
    except ImportError as exc:  # pragma: no cover - environment dependent
        raise FalError(
            "the 'fal_client' package is required for live calls: pip install fal-client"
        ) from exc
    return fal_client

View on GitHub (pinned to 8321021c54)