Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
OpenDAS
ollama
Commits
f1ff892f
Unverified
Commit
f1ff892f
authored
Jul 25, 2023
by
Bruce MacDonald
Committed by
GitHub
Jul 25, 2023
Browse files
pull model on make if not present locally
parents
3f2a1004
4c1caa37
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
73 additions
and
41 deletions
+73
-41
api/client.go
api/client.go
+2
-2
api/types.go
api/types.go
+0
-4
cmd/cmd.go
cmd/cmd.go
+24
-7
server/images.go
server/images.go
+45
-24
server/routes.go
server/routes.go
+2
-4
No files found.
api/client.go
View file @
f1ff892f
...
@@ -189,11 +189,11 @@ func (c *Client) Push(ctx context.Context, req *PushRequest, fn PushProgressFunc
...
@@ -189,11 +189,11 @@ func (c *Client) Push(ctx context.Context, req *PushRequest, fn PushProgressFunc
})
})
}
}
type
CreateProgressFunc
func
(
Create
Progress
)
error
type
CreateProgressFunc
func
(
Progress
Response
)
error
func
(
c
*
Client
)
Create
(
ctx
context
.
Context
,
req
*
CreateRequest
,
fn
CreateProgressFunc
)
error
{
func
(
c
*
Client
)
Create
(
ctx
context
.
Context
,
req
*
CreateRequest
,
fn
CreateProgressFunc
)
error
{
return
c
.
stream
(
ctx
,
http
.
MethodPost
,
"/api/create"
,
req
,
func
(
bts
[]
byte
)
error
{
return
c
.
stream
(
ctx
,
http
.
MethodPost
,
"/api/create"
,
req
,
func
(
bts
[]
byte
)
error
{
var
resp
Create
Progress
var
resp
Progress
Response
if
err
:=
json
.
Unmarshal
(
bts
,
&
resp
);
err
!=
nil
{
if
err
:=
json
.
Unmarshal
(
bts
,
&
resp
);
err
!=
nil
{
return
err
return
err
}
}
...
...
api/types.go
View file @
f1ff892f
...
@@ -40,10 +40,6 @@ type CreateRequest struct {
...
@@ -40,10 +40,6 @@ type CreateRequest struct {
Path
string
`json:"path"`
Path
string
`json:"path"`
}
}
type
CreateProgress
struct
{
Status
string
`json:"status"`
}
type
DeleteRequest
struct
{
type
DeleteRequest
struct
{
Name
string
`json:"name"`
Name
string
`json:"name"`
}
}
...
...
cmd/cmd.go
View file @
f1ff892f
...
@@ -36,15 +36,32 @@ func CreateHandler(cmd *cobra.Command, args []string) error {
...
@@ -36,15 +36,32 @@ func CreateHandler(cmd *cobra.Command, args []string) error {
var
spinner
*
Spinner
var
spinner
*
Spinner
request
:=
api
.
CreateRequest
{
Name
:
args
[
0
],
Path
:
filename
}
var
currentDigest
string
fn
:=
func
(
resp
api
.
CreateProgress
)
error
{
var
bar
*
progressbar
.
ProgressBar
if
spinner
!=
nil
{
spinner
.
Stop
()
}
spinner
=
NewSpinner
(
resp
.
Status
)
request
:=
api
.
CreateRequest
{
Name
:
args
[
0
],
Path
:
filename
}
go
spinner
.
Spin
(
100
*
time
.
Millisecond
)
fn
:=
func
(
resp
api
.
ProgressResponse
)
error
{
if
resp
.
Digest
!=
currentDigest
&&
resp
.
Digest
!=
""
{
if
spinner
!=
nil
{
spinner
.
Stop
()
}
currentDigest
=
resp
.
Digest
bar
=
progressbar
.
DefaultBytes
(
int64
(
resp
.
Total
),
fmt
.
Sprintf
(
"pulling %s..."
,
resp
.
Digest
[
7
:
19
]),
)
bar
.
Set
(
resp
.
Completed
)
}
else
if
resp
.
Digest
==
currentDigest
&&
resp
.
Digest
!=
""
{
bar
.
Set
(
resp
.
Completed
)
}
else
{
currentDigest
=
""
if
spinner
!=
nil
{
spinner
.
Stop
()
}
spinner
=
NewSpinner
(
resp
.
Status
)
go
spinner
.
Spin
(
100
*
time
.
Millisecond
)
}
return
nil
return
nil
}
}
...
...
server/images.go
View file @
f1ff892f
...
@@ -187,15 +187,15 @@ func GetModel(name string) (*Model, error) {
...
@@ -187,15 +187,15 @@ func GetModel(name string) (*Model, error) {
return
model
,
nil
return
model
,
nil
}
}
func
CreateModel
(
name
string
,
path
string
,
fn
func
(
status
string
))
error
{
func
CreateModel
(
name
string
,
path
string
,
fn
func
(
resp
api
.
ProgressResponse
))
error
{
mf
,
err
:=
os
.
Open
(
path
)
mf
,
err
:=
os
.
Open
(
path
)
if
err
!=
nil
{
if
err
!=
nil
{
fn
(
fmt
.
Sprintf
(
"couldn't open modelfile '%s'"
,
path
))
fn
(
api
.
ProgressResponse
{
Status
:
fmt
.
Sprintf
(
"couldn't open modelfile '%s'"
,
path
)
}
)
return
fmt
.
Errorf
(
"failed to open file: %w"
,
err
)
return
fmt
.
Errorf
(
"failed to open file: %w"
,
err
)
}
}
defer
mf
.
Close
()
defer
mf
.
Close
()
fn
(
"parsing modelfile"
)
fn
(
api
.
ProgressResponse
{
Status
:
"parsing modelfile"
}
)
commands
,
err
:=
parser
.
Parse
(
mf
)
commands
,
err
:=
parser
.
Parse
(
mf
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
...
@@ -208,7 +208,7 @@ func CreateModel(name string, path string, fn func(status string)) error {
...
@@ -208,7 +208,7 @@ func CreateModel(name string, path string, fn func(status string)) error {
log
.
Printf
(
"[%s] - %s
\n
"
,
c
.
Name
,
c
.
Args
)
log
.
Printf
(
"[%s] - %s
\n
"
,
c
.
Name
,
c
.
Args
)
switch
c
.
Name
{
switch
c
.
Name
{
case
"model"
:
case
"model"
:
fn
(
"looking for model"
)
fn
(
api
.
ProgressResponse
{
Status
:
"looking for model"
}
)
mf
,
err
:=
GetManifest
(
ParseModelPath
(
c
.
Args
))
mf
,
err
:=
GetManifest
(
ParseModelPath
(
c
.
Args
))
if
err
!=
nil
{
if
err
!=
nil
{
fp
:=
c
.
Args
fp
:=
c
.
Args
...
@@ -229,20 +229,40 @@ func CreateModel(name string, path string, fn func(status string)) error {
...
@@ -229,20 +229,40 @@ func CreateModel(name string, path string, fn func(status string)) error {
fp
=
filepath
.
Join
(
filepath
.
Dir
(
path
),
fp
)
fp
=
filepath
.
Join
(
filepath
.
Dir
(
path
),
fp
)
}
}
fn
(
"creating model layer"
)
if
_
,
err
:=
os
.
Stat
(
fp
);
err
!=
nil
{
file
,
err
:=
os
.
Open
(
fp
)
// the model file does not exist, try pulling it
if
err
!=
nil
{
if
errors
.
Is
(
err
,
os
.
ErrNotExist
)
{
return
fmt
.
Errorf
(
"failed to open file: %v"
,
err
)
fn
(
api
.
ProgressResponse
{
Status
:
"pulling model file"
})
}
if
err
:=
PullModel
(
c
.
Args
,
&
RegistryOptions
{},
fn
);
err
!=
nil
{
defer
file
.
Close
()
return
err
}
mf
,
err
=
GetManifest
(
ParseModelPath
(
c
.
Args
))
if
err
!=
nil
{
return
fmt
.
Errorf
(
"failed to open file after pull: %v"
,
err
)
}
}
else
{
return
err
}
}
else
{
// create a model from this specified file
fn
(
api
.
ProgressResponse
{
Status
:
"creating model layer"
})
l
,
err
:=
CreateLayer
(
file
)
file
,
err
:=
os
.
Open
(
fp
)
if
err
!=
nil
{
if
err
!=
nil
{
return
fmt
.
Errorf
(
"failed to create layer: %v"
,
err
)
return
fmt
.
Errorf
(
"failed to open file: %v"
,
err
)
}
defer
file
.
Close
()
l
,
err
:=
CreateLayer
(
file
)
if
err
!=
nil
{
return
fmt
.
Errorf
(
"failed to create layer: %v"
,
err
)
}
l
.
MediaType
=
"application/vnd.ollama.image.model"
layers
=
append
(
layers
,
l
)
}
}
l
.
MediaType
=
"application/vnd.ollama.image.model"
}
layers
=
append
(
layers
,
l
)
if
mf
!=
nil
{
}
else
{
log
.
Printf
(
"manifest = %#v"
,
mf
)
log
.
Printf
(
"manifest = %#v"
,
mf
)
for
_
,
l
:=
range
mf
.
Layers
{
for
_
,
l
:=
range
mf
.
Layers
{
newLayer
,
err
:=
GetLayerWithBufferFromLayer
(
l
)
newLayer
,
err
:=
GetLayerWithBufferFromLayer
(
l
)
...
@@ -253,7 +273,7 @@ func CreateModel(name string, path string, fn func(status string)) error {
...
@@ -253,7 +273,7 @@ func CreateModel(name string, path string, fn func(status string)) error {
}
}
}
}
case
"license"
,
"template"
,
"system"
,
"prompt"
:
case
"license"
,
"template"
,
"system"
,
"prompt"
:
fn
(
fmt
.
Sprintf
(
"creating %s layer"
,
c
.
Name
))
fn
(
api
.
ProgressResponse
{
Status
:
fmt
.
Sprintf
(
"creating
model
%s layer"
,
c
.
Name
)
}
)
// remove the prompt layer if one exists
// remove the prompt layer if one exists
mediaType
:=
fmt
.
Sprintf
(
"application/vnd.ollama.image.%s"
,
c
.
Name
)
mediaType
:=
fmt
.
Sprintf
(
"application/vnd.ollama.image.%s"
,
c
.
Name
)
layers
=
removeLayerFromLayers
(
layers
,
mediaType
)
layers
=
removeLayerFromLayers
(
layers
,
mediaType
)
...
@@ -272,7 +292,7 @@ func CreateModel(name string, path string, fn func(status string)) error {
...
@@ -272,7 +292,7 @@ func CreateModel(name string, path string, fn func(status string)) error {
// Create a single layer for the parameters
// Create a single layer for the parameters
if
len
(
params
)
>
0
{
if
len
(
params
)
>
0
{
fn
(
"creating parameter layer"
)
fn
(
api
.
ProgressResponse
{
Status
:
"creating parameter layer"
}
)
layers
=
removeLayerFromLayers
(
layers
,
"application/vnd.ollama.image.params"
)
layers
=
removeLayerFromLayers
(
layers
,
"application/vnd.ollama.image.params"
)
paramData
,
err
:=
paramsToReader
(
params
)
paramData
,
err
:=
paramsToReader
(
params
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -297,7 +317,7 @@ func CreateModel(name string, path string, fn func(status string)) error {
...
@@ -297,7 +317,7 @@ func CreateModel(name string, path string, fn func(status string)) error {
}
}
// Create a layer for the config object
// Create a layer for the config object
fn
(
"creating config layer"
)
fn
(
api
.
ProgressResponse
{
Status
:
"creating config layer"
}
)
cfg
,
err
:=
createConfigLayer
(
digests
)
cfg
,
err
:=
createConfigLayer
(
digests
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
...
@@ -310,13 +330,13 @@ func CreateModel(name string, path string, fn func(status string)) error {
...
@@ -310,13 +330,13 @@ func CreateModel(name string, path string, fn func(status string)) error {
}
}
// Create the manifest
// Create the manifest
fn
(
"writing manifest"
)
fn
(
api
.
ProgressResponse
{
Status
:
"writing manifest"
}
)
err
=
CreateManifest
(
name
,
cfg
,
manifestLayers
)
err
=
CreateManifest
(
name
,
cfg
,
manifestLayers
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
fn
(
"success"
)
fn
(
api
.
ProgressResponse
{
Status
:
"success"
}
)
return
nil
return
nil
}
}
...
@@ -331,7 +351,7 @@ func removeLayerFromLayers(layers []*LayerReader, mediaType string) []*LayerRead
...
@@ -331,7 +351,7 @@ func removeLayerFromLayers(layers []*LayerReader, mediaType string) []*LayerRead
return
layers
[
:
j
]
return
layers
[
:
j
]
}
}
func
SaveLayers
(
layers
[]
*
LayerReader
,
fn
func
(
status
string
),
force
bool
)
error
{
func
SaveLayers
(
layers
[]
*
LayerReader
,
fn
func
(
resp
api
.
ProgressResponse
),
force
bool
)
error
{
// Write each of the layers to disk
// Write each of the layers to disk
for
_
,
layer
:=
range
layers
{
for
_
,
layer
:=
range
layers
{
fp
,
err
:=
GetBlobsPath
(
layer
.
Digest
)
fp
,
err
:=
GetBlobsPath
(
layer
.
Digest
)
...
@@ -341,7 +361,8 @@ func SaveLayers(layers []*LayerReader, fn func(status string), force bool) error
...
@@ -341,7 +361,8 @@ func SaveLayers(layers []*LayerReader, fn func(status string), force bool) error
_
,
err
=
os
.
Stat
(
fp
)
_
,
err
=
os
.
Stat
(
fp
)
if
os
.
IsNotExist
(
err
)
||
force
{
if
os
.
IsNotExist
(
err
)
||
force
{
fn
(
fmt
.
Sprintf
(
"writing layer %s"
,
layer
.
Digest
))
fn
(
api
.
ProgressResponse
{
Status
:
fmt
.
Sprintf
(
"writing layer %s"
,
layer
.
Digest
)})
out
,
err
:=
os
.
Create
(
fp
)
out
,
err
:=
os
.
Create
(
fp
)
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Printf
(
"couldn't create %s"
,
fp
)
log
.
Printf
(
"couldn't create %s"
,
fp
)
...
@@ -354,7 +375,7 @@ func SaveLayers(layers []*LayerReader, fn func(status string), force bool) error
...
@@ -354,7 +375,7 @@ func SaveLayers(layers []*LayerReader, fn func(status string), force bool) error
}
}
}
else
{
}
else
{
fn
(
fmt
.
Sprintf
(
"using already created layer %s"
,
layer
.
Digest
))
fn
(
api
.
ProgressResponse
{
Status
:
fmt
.
Sprintf
(
"using already created layer %s"
,
layer
.
Digest
)
}
)
}
}
}
}
...
...
server/routes.go
View file @
f1ff892f
...
@@ -147,10 +147,8 @@ func CreateModelHandler(c *gin.Context) {
...
@@ -147,10 +147,8 @@ func CreateModelHandler(c *gin.Context) {
ch
:=
make
(
chan
any
)
ch
:=
make
(
chan
any
)
go
func
()
{
go
func
()
{
defer
close
(
ch
)
defer
close
(
ch
)
fn
:=
func
(
status
string
)
{
fn
:=
func
(
resp
api
.
ProgressResponse
)
{
ch
<-
api
.
CreateProgress
{
ch
<-
resp
Status
:
status
,
}
}
}
if
err
:=
CreateModel
(
req
.
Name
,
req
.
Path
,
fn
);
err
!=
nil
{
if
err
:=
CreateModel
(
req
.
Name
,
req
.
Path
,
fn
);
err
!=
nil
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment