ForcePilot/backend/package/yuxi/repositories/evaluation_repository.py
Wenjie Zhang c772e5ca3a refactor: Agent 运行时架构重构 - 移除 RuntimeConfigMiddleware,统一上下文准备与工具解析
- 删除 runtime_config_middleware.py,将功能合并到:
  - prepare_agent_runtime_context(): 统一上下文准备入口
  - resolve_configured_runtime_tools(): 运行时工具解析
- context.py: 规范化函数重命名 (_names → _keys),重构 config 加载流程
- chatbot/deep_agent graph: 集成新上下文准备流程,移除 RuntimeConfigMiddleware 引用
- skills_middleware: 抽取 normalize_string_list 为共享工具函数
- subagent_service: get_subagents_from_names → get_subagents_from_slugs,支持 slug 查询
- 对应更新 repositories/services/routers 适配新接口
2026-05-26 17:40:17 +08:00

174 lines
7.9 KiB
Python

from __future__ import annotations
from typing import Any
from sqlalchemy import delete, func, select
from yuxi.storage.postgres.manager import pg_manager
from yuxi.storage.postgres.models_knowledge import (
EvaluationDataset,
EvaluationDatasetItem,
EvaluationRun,
EvaluationRunItem,
)
class EvaluationRepository:
async def create_dataset(self, dataset_data: dict[str, Any]) -> EvaluationDataset:
dataset = EvaluationDataset(**dataset_data)
async with pg_manager.get_async_session_context() as session:
session.add(dataset)
return dataset
async def create_dataset_with_items(
self, dataset_data: dict[str, Any], items_data: list[dict[str, Any]]
) -> EvaluationDataset:
dataset = EvaluationDataset(**dataset_data)
items = [EvaluationDatasetItem(**item) for item in items_data]
async with pg_manager.get_async_session_context() as session:
session.add(dataset)
session.add_all(items)
return dataset
async def update_dataset(self, dataset_id: str, data: dict[str, Any]) -> EvaluationDataset | None:
async with pg_manager.get_async_session_context() as session:
result = await session.execute(select(EvaluationDataset).where(EvaluationDataset.dataset_id == dataset_id))
record = result.scalar_one_or_none()
if record is None:
return None
for key, value in data.items():
setattr(record, key, value)
return record
async def add_dataset_items(self, items_data: list[dict[str, Any]]) -> None:
items = [EvaluationDatasetItem(**item) for item in items_data]
async with pg_manager.get_async_session_context() as session:
session.add_all(items)
async def get_dataset(self, dataset_id: str) -> EvaluationDataset | None:
async with pg_manager.get_async_session_context() as session:
result = await session.execute(select(EvaluationDataset).where(EvaluationDataset.dataset_id == dataset_id))
return result.scalar_one_or_none()
async def list_datasets(self, kb_id: str) -> list[EvaluationDataset]:
async with pg_manager.get_async_session_context() as session:
result = await session.execute(
select(EvaluationDataset)
.where(EvaluationDataset.kb_id == kb_id)
.order_by(EvaluationDataset.created_at.desc())
)
return list(result.scalars().all())
async def list_dataset_items(
self, dataset_id: str, offset: int = 0, limit: int = 100
) -> list[EvaluationDatasetItem]:
async with pg_manager.get_async_session_context() as session:
result = await session.execute(
select(EvaluationDatasetItem)
.where(EvaluationDatasetItem.dataset_id == dataset_id)
.order_by(EvaluationDatasetItem.item_index.asc())
.offset(offset)
.limit(limit)
)
return list(result.scalars().all())
async def count_dataset_items(self, dataset_id: str) -> int:
async with pg_manager.get_async_session_context() as session:
result = await session.execute(
select(func.count(EvaluationDatasetItem.id)).where(EvaluationDatasetItem.dataset_id == dataset_id)
)
return int(result.scalar() or 0)
async def list_all_dataset_items(self, dataset_id: str) -> list[EvaluationDatasetItem]:
async with pg_manager.get_async_session_context() as session:
result = await session.execute(
select(EvaluationDatasetItem)
.where(EvaluationDatasetItem.dataset_id == dataset_id)
.order_by(EvaluationDatasetItem.item_index.asc())
)
return list(result.scalars().all())
async def delete_dataset(self, dataset_id: str) -> None:
async with pg_manager.get_async_session_context() as session:
result = await session.execute(select(EvaluationDataset).where(EvaluationDataset.dataset_id == dataset_id))
record = result.scalar_one_or_none()
if record is not None:
await session.delete(record)
async def create_run(self, data: dict[str, Any]) -> EvaluationRun:
run = EvaluationRun(**data)
async with pg_manager.get_async_session_context() as session:
session.add(run)
return run
async def get_run(self, run_id: str) -> EvaluationRun | None:
async with pg_manager.get_async_session_context() as session:
result = await session.execute(select(EvaluationRun).where(EvaluationRun.run_id == run_id))
return result.scalar_one_or_none()
async def list_runs(self, kb_id: str) -> list[EvaluationRun]:
async with pg_manager.get_async_session_context() as session:
result = await session.execute(
select(EvaluationRun).where(EvaluationRun.kb_id == kb_id).order_by(EvaluationRun.started_at.desc())
)
return list(result.scalars().all())
async def update_run(self, run_id: str, data: dict[str, Any]) -> EvaluationRun | None:
async with pg_manager.get_async_session_context() as session:
result = await session.execute(select(EvaluationRun).where(EvaluationRun.run_id == run_id))
record = result.scalar_one_or_none()
if record is None:
return None
for key, value in data.items():
setattr(record, key, value)
return record
async def delete_run(self, run_id: str) -> None:
async with pg_manager.get_async_session_context() as session:
await session.execute(delete(EvaluationRunItem).where(EvaluationRunItem.run_id == run_id))
result = await session.execute(select(EvaluationRun).where(EvaluationRun.run_id == run_id))
record = result.scalar_one_or_none()
if record is not None:
await session.delete(record)
async def upsert_run_item(self, run_id: str, item_index: int, data: dict[str, Any]) -> EvaluationRunItem:
async with pg_manager.get_async_session_context() as session:
result = await session.execute(
select(EvaluationRunItem).where(
(EvaluationRunItem.run_id == run_id) & (EvaluationRunItem.item_index == item_index)
)
)
record = result.scalar_one_or_none()
if record is None:
record = EvaluationRunItem(run_id=run_id, item_index=item_index, **data)
session.add(record)
return record
for key, value in data.items():
setattr(record, key, value)
return record
async def list_run_items(self, run_id: str, offset: int = 0, limit: int = 100) -> list[EvaluationRunItem]:
async with pg_manager.get_async_session_context() as session:
result = await session.execute(
select(EvaluationRunItem)
.where(EvaluationRunItem.run_id == run_id)
.order_by(EvaluationRunItem.item_index.asc())
.offset(offset)
.limit(limit)
)
return list(result.scalars().all())
async def count_run_items(self, run_id: str) -> int:
async with pg_manager.get_async_session_context() as session:
result = await session.execute(
select(func.count(EvaluationRunItem.id)).where(EvaluationRunItem.run_id == run_id)
)
return int(result.scalar() or 0)
async def delete_all(self) -> None:
async with pg_manager.get_async_session_context() as session:
await session.execute(delete(EvaluationRunItem))
await session.execute(delete(EvaluationRun))
await session.execute(delete(EvaluationDatasetItem))
await session.execute(delete(EvaluationDataset))