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
4c1caa37
Commit
4c1caa37
authored
Jul 25, 2023
by
Bruce MacDonald
Browse files
download models when creating from modelfile
parent
12ab8f8f
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 @
4c1caa37
...
@@ -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 @
4c1caa37
...
@@ -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 @
4c1caa37
...
@@ -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 @
4c1caa37
...
@@ -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 @
4c1caa37
...
@@ -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