-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Adding context and ollama implementation
- Loading branch information
Showing
6 changed files
with
196 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
from typing import Any, Dict, Optional, Union | ||
|
||
import copy | ||
|
||
class MCPMessage: | ||
|
||
def __init__(self, content: str, role: str): | ||
self.role = role | ||
self.content = content | ||
|
||
class MCPMessageSystem(MCPMessage): | ||
|
||
def __init__(self, system_prompt: str): | ||
super().__init__(system_prompt, role="system") | ||
|
||
class MCPMessageAssistant(MCPMessage): | ||
|
||
def __init__(self, assistant_context: str): | ||
super().__init__(assistant_context, role="assistant") | ||
|
||
class MCPMessageUser(MCPMessage): | ||
|
||
def __init__(self, user_message: str, role: Optional[str] = None): | ||
super().__init__(user_message, role if role is not None else "user") | ||
|
||
class MCPContext: | ||
|
||
def __init__(self, system_prompt: Optional[str] = None, user_query: Optional[str] = None): | ||
self.messages = [] | ||
self.query = user_query | ||
if not system_prompt is None: | ||
self.messages.append(MCPMessageSystem(system_prompt)) | ||
|
||
def add(self, message: MCPMessage): | ||
self.messages.append(message) | ||
return self | ||
|
||
def add_system(self, system_prompt: str): | ||
self.messages.append(MCPMessageSystem(system_prompt)) | ||
return self | ||
|
||
def add_assistant(self, assistant_context: str): | ||
self.messages.append(MCPMessageAssistant(assistant_context)) | ||
return self | ||
|
||
def add_user(self, user_message: str): | ||
self.messages.append(MCPMessageUser(user_message)) | ||
return self | ||
|
||
def add_query(self, user_query: str): | ||
self.query = user_query | ||
return self | ||
|
||
def spawn(self): | ||
return copy.deepcopy(self) | ||
|
||
def spawn_with(self, message: Union[MCPMessage, 'MCPContext']): | ||
clone = self.spawn() | ||
if isinstance(message, MCPMessage): | ||
clone.add(message) | ||
elif isinstance(message, MCPContext): | ||
for cmessage in message.messages: | ||
clone.add(cmessage) | ||
return clone | ||
|
||
def spawn_with_system(self, system_prompt: str): | ||
return self.spawn_with(MCPMessageSystem(system_prompt)) | ||
|
||
def spawn_with_assistant(self, assistant_context: str): | ||
return self.spawn_with(MCPMessageAssistant(assistant_context)) | ||
|
||
def spawn_with_user(self, user_message: str): | ||
return self.spawn_with(MCPMessageUser(user_message)) | ||
|
||
def spawn_with_query(self, user_query: str): | ||
return self.spawn().add_query(user_query) | ||
|
||
def all_messages(self): | ||
messages = self.messages | ||
if not self.query is None: | ||
messages.append(MCPMessageUser(self.query)) | ||
return messages | ||
|
||
def to_messages(self): | ||
message_list = [] | ||
for message in self.all_messages(): | ||
message_list.append({ | ||
"content": message.content, | ||
"role": message.role, | ||
}) | ||
return message_list |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
from typing import Any, Union, Dict, List, Optional | ||
import os | ||
from urllib.parse import urlparse | ||
import base64 | ||
|
||
from . import MCPEngine | ||
|
||
class MCPEngineOllama(MCPEngine): | ||
|
||
def __init__(self, | ||
url: str = None, | ||
**kwargs, | ||
): | ||
url = os.environ.get("OLLAMA_HOST") | ||
userinfo = None | ||
if os.environ.get("OLLAMA_PROXY_URL"): | ||
if not url is None: | ||
raise Exception("OLLAMA_PROXY_URL and OLLAMA_HOST set, please just use one") | ||
else: | ||
url = os.environ.get("OLLAMA_PROXY_URL") | ||
if url: | ||
parsed_url = urlparse(os.environ.get("OLLAMA_HOST")) | ||
if parsed_url.scheme in ["http", "https"] and parsed_url.netloc: | ||
if "@" in parsed_url.netloc: | ||
userinfo = parsed_url.netloc.split("@")[0] | ||
if parsed_url.port: | ||
netloc = f"{parsed_url.hostname}:{parsed_url.port}" | ||
else: | ||
netloc = parsed_url.hostname | ||
parsed_url = parsed_url._replace(netloc=netloc) | ||
url = parsed_url.geturl() | ||
elif parsed_url.path: | ||
url = 'http://'+parsed_url.path+'/' | ||
kwargs['host'] = url | ||
if userinfo: | ||
if not 'headers' in kwargs: | ||
kwargs['headers'] = {} | ||
auth_bytes = userinfo.encode("utf-8") | ||
auth_base64 = base64.b64encode(auth_bytes).decode("utf-8") | ||
kwargs['headers']['Authorization'] = 'Basic '+auth_base64 | ||
from ollama import Client as Ollama | ||
self.client = Ollama( | ||
**kwargs, | ||
) | ||
|
||
def get_models(self): | ||
models = [] | ||
for model in self.client.list().models: | ||
models.append(model.model) | ||
models.sort() | ||
return models | ||
|
||
def __str__(self): | ||
return f"MCP Engine Ollama {hex(id(self))}" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters