Skip to content

Commit

Permalink
feat: optimize model service apis
Browse files Browse the repository at this point in the history
Signed-off-by: bjwswang <[email protected]>
  • Loading branch information
bjwswang committed Dec 26, 2023
1 parent 4a54e73 commit 0c2e18a
Show file tree
Hide file tree
Showing 14 changed files with 469 additions and 984 deletions.
537 changes: 150 additions & 387 deletions apiserver/graph/generated/generated.go

Large diffs are not rendered by default.

53 changes: 38 additions & 15 deletions apiserver/graph/generated/models_gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 1 addition & 10 deletions apiserver/graph/impl/modelservice.resolvers.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

54 changes: 0 additions & 54 deletions apiserver/graph/schema/modelservice.gql
Original file line number Diff line number Diff line change
Expand Up @@ -102,60 +102,6 @@ mutation deleteModelServices($input: DeleteCommonInput) {
}
}

query getModelService($name: String!, $namespace: String!, $apiType: String!) {
ModelService {
getModelService(name: $name, namespace: $namespace, apiType: $apiType) {
id
name
namespace
labels
annotations
creator
displayName
description
types
apiType
creationTimestamp
updateTimestamp
llmResource {
name
namespace
labels
annotations
displayName
description
baseUrl
models
provider
type
updateTimestamp
status
message
}
embedderResource{
name
namespace
labels
annotations
displayName
description
baseUrl
models
provider
type
updateTimestamp
status
message
}
resource {
cpu
memory
nvidiaGPU
}
}
}
}

query listModelServices($input: ListModelService) {
ModelService {
listModelServices(input: $input) {
Expand Down
69 changes: 51 additions & 18 deletions apiserver/graph/schema/modelservice.graphqls
Original file line number Diff line number Diff line change
Expand Up @@ -2,37 +2,58 @@ type ModelService {
id: String
name: String!
namespace: String!

labels: Map
annotations: Map

creator: String
displayName: String
description: String

"""
模型服务的创建和更新时间
"""
creationTimestamp: Time
updateTimestamp: Time


"""
模型服务供应商的类型
规则: 3rd_party 第三方
规则: worker 本地
"""
providerType: String


"""
模型服务能力类型,支持 llm 和 embedding 两种模型类型
规则: 如果该模型支持多种模型类型,则可多选。多选后组成的字段通过逗号隔开。如 "llm,embedding"
"""
types: String

creationTimestamp: Time
updateTimestamp: Time

"""
模型服务 API 类型
规则:与 pkgs/llms.LLMType 相同,支持 openai, zhipuai 两种类型
规则:支持 openai, zhipuai 两种类型
"""
apiType: String

"""
模型对应的 LLM 及 embedder CR 资源
"""
llmResource: LLM
embedderResource: Embedder

"""
第三方的服务不会有这个字段, 只有内部的Worker创建的才会有这个字段。
状态
规则: 目前分为六种状态
- True: 正常
- False: 异常
- Unknown: 未知
- Pending: 发布中
- Running: 已发布
- Error: 异常
"""
resource: Resources
status: String

"""详细的状态消息描述"""
message: String
}

input CreateModelServiceInput {
"""模型服务资源名称(不可同名)"""
name: String!
Expand Down Expand Up @@ -99,7 +120,7 @@ input UpdateModelServiceInput {
endpoint: EndpointInput!
}

input ListModelService {
input ListModelServiceInput {
"""
关键词搜索
"""
Expand All @@ -109,17 +130,30 @@ input ListModelService {
pageSize: Int

"""
all, llm, embedding
模型服务的类型
规则:
- 为空默认不过滤
- llm 则仅返回LLM模型服务
- embedding 则仅返回Embedding模型服务
- llm,embedding 则返回同时提供LLM和Embedding能力的模型服务
"""
modelType: String!
types: String

"""
worker, 3rd
模型服务供应商类型
规则:
- 为空默认不过滤
- worker 则仅返回本地模型服务
- 3rd_party 则仅返回第三方模型服务
"""
providerType: String

"""
openai, zhipuai
模型服务供应商类型
规则:
- 为空默认不过滤
- openai 则仅返回接口类型类型为openai的模型服务
- zhipuai 则仅返回接口类型类型为zhipuai的模型服务
"""
apiType: String
}
Expand All @@ -135,8 +169,7 @@ extend type Mutation {
}

type ModelServiceQuery {
getModelService(name: String!, namespace: String!, apiType: String!): ModelService
listModelServices(input: ListModelService): PaginatedResult!
listModelServices(input: ListModelServiceInput): PaginatedResult!
}

extend type Query {
Expand Down
46 changes: 46 additions & 0 deletions apiserver/pkg/common/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,13 @@ var (
StatusFalse = "False"
)

// ModelType
var (
ModelTypeAll = "llm,embedding"
ModelTypeLLM = "llm"
ModelTypeEmbedding = "embedding"
)

// Resource operations

// ResourceGet provides a common way to get a resource
Expand Down Expand Up @@ -146,3 +153,42 @@ func GetObjStatus(obj client.Object) string {

return string(condition.Status)
}

// PageNodeConvertFunc convert `any` to a `PageNode`
type PageNodeConvertFunc func(any) generated.PageNode

var (
DefaultPageNodeConvertFunc = func(node any) generated.PageNode {
pageNode, ok := node.(generated.PageNode)
if !ok {
return nil
}
return pageNode
}
)

var (
// UnlimitedPageSize which means all
UnlimitedPageSize = -1
)

// ListOptions for graphql list
type ListOptions struct {
ConvertFunc PageNodeConvertFunc
}

// DefaultListOptions initialize a ListOptions with default settings
func DefaultListOptions() *ListOptions {
return &ListOptions{
ConvertFunc: DefaultPageNodeConvertFunc,
}
}

type ListOptionsFunc func(options *ListOptions)

// WithPageNodeConvertFunc update the PageNodeConvertFunc
func WithPageNodeConvertFunc(convertFunc PageNodeConvertFunc) ListOptionsFunc {
return func(option *ListOptions) {
option.ConvertFunc = convertFunc
}
}
17 changes: 15 additions & 2 deletions apiserver/pkg/embedder/embedder.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import (
"github.com/kubeagi/arcadia/pkg/utils"
)

// Embedder2model convert unstructured `CR Embedder` to graphql model `Embedder`
func Embedder2model(ctx context.Context, c dynamic.Interface, obj *unstructured.Unstructured) *generated.Embedder {
embedder := &v1alpha1.Embedder{}
if err := utils.UnstructuredToStructured(obj, embedder); err != nil {
Expand Down Expand Up @@ -212,7 +213,13 @@ func DeleteEmbedders(ctx context.Context, c dynamic.Interface, input *generated.
return nil, nil
}

func ListEmbedders(ctx context.Context, c dynamic.Interface, input generated.ListCommonInput) (*generated.PaginatedResult, error) {
func ListEmbedders(ctx context.Context, c dynamic.Interface, input generated.ListCommonInput, listOpts ...common.ListOptionsFunc) (*generated.PaginatedResult, error) {
// listOpts in this graphql query
opts := common.DefaultListOptions()
for _, optFunc := range listOpts {
optFunc(opts)
}

keyword, labelSelector, fieldSelector := "", "", ""
page, pageSize := 1, 10
if input.Keyword != nil {
Expand Down Expand Up @@ -246,6 +253,12 @@ func ListEmbedders(ctx context.Context, c dynamic.Interface, input generated.Lis

totalCount := len(us.Items)

// if pageSize is -1 which means unlimited pagesize,return all
if pageSize == common.UnlimitedPageSize {
page = 1
pageSize = totalCount
}

result := make([]generated.PageNode, 0, pageSize)
pageStart := (page - 1) * pageSize
for index, u := range us.Items {
Expand All @@ -260,7 +273,7 @@ func ListEmbedders(ctx context.Context, c dynamic.Interface, input generated.Lis
continue
}
}
result = append(result, m)
result = append(result, opts.ConvertFunc(m))

// break if page size matches
if len(result) == pageSize {
Expand Down
Loading

0 comments on commit 0c2e18a

Please sign in to comment.