|
@@ -3,55 +3,23 @@ package compapi
|
|
|
import (
|
|
|
"time"
|
|
|
"wechat-api/internal/types"
|
|
|
-
|
|
|
- "github.com/openai/openai-go"
|
|
|
)
|
|
|
|
|
|
type FormClient struct {
|
|
|
- StdClient
|
|
|
-}
|
|
|
-
|
|
|
-// Generate the JSON schema at initialization time
|
|
|
-var FormResponseSchema = GenerateSchema[FormList]()
|
|
|
-
|
|
|
-type FormResponse struct {
|
|
|
- DataIndex string `json:"dataIndex" jsonschema_description:"表单 id"`
|
|
|
- Value []string `json:"value" jsonschema_description:" 值列表"`
|
|
|
-}
|
|
|
-
|
|
|
-type FormList struct {
|
|
|
- Values []FormResponse `json:"values" jsonschema_description:"表单列表"`
|
|
|
+ MismatchClient
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
-
|
|
|
-"response_format":{"type":"json_object"}}
|
|
|
-
|
|
|
-{"type":"json_schema",
|
|
|
- "json_schema":{
|
|
|
- "description":"从通话记录中提取表单","name":"keyword_schema","schema":{
|
|
|
- "$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{
|
|
|
- "keywords":{
|
|
|
- "description":"关键词库","items":{"type":"string"},"type":"array"},"regular":{"description":"正则表达式","items":{"type":"string"},"type":"array"},"similar_reply":{"description":"类似回复","items":{"type":"string"},"type":"array"},"swear_words":{"description":"脏话列表","items":{"type":"string"},"type":"array"},"user_intent":{"description":"用户意图","type":"string"},"user_mood":{"description":"用户情绪","type":"string"}},"required":["user_intent","similar_reply","keywords","regular","user_mood","swear_words"],"type":"object"},"strict":true}}
|
|
|
-*/
|
|
|
-
|
|
|
-func (me *FormClient) BuildRequest(req *types.CompApiReq) error {
|
|
|
+func (me *FormClient) ResponseFormatSetting(req *types.CompApiReq) ResponseFormatConfig {
|
|
|
nowTime := time.Now().Format("2006-01-02 15:04:05")
|
|
|
weekday := time.Now().Weekday().String()
|
|
|
- //bytes, err := json.Marshal(req.Variables["form_data"])
|
|
|
- //if err != nil {
|
|
|
- // return err
|
|
|
- //}
|
|
|
- //form_data := string(bytes)
|
|
|
-
|
|
|
- //先重构message
|
|
|
- newMessSlice := make([]types.StdCompMessage, 2)
|
|
|
- newMessSlice[0] = types.StdCompMessage{Role: "system", Content: `# 任务
|
|
|
+ //Message重构的配置
|
|
|
+ me.ResformatConfig.SysmesArgs = []any{nowTime, weekday}
|
|
|
+ me.ResformatConfig.SysmesTmpl = `# 任务
|
|
|
请帮助user从聊天记录中提取表单值,并返回一个JSON格式的表单值。
|
|
|
|
|
|
# 背景信息
|
|
|
-当前时间是:` + nowTime + `
|
|
|
-当前星期是:` + weekday + `
|
|
|
+当前时间是:%s
|
|
|
+当前星期是:%s
|
|
|
|
|
|
# 返回值示例
|
|
|
* 如表单类型为 input、autoComplete、textarea,返回示例:["表单值"]
|
|
@@ -59,34 +27,51 @@ func (me *FormClient) BuildRequest(req *types.CompApiReq) error {
|
|
|
* 如表单类型为 checkbox,返回示例:["值1", "值2"]
|
|
|
* 如表单类型为 cascader,返回示例:["一级值1", "二级值3"]
|
|
|
* 如表单类型为 date,返回示例:["2025-01-01"]
|
|
|
-* 如没有找到某个表单相关的值,请不要返回该表单`}
|
|
|
+* 如没有找到某个表单相关的值,请不要返回该表单`
|
|
|
|
|
|
- newMessSlice[1] = types.StdCompMessage{Role: "user", Content: `# 待提取表单
|
|
|
-` + req.Variables["form_data"] + `
|
|
|
+ me.ResformatConfig.UsermesArgs = []any{req.Variables["form_data"], req.Variables["chat_history"]}
|
|
|
+ me.ResformatConfig.UsermesTmpl = `# 待提取表单
|
|
|
+%s
|
|
|
|
|
|
# 聊天记录
|
|
|
-` + req.Variables["chat_history"]}
|
|
|
+%s`
|
|
|
|
|
|
- //再构造ResponseFormat
|
|
|
- if !IsOpenaiModel(req.Model) {
|
|
|
- newMessSlice[1].Content = newMessSlice[1].Content.(string) + `
|
|
|
-# 请以下方的json结构输出
|
|
|
-[{
|
|
|
+ //ResponseFormat设置的配置
|
|
|
+ me.ResformatConfig.ResformatDesc = "从通话记录中提取表单"
|
|
|
+ me.ResformatConfig.ResformatTxt = `[{
|
|
|
"dataIndex": str, # 表单ID
|
|
|
"value": list[str] # 表单值列表
|
|
|
}]`
|
|
|
- req.ResponseFormat = openai.ResponseFormatJSONObjectParam{Type: "json_object"}
|
|
|
- } else {
|
|
|
- schemaParam := openai.ResponseFormatJSONSchemaJSONSchemaParam{
|
|
|
- Name: "keyword_schema",
|
|
|
- Description: openai.String("从通话记录中提取表单"),
|
|
|
- Schema: FormResponseSchema,
|
|
|
- Strict: openai.Bool(true),
|
|
|
- }
|
|
|
- req.ResponseFormat = openai.ResponseFormatJSONSchemaParam{JSONSchema: schemaParam}
|
|
|
+
|
|
|
+ type formStruct struct {
|
|
|
+ DataIndex string `json:"dataIndex" jsonschema_description:"表单ID"`
|
|
|
+ Value []string `json:"value" jsonschema_description:"值列表"`
|
|
|
}
|
|
|
- //req.Model = oldModel
|
|
|
- req.Messages = newMessSlice
|
|
|
+ me.ResformatConfig.ResformatStruct = struct {
|
|
|
+ Values []formStruct `json:"values" jsonschema_description:"表单列表"`
|
|
|
+ }{}
|
|
|
+ me.ResformatConfig.HaveSet = true
|
|
|
+
|
|
|
+ return me.ResformatConfig
|
|
|
+}
|
|
|
|
|
|
- return nil
|
|
|
+func (me *FormClient) BuildRequest(req *types.CompApiReq) error {
|
|
|
+
|
|
|
+ //设置相关个性化ResponseFormat配置信息
|
|
|
+ if !me.ResformatConfig.HaveSet {
|
|
|
+ me.ResponseFormatSetting(req)
|
|
|
+ }
|
|
|
+
|
|
|
+ return me.MismatchClient.BuildRequest(req)
|
|
|
+}
|
|
|
+
|
|
|
+// 向Client.getClientActFace工厂方法注册
|
|
|
+func init() {
|
|
|
+ builder := func(c *Client) (clientActionFace, error) {
|
|
|
+ return &FormClient{MismatchClient{StdClient: StdClient{Client: c}}}, nil
|
|
|
+ }
|
|
|
+ err := RegisterClient("form", builder)
|
|
|
+ if err != nil {
|
|
|
+ //panic(fmt.Sprintf("Failed to register client type 'mismatch': %v", err))
|
|
|
+ }
|
|
|
}
|