---
phase: 02-tier-1-2-providers
plan: 04
type: execute
wave: 1
depends_on: []
files_modified:
  - providers/lepton.yaml
  - providers/modal.yaml
  - providers/cerebrium.yaml
  - providers/novita.yaml
  - providers/sambanova.yaml
  - providers/octoai.yaml
  - providers/friendli.yaml
  - pkg/providers/definitions/lepton.yaml
  - pkg/providers/definitions/modal.yaml
  - pkg/providers/definitions/cerebrium.yaml
  - pkg/providers/definitions/novita.yaml
  - pkg/providers/definitions/sambanova.yaml
  - pkg/providers/definitions/octoai.yaml
  - pkg/providers/definitions/friendli.yaml
autonomous: true
requirements: [PROV-02]
must_haves:
  truths:
    - "Registry loads final 7 Tier 2 inference platform providers"
    - "All 14 Tier 2 providers from PROV-02 are defined after this plan"
    - "Generic-format providers use strong keyword lists for AC pre-filtering"
  artifacts:
    - path: "providers/modal.yaml"
      provides: "Modal token_id/token_secret keyword anchors"
      contains: "MODAL_TOKEN"
    - path: "providers/sambanova.yaml"
      provides: "SambaNova keyword-anchored pattern"
      contains: "sambanova"
    - path: "providers/novita.yaml"
      provides: "NovitaAI keyword-anchored pattern"
      contains: "novita"
  key_links:
    - from: "keywords[]"
      to: "Aho-Corasick pre-filter"
      via: "NewRegistry"
      pattern: "keywords"
---

<objective>
Create the remaining 7 Tier 2 inference platform provider YAMLs: Lepton AI, Modal, Cerebrium, NovitaAI, SambaNova, OctoAI, Friendli. All are generic-format providers requiring strong keyword lists.

Purpose: Complete PROV-02 (14/14 Tier 2 providers).

Output: 14 YAML files (7 providers x 2 locations).

Addresses PROV-02 requirement.
</objective>

<execution_context>
@$HOME/.claude/get-shit-done/workflows/execute-plan.md
@$HOME/.claude/get-shit-done/templates/summary.md
</execution_context>

<context>
@.planning/ROADMAP.md
@.planning/phases/02-tier-1-2-providers/02-RESEARCH.md
@pkg/providers/schema.go

<interfaces>
Schema: pkg/providers/schema.go. Dual-location required. Go RE2 regex only.
All providers in this plan: tier 2, confidence low (no distinctive prefix).
</interfaces>
</context>

<tasks>

<task type="auto">
  <name>Task 1: Lepton, Modal, Cerebrium, Novita YAMLs</name>
  <files>providers/lepton.yaml, providers/modal.yaml, providers/cerebrium.yaml, providers/novita.yaml, pkg/providers/definitions/lepton.yaml, pkg/providers/definitions/modal.yaml, pkg/providers/definitions/cerebrium.yaml, pkg/providers/definitions/novita.yaml</files>
  <read_first>
    - pkg/providers/schema.go
    - .planning/phases/02-tier-1-2-providers/02-RESEARCH.md sections "7. Lepton", "8. Modal", "10. Cerebrium", "11. NovitaAI"
  </read_first>
  <action>
Create providers/lepton.yaml:

```yaml
format_version: 1
name: lepton
display_name: Lepton AI (DGX Cloud Lepton)
tier: 2
last_verified: "2026-04-05"
keywords:
  - "lepton"
  - "lepton.ai"
  - "LEPTON_API_TOKEN"
  - "dgx-cloud-lepton"
patterns:
  - regex: '[A-Za-z0-9]{32,}'
    entropy_min: 4.0
    confidence: low
verify:
  method: GET
  url: ""
  headers: {}
  valid_status: []
  invalid_status: []
```

Create providers/modal.yaml:

```yaml
format_version: 1
name: modal
display_name: Modal
tier: 2
last_verified: "2026-04-05"
keywords:
  - "modal"
  - "modal.com"
  - "MODAL_TOKEN_ID"
  - "MODAL_TOKEN_SECRET"
  - "ak-"
  - "as-"
patterns:
  - regex: 'ak-[A-Za-z0-9]{20,}'
    entropy_min: 3.5
    confidence: medium
  - regex: 'as-[A-Za-z0-9]{20,}'
    entropy_min: 3.5
    confidence: medium
verify:
  method: GET
  url: ""
  headers: {}
  valid_status: []
  invalid_status: []
```

Create providers/cerebrium.yaml:

```yaml
format_version: 1
name: cerebrium
display_name: Cerebrium
tier: 2
last_verified: "2026-04-05"
keywords:
  - "cerebrium"
  - "cerebrium.ai"
  - "CEREBRIUM_API_KEY"
  - "api.cortex.cerebrium.ai"
patterns:
  - regex: '[A-Za-z0-9]{32,}'
    entropy_min: 4.0
    confidence: low
verify:
  method: GET
  url: ""
  headers: {}
  valid_status: []
  invalid_status: []
```

Create providers/novita.yaml:

```yaml
format_version: 1
name: novita
display_name: NovitaAI
tier: 2
last_verified: "2026-04-05"
keywords:
  - "novita"
  - "novita.ai"
  - "NOVITA_API_KEY"
  - "api.novita.ai"
patterns:
  - regex: '[A-Za-z0-9_\-]{32,}'
    entropy_min: 4.0
    confidence: low
verify:
  method: GET
  url: https://api.novita.ai/v3/openai/models
  headers:
    Authorization: "Bearer {KEY}"
  valid_status: [200]
  invalid_status: [401, 403]
```

Copy all four VERBATIM to pkg/providers/definitions/.
  </action>
  <verify>
    <automated>cd /home/salva/Documents/apikey && for f in lepton modal cerebrium novita; do diff providers/$f.yaml pkg/providers/definitions/$f.yaml || exit 1; done && go test ./pkg/providers/... -count=1</automated>
  </verify>
  <acceptance_criteria>
    - All 8 files exist
    - `grep -q 'MODAL_TOKEN_ID' providers/modal.yaml`
    - `grep -q 'cerebrium.ai' providers/cerebrium.yaml`
    - `grep -q 'api.novita.ai' providers/novita.yaml`
    - `grep -q 'lepton.ai' providers/lepton.yaml`
    - All dual-location diffs empty
    - `go test ./pkg/providers/... -count=1` passes
  </acceptance_criteria>
  <done>4 providers created and dual-located.</done>
</task>

<task type="auto">
  <name>Task 2: SambaNova, OctoAI, Friendli YAMLs</name>
  <files>providers/sambanova.yaml, providers/octoai.yaml, providers/friendli.yaml, pkg/providers/definitions/sambanova.yaml, pkg/providers/definitions/octoai.yaml, pkg/providers/definitions/friendli.yaml</files>
  <read_first>
    - pkg/providers/schema.go
    - .planning/phases/02-tier-1-2-providers/02-RESEARCH.md sections "12. SambaNova", "13. OctoAI", "14. Friendli"
  </read_first>
  <action>
Create providers/sambanova.yaml:

```yaml
format_version: 1
name: sambanova
display_name: SambaNova
tier: 2
last_verified: "2026-04-05"
keywords:
  - "sambanova"
  - "sambanova.ai"
  - "SAMBANOVA_API_KEY"
  - "sambastudio"
  - "api.sambanova.ai"
patterns:
  - regex: '[a-f0-9\-]{36}'
    entropy_min: 3.5
    confidence: low
  - regex: '[A-Za-z0-9]{40,}'
    entropy_min: 4.0
    confidence: low
verify:
  method: GET
  url: https://api.sambanova.ai/v1/models
  headers:
    Authorization: "Bearer {KEY}"
  valid_status: [200]
  invalid_status: [401, 403]
```

Create providers/octoai.yaml:

```yaml
format_version: 1
name: octoai
display_name: OctoAI
tier: 2
last_verified: "2026-04-05"
keywords:
  - "octoai"
  - "octo.ai"
  - "OCTOAI_TOKEN"
  - "OCTOAI_API_KEY"
patterns:
  - regex: '[A-Za-z0-9\-_\.]{40,}'
    entropy_min: 4.0
    confidence: low
verify:
  method: GET
  url: ""
  headers: {}
  valid_status: []
  invalid_status: []
```

Create providers/friendli.yaml:

```yaml
format_version: 1
name: friendli
display_name: Friendli
tier: 2
last_verified: "2026-04-05"
keywords:
  - "friendli"
  - "friendli.ai"
  - "FRIENDLI_TOKEN"
  - "flp_"
patterns:
  - regex: 'flp_[A-Za-z0-9]{20,}'
    entropy_min: 3.5
    confidence: medium
  - regex: '[A-Za-z0-9]{32,}'
    entropy_min: 4.0
    confidence: low
verify:
  method: GET
  url: ""
  headers: {}
  valid_status: []
  invalid_status: []
```

Copy all three VERBATIM to pkg/providers/definitions/.
  </action>
  <verify>
    <automated>cd /home/salva/Documents/apikey && for f in sambanova octoai friendli; do diff providers/$f.yaml pkg/providers/definitions/$f.yaml || exit 1; done && go test ./pkg/providers/... -count=1</automated>
  </verify>
  <acceptance_criteria>
    - All 6 files exist
    - `grep -q 'sambanova' providers/sambanova.yaml`
    - `grep -q 'octo.ai' providers/octoai.yaml`
    - `grep -q 'FRIENDLI_TOKEN' providers/friendli.yaml`
    - All dual-location diffs empty
    - `go test ./pkg/providers/... -count=1` passes
    - After this task: `ls pkg/providers/definitions/*.yaml | wc -l` >= 27 (huggingface + 26 tier1/2)
  </acceptance_criteria>
  <done>Final 3 Tier 2 providers created. All 14 PROV-02 providers complete.</done>
</task>

</tasks>

<verification>
After plan: `grep -l 'tier: 2' providers/*.yaml | wc -l` equals 14.
</verification>

<success_criteria>
- 7 generic-format Tier 2 providers created
- Dual-location verified
- Registry loads cleanly
- Tier 2 total = 14 providers
</success_criteria>

<output>
After completion, create `.planning/phases/02-tier-1-2-providers/02-04-SUMMARY.md`
</output>
