support StepFun provider and resilient workspace loading
CI / compose (push) Successful in 11m30s

This commit is contained in:
Marco0300
2026-09-03 22:24:51 +02:00
parent 7e9f39c16e
commit 7276e8735e
7 changed files with 44 additions and 25 deletions
+13 -4
View File
@@ -19,8 +19,9 @@ from urllib.request import Request, urlopen
MAX_SECRET = 4096
MAX_MODEL = 160
ALLOWED_PROVIDERS = {"nous_portal", "nous_portal_web_research"}
ALLOWED_PROVIDERS = {"nous_portal", "nous_portal_web_research", "stepfun"}
DEFAULT_NOUS_URL = "https://inference-api.nousresearch.com/v1"
DEFAULT_STEP_URL = "https://api.stepfun.ai/v1"
DEFAULT_FIRECRAWL_URL = "https://api.firecrawl.dev/v2"
DEFAULT_SEARXNG_URL = "http://searxng:8080"
@@ -83,7 +84,8 @@ def validate_payload(payload: dict) -> dict:
enabled = payload.get("enabled", True)
if not isinstance(enabled, bool):
raise ValueError("invalid_enabled")
urls = {"nous_base_url": DEFAULT_NOUS_URL, "firecrawl_base_url": str(payload.get("searxng_base_url", DEFAULT_SEARXNG_URL)).strip() or DEFAULT_SEARXNG_URL}
default_nous = DEFAULT_STEP_URL if provider == "stepfun" else DEFAULT_NOUS_URL
urls = {"nous_base_url": str(payload.get("step_base_url", payload.get("nous_base_url", default_nous))).strip() or default_nous, "firecrawl_base_url": str(payload.get("searxng_base_url", DEFAULT_SEARXNG_URL)).strip() or DEFAULT_SEARXNG_URL}
for field, default in urls.items():
value = str(payload.get(field, default)).strip().rstrip("/")
parsed = urlparse(value)
@@ -94,7 +96,7 @@ def validate_payload(payload: dict) -> dict:
if not isinstance(credentials, dict):
raise ValueError("invalid_credentials")
result = {"provider": provider, "model": model, "enabled": enabled, **urls, "credentials": {}}
for name in ("nous_api_key", "firecrawl_api_key"):
for name in ("nous_api_key", "step_api_key", "firecrawl_api_key"):
if name in credentials:
value = credentials[name]
if not isinstance(value, str) or not value or len(value) > MAX_SECRET:
@@ -114,8 +116,15 @@ def test_connectivity(row) -> dict:
if not row or not row["enabled"] or not row["credentials_ciphertext"]:
return {"status": "not_configured", "network_calls": 0, "outbound_calls": False}
credentials = json.loads(decrypt(row["credentials_ciphertext"]))
check_defs = []
provider = row["provider"]
model_label = "stepfun" if provider == "stepfun" else "nous"
key_name = "step_api_key" if provider == "stepfun" else "nous_api_key"
check_defs.append((model_label, row["nous_base_url"] + "/models", key_name))
if not row["firecrawl_base_url"].startswith("http://searxng"):
check_defs.append(("firecrawl", row["firecrawl_base_url"], "firecrawl_api_key"))
checks = []
for label, url, key_name in (("nous", row["nous_base_url"] + "/models", "nous_api_key"), ("firecrawl", row["firecrawl_base_url"], "firecrawl_api_key")):
for label, url, key_name in check_defs:
key = credentials.get(key_name)
if not isinstance(key, str) or not key:
checks.append({"provider": label, "ok": False})