diff --git a/langclient/__main__.py b/langclient/__main__.py index da3dedb..8518a90 100644 --- a/langclient/__main__.py +++ b/langclient/__main__.py @@ -94,14 +94,14 @@ def interactve_chat( or _prompt_for_api_key() ) - input_name = user_name() + user = user_name() model_selected = select_language_model() - stream_chat_ = use_key(api_key)( - partial(stream_chat, model=model_selected, max_tokens=3500) - ) + stream_chat_ = use_key(api_key)(partial(stream_chat, model=model_selected)) - for _ in chat_sequence_process(chat_input(input_name), stream_chat_): + for _ in chat_sequence_process( + chat_input(user), stream_chat_, model_selected, user_name=user + ): pass diff --git a/langclient/chat_functions.py b/langclient/chat_functions.py index d56d971..dc3a066 100644 --- a/langclient/chat_functions.py +++ b/langclient/chat_functions.py @@ -35,7 +35,7 @@ def _sum_accumulated_tokens(tokens): return input_cost + output_cost -def _token_usage_stats(messages: list[Message], model: LanguageModel) -> str: +def token_usage_stats(messages: list[Message], model: LanguageModel) -> str: input_content = _filter_content_by_role(messages, "user") output_content = _filter_content_by_role(messages, "assistant") @@ -54,8 +54,11 @@ def _token_usage_stats(messages: list[Message], model: LanguageModel) -> str: usage_stats = f"{_format_token_number(tokens_messages)}/" usage_stats += f"{_format_token_number(model.max_token)}" - stats_string = f" {Fore.MAGENTA}({usage_stats}){Fore.RESET}" - stats_string += f" {Fore.GREEN}${cost_stats}{Fore.RESET}" + color_token = Fore.LIGHTBLACK_EX + color_cost = Fore.LIGHTGREEN_EX + + stats_string = f" {color_token}({usage_stats}){Fore.RESET}" + stats_string += f" {color_cost}${cost_stats}{Fore.RESET}" return stats_string @@ -65,7 +68,6 @@ def stream_chat( api_key: str, model: LanguageModel, temperature=1, - max_tokens=14505, top_p=1, frequency_penalty=0, presence_penalty=0, @@ -75,8 +77,7 @@ def stream_chat( generator: Iterable[ChatCompletionChunk] = client.chat.completions.create( model=model.name, messages=list_of_dict_messages, - temperature=temperature, - max_tokens=max_tokens, + temperature=temperature, # next parameters have no effect top_p=top_p, frequency_penalty=frequency_penalty, presence_penalty=presence_penalty, @@ -85,9 +86,13 @@ def stream_chat( deltas_content = map(lambda chunk: chunk.choices[0].delta.content, generator) - assistant_head = f"\n{Fore.CYAN}Assistant:{Fore.RESET}" - assistant_head += _token_usage_stats(messages, model) + color_assistant = Fore.BLUE + assistant_name = "Assistant" + + assistant_head = f"{color_assistant}{assistant_name}:{Fore.RESET}" + assistant_head += token_usage_stats(messages, model) + print() print(assistant_head) def _typeguard(content: str | None) -> TypeGuard[str]: diff --git a/langclient/data/models.json b/langclient/data/models.json index 9a2e99d..5183ee3 100644 --- a/langclient/data/models.json +++ b/langclient/data/models.json @@ -6,13 +6,7 @@ "cost_1kT_output": 0.0015 }, { - "name": "gpt-4-0125-preview", - "max_token": 128000, - "cost_1kT_input": 0.01, - "cost_1kT_output": 0.03 - }, - { - "name": "gpt-4-1106-preview", + "name": "gpt-4-turbo-2024-04-09", "max_token": 128000, "cost_1kT_input": 0.01, "cost_1kT_output": 0.03 diff --git a/langclient/interactive_chat_handling.py b/langclient/interactive_chat_handling.py index eeafc85..de1c6d7 100644 --- a/langclient/interactive_chat_handling.py +++ b/langclient/interactive_chat_handling.py @@ -4,7 +4,8 @@ from itertools import accumulate from functools import partial -from langclient.models import Message, Role +from langclient.models import Message, Role, LanguageModel +from langclient.chat_functions import token_usage_stats def _get_files_from_message(message: str) -> list[str]: @@ -53,7 +54,6 @@ def chat_input(user_name: str) -> Iterable[Message]: """Chat input stream.""" while True: - print(Fore.CYAN + f"{user_name}:" + Fore.RESET) input_message = input() yield _enhance_user_input(input_message) @@ -79,7 +79,11 @@ def _print_intercept(iter: Iterable): def _step_process( - previous_messages: list[Message], user_message: Message, chat_function: Callable + previous_messages: list[Message], + user_message: Message, + chat_function: Callable, + model: LanguageModel, + user_name: str, ) -> list[Message]: """Get the next step in the conversation.""" assistant_response_chunks = chat_function([*previous_messages, user_message]) @@ -88,13 +92,32 @@ def _step_process( role=Role.ASSISTANT, content="".join(_print_intercept(assistant_response_chunks)), ) + + chat_updated = [*previous_messages, user_message, assistant_response] + + user_name_color = Fore.CYAN + user_head = f"{user_name_color}{user_name}:{Fore.RESET}" + user_head += token_usage_stats(chat_updated, model) + print() print() - return [*previous_messages, user_message, assistant_response] + print(user_head) + + return chat_updated def chat_sequence_process( - user_input: Iterable[Message], chat_function: Callable + user_input: Iterable[Message], + chat_function: Callable, + model: LanguageModel, + user_name: str, ) -> Iterable[Message]: - accumulate_function = partial(_step_process, chat_function=chat_function) + accumulate_function = partial( + _step_process, chat_function=chat_function, user_name=user_name, model=model + ) + + user_name_color = Fore.CYAN + first_user_head = f"{user_name_color}{user_name}:{Fore.RESET}" + print(first_user_head) + return accumulate(user_input, accumulate_function, initial=[]) diff --git a/setup.py b/setup.py index 16e1681..8d88db7 100644 --- a/setup.py +++ b/setup.py @@ -9,7 +9,7 @@ setup( name="langclient", - version="0.4.0", + version="0.4.1", description="Simple OpenAI language repl client", author="Juan Molina Riddell", author_email="jmriddell@protonmail.ch",