Go: refactor model API to accept model id (#15999)

### What problem does this PR solve?

Not not only model_name@instance_name@provider_name is acceptable, but
also model_id is acceptable.

### Type of change

- [x] New Feature (non-breaking change which adds functionality)

---------

Signed-off-by: Jin Hai <haijin.chn@gmail.com>
This commit is contained in:
Jin Hai
2026-06-15 10:10:14 +08:00
committed by GitHub
parent 59d4203947
commit 32d5c0039b
10 changed files with 1307 additions and 1319 deletions

View File

@@ -2,6 +2,7 @@ package cli
import (
"fmt"
"ragflow/internal/common"
"strconv"
"strings"
)
@@ -2285,7 +2286,7 @@ func (p *Parser) parseSetVariable() (*Command, error) {
func (p *Parser) parseSetDefault() (*Command, error) {
p.nextToken() // consume DEFAULT
var modelType, compositeModelName string
var modelType, modelNameOrID string
var err error
switch p.curToken.Type {
@@ -2313,12 +2314,12 @@ func (p *Parser) parseSetDefault() (*Command, error) {
}
p.nextToken() // pass MODEL
// Format: 'provider/instance/model' or just 'message'
// Format: 'model@instance@provider' or just 'message'
if p.curToken.Type != TokenQuotedString {
return nil, fmt.Errorf("expected quoted string with format provider/instance/model")
return nil, fmt.Errorf("expected quoted string with format model@instance@provider")
}
compositeModelName, err = p.parseQuotedString()
modelNameOrID, err = p.parseQuotedString()
if err != nil {
return nil, err
}
@@ -2326,7 +2327,14 @@ func (p *Parser) parseSetDefault() (*Command, error) {
cmd := NewCommand("set_default_model")
cmd.Params["model_type"] = modelType
cmd.Params["composite_model_name"] = compositeModelName
if common.IsCompositeModelName(modelNameOrID) {
cmd.Params["composite_model_name"] = modelNameOrID
} else if common.IsUUID(modelNameOrID) {
cmd.Params["model_id"] = modelNameOrID
} else {
return nil, fmt.Errorf("invalid format of model name or ID: %s", modelNameOrID)
}
p.nextToken()
// Semicolon is optional for UNSET TOKEN
@@ -3024,7 +3032,7 @@ func (p *Parser) parseChatCommand() (*Command, error) {
p.nextToken() // consume CHAT
var err error
var compositeModelName string = ""
var modelNameOrID string = ""
var messages []string
var images []string
var videos []string
@@ -3038,11 +3046,11 @@ optionsLoop:
switch p.curToken.Type {
case TokenWith:
p.nextToken()
// 'model@instance@provider'
if compositeModelName != "" {
return nil, fmt.Errorf("model name is already set")
// 'model@instance@provider' or model ID
if modelNameOrID != "" {
return nil, fmt.Errorf("model name or ID is already set")
}
compositeModelName, err = p.parseQuotedString()
modelNameOrID, err = p.parseQuotedString()
if err != nil {
return nil, err
}
@@ -3182,7 +3190,13 @@ optionsLoop:
}
cmd := NewCommand("chat_to_model")
cmd.Params["composite_model_name"] = compositeModelName
if common.IsCompositeModelName(modelNameOrID) {
cmd.Params["composite_model_name"] = modelNameOrID
} else if common.IsUUID(modelNameOrID) {
cmd.Params["model_id"] = modelNameOrID
} else {
return nil, fmt.Errorf("invalid format of model name or ID: %s", modelNameOrID)
}
cmd.Params["messages"] = messages
cmd.Params["images"] = images
cmd.Params["videos"] = videos
@@ -3276,7 +3290,7 @@ textLoop:
}
p.nextToken() // consume WITH
compositeModelName, err := p.parseQuotedString()
modelNameOrID, err := p.parseQuotedString()
if err != nil {
return nil, err
}
@@ -3306,7 +3320,13 @@ textLoop:
}
cmd := NewCommand("embed_user_text")
cmd.Params["composite_model_name"] = compositeModelName
if common.IsCompositeModelName(modelNameOrID) {
cmd.Params["composite_model_name"] = modelNameOrID
} else if common.IsUUID(modelNameOrID) {
cmd.Params["model_id"] = modelNameOrID
} else {
return nil, fmt.Errorf("invalid format of model name or ID: %s", modelNameOrID)
}
cmd.Params["texts"] = texts
if dimension > 0 {
cmd.Params["dimension"] = dimension
@@ -3356,7 +3376,7 @@ documentLoop:
}
p.nextToken() // consume WITH
compositeModelName, err := p.parseQuotedString()
modelNameOrID, err := p.parseQuotedString()
if err != nil {
return nil, err
}
@@ -3374,7 +3394,13 @@ documentLoop:
p.nextToken()
cmd := NewCommand("rarank_user_document")
cmd.Params["composite_model_name"] = compositeModelName
if common.IsCompositeModelName(modelNameOrID) {
cmd.Params["composite_model_name"] = modelNameOrID
} else if common.IsUUID(modelNameOrID) {
cmd.Params["model_id"] = modelNameOrID
} else {
return nil, fmt.Errorf("invalid format of model name or ID: %s", modelNameOrID)
}
cmd.Params["query"] = query
cmd.Params["documents"] = documents
cmd.Params["top_n"] = topN
@@ -3389,7 +3415,7 @@ func (p *Parser) parseASRCommand() (*Command, error) {
}
p.nextToken() // consume WITH
compositeModelName, err := p.parseQuotedString()
modelNameOrID, err := p.parseQuotedString()
if err != nil {
return nil, err
}
@@ -3407,7 +3433,13 @@ func (p *Parser) parseASRCommand() (*Command, error) {
p.nextToken()
cmd := NewCommand("asr_user_command")
cmd.Params["composite_model_name"] = compositeModelName
if common.IsCompositeModelName(modelNameOrID) {
cmd.Params["composite_model_name"] = modelNameOrID
} else if common.IsUUID(modelNameOrID) {
cmd.Params["model_id"] = modelNameOrID
} else {
return nil, fmt.Errorf("invalid format of model name or ID: %s", modelNameOrID)
}
cmd.Params["audio_file"] = audioFile
for p.curToken.Type != TokenEOF && p.curToken.Type != TokenSemicolon {
@@ -3445,9 +3477,18 @@ func (p *Parser) parseTTSCommand() (*Command, error) {
if p.curToken.Type != TokenQuotedString && p.curToken.Type != TokenIdentifier {
return nil, fmt.Errorf("expect model name after 'with'")
}
cmd.Params["composite_model_name"] = strings.Trim(p.curToken.Value, "\"'")
modelNameOrID := strings.Trim(p.curToken.Value, "\"'")
p.nextToken()
if common.IsCompositeModelName(modelNameOrID) {
cmd.Params["composite_model_name"] = modelNameOrID
} else if common.IsUUID(modelNameOrID) {
cmd.Params["model_id"] = modelNameOrID
} else {
return nil, fmt.Errorf("invalid format of model name or ID: %s", modelNameOrID)
}
if p.curToken.Type != TokenText {
return nil, fmt.Errorf("expect 'text' parameter")
}
@@ -3509,7 +3550,7 @@ func (p *Parser) parseOCRCommand() (*Command, error) {
}
p.nextToken() // consume WITH
compositeModelName, err := p.parseQuotedString()
modelNameOrID, err := p.parseQuotedString()
if err != nil {
return nil, err
}
@@ -3540,7 +3581,18 @@ func (p *Parser) parseOCRCommand() (*Command, error) {
return nil, fmt.Errorf("expected FILE or URL")
}
cmd.Params["composite_model_name"] = compositeModelName
if common.IsCompositeModelName(modelNameOrID) {
cmd.Params["composite_model_name"] = modelNameOrID
} else if common.IsUUID(modelNameOrID) {
cmd.Params["model_id"] = modelNameOrID
} else {
return nil, fmt.Errorf("invalid format of model name or ID: %s", modelNameOrID)
}
// Semicolon is optional
if p.curToken.Type == TokenSemicolon {
p.nextToken()
}
return cmd, nil
}
@@ -3548,7 +3600,7 @@ func (p *Parser) parseOCRCommand() (*Command, error) {
func (p *Parser) parseModelParseCommand() (*Command, error) {
p.nextToken() // consume WITH
compositeModelName, err := p.parseQuotedString()
modelNameOrID, err := p.parseQuotedString()
if err != nil {
return nil, err
}
@@ -3579,7 +3631,18 @@ func (p *Parser) parseModelParseCommand() (*Command, error) {
return nil, fmt.Errorf("expected FILE or URL")
}
cmd.Params["composite_model_name"] = compositeModelName
if common.IsCompositeModelName(modelNameOrID) {
cmd.Params["composite_model_name"] = modelNameOrID
} else if common.IsUUID(modelNameOrID) {
cmd.Params["model_id"] = modelNameOrID
} else {
return nil, fmt.Errorf("invalid format of model name or ID: %s", modelNameOrID)
}
// Semicolon is optional
if p.curToken.Type == TokenSemicolon {
p.nextToken()
}
return cmd, nil
}
@@ -3711,7 +3774,7 @@ func (p *Parser) parseUseCommand() (*Command, error) {
func (p *Parser) parseUseModel() (*Command, error) {
p.nextToken() // consume MODEL
compositeModelName, err := p.parseQuotedString()
modelNameOrID, err := p.parseQuotedString()
if err != nil {
return nil, fmt.Errorf("expected model identifier in format 'model@instance@provider': %w", err)
}
@@ -3723,7 +3786,19 @@ func (p *Parser) parseUseModel() (*Command, error) {
}
cmd := NewCommand("use_model")
cmd.Params["composite_model_name"] = compositeModelName
if common.IsCompositeModelName(modelNameOrID) {
cmd.Params["composite_model_name"] = modelNameOrID
} else if common.IsUUID(modelNameOrID) {
cmd.Params["model_id"] = modelNameOrID
} else {
return nil, fmt.Errorf("invalid format of model name or ID: %s", modelNameOrID)
}
// Semicolon is optional
if p.curToken.Type == TokenSemicolon {
p.nextToken()
}
return cmd, nil
}