mirror of
https://github.com/likelovewant/ollama-for-amd.git
synced 2025-12-22 06:43:57 +00:00
Merge branch 'ollama:main' into main
This commit is contained in:
10
.github/workflows/release.yaml
vendored
10
.github/workflows/release.yaml
vendored
@@ -31,7 +31,7 @@ jobs:
|
|||||||
security set-keychain-settings -lut 3600 build.keychain
|
security set-keychain-settings -lut 3600 build.keychain
|
||||||
- uses: actions/setup-go@v5
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "stable"
|
go-version-file: go.mod
|
||||||
cache: true
|
cache: true
|
||||||
- name: Build Darwin
|
- name: Build Darwin
|
||||||
env:
|
env:
|
||||||
@@ -87,7 +87,7 @@ jobs:
|
|||||||
write-host "plugin installed"
|
write-host "plugin installed"
|
||||||
- uses: actions/setup-go@v5
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "stable"
|
go-version-file: go.mod
|
||||||
cache: true
|
cache: true
|
||||||
- run: go get ./...
|
- run: go get ./...
|
||||||
- run: |
|
- run: |
|
||||||
@@ -141,7 +141,7 @@ jobs:
|
|||||||
write-host "plugin installed"
|
write-host "plugin installed"
|
||||||
- uses: actions/setup-go@v5
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "stable"
|
go-version-file: go.mod
|
||||||
cache: true
|
cache: true
|
||||||
- name: 'Install ROCm'
|
- name: 'Install ROCm'
|
||||||
run: |
|
run: |
|
||||||
@@ -218,7 +218,7 @@ jobs:
|
|||||||
write-host "plugin installed"
|
write-host "plugin installed"
|
||||||
- uses: actions/setup-go@v5
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "stable"
|
go-version-file: go.mod
|
||||||
cache: true
|
cache: true
|
||||||
- name: 'Install CUDA'
|
- name: 'Install CUDA'
|
||||||
run: |
|
run: |
|
||||||
@@ -306,7 +306,7 @@ jobs:
|
|||||||
write-host "plugin installed"
|
write-host "plugin installed"
|
||||||
- uses: actions/setup-go@v5
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "stable"
|
go-version-file: go.mod
|
||||||
cache: true
|
cache: true
|
||||||
- run: go get
|
- run: go get
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v4
|
||||||
|
|||||||
10
.github/workflows/test.yaml
vendored
10
.github/workflows/test.yaml
vendored
@@ -63,7 +63,7 @@ jobs:
|
|||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-go@v5
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "stable"
|
go-version-file: go.mod
|
||||||
cache: true
|
cache: true
|
||||||
- run: go get ./...
|
- run: go get ./...
|
||||||
- run: |
|
- run: |
|
||||||
@@ -163,7 +163,7 @@ jobs:
|
|||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-go@v5
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "stable"
|
go-version-file: go.mod
|
||||||
cache: true
|
cache: true
|
||||||
- name: 'Install ROCm'
|
- name: 'Install ROCm'
|
||||||
run: |
|
run: |
|
||||||
@@ -200,7 +200,7 @@ jobs:
|
|||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-go@v5
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "stable"
|
go-version-file: go.mod
|
||||||
cache: true
|
cache: true
|
||||||
- name: 'Install CUDA'
|
- name: 'Install CUDA'
|
||||||
run: |
|
run: |
|
||||||
@@ -255,7 +255,7 @@ jobs:
|
|||||||
submodules: recursive
|
submodules: recursive
|
||||||
- uses: actions/setup-go@v5
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "stable"
|
go-version-file: go.mod
|
||||||
cache: false
|
cache: false
|
||||||
- run: |
|
- run: |
|
||||||
case ${{ matrix.arch }} in
|
case ${{ matrix.arch }} in
|
||||||
@@ -297,7 +297,7 @@ jobs:
|
|||||||
submodules: recursive
|
submodules: recursive
|
||||||
- uses: actions/setup-go@v5
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "stable"
|
go-version-file: go.mod
|
||||||
cache: true
|
cache: true
|
||||||
- run: |
|
- run: |
|
||||||
case ${{ matrix.arch }} in
|
case ${{ matrix.arch }} in
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ linters:
|
|||||||
- nosprintfhostport
|
- nosprintfhostport
|
||||||
- staticcheck
|
- staticcheck
|
||||||
- tenv
|
- tenv
|
||||||
- testifylint
|
|
||||||
- unconvert
|
- unconvert
|
||||||
- unused
|
- unused
|
||||||
- usestdlibvars
|
- usestdlibvars
|
||||||
|
|||||||
37
CONTRIBUTING.md
Normal file
37
CONTRIBUTING.md
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# Contributing to Ollama
|
||||||
|
|
||||||
|
Thank you for your interest in contributing to Ollama! Here are a few guidelines to help get you started.
|
||||||
|
|
||||||
|
## Set up
|
||||||
|
|
||||||
|
See the [development documentation](./docs/development.md) for instructions on how to build and run Ollama locally.
|
||||||
|
|
||||||
|
## Pull requests
|
||||||
|
|
||||||
|
### Ideal issues
|
||||||
|
|
||||||
|
* [Bugs](https://github.com/ollama/ollama/issues?q=is%3Aissue+is%3Aopen+label%3Abug): issues where Ollama stops working or where it results in an unexpected error.
|
||||||
|
* [Performance](https://github.com/ollama/ollama/issues?q=is%3Aissue+is%3Aopen+label%3Aperformance): issues to make Ollama faster at model inference, downloading or uploading.
|
||||||
|
* [Security](https://github.com/ollama/ollama/blob/main/SECURITY.md): issues that could lead to a security vulnerability. As mentioned in [SECURITY.md](https://github.com/ollama/ollama/blob/main/SECURITY.md), please do not disclose security vulnerabilities publicly.
|
||||||
|
|
||||||
|
### Issues that are harder to review
|
||||||
|
|
||||||
|
* New features: new features (e.g. API fields, environment variables) add surface area to Ollama and make it harder to maintain in the long run as they cannot be removed without potentially breaking users in the future.
|
||||||
|
* Refactoring: large code improvements are important, but can be harder or take longer to review and merge.
|
||||||
|
* Documentation: small updates to fill in or dorrect missing documentation is helpful, however large documentation additions can be hard to maintain over time.
|
||||||
|
|
||||||
|
### Issues that may not be accepted
|
||||||
|
|
||||||
|
* Changes that break backwards compatibility in Ollama's API (including the OpenAI-compatible API)
|
||||||
|
* Changes that add significant friction to the user experience
|
||||||
|
* Changes that create a large future maintenance burden for maintainers and contributors
|
||||||
|
|
||||||
|
### Best practices
|
||||||
|
|
||||||
|
* Commit messages: please leave both a title and a description in your commit messages. The title should be a short summary of the changes, with a leading word that explains the section of the code being changed (e.g. `api: fix parsing of prompt field`) . In the description, leave a short 2-3 sentences that explain more about the change and its impact.
|
||||||
|
* Tests: please add test coverage to changes where possible.
|
||||||
|
* Minimize dependencies: avoid adding new dependencies unless absolutely necessary.
|
||||||
|
|
||||||
|
## Need help?
|
||||||
|
|
||||||
|
If you need help with anything, feel free to reach out to us on our [Discord server](https://discord.gg/ollama).
|
||||||
@@ -298,7 +298,7 @@ func (c *Client) List(ctx context.Context) (*ListResponse, error) {
|
|||||||
return &lr, nil
|
return &lr, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// List running models.
|
// ListRunning lists running models.
|
||||||
func (c *Client) ListRunning(ctx context.Context) (*ProcessResponse, error) {
|
func (c *Client) ListRunning(ctx context.Context) (*ProcessResponse, error) {
|
||||||
var lr ProcessResponse
|
var lr ProcessResponse
|
||||||
if err := c.do(ctx, http.MethodGet, "/api/ps", nil, &lr); err != nil {
|
if err := c.do(ctx, http.MethodGet, "/api/ps", nil, &lr); err != nil {
|
||||||
@@ -333,7 +333,7 @@ func (c *Client) Show(ctx context.Context, req *ShowRequest) (*ShowResponse, err
|
|||||||
return &resp, nil
|
return &resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hearbeat checks if the server has started and is responsive; if yes, it
|
// Heartbeat checks if the server has started and is responsive; if yes, it
|
||||||
// returns nil, otherwise an error.
|
// returns nil, otherwise an error.
|
||||||
func (c *Client) Heartbeat(ctx context.Context) error {
|
func (c *Client) Heartbeat(ctx context.Context) error {
|
||||||
if err := c.do(ctx, http.MethodHead, "/", nil, nil); err != nil {
|
if err := c.do(ctx, http.MethodHead, "/", nil, nil); err != nil {
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
updatAvailableMenuID = 1
|
updateAvailableMenuID = 1
|
||||||
updateMenuID = updatAvailableMenuID + 1
|
updateMenuID = updateAvailableMenuID + 1
|
||||||
separatorMenuID = updateMenuID + 1
|
separatorMenuID = updateMenuID + 1
|
||||||
diagLogsMenuID = separatorMenuID + 1
|
diagLogsMenuID = separatorMenuID + 1
|
||||||
diagSeparatorMenuID = diagLogsMenuID + 1
|
diagSeparatorMenuID = diagLogsMenuID + 1
|
||||||
@@ -35,7 +35,7 @@ func (t *winTray) initMenus() error {
|
|||||||
func (t *winTray) UpdateAvailable(ver string) error {
|
func (t *winTray) UpdateAvailable(ver string) error {
|
||||||
if !t.updateNotified {
|
if !t.updateNotified {
|
||||||
slog.Debug("updating menu and sending notification for new update")
|
slog.Debug("updating menu and sending notification for new update")
|
||||||
if err := t.addOrUpdateMenuItem(updatAvailableMenuID, 0, updateAvailableMenuTitle, true); err != nil {
|
if err := t.addOrUpdateMenuItem(updateAvailableMenuID, 0, updateAvailableMenuTitle, true); err != nil {
|
||||||
return fmt.Errorf("unable to create menu entries %w", err)
|
return fmt.Errorf("unable to create menu entries %w", err)
|
||||||
}
|
}
|
||||||
if err := t.addOrUpdateMenuItem(updateMenuID, 0, updateMenutTitle, false); err != nil {
|
if err := t.addOrUpdateMenuItem(updateMenuID, 0, updateMenutTitle, false); err != nil {
|
||||||
|
|||||||
@@ -1125,7 +1125,7 @@ func generate(cmd *cobra.Command, opts runOptions) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func RunServer(cmd *cobra.Command, _ []string) error {
|
func RunServer(_ *cobra.Command, _ []string) error {
|
||||||
if err := initializeKeypair(); err != nil {
|
if err := initializeKeypair(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -182,7 +182,6 @@ curl http://localhost:11434/v1/embeddings \
|
|||||||
- [x] Reproducible outputs
|
- [x] Reproducible outputs
|
||||||
- [x] Vision
|
- [x] Vision
|
||||||
- [x] Tools (streaming support coming soon)
|
- [x] Tools (streaming support coming soon)
|
||||||
- [ ] Vision
|
|
||||||
- [ ] Logprobs
|
- [ ] Logprobs
|
||||||
|
|
||||||
#### Supported request fields
|
#### Supported request fields
|
||||||
|
|||||||
@@ -112,15 +112,9 @@ Keep the following tips and best practices in mind when working with Go template
|
|||||||
ChatML is a popular template format. It can be used for models such as Databrick's DBRX, Intel's Neural Chat, and Microsoft's Orca 2.
|
ChatML is a popular template format. It can be used for models such as Databrick's DBRX, Intel's Neural Chat, and Microsoft's Orca 2.
|
||||||
|
|
||||||
```gotmpl
|
```gotmpl
|
||||||
{{- if .System }}<|im_start|>system
|
|
||||||
{{ .System }}<|im_end|>
|
|
||||||
{{ end }}
|
|
||||||
{{- range .Messages }}<|im_start|>{{ .Role }}
|
{{- range .Messages }}<|im_start|>{{ .Role }}
|
||||||
{{ .Content }}<|im_end|>
|
{{ .Content }}<|im_end|>
|
||||||
{{ end }}<|im_start|>assistant
|
{{ end }}<|im_start|>assistant
|
||||||
{{ else }}
|
|
||||||
{{ if .System }}<|im_start|>system
|
|
||||||
{{ .System }}<|im_end|>
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Example Tools
|
### Example Tools
|
||||||
|
|||||||
2
go.mod
2
go.mod
@@ -1,6 +1,6 @@
|
|||||||
module github.com/ollama/ollama
|
module github.com/ollama/ollama
|
||||||
|
|
||||||
go 1.22.0
|
go 1.22.5
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/containerd/console v1.0.3
|
github.com/containerd/console v1.0.3
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ func (b *Buffer) MoveLeft() {
|
|||||||
rLength := runewidth.RuneWidth(r)
|
rLength := runewidth.RuneWidth(r)
|
||||||
|
|
||||||
if b.DisplayPos%b.LineWidth == 0 {
|
if b.DisplayPos%b.LineWidth == 0 {
|
||||||
fmt.Printf(CursorUp + CursorBOL + cursorRightN(b.Width))
|
fmt.Print(CursorUp + CursorBOL + CursorRightN(b.Width))
|
||||||
if rLength == 2 {
|
if rLength == 2 {
|
||||||
fmt.Print(CursorLeft)
|
fmt.Print(CursorLeft)
|
||||||
}
|
}
|
||||||
@@ -74,7 +74,7 @@ func (b *Buffer) MoveLeft() {
|
|||||||
fmt.Print(CursorLeft)
|
fmt.Print(CursorLeft)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
fmt.Print(cursorLeftN(rLength))
|
fmt.Print(CursorLeftN(rLength))
|
||||||
}
|
}
|
||||||
|
|
||||||
b.Pos -= 1
|
b.Pos -= 1
|
||||||
@@ -115,15 +115,15 @@ func (b *Buffer) MoveRight() {
|
|||||||
b.DisplayPos += rLength
|
b.DisplayPos += rLength
|
||||||
|
|
||||||
if b.DisplayPos%b.LineWidth == 0 {
|
if b.DisplayPos%b.LineWidth == 0 {
|
||||||
fmt.Printf(CursorDown + CursorBOL + cursorRightN(len(b.Prompt.prompt())))
|
fmt.Print(CursorDown + CursorBOL + CursorRightN(len(b.Prompt.prompt())))
|
||||||
} else if (b.DisplayPos-rLength)%b.LineWidth == b.LineWidth-1 && hasSpace {
|
} else if (b.DisplayPos-rLength)%b.LineWidth == b.LineWidth-1 && hasSpace {
|
||||||
fmt.Printf(CursorDown + CursorBOL + cursorRightN(len(b.Prompt.prompt())+rLength))
|
fmt.Print(CursorDown + CursorBOL + CursorRightN(len(b.Prompt.prompt())+rLength))
|
||||||
b.DisplayPos += 1
|
b.DisplayPos += 1
|
||||||
} else if b.LineHasSpace.Size() > 0 && b.DisplayPos%b.LineWidth == b.LineWidth-1 && hasSpace {
|
} else if b.LineHasSpace.Size() > 0 && b.DisplayPos%b.LineWidth == b.LineWidth-1 && hasSpace {
|
||||||
fmt.Printf(CursorDown + CursorBOL + cursorRightN(len(b.Prompt.prompt())))
|
fmt.Print(CursorDown + CursorBOL + CursorRightN(len(b.Prompt.prompt())))
|
||||||
b.DisplayPos += 1
|
b.DisplayPos += 1
|
||||||
} else {
|
} else {
|
||||||
fmt.Print(cursorRightN(rLength))
|
fmt.Print(CursorRightN(rLength))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -154,7 +154,7 @@ func (b *Buffer) MoveToStart() {
|
|||||||
fmt.Print(CursorUp)
|
fmt.Print(CursorUp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fmt.Printf(CursorBOL + cursorRightN(len(b.Prompt.prompt())))
|
fmt.Print(CursorBOL + CursorRightN(len(b.Prompt.prompt())))
|
||||||
b.Pos = 0
|
b.Pos = 0
|
||||||
b.DisplayPos = 0
|
b.DisplayPos = 0
|
||||||
}
|
}
|
||||||
@@ -169,9 +169,9 @@ func (b *Buffer) MoveToEnd() {
|
|||||||
fmt.Print(CursorDown)
|
fmt.Print(CursorDown)
|
||||||
}
|
}
|
||||||
remainder := b.DisplaySize() % b.LineWidth
|
remainder := b.DisplaySize() % b.LineWidth
|
||||||
fmt.Printf(CursorBOL + cursorRightN(len(b.Prompt.prompt())+remainder))
|
fmt.Print(CursorBOL + CursorRightN(len(b.Prompt.prompt())+remainder))
|
||||||
} else {
|
} else {
|
||||||
fmt.Print(cursorRightN(b.DisplaySize() - b.DisplayPos))
|
fmt.Print(CursorRightN(b.DisplaySize() - b.DisplayPos))
|
||||||
}
|
}
|
||||||
|
|
||||||
b.Pos = b.Buf.Size()
|
b.Pos = b.Buf.Size()
|
||||||
@@ -286,8 +286,7 @@ func (b *Buffer) drawRemaining() {
|
|||||||
remLength := runewidth.StringWidth(remainingText)
|
remLength := runewidth.StringWidth(remainingText)
|
||||||
|
|
||||||
if len(currLine) > 0 {
|
if len(currLine) > 0 {
|
||||||
fmt.Printf(ClearToEOL + currLine)
|
fmt.Print(ClearToEOL + currLine + CursorLeftN(currLineSpace))
|
||||||
fmt.Print(cursorLeftN(currLineSpace))
|
|
||||||
} else {
|
} else {
|
||||||
fmt.Print(ClearToEOL)
|
fmt.Print(ClearToEOL)
|
||||||
}
|
}
|
||||||
@@ -301,9 +300,9 @@ func (b *Buffer) drawRemaining() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (b.DisplayPos+currLineSpace)%b.LineWidth == 0 && currLine == remainingText {
|
if (b.DisplayPos+currLineSpace)%b.LineWidth == 0 && currLine == remainingText {
|
||||||
fmt.Print(cursorRightN(currLineSpace))
|
fmt.Print(CursorRightN(currLineSpace))
|
||||||
fmt.Printf("\n%s", b.Prompt.AltPrompt)
|
fmt.Printf("\n%s", b.Prompt.AltPrompt)
|
||||||
fmt.Printf(CursorUp + CursorBOL + cursorRightN(b.Width-currLineSpace))
|
fmt.Print(CursorUp + CursorBOL + CursorRightN(b.Width-currLineSpace))
|
||||||
}
|
}
|
||||||
|
|
||||||
// render the other lines
|
// render the other lines
|
||||||
@@ -333,9 +332,7 @@ func (b *Buffer) drawRemaining() {
|
|||||||
lineLength += runewidth.RuneWidth(c)
|
lineLength += runewidth.RuneWidth(c)
|
||||||
fmt.Printf("%c", c)
|
fmt.Printf("%c", c)
|
||||||
}
|
}
|
||||||
fmt.Print(ClearToEOL)
|
fmt.Print(ClearToEOL + CursorUpN(totalLines) + CursorBOL + CursorRightN(b.Width-currLineSpace))
|
||||||
fmt.Print(cursorUpN(totalLines))
|
|
||||||
fmt.Printf(CursorBOL + cursorRightN(b.Width-currLineSpace))
|
|
||||||
|
|
||||||
hasSpace := b.GetLineSpacing(b.DisplayPos / b.LineWidth)
|
hasSpace := b.GetLineSpacing(b.DisplayPos / b.LineWidth)
|
||||||
|
|
||||||
@@ -357,8 +354,7 @@ func (b *Buffer) Remove() {
|
|||||||
if b.DisplayPos%b.LineWidth == 0 {
|
if b.DisplayPos%b.LineWidth == 0 {
|
||||||
// if the user backspaces over the word boundary, do this magic to clear the line
|
// if the user backspaces over the word boundary, do this magic to clear the line
|
||||||
// and move to the end of the previous line
|
// and move to the end of the previous line
|
||||||
fmt.Printf(CursorBOL + ClearToEOL)
|
fmt.Print(CursorBOL + ClearToEOL + CursorUp + CursorBOL + CursorRightN(b.Width))
|
||||||
fmt.Printf(CursorUp + CursorBOL + cursorRightN(b.Width))
|
|
||||||
|
|
||||||
if b.DisplaySize()%b.LineWidth < (b.DisplaySize()-rLength)%b.LineWidth {
|
if b.DisplaySize()%b.LineWidth < (b.DisplaySize()-rLength)%b.LineWidth {
|
||||||
b.LineHasSpace.Remove(b.DisplayPos/b.LineWidth - 1)
|
b.LineHasSpace.Remove(b.DisplayPos/b.LineWidth - 1)
|
||||||
@@ -370,24 +366,23 @@ func (b *Buffer) Remove() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if rLength == 2 {
|
if rLength == 2 {
|
||||||
fmt.Print(CursorLeft + " " + cursorLeftN(2))
|
fmt.Print(CursorLeft + " " + CursorLeftN(2))
|
||||||
} else {
|
} else {
|
||||||
fmt.Print(" " + CursorLeft)
|
fmt.Print(" " + CursorLeft)
|
||||||
}
|
}
|
||||||
} else if (b.DisplayPos-rLength)%b.LineWidth == 0 && hasSpace {
|
} else if (b.DisplayPos-rLength)%b.LineWidth == 0 && hasSpace {
|
||||||
fmt.Printf(CursorBOL + ClearToEOL)
|
fmt.Print(CursorBOL + ClearToEOL + CursorUp + CursorBOL + CursorRightN(b.Width))
|
||||||
fmt.Printf(CursorUp + CursorBOL + cursorRightN(b.Width))
|
|
||||||
|
|
||||||
if b.Pos == b.Buf.Size() {
|
if b.Pos == b.Buf.Size() {
|
||||||
b.LineHasSpace.Remove(b.DisplayPos/b.LineWidth - 1)
|
b.LineHasSpace.Remove(b.DisplayPos/b.LineWidth - 1)
|
||||||
}
|
}
|
||||||
b.DisplayPos -= 1
|
b.DisplayPos -= 1
|
||||||
} else {
|
} else {
|
||||||
fmt.Print(cursorLeftN(rLength))
|
fmt.Print(CursorLeftN(rLength))
|
||||||
for range rLength {
|
for range rLength {
|
||||||
fmt.Print(" ")
|
fmt.Print(" ")
|
||||||
}
|
}
|
||||||
fmt.Print(cursorLeftN(rLength))
|
fmt.Print(CursorLeftN(rLength))
|
||||||
}
|
}
|
||||||
|
|
||||||
var eraseExtraLine bool
|
var eraseExtraLine bool
|
||||||
@@ -405,9 +400,9 @@ func (b *Buffer) Remove() {
|
|||||||
// are trailing characters which go over the line width boundary
|
// are trailing characters which go over the line width boundary
|
||||||
if eraseExtraLine {
|
if eraseExtraLine {
|
||||||
remainingLines := (b.DisplaySize() - b.DisplayPos) / b.LineWidth
|
remainingLines := (b.DisplaySize() - b.DisplayPos) / b.LineWidth
|
||||||
fmt.Printf(cursorDownN(remainingLines+1) + CursorBOL + ClearToEOL)
|
fmt.Print(CursorDownN(remainingLines+1) + CursorBOL + ClearToEOL)
|
||||||
place := b.DisplayPos % b.LineWidth
|
place := b.DisplayPos % b.LineWidth
|
||||||
fmt.Printf(cursorUpN(remainingLines+1) + cursorRightN(place+len(b.Prompt.prompt())))
|
fmt.Print(CursorUpN(remainingLines+1) + CursorRightN(place+len(b.Prompt.prompt())))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -422,9 +417,9 @@ func (b *Buffer) Delete() {
|
|||||||
if b.DisplaySize()%b.LineWidth == 0 {
|
if b.DisplaySize()%b.LineWidth == 0 {
|
||||||
if b.DisplayPos != b.DisplaySize() {
|
if b.DisplayPos != b.DisplaySize() {
|
||||||
remainingLines := (b.DisplaySize() - b.DisplayPos) / b.LineWidth
|
remainingLines := (b.DisplaySize() - b.DisplayPos) / b.LineWidth
|
||||||
fmt.Printf(cursorDownN(remainingLines) + CursorBOL + ClearToEOL)
|
fmt.Print(CursorDownN(remainingLines) + CursorBOL + ClearToEOL)
|
||||||
place := b.DisplayPos % b.LineWidth
|
place := b.DisplayPos % b.LineWidth
|
||||||
fmt.Printf(cursorUpN(remainingLines) + cursorRightN(place+len(b.Prompt.prompt())))
|
fmt.Print(CursorUpN(remainingLines) + CursorRightN(place+len(b.Prompt.prompt())))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -471,17 +466,17 @@ func (b *Buffer) DeleteWord() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (b *Buffer) ClearScreen() {
|
func (b *Buffer) ClearScreen() {
|
||||||
fmt.Printf(ClearScreen + CursorReset + b.Prompt.prompt())
|
fmt.Print(ClearScreen + CursorReset + b.Prompt.prompt())
|
||||||
if b.IsEmpty() {
|
if b.IsEmpty() {
|
||||||
ph := b.Prompt.placeholder()
|
ph := b.Prompt.placeholder()
|
||||||
fmt.Printf(ColorGrey + ph + cursorLeftN(len(ph)) + ColorDefault)
|
fmt.Print(ColorGrey + ph + CursorLeftN(len(ph)) + ColorDefault)
|
||||||
} else {
|
} else {
|
||||||
currPos := b.DisplayPos
|
currPos := b.DisplayPos
|
||||||
currIndex := b.Pos
|
currIndex := b.Pos
|
||||||
b.Pos = 0
|
b.Pos = 0
|
||||||
b.DisplayPos = 0
|
b.DisplayPos = 0
|
||||||
b.drawRemaining()
|
b.drawRemaining()
|
||||||
fmt.Printf(CursorReset + cursorRightN(len(b.Prompt.prompt())))
|
fmt.Print(CursorReset + CursorRightN(len(b.Prompt.prompt())))
|
||||||
if currPos > 0 {
|
if currPos > 0 {
|
||||||
targetLine := currPos / b.LineWidth
|
targetLine := currPos / b.LineWidth
|
||||||
if targetLine > 0 {
|
if targetLine > 0 {
|
||||||
@@ -491,10 +486,10 @@ func (b *Buffer) ClearScreen() {
|
|||||||
}
|
}
|
||||||
remainder := currPos % b.LineWidth
|
remainder := currPos % b.LineWidth
|
||||||
if remainder > 0 {
|
if remainder > 0 {
|
||||||
fmt.Print(cursorRightN(remainder))
|
fmt.Print(CursorRightN(remainder))
|
||||||
}
|
}
|
||||||
if currPos%b.LineWidth == 0 {
|
if currPos%b.LineWidth == 0 {
|
||||||
fmt.Printf(CursorBOL + b.Prompt.AltPrompt)
|
fmt.Print(CursorBOL + b.Prompt.AltPrompt)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
b.Pos = currIndex
|
b.Pos = currIndex
|
||||||
@@ -513,13 +508,13 @@ func (b *Buffer) Replace(r []rune) {
|
|||||||
|
|
||||||
b.Buf.Clear()
|
b.Buf.Clear()
|
||||||
|
|
||||||
fmt.Printf(CursorBOL + ClearToEOL)
|
fmt.Print(CursorBOL + ClearToEOL)
|
||||||
|
|
||||||
for range lineNums {
|
for range lineNums {
|
||||||
fmt.Print(CursorUp + CursorBOL + ClearToEOL)
|
fmt.Print(CursorUp + CursorBOL + ClearToEOL)
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf(CursorBOL + b.Prompt.prompt())
|
fmt.Print(CursorBOL + b.Prompt.prompt())
|
||||||
|
|
||||||
for _, c := range r {
|
for _, c := range r {
|
||||||
b.Add(c)
|
b.Add(c)
|
||||||
@@ -545,19 +540,3 @@ func (b *Buffer) StringNM(n, m int) string {
|
|||||||
}
|
}
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
func cursorLeftN(n int) string {
|
|
||||||
return fmt.Sprintf(CursorLeftN, n)
|
|
||||||
}
|
|
||||||
|
|
||||||
func cursorRightN(n int) string {
|
|
||||||
return fmt.Sprintf(CursorRightN, n)
|
|
||||||
}
|
|
||||||
|
|
||||||
func cursorUpN(n int) string {
|
|
||||||
return fmt.Sprintf(CursorUpN, n)
|
|
||||||
}
|
|
||||||
|
|
||||||
func cursorDownN(n int) string {
|
|
||||||
return fmt.Sprintf(CursorDownN, n)
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ func (i *Instance) Readline() (string, error) {
|
|||||||
showPlaceholder := !i.Pasting || i.Prompt.UseAlt
|
showPlaceholder := !i.Pasting || i.Prompt.UseAlt
|
||||||
if buf.IsEmpty() && showPlaceholder {
|
if buf.IsEmpty() && showPlaceholder {
|
||||||
ph := i.Prompt.placeholder()
|
ph := i.Prompt.placeholder()
|
||||||
fmt.Printf(ColorGrey + ph + fmt.Sprintf(CursorLeftN, len(ph)) + ColorDefault)
|
fmt.Print(ColorGrey + ph + CursorLeftN(len(ph)) + ColorDefault)
|
||||||
}
|
}
|
||||||
|
|
||||||
r, err := i.Terminal.Read()
|
r, err := i.Terminal.Read()
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package readline
|
package readline
|
||||||
|
|
||||||
|
import "strconv"
|
||||||
|
|
||||||
const (
|
const (
|
||||||
CharNull = 0
|
CharNull = 0
|
||||||
CharLineStart = 1
|
CharLineStart = 1
|
||||||
@@ -41,34 +43,49 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
CursorUp = "\033[1A"
|
Esc = "\x1b"
|
||||||
CursorDown = "\033[1B"
|
|
||||||
CursorRight = "\033[1C"
|
|
||||||
CursorLeft = "\033[1D"
|
|
||||||
|
|
||||||
CursorSave = "\033[s"
|
CursorSave = Esc + "[s"
|
||||||
CursorRestore = "\033[u"
|
CursorRestore = Esc + "[u"
|
||||||
|
|
||||||
CursorUpN = "\033[%dA"
|
CursorEOL = Esc + "[E"
|
||||||
CursorDownN = "\033[%dB"
|
CursorBOL = Esc + "[1G"
|
||||||
CursorRightN = "\033[%dC"
|
CursorHide = Esc + "[?25l"
|
||||||
CursorLeftN = "\033[%dD"
|
CursorShow = Esc + "[?25h"
|
||||||
|
|
||||||
CursorEOL = "\033[E"
|
ClearToEOL = Esc + "[K"
|
||||||
CursorBOL = "\033[1G"
|
ClearLine = Esc + "[2K"
|
||||||
CursorHide = "\033[?25l"
|
ClearScreen = Esc + "[2J"
|
||||||
CursorShow = "\033[?25h"
|
CursorReset = Esc + "[0;0f"
|
||||||
|
|
||||||
ClearToEOL = "\033[K"
|
ColorGrey = Esc + "[38;5;245m"
|
||||||
ClearLine = "\033[2K"
|
ColorDefault = Esc + "[0m"
|
||||||
ClearScreen = "\033[2J"
|
|
||||||
CursorReset = "\033[0;0f"
|
|
||||||
|
|
||||||
ColorGrey = "\033[38;5;245m"
|
StartBracketedPaste = Esc + "[?2004h"
|
||||||
ColorDefault = "\033[0m"
|
EndBracketedPaste = Esc + "[?2004l"
|
||||||
|
)
|
||||||
|
|
||||||
StartBracketedPaste = "\033[?2004h"
|
func CursorUpN(n int) string {
|
||||||
EndBracketedPaste = "\033[?2004l"
|
return Esc + "[" + strconv.Itoa(n) + "A"
|
||||||
|
}
|
||||||
|
|
||||||
|
func CursorDownN(n int) string {
|
||||||
|
return Esc + "[" + strconv.Itoa(n) + "B"
|
||||||
|
}
|
||||||
|
|
||||||
|
func CursorRightN(n int) string {
|
||||||
|
return Esc + "[" + strconv.Itoa(n) + "C"
|
||||||
|
}
|
||||||
|
|
||||||
|
func CursorLeftN(n int) string {
|
||||||
|
return Esc + "[" + strconv.Itoa(n) + "D"
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
CursorUp = CursorUpN(1)
|
||||||
|
CursorDown = CursorDownN(1)
|
||||||
|
CursorRight = CursorRightN(1)
|
||||||
|
CursorLeft = CursorLeftN(1)
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ func (p *blobDownloadPart) UnmarshalJSON(b []byte) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
numDownloadParts = 64
|
numDownloadParts = 16
|
||||||
minDownloadPartSize int64 = 100 * format.MegaByte
|
minDownloadPartSize int64 = 100 * format.MegaByte
|
||||||
maxDownloadPartSize int64 = 1000 * format.MegaByte
|
maxDownloadPartSize int64 = 1000 * format.MegaByte
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -324,13 +324,10 @@ func (s *Server) EmbedHandler(c *gin.Context) {
|
|||||||
input = append(input, v.(string))
|
input = append(input, v.(string))
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
if req.Input != nil {
|
||||||
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "invalid input type"})
|
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "invalid input type"})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(input) == 0 {
|
|
||||||
c.JSON(http.StatusOK, api.EmbedResponse{Model: req.Model, Embeddings: [][]float32{}})
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
r, m, opts, err := s.scheduleRunner(c.Request.Context(), req.Model, []Capability{}, req.Options, req.KeepAlive)
|
r, m, opts, err := s.scheduleRunner(c.Request.Context(), req.Model, []Capability{}, req.Options, req.KeepAlive)
|
||||||
@@ -341,6 +338,11 @@ func (s *Server) EmbedHandler(c *gin.Context) {
|
|||||||
|
|
||||||
checkpointLoaded := time.Now()
|
checkpointLoaded := time.Now()
|
||||||
|
|
||||||
|
if len(input) == 0 {
|
||||||
|
c.JSON(http.StatusOK, api.EmbedResponse{Model: req.Model, Embeddings: [][]float32{}})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
kvData, err := getKVData(m.ModelPath, false)
|
kvData, err := getKVData(m.ModelPath, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
||||||
|
|||||||
@@ -272,76 +272,6 @@ func Test_Routes(t *testing.T) {
|
|||||||
assert.Equal(t, "library", retrieveResp.OwnedBy)
|
assert.Equal(t, "library", retrieveResp.OwnedBy)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
|
||||||
Name: "Embed Handler Empty Input",
|
|
||||||
Method: http.MethodPost,
|
|
||||||
Path: "/api/embed",
|
|
||||||
Setup: func(t *testing.T, req *http.Request) {
|
|
||||||
embedReq := api.EmbedRequest{
|
|
||||||
Model: "t-bone",
|
|
||||||
Input: "",
|
|
||||||
}
|
|
||||||
jsonData, err := json.Marshal(embedReq)
|
|
||||||
require.NoError(t, err)
|
|
||||||
req.Body = io.NopCloser(bytes.NewReader(jsonData))
|
|
||||||
},
|
|
||||||
Expected: func(t *testing.T, resp *http.Response) {
|
|
||||||
contentType := resp.Header.Get("Content-Type")
|
|
||||||
if contentType != "application/json; charset=utf-8" {
|
|
||||||
t.Fatalf("expected content type application/json; charset=utf-8, got %s", contentType)
|
|
||||||
}
|
|
||||||
body, err := io.ReadAll(resp.Body)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
var embedResp api.EmbedResponse
|
|
||||||
err = json.Unmarshal(body, &embedResp)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if embedResp.Model != "t-bone" {
|
|
||||||
t.Fatalf("expected model t-bone, got %s", embedResp.Model)
|
|
||||||
}
|
|
||||||
|
|
||||||
if embedResp.Embeddings == nil {
|
|
||||||
t.Fatalf("expected embeddings to not be nil, got %v", embedResp.Embeddings)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(embedResp.Embeddings) != 0 {
|
|
||||||
t.Fatalf("expected embeddings to be empty, got %v", embedResp.Embeddings)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Name: "Embed Handler Invalid Input",
|
|
||||||
Method: http.MethodPost,
|
|
||||||
Path: "/api/embed",
|
|
||||||
Setup: func(t *testing.T, req *http.Request) {
|
|
||||||
embedReq := api.EmbedRequest{
|
|
||||||
Model: "t-bone",
|
|
||||||
Input: 2,
|
|
||||||
}
|
|
||||||
jsonData, err := json.Marshal(embedReq)
|
|
||||||
require.NoError(t, err)
|
|
||||||
req.Body = io.NopCloser(bytes.NewReader(jsonData))
|
|
||||||
},
|
|
||||||
Expected: func(t *testing.T, resp *http.Response) {
|
|
||||||
contentType := resp.Header.Get("Content-Type")
|
|
||||||
if contentType != "application/json; charset=utf-8" {
|
|
||||||
t.Fatalf("expected content type application/json; charset=utf-8, got %s", contentType)
|
|
||||||
}
|
|
||||||
_, err := io.ReadAll(resp.Body)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if resp.StatusCode != http.StatusBadRequest {
|
|
||||||
t.Fatalf("expected status code 400, got %d", resp.StatusCode)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Setenv("OLLAMA_MODELS", t.TempDir())
|
t.Setenv("OLLAMA_MODELS", t.TempDir())
|
||||||
|
|||||||
@@ -418,7 +418,7 @@ func (s *Scheduler) load(req *LlmRequest, ggml *llm.GGML, gpus gpu.GpuInfoList,
|
|||||||
// some older models are not compatible with newer versions of llama.cpp
|
// some older models are not compatible with newer versions of llama.cpp
|
||||||
// show a generalized compatibility error until there is a better way to
|
// show a generalized compatibility error until there is a better way to
|
||||||
// check for model compatibility
|
// check for model compatibility
|
||||||
if errors.Is(llm.ErrUnsupportedFormat, err) || strings.Contains(err.Error(), "failed to load model") {
|
if errors.Is(err, llm.ErrUnsupportedFormat) || strings.Contains(err.Error(), "failed to load model") {
|
||||||
err = fmt.Errorf("%v: this model may be incompatible with your version of Ollama. If you previously pulled this model, try updating it by running `ollama pull %s`", err, req.model.ShortName)
|
err = fmt.Errorf("%v: this model may be incompatible with your version of Ollama. If you previously pulled this model, try updating it by running `ollama pull %s`", err, req.model.ShortName)
|
||||||
}
|
}
|
||||||
slog.Info("NewLlamaServer failed", "model", req.model.ModelPath, "error", err)
|
slog.Info("NewLlamaServer failed", "model", req.model.ModelPath, "error", err)
|
||||||
|
|||||||
@@ -219,7 +219,7 @@ func (n Name) String() string {
|
|||||||
return b.String()
|
return b.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
// DisplayShort returns a short string version of the name.
|
// DisplayShortest returns a short string version of the name.
|
||||||
func (n Name) DisplayShortest() string {
|
func (n Name) DisplayShortest() string {
|
||||||
var sb strings.Builder
|
var sb strings.Builder
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user