peregrine/app/wizard
pyr0ball be3bed6e54 feat: BYOK unlocks LLM features regardless of tier
BYOK policy: if a user supplies any LLM backend (local ollama/vllm or
their own API key), they get full access to AI generation features.
Charging for the UI around a service they already pay for is bad UX.

app/wizard/tiers.py:
  - BYOK_UNLOCKABLE frozenset: pure LLM-call features that unlock with
    any configured backend (llm_career_summary, company_research,
    interview_prep, survey_assistant, voice guidelines, etc.)
  - has_configured_llm(): checks llm.yaml for any enabled non-vision
    backend; local + external API keys both count
  - can_use(tier, feature, has_byok=False): BYOK_UNLOCKABLE features
    return True when has_byok=True regardless of tier
  - tier_label(feature, has_byok=False): suppresses lock icon for
    BYOK_UNLOCKABLE features when BYOK is active

Still gated (require CF infrastructure, not just an LLM call):
  llm_keywords_blocklist, email_classifier, model_fine_tuning,
  shared_cover_writer_model, multi_user, all integrations

app/pages/2_Settings.py:
  - Compute _byok = has_configured_llm() once at page load
  - Pass has_byok=_byok to can_use() for _gen_panel_active
  - Update caption to mention BYOK as an alternative to paid tier

app/pages/0_Setup.py:
  - Wizard generation widget passes has_byok=has_configured_llm()
    to can_use() and tier_label()

tests/test_wizard_tiers.py:
  - 6 new BYOK-specific tests covering unlock, non-unlock, and
    label suppression cases
2026-03-02 11:34:36 -08:00
..
__init__.py feat: tier system with FEATURES gate + can_use() + tier_label() 2026-02-25 07:55:47 -08:00
step_hardware.py feat: wizard step validate() functions — all six mandatory steps 2026-02-25 08:00:18 -08:00
step_identity.py feat: wizard step validate() functions — all six mandatory steps 2026-02-25 08:00:18 -08:00
step_inference.py feat: wizard step validate() functions — all six mandatory steps 2026-02-25 08:00:18 -08:00
step_integrations.py feat: step_integrations module with validate() + tier-filtered available list 2026-02-25 08:35:16 -08:00
step_resume.py feat: wizard step validate() functions — all six mandatory steps 2026-02-25 08:00:18 -08:00
step_search.py feat: wizard step validate() functions — all six mandatory steps 2026-02-25 08:00:18 -08:00
step_tier.py feat: wizard step validate() functions — all six mandatory steps 2026-02-25 08:00:18 -08:00
tiers.py feat: BYOK unlocks LLM features regardless of tier 2026-03-02 11:34:36 -08:00