awesome-ai-chat / llms.py
Tao Wei
Add application file
f26e192
import os
################################################################
# Format LLM messages
################################################################
def _format_messages(history, message=None, system=None, format='plain',
user_name='user', bot_name='assistant'):
_history = []
if format == 'openai_chat':
if system:
_history.append({'role': 'system', 'content': system})
for human, ai in history:
if human:
_history.append({'role': 'user', 'content': human})
if ai:
_history.append({'role': 'assistant', 'content': ai})
if message:
_history.append({'role': 'user', 'content': message})
return _history
elif format == 'plain':
if system:
_history.append(system)
for human, ai in history:
if human:
_history.append(f'{user_name}: {human}')
if ai:
_history.append(f'{bot_name}: {ai}')
if message:
_history.append(f'{user_name}: {message}')
_history.append(f'{bot_name}: ')
return '\n'.join(_history)
else:
raise ValueError(f"Invalid messages to format: {format}")
class bcolors:
HEADER = '\033[95m'
OKBLUE = '\033[94m'
OKCYAN = '\033[96m'
OKGREEN = '\033[92m'
WARNING = '\033[93m'
FAIL = '\033[91m'
ENDC = '\033[0m'
BOLD = '\033[1m'
UNDERLINE = '\033[4m'
def _print_messages(history, message, bot_message, system=None,
user_name='user', bot_name='assistant', format='plain', variant='primary', tag=None):
"""history is list of tuple [(user_msg, bot_msg), ...]"""
prompt = _format_messages(history, message, system=system, user_name=user_name, bot_name=bot_name, format=format)
bot_msg_color = {'primary': bcolors.OKGREEN, 'secondary': bcolors.HEADER,
'warning': bcolors.WARNING, 'error': bcolors.FAIL}.get(variant, bcolors.BOLD)
tag = f'\n:: {tag}' if tag is not None else ''
print(f'{bcolors.OKCYAN}{prompt}{bot_msg_color}{bot_message}{bcolors.WARNING}{tag}{bcolors.ENDC}')
################################################################
# LLM bot fn
################################################################
def _openai_bot_fn(message, history, **kwargs):
_kwargs = dict(temperature=kwargs.get('temperature', 0))
system = kwargs['system_prompt'] if 'system_prompt' in kwargs and kwargs['system_prompt'] else None
chat_engine = kwargs.get('chat_engine', 'gpt-3.5-turbo')
import openai
openai.api_key = os.environ["OPENAI_API_KEY"]
resp = openai.ChatCompletion.create(
model=chat_engine,
messages=_format_messages(history, message, system=system, format='openai_chat'),
**_kwargs,
)
bot_message = resp.choices[0].message.content
if 'verbose' in kwargs and kwargs['verbose']:
_print_messages(history, message, bot_message, system=system, tag=f'openai ({chat_engine})')
return bot_message
def _openai_stream_bot_fn(message, history, **kwargs):
_kwargs = dict(temperature=kwargs.get('temperature', 0))
system = kwargs['system_prompt'] if 'system_prompt' in kwargs and kwargs['system_prompt'] else None
chat_engine = kwargs.get('chat_engine', 'gpt-3.5-turbo')
import openai
openai.api_key = os.environ["OPENAI_API_KEY"]
resp = openai.ChatCompletion.create(
model=chat_engine,
messages=_format_messages(history, message, system=system, format='openai_chat'),
stream=True,
**_kwargs,
)
bot_message = ""
for _resp in resp:
if 'content' in _resp.choices[0].delta: # last resp delta is empty
bot_message += _resp.choices[0].delta.content # need to accumulate previous message
yield bot_message.strip() # accumulated message can easily be postprocessed
if 'verbose' in kwargs and kwargs['verbose']:
_print_messages(history, message, bot_message, system=system, tag=f'openai_stream ({chat_engine})')
return bot_message