Go CLI: fix mode switch (#16294)

### What problem does this PR solve?

```
RAGFlow(api/default)> add admin host '127.0.0.1:9383';
SUCCESS
RAGFlow(api/default)> use admin;
SUCCESS
RAGFlow(admin)> delete api 'default';
SUCCESS
RAGFlow(admin)> delete api 'default';
CLI error: api server: default not found
RAGFlow(admin)> add api 'default' host '127.0.0.1:9384';
SUCCESS
RAGFlow(admin)> use api 'default';
SUCCESS
RAGFlow(api/default)> delete admin
SUCCESS
RAGFlow(api/default)> delete admin;
CLI error: admin server not exists
RAGFlow(api/default)> list api server;
+------------+---------------+-----------------+---------+
| api_server | api_server_ip | api_server_port | auth    |
+------------+---------------+-----------------+---------+
| default    | 127.0.0.1     | 9384            | no auth |
+------------+---------------+-----------------+---------+
RAGFlow(api/default)> add admin host '127.0.0.1:9383';
SUCCESS
RAGFlow(api/default)> show admin server;
+-------------------+-----------+
| field             | value     |
+-------------------+-----------+
| admin_server_ip   | 127.0.0.1 |
| admin_server_port | 9383      |
| auth              | no auth   |
+-------------------+-----------+
```

### 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-24 13:41:01 +08:00
committed by GitHub
parent e9cdd09b67
commit e615e4faab
3 changed files with 33 additions and 55 deletions

View File

@@ -2260,7 +2260,7 @@ func (p *Parser) parseAdminUseCommand() (*Command, error) {
case TokenAdmin:
return p.parseUseAdminServer()
default:
return nil, fmt.Errorf("expected MODEL or SKILL after USE")
return nil, fmt.Errorf("expected API or ADMIN after USE")
}
}

View File

@@ -71,8 +71,21 @@ func (c *CLI) LoginUserInteractive(email, password string) error {
password = strings.TrimSpace(password)
}
var baseURL string
var httpClient *HTTPClient
switch c.Config.CLIMode {
case AdminMode:
baseURL = "/admin/login"
httpClient = c.AdminServerClient
case APIMode:
baseURL = "/auth/login"
httpClient = c.APIServerClientMap[c.Config.APIClientConfig.CurrentAPIServer]
default:
return fmt.Errorf("invalid server type")
}
// Login
token, err := c.loginUser(email, password)
token, err := c.loginUser(httpClient, baseURL, email, password)
if err != nil {
fmt.Printf("Error: %v\n", err)
fmt.Println("Can't access server for login (connection failed)")
@@ -159,7 +172,7 @@ func (c *CLI) PingServer(iterations int) (ResponseIf, error) {
}
// loginUser performs the actual login request
func (c *CLI) loginUser(email, password string) (string, error) {
func (c *CLI) loginUser(httpClient *HTTPClient, baseURL, email, password string) (string, error) {
publicKey, err := c.GetPublicKeyPEM()
if err != nil {
return "", fmt.Errorf("failed to get public key: %w", err)
@@ -178,15 +191,7 @@ func (c *CLI) loginUser(email, password string) (string, error) {
}
var resp *Response
switch c.Config.CLIMode {
case AdminMode:
resp, err = c.AdminServerClient.Request("POST", "/admin/login", "", nil, payload)
case APIMode:
resp, err = c.APIServerClientMap[c.Config.APIClientConfig.CurrentAPIServer].Request("POST", "/auth/login", "", nil, payload)
default:
return "", fmt.Errorf("invalid server type")
}
resp, err = httpClient.Request("POST", baseURL, "", nil, payload)
if err != nil {
return "", err
}
@@ -1159,10 +1164,6 @@ func (c *CLI) AddAPIServer(cmd *Command) (ResponseIf, error) {
if !ok {
return nil, fmt.Errorf("server port not provided")
}
apiServerToken, ok := cmd.Params["server_token"].(string)
if !ok {
apiServerToken = ""
}
if c.Config.APIClientConfig.APIServerMap == nil {
c.Config.APIClientConfig.APIServerMap = make(map[string]*APIServerConfig)
@@ -1175,9 +1176,6 @@ func (c *CLI) AddAPIServer(cmd *Command) (ResponseIf, error) {
}
c.Config.APIClientConfig.APIServerMap[apiServerName].IP = apiServerIP
c.Config.APIClientConfig.APIServerMap[apiServerName].Port = apiServerPort
if apiServerToken != "" {
c.Config.APIClientConfig.APIServerMap[apiServerName].ApiToken = &apiServerToken
}
if c.APIServerClientMap == nil {
c.APIServerClientMap = make(map[string]*HTTPClient)
@@ -1206,7 +1204,7 @@ func (c *CLI) AddAPIServer(cmd *Command) (ResponseIf, error) {
var result SimpleResponse
result.Code = 0
result.Message = "api server deleted successfully"
result.Message = "api server added successfully"
result.Duration = 0
return &result, nil
}
@@ -1219,6 +1217,11 @@ func (c *CLI) DeleteAPIServer(cmd *Command) (ResponseIf, error) {
if apiServerName == c.Config.APIClientConfig.CurrentAPIServer {
return nil, fmt.Errorf("cannot delete current api server")
}
if c.APIServerClientMap[apiServerName] == nil && c.Config.APIClientConfig.APIServerMap[apiServerName] == nil {
return nil, fmt.Errorf("api server: %s not found", apiServerName)
}
delete(c.Config.APIClientConfig.APIServerMap, apiServerName)
delete(c.APIServerClientMap, apiServerName)
var result SimpleResponse
@@ -1280,15 +1283,17 @@ func (c *CLI) AddAdminServer(cmd *Command) (ResponseIf, error) {
func (c *CLI) DeleteAdminServer(cmd *Command) (ResponseIf, error) {
if c.AdminServerClient != nil && c.AdminServerClient.LoginToken != nil {
return nil, fmt.Errorf("admin server already login, please logout")
if c.AdminServerClient == nil && c.Config.AdminClientConfig == nil {
return nil, fmt.Errorf("admin server not exists")
}
if c.Config.AdminClientConfig == nil {
return nil, fmt.Errorf("admin server not set")
if c.AdminServerClient != nil {
c.AdminServerClient = nil
}
c.Config.AdminClientConfig = nil
if c.Config.AdminClientConfig != nil {
c.Config.AdminClientConfig = nil
}
var result SimpleResponse
result.Code = 0
@@ -1569,6 +1574,7 @@ func (c *CLI) UseAdminServer(cmd *Command) (ResponseIf, error) {
return nil, fmt.Errorf("admin server not added")
}
c.Config.APIClientConfig.CurrentAPIServer = ""
c.Config.CLIMode = AdminMode
var result SimpleResponse

View File

@@ -1025,7 +1025,7 @@ func (p *Parser) parseAddAdminServer() (*Command, error) {
return cmd, nil
}
// syntax: add api 'abc' host '127.0.0.1:9333' token 'xxx' user 'ccc' password 'ppp'
// syntax: ADD API 'abc' HOST '127.0.0.1:9333';
func (p *Parser) parseAddAPIServer() (*Command, error) {
p.nextToken() // consume API
@@ -1036,7 +1036,7 @@ func (p *Parser) parseAddAPIServer() (*Command, error) {
p.nextToken() // consume model name
if p.curToken.Type != TokenHost {
return nil, fmt.Errorf("expected TO")
return nil, fmt.Errorf("expected HOST")
}
p.nextToken()
@@ -1051,33 +1051,10 @@ func (p *Parser) parseAddAPIServer() (*Command, error) {
return nil, err
}
var token string
optionsLoop:
for {
switch p.curToken.Type {
case TokenToken:
p.nextToken()
token, err = p.parseQuotedString()
if err != nil {
return nil, err
}
case TokenSemicolon:
p.nextToken()
break optionsLoop // done
default:
// No more options to process
break optionsLoop
}
}
cmd := NewCommand("add_api_server")
cmd.Params["server_name"] = serverName
cmd.Params["server_ip"] = ip
cmd.Params["server_port"] = port
if token != "" {
cmd.Params["server_token"] = token
}
return cmd, nil
}
@@ -1107,11 +1084,6 @@ func (p *Parser) parseDeleteAPIServer() (*Command, error) {
func (p *Parser) parseDeleteAdminServer() (*Command, error) {
p.nextToken() // consume ADMIN
if p.curToken.Type != TokenServer {
return nil, fmt.Errorf("expected server name")
}
p.nextToken() // consume SERVER
cmd := NewCommand("delete_admin_server")
// Semicolon is optional