-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
152 lines (127 loc) · 4.62 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
package main
import (
"context"
"log"
"os"
"github.com/gin-gonic/gin"
sdkginext "github.com/larksuite/oapi-sdk-gin"
lark "github.com/larksuite/oapi-sdk-go/v3"
larkcard "github.com/larksuite/oapi-sdk-go/v3/card"
larkcore "github.com/larksuite/oapi-sdk-go/v3/core"
"github.com/larksuite/oapi-sdk-go/v3/event/dispatcher"
larkcontact "github.com/larksuite/oapi-sdk-go/v3/service/contact/v3"
larkim "github.com/larksuite/oapi-sdk-go/v3/service/im/v1"
openai "github.com/sashabaranov/go-openai"
)
type Config struct {
AppID string
AppSecret string
EncryptKey string
VerificationToken string
BotName string
GinMode string
Port string
HttpPort string
OpenAIKey string
}
var client *lark.Client
func main() {
// read the configuration options from environment variables
config := &Config{
AppID: os.Getenv("APP_ID"),
AppSecret: os.Getenv("APP_SECRET"),
EncryptKey: os.Getenv("ENCRYPT_KEY"),
VerificationToken: os.Getenv("VERIFICATION_TOKEN"),
BotName: os.Getenv("BOT_NAME"),
GinMode: os.Getenv("GIN_MODE"),
Port: os.Getenv("PORT"),
HttpPort: os.Getenv("HTTP_PORT"),
OpenAIKey: os.Getenv("OPENAI_API_KEY"),
}
// initialize the OpenAI API client
openaiClient := openai.NewClient(config.OpenAIKey)
// create a new Lark IM client
client = lark.NewClient(config.AppID, config.AppSecret)
// create an event dispatcher
eventDispatcher := dispatcher.NewEventDispatcher(config.VerificationToken, config.EncryptKey).
OnP2MessageReceiveV1(func(ctx context.Context, event *larkim.P2MessageReceiveV1) error {
log.Printf("Received P2 message receive event: %v", larkcore.Prettify(event))
// generate a completion using the OpenAI API
completion, err := generateResponse(ctx, *event.Event.Message.Content, openaiClient)
if err != nil {
log.Printf("Error generating response: %v", err)
return nil
}
log.Printf("Received Openai completion: %v", larkcore.Prettify(completion))
// Prepare response message
respMsg := larkim.NewTextMsgBuilder().Text(completion).Build()
chatId := event.Event.Message.ChatId
// send respMsg back to chat
resp, err := client.Im.Message.Create(context.Background(), larkim.NewCreateMessageReqBuilder().
ReceiveIdType(larkim.ReceiveIdTypeChatId).
Body(larkim.NewCreateMessageReqBodyBuilder().
MsgType(larkim.MsgTypeText).
ReceiveId(*chatId).
Content(respMsg).
Build()).
Build())
if err != nil {
log.Printf("Error Send Completion to Lark: %v", err)
return nil
}
if !resp.Success() {
log.Printf("Error sending message: %v", resp.Code)
log.Printf("Error message: %s", resp.Msg)
return nil
}
return nil
}).
OnP2MessageReadV1(func(ctx context.Context, event *larkim.P2MessageReadV1) error {
log.Printf("Received P2 message read event: %v", larkcore.Prettify(event))
return nil
}).
OnP2UserCreatedV3(func(ctx context.Context, event *larkcontact.P2UserCreatedV3) error {
log.Printf("Received P2 user created event: %v", larkcore.Prettify(event))
return nil
})
// create a card action handler
cardActionHandler := larkcard.NewCardActionHandler(config.VerificationToken, config.EncryptKey, func(ctx context.Context, cardAction *larkcard.CardAction) (interface{}, error) {
log.Printf("Received card action: %v", larkcore.Prettify(cardAction))
// TODO: handle the card action and return a response
return nil, nil
})
// set up the Gin router
router := gin.Default()
// register the event and card action handlers
router.POST("/webhook/event", sdkginext.NewEventHandlerFunc(eventDispatcher))
router.POST("/webhook/card", sdkginext.NewCardActionHandlerFunc(cardActionHandler))
defer func() {
if err := recover(); err != nil {
log.Fatalf("Error starting server: %v", err)
}
}()
err := router.Run(":" + config.Port)
if err != nil {
log.Fatalf("Error starting server: %v", err)
}
}
// generateResponse uses the OpenAI API to generate a response to the user's message.
func generateResponse(ctx context.Context, message string, client *openai.Client) (string, error) {
// set up the prompt and parameters
completionRequest := &openai.ChatCompletionRequest{
Model: openai.GPT3Dot5Turbo0301,
Messages: []openai.ChatCompletionMessage{
{
Role: openai.ChatMessageRoleUser,
Content: message,
},
},
}
// generate the completion using the OpenAI API
response, err := client.CreateChatCompletion(ctx, *completionRequest)
if err != nil {
return "", err
}
// return the generated text
return response.Choices[0].Message.Content, nil
}