From 58da1d6bc32fbee6710c7599f259a2a325011b34 Mon Sep 17 00:00:00 2001 From: Jin Hai Date: Fri, 26 Jun 2026 07:07:49 +0800 Subject: [PATCH] Go CLI: fix model related commands (#16368) ### What problem does this PR solve? ``` RAGFlow(api/default)> show provider 'zhipu-ai' RAGFlow(api/default)> show provider 'zhipu-ai' instance 'test'; RAGFlow(api/default)> show provider 'zhipu-ai' instance 'test' balance; RAGFlow(api/default)> show provider 'zhipu-ai' model 'glm-4.5'; ``` ### Type of change - [x] Refactoring --------- Signed-off-by: Jin Hai --- internal/cli/cli_http.go | 12 +-- internal/cli/user_parser.go | 156 ++++++++++++++++++------------------ 2 files changed, 83 insertions(+), 85 deletions(-) diff --git a/internal/cli/cli_http.go b/internal/cli/cli_http.go index d9111f5424..7306db0a56 100644 --- a/internal/cli/cli_http.go +++ b/internal/cli/cli_http.go @@ -340,8 +340,14 @@ func (c *CLI) ExecuteUserCommand(cmd *Command) (ResponseIf, error) { return c.CommonShowCurrentCommand(cmd) case "api_list_available_providers": return c.CommonAvailableProvidersCommand(cmd) - case "show_provider": + case "api_show_provider": return c.CommonShowProviderCommand(cmd) + case "api_show_provider_instance": + return c.CommonShowProviderInstanceCommand(cmd) + case "api_show_provider_instance_balance": + return c.CommonShowProviderInstanceBalanceCommand(cmd) + case "api_show_provider_model": + return c.CommonShowProviderModelCommand(cmd) case "list_provider_models": return c.CommonListModelsCommand(cmd) case "api_list_provider_instance_models": @@ -368,10 +374,6 @@ func (c *CLI) ExecuteUserCommand(cmd *Command) (ResponseIf, error) { return c.CreateProviderInstance(cmd) case "api_list_provider_instances": return c.CommonListProviderInstances(cmd) - case "show_provider_instance": - return c.CommonShowProviderInstanceCommand(cmd) - case "show_instance_balance": - return c.ShowInstanceBalance(cmd) case "alter_provider_instance": return c.CommonAlterProviderInstanceCommand(cmd) case "drop_provider_instance": diff --git a/internal/cli/user_parser.go b/internal/cli/user_parser.go index d77653246c..8cfc48c7f3 100644 --- a/internal/cli/user_parser.go +++ b/internal/cli/user_parser.go @@ -524,13 +524,9 @@ func (p *Parser) parseAPIShowCommands() (*Command, error) { case TokenVar: return p.parseShowVariable() case TokenProvider: - return p.parseShowProvider() + return p.parseAPIShowProviderCommands() case TokenModel: return p.parseShowModel() - case TokenInstance: - return p.parseShowInstance() - case TokenBalance: - return p.parseShowBalance() case TokenTask: return p.parseShowTask() case TokenQuotedString: @@ -630,19 +626,90 @@ func (p *Parser) parseShowModel() (*Command, error) { return cmd, nil } -// parseShowProvider parses SHOW PROVIDER command -func (p *Parser) parseShowProvider() (*Command, error) { +// SHOW PROVIDER +// SHOW PROVIDER INSTANCE +// SHOW PROVIDER INSTANCE BALANCE +// SHOW PROVIDER 'provider_name' MODEL 'model_name'; +func (p *Parser) parseAPIShowProviderCommands() (*Command, error) { p.nextToken() // consume PROVIDER providerName, err := p.parseQuotedString() if err != nil { return nil, fmt.Errorf("expected provider name: %w", err) } + p.nextToken() // consume provider_name - cmd := NewCommand("show_provider") + switch p.curToken.Type { + case TokenInstance: + return p.parseAPIShowProviderInstance(providerName) + case TokenModel: + return p.parseAPIShowProviderModel(providerName) + case TokenSemicolon, TokenEOF: + p.nextToken() + default: + return nil, fmt.Errorf("unknown SHOW target: %s", p.curToken.Value) + } + + cmd := NewCommand("api_show_provider") + cmd.Params["provider_name"] = providerName + + return cmd, nil +} + +// SHOW PROVIDER INSTANCE +func (p *Parser) parseAPIShowProviderInstance(providerName string) (*Command, error) { + p.nextToken() // consume INSTANCE + + instanceName, err := p.parseQuotedString() + if err != nil { + return nil, fmt.Errorf("expected instance name: %w", err) + } + p.nextToken() // consume instance_name + + if p.curToken.Type == TokenBalance { + return p.parseAPIShowProviderInstanceBalance(providerName, instanceName) + } + + cmd := NewCommand("api_show_provider_instance") + cmd.Params["instance_name"] = instanceName + cmd.Params["provider_name"] = providerName + + // Semicolon is optional + if p.curToken.Type == TokenSemicolon { + p.nextToken() + } + return cmd, nil +} + +// SHOW PROVIDER INSTANCE BALANCE +func (p *Parser) parseAPIShowProviderInstanceBalance(providerName, instanceName string) (*Command, error) { + p.nextToken() // consume BALANCE + + cmd := NewCommand("api_show_provider_instance_balance") + cmd.Params["instance_name"] = instanceName + cmd.Params["provider_name"] = providerName + + // Semicolon is optional + if p.curToken.Type == TokenSemicolon { + p.nextToken() + } + return cmd, nil +} + +// SHOW PROVIDER MODEL +func (p *Parser) parseAPIShowProviderModel(providerName string) (*Command, error) { + p.nextToken() // consume MODEL + + modelName, err := p.parseQuotedString() + if err != nil { + return nil, fmt.Errorf("expected model name: %w", err) + } + p.nextToken() // consume model_name + + cmd := NewCommand("api_show_provider_model") + cmd.Params["model_name"] = modelName cmd.Params["provider_name"] = providerName - p.nextToken() // Semicolon is optional if p.curToken.Type == TokenSemicolon { p.nextToken() @@ -1650,77 +1717,6 @@ optionsLoop: return cmd, nil } -// parseShowInstance parses SHOW INSTANCE FROM PROVIDER command -func (p *Parser) parseShowInstance() (*Command, error) { - p.nextToken() // consume INSTANCE - - instanceName, err := p.parseQuotedString() - if err != nil { - return nil, fmt.Errorf("expected instance name: %w", err) - } - - p.nextToken() - 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("show_provider_instance") - cmd.Params["instance_name"] = instanceName - cmd.Params["provider_name"] = providerName - - p.nextToken() - // Semicolon is optional - if p.curToken.Type == TokenSemicolon { - p.nextToken() - } - return cmd, nil -} - -// parseShowBalance parses SHOW BALANCE FROM -func (p *Parser) parseShowBalance() (*Command, error) { - p.nextToken() // consume INSTANCE - - if p.curToken.Type != TokenFrom { - return nil, fmt.Errorf("expected FROM") - } - p.nextToken() - - if p.curToken.Type != TokenQuotedString { - return nil, fmt.Errorf("expected provider name after FROM PROVIDER") - } - providerName, err := p.parseQuotedString() - if err != nil { - return nil, fmt.Errorf("expected provider name after FROM PROVIDER: %w", err) - } - p.nextToken() - - if p.curToken.Type != TokenQuotedString { - return nil, fmt.Errorf("expected instance name") - } - instanceName, err := p.parseQuotedString() - if err != nil { - return nil, fmt.Errorf("expected instance name: %w", err) - } - p.nextToken() - - cmd := NewCommand("show_instance_balance") - cmd.Params["instance_name"] = instanceName - cmd.Params["provider_name"] = providerName - - p.nextToken() - // Semicolon is optional - if p.curToken.Type == TokenSemicolon { - p.nextToken() - } - return cmd, nil -} - // parseShowTask parses SHOW TASK func (p *Parser) parseShowTask() (*Command, error) { p.nextToken() // consume TASK