jinshan/internal/mods/ai/api/ai_request.api.go
2025-06-19 10:35:26 +08:00

172 lines
4.8 KiB
Go

package api
import (
"context"
"fmt"
"github.com/gin-gonic/gin"
"gitlab.guxuan.icu/jinshan_community/internal/mods/ai/biz"
"gitlab.guxuan.icu/jinshan_community/internal/mods/ai/schema"
"gitlab.guxuan.icu/jinshan_community/pkg/ai"
"gitlab.guxuan.icu/jinshan_community/pkg/util"
"time"
)
// Defining the `AiRequest` api.
type AiRequest struct {
AiRequestBIZ *biz.AiRequest
}
// @Tags AiRequestAPI
// @Security ApiKeyAuth
// @Summary Query ai request list
// @Param current query int true "pagination index" default(1)
// @Param pageSize query int true "pagination size" default(10)
// @Success 200 {object} util.ResponseResult{data=[]schema.AiRequest}
// @Failure 401 {object} util.ResponseResult
// @Failure 500 {object} util.ResponseResult
// @Router /api/v1/ai-requests [get]
func (a *AiRequest) Query(c *gin.Context) {
ctx := c.Request.Context()
var params schema.AiRequestQueryParam
if err := util.ParseQuery(c, &params); err != nil {
util.ResError(c, err)
return
}
result, err := a.AiRequestBIZ.Query(ctx, params)
if err != nil {
util.ResError(c, err)
return
}
util.ResPage(c, result.Data, result.PageResult)
}
// @Tags AiRequestAPI
// @Security ApiKeyAuth
// @Summary Get ai request record by ID
// @Param id path string true "unique id"
// @Success 200 {object} util.ResponseResult{data=schema.AiRequest}
// @Failure 401 {object} util.ResponseResult
// @Failure 500 {object} util.ResponseResult
// @Router /api/v1/ai-requests/{id} [get]
func (a *AiRequest) Get(c *gin.Context) {
ctx := c.Request.Context()
item, err := a.AiRequestBIZ.Get(ctx, c.Param("id"))
if err != nil {
util.ResError(c, err)
return
}
util.ResSuccess(c, item)
}
// @Tags AiRequestAPI
// @Security ApiKeyAuth
// @Summary Create ai request record
// @Param body body schema.AiRequestForm true "Request body"
// @Success 200 {object} util.ResponseResult{data=schema.AiRequest}
// @Failure 400 {object} util.ResponseResult
// @Failure 401 {object} util.ResponseResult
// @Failure 500 {object} util.ResponseResult
// @Router /api/v1/ai-requests [post]
func (a *AiRequest) Create(c *gin.Context) {
ctx := c.Request.Context()
item := new(schema.AiRequestForm)
if err := util.ParseJSON(c, item); err != nil {
util.ResError(c, err)
return
} else if err := item.Validate(); err != nil {
util.ResError(c, err)
return
}
apiKey := "sk-f96d78738d3143d3859c63a5715490ac"
client := ai.NewBaichuanClient(apiKey)
example, err := singleCallExample(ctx, client, item.Msg)
if err != nil {
util.ResError(c, err)
return
}
util.ResSuccess(c, example)
}
func singleCallExample(ctx context.Context, client *ai.BaichuanClient, msg string) (string, error) {
// 准备消息
messages := []ai.ChatMessage{
{Role: "system", Content: "你是一个专业的科技助手"},
{Role: "user", Content: msg},
}
// 设置参数
params := ai.ChatCompletionParams{
Model: "qwen-plus",
Messages: messages,
MaxToken: 200,
}
// 调用API
ctx2, cancel := context.WithTimeout(ctx, 30*time.Second)
defer cancel()
response, err := client.ChatCompletion(ctx2, params)
if err != nil {
fmt.Printf("调用失败: %v\n", err)
return "", err
}
// 输出结果
fmt.Println("=== 单次调用结果 ===")
fmt.Printf("请求ID: %s\n", response.ID)
fmt.Printf("模型: %s\n", response.Model)
fmt.Printf("回复: %s\n", response.Content)
fmt.Printf("Token使用: 提示 %d, 完成 %d, 总计 %d\n\n",
response.Usage.PromptTokens,
response.Usage.CompletionTokens,
response.Usage.TotalTokens)
return response.Content, nil
}
// @Tags AiRequestAPI
// @Security ApiKeyAuth
// @Summary Update ai request record by ID
// @Param id path string true "unique id"
// @Param body body schema.AiRequestForm true "Request body"
// @Success 200 {object} util.ResponseResult
// @Failure 400 {object} util.ResponseResult
// @Failure 401 {object} util.ResponseResult
// @Failure 500 {object} util.ResponseResult
// @Router /api/v1/ai-requests/{id} [put]
func (a *AiRequest) Update(c *gin.Context) {
ctx := c.Request.Context()
item := new(schema.AiRequestForm)
if err := util.ParseJSON(c, item); err != nil {
util.ResError(c, err)
return
} else if err := item.Validate(); err != nil {
util.ResError(c, err)
return
}
err := a.AiRequestBIZ.Update(ctx, c.Param("id"), item)
if err != nil {
util.ResError(c, err)
return
}
util.ResOK(c)
}
// @Tags AiRequestAPI
// @Security ApiKeyAuth
// @Summary Delete ai request record by ID
// @Param id path string true "unique id"
// @Success 200 {object} util.ResponseResult
// @Failure 401 {object} util.ResponseResult
// @Failure 500 {object} util.ResponseResult
// @Router /api/v1/ai-requests/{id} [delete]
func (a *AiRequest) Delete(c *gin.Context) {
ctx := c.Request.Context()
err := a.AiRequestBIZ.Delete(ctx, c.Param("id"))
if err != nil {
util.ResError(c, err)
return
}
util.ResOK(c)
}