Creator App Tests / PR Spam Gate (push) Skipped
Frontend Tests / PR Spam Gate (push) Skipped
NPM Format (website & console) / PR Spam Gate (push) Skipped
Pre-commit Checks / PR Spam Gate (push) Skipped
QwenPaw Creator Plugin Release / check-version (push) Canceled after 0s
QwenPaw Creator Plugin Release / upload-oss (push) Canceled after 0s
Tests / PR Spam Gate (push) Skipped
CodeQL / CodeQL (python) (push) Canceled after 0s
CodeQL / CodeQL (typescript) (push) Canceled after 0s
Creator App Tests / Creator Backend Tests (push) Canceled after 0s
Creator App Tests / Creator UI Build & Tests (push) Canceled after 0s
E2E Smoke Tests / Playwright UI Smoke (push) Canceled after 0s
Frontend Tests / Detect console changes (push) Canceled after 0s
NPM Format (website & console) / website format check (push) Canceled after 0s
NPM Format (website & console) / console format check (push) Canceled after 0s
Pre-commit Checks / Pre-commit (push) Canceled after 0s
QwenPaw Data Plugin Release / check-version (push) Canceled after 0s
Tests / Detect code changes (push) Canceled after 0s
Frontend Tests / Vitest Unit Tests (push) Canceled after 0s
Frontend Tests / Frontend Summary (push) Canceled after 0s
QwenPaw Data Plugin Release / upload-oss (push) Canceled after 0s
Tests / Maintainer Approval (push) Canceled after 0s
Tests / Unit Tests - py3.11 - macos-latest (push) Canceled after 0s
Tests / Unit Tests - py3.11 - ubuntu-latest (push) Canceled after 0s
Tests / Unit Tests - py3.13 - ubuntu-latest (push) Canceled after 0s
Tests / Unit Tests - py3.11 - windows-latest (push) Canceled after 0s
Tests / Contract Tests - py3.11 - macos-latest (push) Canceled after 0s
Tests / Contract Tests - py3.11 - ubuntu-latest (push) Canceled after 0s
Tests / Contract Tests - py3.13 - ubuntu-latest (push) Canceled after 0s
Tests / Contract Tests - py3.11 - windows-latest (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - macos-latest - p0 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - macos-latest - p1 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - macos-latest - p2 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - ubuntu-latest - fallback (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - ubuntu-latest - p0 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - ubuntu-latest - p1 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - ubuntu-latest - p2 (push) Canceled after 0s
Tests / Integrated Tests - py3.13 - ubuntu-latest - p0 (push) Canceled after 0s
Tests / Integrated Tests - py3.13 - ubuntu-latest - p1 (push) Canceled after 0s
Tests / Integrated Tests - py3.13 - ubuntu-latest - p2 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - windows-latest - p0 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - windows-latest - p1 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - windows-latest - p2 (push) Canceled after 0s
Tests / Coverage Report (push) Canceled after 0s
Tests / Test Summary (push) Canceled after 0s
129 lines
3.5 KiB
Python
129 lines
3.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""Tests for AgentScope embedding model construction and probing."""
|
|
|
|
from types import SimpleNamespace
|
|
|
|
import pytest
|
|
|
|
from qwenpaw.agents.memory import embedding_model as module
|
|
from qwenpaw.config.config import EmbeddingModelConfig
|
|
|
|
|
|
def _config(**overrides) -> EmbeddingModelConfig:
|
|
values = {
|
|
"backend": "openai",
|
|
"api_key": "test-key",
|
|
"base_url": "https://example.com/v1/",
|
|
"model_name": "embedding-model",
|
|
"dimensions": 3,
|
|
"use_dimensions": False,
|
|
}
|
|
values.update(overrides)
|
|
return EmbeddingModelConfig(**values)
|
|
|
|
|
|
def test_create_openai_embedding_model_respects_pass_dimensions() -> None:
|
|
model = module.create_embedding_model(
|
|
_config(use_dimensions=False),
|
|
max_retries=1,
|
|
)
|
|
|
|
assert model.model == "embedding-model"
|
|
assert model.dimensions == 3
|
|
assert model.pass_dimensions is False
|
|
assert model.max_retries == 1
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_probe_accepts_matching_finite_vector(monkeypatch) -> None:
|
|
class FakeModel:
|
|
async def __call__(self, _inputs):
|
|
return SimpleNamespace(embeddings=[[0.1, 0.2, 0.3]])
|
|
|
|
monkeypatch.setattr(
|
|
module,
|
|
"create_embedding_model",
|
|
lambda *_args, **_kwargs: FakeModel(),
|
|
)
|
|
|
|
model, result = await module.test_embedding_model(_config())
|
|
|
|
assert model is not None
|
|
assert result.success is True
|
|
assert result.actual_dimensions == 3
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_probe_rejects_dimension_mismatch(monkeypatch) -> None:
|
|
class FakeModel:
|
|
async def __call__(self, _inputs):
|
|
return SimpleNamespace(embeddings=[[0.1, 0.2]])
|
|
|
|
monkeypatch.setattr(
|
|
module,
|
|
"create_embedding_model",
|
|
lambda *_args, **_kwargs: FakeModel(),
|
|
)
|
|
|
|
model, result = await module.test_embedding_model(_config())
|
|
|
|
assert model is None
|
|
assert result.success is False
|
|
assert result.actual_dimensions == 2
|
|
assert "expected 3, got 2" in result.message
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_probe_uses_configured_health_check_timeout(monkeypatch) -> None:
|
|
observed = {}
|
|
|
|
class FakeModel:
|
|
async def __call__(self, _inputs):
|
|
return SimpleNamespace(embeddings=[[0.1, 0.2, 0.3]])
|
|
|
|
async def fake_wait_for(awaitable, timeout):
|
|
observed["timeout"] = timeout
|
|
return await awaitable
|
|
|
|
monkeypatch.setattr(
|
|
module,
|
|
"create_embedding_model",
|
|
lambda *_args, **_kwargs: FakeModel(),
|
|
)
|
|
monkeypatch.setattr(module.asyncio, "wait_for", fake_wait_for)
|
|
|
|
_model, result = await module.test_embedding_model(
|
|
_config(health_check_timeout=42),
|
|
)
|
|
|
|
assert result.success is True
|
|
assert observed["timeout"] == 42
|
|
|
|
|
|
def test_vector_space_fingerprint_ignores_key_and_cache_settings() -> None:
|
|
first = _config(api_key="old", max_cache_size=10)
|
|
second = _config(api_key="new", max_cache_size=20)
|
|
|
|
assert module.embedding_vector_space_fingerprint(
|
|
first,
|
|
) == module.embedding_vector_space_fingerprint(second)
|
|
|
|
|
|
def test_tested_config_fingerprint_ignores_reme_store_settings() -> None:
|
|
first = _config(
|
|
enable_cache=True,
|
|
max_cache_size=10,
|
|
max_input_length=100,
|
|
max_batch_size=2,
|
|
)
|
|
second = _config(
|
|
enable_cache=False,
|
|
max_cache_size=20,
|
|
max_input_length=200,
|
|
max_batch_size=4,
|
|
)
|
|
|
|
assert module.embedding_config_fingerprint(
|
|
first,
|
|
) == module.embedding_config_fingerprint(second)
|