15
15
package master
16
16
17
17
import (
18
- "bytes"
19
18
"context"
20
19
"encoding/binary"
21
20
"encoding/json"
@@ -36,8 +35,6 @@ import (
36
35
"github.com/gorilla/securecookie"
37
36
_ "github.com/gorse-io/dashboard"
38
37
"github.com/juju/errors"
39
- "github.com/nikolalohinski/gonja/v2"
40
- "github.com/nikolalohinski/gonja/v2/exec"
41
38
"github.com/rakyll/statik/fs"
42
39
"github.com/samber/lo"
43
40
"github.com/sashabaranov/go-openai"
@@ -1640,82 +1637,47 @@ func (m *Master) chat(response http.ResponseWriter, request *http.Request) {
1640
1637
writeError (response , http .StatusUnauthorized , "unauthorized" )
1641
1638
return
1642
1639
}
1643
-
1644
- var (
1645
- itemId = request .URL .Query ().Get ("item_id" )
1646
- userId = request .URL .Query ().Get ("user_id" )
1647
- )
1648
-
1649
- // parse prompt template
1650
- b , err := io .ReadAll (request .Body )
1640
+ content , err := io .ReadAll (request .Body )
1651
1641
if err != nil {
1652
1642
writeError (response , http .StatusInternalServerError , err .Error ())
1653
1643
return
1654
1644
}
1655
- prompt , err := gonja .FromString (string (b ))
1645
+ stream , err := m .openAIClient .CreateChatCompletionStream (
1646
+ request .Context (),
1647
+ openai.ChatCompletionRequest {
1648
+ Model : m .Config .OpenAI .ChatCompletionModel ,
1649
+ Messages : []openai.ChatCompletionMessage {
1650
+ {
1651
+ Role : openai .ChatMessageRoleUser ,
1652
+ Content : string (content ),
1653
+ },
1654
+ },
1655
+ Stream : true ,
1656
+ },
1657
+ )
1656
1658
if err != nil {
1657
- writeError (response , http .StatusBadRequest , err .Error ())
1659
+ writeError (response , http .StatusInternalServerError , err .Error ())
1658
1660
return
1659
1661
}
1660
-
1661
- if itemId != "" {
1662
- // get item
1663
- item , err := m . DataClient . GetItem ( request . Context (), itemId )
1664
- if err != nil {
1665
- writeError ( response , http . StatusInternalServerError , err . Error ())
1662
+ // read response
1663
+ defer stream . Close ()
1664
+ for {
1665
+ var resp openai. ChatCompletionStreamResponse
1666
+ resp , err = stream . Recv ()
1667
+ if errors . Is ( err , io . EOF ) {
1666
1668
return
1667
1669
}
1668
- // render prompt
1669
- var buf bytes.Buffer
1670
- err = prompt .Execute (& buf , exec .NewContext (map [string ]any {
1671
- "item" : item ,
1672
- }))
1673
1670
if err != nil {
1674
1671
writeError (response , http .StatusInternalServerError , err .Error ())
1675
1672
return
1676
1673
}
1677
- // create chat completion stream
1678
- stream , err := m .openAIClient .CreateChatCompletionStream (
1679
- request .Context (),
1680
- openai.ChatCompletionRequest {
1681
- Model : m .Config .OpenAI .ChatCompletionModel ,
1682
- Messages : []openai.ChatCompletionMessage {
1683
- {
1684
- Role : openai .ChatMessageRoleUser ,
1685
- Content : buf .String (),
1686
- },
1687
- },
1688
- Stream : true ,
1689
- },
1690
- )
1691
- if err != nil {
1692
- writeError (response , http .StatusInternalServerError , err .Error ())
1674
+ if _ , err = response .Write ([]byte (resp .Choices [0 ].Delta .Content )); err != nil {
1675
+ log .Logger ().Error ("failed to write response" , zap .Error (err ))
1693
1676
return
1694
1677
}
1695
- // read response
1696
- defer stream .Close ()
1697
- for {
1698
- var resp openai.ChatCompletionStreamResponse
1699
- resp , err = stream .Recv ()
1700
- if errors .Is (err , io .EOF ) {
1701
- return
1702
- }
1703
- if err != nil {
1704
- writeError (response , http .StatusInternalServerError , err .Error ())
1705
- return
1706
- }
1707
- if _ , err = response .Write ([]byte (resp .Choices [0 ].Delta .Content )); err != nil {
1708
- log .Logger ().Error ("failed to write response" , zap .Error (err ))
1709
- return
1710
- }
1711
- // flush response
1712
- if f , ok := response .(http.Flusher ); ok {
1713
- f .Flush ()
1714
- }
1678
+ // flush response
1679
+ if f , ok := response .(http.Flusher ); ok {
1680
+ f .Flush ()
1715
1681
}
1716
- } else if userId != "" {
1717
- writeError (response , http .StatusNotImplemented , "chat with user is not implemented" )
1718
- } else {
1719
- writeError (response , http .StatusBadRequest , "missing item_id or user_id" )
1720
1682
}
1721
1683
}
0 commit comments