Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion cmd/server_main.go
Original file line number Diff line number Diff line change
Expand Up @@ -193,9 +193,10 @@ func startServer(config *server.Config) {
searchHandler := handler.NewSearchHandler(searchService, userService)
fileHandler := handler.NewFileHandler(fileService, userService)
memoryHandler := handler.NewMemoryHandler(memoryService)
providerHandler := handler.NewProviderHandler(userService)

// Initialize router
r := router.NewRouter(authHandler, userHandler, tenantHandler, documentHandler, datasetsHandler, systemHandler, kbHandler, chunkHandler, llmHandler, chatHandler, chatSessionHandler, connectorHandler, searchHandler, fileHandler, memoryHandler)
r := router.NewRouter(authHandler, userHandler, tenantHandler, documentHandler, datasetsHandler, systemHandler, kbHandler, chunkHandler, llmHandler, chatHandler, chatSessionHandler, connectorHandler, searchHandler, fileHandler, memoryHandler, providerHandler)

// Create Gin engine
ginEngine := gin.New()
Expand Down
111 changes: 111 additions & 0 deletions internal/admin/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,13 @@ import (
"fmt"
"net/http"
"ragflow/internal/common"
"ragflow/internal/dao"
"ragflow/internal/logger"
"ragflow/internal/server"
"ragflow/internal/service"
"ragflow/internal/utility"
"strconv"
"strings"
"time"

"github.com/gin-gonic/gin"
Expand Down Expand Up @@ -794,6 +796,115 @@ func (h *Handler) RestartService(c *gin.Context) {
success(c, result, "")
}

func (h *Handler) ListProviders(c *gin.Context) {

keywords := ""
if queryKeywords := c.Query("available"); queryKeywords != "" {
keywords = queryKeywords
}

// convert keywords to small case
keywords = strings.ToLower(keywords)
if keywords == "true" {
// list pool providers
providers, err := dao.GetModelProviderManager().ListProviders()
if err != nil {
c.JSON(http.StatusOK, gin.H{
"code": common.CodeNotFound,
"message": err.Error(),
})
return
}

c.JSON(http.StatusOK, gin.H{
"code": 0,
"message": "success",
"data": providers,
})
}
}

func (h *Handler) ShowProvider(c *gin.Context) {
providerName := c.Param("provider_name")
if providerName == "" {
c.JSON(http.StatusBadRequest, gin.H{
"code": 400,
"message": "Provider name is required",
})
return
}

provider, err := dao.GetModelProviderManager().GetProviderByName(providerName)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"code": common.CodeNotFound,
"message": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"code": 0,
"message": "success",
"data": provider,
})
}

func (h *Handler) ListModels(c *gin.Context) {
providerName := c.Param("provider_name")
if providerName == "" {
c.JSON(http.StatusBadRequest, gin.H{
"code": 400,
"message": "Provider name is required",
})
return
}
models, err := dao.GetModelProviderManager().ListModels(providerName)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"code": common.CodeNotFound,
"message": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"code": 0,
"message": "success",
"data": models,
})
}

func (h *Handler) ShowModel(c *gin.Context) {
providerName := c.Param("provider_name")
if providerName == "" {
c.JSON(http.StatusBadRequest, gin.H{
"code": 400,
"message": "Provider name is required",
})
return
}
modelName := c.Param("model_name")
if modelName == "" {
c.JSON(http.StatusBadRequest, gin.H{
"code": 400,
"message": "Model name is required",
})
return
}
model, err := dao.GetModelProviderManager().GetModelByName(providerName, modelName)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"code": common.CodeNotFound,
"message": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"code": 0,
"message": "success",
"data": model,
})
}

// GetVariables handle get variables
// Python logic: if request body is empty, list all variables; otherwise get single variable by var_name from body
func (h *Handler) GetVariables(c *gin.Context) {
Expand Down
19 changes: 8 additions & 11 deletions internal/admin/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@
package admin

import (
"ragflow/internal/handler"

"github.com/gin-gonic/gin"
)

Expand Down Expand Up @@ -48,15 +46,6 @@ func (r *Router) Setup(engine *gin.Engine) {

admin.POST("/reports", r.handler.Reports)

// provider pool route group
provider := admin.Group("providers")
{
provider.GET("/", handler.ListPoolProviders)
provider.GET("/:provider_name", handler.ShowPoolProvider)
provider.GET("/:provider_name/models", handler.ListPoolModels)
provider.GET("/:provider_name/models/:model_name", handler.ShowPoolModel)
}

// Protected routes
protected := admin.Group("")
protected.Use(r.handler.AuthMiddleware())
Expand Down Expand Up @@ -136,6 +125,14 @@ func (r *Router) Setup(engine *gin.Engine) {
// Log level
protected.GET("/log_level", r.handler.GetLogLevel)
protected.PUT("/log_level", r.handler.SetLogLevel)

provider := protected.Group("/providers")
{
provider.GET("/", r.handler.ListProviders)
provider.GET("/:provider_name", r.handler.ShowProvider)
provider.GET("/:provider_name/models", r.handler.ListModels)
provider.GET("/:provider_name/models/:model_name", r.handler.ShowModel)
}
}
}

Expand Down
65 changes: 38 additions & 27 deletions internal/cli/admin_parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -166,8 +166,10 @@ func (p *Parser) parseAdminListCommand() (*Command, error) {
return p.parseAdminListModelProviders()
case TokenDefault:
return p.parseAdminListDefaultModels()
case TokenPool:
return p.parseCommonListPoolModels()
case TokenAvailable:
return p.parseCommonListProviders()
case TokenModels:
return p.parseListModelsOfProvider()
case TokenChats:
p.nextToken()
// Semicolon is optional for SHOW TOKEN
Expand Down Expand Up @@ -273,31 +275,38 @@ func (p *Parser) parseAdminListDefaultModels() (*Command, error) {
return NewCommand("list_user_default_models"), nil
}

func (p *Parser) parseCommonListPoolModels() (*Command, error) {
p.nextToken() // consume POOL
if p.curToken.Type == TokenProviders {
return NewCommand("list_pool_providers"), nil
} else if p.curToken.Type == TokenModels {
p.nextToken()
if p.curToken.Type != TokenFrom {
return nil, fmt.Errorf("expected FROM")
}
p.nextToken()
providerName, err := p.parseQuotedString()
if err != nil {
return nil, err
}
cmd := NewCommand("list_pool_models")
cmd.Params["provider_name"] = providerName
func (p *Parser) parseListModelsOfProvider() (*Command, error) {
if p.curToken.Type != TokenModels {
return nil, fmt.Errorf("expected MODELS")
}

p.nextToken()
if p.curToken.Type != TokenFrom {
return nil, fmt.Errorf("expected FROM")
}
p.nextToken()
providerName, err := p.parseQuotedString()
if err != nil {
return nil, err
}
cmd := NewCommand("list_provider_models")
cmd.Params["provider_name"] = providerName
p.nextToken()
// Semicolon is optional for UNSET TOKEN
if p.curToken.Type == TokenSemicolon {
p.nextToken()
// Semicolon is optional for UNSET TOKEN
if p.curToken.Type == TokenSemicolon {
p.nextToken()
}
return cmd, nil
} else {
return nil, fmt.Errorf("expected PROVIDERS or MODELS")
}
return cmd, nil
}

func (p *Parser) parseCommonListProviders() (*Command, error) {
p.nextToken() // consume AVAILABLE

if p.curToken.Type != TokenProviders {
return nil, fmt.Errorf("expected PROVIDERS")
}

return NewCommand("list_available_providers"), nil
}

func (p *Parser) parseCommonShowPoolModel() (*Command, error) {
Expand Down Expand Up @@ -409,8 +418,10 @@ func (p *Parser) parseAdminShowCommand() (*Command, error) {
return p.parseShowVariable()
case TokenService:
return p.parseShowService()
case TokenPool:
return p.parseCommonShowPoolModel()
case TokenProvider:
return p.parseShowProvider()
case TokenModel:
return p.parseShowModel()
default:
return nil, fmt.Errorf("unknown SHOW target: %s", p.curToken.Value)
}
Expand Down
10 changes: 6 additions & 4 deletions internal/cli/cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -1006,15 +1006,17 @@ Commands (User Mode):
LIST MODEL PROVIDERS; - List model providers
LIST DEFAULT MODELS; - List default models
LIST TOKENS; - List API tokens
LIST PROVIDERS; - List available LLM providers
CREATE TOKEN; - Create new API token
CREATE PROVIDER 'name'; - Create a provider without API key
CREATE PROVIDER 'name' 'api_key'; - Create a provider with API key
DROP TOKEN 'token_value'; - Delete an API token
DROP PROVIDER 'name'; - Delete a provider
SET TOKEN 'token_value'; - Set and validate API token
SHOW TOKEN; - Show current API token
SHOW PROVIDER 'name'; - Show provider details
UNSET TOKEN; - Remove current API token
CREATE INDEX FOR DATASET 'name' VECTOR_SIZE N; - Create index for dataset
DROP INDEX FOR DATASET 'name'; - Drop index for dataset
CREATE INDEX DOC_META; - Create doc meta index
DROP INDEX DOC_META; - Drop doc meta index
ALTER PROVIDER 'name' NAME 'new_name'; - Rename a provider

Context Engine Commands (no quotes):
ls [path] - List resources
Expand Down
37 changes: 22 additions & 15 deletions internal/cli/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,14 +152,14 @@ func (c *RAGFlowClient) ExecuteAdminCommand(cmd *Command) (ResponseIf, error) {
return c.ListAdminTokens(cmd)
case "drop_token":
return c.DropAdminToken(cmd)
case "list_pool_providers":
return c.ListPoolProviders(cmd)
case "show_pool_provider":
return c.ShowPoolProvider(cmd)
case "list_pool_models":
return c.ListPoolModels(cmd)
case "show_pool_model":
return c.ShowPoolModel(cmd)
case "list_available_providers":
return c.ListAvailableProviders(cmd)
case "show_provider":
return c.ShowProvider(cmd)
case "list_provider_models":
return c.ListModels(cmd)
case "show_model":
return c.ShowModel(cmd)
// TODO: Implement other commands
default:
return nil, fmt.Errorf("command '%s' would be executed with API", cmd.Type)
Expand Down Expand Up @@ -204,13 +204,20 @@ func (c *RAGFlowClient) ExecuteUserCommand(cmd *Command) (ResponseIf, error) {
case "drop_doc_meta_index":
return c.DropDocMetaIndex(cmd)
case "list_pool_providers":
return c.ListPoolProviders(cmd)
case "show_pool_provider":
return c.ShowPoolProvider(cmd)
case "list_pool_models":
return c.ListPoolModels(cmd)
case "show_pool_model":
return c.ShowPoolModel(cmd)
return c.ListAvailableProviders(cmd)
case "show_provider":
return c.ShowProvider(cmd)
case "list_provider_models":
return c.ListModels(cmd)
case "show_model":
return c.ShowModel(cmd)
// Provider commands
case "create_provider":
return c.CreateProvider(cmd)
case "list_providers":
return c.ListProviders(cmd)
case "drop_provider":
return c.DropProvider(cmd)
// ContextEngine commands
case "ce_ls":
return c.CEList(cmd)
Expand Down
12 changes: 6 additions & 6 deletions internal/cli/common_command.go
Original file line number Diff line number Diff line change
Expand Up @@ -237,13 +237,13 @@ func (c *RAGFlowClient) Logout() (ResponseIf, error) {
return &result, nil
}

func (c *RAGFlowClient) ListPoolProviders(cmd *Command) (ResponseIf, error) {
func (c *RAGFlowClient) ListAvailableProviders(cmd *Command) (ResponseIf, error) {

var endPoint string
if c.ServerType == "admin" {
endPoint = fmt.Sprintf("/admin/providers")
endPoint = fmt.Sprintf("/admin/providers?available=true")
} else {
endPoint = fmt.Sprintf("/providers")
endPoint = fmt.Sprintf("/providers?available=true")
}

resp, err := c.HTTPClient.Request("GET", endPoint, true, "web", nil, nil)
Expand All @@ -267,7 +267,7 @@ func (c *RAGFlowClient) ListPoolProviders(cmd *Command) (ResponseIf, error) {
return &result, nil
}

func (c *RAGFlowClient) ShowPoolProvider(cmd *Command) (ResponseIf, error) {
func (c *RAGFlowClient) ShowProvider(cmd *Command) (ResponseIf, error) {
providerName, ok := cmd.Params["provider_name"].(string)
if !ok {
return nil, fmt.Errorf("provider_name not provided")
Expand Down Expand Up @@ -301,7 +301,7 @@ func (c *RAGFlowClient) ShowPoolProvider(cmd *Command) (ResponseIf, error) {
return &result, nil
}

func (c *RAGFlowClient) ListPoolModels(cmd *Command) (ResponseIf, error) {
func (c *RAGFlowClient) ListModels(cmd *Command) (ResponseIf, error) {

providerName, ok := cmd.Params["provider_name"].(string)
if !ok {
Expand Down Expand Up @@ -336,7 +336,7 @@ func (c *RAGFlowClient) ListPoolModels(cmd *Command) (ResponseIf, error) {
return &result, nil
}

func (c *RAGFlowClient) ShowPoolModel(cmd *Command) (ResponseIf, error) {
func (c *RAGFlowClient) ShowModel(cmd *Command) (ResponseIf, error) {
providerName, ok := cmd.Params["provider_name"].(string)
if !ok {
return nil, fmt.Errorf("provider_name not provided")
Expand Down
6 changes: 4 additions & 2 deletions internal/cli/lexer.go
Original file line number Diff line number Diff line change
Expand Up @@ -301,8 +301,10 @@ func (l *Lexer) lookupIdent(ident string) Token {
return Token{Type: TokenVectorSize, Value: ident}
case "DOC_META":
return Token{Type: TokenDocMeta, Value: ident}
case "POOL":
return Token{Type: TokenPool, Value: ident}
case "AVAILABLE":
return Token{Type: TokenAvailable, Value: ident}
case "NAME":
return Token{Type: TokenName, Value: ident}
default:
return Token{Type: TokenIdentifier, Value: ident}
}
Expand Down
Loading
Loading