Files
APIPark/module/ai-api/schema.go
T
2024-09-29 14:46:58 +08:00

107 lines
3.4 KiB
Go

package ai_api
import (
ai_api_dto "github.com/APIParkLab/APIPark/module/ai-api/dto"
"github.com/getkin/kin-openapi/openapi3"
)
func genOpenAPI3Template(title string, description string) *openapi3.T {
result := new(openapi3.T)
result.OpenAPI = "3.1.0"
result.Info = &openapi3.Info{
Title: title,
Description: description,
Version: "beta",
}
result.Components = genComponents()
result.Paths = new(openapi3.Paths)
return result
}
func genOperation(description string, variables []*ai_api_dto.AiPromptVariable) *openapi3.Operation {
operation := openapi3.NewOperation()
operation.RequestBody = genRequestBody(variables)
operation.Responses = &openapi3.Responses{}
operation.Responses.Set("200", genResponse())
operation.Description = description
return operation
}
func genRequestBody(variables []*ai_api_dto.AiPromptVariable) *openapi3.RequestBodyRef {
requestBody := openapi3.NewRequestBody()
requestBody.Content = openapi3.NewContentWithSchema(genRequestBodySchema(variables), []string{"application/json"})
return &openapi3.RequestBodyRef{
Value: requestBody,
}
}
func genResponse() *openapi3.ResponseRef {
response := openapi3.NewResponse()
response.Content = openapi3.NewContentWithSchema(genResponseSchema(), []string{"application/json"})
description := "Response from the server"
response.Description = &description
return &openapi3.ResponseRef{
Value: response,
}
}
func genRequestBodySchema(variables []*ai_api_dto.AiPromptVariable) *openapi3.Schema {
result := openapi3.NewObjectSchema()
variableSchema := openapi3.NewObjectSchema()
required := make([]string, 0, len(variables))
for _, v := range variables {
val := openapi3.NewStringSchema()
val.Example = ""
val.Description = v.Description
if v.Require {
required = append(required, v.Key)
}
variableSchema.WithProperty(v.Key, val)
}
result.WithProperty("variables", variableSchema.WithRequired(required))
result.WithProperty("messages", genMessageSchema())
result.WithRequired([]string{"variables", "messages"})
return result
}
func genComponents() *openapi3.Components {
components := openapi3.NewComponents()
components.Schemas = make(openapi3.Schemas)
components.Schemas["Message"] = genMessageSchema().NewRef()
components.Schemas["Response"] = genResponseSchema().NewRef()
return &components
}
func genMessageSchema() *openapi3.Schema {
messageSchema := openapi3.NewObjectSchema()
messageSchema.Title = "Message"
messageSchema.Description = "Chat Message"
roleSchema := openapi3.NewStringSchema()
roleSchema.Description = "Role of the message sender"
roleSchema.Example = "assistant"
contentSchema := openapi3.NewStringSchema()
contentSchema.Description = "The message content"
contentSchema.Example = "Hello, how can I help you?"
messageSchema.WithProperties(map[string]*openapi3.Schema{
"role": roleSchema,
"content": contentSchema,
})
return messageSchema
}
func genResponseSchema() *openapi3.Schema {
responseSchema := openapi3.NewObjectSchema()
responseSchema.Description = "Response from the server"
responseSchema.WithPropertyRef("message", openapi3.NewSchemaRef("#/components/schemas/Message", genMessageSchema()))
responseSchema.WithProperty("code", openapi3.NewInt32Schema().WithMin(0))
responseSchema.WithProperty("error", openapi3.NewStringSchema())
responseSchema.WithProperty("finish_reason", openapi3.NewStringSchema().WithEnum([]string{
"stop",
"length",
"function_call",
"content_filter",
"null",
}))
return responseSchema
}