Compare commits

...

3 Commits

63
main.go
View File

@@ -24,23 +24,32 @@ type OpenAIPrompter struct {
log *slog.Logger log *slog.Logger
} }
func composeSysPromptWithContext(systemPrompt string, req PromptRequest) string {
var b strings.Builder
b.WriteString(systemPrompt)
b.WriteString("\nИмя пользователя: ")
b.WriteString(req.Username)
if req.ReplyToContent != nil {
b.WriteString("\nПользователь отсылается на текст сообщения: ")
b.WriteString(*req.ReplyToContent)
}
return b.String()
}
func (p *OpenAIPrompter) Prompt(ctx context.Context, req PromptRequest) (*HighlyTrustedResponse, error) { func (p *OpenAIPrompter) Prompt(ctx context.Context, req PromptRequest) (*HighlyTrustedResponse, error) {
p.log.Info("new prompt request", p.log.Info("new prompt request",
"req", req) "req", req)
sysPrompt := composeSysPromptWithContext(p.cfg.SystemPrompt, req)
input := []responses.ResponseInputItemUnionParam{ input := []responses.ResponseInputItemUnionParam{
{ {
OfMessage: &responses.EasyInputMessageParam{ OfMessage: &responses.EasyInputMessageParam{
Content: responses.EasyInputMessageContentUnionParam{ Content: responses.EasyInputMessageContentUnionParam{
OfString: openai.String(p.cfg.SystemPrompt), OfString: openai.String(sysPrompt),
},
Role: responses.EasyInputMessageRoleSystem,
},
},
{
OfMessage: &responses.EasyInputMessageParam{
Content: responses.EasyInputMessageContentUnionParam{
OfString: openai.String("Пользователя зовут " + req.Username),
}, },
Role: responses.EasyInputMessageRoleSystem, Role: responses.EasyInputMessageRoleSystem,
}, },
@@ -55,23 +64,7 @@ func (p *OpenAIPrompter) Prompt(ctx context.Context, req PromptRequest) (*Highly
}, },
} }
if req.OriginalPostContent != nil {
message := "Пользователь может ссылаться на текст поста, который он комментирует. Вот он: " +
*req.OriginalPostContent
input = append(input, responses.ResponseInputItemUnionParam{
OfMessage: &responses.EasyInputMessageParam{
Content: responses.EasyInputMessageContentUnionParam{
OfString: openai.String(message),
},
Role: responses.EasyInputMessageRoleDeveloper,
Type: responses.EasyInputMessageTypeMessage,
},
})
}
resp, err := p.cli.Responses.New(ctx, responses.ResponseNewParams{ resp, err := p.cli.Responses.New(ctx, responses.ResponseNewParams{
Instructions: openai.String(p.cfg.SystemPrompt),
Input: responses.ResponseNewParamsInputUnion{ Input: responses.ResponseNewParamsInputUnion{
OfInputItemList: input, OfInputItemList: input,
}, },
@@ -103,9 +96,9 @@ type HighlyTrustedResponse struct {
} }
type PromptRequest struct { type PromptRequest struct {
Username string Username string
Question string Question string
OriginalPostContent *string ReplyToContent *string
} }
type Proompter interface { type Proompter interface {
@@ -146,10 +139,10 @@ func (a *App) handleMessage(ctx context.Context, msg *tgbotapi.Message) error {
"transformed_text", question, "transformed_text", question,
) )
var ogPostContent *string var repliedToContent *string
if msg.ReplyToMessage != nil && msg.ReplyToMessage.SenderChat.ID == a.config.ChannelID { if msg.ReplyToMessage != nil {
a.log.Info("message was a reply to channel post") a.log.Info("message was a reply")
ogPostContent = &msg.ReplyToMessage.Text repliedToContent = &msg.ReplyToMessage.Text
} }
var username string var username string
@@ -158,9 +151,9 @@ func (a *App) handleMessage(ctx context.Context, msg *tgbotapi.Message) error {
} }
response, err := a.proompter.Prompt(ctx, PromptRequest{ response, err := a.proompter.Prompt(ctx, PromptRequest{
Question: question, Question: question,
OriginalPostContent: ogPostContent, ReplyToContent: repliedToContent,
Username: username, Username: username,
}) })
if err != nil { if err != nil {
return fmt.Errorf("prompting: %w", err) return fmt.Errorf("prompting: %w", err)