mirror of
https://github.com/ollama/ollama.git
synced 2026-01-19 04:51:17 -05:00
Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f2113c1fc7 | ||
|
|
6452e2ecb8 | ||
|
|
aabd71aede | ||
|
|
f321b13a03 | ||
|
|
5ebcde1541 | ||
|
|
45206cb7cc | ||
|
|
6e65b84f54 | ||
|
|
c00ce12e83 | ||
|
|
e1cd3152c9 | ||
|
|
0bef3778c9 | ||
|
|
6ebab38b89 | ||
|
|
5d8e864d44 | ||
|
|
786288829e | ||
|
|
72dcc952b6 | ||
|
|
779e196ef6 | ||
|
|
c1a5220860 | ||
|
|
3b15175a70 |
@@ -216,6 +216,10 @@ See the [API documentation](./docs/api.md) for all endpoints.
|
||||
|
||||
## Community Integrations
|
||||
|
||||
### Mobile
|
||||
|
||||
- [Mobile Artificial Intelligence Distribution](https://github.com/MaidFoundation/Maid) (Maid)
|
||||
|
||||
### Web & Desktop
|
||||
|
||||
- [HTML UI](https://github.com/rtcfirefly/ollama-ui)
|
||||
@@ -236,6 +240,8 @@ See the [API documentation](./docs/api.md) for all endpoints.
|
||||
- [ollama.nvim](https://github.com/nomnivore/ollama.nvim)
|
||||
- [ogpt.nvim](https://github.com/huynle/ogpt.nvim)
|
||||
- [gptel Emacs client](https://github.com/karthink/gptel)
|
||||
- [ollama package for archlinux](https://archlinux.org/packages/extra/x86_64/ollama/)
|
||||
- [Oatmeal](https://github.com/dustinblackman/oatmeal)
|
||||
|
||||
### Libraries
|
||||
|
||||
|
||||
14
main.go
14
main.go
@@ -2,25 +2,11 @@ package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
|
||||
"github.com/jmorganca/ollama/cmd"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
func main() {
|
||||
sigChan := make(chan os.Signal, 1)
|
||||
signal.Notify(sigChan, syscall.SIGINT)
|
||||
|
||||
go func() {
|
||||
<-sigChan
|
||||
fmt.Print("\033[?25h")
|
||||
|
||||
os.Exit(0)
|
||||
}()
|
||||
|
||||
cobra.CheckErr(cmd.NewCLI().ExecuteContext(context.Background()))
|
||||
}
|
||||
|
||||
@@ -42,6 +42,19 @@ func NewBar(message string, maxValue, initialValue int64) *Bar {
|
||||
}
|
||||
}
|
||||
|
||||
// formatDuration limits the rendering of a time.Duration to 2 units
|
||||
func formatDuration(d time.Duration) string {
|
||||
if d >= 100*time.Hour {
|
||||
return "99h+"
|
||||
}
|
||||
|
||||
if d >= time.Hour {
|
||||
return fmt.Sprintf("%dh%dm", int(d.Hours()), int(d.Minutes())%60)
|
||||
}
|
||||
|
||||
return d.Round(time.Second).String()
|
||||
}
|
||||
|
||||
func (b *Bar) String() string {
|
||||
termWidth, _, err := term.GetSize(int(os.Stderr.Fd()))
|
||||
if err != nil {
|
||||
@@ -65,39 +78,42 @@ func (b *Bar) String() string {
|
||||
}
|
||||
|
||||
fmt.Fprintf(&pre, "%3.0f%% ", math.Floor(b.percent()))
|
||||
|
||||
fmt.Fprintf(&suf, "(%s/%s", format.HumanBytes(b.currentValue), format.HumanBytes(b.maxValue))
|
||||
|
||||
stats := b.Stats()
|
||||
rate := int64(stats.rate)
|
||||
if rate > 0 {
|
||||
fmt.Fprintf(&suf, ", %s/s", format.HumanBytes(rate))
|
||||
rate := stats.rate
|
||||
if stats.value > b.initialValue && stats.value < b.maxValue {
|
||||
fmt.Fprintf(&suf, ", %s/s", format.HumanBytes(int64(rate)))
|
||||
}
|
||||
|
||||
fmt.Fprintf(&suf, ")")
|
||||
|
||||
elapsed := time.Since(b.started)
|
||||
if b.percent() < 100 && rate > 0 {
|
||||
fmt.Fprintf(&suf, " [%s:%s]", elapsed.Round(time.Second), stats.remaining)
|
||||
} else {
|
||||
fmt.Fprintf(&suf, " ")
|
||||
var timing string
|
||||
if stats.value > b.initialValue && stats.value < b.maxValue {
|
||||
timing = fmt.Sprintf("[%s:%s]", formatDuration(time.Since(b.started)), formatDuration(stats.remaining))
|
||||
}
|
||||
|
||||
mid.WriteString("▕")
|
||||
// 44 is the maximum width for the stats on the right of the progress bar
|
||||
pad := 44 - suf.Len() - len(timing)
|
||||
if pad > 0 {
|
||||
suf.WriteString(strings.Repeat(" ", pad))
|
||||
}
|
||||
suf.WriteString(timing)
|
||||
|
||||
// add 3 extra spaces: 2 boundary characters and 1 space at the end
|
||||
f := termWidth - pre.Len() - suf.Len() - 3
|
||||
n := int(float64(f) * b.percent() / 100)
|
||||
|
||||
if n > 0 {
|
||||
if f > 0 {
|
||||
mid.WriteString("▕")
|
||||
mid.WriteString(strings.Repeat("█", n))
|
||||
if f-n > 0 {
|
||||
mid.WriteString(strings.Repeat(" ", f-n))
|
||||
}
|
||||
mid.WriteString("▏")
|
||||
}
|
||||
|
||||
if f-n > 0 {
|
||||
mid.WriteString(strings.Repeat(" ", f-n))
|
||||
}
|
||||
|
||||
mid.WriteString("▏")
|
||||
|
||||
return pre.String() + mid.String() + suf.String()
|
||||
}
|
||||
|
||||
@@ -140,6 +156,8 @@ func (b *Bar) Stats() Stats {
|
||||
var remaining time.Duration
|
||||
if rate > 0 {
|
||||
remaining = time.Second * time.Duration((float64(b.maxValue-b.currentValue))/(float64(rate)))
|
||||
} else {
|
||||
remaining = time.Duration(math.MaxInt64)
|
||||
}
|
||||
|
||||
b.stats = Stats{
|
||||
|
||||
@@ -81,6 +81,9 @@ func (p *Progress) render() error {
|
||||
p.mu.Lock()
|
||||
defer p.mu.Unlock()
|
||||
|
||||
fmt.Fprint(p.w, "\033[?25l")
|
||||
defer fmt.Fprint(p.w, "\033[?25h")
|
||||
|
||||
// clear already rendered progress lines
|
||||
for i := 0; i < p.pos; i++ {
|
||||
if i > 0 {
|
||||
@@ -104,9 +107,6 @@ func (p *Progress) render() error {
|
||||
|
||||
func (p *Progress) start() {
|
||||
p.ticker = time.NewTicker(100 * time.Millisecond)
|
||||
fmt.Fprint(p.w, "\033[?25l")
|
||||
defer fmt.Fprintln(p.w, "\033[?25h")
|
||||
|
||||
for range p.ticker.C {
|
||||
p.render()
|
||||
}
|
||||
|
||||
@@ -10,6 +10,8 @@ type Spinner struct {
|
||||
message string
|
||||
messageWidth int
|
||||
|
||||
parts []string
|
||||
|
||||
value int
|
||||
|
||||
ticker *time.Ticker
|
||||
@@ -20,8 +22,10 @@ type Spinner struct {
|
||||
func NewSpinner(message string) *Spinner {
|
||||
s := &Spinner{
|
||||
message: message,
|
||||
parts: []string{
|
||||
"⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏",
|
||||
},
|
||||
started: time.Now(),
|
||||
value: 231,
|
||||
}
|
||||
go s.start()
|
||||
return s
|
||||
@@ -44,21 +48,18 @@ func (s *Spinner) String() string {
|
||||
}
|
||||
|
||||
if s.stopped.IsZero() {
|
||||
sb.WriteString(fmt.Sprintf("\033[48;5;%dm ", s.value))
|
||||
sb.WriteString("\033[0m")
|
||||
spinner := s.parts[s.value]
|
||||
sb.WriteString(spinner)
|
||||
sb.WriteString(" ")
|
||||
}
|
||||
|
||||
return sb.String()
|
||||
}
|
||||
|
||||
func (s *Spinner) start() {
|
||||
s.ticker = time.NewTicker(40 * time.Millisecond)
|
||||
s.ticker = time.NewTicker(100 * time.Millisecond)
|
||||
for range s.ticker.C {
|
||||
if s.value < 255 {
|
||||
s.value++
|
||||
} else {
|
||||
s.value = 231
|
||||
}
|
||||
s.value = (s.value + 1) % len(s.parts)
|
||||
if !s.stopped.IsZero() {
|
||||
return
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user