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
598d6d55
Unverified
Commit
598d6d55
authored
Jan 16, 2024
by
Michael Yang
Committed by
GitHub
Jan 16, 2024
Browse files
Merge pull request #1937 from jmorganca/mxyng/remove-client-py
remove client.py
parents
a897e833
a70262c6
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
4 additions
and
284 deletions
+4
-284
README.md
README.md
+4
-0
api/client.py
api/client.py
+0
-284
No files found.
README.md
View file @
598d6d55
...
@@ -248,6 +248,10 @@ curl http://localhost:11434/api/chat -d '{
...
@@ -248,6 +248,10 @@ curl http://localhost:11434/api/chat -d '{
See the
[
API documentation
](
./docs/api.md
)
for all endpoints.
See the
[
API documentation
](
./docs/api.md
)
for all endpoints.
## Integrations
-
[
ollama-python
](
https://github.com/jmorganca/ollama-python
)
## Community Integrations
## Community Integrations
### Web & Desktop
### Web & Desktop
...
...
api/client.py
deleted
100644 → 0
View file @
a897e833
import
os
import
json
import
requests
import
os
import
hashlib
import
json
from
pathlib
import
Path
BASE_URL
=
os
.
environ
.
get
(
'OLLAMA_HOST'
,
'http://localhost:11434'
)
# Generate a response for a given prompt with a provided model. This is a streaming endpoint, so will be a series of responses.
# The final response object will include statistics and additional data from the request. Use the callback function to override
# the default handler.
def
generate
(
model_name
,
prompt
,
system
=
None
,
template
=
None
,
format
=
""
,
context
=
None
,
options
=
None
,
callback
=
None
):
try
:
url
=
f
"
{
BASE_URL
}
/api/generate"
payload
=
{
"model"
:
model_name
,
"prompt"
:
prompt
,
"system"
:
system
,
"template"
:
template
,
"context"
:
context
,
"options"
:
options
,
"format"
:
format
,
}
# Remove keys with None values
payload
=
{
k
:
v
for
k
,
v
in
payload
.
items
()
if
v
is
not
None
}
with
requests
.
post
(
url
,
json
=
payload
,
stream
=
True
)
as
response
:
response
.
raise_for_status
()
# Creating a variable to hold the context history of the final chunk
final_context
=
None
# Variable to hold concatenated response strings if no callback is provided
full_response
=
""
# Iterating over the response line by line and displaying the details
for
line
in
response
.
iter_lines
():
if
line
:
# Parsing each line (JSON chunk) and extracting the details
chunk
=
json
.
loads
(
line
)
# If a callback function is provided, call it with the chunk
if
callback
:
callback
(
chunk
)
else
:
# If this is not the last chunk, add the "response" field value to full_response and print it
if
not
chunk
.
get
(
"done"
):
response_piece
=
chunk
.
get
(
"response"
,
""
)
full_response
+=
response_piece
print
(
response_piece
,
end
=
""
,
flush
=
True
)
# Check if it's the last chunk (done is true)
if
chunk
.
get
(
"done"
):
final_context
=
chunk
.
get
(
"context"
)
# Return the full response and the final context
return
full_response
,
final_context
except
requests
.
exceptions
.
RequestException
as
e
:
print
(
f
"An error occurred:
{
e
}
"
)
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.
def
create
(
model_name
,
filename
,
callback
=
None
):
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"
payload
=
{
"name"
:
model_name
,
"modelfile"
:
modelfile_content
}
# 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
:
response
.
raise_for_status
()
# Iterating over the response line by line and displaying the status
for
line
in
response
.
iter_lines
():
if
line
:
chunk
=
json
.
loads
(
line
)
if
callback
:
callback
(
chunk
)
else
:
print
(
f
"Status:
{
chunk
.
get
(
'status'
)
}
"
)
except
Exception
as
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
# 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
):
try
:
url
=
f
"
{
BASE_URL
}
/api/pull"
payload
=
{
"name"
:
model_name
,
"insecure"
:
insecure
}
# 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
:
response
.
raise_for_status
()
# Iterating over the response line by line and displaying the details
for
line
in
response
.
iter_lines
():
if
line
:
# Parsing each line (JSON chunk) and extracting the details
chunk
=
json
.
loads
(
line
)
# If a callback function is provided, call it with the chunk
if
callback
:
callback
(
chunk
)
else
:
# Print the status message directly to the console
print
(
chunk
.
get
(
'status'
,
''
),
end
=
''
,
flush
=
True
)
# If there's layer data, you might also want to print that (adjust as necessary)
if
'digest'
in
chunk
:
print
(
f
" - Digest:
{
chunk
[
'digest'
]
}
"
,
end
=
''
,
flush
=
True
)
print
(
f
" - Total:
{
chunk
[
'total'
]
}
"
,
end
=
''
,
flush
=
True
)
print
(
f
" - Completed:
{
chunk
[
'completed'
]
}
"
,
end
=
'
\n
'
,
flush
=
True
)
else
:
print
()
except
requests
.
exceptions
.
RequestException
as
e
:
print
(
f
"An error occurred:
{
e
}
"
)
# Push a model to the model registry. Use the callback function to override the default handler.
def
push
(
model_name
,
insecure
=
False
,
callback
=
None
):
try
:
url
=
f
"
{
BASE_URL
}
/api/push"
payload
=
{
"name"
:
model_name
,
"insecure"
:
insecure
}
# 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
:
response
.
raise_for_status
()
# Iterating over the response line by line and displaying the details
for
line
in
response
.
iter_lines
():
if
line
:
# Parsing each line (JSON chunk) and extracting the details
chunk
=
json
.
loads
(
line
)
# If a callback function is provided, call it with the chunk
if
callback
:
callback
(
chunk
)
else
:
# Print the status message directly to the console
print
(
chunk
.
get
(
'status'
,
''
),
end
=
''
,
flush
=
True
)
# If there's layer data, you might also want to print that (adjust as necessary)
if
'digest'
in
chunk
:
print
(
f
" - Digest:
{
chunk
[
'digest'
]
}
"
,
end
=
''
,
flush
=
True
)
print
(
f
" - Total:
{
chunk
[
'total'
]
}
"
,
end
=
''
,
flush
=
True
)
print
(
f
" - Completed:
{
chunk
[
'completed'
]
}
"
,
end
=
'
\n
'
,
flush
=
True
)
else
:
print
()
except
requests
.
exceptions
.
RequestException
as
e
:
print
(
f
"An error occurred:
{
e
}
"
)
# List models that are available locally.
def
list
():
try
:
response
=
requests
.
get
(
f
"
{
BASE_URL
}
/api/tags"
)
response
.
raise_for_status
()
data
=
response
.
json
()
models
=
data
.
get
(
'models'
,
[])
return
models
except
requests
.
exceptions
.
RequestException
as
e
:
print
(
f
"An error occurred:
{
e
}
"
)
return
None
# Copy a model. Creates a model with another name from an existing model.
def
copy
(
source
,
destination
):
try
:
# Create the JSON payload
payload
=
{
"source"
:
source
,
"destination"
:
destination
}
response
=
requests
.
post
(
f
"
{
BASE_URL
}
/api/copy"
,
json
=
payload
)
response
.
raise_for_status
()
# If the request was successful, return a message indicating that the copy was successful
return
"Copy successful"
except
requests
.
exceptions
.
RequestException
as
e
:
print
(
f
"An error occurred:
{
e
}
"
)
return
None
# Delete a model and its data.
def
delete
(
model_name
):
try
:
url
=
f
"
{
BASE_URL
}
/api/delete"
payload
=
{
"name"
:
model_name
}
response
=
requests
.
delete
(
url
,
json
=
payload
)
response
.
raise_for_status
()
return
"Delete successful"
except
requests
.
exceptions
.
RequestException
as
e
:
print
(
f
"An error occurred:
{
e
}
"
)
return
None
# Show info about a model.
def
show
(
model_name
):
try
:
url
=
f
"
{
BASE_URL
}
/api/show"
payload
=
{
"name"
:
model_name
}
response
=
requests
.
post
(
url
,
json
=
payload
)
response
.
raise_for_status
()
# Parse the JSON response and return it
data
=
response
.
json
()
return
data
except
requests
.
exceptions
.
RequestException
as
e
:
print
(
f
"An error occurred:
{
e
}
"
)
return
None
def
heartbeat
():
try
:
url
=
f
"
{
BASE_URL
}
/"
response
=
requests
.
head
(
url
)
response
.
raise_for_status
()
return
"Ollama is running"
except
requests
.
exceptions
.
RequestException
as
e
:
print
(
f
"An error occurred:
{
e
}
"
)
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