DocDoeAI / scripts /test_sarvam_provider.py
asnannp's picture
Deploy backend cd4237ff: support routes + rate limit + exam_date nullable + upload 413 fix
7c6ffa6
Raw
History Blame Contribute Delete
3.93 kB
"""
Manual smoke test for Sarvam AI provider.
Loads .env, sends a tiny prompt to Sarvam, prints model_used and response.
Never prints the API key.
Usage:
python scripts/test_sarvam_provider.py [--base-url https://api.sarvam.ai/v1]
Exit codes:
0 = success
1 = failure
"""
from __future__ import annotations
import argparse
import json
import os
import sys
from pathlib import Path
from urllib.error import URLError
from urllib.request import Request, urlopen
BACKEND_DIR = Path(__file__).resolve().parents[1]
# Load .env manually (no dependency on python-dotenv for scripts)
env_path = BACKEND_DIR / ".env"
if env_path.exists():
for line in env_path.read_text(encoding="utf-8").splitlines():
line = line.strip()
if not line or line.startswith("#"):
continue
if "=" in line:
key, _, value = line.partition("=")
key = key.strip()
value = value.strip().strip('"').strip("'")
os.environ.setdefault(key, value)
def main() -> None:
parser = argparse.ArgumentParser(description="Sarvam AI Smoke Test")
parser.add_argument(
"--base-url",
default=os.environ.get("SARVAM_BASE_URL", "https://api.sarvam.ai/v1"),
)
args = parser.parse_args()
base = args.base_url.rstrip("/")
api_key = os.environ.get("SARVAM_API_KEY", "")
print("=" * 50)
print(" DocDoe AI - Sarvam Provider Smoke Test")
print(f" Base URL: {base}")
print(f" Key configured: {'yes' if api_key else 'NO'}")
print("=" * 50)
if not api_key:
print("\n ERROR: SARVAM_API_KEY is not set in .env or environment.")
print(" Set SARVAM_API_KEY and try again.")
sys.exit(1)
model = os.environ.get("SARVAM_MODEL_MAIN", "sarvam-30b")
url = f"{base}/chat/completions"
payload = {
"model": model,
"messages": [
{"role": "system", "content": "You are a helpful tutor. Respond with one short JSON object only."},
{"role": "user", "content": 'Return JSON with keys "greeting" and "status". Keep it short.'},
],
"temperature": 0.1,
"max_tokens": 800,
"reasoning_effort": "low",
}
print(f"\n Calling: POST {url}")
print(f" Model: {model}")
data = json.dumps(payload).encode()
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {api_key}",
}
req = Request(url, data=data, headers=headers, method="POST")
try:
with urlopen(req, timeout=30) as resp:
result = json.loads(resp.read().decode())
except URLError as exc:
print(f"\n FAIL: {exc}")
sys.exit(1)
except Exception as exc:
print(f"\n FAIL: {type(exc).__name__}: {exc}")
sys.exit(1)
# Parse response
content = ""
model_used = result.get("model", "unknown")
choices = result.get("choices", [])
if choices:
msg = choices[0].get("message", {})
content = msg.get("content") or ""
usage = result.get("usage", {})
print(f"\n model_used: {model_used}")
print(f" content: {(content or '(empty)')[:300]}")
print(f" raw keys: {list(result.keys())}")
if choices:
print(f" choices[0] keys: {list(choices[0].keys())}")
print(f" message keys: {list(choices[0].get('message', {}).keys())}")
if usage:
print(f" tokens: prompt={usage.get('prompt_tokens', '?')}, "
f"completion={usage.get('completion_tokens', '?')}, "
f"total={usage.get('total_tokens', '?')}")
if content:
print("\n RESULT: PASS - Sarvam API is responding.")
sys.exit(0)
else:
# Print full raw response for debugging
print(f"\n Full raw response: {json.dumps(result, indent=2)[:500]}")
print("\n RESULT: FAIL - Empty content from Sarvam.")
sys.exit(1)
if __name__ == "__main__":
main()