Enhance Assistant Filtering with Multi-Type Support

- Added a new `Types` field to the `AssistantFilter` struct to allow filtering by multiple types using an IN query.
- Updated the `GetAssistants` function to apply the new multi-type filter alongside the existing single type filter.
- Modified the OpenAPI endpoint to support the new `types` query parameter for better flexibility in assistant retrieval.
- Ensured backward compatibility by setting a default type when neither `type` nor `types` is specified.
- Updated related documentation and tests to reflect the changes in filtering capabilities.
This commit is contained in:
Max 2026-01-22 19:21:51 +08:00
parent 111fc28634
commit ff412da7b3
5 changed files with 197 additions and 176 deletions

View file

@ -174,7 +174,8 @@ const (
// Used for filtering and pagination when retrieving assistant lists
type AssistantFilter struct {
Tags []string `json:"tags,omitempty"` // Filter by tags
Type string `json:"type,omitempty"` // Filter by type
Type string `json:"type,omitempty"` // Filter by type (single value)
Types []string `json:"types,omitempty"` // Filter by types (multiple values, IN query)
Keywords string `json:"keywords,omitempty"` // Search in name and description
Connector string `json:"connector,omitempty"` // Filter by connector
AssistantID string `json:"assistant_id,omitempty"` // Filter by assistant ID

View file

@ -353,11 +353,16 @@ func (store *Xun) GetAssistants(filter types.AssistantFilter, locale ...string)
})
}
// Apply type filter if provided
// Apply type filter if provided (single value)
if filter.Type != "" {
qb.Where("type", filter.Type)
}
// Apply types filter if provided (multiple values, IN query)
if len(filter.Types) > 0 {
qb.WhereIn("type", filter.Types)
}
// Apply connector filter if provided
if filter.Connector != "" {
qb.Where("connector", filter.Connector)

File diff suppressed because it is too large Load diff

View file

@ -78,12 +78,24 @@ func ListAssistants(c *gin.Context) {
// Parse filter parameters
keywords := strings.TrimSpace(c.Query("keywords"))
typeParam := strings.TrimSpace(c.Query("type"))
if typeParam == "" {
typeParam = "assistant" // Default type
}
connector := strings.TrimSpace(c.Query("connector"))
assistantID := strings.TrimSpace(c.Query("assistant_id"))
// Parse types (multiple, comma-separated for IN query)
var types []string
if typesParam := c.Query("types"); typesParam != "" {
types = strings.Split(typesParam, ",")
// Trim spaces
for i, t := range types {
types[i] = strings.TrimSpace(t)
}
}
// Set default type only if neither type nor types is specified
if typeParam == "" && len(types) == 0 {
typeParam = "assistant" // Default type
}
// Parse assistant IDs (multiple)
var assistantIDs []string
if assistantIDsParam := c.Query("assistant_ids"); assistantIDsParam != "" {
@ -131,6 +143,7 @@ func ListAssistants(c *gin.Context) {
PageSize: pagesize,
Keywords: keywords,
Type: typeParam,
Types: types,
Connector: connector,
AssistantID: assistantID,
AssistantIDs: assistantIDs,

View file

@ -49,7 +49,8 @@ type AssistantFilterParams struct {
Page int
PageSize int
Keywords string
Type string
Type string // Single type filter
Types []string // Multiple types filter (IN query)
Connector string
AssistantID string
AssistantIDs []string
@ -70,6 +71,7 @@ func BuildAssistantFilter(params AssistantFilterParams) agenttypes.AssistantFilt
Keywords: params.Keywords,
Tags: params.Tags,
Type: params.Type,
Types: params.Types,
Connector: params.Connector,
AssistantID: params.AssistantID,
AssistantIDs: params.AssistantIDs,
@ -79,8 +81,8 @@ func BuildAssistantFilter(params AssistantFilterParams) agenttypes.AssistantFilt
Automated: params.Automated,
}
// Set default type if not specified
if filter.Type == "" {
// Set default type if not specified (only when Types is also empty)
if filter.Type == "" && len(filter.Types) == 0 {
filter.Type = "assistant"
}