102 lines
1.7 KiB
Go
102 lines
1.7 KiB
Go
package agent
|
|
|
|
import (
|
|
"github.com/mudler/local-agent-framework/llm"
|
|
"github.com/sashabaranov/go-openai"
|
|
)
|
|
|
|
type llmOptions struct {
|
|
APIURL string
|
|
Model string
|
|
}
|
|
|
|
type options struct {
|
|
LLMAPI llmOptions
|
|
Character Character
|
|
}
|
|
|
|
type Agent struct {
|
|
options *options
|
|
Character Character
|
|
client *openai.Client
|
|
}
|
|
|
|
type Option func(*options) error
|
|
|
|
func defaultOptions() *options {
|
|
return &options{
|
|
LLMAPI: llmOptions{
|
|
APIURL: "http://localhost:8080",
|
|
Model: "echidna",
|
|
},
|
|
Character: Character{
|
|
Name: "John Doe",
|
|
Age: 0,
|
|
Occupation: "Unemployed",
|
|
NowDoing: "Nothing",
|
|
DoingNext: "Nothing",
|
|
DoneHistory: []string{},
|
|
Memories: []string{},
|
|
Hobbies: []string{},
|
|
MusicTaste: []string{},
|
|
},
|
|
}
|
|
}
|
|
|
|
func newOptions(opts ...Option) (*options, error) {
|
|
options := defaultOptions()
|
|
for _, o := range opts {
|
|
if err := o(options); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
return options, nil
|
|
}
|
|
|
|
func New(opts ...Option) (*Agent, error) {
|
|
options, err := newOptions(opts...)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
client := llm.NewClient("", options.LLMAPI.APIURL)
|
|
a := &Agent{
|
|
options: options,
|
|
client: client,
|
|
Character: options.Character,
|
|
}
|
|
return a, nil
|
|
}
|
|
|
|
func WithLLMAPIURL(url string) Option {
|
|
return func(o *options) error {
|
|
o.LLMAPI.APIURL = url
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func WithModel(model string) Option {
|
|
return func(o *options) error {
|
|
o.LLMAPI.Model = model
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func WithCharacter(c Character) Option {
|
|
return func(o *options) error {
|
|
o.Character = c
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func FromFile(path string) Option {
|
|
return func(o *options) error {
|
|
c, err := Load(path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
o.Character = *c
|
|
return nil
|
|
}
|
|
}
|