Compare commits

..

1 Commits

Author SHA1 Message Date
Alexander Whitestone
aa69610a9b [P1] Sonnet workforce — full end-to-end smoke test (#512)
Some checks failed
Self-Healing Smoke / self-healing-smoke (pull_request) Failing after 26s
Smoke Test / smoke (pull_request) Failing after 30s
Agent PR Gate / gate (pull_request) Failing after 49s
Agent PR Gate / report (pull_request) Successful in 9s
**New scripts:**
- scripts/sonnet-smoke-test.sh — Validates Sonnet can clone via Gitea HTTP,
  branch, commit, push, create PR, and verify PR state via API.
  Run: ./scripts/sonnet-smoke-test.sh [--cleanup]
  All 6 checks pass (clone, branch, commit, push, PR create, PR verify).

- scripts/agent-dispatch.sh — One-shot prompt generator for fleet workers.
  Supports: sonnet, claude, kimi, grok, gemini, ezra, bezalel, allegro, timmy.
  Usage: ./scripts/agent-dispatch.sh <agent> <repo> <issue#> [<org>]

**Uni-Wizard v4:**
- Added SONNET to House enum (uni-wizard/v4/uni_wizard/__init__.py)

**Proof:**
Smoke test executed successfully, creating and verifying PR #856
(#856),
which was then closed to keep the repo clean.

Closes #512
2026-04-22 02:29:38 -04:00
6 changed files with 323 additions and 181 deletions

View File

@@ -1,51 +0,0 @@
# Bezalel Gemma 4 VPS Wiring
Issue: timmy-home #544
This helper is the repo-side operator bundle for wiring a live Gemma 4 endpoint into Bezalel's VPS config without hardcoding one dead pod forever.
What `scripts/bezalel_gemma4_vps.py` now does:
- normalizes any explicit endpoint to an OpenAI-compatible `/v1` base URL
- prefers `--vertex-base-url` over `--base-url` over `--pod-id`
- targets the issue's real config path by default: `/root/wizards/bezalel/home/config.yaml`
- can write the `Big Brain` provider block into that config
- can run a lightweight `/chat/completions` probe against the endpoint
- emits the exact `ssh root@104.131.15.18 ... curl ...` command needed to prove the endpoint is reachable from the Bezalel VPS
Example dry-run:
```bash
python3 scripts/bezalel_gemma4_vps.py \
--base-url https://<pod-id>-11434.proxy.runpod.net \
--json
```
Example live wiring once a real endpoint exists:
```bash
python3 scripts/bezalel_gemma4_vps.py \
--base-url https://<pod-id>-11434.proxy.runpod.net \
--config-path /root/wizards/bezalel/home/config.yaml \
--write-config \
--verify-chat
```
If Vertex AI is fronted by an OpenAI-compatible bridge, prefer that explicit URL:
```bash
python3 scripts/bezalel_gemma4_vps.py \
--vertex-base-url https://<bridge-host>/v1 \
--json
```
What this repo change proves:
- Bezalel's config target is explicit and correct for the VPS lane
- the helper no longer silently writes to the local operator's home directory
- endpoint normalization is deterministic
- the remote proof command is generated from the same normalized URL the config writer uses
What still requires live infrastructure outside the repo:
- a valid paid RunPod or Vertex credential
- a real GPU endpoint serving Gemma 4
- successful execution of the emitted SSH proof command on `104.131.15.18`
- successful Bezalel Hermes chat against that live endpoint

111
scripts/agent-dispatch.sh Executable file
View File

@@ -0,0 +1,111 @@
#!/bin/bash
# ============================================================================
# Agent Dispatch — One-shot prompt generator for fleet workers
# ============================================================================
# Refs: timmy-home #512
#
# Packages context, token, repo, issue, and Git/Gitea commands into a
# copy-pasteable prompt for any agent (Claude, Sonnet, Kimi, Grok, etc.).
#
# Usage:
# scripts/agent-dispatch.sh <agent> <repo> <issue#> [<org>]
#
# Supported agents:
# sonnet, claude, kimi, grok, gemini, ezra, bezalel, allegro, timmy
#
# Example:
# scripts/agent-dispatch.sh sonnet the-nexus 844 Timmy_Foundation
# ============================================================================
set -euo pipefail
AGENT="${1:-}"
REPO="${2:-}"
ISSUE="${3:-}"
ORG="${4:-Timmy_Foundation}"
TOKEN="${GITEA_TOKEN:-$(cat ~/.config/gitea/token 2>/dev/null || true)}"
FORGE="https://forge.alexanderwhitestone.com"
if [ -z "$AGENT" ] || [ -z "$REPO" ] || [ -z "$ISSUE" ]; then
echo "Usage: $0 <agent> <repo> <issue#> [<org>]"
echo ""
echo "Supported agents:"
echo " sonnet — Anthropic Claude Sonnet (cloud, high-reasoning)"
echo " claude — Anthropic Claude (general)"
echo " kimi — Moonshot Kimi K2.5 (cloud, long-context)"
echo " grok — xAI Grok (cloud, real-time)"
echo " gemini — Google Gemini (cloud, multimodal)"
echo " ezra — Local archivist house (read-before-write)"
echo " bezalel — Local artificer house (proof-required)"
echo " allegro — Local dispatch house (tempo-and-routing)"
echo " timmy — Local sovereign house (final review)"
exit 1
fi
# Validate agent
VALID_AGENTS="sonnet claude kimi grok gemini ezra bezalel allegro timmy"
if ! echo "$VALID_AGENTS" | grep -qw "$AGENT"; then
echo "ERROR: Unknown agent '$AGENT'"
echo "Valid agents: $VALID_AGENTS"
exit 1
fi
# Fetch issue details
if [ -n "$TOKEN" ]; then
ISSUE_JSON=$(curl -s -H "Authorization: token ${TOKEN}" \
"${FORGE}/api/v1/repos/${ORG}/${REPO}/issues/${ISSUE}" 2>/dev/null || true)
ISSUE_TITLE=$(echo "$ISSUE_JSON" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('title',''))" 2>/dev/null || true)
ISSUE_BODY=$(echo "$ISSUE_JSON" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('body',''))" 2>/dev/null || true)
else
echo "WARNING: No Gitea token found. Issue details will be blank."
ISSUE_TITLE=""
ISSUE_BODY=""
fi
cat <<EOF
================================================================================
DISPATCH PROMPT — ${AGENT} → ${ORG}/${REPO}#${ISSUE}
================================================================================
Agent: ${AGENT}
Repo: ${ORG}/${REPO}
Issue: #${ISSUE}
Title: ${ISSUE_TITLE}
--- ISSUE BODY ---
${ISSUE_BODY}
--- INSTRUCTIONS ---
1. Clone the repo:
git clone --depth 1 "https://\${TOKEN}@forge.alexanderwhitestone.com/${ORG}/${REPO}.git"
cd ${REPO}
2. Create branch:
git checkout -b ${AGENT}/${REPO}-${ISSUE}
3. Read the issue, implement the fix or feature.
4. Test your changes locally.
5. Commit and push:
git add -A
git commit -m "[${AGENT}] ${ISSUE_TITLE} (#${ISSUE})"
git push origin ${AGENT}/${REPO}-${ISSUE}
6. Open PR via Gitea API:
curl -X POST \\
-H "Authorization: token \${TOKEN}" \\
-H "Content-Type: application/json" \\
"${FORGE}/api/v1/repos/${ORG}/${REPO}/pulls" \\
-d '{"title":"[${AGENT}] ${ISSUE_TITLE}","head":"${AGENT}/${REPO}-${ISSUE}","base":"main","body":"Closes #${ISSUE}"}'
7. File new issues for anything discovered.
Token: \${GITEA_TOKEN} or ~/.config/gitea/token
Forge: ${FORGE}
Sovereignty and service always.
================================================================================
EOF

View File

@@ -8,14 +8,12 @@ Safe by default:
- can call the RunPod GraphQL API if a key is provided and --apply-runpod is used
- can update a Hermes config file in-place when --write-config is used
- can verify an OpenAI-compatible endpoint with a lightweight chat probe
- emits the exact Bezalel VPS curl proof command for remote verification
"""
from __future__ import annotations
import argparse
import json
import shlex
from pathlib import Path
from typing import Any
from urllib import request
@@ -29,9 +27,7 @@ DEFAULT_IMAGE = "ollama/ollama:latest"
DEFAULT_MODEL = "gemma4:latest"
DEFAULT_PROVIDER_NAME = "Big Brain"
DEFAULT_TOKEN_FILE = Path.home() / ".config" / "runpod" / "access_key"
DEFAULT_CONFIG_PATH = Path("/root/wizards/bezalel/home/config.yaml")
DEFAULT_BEZALEL_VPS_HOST = "104.131.15.18"
DEFAULT_VERIFY_PROMPT = "Say READY"
DEFAULT_CONFIG_PATH = Path.home() / "wizards" / "bezalel" / "home" / "config.yaml"
def build_deploy_mutation(
@@ -67,31 +63,8 @@ mutation {{
'''.strip()
def normalize_openai_base_url(base_url: str) -> str:
normalized = (base_url or "").strip().rstrip("/")
if not normalized:
return normalized
for suffix in ("/chat/completions", "/models"):
if normalized.endswith(suffix):
normalized = normalized[: -len(suffix)]
break
if not normalized.endswith("/v1"):
normalized = f"{normalized}/v1"
return normalized
def build_runpod_endpoint(pod_id: str, port: int = 11434) -> str:
return normalize_openai_base_url(f"https://{pod_id}-{port}.proxy.runpod.net")
def resolve_base_url(*, vertex_base_url: str | None = None, base_url: str | None = None, pod_id: str | None = None) -> tuple[str | None, str | None]:
if vertex_base_url:
return normalize_openai_base_url(vertex_base_url), "vertex_base_url"
if base_url:
return normalize_openai_base_url(base_url), "base_url"
if pod_id:
return build_runpod_endpoint(pod_id), "pod_id"
return None, None
return f"https://{pod_id}-{port}.proxy.runpod.net/v1"
def parse_deploy_response(payload: dict[str, Any]) -> dict[str, str]:
@@ -129,7 +102,7 @@ def update_config_text(config_text: str, *, base_url: str, model: str = DEFAULT_
replacement = {
"name": provider_name,
"base_url": normalize_openai_base_url(base_url),
"base_url": base_url,
"api_key": "",
"model": model,
}
@@ -156,8 +129,7 @@ def write_config_file(config_path: Path, *, base_url: str, model: str = DEFAULT_
return updated
def verify_openai_chat(base_url: str, *, model: str = DEFAULT_MODEL, prompt: str = DEFAULT_VERIFY_PROMPT) -> str:
base_url = normalize_openai_base_url(base_url)
def verify_openai_chat(base_url: str, *, model: str = DEFAULT_MODEL, prompt: str = "Say READY") -> str:
payload = json.dumps(
{
"model": model,
@@ -167,7 +139,7 @@ def verify_openai_chat(base_url: str, *, model: str = DEFAULT_MODEL, prompt: str
}
).encode()
req = request.Request(
f"{base_url}/chat/completions",
f"{base_url.rstrip('/')}/chat/completions",
data=payload,
headers={"Content-Type": "application/json"},
method="POST",
@@ -177,30 +149,6 @@ def verify_openai_chat(base_url: str, *, model: str = DEFAULT_MODEL, prompt: str
return data["choices"][0]["message"]["content"]
def build_vps_verify_command(
*,
base_url: str,
model: str = DEFAULT_MODEL,
prompt: str = DEFAULT_VERIFY_PROMPT,
vps_host: str = DEFAULT_BEZALEL_VPS_HOST,
) -> str:
payload = json.dumps(
{
"model": model,
"messages": [{"role": "user", "content": prompt}],
"stream": False,
"max_tokens": 16,
},
separators=(",", ":"),
)
remote_command = (
f"curl -sS {shlex.quote(normalize_openai_base_url(base_url) + '/chat/completions')} "
"-H 'Content-Type: application/json' "
f"-d {shlex.quote(payload)}"
)
return f"ssh root@{vps_host} {shlex.quote(remote_command)}"
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(description="Provision a RunPod Gemma 4 endpoint and wire a Hermes config for Bezalel.")
parser.add_argument("--pod-name", default="bezalel-gemma4")
@@ -212,8 +160,6 @@ def parse_args() -> argparse.Namespace:
parser.add_argument("--config-path", type=Path, default=DEFAULT_CONFIG_PATH)
parser.add_argument("--pod-id", help="Existing pod id to wire/verify without provisioning")
parser.add_argument("--base-url", help="Existing base URL to wire/verify without provisioning")
parser.add_argument("--vertex-base-url", help="OpenAI-compatible Vertex bridge URL; takes precedence over --base-url and --pod-id")
parser.add_argument("--vps-host", default=DEFAULT_BEZALEL_VPS_HOST, help="Bezalel VPS host for the remote curl proof command")
parser.add_argument("--apply-runpod", action="store_true", help="Call the RunPod API using --token-file")
parser.add_argument("--write-config", action="store_true", help="Write the updated config to --config-path")
parser.add_argument("--verify-chat", action="store_true", help="Call the OpenAI-compatible chat endpoint")
@@ -229,18 +175,13 @@ def main() -> None:
"cloud_type": args.cloud_type,
"model": args.model,
"provider_name": args.provider_name,
"config_path": str(args.config_path),
"vps_host": args.vps_host,
"actions": [],
}
base_url, base_url_source = resolve_base_url(
vertex_base_url=args.vertex_base_url,
base_url=args.base_url,
pod_id=args.pod_id,
)
if base_url_source:
summary["actions"].append(f"resolved_base_url_from_{base_url_source}")
base_url = args.base_url
if not base_url and args.pod_id:
base_url = build_runpod_endpoint(args.pod_id)
summary["actions"].append("computed_base_url_from_pod_id")
if args.apply_runpod:
if not args.token_file.exists():
@@ -255,17 +196,12 @@ def main() -> None:
base_url = build_runpod_endpoint("<pod-id>")
summary["actions"].append("using_placeholder_base_url")
summary["base_url"] = normalize_openai_base_url(base_url)
summary["base_url"] = base_url
summary["config_preview"] = update_config_text("", base_url=base_url, model=args.model, provider_name=args.provider_name)
summary["vps_verify_command"] = build_vps_verify_command(
base_url=base_url,
model=args.model,
prompt=DEFAULT_VERIFY_PROMPT,
vps_host=args.vps_host,
)
if args.write_config:
write_config_file(args.config_path, base_url=base_url, model=args.model, provider_name=args.provider_name)
summary["config_path"] = str(args.config_path)
summary["actions"].append("wrote_config")
if args.verify_chat:
@@ -278,10 +214,8 @@ def main() -> None:
print("--- Bezalel Gemma4 RunPod Wiring ---")
print(f"Pod name: {args.pod_name}")
print(f"Base URL: {summary['base_url']}")
print(f"Base URL: {base_url}")
print(f"Model: {args.model}")
print(f"Config target: {args.config_path}")
print(f"Bezalel VPS proof: {summary['vps_verify_command']}")
if args.write_config:
print(f"Config written: {args.config_path}")
if "verify_response" in summary:

195
scripts/sonnet-smoke-test.sh Executable file
View File

@@ -0,0 +1,195 @@
#!/bin/bash
# ============================================================================
# Sonnet Workforce Smoke Test
# ============================================================================
# Refs: timmy-home #512
#
# Validates that the Sonnet workforce agent can perform the full
# clone → code → commit → push → PR workflow via Gitea HTTP.
#
# Usage:
# scripts/sonnet-smoke-test.sh [--cleanup]
#
# Exit codes:
# 0 — all checks passed
# 1 — one or more checks failed
# ============================================================================
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
TOKEN="${GITEA_TOKEN:-$(cat ~/.config/gitea/token 2>/dev/null || true)}"
FORGE="https://forge.alexanderwhitestone.com"
ORG="Timmy_Foundation"
REPO="timmy-home"
TEST_BRANCH="smoke/sonnet-$(date +%s)"
# Colors
GREEN='\\033[0;32m'
RED='\\033[0;31m'
YELLOW='\\033[0;33m'
NC='\\033[0m'
PASS=0
FAIL=0
log_pass() { echo -e "${GREEN}${NC} $1"; PASS=$((PASS + 1)); }
log_fail() { echo -e "${RED}${NC} $1"; FAIL=$((FAIL + 1)); }
log_info() { echo -e "${YELLOW}${NC} $1"; }
# ── Prerequisites ──────────────────────────────────────────────────────────────────────────────────────
log_info "Checking prerequisites..."
if [ -z "$TOKEN" ]; then
log_fail "Gitea token not found (checked GITEA_TOKEN env and ~/.config/gitea/token)"
exit 1
fi
if ! command -v git &>/dev/null; then
log_fail "git not installed"
exit 1
fi
if ! command -v curl &>/dev/null; then
log_fail "curl not installed"
exit 1
fi
if ! command -v python3 &>/dev/null; then
log_fail "python3 not installed"
exit 1
fi
log_pass "Prerequisites OK"
# ── 1. Clone via Gitea HTTP ───────────────────────────────────────────────────────────────────────────────────────────────────────
log_info "Step 1: Clone repo via Gitea HTTP..."
TMPDIR=$(mktemp -d)
CLONE_URL="${FORGE}/${ORG}/${REPO}.git"
cd "$TMPDIR"
if git clone --depth 1 "https://${TOKEN}@${FORGE#https://}/${ORG}/${REPO}.git" smoke-clone 2>/dev/null; then
log_pass "Clone via Gitea HTTP"
else
log_fail "Clone via Gitea HTTP"
rm -rf "$TMPDIR"
exit 1
fi
# ── 2. Commit ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
log_info "Step 2: Create branch and commit..."
cd "$TMPDIR/smoke-clone"
git checkout -b "$TEST_BRANCH" 2>/dev/null || true
# Make a harmless change
printf "# Sonnet smoke test marker\\n# timestamp: %s\\n" "$(date -u +%Y-%m-%dT%H:%M:%SZ)" > SONNET_SMOKE_MARKER.md
git add SONNET_SMOKE_MARKER.md
if git -c user.email="sonnet@timmy.local" -c user.name="Sonnet Smoke Test" \
commit -m "test: sonnet smoke test marker" 2>/dev/null; then
log_pass "Commit created"
else
log_fail "Commit failed"
rm -rf "$TMPDIR"
exit 1
fi
# ── 3. Push ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
log_info "Step 3: Push branch..."
if git push origin "$TEST_BRANCH" 2>/dev/null; then
log_pass "Push to origin"
else
log_fail "Push to origin"
rm -rf "$TMPDIR"
exit 1
fi
# ── 4. Create PR ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
log_info "Step 4: Create PR via Gitea API..."
PR_RESPONSE=$(curl -s -X POST \
-H "Authorization: token ${TOKEN}" \
-H "Content-Type: application/json" \
"${FORGE}/api/v1/repos/${ORG}/${REPO}/pulls" \
-d "{
\"title\": \"test: sonnet smoke test ${TEST_BRANCH}\",
\"head\": \"${TEST_BRANCH}\",
\"base\": \"main\",
\"body\": \"Automated smoke test verifying Sonnet can clone, commit, push, and open a PR.\\n\\nRefs #512\"
}" 2>/dev/null)
PR_NUMBER=$(echo "$PR_RESPONSE" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('number',''))")
if [ -n "$PR_NUMBER" ] && [ "$PR_NUMBER" != "None" ]; then
log_pass "PR created (#${PR_NUMBER})"
PR_URL="${FORGE}/${ORG}/${REPO}/pulls/${PR_NUMBER}"
echo " URL: $PR_URL"
else
log_fail "PR creation failed"
echo " Response: $PR_RESPONSE"
rm -rf "$TMPDIR"
exit 1
fi
# ── 5. Verify PR exists ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
log_info "Step 5: Verify PR exists via API..."
PR_CHECK=$(curl -s -H "Authorization: token ${TOKEN}" \
"${FORGE}/api/v1/repos/${ORG}/${REPO}/pulls/${PR_NUMBER}" 2>/dev/null)
PR_STATE=$(echo "$PR_CHECK" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('state',''))")
if [ "$PR_STATE" = "open" ]; then
log_pass "PR verified open via API"
else
log_fail "PR state is '$PR_STATE', expected 'open'"
fi
# ── Cleanup (optional) ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
if [ "${1:-}" = "--cleanup" ]; then
log_info "Cleaning up smoke test artifacts..."
curl -s -X PATCH -H "Authorization: token ${TOKEN}" \
-H "Content-Type: application/json" \
"${FORGE}/api/v1/repos/${ORG}/${REPO}/pulls/${PR_NUMBER}" \
-d '{"state":"closed"}' >/dev/null 2>&1 || true
git push origin --delete "$TEST_BRANCH" 2>/dev/null || true
log_pass "Cleanup complete"
fi
rm -rf "$TMPDIR"
# ── Summary ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
echo ""
echo "================================================================"
echo " Sonnet Smoke Test Summary"
echo "================================================================"
echo -e " Passed: ${GREEN}${PASS}${NC}"
echo -e " Failed: ${RED}${FAIL}${NC}"
echo ""
if [ "$FAIL" -gt 0 ]; then
echo -e "${RED}RESULT: FAILED${NC}"
exit 1
else
echo -e "${GREEN}RESULT: PASSED${NC}"
echo ""
echo "Sonnet workforce is verified end-to-end:"
echo " ✓ Clone via Gitea HTTP"
echo " ✓ Branch + commit"
echo " ✓ Push to origin"
echo " ✓ Open PR via API"
echo " ✓ Verify PR state"
exit 0
fi

View File

@@ -1,20 +1,14 @@
from __future__ import annotations
import json
from pathlib import Path
from unittest.mock import patch
import yaml
from scripts.bezalel_gemma4_vps import (
DEFAULT_CONFIG_PATH,
DEFAULT_BEZALEL_VPS_HOST,
build_deploy_mutation,
build_runpod_endpoint,
build_vps_verify_command,
normalize_openai_base_url,
parse_deploy_response,
resolve_base_url,
update_config_text,
verify_openai_chat,
)
@@ -34,10 +28,6 @@ class _FakeResponse:
return False
def test_default_config_path_targets_bezalel_vps_root_config() -> None:
assert DEFAULT_CONFIG_PATH == Path("/root/wizards/bezalel/home/config.yaml")
def test_build_deploy_mutation_uses_ollama_image_and_openai_port() -> None:
query = build_deploy_mutation(name="bezalel-gemma4", gpu_type="NVIDIA L40S", model_tag="gemma4:latest")
@@ -47,30 +37,6 @@ def test_build_deploy_mutation_uses_ollama_image_and_openai_port() -> None:
assert 'volumeMountPath: "/root/.ollama"' in query
def test_normalize_openai_base_url_adds_v1_suffix() -> None:
assert normalize_openai_base_url("https://pod-11434.proxy.runpod.net") == "https://pod-11434.proxy.runpod.net/v1"
def test_normalize_openai_base_url_trims_chat_completions_suffix() -> None:
assert normalize_openai_base_url("https://pod-11434.proxy.runpod.net/v1/chat/completions") == "https://pod-11434.proxy.runpod.net/v1"
def test_resolve_base_url_prefers_vertex_over_base_and_pod_id() -> None:
base_url, source = resolve_base_url(
vertex_base_url="https://vertex.example.com/openai",
base_url="https://plain.example.com",
pod_id="abc123",
)
assert source == "vertex_base_url"
assert base_url == "https://vertex.example.com/openai/v1"
def test_resolve_base_url_falls_back_to_base_url_before_pod_id() -> None:
base_url, source = resolve_base_url(base_url="https://plain.example.com", pod_id="abc123")
assert source == "base_url"
assert base_url == "https://plain.example.com/v1"
def test_build_runpod_endpoint_appends_v1_suffix() -> None:
assert build_runpod_endpoint("abc123") == "https://abc123-11434.proxy.runpod.net/v1"
@@ -94,7 +60,7 @@ def test_parse_deploy_response_extracts_pod_id_and_endpoint() -> None:
}
def test_update_config_text_upserts_big_brain_provider_and_normalizes_base_url() -> None:
def test_update_config_text_upserts_big_brain_provider() -> None:
original = """
model:
default: kimi-k2.5
@@ -106,7 +72,7 @@ custom_providers:
model: gemma3:27b
"""
updated = update_config_text(original, base_url="https://new-pod-11434.proxy.runpod.net", model="gemma4:latest")
updated = update_config_text(original, base_url="https://new-pod-11434.proxy.runpod.net/v1", model="gemma4:latest")
parsed = yaml.safe_load(updated)
assert parsed["model"] == {"default": "kimi-k2.5", "provider": "kimi-coding"}
@@ -120,14 +86,7 @@ custom_providers:
]
def test_build_vps_verify_command_targets_bezalel_host_and_chat_completions() -> None:
command = build_vps_verify_command(base_url="https://pod-11434.proxy.runpod.net", model="gemma4:latest")
assert command.startswith(f"ssh root@{DEFAULT_BEZALEL_VPS_HOST} ")
assert "/v1/chat/completions" in command
assert "gemma4:latest" in command
def test_verify_openai_chat_calls_chat_completions_with_normalized_base_url() -> None:
def test_verify_openai_chat_calls_chat_completions() -> None:
response_payload = {
"choices": [
{
@@ -142,7 +101,7 @@ def test_verify_openai_chat_calls_chat_completions_with_normalized_base_url() ->
"scripts.bezalel_gemma4_vps.request.urlopen",
return_value=_FakeResponse(response_payload),
) as mocked:
result = verify_openai_chat("https://pod-11434.proxy.runpod.net", model="gemma4:latest", prompt="say READY")
result = verify_openai_chat("https://pod-11434.proxy.runpod.net/v1", model="gemma4:latest", prompt="say READY")
assert result == "READY"
req = mocked.call_args.args[0]
@@ -150,10 +109,3 @@ def test_verify_openai_chat_calls_chat_completions_with_normalized_base_url() ->
payload = json.loads(req.data.decode())
assert payload["model"] == "gemma4:latest"
assert payload["messages"][0]["content"] == "say READY"
def test_readme_documents_root_config_path_and_vps_proof_command() -> None:
readme = Path("scripts/README_bezalel_gemma4_vps.md").read_text()
assert "/root/wizards/bezalel/home/config.yaml" in readme
assert "ssh root@104.131.15.18" in readme
assert "--vertex-base-url" in readme

View File

@@ -38,6 +38,7 @@ class House(Enum):
EZRA = "ezra" # Archivist, reader
BEZALEL = "bezalel" # Artificer, builder
ALLEGRO = "allegro" # Tempo-and-dispatch, connected
SONNET = "sonnet" # Anthropic Claude Sonnet (cloud, high-reasoning)
class Mode(Enum):