8.7 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 | 05 | execute | 1 |
|
true |
|
|
Purpose: Satisfy PROV-08 (10 Tier 8 Self-Hosted providers). Self-hosted runtimes are interesting for OSINT (exposed endpoints via Shodan) even without API keys — keyword anchors enable later recon phases to correlate.
Output: 20 YAML files.
Addresses PROV-08.
<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 Self-hosted runtimes rarely use bearer tokens. Detection relies on config env vars, localhost endpoints (11434, 8000, 1234), CLI flags. All use keyword-only — omit patterns entirely. Task 1: Ollama, vLLM, LocalAI, LM Studio, llama.cpp YAMLs providers/ollama.yaml, providers/vllm.yaml, providers/localai.yaml, providers/lmstudio.yaml, providers/llamacpp.yaml, pkg/providers/definitions/ollama.yaml, pkg/providers/definitions/vllm.yaml, pkg/providers/definitions/localai.yaml, pkg/providers/definitions/lmstudio.yaml, pkg/providers/definitions/llamacpp.yaml - pkg/providers/schema.go All 5 use keyword-only detection — omit patterns field.providers/ollama.yaml:
format_version: 1
name: ollama
display_name: Ollama
tier: 8
last_verified: "2026-04-05"
keywords:
- "ollama"
- "OLLAMA_HOST"
- "OLLAMA_API_KEY"
- "OLLAMA_MODELS"
- "localhost:11434"
- "127.0.0.1:11434"
- "api/generate"
verify:
method: GET
url: ""
headers: {}
valid_status: []
invalid_status: []
providers/vllm.yaml:
format_version: 1
name: vllm
display_name: vLLM
tier: 8
last_verified: "2026-04-05"
keywords:
- "vllm"
- "VLLM_API_KEY"
- "vllm-openai"
- "--api-key"
- "openai.api_server"
- "vllm.entrypoints"
verify:
method: GET
url: ""
headers: {}
valid_status: []
invalid_status: []
providers/localai.yaml:
format_version: 1
name: localai
display_name: LocalAI
tier: 8
last_verified: "2026-04-05"
keywords:
- "localai"
- "LOCALAI_API_KEY"
- "go-skynet"
- "localai.io"
- "localhost:8080"
verify:
method: GET
url: ""
headers: {}
valid_status: []
invalid_status: []
providers/lmstudio.yaml:
format_version: 1
name: lmstudio
display_name: LM Studio
tier: 8
last_verified: "2026-04-05"
keywords:
- "lmstudio"
- "lm-studio"
- "LMSTUDIO_API_KEY"
- "localhost:1234"
- "lmstudio.ai"
verify:
method: GET
url: ""
headers: {}
valid_status: []
invalid_status: []
providers/llamacpp.yaml:
format_version: 1
name: llamacpp
display_name: llama.cpp server
tier: 8
last_verified: "2026-04-05"
keywords:
- "llama.cpp"
- "llama-cpp"
- "llama_cpp"
- "LLAMA_API_KEY"
- "ggml"
- "gguf"
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 ollama vllm localai lmstudio llamacpp; 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 10 files exist
- grep -q 'localhost:11434' providers/ollama.yaml
- grep -q 'vllm.entrypoints' providers/vllm.yaml
- grep -q 'gguf' providers/llamacpp.yaml
- All 5 omit patterns field: grep -L 'patterns:' providers/{ollama,vllm,localai,lmstudio,llamacpp}.yaml returns all 5
- go test ./pkg/providers/... -count=1 passes
</acceptance_criteria>
5 self-hosted runtimes dual-located, keyword-only.
providers/gpt4all.yaml:
format_version: 1
name: gpt4all
display_name: GPT4All
tier: 8
last_verified: "2026-04-05"
keywords:
- "gpt4all"
- "nomic-ai"
- "GPT4ALL_API_KEY"
- "gpt4all.io"
verify:
method: GET
url: ""
headers: {}
valid_status: []
invalid_status: []
providers/text-gen-webui.yaml:
format_version: 1
name: text-gen-webui
display_name: text-generation-webui (oobabooga)
tier: 8
last_verified: "2026-04-05"
keywords:
- "text-generation-webui"
- "oobabooga"
- "TEXTGEN_API_KEY"
- "text-gen-webui"
- "localhost:5000"
verify:
method: GET
url: ""
headers: {}
valid_status: []
invalid_status: []
providers/tensorrt-llm.yaml:
format_version: 1
name: tensorrt-llm
display_name: NVIDIA TensorRT-LLM
tier: 8
last_verified: "2026-04-05"
keywords:
- "tensorrt-llm"
- "trtllm"
- "TRTLLM_API_KEY"
- "tensorrt_llm"
- "nvidia-nim"
verify:
method: GET
url: ""
headers: {}
valid_status: []
invalid_status: []
providers/triton.yaml:
format_version: 1
name: triton
display_name: NVIDIA Triton Inference Server
tier: 8
last_verified: "2026-04-05"
keywords:
- "triton-inference-server"
- "tritonserver"
- "TRITON_API_KEY"
- "triton_grpc"
- "v2/models"
verify:
method: GET
url: ""
headers: {}
valid_status: []
invalid_status: []
providers/jan.yaml:
format_version: 1
name: jan
display_name: Jan AI
tier: 8
last_verified: "2026-04-05"
keywords:
- "jan-ai"
- "janhq"
- "JAN_API_KEY"
- "jan.ai"
- "cortex-cpp"
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 gpt4all text-gen-webui tensorrt-llm triton jan; 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: 8' providers/*.yaml | wc -l) -eq 10
<acceptance_criteria>
- All 10 files exist
- grep -q 'oobabooga' providers/text-gen-webui.yaml
- grep -q 'tritonserver' providers/triton.yaml
- grep -q 'janhq' providers/jan.yaml
- Total Tier 8 count = 10
- go test ./pkg/providers/... -count=1 passes
</acceptance_criteria>
All 10 Tier 8 self-hosted runtimes dual-located. PROV-08 satisfied.
<success_criteria>
- 10 Tier 8 self-hosted runtimes created
- All keyword-only (no regex patterns — avoids false positives)
- Localhost endpoints and env vars captured as keywords
- No engine regression </success_criteria>