greydgl--pentestgpt
61 行
1.9 KiB
Python
61 行
1.9 KiB
Python
import os
|
|
import traceback
|
|
import uuid
|
|
from typing import Any, Dict, List
|
|
|
|
import tiktoken
|
|
from litellm import completion
|
|
|
|
from pentestgpt.utils.chat_utils.message import (
|
|
AssistantMessage,
|
|
Message,
|
|
SystemMessage,
|
|
UserMessage,
|
|
)
|
|
|
|
|
|
def process_message(message: Message) -> Dict:
|
|
MAX_MESSAGE_LENGTH = 1048576
|
|
MAX_TOKEN_COUNT = 120000
|
|
|
|
raw_content = message.content[:MAX_MESSAGE_LENGTH]
|
|
|
|
# If the message is too long, truncate it
|
|
tokenizer = tiktoken.get_encoding("o200k_base")
|
|
token_count = len(tokenizer.encode(raw_content))
|
|
if token_count > MAX_TOKEN_COUNT:
|
|
raw_content = tokenizer.decode(tokenizer.encode(raw_content)[:MAX_TOKEN_COUNT])
|
|
|
|
if isinstance(message, UserMessage):
|
|
user_dict: Dict = {"role": "user", "content": raw_content}
|
|
return user_dict
|
|
elif isinstance(message, SystemMessage):
|
|
system_dict: Dict = {"role": "system", "content": raw_content}
|
|
return system_dict
|
|
elif isinstance(message, AssistantMessage):
|
|
assistant_dict: Dict = {"role": "assistant", "content": raw_content}
|
|
return assistant_dict
|
|
else:
|
|
raise Exception("Unknown message type")
|
|
|
|
|
|
class LLMLiteChatbot:
|
|
def __init__(self, chatbot_name: str, model_name: str):
|
|
self.chatbot_id = str(uuid.uuid4())
|
|
self.chatbot_name = chatbot_name
|
|
self.model_name = model_name
|
|
|
|
def chat(self, messages: List[Message]) -> AssistantMessage:
|
|
message_list = []
|
|
for message in messages:
|
|
message_list.append(process_message(message))
|
|
response = completion(model=self.model_name, messages=message_list)
|
|
# convert response to AssistantMessage
|
|
return AssistantMessage(response.choices[0].message.content)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
chatbot = LLMLiteChatbot("test", "gpt-4o", "you're a kind asssistant")
|
|
model_response = chatbot.chat([UserMessage("Hello")])
|
|
print(model_response.get_content())
|