You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

238 lines
6.3 KiB

package openai_test
import (
"context"
"yunyan/sys/juhe"
"yunyan/sys/openai"
tavily "yunyan/sys/websearch/tavilysearch"
"encoding/json"
"fmt"
"testing"
ai "github.com/sashabaranov/go-openai"
)
type Tool_Search_Req struct {
Query string `json:"query"`
}
type search struct{}
func (this *search) GetToolInfo() ai.Tool {
// 定义工具列表
tool := ai.Tool{
Type: "function",
Function: &ai.FunctionDefinition{
Name: "search",
Description: "通过Tavily搜索引擎获取实时网络信息,例如查询股票id,实时新闻等",
Parameters: openai.Parameters{
Type: "object",
Properties: map[string]openai.Property{
"query": {
Type: "string",
Description: "搜索关键词",
},
},
Required: []string{"query"},
},
},
}
return tool
}
func (this *search) Execute(args json.RawMessage) (data any, text string, err error) {
var (
req Tool_Search_Req
result *tavily.TavilyResponse
)
fmt.Println("search", string(args))
if err := json.Unmarshal(args, &req); err != nil {
return nil, "输入参数错误", fmt.Errorf("参数解析失败: %v", err)
}
if result, err = tavily.Search(context.Background(), req.Query, 10, 24); err != nil {
return
}
data = result
text = result.Results[0].Content
return
}
type Tool_Finance_Req struct {
Gid string `json:"gid"`
}
type finance struct{}
func (this *finance) GetToolInfo() ai.Tool {
// 定义工具列表
tool := ai.Tool{
Type: "function",
Function: &ai.FunctionDefinition{
Name: "finance",
Description: "通过股票ID的可以查询当前实时股票的数据",
Parameters: openai.Parameters{
Type: "object",
Properties: map[string]openai.Property{
"gid": {
Type: "string",
Description: "股票ID,需要按照 sh开头的格式,例如:sh601009",
},
},
Required: []string{"gid"},
},
},
}
return tool
}
func (this *finance) Execute(args json.RawMessage) (data any, context string, err error) {
var (
req Tool_Finance_Req
result *juhe.StockResponse
)
fmt.Println("finance", string(args))
if err := json.Unmarshal(args, &req); err != nil {
return nil, "输入参数错误", fmt.Errorf("参数解析失败: %v", err)
}
if result, err = juhe.Financebygid(req.Gid); err != nil {
return
}
data = result
context = fmt.Sprintf("当前%s股票情况:今日开盘价:%s,昨日收盘价:%s,当前价格:%s,今日最高价:%s,今日最低价:%s,成交量:%s,成交金额:%s",
result.FinanceResult[0].Data.Name,
result.FinanceResult[0].Data.TodayStartPri,
result.FinanceResult[0].Data.YestodEndPri,
result.FinanceResult[0].Data.NowPri,
result.FinanceResult[0].Data.TodayMax,
result.FinanceResult[0].Data.TodayMin,
result.FinanceResult[0].Data.TraNumber,
result.FinanceResult[0].Data.TraAmount,
)
return
}
func Test_Sys_Chat(t *testing.T) {
if sys, err := openai.NewSys(
openai.SetBaseURL("https://api.deepseek.com/v1"),
openai.SetToken("sk-3adfd188a3134e718bbf704f525aff17"),
openai.SetModel("deepseek-chat"),
); err != nil {
fmt.Printf("Sys Init err:%v", err)
} else {
var resp *openai.ChatResponse
// 初始化对话
messages := []openai.ChatReq{
{
Role: ai.ChatMessageRoleUser,
Content: "你好呀",
},
}
resp, err = sys.Chat(context.Background(), messages)
fmt.Printf("resp:%+v err:%v", resp, err)
}
}
func Test_Sys_ChatSteam(t *testing.T) {
tavily.OnInit(nil,
tavily.SetApiKey("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"),
)
juhe.OnInit(nil,
juhe.SetFinance_ApiKey("50a101c9c5ff7c967598cea4bcc8ebbd"),
)
if sys, err := openai.NewSys(
openai.SetBaseURL("https://api.deepseek.com/v1"),
openai.SetToken("sk-3adfd188a3134e718bbf704f525aff17"),
openai.SetModel("deepseek-chat"),
openai.SetMaxfunccall(5),
); err != nil {
fmt.Printf("Sys Init err:%v", err)
} else {
// 初始化对话
messages := []openai.ChatReq{
{
Role: ai.ChatMessageRoleUser,
Content: "茅台的今日股价如何?",
},
}
sys.RegisterTools(&search{})
sys.RegisterTools(&finance{})
choiceChan := make(chan *openai.ChatResponseChoice, 1)
go sys.ChatForSteams(context.Background(), messages, choiceChan)
for v := range choiceChan {
fmt.Printf("%+v\n", v)
}
}
}
func Test_Sys_doubao(t *testing.T) {
if sys, err := openai.NewSys(
openai.SetBaseURL("https://ark.cn-beijing.volces.com/api/v3/bots"),
openai.SetToken("418ec475-e2dc-4b76-8aca-842d81bc3466"),
openai.SetModel("bot-20250328144214-rrln6"),
); err != nil {
fmt.Printf("Sys Init err:%v", err)
} else {
var resp *openai.ChatResponse
// 初始化对话
messages := []openai.ChatReq{
{
Role: ai.ChatMessageRoleUser,
Content: "茅台今日股价?",
},
}
resp, err = sys.Chat(context.Background(), messages)
fmt.Printf("resp:%+v err:%v", resp, err)
}
}
func Test_Sys_doubao_steam(t *testing.T) {
tavily.OnInit(nil,
tavily.SetApiKey("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"),
)
if sys, err := openai.NewSys(
openai.SetBaseURL("https://ark.cn-beijing.volces.com/api/v3/bots"),
openai.SetToken("418ec475-e2dc-4b76-8aca-842d81bc3466"),
openai.SetModel("bot-20250328144214-rrln6"),
); err != nil {
fmt.Printf("Sys Init err:%v", err)
} else {
// 初始化对话
messages := []openai.ChatReq{
{
Role: ai.ChatMessageRoleUser,
Content: "茅台的今日股价如何?",
},
}
choiceChan := make(chan *openai.ChatResponseChoice, 1)
go sys.ChatForSteams(context.Background(), messages, choiceChan)
for v := range choiceChan {
fmt.Printf("%+v\n", v)
}
}
}
func Test_Sys_oneapi_steam(t *testing.T) {
// tavily.OnInit(nil,
// tavily.SetApiKey("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"),
// )
juhe.OnInit(nil,
juhe.SetFinance_ApiKey("50a101c9c5ff7c967598cea4bcc8ebbd"),
)
if sys, err := openai.NewSys(
openai.SetBaseURL("http://127.0.0.1:3000/v1"),
openai.SetToken("sk-gMpCSTxYSpMoMHXz25B9Bc6598Bd431b8cCe6996625c8fD1"),
openai.SetModel("gpt-3.5-turbo"),
); err != nil {
fmt.Printf("Sys Init err:%v", err)
} else {
// 初始化对话
messages := []openai.ChatReq{
{
Role: ai.ChatMessageRoleUser,
Content: "股票代码:sh601009,今日行情咋样",
},
}
choiceChan := make(chan *openai.ChatResponseChoice, 1)
// sys.RegisterTools(&search{})
sys.RegisterTools(&finance{})
go sys.ChatForSteams(context.Background(), messages, choiceChan)
for v := range choiceChan {
fmt.Printf("%+v\n", v)
}
}
}