add ollama plugin
This commit is contained in:
parent
df35e96331
commit
44a893a47e
101
plugins/llama.go
Normal file
101
plugins/llama.go
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
package plugins
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/matrix-org/gomatrix"
|
||||||
|
"github.com/ollama/ollama/api"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Llama responds to llama messages
|
||||||
|
type Llama struct {
|
||||||
|
client *api.Client
|
||||||
|
db PluginStore
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *Llama) Descr() string {
|
||||||
|
return "Send queries to a local instance of ollama"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *Llama) Re() string {
|
||||||
|
return `(?i)^llama:(.+)$`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *Llama) Match(_, msg string) bool {
|
||||||
|
re := regexp.MustCompile(l.Re())
|
||||||
|
return re.MatchString(msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *Llama) SetStore(s PluginStore) {
|
||||||
|
l.db = s
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *Llama) RespondText(c *gomatrix.Client, ev *gomatrix.Event, _, post string) error {
|
||||||
|
botOwner, err := l.db.Get("bot_owner")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if ev.Sender != botOwner {
|
||||||
|
return errors.New("llama: sorry, you aren't qbit")
|
||||||
|
}
|
||||||
|
|
||||||
|
return SendMD(c, ev.RoomID, l.Process("", post))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *Llama) Process(from, msg string) string {
|
||||||
|
var err error
|
||||||
|
ctx := context.Background()
|
||||||
|
|
||||||
|
re := regexp.MustCompile(l.Re())
|
||||||
|
query := re.ReplaceAllString(msg, "$1")
|
||||||
|
llamaServer, err := l.db.Get("ollama_host")
|
||||||
|
if err != nil {
|
||||||
|
return err.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
if l.client == nil {
|
||||||
|
u, err := url.Parse(llamaServer)
|
||||||
|
if err != nil {
|
||||||
|
return err.Error()
|
||||||
|
}
|
||||||
|
l.client = api.NewClient(u, http.DefaultClient)
|
||||||
|
}
|
||||||
|
|
||||||
|
messages := []api.Message{
|
||||||
|
{
|
||||||
|
Role: "system",
|
||||||
|
Content: "provide very brief, concise, single line responses unless asked otherwise",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Role: "user",
|
||||||
|
Content: query,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
req := &api.ChatRequest{
|
||||||
|
Model: "llama3",
|
||||||
|
Messages: messages,
|
||||||
|
}
|
||||||
|
|
||||||
|
respSet := []string{}
|
||||||
|
err = l.client.Chat(ctx, req, func(resp api.ChatResponse) error {
|
||||||
|
respSet = append(respSet, resp.Message.Content)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return strings.Join(respSet, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *Llama) Name() string {
|
||||||
|
return "Llama"
|
||||||
|
}
|
@ -285,6 +285,7 @@ var Plugs = Plugins{
|
|||||||
&Ban{},
|
&Ban{},
|
||||||
&BananaStab{},
|
&BananaStab{},
|
||||||
&Beat{},
|
&Beat{},
|
||||||
|
&Llama{},
|
||||||
&Beer{},
|
&Beer{},
|
||||||
&BotSnack{},
|
&BotSnack{},
|
||||||
&DMR{},
|
&DMR{},
|
||||||
|
Loading…
Reference in New Issue
Block a user