feat(agent): persist production generation settings
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
from decimal import Decimal
|
||||
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import Session
|
||||
from sqlalchemy.pool import StaticPool
|
||||
|
||||
from app.api.admin_settings import get_agent_runtime_config, save_agent_runtime_config
|
||||
from app.models import Base
|
||||
from app.models.admin import Admin
|
||||
from app.models.ai_config import ModelConfig
|
||||
from app.schemas.admin import AgentRuntimeConfigSaveRequest
|
||||
from app.services.model_stream_service import _openai_stream_payload
|
||||
from app.services.model_service import _max_output_tokens
|
||||
from app.services.rag_service import RagResult
|
||||
|
||||
|
||||
def _database() -> Session:
|
||||
engine = create_engine(
|
||||
"sqlite:///:memory:",
|
||||
connect_args={"check_same_thread": False},
|
||||
poolclass=StaticPool,
|
||||
)
|
||||
Base.metadata.create_all(engine)
|
||||
return Session(engine)
|
||||
|
||||
|
||||
def _admin() -> Admin:
|
||||
return Admin(id=1, username="admin", password="hash", name="系统管理员", status=1)
|
||||
|
||||
|
||||
def _model() -> ModelConfig:
|
||||
return ModelConfig(
|
||||
id=1,
|
||||
provider="openai-compatible",
|
||||
display_name="正式模型",
|
||||
api_type="openai_compatible",
|
||||
model_name="production-model",
|
||||
base_url="https://example.com/v1",
|
||||
api_url="",
|
||||
api_key="encrypted",
|
||||
auth_type="bearer",
|
||||
max_token=None,
|
||||
stream_enabled=1,
|
||||
timeout_second=30,
|
||||
enabled=1,
|
||||
)
|
||||
|
||||
|
||||
def test_runtime_config_defaults_to_long_answer_safe_max_tokens():
|
||||
with _database() as db:
|
||||
admin = _admin()
|
||||
model = _model()
|
||||
db.add_all([admin, model])
|
||||
db.commit()
|
||||
|
||||
result = get_agent_runtime_config(db=db, current_admin=admin)["data"]
|
||||
|
||||
assert result["modelId"] == model.id
|
||||
assert result["modelName"] == "正式模型"
|
||||
assert result["maxToken"] == 8192
|
||||
assert _max_output_tokens(model) == 8192
|
||||
|
||||
|
||||
def test_saved_runtime_config_is_persisted_on_enabled_model():
|
||||
with _database() as db:
|
||||
admin = _admin()
|
||||
model = _model()
|
||||
db.add_all([admin, model])
|
||||
db.commit()
|
||||
|
||||
result = save_agent_runtime_config(
|
||||
AgentRuntimeConfigSaveRequest(
|
||||
temperature=0.3,
|
||||
topP=0.9,
|
||||
topK=40,
|
||||
presencePenalty=0.2,
|
||||
frequencyPenalty=0.4,
|
||||
maxToken=12000,
|
||||
),
|
||||
db=db,
|
||||
current_admin=admin,
|
||||
)["data"]
|
||||
|
||||
db.refresh(model)
|
||||
assert result["maxToken"] == 12000
|
||||
assert model.max_token == 12000
|
||||
assert model.temperature == Decimal("0.30")
|
||||
assert model.top_p == Decimal("0.90")
|
||||
assert model.top_k == 40
|
||||
assert model.presence_penalty == Decimal("0.20")
|
||||
assert model.frequency_penalty == Decimal("0.40")
|
||||
|
||||
payload = _openai_stream_payload(
|
||||
model,
|
||||
RagResult(question="测试", knowledge_scopes=[], chunks=[], prompt="测试", allow_general_knowledge=True),
|
||||
)
|
||||
assert payload["max_tokens"] == 12000
|
||||
assert payload["temperature"] == 0.3
|
||||
assert payload["top_p"] == 0.9
|
||||
assert payload["presence_penalty"] == 0.2
|
||||
assert payload["frequency_penalty"] == 0.4
|
||||
Reference in New Issue
Block a user