feat(server): add workbench API, DSH planner worker and RAG pipeline
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
from tempfile import TemporaryDirectory
|
||||
from sqlmodel import SQLModel, Session, create_engine
|
||||
|
||||
from app.agents.composer import validate_consistency_checks
|
||||
from app.agents.coordinator import provider_fingerprint
|
||||
from app.agents.qc import validate_qc_checks
|
||||
from app.models import ModelProvider
|
||||
from app.rag.pipeline import _disk_files
|
||||
from app.rag.store import _as_list, _chunk_id
|
||||
from app.rag.pipeline import release_reserved_chunks, reserve_chunks
|
||||
from array import array
|
||||
|
||||
|
||||
class QualityAndRagTests(unittest.TestCase):
|
||||
def test_empty_qc_is_invalid(self):
|
||||
checks, error = validate_qc_checks([])
|
||||
self.assertEqual(checks, [])
|
||||
self.assertTrue(error)
|
||||
|
||||
def test_qc_requires_named_status(self):
|
||||
checks, error = validate_qc_checks([{"id": "x", "issues": []}])
|
||||
self.assertEqual(checks, [])
|
||||
self.assertTrue(error)
|
||||
|
||||
def test_composer_requires_all_five_fixed_checks(self):
|
||||
checks, error = validate_consistency_checks([])
|
||||
self.assertEqual(checks, [])
|
||||
self.assertTrue(error)
|
||||
|
||||
def test_chunk_id_is_stable(self):
|
||||
item = {"text": " 同一段素材 ", "meta": {"heading": "心法"}}
|
||||
self.assertEqual(_chunk_id("素材.md", item, 1), _chunk_id("素材.md", item, 1))
|
||||
self.assertNotEqual(_chunk_id("素材.md", item, 1), _chunk_id("素材.md", item, 2))
|
||||
|
||||
def test_missing_source_directory_is_an_empty_inventory(self):
|
||||
with TemporaryDirectory() as temp:
|
||||
missing = Path(temp) / "not-created"
|
||||
self.assertEqual(_disk_files(missing), [])
|
||||
|
||||
def test_provider_fingerprint_changes_when_endpoint_changes(self):
|
||||
provider = ModelProvider(id=7, name="gateway", base_url="https://a.example/v1")
|
||||
first = provider_fingerprint(provider, "model-a")
|
||||
self.assertEqual(first, provider_fingerprint(provider, "model-a"))
|
||||
provider.base_url = "https://b.example/v1"
|
||||
self.assertNotEqual(first, provider_fingerprint(provider, "model-a"))
|
||||
|
||||
def test_vector_snapshot_sequences_are_numpy_safe(self):
|
||||
values = array("f", [0.1, 0.2])
|
||||
self.assertEqual(len(_as_list(values)), 2)
|
||||
self.assertAlmostEqual(_as_list(values)[0], 0.1, places=6)
|
||||
self.assertAlmostEqual(_as_list(values)[1], 0.2, places=6)
|
||||
self.assertEqual(_as_list(None), [])
|
||||
|
||||
def test_knowledge_usage_is_unique_per_agent_and_chunk(self):
|
||||
engine = create_engine("sqlite://")
|
||||
SQLModel.metadata.create_all(engine)
|
||||
with Session(engine) as session:
|
||||
hit = {"id": "chunk-1", "kb_id": 3, "text": "素材", "meta": {"file": "a.md"}}
|
||||
self.assertEqual(len(reserve_chunks(session, 10, 20, 30, [hit])), 1)
|
||||
self.assertEqual(len(reserve_chunks(session, 10, 20, 31, [hit])), 0)
|
||||
self.assertEqual(len(reserve_chunks(session, 11, 20, 31, [hit])), 1)
|
||||
release_reserved_chunks(session, 10, 20, 30, [hit])
|
||||
self.assertEqual(len(reserve_chunks(session, 10, 20, 32, [hit])), 1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user