Commit 84d8c20

mo khan <mo@mokhan.ca>
2025-06-22 02:13:32
feat: use the ollama api directly
1 parent 2caa9cd
Changed files (3)
internal/del/provider.go
@@ -1,33 +1,46 @@
 package del
 
 import (
-    "context"
-    "fmt"
-    "os/exec"
+	"context"
+	"fmt"
+
+	"github.com/ollama/ollama/api"
 )
 
 type AIProvider interface {
-    Generate(ctx context.Context, prompt string) (string, error)
-    Name() string
+	Generate(ctx context.Context, prompt string) (string, error)
+	Name() string
 }
 
 type OllamaProvider struct {
-    model string
+	model  string
+	client *api.Client
 }
 
-func NewOllamaProvider(model string) AIProvider {
-    return &OllamaProvider{model: model}
+func NewOllamaProvider(model string) *OllamaProvider {
+	client, _ := api.ClientFromEnvironment()
+	return &OllamaProvider{
+		model:  model,
+		client: client,
+	}
 }
 
 func (o *OllamaProvider) Generate(ctx context.Context, prompt string) (string, error) {
-    cmd := exec.CommandContext(ctx, "ollama", "run", o.model, prompt)
-    output, err := cmd.CombinedOutput()
-    if err != nil {
-        return "", fmt.Errorf("ollama error: %w\n%s", err, string(output))
-    }
-    return string(output), nil
+	var full string
+	err := o.client.Generate(ctx, &api.GenerateRequest{
+		Model:  o.model,
+		Prompt: prompt,
+	}, api.GenerateResponseFunc(func(resp api.GenerateResponse) error {
+		full += resp.Response
+		return nil
+	}))
+
+	if err != nil {
+		return "", fmt.Errorf("ollama API error: %w", err)
+	}
+	return full, nil
 }
 
 func (o *OllamaProvider) Name() string {
-    return fmt.Sprintf("Ollama (%s)", o.model)
+	return fmt.Sprintf("Ollama (%s)", o.model)
 }
go.mod
@@ -2,9 +2,14 @@ module github.com/xlgmokha/deltron
 
 go 1.24.0
 
-require github.com/spf13/cobra v1.9.1
+require (
+	github.com/ollama/ollama v0.9.2
+	github.com/spf13/cobra v1.9.1
+)
 
 require (
 	github.com/inconshreveable/mousetrap v1.1.0 // indirect
 	github.com/spf13/pflag v1.0.6 // indirect
+	golang.org/x/crypto v0.36.0 // indirect
+	golang.org/x/sys v0.31.0 // indirect
 )
go.sum
@@ -1,10 +1,27 @@
 github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
+github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
 github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
+github.com/ollama/ollama v0.9.2 h1:NEzeLb0gwz1XRyQUCPb30zqDyO/bze+Hiq9NUuYEUy4=
+github.com/ollama/ollama v0.9.2/go.mod h1:+5wt6UPgPmzYhnpLJ/rObxJJyEXURZ/SKKCMQsff8bA=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
 github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
 github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
 github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
+golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
+golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
+golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y=
+golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=