feat: add embeddings endpoint and config for OpenAI-compatible text embeddings via gateway
Add POST /openai/v1/embeddings route in openai_gateway router, new config fields for embedding upstream URL/model/key/enabled toggle with defaults pointing to OpenRouter Qwen3 8B, INTERNAL_EMBED_MODEL constant in config.py, documentation in docs_api.py and README.md describing the molodetz~embed model mapping, and embed-call tracking in gateway metrics alongside existing chat/vision counters.
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
# retoor <retoor@molodetz.nl>
|
||||
|
||||
import requests
|
||||
from tests.conftest import BASE_URL
|
||||
from devplacepy.database import get_table
|
||||
|
||||
|
||||
def _config(page, **fields):
|
||||
page.request.post(f"{BASE_URL}/admin/services/openai/config", form=fields)
|
||||
|
||||
|
||||
def test_embeddings_disabled_returns_503(alice):
|
||||
page, _ = alice
|
||||
page.request.post(f"{BASE_URL}/admin/services/openai/stop")
|
||||
try:
|
||||
r = requests.post(
|
||||
f"{BASE_URL}/openai/v1/embeddings", json={"input": "hello"}
|
||||
)
|
||||
assert r.status_code == 503
|
||||
finally:
|
||||
page.request.post(f"{BASE_URL}/admin/services/openai/start")
|
||||
|
||||
|
||||
def test_embeddings_requires_auth(alice):
|
||||
page, _ = alice
|
||||
page.request.post(f"{BASE_URL}/admin/services/openai/start")
|
||||
_config(page, gateway_access_key="embedkey")
|
||||
try:
|
||||
no_creds = requests.post(
|
||||
f"{BASE_URL}/openai/v1/embeddings", json={"input": "hello"}
|
||||
)
|
||||
assert no_creds.status_code == 401
|
||||
finally:
|
||||
_config(page, gateway_access_key="")
|
||||
page.request.post(f"{BASE_URL}/admin/services/openai/start")
|
||||
|
||||
|
||||
def test_embeddings_auth_passes_upstream_unreachable(alice):
|
||||
page, user = alice
|
||||
page.request.post(f"{BASE_URL}/admin/services/openai/start")
|
||||
_config(
|
||||
page,
|
||||
gateway_embed_enabled="1",
|
||||
gateway_embed_url="http://127.0.0.1:9/embeddings",
|
||||
gateway_access_key="embedkey",
|
||||
)
|
||||
try:
|
||||
with_key = requests.post(
|
||||
f"{BASE_URL}/openai/v1/embeddings",
|
||||
headers={"X-API-KEY": "embedkey"},
|
||||
json={"model": "molodetz~embed", "input": "hello"},
|
||||
)
|
||||
assert with_key.status_code == 502
|
||||
|
||||
admin_key = get_table("users").find_one(username=user["username"])["api_key"]
|
||||
with_admin = requests.post(
|
||||
f"{BASE_URL}/openai/v1/embeddings",
|
||||
headers={"Authorization": f"Bearer {admin_key}"},
|
||||
json={"model": "molodetz~embed", "input": "hello"},
|
||||
)
|
||||
assert with_admin.status_code == 502
|
||||
finally:
|
||||
_config(page, gateway_access_key="")
|
||||
page.request.post(f"{BASE_URL}/admin/services/openai/start")
|
||||
|
||||
|
||||
def test_embeddings_disabled_via_config_returns_503(alice):
|
||||
page, _ = alice
|
||||
page.request.post(f"{BASE_URL}/admin/services/openai/start")
|
||||
_config(page, gateway_embed_enabled="0", gateway_access_key="embedkey")
|
||||
try:
|
||||
r = requests.post(
|
||||
f"{BASE_URL}/openai/v1/embeddings",
|
||||
headers={"X-API-KEY": "embedkey"},
|
||||
json={"input": "hello"},
|
||||
)
|
||||
assert r.status_code == 503
|
||||
finally:
|
||||
_config(page, gateway_embed_enabled="1", gateway_access_key="")
|
||||
page.request.post(f"{BASE_URL}/admin/services/openai/start")
|
||||
Reference in New Issue
Block a user