feat(ai): add local expert library
This commit is contained in:
@@ -50,6 +50,48 @@ func TestAISessionHandlersRequireOwnedProject(t *testing.T) {
|
||||
require.Empty(t, gateway.steps)
|
||||
}
|
||||
|
||||
func TestAIExpertLibraryListsDetailsAndCreatesAssociatedSession(t *testing.T) {
|
||||
database := newAIHandlerTestDB(t)
|
||||
owner := createAIHandlerUser(t, database, "expert-owner@example.com")
|
||||
project := createAIHandlerProject(t, database, owner.ID, "EXPERTS")
|
||||
var expert models.SenlinAgentAIExpert
|
||||
require.NoError(t, database.Order("id asc").First(&expert).Error)
|
||||
router := aiHandlerTestRouter(owner.ID, NewGatewayWithSecret("system-key", "test-encryption-secret"))
|
||||
|
||||
listRecorder := httptest.NewRecorder()
|
||||
router.ServeHTTP(listRecorder, authenticatedAIRequest(t, http.MethodGet, "/api/v1/ai-experts", nil))
|
||||
require.Equal(t, http.StatusOK, listRecorder.Code)
|
||||
var listPayload []map[string]any
|
||||
require.NoError(t, json.Unmarshal(listRecorder.Body.Bytes(), &listPayload))
|
||||
require.Len(t, listPayload, 267)
|
||||
require.Equal(t, expert.Identity, listPayload[0]["id"])
|
||||
require.NotContains(t, listPayload[0], "systemPrompt")
|
||||
|
||||
detailRecorder := httptest.NewRecorder()
|
||||
router.ServeHTTP(detailRecorder, authenticatedAIRequest(t, http.MethodGet, "/api/v1/ai-experts/"+expert.Identity, nil))
|
||||
require.Equal(t, http.StatusOK, detailRecorder.Code)
|
||||
var detailPayload map[string]any
|
||||
require.NoError(t, json.Unmarshal(detailRecorder.Body.Bytes(), &detailPayload))
|
||||
require.Equal(t, expert.Name, detailPayload["name"])
|
||||
require.NotEmpty(t, detailPayload["systemPrompt"])
|
||||
require.Equal(t, "MIT", detailPayload["sourceLicense"])
|
||||
|
||||
createRecorder := httptest.NewRecorder()
|
||||
router.ServeHTTP(createRecorder, authenticatedAIRequest(t, http.MethodPost, "/api/v1/projects/"+project.Identity+"/ai-sessions", map[string]any{
|
||||
"title": "专家会话", "context": "请给出下一步计划", "expertId": expert.Identity,
|
||||
}))
|
||||
require.Equal(t, http.StatusCreated, createRecorder.Code)
|
||||
var createPayload map[string]any
|
||||
require.NoError(t, json.Unmarshal(createRecorder.Body.Bytes(), &createPayload))
|
||||
responseExpert := createPayload["expert"].(map[string]any)
|
||||
require.Equal(t, expert.Identity, responseExpert["id"])
|
||||
require.Equal(t, expert.Name, responseExpert["name"])
|
||||
var session models.SenlinAgentAISession
|
||||
require.NoError(t, database.First(&session).Error)
|
||||
require.NotNil(t, session.ExpertID)
|
||||
require.Equal(t, expert.ID, *session.ExpertID)
|
||||
}
|
||||
|
||||
func TestCreateAISessionChecksRateLimitBeforeSelectingProvider(t *testing.T) {
|
||||
database := newAIHandlerTestDB(t)
|
||||
owner := createAIHandlerUser(t, database, "owner@example.com")
|
||||
@@ -210,7 +252,8 @@ func TestCreateAISessionReturnsIdentityDTOAndCompleteAuditWithoutAutomaticObject
|
||||
require.Equal(t, http.StatusCreated, recorder.Code)
|
||||
var payload map[string]any
|
||||
require.NoError(t, json.Unmarshal(recorder.Body.Bytes(), &payload))
|
||||
require.ElementsMatch(t, []string{"id", "projectId", "title", "context", "status", "createdAt", "updatedAt"}, aiMapKeys(payload))
|
||||
require.ElementsMatch(t, []string{"id", "projectId", "title", "context", "status", "expert", "createdAt", "updatedAt"}, aiMapKeys(payload))
|
||||
require.Nil(t, payload["expert"])
|
||||
identity, err := uuid.Parse(payload["id"].(string))
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, uuid.Version(7), identity.Version())
|
||||
@@ -256,7 +299,8 @@ func TestListAISessionsReturnsOnlyOwnedProjectIdentityDTOs(t *testing.T) {
|
||||
var payload []map[string]any
|
||||
require.NoError(t, json.Unmarshal(recorder.Body.Bytes(), &payload))
|
||||
require.Len(t, payload, 1)
|
||||
require.ElementsMatch(t, []string{"id", "projectId", "title", "context", "status", "createdAt", "updatedAt"}, aiMapKeys(payload[0]))
|
||||
require.ElementsMatch(t, []string{"id", "projectId", "title", "context", "status", "expert", "createdAt", "updatedAt"}, aiMapKeys(payload[0]))
|
||||
require.Nil(t, payload[0]["expert"])
|
||||
require.Equal(t, project.Identity, payload[0]["projectId"])
|
||||
require.Equal(t, "目标会话", payload[0]["title"])
|
||||
require.Equal(t, "ready", payload[0]["status"])
|
||||
|
||||
Reference in New Issue
Block a user