mirror of https://github.com/ollama/ollama.git
				
				
				
			DRAFT: add a simple python client to access ollama (#522)
This commit is contained in:
		
							parent
							
								
									ccc3e9ac6d
								
							
						
					
					
						commit
						8efbc5df55
					
				|  | @ -0,0 +1,225 @@ | |||
| import os | ||||
| import json | ||||
| import requests | ||||
| 
 | ||||
| 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, 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 | ||||
|         } | ||||
|          | ||||
|         # 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 model from a Modelfile. Use the callback function to override the default handler. | ||||
| def create(model_name, model_path, callback=None): | ||||
|     try: | ||||
|         url = f"{BASE_URL}/api/create" | ||||
|         payload = {"name": model_name, "path": model_path} | ||||
|          | ||||
|         # 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: | ||||
|                     # Parsing each line (JSON chunk) and extracting the status | ||||
|                     chunk = json.loads(line) | ||||
| 
 | ||||
|                     if callback: | ||||
|                         callback(chunk) | ||||
|                     else: | ||||
|                         print(f"Status: {chunk.get('status')}") | ||||
|     except requests.exceptions.RequestException 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" | ||||
| 
 | ||||
| 
 | ||||
		Loading…
	
		Reference in New Issue