mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-07-15 09:28:27 +08:00
Go CLI: admin model framework (#16252)
This commit is contained in:
@@ -103,7 +103,7 @@ func (p *Parser) parseAdminListCommands() (*Command, error) {
|
||||
case TokenAvailable:
|
||||
return p.parseListAvailableProviders()
|
||||
case TokenProvider:
|
||||
return p.parseAdminListProviderModels()
|
||||
return p.parseAdminListProviderCommands()
|
||||
case TokenProviders:
|
||||
return p.parseAdminListProviders()
|
||||
case TokenModels:
|
||||
@@ -244,7 +244,7 @@ func (p *Parser) parseAdminListIngestionTasks() (*Command, error) {
|
||||
}
|
||||
|
||||
// LIST PROVIDER 'provider_name' MODELS;
|
||||
func (p *Parser) parseAdminListProviderModels() (*Command, error) {
|
||||
func (p *Parser) parseAdminListProviderCommands() (*Command, error) {
|
||||
p.nextToken() // consume PROVIDER
|
||||
|
||||
providerName, err := p.parseQuotedString()
|
||||
@@ -253,10 +253,59 @@ func (p *Parser) parseAdminListProviderModels() (*Command, error) {
|
||||
}
|
||||
p.nextToken()
|
||||
|
||||
switch p.curToken.Type {
|
||||
case TokenInstances:
|
||||
return p.parseAdminListProviderInstances(providerName)
|
||||
case TokenInstance:
|
||||
return p.parseAdminListProviderInstance(providerName)
|
||||
case TokenModels:
|
||||
return p.parseAdminListProviderModels(providerName)
|
||||
default:
|
||||
return nil, fmt.Errorf("unknown LIST target: %s", p.curToken.Value)
|
||||
}
|
||||
}
|
||||
|
||||
// LIST PROVIDER 'provider_name' INSTANCE 'instance_name' MODELS;
|
||||
func (p *Parser) parseAdminListProviderInstance(providerName string) (*Command, error) {
|
||||
p.nextToken() // consume INSTANCE
|
||||
|
||||
instanceName, err := p.parseQuotedString()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
p.nextToken()
|
||||
|
||||
if p.curToken.Type != TokenModels {
|
||||
return nil, fmt.Errorf("expected MODELS")
|
||||
}
|
||||
p.nextToken()
|
||||
|
||||
cmd := NewCommand("admin_list_provider_instance_models")
|
||||
cmd.Params["provider_name"] = providerName
|
||||
cmd.Params["instance_name"] = instanceName
|
||||
|
||||
if p.curToken.Type == TokenSemicolon {
|
||||
p.nextToken()
|
||||
}
|
||||
|
||||
return cmd, nil
|
||||
}
|
||||
|
||||
// LIST PROVIDER 'provider_name' INSTANCES;
|
||||
func (p *Parser) parseAdminListProviderInstances(providerName string) (*Command, error) {
|
||||
p.nextToken() // consume INSTANCES
|
||||
cmd := NewCommand("admin_list_provider_instances")
|
||||
cmd.Params["provider_name"] = providerName
|
||||
if p.curToken.Type == TokenSemicolon {
|
||||
p.nextToken()
|
||||
}
|
||||
|
||||
return cmd, nil
|
||||
}
|
||||
|
||||
func (p *Parser) parseAdminListProviderModels(providerName string) (*Command, error) {
|
||||
p.nextToken() // consume MODELS
|
||||
|
||||
cmd := NewCommand("admin_list_provider_models")
|
||||
cmd.Params["provider_name"] = providerName
|
||||
|
||||
@@ -266,7 +315,7 @@ func (p *Parser) parseAdminListProviderModels() (*Command, error) {
|
||||
return cmd, nil
|
||||
}
|
||||
|
||||
// parseAdminListProviders parses LIST PROVIDERS command
|
||||
// LIST PROVIDERS
|
||||
func (p *Parser) parseAdminListProviders() (*Command, error) {
|
||||
p.nextToken() // consume PROVIDERS
|
||||
// Semicolon is optional
|
||||
@@ -657,13 +706,12 @@ func (p *Parser) parseAdminShowProvider() (*Command, error) {
|
||||
}
|
||||
p.nextToken()
|
||||
|
||||
if p.curToken.Type == TokenModel {
|
||||
// SHOW PROVIDER 'provider_name' MODEL 'model_name'
|
||||
switch p.curToken.Type {
|
||||
case TokenInstance:
|
||||
return p.parseAdminShowProviderInstance(providerName)
|
||||
case TokenModel:
|
||||
return p.parseAdminShowProviderModel(providerName)
|
||||
}
|
||||
|
||||
// Semicolon is optional
|
||||
if p.curToken.Type == TokenSemicolon {
|
||||
default:
|
||||
p.nextToken()
|
||||
}
|
||||
|
||||
@@ -672,6 +720,46 @@ func (p *Parser) parseAdminShowProvider() (*Command, error) {
|
||||
return cmd, nil
|
||||
}
|
||||
|
||||
// SHOW PROVIDER 'provider_name' INSTANCE 'instance_name';
|
||||
func (p *Parser) parseAdminShowProviderInstance(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.parseAdminShowProviderInstanceBalance(providerName, instanceName)
|
||||
}
|
||||
|
||||
cmd := NewCommand("admin_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 'provider_name' INSTANCE 'instance_name' BALANCE;
|
||||
func (p *Parser) parseAdminShowProviderInstanceBalance(providerName, instanceName string) (*Command, error) {
|
||||
p.nextToken() // consume BALANCE
|
||||
|
||||
cmd := NewCommand("admin_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 'provider_name' MODEL 'model_name';
|
||||
func (p *Parser) parseAdminShowProviderModel(providerName string) (*Command, error) {
|
||||
p.nextToken() // consume MODEL
|
||||
@@ -760,17 +848,22 @@ func (p *Parser) parseCommonShowPoolModel() (*Command, error) {
|
||||
|
||||
// endregion SHOW commands
|
||||
|
||||
// parseAdminCheck
|
||||
// CHECK LICENSE
|
||||
// CHECK PROVIDER 'provider_name' REGION 'region_name' KEY 'api_key' [URL 'base_url'];
|
||||
// CHECK PROVIDER 'provider_name' INSTANCE 'instance_name';
|
||||
func (p *Parser) parseAdminCheck() (*Command, error) {
|
||||
p.nextToken() // consume CHECK
|
||||
switch p.curToken.Type {
|
||||
case TokenLicense:
|
||||
return p.parseAdminCheckLicense()
|
||||
case TokenProvider:
|
||||
return p.parseAdminCheckProvider()
|
||||
default:
|
||||
return nil, fmt.Errorf("unknown CHECK target: %s", p.curToken.Value)
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK LICENSE;
|
||||
func (p *Parser) parseAdminCheckLicense() (*Command, error) {
|
||||
p.nextToken() // consume LICENSE
|
||||
cmd := NewCommand("admin_check_license")
|
||||
@@ -782,6 +875,90 @@ func (p *Parser) parseAdminCheckLicense() (*Command, error) {
|
||||
return cmd, nil
|
||||
}
|
||||
|
||||
// CHECK PROVIDER 'provider_name' REGION 'region_name' KEY 'api_key' [URL 'base_url'];
|
||||
// CHECK PROVIDER 'provider_name' INSTANCE 'instance_name';
|
||||
func (p *Parser) parseAdminCheckProvider() (*Command, error) {
|
||||
if p.curToken.Type != TokenProvider {
|
||||
return nil, fmt.Errorf("expected PROVIDER after CHECK")
|
||||
}
|
||||
p.nextToken()
|
||||
|
||||
if p.curToken.Type != TokenQuotedString {
|
||||
return nil, fmt.Errorf("expected provider name after PROVIDER")
|
||||
}
|
||||
providerName := p.curToken.Value
|
||||
p.nextToken()
|
||||
|
||||
if p.curToken.Type == TokenInstance {
|
||||
return p.parseAdminCheckProviderInstance(providerName)
|
||||
}
|
||||
|
||||
if p.curToken.Type != TokenRegion {
|
||||
return nil, fmt.Errorf("expected REGION after provider name")
|
||||
}
|
||||
p.nextToken()
|
||||
|
||||
if p.curToken.Type != TokenQuotedString {
|
||||
return nil, fmt.Errorf("expected region name after REGION")
|
||||
}
|
||||
regionName := p.curToken.Value
|
||||
p.nextToken()
|
||||
|
||||
if p.curToken.Type != TokenKey {
|
||||
return nil, fmt.Errorf("expected KEY after region name")
|
||||
}
|
||||
p.nextToken()
|
||||
|
||||
if p.curToken.Type != TokenQuotedString {
|
||||
return nil, fmt.Errorf("expected API key after KEY")
|
||||
}
|
||||
apiKey := p.curToken.Value
|
||||
p.nextToken()
|
||||
|
||||
baseURL := ""
|
||||
if p.curToken.Type == TokenURL {
|
||||
p.nextToken()
|
||||
if p.curToken.Type != TokenQuotedString {
|
||||
return nil, fmt.Errorf("expected base URL after URL")
|
||||
}
|
||||
baseURL = p.curToken.Value
|
||||
p.nextToken()
|
||||
}
|
||||
|
||||
if p.curToken.Type == TokenSemicolon {
|
||||
p.nextToken()
|
||||
}
|
||||
if p.curToken.Type != TokenEOF {
|
||||
return nil, fmt.Errorf("unexpected token: %s", p.curToken.Value)
|
||||
}
|
||||
|
||||
cmd := NewCommand("admin_check_provider_with_key")
|
||||
cmd.Params["provider_name"] = providerName
|
||||
cmd.Params["region"] = regionName
|
||||
cmd.Params["api_key"] = apiKey
|
||||
if baseURL != "" {
|
||||
cmd.Params["base_url"] = baseURL
|
||||
}
|
||||
|
||||
return cmd, nil
|
||||
}
|
||||
|
||||
func (p *Parser) parseAdminCheckProviderInstance(providerName string) (*Command, error) {
|
||||
if p.curToken.Type != TokenInstance {
|
||||
return nil, fmt.Errorf("expected PROVIDER after CHECK")
|
||||
}
|
||||
p.nextToken()
|
||||
|
||||
instanceName, err := p.parseQuotedString()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
cmd := NewCommand("admin_check_provider_instance")
|
||||
cmd.Params["provider_name"] = providerName
|
||||
cmd.Params["instance_name"] = instanceName
|
||||
return cmd, nil
|
||||
}
|
||||
|
||||
// STOP INGESTION TASKS 'task_id1 task_id2';
|
||||
func (p *Parser) parseAdminStopIngestionTasks() (*Command, error) {
|
||||
p.nextToken() // consume STOP
|
||||
@@ -1067,6 +1244,8 @@ func (p *Parser) parseAdminAlterCommands() (*Command, error) {
|
||||
return p.parseAdminAlterUser()
|
||||
case TokenRole:
|
||||
return p.parseAdminAlterRole()
|
||||
case TokenProvider:
|
||||
return p.parseAdminAlterProvider()
|
||||
default:
|
||||
return nil, fmt.Errorf("unknown ALTER target: %s", p.curToken.Value)
|
||||
}
|
||||
@@ -1199,6 +1378,67 @@ func (p *Parser) parseAdminAlterRole() (*Command, error) {
|
||||
return cmd, nil
|
||||
}
|
||||
|
||||
func (p *Parser) parseAdminAlterProvider() (*Command, error) {
|
||||
p.nextToken() // consume PROVIDER
|
||||
|
||||
providerName, err := p.parseQuotedString()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
p.nextToken()
|
||||
|
||||
if p.curToken.Type != TokenInstance {
|
||||
return nil, fmt.Errorf("expected INSTANCE")
|
||||
}
|
||||
p.nextToken()
|
||||
instanceName, err := p.parseQuotedString()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
p.nextToken()
|
||||
|
||||
newModelName := ""
|
||||
newAPIKey := ""
|
||||
optionsLoop:
|
||||
for {
|
||||
switch p.curToken.Type {
|
||||
case TokenName:
|
||||
p.nextToken()
|
||||
newModelName, err = p.parseQuotedString()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("expected model name: %w", err)
|
||||
}
|
||||
p.nextToken()
|
||||
case TokenKey:
|
||||
p.nextToken()
|
||||
newAPIKey, err = p.parseQuotedString()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("expected API key: %w", err)
|
||||
}
|
||||
p.nextToken()
|
||||
default:
|
||||
break optionsLoop
|
||||
}
|
||||
}
|
||||
|
||||
if newModelName == "" && newAPIKey == "" {
|
||||
return nil, fmt.Errorf("expected NAME or KEY after INSTANCE")
|
||||
}
|
||||
|
||||
cmd := NewCommand("admin_alter_provider_instance")
|
||||
cmd.Params["provider_name"] = providerName
|
||||
cmd.Params["instance_name"] = instanceName
|
||||
cmd.Params["new_model_name"] = newModelName
|
||||
cmd.Params["new_api_key"] = newAPIKey
|
||||
|
||||
p.nextToken()
|
||||
// Semicolon is optional
|
||||
if p.curToken.Type == TokenSemicolon {
|
||||
p.nextToken()
|
||||
}
|
||||
return cmd, nil
|
||||
}
|
||||
|
||||
// endregion ALTER commands
|
||||
|
||||
func (p *Parser) parseAdminGrantCommands() (*Command, error) {
|
||||
@@ -1896,6 +2136,112 @@ func (p *Parser) parseAdminDeleteModel(providerName, instanceName string) (*Comm
|
||||
return cmd, nil
|
||||
}
|
||||
|
||||
func (p *Parser) parseAdminEnableCommand() (*Command, error) {
|
||||
p.nextToken() // consume ENABLE
|
||||
switch p.curToken.Type {
|
||||
case TokenProvider:
|
||||
return p.parseAdminEnableModel()
|
||||
default:
|
||||
return nil, fmt.Errorf("unknown ENABLE target: %s", p.curToken.Value)
|
||||
}
|
||||
}
|
||||
|
||||
func (p *Parser) parseAdminEnableModel() (*Command, error) {
|
||||
p.nextToken() // consume PROVIDER
|
||||
|
||||
providerName, err := p.parseQuotedString()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("expected provider name: %w", err)
|
||||
}
|
||||
p.nextToken()
|
||||
|
||||
if p.curToken.Type != TokenInstance {
|
||||
return nil, fmt.Errorf("expected INSTANCE")
|
||||
}
|
||||
p.nextToken()
|
||||
|
||||
instanceName, err := p.parseQuotedString()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("expected model instance name: %w", err)
|
||||
}
|
||||
p.nextToken()
|
||||
|
||||
if p.curToken.Type != TokenModel {
|
||||
return nil, fmt.Errorf("expected MODEL")
|
||||
}
|
||||
p.nextToken()
|
||||
|
||||
modelName, err := p.parseQuotedString()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("expected model name: %w", err)
|
||||
}
|
||||
p.nextToken()
|
||||
|
||||
cmd := NewCommand("admin_enable_model")
|
||||
cmd.Params["provider_name"] = providerName
|
||||
cmd.Params["instance_name"] = instanceName
|
||||
cmd.Params["model_name"] = modelName
|
||||
|
||||
// Semicolon is optional
|
||||
if p.curToken.Type == TokenSemicolon {
|
||||
p.nextToken()
|
||||
}
|
||||
return cmd, nil
|
||||
}
|
||||
|
||||
func (p *Parser) parseAdminDisableCommand() (*Command, error) {
|
||||
p.nextToken() // consume DISABLE
|
||||
switch p.curToken.Type {
|
||||
case TokenProvider:
|
||||
return p.parseAdminDisableModel()
|
||||
default:
|
||||
return nil, fmt.Errorf("unknown DISABLE target: %s", p.curToken.Value)
|
||||
}
|
||||
}
|
||||
|
||||
func (p *Parser) parseAdminDisableModel() (*Command, error) {
|
||||
p.nextToken() // consume PROVIDER
|
||||
|
||||
providerName, err := p.parseQuotedString()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("expected provider name: %w", err)
|
||||
}
|
||||
p.nextToken()
|
||||
|
||||
if p.curToken.Type != TokenInstance {
|
||||
return nil, fmt.Errorf("expected INSTANCE")
|
||||
}
|
||||
p.nextToken()
|
||||
|
||||
instanceName, err := p.parseQuotedString()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("expected model instance name: %w", err)
|
||||
}
|
||||
p.nextToken()
|
||||
|
||||
if p.curToken.Type != TokenModel {
|
||||
return nil, fmt.Errorf("expected MODEL")
|
||||
}
|
||||
p.nextToken()
|
||||
|
||||
modelName, err := p.parseQuotedString()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("expected model name: %w", err)
|
||||
}
|
||||
p.nextToken()
|
||||
|
||||
cmd := NewCommand("admin_disable_model")
|
||||
cmd.Params["provider_name"] = providerName
|
||||
cmd.Params["instance_name"] = instanceName
|
||||
cmd.Params["model_name"] = modelName
|
||||
|
||||
// Semicolon is optional
|
||||
if p.curToken.Type == TokenSemicolon {
|
||||
p.nextToken()
|
||||
}
|
||||
return cmd, nil
|
||||
}
|
||||
|
||||
func (p *Parser) parseAdminSaveCommand() (*Command, error) {
|
||||
p.nextToken() // consume SAVE
|
||||
switch p.curToken.Type {
|
||||
|
||||
Reference in New Issue
Block a user