Go CLI: list provider instance models, sync and list provider (#16311)

### What problem does this PR solve?

```
RAGFlow(api/default)> list provider 'zhipu-ai' instance 'test' models sync;
+------------+---------------+------------+-------------+------------------+---------------------------------------------+
| dimensions | max_dimension | max_tokens | model_types | name             | thinking                                    |
+------------+---------------+------------+-------------+------------------+---------------------------------------------+
|            |               | 128000     | [chat]      | glm-4.5@z-ai     | map[clear_thinking:true default_value:true] |
|            |               | 128000     | [chat]      | glm-4.5-air@z-ai | map[clear_thinking:true default_value:true] |
|            |               | 202752     | [chat]      | glm-4.6@z-ai     | map[clear_thinking:true default_value:true] |
|            |               | 202752     | [chat]      | glm-4.7@z-ai     | map[clear_thinking:true default_value:true] |
|            |               | 202752     | [chat]      | glm-5@z-ai       | map[clear_thinking:true default_value:true] |
|            |               | 200000     | [chat]      | glm-5-turbo@z-ai | map[clear_thinking:true default_value:true] |
|            |               | 202752     | [chat]      | glm-5.1@z-ai     | map[clear_thinking:true default_value:true] |
|            |               |            | [chat]      | glm-5.2@z-ai     |                                             |
+------------+---------------+------------+-------------+------------------+---------------------------------------------+

RAGFlow(api/default)> list provider 'zhipu-ai' instance 'test' models;

RAGFlow(api/default)> list dataset 'aaa' ingestion tasks;

RAGFlow(api/default)> list dataset '0abe79f9423311f1ad8d38a74640adcc' documents;

```

---------

Signed-off-by: Jin Hai <haijin.chn@gmail.com>
This commit is contained in:
Jin Hai
2026-06-25 10:01:21 +08:00
committed by GitHub
parent 5b0b86c276
commit 7ef4a4a06a
4 changed files with 71 additions and 55 deletions

View File

@@ -126,11 +126,9 @@ func (c *CLI) ExecuteAdminCommand(cmd *Command) (ResponseIf, error) {
case "admin_list_provider_models":
return c.CommonListModelsCommand(cmd)
case "admin_list_provider_instance_models":
return c.CommonListInstanceModels(cmd)
return c.CommonListInstanceModelsCommand(cmd)
case "admin_list_provider_instances":
return c.CommonListProviderInstances(cmd)
case "list_supported_models":
return c.ListSupportedModels(cmd)
case "admin_show_model":
return c.CommonShowModel(cmd)
case "admin_list_providers":
@@ -338,10 +336,10 @@ func (c *CLI) ExecuteUserCommand(cmd *Command) (ResponseIf, error) {
return c.CommonShowProviderCommand(cmd)
case "list_provider_models":
return c.CommonListModelsCommand(cmd)
case "list_supported_models":
return c.ListSupportedModels(cmd)
case "api_list_provider_instance_models":
return c.CommonListInstanceModels(cmd)
return c.CommonListInstanceModelsCommand(cmd)
case "api_list_provider_instance_models_sync":
return c.CommonListInstanceModelsSyncCommand(cmd)
case "show_provider_model":
return c.CommonShowProviderModelCommand(cmd)
case "show_model":
@@ -351,8 +349,8 @@ func (c *CLI) ExecuteUserCommand(cmd *Command) (ResponseIf, error) {
// Provider commands
case "add_provider":
return c.AddProvider(cmd)
case "list_providers":
return c.ListProviders(cmd)
case "api_list_providers":
return c.APIListProviders(cmd)
case "delete_provider":
return c.DeleteProvider(cmd)
// Provider instance commands
@@ -411,7 +409,7 @@ func (c *CLI) ExecuteUserCommand(cmd *Command) (ResponseIf, error) {
return c.SetDefaultModel(cmd)
case "reset_default_model":
return c.ResetDefaultModel(cmd)
case "list_user_default_models":
case "api_list_default_models":
return c.ListDefaultModels(cmd)
case "list_tasks_user_command":
return c.ListTasksUserCommand(cmd)
@@ -449,7 +447,7 @@ func (c *CLI) ExecuteUserCommand(cmd *Command) (ResponseIf, error) {
return c.UserStartIngestionCommand(cmd)
case "user_stop_ingestion_command":
return c.UserStopIngestionCommand(cmd)
case "user_list_ingestion_tasks":
case "api_list_ingestion_tasks":
return c.ListUserIngestionTasks(cmd)
case "user_remove_task_command":
return c.UserRemoveTaskCommand(cmd)

View File

@@ -473,7 +473,7 @@ func (c *CLI) CommonListProviderInstances(cmd *Command) (ResponseIf, error) {
return &result, nil
}
func (c *CLI) CommonListInstanceModels(cmd *Command) (ResponseIf, error) {
func (c *CLI) CommonListInstanceModelsCommand(cmd *Command) (ResponseIf, error) {
providerName, ok := cmd.Params["provider_name"].(string)
if !ok {
@@ -559,7 +559,7 @@ func (c *CLI) CommonListModelsCommand(cmd *Command) (ResponseIf, error) {
return &result, nil
}
func (c *CLI) ListSupportedModels(cmd *Command) (ResponseIf, error) {
func (c *CLI) CommonListInstanceModelsSyncCommand(cmd *Command) (ResponseIf, error) {
providerName, ok := cmd.Params["provider_name"].(string)
if !ok {

View File

@@ -1327,9 +1327,8 @@ func (c *CLI) AddProvider(cmd *Command) (ResponseIf, error) {
return &result, nil
}
// ListProviders lists all providers
// LIST PROVIDERS
func (c *CLI) ListProviders(cmd *Command) (ResponseIf, error) {
// APIListProviders lists added providers
func (c *CLI) APIListProviders(cmd *Command) (ResponseIf, error) {
if c.Config.CLIMode != APIMode {
return nil, fmt.Errorf("this command is only allowed in USER mode")
}

View File

@@ -133,7 +133,7 @@ func (p *Parser) parseAPIListCommands() (*Command, error) {
case TokenDatasets:
return p.parseAPIListDatasets()
case TokenDataset:
return p.parseAPIListDatasetDocuments()
return p.parseAPIListDatasetCommands()
case TokenAgents:
return p.parseAPIListAgents()
case TokenChats:
@@ -150,12 +150,10 @@ func (p *Parser) parseAPIListCommands() (*Command, error) {
return p.parseAPIListProviders()
case TokenProvider:
return p.parseAPIListProviderCommands()
case TokenInstances:
return p.parseListInstances()
case TokenIngestion:
return p.parseUserListIngestionTasks()
return p.parseAPIListIngestionTasks()
case TokenDefault:
return p.parseListDefaultModels()
return p.parseAPIListDefaultModels()
case TokenAvailable:
return p.parseAPIListAvailableProviders()
case TokenFiles:
@@ -192,7 +190,7 @@ func (p *Parser) parseAPIListDatasets() (*Command, error) {
}
// LIST DATASET 'dataset_name' DOCUMENTS;
func (p *Parser) parseAPIListDatasetDocuments() (*Command, error) {
func (p *Parser) parseAPIListDatasetCommands() (*Command, error) {
p.nextToken() // consume DATASET
datasetID, err := p.parseQuotedString()
@@ -201,17 +199,58 @@ func (p *Parser) parseAPIListDatasetDocuments() (*Command, error) {
}
p.nextToken()
if p.curToken.Type != TokenDocuments {
return nil, fmt.Errorf("expected DOCUMENTS")
switch p.curToken.Type {
case TokenDocuments:
return p.parseAPIListDatasetDocuments(datasetID)
case TokenFiles:
return p.parseAPIListDatasetFiles(datasetID)
case TokenIngestion:
return p.parseAPIListDatasetIngestionTasks(datasetID)
default:
return nil, fmt.Errorf("unknown LIST target: %s", p.curToken.Value)
}
}
func (p *Parser) parseAPIListDatasetDocuments(datasetID string) (*Command, error) {
p.nextToken() // consume DOCUMENTS
// Semicolon is optional
if p.curToken.Type == TokenSemicolon {
p.nextToken()
}
cmd := NewCommand("api_list_dataset_documents")
cmd.Params["dataset_id"] = datasetID
return cmd, nil
}
// Semicolon is optional for UNSET TOKEN
func (p *Parser) parseAPIListDatasetFiles(datasetName string) (*Command, error) {
p.nextToken() // consume FILES
// Semicolon is optional
if p.curToken.Type == TokenSemicolon {
p.nextToken()
}
cmd := NewCommand("api_list_dataset_files")
cmd.Params["dataset_name"] = datasetName
return cmd, nil
}
func (p *Parser) parseAPIListDatasetIngestionTasks(datasetName string) (*Command, error) {
p.nextToken() // consume INGESTION
if p.curToken.Type != TokenTasks {
return nil, fmt.Errorf("expected TASKS")
}
// Semicolon is optional
if p.curToken.Type == TokenSemicolon {
p.nextToken()
}
cmd := NewCommand("api_list_ingestion_tasks")
cmd.Params["dataset_name"] = datasetName
return cmd, nil
}
@@ -313,7 +352,7 @@ func (p *Parser) parseAPIListProviders() (*Command, error) {
if p.curToken.Type == TokenSemicolon {
p.nextToken()
}
return NewCommand("list_providers"), nil
return NewCommand("api_list_providers"), nil
}
// LIST PROVIDER 'provider_name' INSTANCES
@@ -350,6 +389,7 @@ func (p *Parser) parseListProviderInstances(providerName string) (*Command, erro
}
// LIST PROVIDER 'provider_name' INSTANCE 'instance_name' MODELS
// LIST PROVIDER 'provider_name' INSTANCE 'instance_name' MODELS SYNC, get model list by API from remote server
func (p *Parser) parseListProviderInstanceModels(providerName string) (*Command, error) {
p.nextToken() // consume INSTANCE
@@ -364,17 +404,21 @@ func (p *Parser) parseListProviderInstanceModels(providerName string) (*Command,
}
p.nextToken()
cmd := NewCommand("api_list_provider_instance_models")
if p.curToken.Type == TokenSync {
cmd = NewCommand("api_list_provider_instance_models_sync")
}
// Semicolon is optional
if p.curToken.Type == TokenSemicolon {
p.nextToken()
}
cmd := NewCommand("api_list_provider_instance_models")
cmd.Params["provider_name"] = providerName
cmd.Params["instance_name"] = instanceName
return cmd, nil
}
func (p *Parser) parseListDefaultModels() (*Command, error) {
func (p *Parser) parseAPIListDefaultModels() (*Command, error) {
p.nextToken() // consume DEFAULT
if p.curToken.Type != TokenModels {
return nil, fmt.Errorf("expected MODELS")
@@ -384,7 +428,7 @@ func (p *Parser) parseListDefaultModels() (*Command, error) {
if p.curToken.Type == TokenSemicolon {
p.nextToken()
}
return NewCommand("list_user_default_models"), nil
return NewCommand("api_list_default_models"), nil
}
func (p *Parser) parseAPIListAvailableProviders() (*Command, error) {
@@ -1595,31 +1639,6 @@ optionsLoop:
return cmd, nil
}
// parseListInstances parses LIST INSTANCES FROM PROVIDER <name> command
func (p *Parser) parseListInstances() (*Command, error) {
p.nextToken() // consume INSTANCES
if p.curToken.Type != TokenFrom {
return nil, fmt.Errorf("expected FROM")
}
p.nextToken()
providerName, err := p.parseQuotedString()
if err != nil {
return nil, fmt.Errorf("expected provider name after FROM PROVIDER: %w", err)
}
cmd := NewCommand("list_provider_instances")
cmd.Params["provider_name"] = providerName
p.nextToken()
// Semicolon is optional
if p.curToken.Type == TokenSemicolon {
p.nextToken()
}
return cmd, nil
}
// parseShowInstance parses SHOW INSTANCE <name> FROM PROVIDER <name> command
func (p *Parser) parseShowInstance() (*Command, error) {
p.nextToken() // consume INSTANCE
@@ -4198,7 +4217,7 @@ func (p *Parser) parseUserStopIngestion() (*Command, error) {
return cmd, nil
}
func (p *Parser) parseUserListIngestionTasks() (*Command, error) {
func (p *Parser) parseAPIListIngestionTasks() (*Command, error) {
p.nextToken() // consume Ingestion
if p.curToken.Type != TokenTasks {
@@ -4206,7 +4225,7 @@ func (p *Parser) parseUserListIngestionTasks() (*Command, error) {
}
p.nextToken() // consume TASKS
cmd := NewCommand("user_list_ingestion_tasks")
cmd := NewCommand("api_list_ingestion_tasks")
if p.curToken.Type == TokenFrom {
p.nextToken()