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
928950fc
Unverified
Commit
928950fc
authored
Nov 27, 2023
by
Bruce MacDonald
Committed by
GitHub
Nov 27, 2023
Browse files
update python client create example (#1227)
* add remote create to python example client
parent
39c6d949
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
67 additions
and
9 deletions
+67
-9
api/client.py
api/client.py
+67
-9
No files found.
api/client.py
View file @
928950fc
import
os
import
os
import
json
import
json
import
requests
import
requests
import
os
import
hashlib
import
json
from
pathlib
import
Path
BASE_URL
=
os
.
environ
.
get
(
'OLLAMA_HOST'
,
'http://localhost:11434'
)
BASE_URL
=
os
.
environ
.
get
(
'OLLAMA_HOST'
,
'http://localhost:11434'
)
...
@@ -57,30 +61,86 @@ def generate(model_name, prompt, system=None, template=None, format="", context=
...
@@ -57,30 +61,86 @@ def generate(model_name, prompt, system=None, template=None, format="", context=
except
requests
.
exceptions
.
RequestException
as
e
:
except
requests
.
exceptions
.
RequestException
as
e
:
print
(
f
"An error occurred:
{
e
}
"
)
print
(
f
"An error occurred:
{
e
}
"
)
return
None
,
None
return
None
,
None
# Create a blob file on the server if it doesn't exist.
def
create_blob
(
digest
,
file_path
):
url
=
f
"
{
BASE_URL
}
/api/blobs/
{
digest
}
"
# Check if the blob exists
response
=
requests
.
head
(
url
)
if
response
.
status_code
!=
404
:
return
# Blob already exists, no need to upload
response
.
raise_for_status
()
# Upload the blob
with
open
(
file_path
,
'rb'
)
as
file_data
:
requests
.
post
(
url
,
data
=
file_data
)
# Create a model from a Modelfile. Use the callback function to override the default handler.
# Create a model from a Modelfile. Use the callback function to override the default handler.
def
create
(
model_name
,
model_path
,
callback
=
None
):
def
create
(
model_name
,
filename
,
callback
=
None
):
try
:
try
:
file_path
=
Path
(
filename
).
expanduser
().
resolve
()
processed_lines
=
[]
# Read and process the modelfile
with
open
(
file_path
,
'r'
)
as
f
:
for
line
in
f
:
# Skip empty or whitespace-only lines
if
not
line
.
strip
():
continue
command
,
args
=
line
.
split
(
maxsplit
=
1
)
if
command
.
upper
()
in
[
"FROM"
,
"ADAPTER"
]:
path
=
Path
(
args
.
strip
()).
expanduser
()
# Check if path is relative and resolve it
if
not
path
.
is_absolute
():
path
=
(
file_path
.
parent
/
path
)
# Skip if file does not exist for "model", this is handled by the server
if
not
path
.
exists
():
processed_lines
.
append
(
line
)
continue
# Calculate SHA-256 hash
with
open
(
path
,
'rb'
)
as
bin_file
:
hash
=
hashlib
.
sha256
()
hash
.
update
(
bin_file
.
read
())
blob
=
f
"sha256:
{
hash
.
hexdigest
()
}
"
# Add the file to the remote server
create_blob
(
blob
,
path
)
# Replace path with digest in the line
line
=
f
"
{
command
}
@
{
blob
}
\n
"
processed_lines
.
append
(
line
)
# Combine processed lines back into a single string
modelfile_content
=
'
\n
'
.
join
(
processed_lines
)
url
=
f
"
{
BASE_URL
}
/api/create"
url
=
f
"
{
BASE_URL
}
/api/create"
payload
=
{
"name"
:
model_name
,
"
path"
:
model_path
}
payload
=
{
"name"
:
model_name
,
"
modelfile"
:
modelfile_content
}
# Making a POST request with the stream parameter set to True to handle streaming responses
# Making a POST request with the stream parameter set to True to handle streaming responses
with
requests
.
post
(
url
,
json
=
payload
,
stream
=
True
)
as
response
:
with
requests
.
post
(
url
,
json
=
payload
,
stream
=
True
)
as
response
:
response
.
raise_for_status
()
response
.
raise_for_status
()
# Iterating over the response line by line and displaying the status
# Iterating over the response line by line and displaying the status
for
line
in
response
.
iter_lines
():
for
line
in
response
.
iter_lines
():
if
line
:
if
line
:
# Parsing each line (JSON chunk) and extracting the status
chunk
=
json
.
loads
(
line
)
chunk
=
json
.
loads
(
line
)
if
callback
:
if
callback
:
callback
(
chunk
)
callback
(
chunk
)
else
:
else
:
print
(
f
"Status:
{
chunk
.
get
(
'status'
)
}
"
)
print
(
f
"Status:
{
chunk
.
get
(
'status'
)
}
"
)
except
requests
.
exceptions
.
RequestException
as
e
:
except
Exception
as
e
:
print
(
f
"An error occurred:
{
e
}
"
)
print
(
f
"An error occurred:
{
e
}
"
)
# Pull a model from a the model registry. Cancelled pulls are resumed from where they left off, and multiple
# Pull a model from a the model registry. Cancelled pulls are resumed from where they left off, and multiple
# calls to will share the same download progress. Use the callback function to override the default handler.
# calls to will share the same download progress. Use the callback function to override the default handler.
def
pull
(
model_name
,
insecure
=
False
,
callback
=
None
):
def
pull
(
model_name
,
insecure
=
False
,
callback
=
None
):
...
@@ -222,5 +282,3 @@ def heartbeat():
...
@@ -222,5 +282,3 @@ def heartbeat():
except
requests
.
exceptions
.
RequestException
as
e
:
except
requests
.
exceptions
.
RequestException
as
e
:
print
(
f
"An error occurred:
{
e
}
"
)
print
(
f
"An error occurred:
{
e
}
"
)
return
"Ollama is not running"
return
"Ollama is not running"
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