Go CLI: Fix show admin server and api server (#16382)

### What problem does this PR solve?

RAGFlow(api/default)> show admin server;

RAGFlow(api/default)> show api server 'default';

RAGFlow(admin)> show admin server;

RAGFlow(admin)> show api server 'default';

### Type of change

- [x] Bug Fix (non-breaking change which fixes an issue)

---------

Signed-off-by: Jin Hai <haijin.chn@gmail.com>
This commit is contained in:
Jin Hai
2026-06-26 19:16:14 +08:00
committed by GitHub
parent ca96d61e73
commit f763044889
8 changed files with 484 additions and 234 deletions

View File

@@ -385,9 +385,9 @@ func (p *Parser) parseAdminShowCommands() (*Command, error) {
case TokenModel:
return p.parseAdminShowModel()
case TokenAdmin:
return p.parseUserShowAdmin()
return p.parseAdminShowAdminServer()
case TokenAPI:
return p.parseUserShowAPI()
return p.parseAdminShowAPI()
case TokenUsers:
return p.parseAdminShowUsersCommands()
case TokenData:
@@ -823,6 +823,55 @@ func (p *Parser) parseAdminShowModel() (*Command, error) {
return cmd, nil
}
// SHOW ADMIN SERVER;
func (p *Parser) parseAdminShowAdminServer() (*Command, error) {
p.nextToken() // consume ADMIN
var cmd *Command
switch p.curToken.Type {
case TokenServer:
p.nextToken()
cmd = NewCommand("admin_show_admin_server")
default:
return nil, fmt.Errorf("expected SERVER after ADMIN")
}
// Semicolon is optional
if p.curToken.Type == TokenSemicolon {
p.nextToken()
}
return cmd, nil
}
// SHOW API SERVER <server_name>
func (p *Parser) parseAdminShowAPI() (*Command, error) {
p.nextToken() // consume API
var cmd *Command
switch p.curToken.Type {
case TokenServer:
p.nextToken()
cmd = NewCommand("admin_show_api_server")
serverName, err := p.parseQuotedString()
if err != nil {
return nil, fmt.Errorf("expected API server name: %w", err)
}
cmd.Params["api_server_name"] = serverName
p.nextToken()
default:
return nil, fmt.Errorf("expected SERVER after API")
}
// Semicolon is optional
if p.curToken.Type == TokenSemicolon {
p.nextToken()
}
return cmd, nil
}
func (p *Parser) parseCommonShowPoolModel() (*Command, error) {
p.nextToken() // consume POOL
if p.curToken.Type == TokenProvider {
@@ -2281,12 +2330,36 @@ func (p *Parser) parseAdminSaveCommand() (*Command, error) {
p.nextToken() // consume SAVE
switch p.curToken.Type {
case TokenConfig:
return p.parseSaveConfig()
return p.parseAdminSaveConfig()
default:
return nil, fmt.Errorf("unknown ADD target: %s", p.curToken.Value)
}
}
func (p *Parser) parseAdminSaveConfig() (*Command, error) {
p.nextToken() // consume CONFIG
if p.curToken.Type != TokenAs {
return nil, fmt.Errorf("expected AS after CONFIG")
}
p.nextToken() // consume AS
path, err := p.parseQuotedString()
if err != nil {
return nil, err
}
cmd := NewCommand("admin_save_config_command")
cmd.Params["path"] = path
// Semicolon is optional
if p.curToken.Type == TokenSemicolon {
p.nextToken()
}
return cmd, nil
}
func (p *Parser) parseAdminUseCommand() (*Command, error) {
p.nextToken() // consume USE
switch p.curToken.Type {

View File

@@ -257,11 +257,10 @@ func (c *CLI) ExecuteAdminCommand(cmd *Command) (ResponseIf, error) {
return c.CommonEnableOrDisableModel(cmd, "enable")
case "admin_disable_model":
return c.CommonEnableOrDisableModel(cmd, "disable")
// TODO: Implement other commands
case "show_admin_server":
return c.ShowAdminServer(cmd)
case "show_api_server":
return c.ShowAPIServer(cmd)
case "admin_show_admin_server":
return c.CommonShowAdminServerCommand(cmd)
case "admin_show_api_server":
return c.CommonShowAPIServerCommand(cmd)
case "admin_show_log_level":
return c.AdminShowLogLevelCommand(cmd)
case "admin_list_api_servers":
@@ -274,8 +273,8 @@ func (c *CLI) ExecuteAdminCommand(cmd *Command) (ResponseIf, error) {
return nil, fmt.Errorf("cannot add admin server in admin mode")
case "delete_admin_server":
return nil, fmt.Errorf("cannot delete admin server in admin mode")
case "save_config_command":
return c.SaveServerConfig(cmd)
case "admin_save_config_command":
return c.CommonSaveServerConfigCommand(cmd)
case "admin_use_api_server":
return c.CommonUseAPIServerCommand(cmd)
case "admin_use_admin_server":
@@ -322,6 +321,16 @@ func (c *CLI) ExecuteUserCommand(cmd *Command) (ResponseIf, error) {
return nil, nil
case "api_create_api_key":
return c.APICreateAPIKeyCommand(cmd)
case "api_create_dataset":
return c.APICreateDatasetCommand(cmd)
case "api_create_agent":
return c.APICreateAgentCommand(cmd)
case "api_create_chat":
return c.APICreateChatCommand(cmd)
case "api_create_search":
return c.APICreateSearchCommand(cmd)
case "api_create_memory":
return c.APICreateMemoryCommand(cmd)
case "api_list_api_keys":
return c.APIListAPIKeysCommand(cmd)
case "api_delete_api_key":
@@ -348,6 +357,8 @@ func (c *CLI) ExecuteUserCommand(cmd *Command) (ResponseIf, error) {
return c.CommonShowProviderInstanceCommand(cmd)
case "api_show_provider_instance_balance":
return c.CommonShowProviderInstanceBalanceCommand(cmd)
case "api_show_provider_instance_task":
return c.APIShowProviderInstanceTaskCommand(cmd)
case "api_show_provider_model":
return c.CommonShowProviderModelCommand(cmd)
case "list_provider_models":
@@ -370,8 +381,8 @@ func (c *CLI) ExecuteUserCommand(cmd *Command) (ResponseIf, error) {
case "delete_provider":
return c.DeleteProvider(cmd)
// Provider instance commands
case "create_provider_instance":
return c.CreateProviderInstance(cmd)
case "api_create_provider_instance":
return c.APICreateProviderInstanceCommand(cmd)
case "api_list_provider_instances":
return c.CommonListProviderInstances(cmd)
case "alter_provider_instance":
@@ -411,11 +422,11 @@ func (c *CLI) ExecuteUserCommand(cmd *Command) (ResponseIf, error) {
return c.CommonCheckProviderConnection(cmd)
case "check_provider_with_key":
return c.CommonCheckProviderWithKey(cmd)
case "use_model":
return c.UseModel(cmd)
case "use_api_server":
case "api_use_model":
return c.APIUseModelCommand(cmd)
case "api_use_api_server":
return c.CommonUseAPIServerCommand(cmd)
case "use_admin_server":
case "api_use_admin_server":
return c.CommonUseAdminServerCommand(cmd)
case "set_default_model":
return c.SetDefaultModel(cmd)
@@ -423,8 +434,6 @@ func (c *CLI) ExecuteUserCommand(cmd *Command) (ResponseIf, error) {
return c.ResetDefaultModel(cmd)
case "api_list_default_models":
return c.ListDefaultModels(cmd)
case "show_task_user_command":
return c.ShowTaskUserCommand(cmd)
case "create_chunk_store":
return c.CreateChunkStore(cmd)
case "drop_chunk_store":
@@ -464,10 +473,10 @@ func (c *CLI) ExecuteUserCommand(cmd *Command) (ResponseIf, error) {
// TODO: Implement other commands
case "user_parse_local_file_command":
return c.UserParseLocalFile(cmd)
case "show_admin_server":
return c.ShowAdminServer(cmd)
case "show_api_server":
return c.ShowAPIServer(cmd)
case "api_show_admin_server":
return c.CommonShowAdminServerCommand(cmd)
case "api_show_api_server":
return c.CommonShowAPIServerCommand(cmd)
case "api_show_log_level":
return c.APIShowLogLevelCommand(cmd)
case "api_list_api_servers":
@@ -486,8 +495,8 @@ func (c *CLI) ExecuteUserCommand(cmd *Command) (ResponseIf, error) {
return c.DeleteAdminServer(cmd)
case "user_chunk_command":
return c.ChunkCommand(cmd)
case "save_config_command":
return c.SaveServerConfig(cmd)
case "api_save_config_command":
return c.CommonSaveServerConfigCommand(cmd)
case "file_system_command":
return c.ExecuteFilesystemCommand(cmd)
default:

View File

@@ -1101,11 +1101,11 @@ func (c *CLI) CommonShowCurrentCommand(cmd *Command) (ResponseIf, error) {
return result, nil
}
func (c *CLI) ShowAdminServer(cmd *Command) (ResponseIf, error) {
func (c *CLI) CommonShowAdminServerCommand(cmd *Command) (ResponseIf, error) {
return c.GetAdminServerInfo()
}
func (c *CLI) ShowAPIServer(cmd *Command) (ResponseIf, error) {
func (c *CLI) CommonShowAPIServerCommand(cmd *Command) (ResponseIf, error) {
apiServerName, ok := cmd.Params["api_server_name"].(string)
if !ok {
return nil, fmt.Errorf("api_server_name not provided")
@@ -1302,7 +1302,7 @@ func (c *CLI) DeleteAdminServer(cmd *Command) (ResponseIf, error) {
return &result, nil
}
func (c *CLI) SaveServerConfig(cmd *Command) (ResponseIf, error) {
func (c *CLI) CommonSaveServerConfigCommand(cmd *Command) (ResponseIf, error) {
switch c.Config.CLIMode {
case AdminMode:

View File

@@ -361,6 +361,10 @@ func (l *Lexer) lookupIdent(ident string) Token {
return Token{Type: TokenGet, Value: ident}
case "SEARCH":
return Token{Type: TokenSearch, Value: ident}
case "AGENT":
return Token{Type: TokenAgent, Value: ident}
case "MEMORY":
return Token{Type: TokenMemory, Value: ident}
case "RETRIEVE":
return Token{Type: TokenRetrieve, Value: ident}
case "CURRENT":

View File

@@ -153,9 +153,9 @@ func (p *Parser) parseUserCommand() (*Command, error) {
case TokenShow:
return p.parseAPIShowCommands()
case TokenCreate:
return p.parseCreateCommand()
return p.parseAPICreateCommands()
case TokenDrop:
return p.parseDropCommand()
return p.parseAPIDropCommands()
case TokenAdd:
return p.parseAddCommand()
case TokenDelete:
@@ -206,11 +206,10 @@ func (p *Parser) parseUserCommand() (*Command, error) {
return p.parseUserStartIngestion()
case TokenStop:
return p.parseUserStopIngestion()
case TokenSave:
return p.parseUserSaveCommand()
return p.parseAPISaveCommand()
case TokenUse:
return p.parseUseCommand()
return p.parseAPIUseCommands()
case TokenUpdate:
return p.parseUpdateCommand()
case TokenRemove:

View File

@@ -101,6 +101,8 @@ const (
TokenParser
TokenPipeline
TokenSearch
TokenAgent
TokenMemory
TokenRetrieve
TokenCurrent
TokenFingerprint

View File

@@ -957,6 +957,12 @@ func (c *CLI) APICreateAPIKeyCommand(cmd *Command) (ResponseIf, error) {
}
httpClient := c.APIServerClientMap[c.Config.APIClientConfig.CurrentAPIServer]
// Determine auth kind based on whether API key is being used
if httpClient.LoginToken == nil && !c.APIServerClientMap[c.Config.APIClientConfig.CurrentAPIServer].useAPIKey {
return nil, fmt.Errorf("no authorization")
}
resp, err := httpClient.Request("POST", "/system/keys", "web", nil, nil)
if err != nil {
return nil, fmt.Errorf("failed to create key: %w", err)
@@ -982,6 +988,191 @@ func (c *CLI) APICreateAPIKeyCommand(cmd *Command) (ResponseIf, error) {
return &result, nil
}
func (c *CLI) APICreateDatasetCommand(cmd *Command) (ResponseIf, error) {
if c.Config.CLIMode != APIMode {
return nil, fmt.Errorf("this command is only allowed in USER mode")
}
httpClient := c.APIServerClientMap[c.Config.APIClientConfig.CurrentAPIServer]
// Determine auth kind based on whether API key is being used
if httpClient.LoginToken == nil && !c.APIServerClientMap[c.Config.APIClientConfig.CurrentAPIServer].useAPIKey {
return nil, fmt.Errorf("no authorization")
}
resp, err := httpClient.Request("POST", "/datasets", "web", nil, nil)
if err != nil {
return nil, fmt.Errorf("failed to create dataset: %w", err)
}
if resp.StatusCode != 200 {
return nil, fmt.Errorf("failed to create dataset: HTTP %d, body: %s", resp.StatusCode, string(resp.Body))
}
var createResult CommonDataResponse
if err = json.Unmarshal(resp.Body, &createResult); err != nil {
return nil, fmt.Errorf("create dataset failed: invalid JSON (%w)", err)
}
if createResult.Code != 0 {
return nil, fmt.Errorf("error code: %d, message: %s", createResult.Code, createResult.Message)
}
var result SimpleResponse
result.Code = 0
result.Message = "Dataset created successfully"
result.Duration = resp.Duration
return &result, nil
}
func (c *CLI) APICreateAgentCommand(cmd *Command) (ResponseIf, error) {
if c.Config.CLIMode != APIMode {
return nil, fmt.Errorf("this command is only allowed in USER mode")
}
httpClient := c.APIServerClientMap[c.Config.APIClientConfig.CurrentAPIServer]
// Determine auth kind based on whether API key is being used
if httpClient.LoginToken == nil && !c.APIServerClientMap[c.Config.APIClientConfig.CurrentAPIServer].useAPIKey {
return nil, fmt.Errorf("no authorization")
}
resp, err := httpClient.Request("POST", "/agents", "web", nil, nil)
if err != nil {
return nil, fmt.Errorf("failed to create agent: %w", err)
}
if resp.StatusCode != 200 {
return nil, fmt.Errorf("failed to create agent: HTTP %d, body: %s", resp.StatusCode, string(resp.Body))
}
var createResult CommonDataResponse
if err = json.Unmarshal(resp.Body, &createResult); err != nil {
return nil, fmt.Errorf("create agent failed: invalid JSON (%w)", err)
}
if createResult.Code != 0 {
return nil, fmt.Errorf("%s", createResult.Message)
}
var result SimpleResponse
result.Code = 0
result.Message = "Agent created successfully"
result.Duration = resp.Duration
return &result, nil
}
func (c *CLI) APICreateChatCommand(cmd *Command) (ResponseIf, error) {
if c.Config.CLIMode != APIMode {
return nil, fmt.Errorf("this command is only allowed in USER mode")
}
httpClient := c.APIServerClientMap[c.Config.APIClientConfig.CurrentAPIServer]
// Determine auth kind based on whether API key is being used
if httpClient.LoginToken == nil && !c.APIServerClientMap[c.Config.APIClientConfig.CurrentAPIServer].useAPIKey {
return nil, fmt.Errorf("no authorization")
}
resp, err := httpClient.Request("POST", "/chats", "web", nil, nil)
if err != nil {
return nil, fmt.Errorf("failed to create chat: %w", err)
}
if resp.StatusCode != 200 {
return nil, fmt.Errorf("failed to create chat: HTTP %d, body: %s", resp.StatusCode, string(resp.Body))
}
var createResult CommonDataResponse
if err = json.Unmarshal(resp.Body, &createResult); err != nil {
return nil, fmt.Errorf("create chat failed: invalid JSON (%w)", err)
}
if createResult.Code != 0 {
return nil, fmt.Errorf("%s", createResult.Message)
}
var result SimpleResponse
result.Code = 0
result.Message = "Chat created successfully"
result.Duration = resp.Duration
return &result, nil
}
func (c *CLI) APICreateSearchCommand(cmd *Command) (ResponseIf, error) {
if c.Config.CLIMode != APIMode {
return nil, fmt.Errorf("this command is only allowed in USER mode")
}
httpClient := c.APIServerClientMap[c.Config.APIClientConfig.CurrentAPIServer]
// Determine auth kind based on whether API key is being used
if httpClient.LoginToken == nil && !c.APIServerClientMap[c.Config.APIClientConfig.CurrentAPIServer].useAPIKey {
return nil, fmt.Errorf("no authorization")
}
resp, err := httpClient.Request("POST", "/searches", "web", nil, nil)
if err != nil {
return nil, fmt.Errorf("failed to create search: %w", err)
}
if resp.StatusCode != 200 {
return nil, fmt.Errorf("failed to create search: HTTP %d, body: %s", resp.StatusCode, string(resp.Body))
}
var createResult CommonDataResponse
if err = json.Unmarshal(resp.Body, &createResult); err != nil {
return nil, fmt.Errorf("create search failed: invalid JSON (%w)", err)
}
if createResult.Code != 0 {
return nil, fmt.Errorf("%s", createResult.Message)
}
var result SimpleResponse
result.Code = 0
result.Message = "Search created successfully"
result.Duration = resp.Duration
return &result, nil
}
func (c *CLI) APICreateMemoryCommand(cmd *Command) (ResponseIf, error) {
if c.Config.CLIMode != APIMode {
return nil, fmt.Errorf("this command is only allowed in USER mode")
}
httpClient := c.APIServerClientMap[c.Config.APIClientConfig.CurrentAPIServer]
// Determine auth kind based on whether API key is being used
if httpClient.LoginToken == nil && !c.APIServerClientMap[c.Config.APIClientConfig.CurrentAPIServer].useAPIKey {
return nil, fmt.Errorf("no authorization")
}
resp, err := httpClient.Request("POST", "/memories", "web", nil, nil)
if err != nil {
return nil, fmt.Errorf("failed to create memory: %w", err)
}
if resp.StatusCode != 200 {
return nil, fmt.Errorf("failed to create memory: HTTP %d, body: %s", resp.StatusCode, string(resp.Body))
}
var createResult CommonDataResponse
if err = json.Unmarshal(resp.Body, &createResult); err != nil {
return nil, fmt.Errorf("create memory failed: invalid JSON (%w)", err)
}
if createResult.Code != 0 {
return nil, fmt.Errorf("%s", createResult.Message)
}
var result SimpleResponse
result.Code = 0
result.Message = "Memory created successfully"
result.Duration = resp.Duration
return &result, nil
}
// APIListAPIKeysCommand lists all API keys for the current user
func (c *CLI) APIListAPIKeysCommand(cmd *Command) (ResponseIf, error) {
if c.Config.CLIMode != APIMode {
@@ -1485,6 +1676,11 @@ func (c *CLI) DeleteProvider(cmd *Command) (ResponseIf, error) {
return nil, fmt.Errorf("this command is only allowed in USER mode")
}
httpClient := c.APIServerClientMap[c.Config.APIClientConfig.CurrentAPIServer]
if httpClient.APIKey == nil && httpClient.LoginToken == nil {
return nil, fmt.Errorf("API key not set. Please login first")
}
providerName, ok := cmd.Params["provider_name"].(string)
if !ok {
return nil, fmt.Errorf("provider name not provided")
@@ -1497,7 +1693,7 @@ func (c *CLI) DeleteProvider(cmd *Command) (ResponseIf, error) {
"llm_factory": providerName,
}
resp, err := c.APIServerClientMap[c.Config.APIClientConfig.CurrentAPIServer].Request("DELETE", url, "web", nil, payload)
resp, err := httpClient.Request("DELETE", url, "web", nil, payload)
if err != nil {
return nil, fmt.Errorf("failed to delete provider: %w", err)
}
@@ -1519,13 +1715,18 @@ func (c *CLI) DeleteProvider(cmd *Command) (ResponseIf, error) {
return &result, nil
}
// CreateProviderInstance creates a new provider instance
// APICreateProviderInstanceCommand creates a new provider instance
// CREATE PROVIDER <name> INSTANCE <instance_name> KEY <api_key> URL <base_url> REGION <region>
func (c *CLI) CreateProviderInstance(cmd *Command) (ResponseIf, error) {
func (c *CLI) APICreateProviderInstanceCommand(cmd *Command) (ResponseIf, error) {
if c.Config.CLIMode != APIMode {
return nil, fmt.Errorf("this command is only allowed in USER mode")
}
httpClient := c.APIServerClientMap[c.Config.APIClientConfig.CurrentAPIServer]
if httpClient.APIKey == nil && httpClient.LoginToken == nil {
return nil, fmt.Errorf("API key not set. Please login first")
}
providerName, ok := cmd.Params["provider_name"].(string)
if !ok {
return nil, fmt.Errorf("provider name not provided")
@@ -1560,7 +1761,7 @@ func (c *CLI) CreateProviderInstance(cmd *Command) (ResponseIf, error) {
"region": region,
}
resp, err := c.APIServerClientMap[c.Config.APIClientConfig.CurrentAPIServer].Request("POST", url, "web", nil, payload)
resp, err := httpClient.Request("POST", url, "web", nil, payload)
if err != nil {
return nil, fmt.Errorf("failed to create provider instance: %w", err)
}
@@ -2715,8 +2916,11 @@ func (c *CLI) APIListModelInstanceTasksCommand(cmd *Command) (ResponseIf, error)
return &result, nil
}
func (c *CLI) ShowTaskUserCommand(cmd *Command) (ResponseIf, error) {
if c.APIServerClientMap[c.Config.APIClientConfig.CurrentAPIServer].APIKey == nil && c.APIServerClientMap[c.Config.APIClientConfig.CurrentAPIServer].LoginToken == nil {
// APIShowProviderInstanceTaskCommand shows the details of a task
func (c *CLI) APIShowProviderInstanceTaskCommand(cmd *Command) (ResponseIf, error) {
httpClient := c.APIServerClientMap[c.Config.APIClientConfig.CurrentAPIServer]
if httpClient.APIKey == nil && httpClient.LoginToken == nil {
return nil, fmt.Errorf("API key not set. Please login first")
}
@@ -2724,18 +2928,14 @@ func (c *CLI) ShowTaskUserCommand(cmd *Command) (ResponseIf, error) {
return nil, fmt.Errorf("this command is only allowed in USER mode")
}
var providerName, instanceName string
providerName, ok := cmd.Params["provider_name"].(string)
if !ok {
return nil, fmt.Errorf("no provider name")
}
// Check if composite_instance_name is provided in command
if compositeModelName, ok := cmd.Params["composite_instance_name"].(string); ok && compositeModelName != "" {
names := strings.Split(compositeModelName, "@")
if len(names) != 2 {
return nil, fmt.Errorf("model name must be in format 'instance@provider'")
}
providerName = names[1]
instanceName = names[0]
} else {
return nil, fmt.Errorf("no provider name or instance name")
instanceName, ok := cmd.Params["instance_name"].(string)
if !ok {
return nil, fmt.Errorf("no instance name")
}
taskID, ok := cmd.Params["task_id"].(string)
@@ -2745,7 +2945,7 @@ func (c *CLI) ShowTaskUserCommand(cmd *Command) (ResponseIf, error) {
url := fmt.Sprintf("/providers/%s/instances/%s/tasks/%s", providerName, instanceName, taskID)
resp, err := c.APIServerClientMap[c.Config.APIClientConfig.CurrentAPIServer].Request("GET", url, "web", nil, nil)
resp, err := httpClient.Request("GET", url, "web", nil, nil)
if err != nil {
return nil, fmt.Errorf("failed to get task: %w", err)
}
@@ -2763,8 +2963,8 @@ func (c *CLI) ShowTaskUserCommand(cmd *Command) (ResponseIf, error) {
return &result, nil
}
// UseModel sets the current model for chat
func (c *CLI) UseModel(cmd *Command) (ResponseIf, error) {
// APIUseModelCommand sets the current model for chat
func (c *CLI) APIUseModelCommand(cmd *Command) (ResponseIf, error) {
if c.APIServerClientMap[c.Config.APIClientConfig.CurrentAPIServer].APIKey == nil && c.APIServerClientMap[c.Config.APIClientConfig.CurrentAPIServer].LoginToken == nil {
return nil, fmt.Errorf("API key not set. Please login first")
}

View File

@@ -480,38 +480,6 @@ func (p *Parser) parseAPIListAvailableProviders() (*Command, error) {
return NewCommand("api_list_available_providers"), nil
}
func (p *Parser) parseShowQuotedStringCommand() (*Command, error) {
str, err := p.parseQuotedString()
if err != nil {
return nil, err
}
p.nextToken() // consume str
switch p.curToken.Type {
case TokenTask:
p.nextToken() // consume TASK
var taskID string
taskID, err = p.parseQuotedString()
if err != nil {
return nil, fmt.Errorf("expected string: %w", err)
}
p.nextToken()
cmd := NewCommand("show_task_user_command")
cmd.Params["task_id"] = taskID
cmd.Params["composite_instance_name"] = str
p.nextToken()
// Semicolon is optional
if p.curToken.Type == TokenSemicolon {
p.nextToken()
}
return cmd, nil
default:
return nil, fmt.Errorf("unknown command: %s", str)
}
}
func (p *Parser) parseAPIShowCommands() (*Command, error) {
p.nextToken() // consume SHOW
switch p.curToken.Type {
@@ -527,14 +495,10 @@ func (p *Parser) parseAPIShowCommands() (*Command, error) {
return p.parseAPIShowProviderCommands()
case TokenModel:
return p.parseAPIShowModel()
case TokenTask:
return p.parseShowTask()
case TokenQuotedString:
return p.parseShowQuotedStringCommand()
case TokenAdmin:
return p.parseUserShowAdmin()
return p.parseAPIShowAdmin()
case TokenAPI:
return p.parseUserShowAPI()
return p.parseAPIShowAPI()
case TokenLog:
return p.parseAPIShowLogCommands()
default:
@@ -590,7 +554,7 @@ func (p *Parser) parseAPIShowVariable() (*Command, error) {
return cmd, nil
}
// SHOW MODEL 'model_name'
// SHOW MODEL 'model_name';
func (p *Parser) parseAPIShowModel() (*Command, error) {
p.nextToken() // consume MODEL
@@ -608,9 +572,10 @@ func (p *Parser) parseAPIShowModel() (*Command, error) {
return cmd, nil
}
// SHOW PROVIDER <name>
// SHOW PROVIDER <name> INSTANCE <instance_name>
// SHOW PROVIDER <name> INSTANCE <instance_name> BALANCE
// SHOW PROVIDER <name>;
// SHOW PROVIDER <name> INSTANCE <instance_name>;
// SHOW PROVIDER <name> INSTANCE <instance_name> BALANCE;
// SHOW PROVIDER <name> INSTANCE <instance_name> TASK <task_id>;
// SHOW PROVIDER 'provider_name' MODEL 'model_name';
func (p *Parser) parseAPIShowProviderCommands() (*Command, error) {
p.nextToken() // consume PROVIDER
@@ -638,7 +603,7 @@ func (p *Parser) parseAPIShowProviderCommands() (*Command, error) {
return cmd, nil
}
// SHOW PROVIDER <name> INSTANCE <instance_name>
// SHOW PROVIDER <name> INSTANCE <instance_name>;
func (p *Parser) parseAPIShowProviderInstance(providerName string) (*Command, error) {
p.nextToken() // consume INSTANCE
@@ -648,18 +613,21 @@ func (p *Parser) parseAPIShowProviderInstance(providerName string) (*Command, er
}
p.nextToken() // consume instance_name
if p.curToken.Type == TokenBalance {
switch p.curToken.Type {
case TokenBalance:
return p.parseAPIShowProviderInstanceBalance(providerName, instanceName)
case TokenTask:
return p.parseAPIShowProviderInstanceTask(providerName, instanceName)
case TokenSemicolon, TokenEOF:
p.nextToken()
default:
return nil, fmt.Errorf("unknown SHOW target: %s", p.curToken.Value)
}
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
}
@@ -678,6 +646,28 @@ func (p *Parser) parseAPIShowProviderInstanceBalance(providerName, instanceName
return cmd, nil
}
// SHOW PROVIDER <name> INSTANCE <instance_name> TASK <task_id>
func (p *Parser) parseAPIShowProviderInstanceTask(providerName, instanceName string) (*Command, error) {
p.nextToken() // consume TASK
taskID, err := p.parseQuotedString()
if err != nil {
return nil, fmt.Errorf("expected task id: %w", err)
}
p.nextToken() // consume task_id
cmd := NewCommand("api_show_provider_instance_task")
cmd.Params["instance_name"] = instanceName
cmd.Params["provider_name"] = providerName
cmd.Params["task_id"] = taskID
// Semicolon is optional
if p.curToken.Type == TokenSemicolon {
p.nextToken()
}
return cmd, nil
}
// SHOW PROVIDER <name> MODEL <model_name>
func (p *Parser) parseAPIShowProviderModel(providerName string) (*Command, error) {
p.nextToken() // consume MODEL
@@ -711,16 +701,20 @@ func (p *Parser) parseListAllModels() (*Command, error) {
return cmd, nil
}
func (p *Parser) parseCreateCommand() (*Command, error) {
func (p *Parser) parseAPICreateCommands() (*Command, error) {
p.nextToken() // consume CREATE
switch p.curToken.Type {
case TokenModel:
return p.parseCreateModelProvider()
case TokenDataset:
return p.parseCreateDataset()
return p.parseAPICreateDataset()
case TokenChat:
return p.parseCreateChat()
return p.parseAPICreateChat()
case TokenSearch:
return p.parseAPICreateSearch()
case TokenAgent:
return p.parseAPICreateAgent()
case TokenMemory:
return p.parseAPICreateMemory()
case TokenKey:
return p.parseAPICreateKey()
case TokenChunkStore:
@@ -728,7 +722,7 @@ func (p *Parser) parseCreateCommand() (*Command, error) {
case TokenMetadata:
return p.parseCreateMetadataStore()
case TokenProvider:
return p.parseCreateProviderInstance()
return p.parseAPICreateProviderInstance()
default:
return nil, fmt.Errorf("unknown CREATE target: %s", p.curToken.Value)
}
@@ -858,36 +852,6 @@ func (p *Parser) parseCreateRole() (*Command, error) {
return cmd, nil
}
func (p *Parser) parseCreateModelProvider() (*Command, error) {
p.nextToken() // consume MODEL
if p.curToken.Type != TokenProvider {
return nil, fmt.Errorf("expected PROVIDER")
}
p.nextToken()
providerName, err := p.parseQuotedString()
if err != nil {
return nil, err
}
p.nextToken()
providerKey, err := p.parseQuotedString()
if err != nil {
return nil, err
}
cmd := NewCommand("create_model_provider")
cmd.Params["provider_name"] = providerName
cmd.Params["provider_key"] = providerKey
p.nextToken()
// Semicolon is optional
if p.curToken.Type == TokenSemicolon {
p.nextToken()
}
return cmd, nil
}
// parseAddProvider parses ADD PROVIDER commands
// ADD PROVIDER <name>
func (p *Parser) parseAddProvider() (*Command, error) {
@@ -1248,18 +1212,18 @@ func (p *Parser) parseDeleteAdminServer() (*Command, error) {
return cmd, nil
}
func (p *Parser) parseUserSaveCommand() (*Command, error) {
func (p *Parser) parseAPISaveCommand() (*Command, error) {
p.nextToken() // consume SAVE
switch p.curToken.Type {
case TokenConfig:
return p.parseSaveConfig()
return p.parseAPISaveConfig()
default:
return nil, fmt.Errorf("unknown ADD target: %s", p.curToken.Value)
}
}
// syntax: save config as 'path'
func (p *Parser) parseSaveConfig() (*Command, error) {
// SAVE CONFIG AS 'path'
func (p *Parser) parseAPISaveConfig() (*Command, error) {
p.nextToken() // consume CONFIG
if p.curToken.Type != TokenAs {
@@ -1272,7 +1236,7 @@ func (p *Parser) parseSaveConfig() (*Command, error) {
return nil, err
}
cmd := NewCommand("save_config_command")
cmd := NewCommand("api_save_config_command")
cmd.Params["path"] = path
// Semicolon is optional
@@ -1283,7 +1247,9 @@ func (p *Parser) parseSaveConfig() (*Command, error) {
return cmd, nil
}
func (p *Parser) parseCreateDataset() (*Command, error) {
// CREATE DATASET 'abc' WITH EMBEDDING 'modelName@instanceName@providerName' PARSER 'parserType'
// CREATE DATASET 'abc' WITH EMBEDDING 'modelName@instanceName@providerName' PIPELINE 'pipelineName'
func (p *Parser) parseAPICreateDataset() (*Command, error) {
p.nextToken() // consume DATASET
datasetName, err := p.parseQuotedString()
if err != nil {
@@ -1306,13 +1272,14 @@ func (p *Parser) parseCreateDataset() (*Command, error) {
}
p.nextToken()
cmd := NewCommand("create_user_dataset")
cmd := NewCommand("api_create_dataset")
cmd.Params["dataset_name"] = datasetName
cmd.Params["embedding"] = embedding
if p.curToken.Type == TokenParser {
p.nextToken()
parserType, err := p.parseQuotedString()
var parserType string
parserType, err = p.parseQuotedString()
if err != nil {
return nil, err
}
@@ -1320,7 +1287,8 @@ func (p *Parser) parseCreateDataset() (*Command, error) {
p.nextToken()
} else if p.curToken.Type == TokenPipeline {
p.nextToken()
pipeline, err := p.parseQuotedString()
var pipeline string
pipeline, err = p.parseQuotedString()
if err != nil {
return nil, err
}
@@ -1337,32 +1305,89 @@ func (p *Parser) parseCreateDataset() (*Command, error) {
return cmd, nil
}
func (p *Parser) parseCreateChat() (*Command, error) {
// CREAT CHAT 'chat_name'
func (p *Parser) parseAPICreateChat() (*Command, error) {
p.nextToken() // consume CHAT
chatName, err := p.parseQuotedString()
if err != nil {
return nil, err
}
p.nextToken()
cmd := NewCommand("create_user_chat")
// Semicolon is optional
if p.curToken.Type == TokenSemicolon {
p.nextToken()
}
cmd := NewCommand("api_create_chat")
cmd.Params["chat_name"] = chatName
return cmd, nil
}
// CREAT AGENT 'agent_name'
func (p *Parser) parseAPICreateAgent() (*Command, error) {
p.nextToken() // consume AGENT
agentName, err := p.parseQuotedString()
if err != nil {
return nil, err
}
p.nextToken()
// Semicolon is optional
if p.curToken.Type == TokenSemicolon {
p.nextToken()
}
cmd := NewCommand("api_create_agent")
cmd.Params["agent_name"] = agentName
return cmd, nil
}
// CREAT SEARCH 'search_name'
func (p *Parser) parseAPICreateSearch() (*Command, error) {
p.nextToken() // consume SEARCH
searchName, err := p.parseQuotedString()
if err != nil {
return nil, err
}
p.nextToken()
// Semicolon is optional
if p.curToken.Type == TokenSemicolon {
p.nextToken()
}
cmd := NewCommand("api_create_search")
cmd.Params["search_name"] = searchName
return cmd, nil
}
// CREAT MEMORY 'memory_name'
func (p *Parser) parseAPICreateMemory() (*Command, error) {
p.nextToken() // consume MEMORY
memoryName, err := p.parseQuotedString()
if err != nil {
return nil, err
}
p.nextToken()
// Semicolon is optional
if p.curToken.Type == TokenSemicolon {
p.nextToken()
}
cmd := NewCommand("api_create_memory")
cmd.Params["memory_name"] = memoryName
return cmd, nil
}
func (p *Parser) parseDropCommand() (*Command, error) {
func (p *Parser) parseAPIDropCommands() (*Command, error) {
p.nextToken() // consume DROP
switch p.curToken.Type {
case TokenUser:
return p.parseDropUser()
case TokenRole:
return p.parseDropRole()
case TokenDataset:
return p.parseDropDataset()
case TokenChat:
@@ -1484,42 +1509,6 @@ func (p *Parser) parseDropMetadataStore() (*Command, error) {
return cmd, nil
}
func (p *Parser) parseDropUser() (*Command, error) {
p.nextToken() // consume USER
userName, err := p.parseQuotedString()
if err != nil {
return nil, err
}
cmd := NewCommand("drop_user")
cmd.Params["user_name"] = userName
p.nextToken()
// Semicolon is optional
if p.curToken.Type == TokenSemicolon {
p.nextToken()
}
return cmd, nil
}
func (p *Parser) parseDropRole() (*Command, error) {
p.nextToken() // consume ROLE
roleName, err := p.parseIdentifier()
if err != nil {
return nil, err
}
cmd := NewCommand("drop_role")
cmd.Params["role_name"] = roleName
p.nextToken()
// Semicolon is optional
if p.curToken.Type == TokenSemicolon {
p.nextToken()
}
return cmd, nil
}
// parseDeleteProvider parses DELETE PROVIDER <name> command
func (p *Parser) parseDeleteProvider() (*Command, error) {
p.nextToken() // consume PROVIDER
@@ -1621,9 +1610,8 @@ func (p *Parser) parseAlterProvider() (*Command, error) {
return cmd, nil
}
// parseCreateProviderInstance parses CREATE PROVIDER <name> INSTANCE <instance_name> KEY <api_key> URL <base_url> REGION <region> command
// instance_name cannot be "default"
func (p *Parser) parseCreateProviderInstance() (*Command, error) {
// CREATE PROVIDER <name> INSTANCE <instance_name> KEY <api_key> URL <base_url> REGION <region>
func (p *Parser) parseAPICreateProviderInstance() (*Command, error) {
p.nextToken() // consume PROVIDER
providerName, err := p.parseQuotedString()
@@ -1678,7 +1666,7 @@ optionsLoop:
}
}
cmd := NewCommand("create_provider_instance")
cmd := NewCommand("api_create_provider_instance")
cmd.Params["provider_name"] = providerName
cmd.Params["instance_name"] = instanceName
cmd.Params["api_key"] = apiKey
@@ -1699,27 +1687,6 @@ optionsLoop:
return cmd, nil
}
// parseShowTask parses SHOW TASK <task>
func (p *Parser) parseShowTask() (*Command, error) {
p.nextToken() // consume TASK
taskID, err := p.parseQuotedString()
if err != nil {
return nil, fmt.Errorf("expected string: %w", err)
}
p.nextToken()
cmd := NewCommand("show_task_user_command")
cmd.Params["task_id"] = taskID
p.nextToken()
// Semicolon is optional
if p.curToken.Type == TokenSemicolon {
p.nextToken()
}
return cmd, nil
}
// parseAlterInstance parses ALTER INSTANCE <name> NAME <new_name> FROM PROVIDER <name> command
func (p *Parser) parseAlterInstance() (*Command, error) {
p.nextToken() // consume INSTANCE
@@ -3313,22 +3280,22 @@ func (p *Parser) parseCheckProviderByKeyCommand() (*Command, error) {
return cmd, nil
}
func (p *Parser) parseUseCommand() (*Command, error) {
func (p *Parser) parseAPIUseCommands() (*Command, error) {
p.nextToken() // consume USE
switch p.curToken.Type {
case TokenModel:
return p.parseUseModel()
return p.parseAPIUseModel()
case TokenAPI:
return p.parseUseAPIServer()
return p.parseAPIUseAPIServer()
case TokenAdmin:
return p.parseUseAdminServer()
return p.parseAPIUseAdminServer()
default:
return nil, fmt.Errorf("expected MODEL or SKILL after USE")
}
}
func (p *Parser) parseUseModel() (*Command, error) {
func (p *Parser) parseAPIUseModel() (*Command, error) {
p.nextToken() // consume MODEL
modelNameOrID, err := p.parseQuotedString()
@@ -3342,7 +3309,7 @@ func (p *Parser) parseUseModel() (*Command, error) {
p.nextToken()
}
cmd := NewCommand("use_model")
cmd := NewCommand("api_use_model")
if common.IsCompositeModelName(modelNameOrID) {
cmd.Params["composite_model_name"] = modelNameOrID
@@ -3359,7 +3326,7 @@ func (p *Parser) parseUseModel() (*Command, error) {
return cmd, nil
}
func (p *Parser) parseUseAPIServer() (*Command, error) {
func (p *Parser) parseAPIUseAPIServer() (*Command, error) {
p.nextToken() // consume API
serverName, err := p.parseQuotedString()
@@ -3367,7 +3334,7 @@ func (p *Parser) parseUseAPIServer() (*Command, error) {
return nil, err
}
p.nextToken()
cmd := NewCommand("use_api_server")
cmd := NewCommand("api_use_api_server")
cmd.Params["server_name"] = serverName
// Semicolon is optional
@@ -3377,10 +3344,10 @@ func (p *Parser) parseUseAPIServer() (*Command, error) {
return cmd, nil
}
func (p *Parser) parseUseAdminServer() (*Command, error) {
func (p *Parser) parseAPIUseAdminServer() (*Command, error) {
p.nextToken() // consume ADMIN
cmd := NewCommand("use_admin_server")
cmd := NewCommand("api_use_admin_server")
// Semicolon is optional
if p.curToken.Type == TokenSemicolon {
@@ -3587,10 +3554,6 @@ func (p *Parser) parseUserStatement() (*Command, error) {
return p.parseDeleteCommand()
case TokenShow:
return p.parseAPIShowCommands()
case TokenCreate:
return p.parseCreateCommand()
case TokenDrop:
return p.parseDropCommand()
case TokenList:
return p.parseAPIListCommands()
case TokenParse:
@@ -4056,15 +4019,15 @@ func (p *Parser) parseUserStartIngestion() (*Command, error) {
return cmd, nil
}
// parseShowTask parses SHOW ADMIN SERVER
func (p *Parser) parseUserShowAdmin() (*Command, error) {
// SHOW ADMIN SERVER
func (p *Parser) parseAPIShowAdmin() (*Command, error) {
p.nextToken() // consume ADMIN
var cmd *Command
switch p.curToken.Type {
case TokenServer:
p.nextToken()
cmd = NewCommand("show_admin_server")
cmd = NewCommand("api_show_admin_server")
default:
return nil, fmt.Errorf("expected SERVER after ADMIN")
}
@@ -4160,19 +4123,19 @@ func (p *Parser) parseUserRemoveTask() (*Command, error) {
return cmd, nil
}
// parseShowTask parses SHOW API SERVER <server_name>
func (p *Parser) parseUserShowAPI() (*Command, error) {
// SHOW API SERVER <server_name>
func (p *Parser) parseAPIShowAPI() (*Command, error) {
p.nextToken() // consume API
var cmd *Command
switch p.curToken.Type {
case TokenServer:
p.nextToken()
cmd = NewCommand("show_api_server")
cmd = NewCommand("api_show_api_server")
serverName, err := p.parseQuotedString()
if err != nil {
return nil, fmt.Errorf("expected dataset_name: %w", err)
return nil, fmt.Errorf("expected API server name: %w", err)
}
cmd.Params["api_server_name"] = serverName
p.nextToken()