greydgl--pentestgpt
b9869307d0
* fix: 🐛 minor typo and build process * feat: 🎸 [WIP] Pentest mode * feat: 🎸 code abstraction * feat: modernize legacy PentestGPT with native multi-LLM support (#469) Rebuild the classic USENIX-2024 interactive PentestGPT (reasoning / generation / parsing sessions + Pentesting Task Tree + REPL) as a standalone `pentestgpt_legacy` package on a native per-provider LLM layer that supports the latest 2026 models. - llm/: BaseProvider + OpenAI-compatible / Anthropic / Gemini connectors, a web-verified model registry (OpenAI, Anthropic, Gemini, DeepSeek, xAI, Qwen, Moonshot, local Ollama), a factory, and an LLMClient bridging async providers to the core's synchronous send_new_message/send_message session API. - CLI `pentestgpt-legacy`: --list-models and --smoke-test (live per-model round-trip matrix), plus --reasoning-model / --parsing-model / --base-url. - Tests: 25 unit tests (mocked, no network). Live smoke test verified 22/22 models with a configured key respond. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> * fix(backend): address review on ClaudeCodeBackend subprocess handling - _build_env: pop ANTHROPIC_API_KEY instead of setting it to "", so an empty value can't shadow the CLI's own auth fallback (e.g. subscription login). - _kill_process: reap the force-killed process with os.waitpid(.., WNOHANG) instead of calling the proc.wait() coroutine without awaiting it (removes the "coroutine was never awaited" warning). - query/_drain_stderr: drain subprocess stderr in a background task so its pipe buffer can't fill and deadlock the child. Also reformats backend.py, fixing the failing Lint (ruff format) check. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix(docker-test): assert uv instead of Poetry in container health check The project migrated from Poetry to uv (the Dockerfile installs uv to /home/pentester/.local/bin, which is on PATH), so test_poetry_installed failed with exit 127. Replace it with test_uv_installed checking `uv --version`. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
67 行
1.6 KiB
Python
67 行
1.6 KiB
Python
"""Tests for the supported-model registry."""
|
|
|
|
import pytest
|
|
|
|
from pentestgpt_legacy.llm.registry import (
|
|
MODELS,
|
|
PROVIDERS,
|
|
all_model_ids,
|
|
models_by_provider,
|
|
resolve,
|
|
)
|
|
|
|
pytestmark = pytest.mark.unit
|
|
|
|
|
|
def test_resolve_known_model() -> None:
|
|
spec = resolve("gpt-5.5")
|
|
assert spec is not None
|
|
assert spec.provider == "openai"
|
|
assert spec.api_id == "gpt-5.5" # api_id defaults to id
|
|
|
|
|
|
def test_resolve_alias() -> None:
|
|
spec = resolve("claude-haiku-4-5")
|
|
assert spec is not None
|
|
assert spec.id == "claude-haiku-4-5-20251001"
|
|
|
|
|
|
def test_resolve_ollama_dynamic() -> None:
|
|
spec = resolve("ollama:qwen3")
|
|
assert spec is not None
|
|
assert spec.provider == "ollama"
|
|
assert spec.api_id == "qwen3"
|
|
|
|
|
|
def test_resolve_ollama_empty_is_none() -> None:
|
|
assert resolve("ollama:") is None
|
|
|
|
|
|
def test_resolve_unknown_is_none() -> None:
|
|
assert resolve("definitely-not-a-model") is None
|
|
|
|
|
|
def test_all_model_ids_unique_and_nonempty() -> None:
|
|
ids = all_model_ids()
|
|
assert ids
|
|
assert len(ids) == len(set(ids))
|
|
|
|
|
|
def test_every_model_provider_is_registered() -> None:
|
|
for spec in MODELS.values():
|
|
assert spec.provider in PROVIDERS
|
|
|
|
|
|
def test_api_id_defaults_to_id() -> None:
|
|
for spec in MODELS.values():
|
|
assert spec.api_id # never empty
|
|
|
|
|
|
def test_models_by_provider_covers_all() -> None:
|
|
grouped = models_by_provider()
|
|
total = sum(len(specs) for specs in grouped.values())
|
|
assert total == len(MODELS)
|
|
# current flagship providers must be present
|
|
for provider in ("openai", "anthropic", "gemini", "deepseek"):
|
|
assert provider in grouped
|