10 KiB
phase, plan, type, wave, depends_on, files_modified, autonomous, requirements, must_haves
| phase | plan | type | wave | depends_on | files_modified | autonomous | requirements | must_haves | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 03-tier-3-9-providers | 03 | execute | 1 |
|
true |
|
|
Purpose: Satisfy PROV-05 (11 Tier 5 Infrastructure/Gateway providers). Several of these have documented key prefixes (sk-or-, sk-helicone-) that support high-confidence detection.
Output: 22 YAML files.
Addresses PROV-05.
<execution_context> @$HOME/.claude/get-shit-done/workflows/execute-plan.md @$HOME/.claude/get-shit-done/templates/summary.md </execution_context>
@.planning/ROADMAP.md @.planning/phases/03-tier-3-9-providers/03-CONTEXT.md @pkg/providers/schema.go @providers/groq.yaml Schema per pkg/providers/schema.go. No category field. Dual-location required. RE2 regex only. Keyword-only detection for providers without documented key formats. Task 1: OpenRouter, LiteLLM, Cloudflare, Vercel, Portkey, Helicone YAMLs providers/openrouter.yaml, providers/litellm.yaml, providers/cloudflare-ai.yaml, providers/vercel-ai.yaml, providers/portkey.yaml, providers/helicone.yaml, pkg/providers/definitions/openrouter.yaml, pkg/providers/definitions/litellm.yaml, pkg/providers/definitions/cloudflare-ai.yaml, pkg/providers/definitions/vercel-ai.yaml, pkg/providers/definitions/portkey.yaml, pkg/providers/definitions/helicone.yaml - pkg/providers/schema.go providers/openrouter.yaml: ```yaml format_version: 1 name: openrouter display_name: OpenRouter tier: 5 last_verified: "2026-04-05" keywords: - "openrouter" - "OPENROUTER_API_KEY" - "openrouter.ai" - "sk-or-" patterns: - regex: 'sk-or-v1-[a-f0-9]{64}' entropy_min: 4.0 confidence: high - regex: 'sk-or-[A-Za-z0-9]{40,}' entropy_min: 4.0 confidence: medium verify: method: GET url: https://openrouter.ai/api/v1/auth/key headers: Authorization: "Bearer {KEY}" valid_status: [200] invalid_status: [401, 403] ```providers/litellm.yaml:
format_version: 1
name: litellm
display_name: LiteLLM Proxy
tier: 5
last_verified: "2026-04-05"
keywords:
- "litellm"
- "LITELLM_API_KEY"
- "LITELLM_MASTER_KEY"
- "LITELLM_PROXY_API_KEY"
patterns:
- regex: 'sk-[A-Za-z0-9_\-]{20,}'
entropy_min: 4.0
confidence: low
verify:
method: GET
url: ""
headers: {}
valid_status: []
invalid_status: []
providers/cloudflare-ai.yaml:
format_version: 1
name: cloudflare-ai
display_name: Cloudflare Workers AI
tier: 5
last_verified: "2026-04-05"
keywords:
- "cloudflare"
- "workers-ai"
- "CLOUDFLARE_API_TOKEN"
- "CLOUDFLARE_ACCOUNT_ID"
- "CF_API_TOKEN"
- "api.cloudflare.com"
patterns:
- regex: '[A-Za-z0-9_\-]{40}'
entropy_min: 4.5
confidence: low
verify:
method: GET
url: https://api.cloudflare.com/client/v4/user/tokens/verify
headers:
Authorization: "Bearer {KEY}"
valid_status: [200]
invalid_status: [401, 403]
providers/vercel-ai.yaml:
format_version: 1
name: vercel-ai
display_name: Vercel AI Gateway
tier: 5
last_verified: "2026-04-05"
keywords:
- "vercel"
- "VERCEL_AI_GATEWAY"
- "AI_GATEWAY_API_KEY"
- "vercel.ai"
- "ai-sdk"
verify:
method: GET
url: ""
headers: {}
valid_status: []
invalid_status: []
providers/portkey.yaml:
format_version: 1
name: portkey
display_name: Portkey
tier: 5
last_verified: "2026-04-05"
keywords:
- "portkey"
- "PORTKEY_API_KEY"
- "api.portkey.ai"
- "portkey-ai"
verify:
method: GET
url: https://api.portkey.ai/v1/feedback
headers:
x-portkey-api-key: "{KEY}"
valid_status: [200, 400]
invalid_status: [401, 403]
providers/helicone.yaml:
format_version: 1
name: helicone
display_name: Helicone
tier: 5
last_verified: "2026-04-05"
keywords:
- "helicone"
- "HELICONE_API_KEY"
- "sk-helicone-"
- "api.helicone.ai"
patterns:
- regex: 'sk-helicone-[a-z0-9]{7}-[a-z0-9]{7}-[a-z0-9]{7}-[a-z0-9]{7}'
entropy_min: 3.5
confidence: high
verify:
method: GET
url: https://api.helicone.ai/v1/key/verify
headers:
Authorization: "Bearer {KEY}"
valid_status: [200]
invalid_status: [401, 403]
Copy all 6 files verbatim to pkg/providers/definitions/.
cd /home/salva/Documents/apikey && for f in openrouter litellm cloudflare-ai vercel-ai portkey helicone; do diff providers/$f.yaml pkg/providers/definitions/$f.yaml || exit 1; done && go test ./pkg/providers/... -count=1 && go test ./pkg/engine/... -count=1
<acceptance_criteria>
- All 12 files exist
- grep -q 'sk-or-v1-' providers/openrouter.yaml
- grep -q 'sk-helicone-' providers/helicone.yaml
- grep -q 'LITELLM_MASTER_KEY' providers/litellm.yaml
- go test ./pkg/providers/... -count=1 passes
- go test ./pkg/engine/... -count=1 passes
</acceptance_criteria>
6 major gateway providers dual-located.
providers/martian.yaml:
format_version: 1
name: martian
display_name: Martian (Model Router)
tier: 5
last_verified: "2026-04-05"
keywords:
- "withmartian"
- "MARTIAN_API_KEY"
- "withmartian.com"
- "martian-router"
verify:
method: GET
url: ""
headers: {}
valid_status: []
invalid_status: []
providers/kong.yaml:
format_version: 1
name: kong
display_name: Kong AI Gateway
tier: 5
last_verified: "2026-04-05"
keywords:
- "kong"
- "KONG_API_KEY"
- "kong-ai-gateway"
- "konghq.com"
- "ai-proxy"
verify:
method: GET
url: ""
headers: {}
valid_status: []
invalid_status: []
providers/bricksai.yaml:
format_version: 1
name: bricksai
display_name: BricksAI
tier: 5
last_verified: "2026-04-05"
keywords:
- "bricksai"
- "BRICKS_API_KEY"
- "trybricks.ai"
- "bricksllm"
verify:
method: GET
url: ""
headers: {}
valid_status: []
invalid_status: []
providers/aether.yaml:
format_version: 1
name: aether
display_name: Aether AI
tier: 5
last_verified: "2026-04-05"
keywords:
- "aether"
- "AETHER_API_KEY"
- "aether.ai"
- "aetherplatform"
verify:
method: GET
url: ""
headers: {}
valid_status: []
invalid_status: []
providers/notdiamond.yaml:
format_version: 1
name: notdiamond
display_name: Not Diamond
tier: 5
last_verified: "2026-04-05"
keywords:
- "notdiamond"
- "NOTDIAMOND_API_KEY"
- "not-diamond"
- "notdiamond.ai"
verify:
method: GET
url: ""
headers: {}
valid_status: []
invalid_status: []
Copy all 5 files verbatim to pkg/providers/definitions/.
cd /home/salva/Documents/apikey && for f in martian kong bricksai aether notdiamond; do diff providers/$f.yaml pkg/providers/definitions/$f.yaml || exit 1; done && go test ./pkg/providers/... -count=1 && go test ./pkg/engine/... -count=1 && test "$(grep -l 'tier: 5' providers/*.yaml | wc -l)" = "11"
<acceptance_criteria>
- All 10 files exist
- grep -q 'withmartian' providers/martian.yaml
- grep -q 'konghq.com' providers/kong.yaml
- All 5 omit patterns field: grep -L 'patterns:' providers/{martian,kong,bricksai,aether,notdiamond}.yaml returns all 5
- Total Tier 5 count = 11: grep -l 'tier: 5' providers/*.yaml | wc -l → 11
- go test ./pkg/providers/... -count=1 passes
</acceptance_criteria>
All 11 Tier 5 gateway providers dual-located. PROV-05 satisfied.
<success_criteria>
- 11 Tier 5 gateway providers created
- Documented prefixes use tight high-confidence regex (openrouter, helicone)
- Undocumented providers use keyword-only detection
- No engine test regressions </success_criteria>