import argparse import os import time if os.getenv('STRAWBERRY_VERSION', '1') == '1' or os.getenv('STRAWBERRY_VERSION') is None: from src.open_strawberry import get_defaults, manage_conversation elif os.getenv('STRAWBERRY_VERSION', '2') == '2': from src.open_strawberry2 import get_defaults, manage_conversation else: raise ValueError("STRAWBERRY_VERSION not set correctly") def parse_arguments(model, system_prompt, next_prompts, num_turns, show_next, final_prompt, num_turns_final_mod, show_cot, verbose): parser = argparse.ArgumentParser(description="Open Strawberry Conversation Manager") parser.add_argument("--show_next", action="store_true", default=show_next, help="Show all messages") parser.add_argument("--verbose", action="store_true", default=verbose, help="Show usage information") parser.add_argument("--system_prompt", type=str, default=system_prompt, help="Custom system prompt") parser.add_argument("--num_turns_final_mod", type=int, default=num_turns_final_mod, help="Number of turns before final prompt") parser.add_argument("--num_turns", type=int, default=num_turns, help="Number of turns before pausing for continuation") parser.add_argument("--model", type=str, default=model, help="Model to use for conversation") parser.add_argument("--initial_prompt", type=str, default='', help="Initial prompt. If empty, then ask user.") parser.add_argument("--expected_answer", type=str, default='', help="Expected answer. If empty, then ignore.") parser.add_argument("--next_prompts", type=str, nargs="+", default=next_prompts, help="Next prompts") parser.add_argument("--final_prompt", type=str, default=final_prompt, help="Final prompt") parser.add_argument("--temperature", type=float, default=0.3, help="Temperature for the model") parser.add_argument("--max_tokens", type=int, default=1024, help="Maximum tokens for the model") parser.add_argument("--seed", type=int, default=0, help="Random seed, 0 means random seed") parser.add_argument("--show_cot", type=bool, default=show_cot, help="Whether to show detailed Chain of Thoughts") return parser.parse_args() def go_cli(): (model, system_prompt, initial_prompt, expected_answer, next_prompts, num_turns, show_next, final_prompt, temperature, max_tokens, num_turns_final_mod, show_cot, verbose) = get_defaults() args = parse_arguments(model, system_prompt, next_prompts, num_turns, show_next, final_prompt, num_turns_final_mod, show_cot, verbose) if args.initial_prompt == '': initial_prompt_query = input("Enter the initial prompt (hitting enter will use default initial_prompt)\n\n") if initial_prompt_query not in ['', '\n', '\r\n']: initial_prompt_chosen = initial_prompt_query else: initial_prompt_chosen = initial_prompt else: initial_prompt_chosen = args.initial_prompt generator = manage_conversation(model=args.model, system=args.system_prompt, initial_prompt=initial_prompt_chosen, next_prompts=args.next_prompts, final_prompt=args.final_prompt, num_turns_final_mod=args.num_turns_final_mod, num_turns=args.num_turns, temperature=args.temperature, max_tokens=args.max_tokens, seed=args.seed, secrets=dict(os.environ), cli_mode=True) response = '' conversation_history = [] try: step = 1 while True: chunk = next(generator) if 'role' in chunk and chunk['role'] == 'assistant': response += chunk['content'] if 'turn_title' in chunk and chunk['turn_title']: step_time = f' in time {str(int(chunk["thinking_time"]))}s' acum_time = f' in total {str(int(chunk["total_thinking_time"]))}s' extra = '\n\n' if show_cot else '' extra2 = '**' if show_cot else '' extra3 = ' ' if show_cot else '' print( f'{extra}{extra2}{extra3}Completed Step {step}: {chunk["content"]}{step_time}{acum_time}{extra3}{extra2}{extra}') step += 1 elif 'final' in chunk and chunk['final']: if '\n' in chunk['content'] or '\r' in chunk['content']: print(f'\n\nFinal Answer:\n\n {chunk["content"]}') else: print('\n\nFinal Answer:\n\n**', chunk['content'], '**\n\n') elif show_cot: print(chunk['content'], end='') if 'chat_history' in chunk: conversation_history = chunk['chat_history'] elif 'role' in chunk and chunk['role'] == 'user': if not chunk['initial'] and not show_next: if show_cot: print('\n\n') continue print('\n', end='') # finish assistant print('\nUser: ', chunk['content'], end='\n\n') print('\nAssistant:\n\n ') time.sleep(0.001) except StopIteration as e: pass if verbose: print("Conversation history:", conversation_history) if expected_answer and expected_answer in conversation_history[-1]['content']: print("\n\nGot Expected answer!") if not show_cot: print("**FULL RESPONSE:**\n\n") print(response) return response