From 7b754a99deb9d2f1b386a7ca074b9b3cf24f100b Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Fri, 19 Apr 2024 14:45:50 +0800 Subject: [PATCH 01/55] added features to download models from the hugging face model hub/load local hugging face model and finetune loaded model with hugging face dataset Added features to download models from hugging face model hub/load local hugging face model and finetune loaded model with hugging face dataset. Model loading and fine-tuning can happen both at the initialization stage and after the agent has been initialized (see README in `agentscope/examples/load_finetune_huggingface_model` for details). Major changes to the repo include creating the example script `load_finetune_huggingface_model`, adding a new model wrapper `HuggingFaceWrapper`, and creating a new agent type Finetune_DialogAgent. All changes are done in a new example directory `agentscope/examples/load_finetune_huggingface_model`. --- .../load_finetune_huggingface_model/README.md | 52 ++++ .../huggingface_model.py | 236 ++++++++++++++++++ .../load_finetune_huggingface_model.py | 43 ++++ 3 files changed, 331 insertions(+) create mode 100644 examples/load_finetune_huggingface_model/README.md create mode 100644 examples/load_finetune_huggingface_model/huggingface_model.py create mode 100644 examples/load_finetune_huggingface_model/load_finetune_huggingface_model.py diff --git a/examples/load_finetune_huggingface_model/README.md b/examples/load_finetune_huggingface_model/README.md new file mode 100644 index 000000000..54ae66c94 --- /dev/null +++ b/examples/load_finetune_huggingface_model/README.md @@ -0,0 +1,52 @@ +# Multi-Agent Conversation with Custom Model Loading and Fine-Tuning in AgentScope + +This example demonstrates how to load and optionally fine-tune a Hugging Face model within a multi-agent conversation setup using AgentScope. The complete code is provided in `load_finetune_huggingface_model.py`. + +## Background + +In the context of AgentScope, agents are designed to mimic user and assistant roles in a conversation. This setup allows for the integration and testing of different models from the Hugging Face Hub, enhancing their capabilities through fine-tuning with custom datasets. + +## Functionality Overview + +This example allows you to: + +- Set up a user agent and an assistant agent for interactive conversations. +- Modify the `sys_prompt` to customize the assistant agent's role. +- Terminate the conversation by entering "exit". + +## Advanced Features + +Beyond basic conversation setup, the example introduces advanced functionalities: + +- Use `dialog_agent.load_model(model_id, local_model_path)` to load a model either from the Hugging Face Model Hub or a local directory. +- Apply `dialog_agent.fine_tune(data_path)` to fine-tune the model based on your dataset. + +## Agent Initialization + +When initializing an agent, the following parameters need specification: + +- `model_id` (str): Identifier for the model on Hugging Face. +- `local_model_path` (str): Local path to the model (defaults to loading from Hugging Face if not provided). +- `data_path` (str): Path to training data (fine-tuning is skipped if not provided). +- `device` (str): The device (e.g., 'cuda', 'cpu') for model operation, defaulting to 'cuda' if available. +- `huggingface_token` (from .env file): Token required for models needing authentication from Hugging Face. + +## Tested Models + +The example is tested using specific Hugging Face models. While it is designed to be flexible, some models may require additional configuration or modification of the provided scripts. + +## Prerequisites + +Before running this example, ensure you have installed the following packages: + +- `transformers` +- `peft` +- `python-dotenv` +- `pytorch` +- `datasets` +- `trl` + +Additionally, set your Hugging Face token in the `.env` file: + +```bash +python load_finetune_huggingface_model.py diff --git a/examples/load_finetune_huggingface_model/huggingface_model.py b/examples/load_finetune_huggingface_model/huggingface_model.py new file mode 100644 index 000000000..00c444638 --- /dev/null +++ b/examples/load_finetune_huggingface_model/huggingface_model.py @@ -0,0 +1,236 @@ +from transformers import AutoModelForCausalLM, AutoTokenizer +from agentscope.agents import DialogAgent + +from agentscope.models import ModelWrapperBase, ModelResponse +from loguru import logger + +import torch +import os +from dotenv import load_dotenv, find_dotenv + +from typing import Optional + +class HuggingFaceWrapper(ModelWrapperBase): + model_type: str = "huggingface" # Unique identifier for this model wrapper + + def __init__(self, config_name, model_id, max_length=512, data_path = None, device = None, local_model_path = None, **kwargs): + super().__init__(config_name=config_name) + self.max_length = max_length # Set max_length as an attribute + self.model_id = model_id + relative_path = os.path.join(os.path.dirname(__file__), "../load_finetune_huggingface_model/.env") + dotenv_path = os.path.normpath(relative_path) + _ = load_dotenv(dotenv_path) # read local .env file + huggingface_token = os.getenv('HUGGINGFACE_TOKEN') + + self.huggingface_token = huggingface_token + if device == None: + self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') + else: + self.device = device + try: + if local_model_path == None: + self.model = AutoModelForCausalLM.from_pretrained(model_id, token = huggingface_token, device_map="auto",) + self.tokenizer = AutoTokenizer.from_pretrained(model_id, token = huggingface_token) + print("load new model") + else: + self.model = AutoModelForCausalLM.from_pretrained( + local_model_path, local_files_only=True, + device_map="auto" + ) + self.tokenizer = AutoTokenizer.from_pretrained(model_id, token = huggingface_token) + print("load local model") + + if data_path != None: + self.model = fine_tune(self.model, self.tokenizer, data_path, token = huggingface_token) + + + + except Exception as e: + logger.error(f"Failed to load model {model_id}: {e}") + raise + + def __call__(self, input, **kwargs) -> ModelResponse: + try: + # Tokenize the input text + concatenated_input = "\n".join([f"{d.get('name', 'System')}: {d['content']}" for d in input]) + input_ids = self.tokenizer.encode(f"{concatenated_input}\nAssistent: ", return_tensors='pt') + # Generate response using the model + outputs = self.model.generate(input_ids.to(self.device), max_new_tokens = self.max_length, **kwargs) + # Decode the generated tokens to a string + generated_text = self.tokenizer.decode(outputs[0][input_ids.shape[1]:], skip_special_tokens=True) + + return ModelResponse(text=generated_text, raw={'model_id': self.model_id}) + except Exception as e: + logger.error(f"Generation error: {e}") + raise + + def load_model(self, model_id, local_model_path = None): + """ + Load a new model for the agent from a local path and update the agent's model. + + Parameters: + local_model_path (str): The file path to the model to be loaded. + model_id (str): An identifier for the model on Huggingface. + """ + try: + if local_model_path == None: + self.model = AutoModelForCausalLM.from_pretrained(model_id, token = self.huggingface_token, device_map="auto",) + self.tokenizer = AutoTokenizer.from_pretrained(model_id, token = self.huggingface_token) + print("new model") + else: + self.model = AutoModelForCausalLM.from_pretrained( + local_model_path, local_files_only=True, + device_map="auto" + ) + self.tokenizer = AutoTokenizer.from_pretrained(model_id, token = self.huggingface_token) + print("local model") + + + # Optionally, log the successful model loading + logger.info(f"Successfully loaded new model '{model_id}' from '{local_model_path}'") + except Exception as e: + # Handle exceptions during model loading, such as file not found or load errors + logger.error(f"Failed to load model '{model_id}' from '{local_model_path}': {e}") + raise # Or handle error appropriately + + def fine_tune(self, data_path): + """ + Fine-tune the agent's model using data from the specified path. + + Parameters: + data_path (str): The file path to the training data. + """ + try: + self.model = fine_tune(self.model, self.tokenizer, data_path, token = self.huggingface_token) + + logger.info(f"Successfully fine-tuned model with data from '{data_path}'") + except Exception as e: + logger.error(f"Failed to fine-tune model with data from '{data_path}': {e}") + raise # Or handle the error appropriately + + +def fine_tune(model, tokenizer, data_path, token): + from datasets import load_dataset + from datetime import datetime + import os + import json + + dataset = load_dataset(data_path, token = token) + + from peft import LoraConfig + + lora_config = LoraConfig( + r=16, + lora_alpha=32, + lora_dropout=0.05, + bias="none", + task_type="CAUSAL_LM" + ) + + from peft import get_peft_model + + + + model = get_peft_model(model, lora_config) + + from trl import SFTTrainer, DataCollatorForCompletionOnlyLM + import transformers + + def formatting_prompts_func(example): + output_texts = [] + for i in range(len(example['conversations'])): + text = f"### Question: {example['conversations'][i][0]}\n ### Answer: {example['conversations'][i][1]}" + output_texts.append(text) + return output_texts + + response_template = " ### Answer:" + collator = DataCollatorForCompletionOnlyLM(response_template, tokenizer=tokenizer) + + trainer = SFTTrainer( + model, + train_dataset=dataset["train"], + eval_dataset=dataset["train"], + formatting_func=formatting_prompts_func, + data_collator=collator, + peft_config=lora_config, + args=transformers.TrainingArguments( + per_device_train_batch_size=1, + gradient_accumulation_steps=1, + gradient_checkpointing=False, + # learning_rate=2e-6, + max_steps=10, + output_dir="./", + optim="paged_adamw_8bit", + fp16=True, + # num_train_epochs=10.0, + logging_steps=1 + ), + ) + + print("fine-tuning model") + + trainer.train() + + + now = datetime.now() + time_string = now.strftime('%Y-%m-%d_%H-%M-%S') + + # Specify the filename + log_name = f"{model.config._name_or_path.split('/')[-1]}_{time_string}_log_history.json" + + relative_path = os.path.join(os.path.dirname(__file__), "../../../examples/load_finetune_huggingface_model/"+log_name) + normalized_path = os.path.normpath(relative_path) + + os.makedirs(os.path.dirname(normalized_path), exist_ok=True) + + # Writing JSON data + with open(normalized_path, 'w') as f: + json.dump(trainer.state.log_history, f) + + save_name = f"sft_{model.config._name_or_path.split('/')[-1]}_{time_string}" + relative_path = os.path.join(os.path.dirname(__file__), "../../../examples/load_finetune_huggingface_model/"+save_name) + normalized_path = os.path.normpath(relative_path) + + os.makedirs(os.path.dirname(normalized_path), exist_ok=True) + # Check if directory exists + if not os.path.exists(normalized_path): + # If not, create the directory + os.makedirs(normalized_path) + + #save model + trainer.save_model(normalized_path) + # trainer.mode.save_config(save_path) + + + return model + + +class Finetune_DialogAgent(DialogAgent): + def __init__(self, name: str, sys_prompt: str, model_config_name: str, use_memory: bool = True, memory_config: Optional[dict] = None): + super().__init__(name, sys_prompt, model_config_name, use_memory, memory_config) + + def load_model(self, model_id, local_model_path=None): + """ + Load a new model into the agent. + + Parameters: + model_id (str): The Hugging Face model ID or a custom identifier. + local_model_path (str, optional): Path to a locally saved model. + """ + if hasattr(self.model, "load_model"): + self.model.load_model(model_id, local_model_path) + else: + logger.error("The model wrapper does not support dynamic model loading.") + + def fine_tune(self, data_path): + """ + Fine-tune the agent's underlying model. + + Parameters: + data_path (str): The path to the training data. + """ + if hasattr(self.model, "fine_tune"): + self.model.fine_tune(data_path) + logger.info("Fine-tuning completed successfully.") + else: + logger.error("The model wrapper does not support fine-tuning.") diff --git a/examples/load_finetune_huggingface_model/load_finetune_huggingface_model.py b/examples/load_finetune_huggingface_model/load_finetune_huggingface_model.py new file mode 100644 index 000000000..b3a6e1b5a --- /dev/null +++ b/examples/load_finetune_huggingface_model/load_finetune_huggingface_model.py @@ -0,0 +1,43 @@ +import agentscope +from agentscope.agents.user_agent import UserAgent +from agentscope.pipelines.functional import sequentialpipeline +from huggingface_model import Finetune_DialogAgent + + +def main() -> None: + """A basic conversation demo with a custom model""" + + # Initialize AgentScope with your custom model configuration + agentscope.init( + model_configs=[ + { + "model_type": "huggingface", + "config_name": "my_custom_model", + "model_id": "google/gemma-2b-it", # Or another generative model of your choice + # "local_model_path": "/home/zhan1130/agentscope/examples/conversation_basic/sft_gemma-2b-it_2024-04-04_14-22-35", + "max_length": 128, + "device": "cuda", + # "data_path": "GAIR/lima", + }, + ], + ) + + # Init agents with the custom model + dialog_agent = Finetune_DialogAgent( + name="Assistant", + sys_prompt="You're a helpful assistant.", + model_config_name="my_custom_model", # Use your custom model config name here + ) + + dialog_agent.load_model(model_id = "google/gemma-2b-it", local_model_path = None) #load gemma-2b-it from Hugging Face + dialog_agent.fine_tune(data_path= "GAIR/lima") #fine-tune loaded model with lima dataset + + user_agent = UserAgent() + + # Start the conversation between user and assistant + x = None + while x is None or x.content != "exit": + x = sequentialpipeline([dialog_agent, user_agent], x) + +if __name__ == "__main__": + main() From ea00db040c01e4639a9c10bf7a3849236c8f8c6d Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Tue, 23 Apr 2024 16:29:16 +0800 Subject: [PATCH 02/55] added customized hyperparameters specification made customized hyperparameters specification available from `model_configs` for fine-tuning at initialization, or through `fine_tune_config` in `Finetune_DialogAgent`'s `fine_tune` method after initialization --- .../load_finetune_huggingface_model/README.md | 6 +- .../huggingface_model.py | 184 ++++++++++-------- .../load_finetune_huggingface_model.py | 25 ++- 3 files changed, 130 insertions(+), 85 deletions(-) diff --git a/examples/load_finetune_huggingface_model/README.md b/examples/load_finetune_huggingface_model/README.md index 54ae66c94..400df461f 100644 --- a/examples/load_finetune_huggingface_model/README.md +++ b/examples/load_finetune_huggingface_model/README.md @@ -21,6 +21,8 @@ Beyond basic conversation setup, the example introduces advanced functionalities - Use `dialog_agent.load_model(model_id, local_model_path)` to load a model either from the Hugging Face Model Hub or a local directory. - Apply `dialog_agent.fine_tune(data_path)` to fine-tune the model based on your dataset. +The default hyperparameters for (SFT) fine-tuning are specified in `agentscope/src/agentscope/models/huggingface_model.py`. For customized hyperparameters, specify them in `model_configs` if the model needs to be fine-tuned at initialization, or specify through `fine_tune_config` in `Finetune_DialogAgent`'s `fine_tune` method after initialization, as shown in the example script `load_finetune_huggingface_model.py`. + ## Agent Initialization When initializing an agent, the following parameters need specification: @@ -29,6 +31,7 @@ When initializing an agent, the following parameters need specification: - `local_model_path` (str): Local path to the model (defaults to loading from Hugging Face if not provided). - `data_path` (str): Path to training data (fine-tuning is skipped if not provided). - `device` (str): The device (e.g., 'cuda', 'cpu') for model operation, defaulting to 'cuda' if available. +- `fine_tune_config` (dict, Optional): A configuration dictionary for fine-tuning the model. It allows specifying hyperparameters and other training options that will be passed to the fine-tuning method. If not provided, default settings will be used. This allows for customization of the fine-tuning process to optimize model performance based on specific requirements. - `huggingface_token` (from .env file): Token required for models needing authentication from Hugging Face. ## Tested Models @@ -42,11 +45,10 @@ Before running this example, ensure you have installed the following packages: - `transformers` - `peft` - `python-dotenv` -- `pytorch` - `datasets` - `trl` Additionally, set your Hugging Face token in the `.env` file: ```bash -python load_finetune_huggingface_model.py +python load_finetune_huggingface_model.py \ No newline at end of file diff --git a/examples/load_finetune_huggingface_model/huggingface_model.py b/examples/load_finetune_huggingface_model/huggingface_model.py index 00c444638..878bf1f0c 100644 --- a/examples/load_finetune_huggingface_model/huggingface_model.py +++ b/examples/load_finetune_huggingface_model/huggingface_model.py @@ -13,10 +13,11 @@ class HuggingFaceWrapper(ModelWrapperBase): model_type: str = "huggingface" # Unique identifier for this model wrapper - def __init__(self, config_name, model_id, max_length=512, data_path = None, device = None, local_model_path = None, **kwargs): + def __init__(self, config_name, model_id, max_length=512, data_path = None, device = None, local_model_path = None, fine_tune_config=None, **kwargs): super().__init__(config_name=config_name) self.max_length = max_length # Set max_length as an attribute self.model_id = model_id + # relative_path = os.path.join(os.path.dirname(__file__), "../../../examples/load_finetune_huggingface_model/.env") relative_path = os.path.join(os.path.dirname(__file__), "../load_finetune_huggingface_model/.env") dotenv_path = os.path.normpath(relative_path) _ = load_dotenv(dotenv_path) # read local .env file @@ -41,7 +42,7 @@ def __init__(self, config_name, model_id, max_length=512, data_path = None, devi print("load local model") if data_path != None: - self.model = fine_tune(self.model, self.tokenizer, data_path, token = huggingface_token) + self.model = self.fine_tune_training(self.model, self.tokenizer, data_path, token = self.huggingface_token, fine_tune_config = fine_tune_config) @@ -93,7 +94,7 @@ def load_model(self, model_id, local_model_path = None): logger.error(f"Failed to load model '{model_id}' from '{local_model_path}': {e}") raise # Or handle error appropriately - def fine_tune(self, data_path): + def fine_tune(self, data_path, fine_tune_config=None): """ Fine-tune the agent's model using data from the specified path. @@ -101,7 +102,7 @@ def fine_tune(self, data_path): data_path (str): The file path to the training data. """ try: - self.model = fine_tune(self.model, self.tokenizer, data_path, token = self.huggingface_token) + self.model = self.fine_tune_training(self.model, self.tokenizer, data_path, token = self.huggingface_token, fine_tune_config = fine_tune_config) logger.info(f"Successfully fine-tuned model with data from '{data_path}'") except Exception as e: @@ -109,103 +110,128 @@ def fine_tune(self, data_path): raise # Or handle the error appropriately -def fine_tune(model, tokenizer, data_path, token): - from datasets import load_dataset - from datetime import datetime - import os - import json + def fine_tune_training(self, model, tokenizer, data_path, token, fine_tune_config=None): + from datasets import load_dataset + from datetime import datetime + import os + import json - dataset = load_dataset(data_path, token = token) + dataset = load_dataset(data_path, token = token) - from peft import LoraConfig + from peft import LoraConfig - lora_config = LoraConfig( - r=16, - lora_alpha=32, - lora_dropout=0.05, - bias="none", - task_type="CAUSAL_LM" - ) + lora_config_default = { + "r": 16, + "lora_alpha": 32, + "lora_dropout": 0.05, + "bias": "none", + "task_type": "CAUSAL_LM" + } - from peft import get_peft_model + if fine_tune_config is not None: + if fine_tune_config['lora_config'] is not None: + lora_config_default.update(fine_tune_config['lora_config']) - - model = get_peft_model(model, lora_config) + training_defaults = { + "per_device_train_batch_size": 1, + "gradient_accumulation_steps": 1, + "gradient_checkpointing": False, + "max_steps": 10, + "output_dir": "./", + "optim": "paged_adamw_8bit", + "fp16": True, + "logging_steps": 1, + # "learning_rate": 2e-6, + # "num_train_epochs": 10.0, + } - from trl import SFTTrainer, DataCollatorForCompletionOnlyLM - import transformers + if fine_tune_config is not None: + if fine_tune_config['training_args'] is not None: + training_defaults.update(fine_tune_config['training_args']) - def formatting_prompts_func(example): - output_texts = [] - for i in range(len(example['conversations'])): - text = f"### Question: {example['conversations'][i][0]}\n ### Answer: {example['conversations'][i][1]}" - output_texts.append(text) - return output_texts + from peft import get_peft_model - response_template = " ### Answer:" - collator = DataCollatorForCompletionOnlyLM(response_template, tokenizer=tokenizer) + + lora_config = LoraConfig(**lora_config_default) + model = get_peft_model(model, lora_config) + + from trl import SFTTrainer, DataCollatorForCompletionOnlyLM + import transformers - trainer = SFTTrainer( - model, - train_dataset=dataset["train"], - eval_dataset=dataset["train"], - formatting_func=formatting_prompts_func, - data_collator=collator, - peft_config=lora_config, - args=transformers.TrainingArguments( - per_device_train_batch_size=1, - gradient_accumulation_steps=1, - gradient_checkpointing=False, - # learning_rate=2e-6, - max_steps=10, - output_dir="./", - optim="paged_adamw_8bit", - fp16=True, - # num_train_epochs=10.0, - logging_steps=1 - ), - ) + def formatting_prompts_func(example): + output_texts = [] + for i in range(len(example['conversations'])): + text = f"### Question: {example['conversations'][i][0]}\n ### Answer: {example['conversations'][i][1]}" + output_texts.append(text) + return output_texts - print("fine-tuning model") + response_template = " ### Answer:" + collator = DataCollatorForCompletionOnlyLM(response_template, tokenizer=tokenizer) - trainer.train() + trainer_args = transformers.TrainingArguments(**training_defaults) - - now = datetime.now() - time_string = now.strftime('%Y-%m-%d_%H-%M-%S') + trainer = SFTTrainer( + model, + train_dataset=dataset["train"], + eval_dataset=dataset["train"], + formatting_func=formatting_prompts_func, + data_collator=collator, + peft_config=lora_config, + args=trainer_args, + ) - # Specify the filename - log_name = f"{model.config._name_or_path.split('/')[-1]}_{time_string}_log_history.json" + print("fine-tuning model") - relative_path = os.path.join(os.path.dirname(__file__), "../../../examples/load_finetune_huggingface_model/"+log_name) - normalized_path = os.path.normpath(relative_path) + trainer.train() + + + now = datetime.now() + time_string = now.strftime('%Y-%m-%d_%H-%M-%S') - os.makedirs(os.path.dirname(normalized_path), exist_ok=True) + # Specify the filename + log_name = f"{model.config._name_or_path.split('/')[-1]}_{time_string}_log_history.json" - # Writing JSON data - with open(normalized_path, 'w') as f: - json.dump(trainer.state.log_history, f) + relative_path = os.path.join(os.path.dirname(__file__), "../../../examples/load_finetune_huggingface_model/"+log_name) + normalized_path = os.path.normpath(relative_path) - save_name = f"sft_{model.config._name_or_path.split('/')[-1]}_{time_string}" - relative_path = os.path.join(os.path.dirname(__file__), "../../../examples/load_finetune_huggingface_model/"+save_name) - normalized_path = os.path.normpath(relative_path) + os.makedirs(os.path.dirname(normalized_path), exist_ok=True) - os.makedirs(os.path.dirname(normalized_path), exist_ok=True) - # Check if directory exists - if not os.path.exists(normalized_path): - # If not, create the directory - os.makedirs(normalized_path) + # Writing JSON data + with open(normalized_path, 'w') as f: + json.dump(trainer.state.log_history, f) - #save model - trainer.save_model(normalized_path) - # trainer.mode.save_config(save_path) + save_name = f"sft_{model.config._name_or_path.split('/')[-1]}_{time_string}" + relative_path = os.path.join(os.path.dirname(__file__), "../../../examples/load_finetune_huggingface_model/"+save_name) + normalized_path = os.path.normpath(relative_path) - - return model + os.makedirs(os.path.dirname(normalized_path), exist_ok=True) + # Check if directory exists + if not os.path.exists(normalized_path): + # If not, create the directory + os.makedirs(normalized_path) + + #save model + trainer.save_model(normalized_path) + # trainer.mode.save_config(save_path) + + + return model class Finetune_DialogAgent(DialogAgent): + """ + A dialog agent capable of fine-tuning its underlying model based on provided data. + + Inherits from DialogAgent and adds functionality for fine-tuning with custom hyperparameters. + + Parameters: + name (str): Name of the agent. + sys_prompt (str): System prompt or description of the agent's role. + model_config_name (str): The configuration name for the underlying model. + use_memory (bool, optional): Whether to use memory for the agent. Defaults to True. + memory_config (dict, Optional): Configuration for the agent's memory. Defaults to None. + """ def __init__(self, name: str, sys_prompt: str, model_config_name: str, use_memory: bool = True, memory_config: Optional[dict] = None): super().__init__(name, sys_prompt, model_config_name, use_memory, memory_config) @@ -222,7 +248,7 @@ def load_model(self, model_id, local_model_path=None): else: logger.error("The model wrapper does not support dynamic model loading.") - def fine_tune(self, data_path): + def fine_tune(self, data_path, fine_tune_config=None): """ Fine-tune the agent's underlying model. @@ -230,7 +256,7 @@ def fine_tune(self, data_path): data_path (str): The path to the training data. """ if hasattr(self.model, "fine_tune"): - self.model.fine_tune(data_path) + self.model.fine_tune(data_path, fine_tune_config) logger.info("Fine-tuning completed successfully.") else: logger.error("The model wrapper does not support fine-tuning.") diff --git a/examples/load_finetune_huggingface_model/load_finetune_huggingface_model.py b/examples/load_finetune_huggingface_model/load_finetune_huggingface_model.py index b3a6e1b5a..69965a938 100644 --- a/examples/load_finetune_huggingface_model/load_finetune_huggingface_model.py +++ b/examples/load_finetune_huggingface_model/load_finetune_huggingface_model.py @@ -8,16 +8,27 @@ def main() -> None: """A basic conversation demo with a custom model""" # Initialize AgentScope with your custom model configuration + + agentscope.init( model_configs=[ { "model_type": "huggingface", "config_name": "my_custom_model", "model_id": "google/gemma-2b-it", # Or another generative model of your choice - # "local_model_path": "/home/zhan1130/agentscope/examples/conversation_basic/sft_gemma-2b-it_2024-04-04_14-22-35", + # "local_model_path": # Specify your local model path "max_length": 128, "device": "cuda", - # "data_path": "GAIR/lima", + + # "data_path": "GAIR/lima", # Specify a Hugging Face data path if you wish to finetune the model from the start + + # fine_tune_config (Optional): Configuration for fine-tuning the model. This dictionary + # can include hyperparameters and other training options that + # will be passed to the fine-tuning method. Defaults to None. + # "fine_tune_config":{ + # "lora_config": {"r": 20, "lora_alpha": 40}, + # "training_args": {"max_steps": 20, "logging_steps": 2} + # } }, ], ) @@ -29,8 +40,14 @@ def main() -> None: model_config_name="my_custom_model", # Use your custom model config name here ) - dialog_agent.load_model(model_id = "google/gemma-2b-it", local_model_path = None) #load gemma-2b-it from Hugging Face - dialog_agent.fine_tune(data_path= "GAIR/lima") #fine-tune loaded model with lima dataset + dialog_agent.load_model(model_id = "google/gemma-2b", local_model_path = None) #load gemma-2b-it from Hugging Face + # dialog_agent.fine_tune(data_path= "GAIR/lima") #fine-tune loaded model with lima dataset with default hyperparameters + + #fine-tune loaded model with lima dataset with customized hyperparameters (`fine_tune_config` argument is optional. Defaults to None.) + dialog_agent.fine_tune("GAIR/lima", fine_tune_config ={ + "lora_config": {"r": 24, "lora_alpha": 48}, + "training_args": {"max_steps": 30, "logging_steps": 3} + }) user_agent = UserAgent() From 3e8c46839233d7f061a8f036a1c6b90484c7b034 Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Thu, 25 Apr 2024 13:15:23 +0800 Subject: [PATCH 03/55] added docstring and made changes in accordance with the comments --- .../huggingface_model.py | 115 +++++++++++++++--- .../load_finetune_huggingface_model.py | 13 +- 2 files changed, 102 insertions(+), 26 deletions(-) diff --git a/examples/load_finetune_huggingface_model/huggingface_model.py b/examples/load_finetune_huggingface_model/huggingface_model.py index 878bf1f0c..fa1b178c4 100644 --- a/examples/load_finetune_huggingface_model/huggingface_model.py +++ b/examples/load_finetune_huggingface_model/huggingface_model.py @@ -11,34 +11,48 @@ from typing import Optional class HuggingFaceWrapper(ModelWrapperBase): + """Wrapper for a Hugging Face transformer model. + + This class is responsible for loading and fine-tuning pre-trained models from the Hugging Face library. + """ model_type: str = "huggingface" # Unique identifier for this model wrapper def __init__(self, config_name, model_id, max_length=512, data_path = None, device = None, local_model_path = None, fine_tune_config=None, **kwargs): + """Initializes the HuggingFaceWrapper with the given configuration. + + Arguments: + config_name (str): Configuration name for model setup. + model_id (str): Identifier for the pre-trained model on Hugging Face. + max_length (int): Maximum sequence length for the model output per reply. Defaults to 512. + data_path (str, optional): Path to the dataset for fine-tuning the model. + device (torch.device, optional): Device to run the model on. Will default to GPU if available. + local_model_path (str, optional): Local file path to a pre-trained model. + fine_tune_config (dict, optional): Configuration for fine-tuning the model. + **kwargs: Additional keyword arguments. + """ super().__init__(config_name=config_name) self.max_length = max_length # Set max_length as an attribute self.model_id = model_id - # relative_path = os.path.join(os.path.dirname(__file__), "../../../examples/load_finetune_huggingface_model/.env") relative_path = os.path.join(os.path.dirname(__file__), "../load_finetune_huggingface_model/.env") dotenv_path = os.path.normpath(relative_path) _ = load_dotenv(dotenv_path) # read local .env file - huggingface_token = os.getenv('HUGGINGFACE_TOKEN') + self.huggingface_token = os.getenv('HUGGINGFACE_TOKEN') - self.huggingface_token = huggingface_token if device == None: self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') else: self.device = device try: if local_model_path == None: - self.model = AutoModelForCausalLM.from_pretrained(model_id, token = huggingface_token, device_map="auto",) - self.tokenizer = AutoTokenizer.from_pretrained(model_id, token = huggingface_token) + self.model = AutoModelForCausalLM.from_pretrained(model_id, token = self.huggingface_token, device_map="auto",) + self.tokenizer = AutoTokenizer.from_pretrained(model_id, token = self.huggingface_token) print("load new model") else: self.model = AutoModelForCausalLM.from_pretrained( local_model_path, local_files_only=True, device_map="auto" ) - self.tokenizer = AutoTokenizer.from_pretrained(model_id, token = huggingface_token) + self.tokenizer = AutoTokenizer.from_pretrained(model_id, token = self.huggingface_token) print("load local model") if data_path != None: @@ -51,6 +65,22 @@ def __init__(self, config_name, model_id, max_length=512, data_path = None, devi raise def __call__(self, input, **kwargs) -> ModelResponse: + """Process the input data to generate a response from the model. + + This method tokenizes the input text, generates a response using the model, + and then decodes the generated tokens into a string. + + Arguments: + input (list): A list of dictionaries where each dictionary contains 'name', 'role' and 'content' keys and their respective values. + **kwargs: Additional keyword arguments for the model's generate function. + + Returns: + ModelResponse: An object containing the generated text and raw model output. + + Raises: + Exception: If an error occurs during text generation. + """ + try: # Tokenize the input text concatenated_input = "\n".join([f"{d.get('name', 'System')}: {d['content']}" for d in input]) @@ -60,7 +90,7 @@ def __call__(self, input, **kwargs) -> ModelResponse: # Decode the generated tokens to a string generated_text = self.tokenizer.decode(outputs[0][input_ids.shape[1]:], skip_special_tokens=True) - return ModelResponse(text=generated_text, raw={'model_id': self.model_id}) + return ModelResponse(text=generated_text, raw = outputs) except Exception as e: logger.error(f"Generation error: {e}") raise @@ -69,10 +99,14 @@ def load_model(self, model_id, local_model_path = None): """ Load a new model for the agent from a local path and update the agent's model. - Parameters: + Arguments: local_model_path (str): The file path to the model to be loaded. model_id (str): An identifier for the model on Huggingface. + + Raises: + Exception: If the model cannot be loaded from the given path or identifier. Possible reasons include file not found, incorrect model ID, or network issues while fetching the model. """ + try: if local_model_path == None: self.model = AutoModelForCausalLM.from_pretrained(model_id, token = self.huggingface_token, device_map="auto",) @@ -98,8 +132,11 @@ def fine_tune(self, data_path, fine_tune_config=None): """ Fine-tune the agent's model using data from the specified path. - Parameters: - data_path (str): The file path to the training data. + Arguments: + data_path (str): The file path to the training data from Hugging Face. + + Raises: + Exception: If the fine-tuning process fails. This could be due to issues with the data path, configuration parameters, or internal errors during the training process. """ try: self.model = self.fine_tune_training(self.model, self.tokenizer, data_path, token = self.huggingface_token, fine_tune_config = fine_tune_config) @@ -111,6 +148,28 @@ def fine_tune(self, data_path, fine_tune_config=None): def fine_tune_training(self, model, tokenizer, data_path, token, fine_tune_config=None): + + """ + The actual method that handles training and fine-tuning the model on the dataset specified by the data_path using a given tokenizer. + + Arguments: + model (AutoModelForCausalLM): The pre-trained causal language model from Hugging Face's transformers. + tokenizer (AutoTokenizer): The tokenizer corresponding to the pre-trained model. + data_path (str): The file path or dataset identifier to load the dataset from Hugging Face. + token (str): The authentication token for Hugging Face. + fine_tune_config (dict, optional): Configuration options for fine-tuning the model, including LoRA and training arguments. + + Returns: + AutoModelForCausalLM: The fine-tuned language model. + + Raises: + Exception: Raises an exception if the dataset loading or fine-tuning process fails. + + Note: + This method updates the model in place and also logs the fine-tuning process. + It utilizes the LoRA configuration and custom training arguments to adapt the pre-trained model to the specific dataset. + The training log and trained model are saved in the same directory with the specific timestamp at saving time as part of the log/model fodler name. + """ from datasets import load_dataset from datetime import datetime import os @@ -224,25 +283,39 @@ class Finetune_DialogAgent(DialogAgent): A dialog agent capable of fine-tuning its underlying model based on provided data. Inherits from DialogAgent and adds functionality for fine-tuning with custom hyperparameters. - - Parameters: - name (str): Name of the agent. - sys_prompt (str): System prompt or description of the agent's role. - model_config_name (str): The configuration name for the underlying model. - use_memory (bool, optional): Whether to use memory for the agent. Defaults to True. - memory_config (dict, Optional): Configuration for the agent's memory. Defaults to None. """ + def __init__(self, name: str, sys_prompt: str, model_config_name: str, use_memory: bool = True, memory_config: Optional[dict] = None): + """ + Initializes a new Finetune_DialogAgent with specified configuration. + + Arguments: + name (str): Name of the agent. + sys_prompt (str): System prompt or description of the agent's role. + model_config_name (str): The configuration name for the underlying model. + use_memory (bool, optional): Indicates whether to utilize memory features. Defaults to True. + memory_config (dict, optional): Configuration for memory functionalities if `use_memory` is True. + + Note: + Refer to `class DialogAgent(AgentBase)` for more information. + """ + super().__init__(name, sys_prompt, model_config_name, use_memory, memory_config) + + def load_model(self, model_id, local_model_path=None): """ Load a new model into the agent. - Parameters: + Arguments: model_id (str): The Hugging Face model ID or a custom identifier. local_model_path (str, optional): Path to a locally saved model. + + Raises: + Exception: If the model loading process fails or if the model wrapper does not support dynamic loading. """ + if hasattr(self.model, "load_model"): self.model.load_model(model_id, local_model_path) else: @@ -252,9 +325,13 @@ def fine_tune(self, data_path, fine_tune_config=None): """ Fine-tune the agent's underlying model. - Parameters: + Arguments: data_path (str): The path to the training data. + + Raises: + Exception: If fine-tuning fails or if the model wrapper does not support fine-tuning. """ + if hasattr(self.model, "fine_tune"): self.model.fine_tune(data_path, fine_tune_config) logger.info("Fine-tuning completed successfully.") diff --git a/examples/load_finetune_huggingface_model/load_finetune_huggingface_model.py b/examples/load_finetune_huggingface_model/load_finetune_huggingface_model.py index 69965a938..7a38654d4 100644 --- a/examples/load_finetune_huggingface_model/load_finetune_huggingface_model.py +++ b/examples/load_finetune_huggingface_model/load_finetune_huggingface_model.py @@ -19,16 +19,15 @@ def main() -> None: # "local_model_path": # Specify your local model path "max_length": 128, "device": "cuda", - - # "data_path": "GAIR/lima", # Specify a Hugging Face data path if you wish to finetune the model from the start + "data_path": "GAIR/lima", # Specify a Hugging Face data path if you wish to finetune the model from the start # fine_tune_config (Optional): Configuration for fine-tuning the model. This dictionary # can include hyperparameters and other training options that # will be passed to the fine-tuning method. Defaults to None. - # "fine_tune_config":{ - # "lora_config": {"r": 20, "lora_alpha": 40}, - # "training_args": {"max_steps": 20, "logging_steps": 2} - # } + "fine_tune_config":{ + "lora_config": {"r": 20, "lora_alpha": 40}, + "training_args": {"max_steps": 20, "logging_steps": 2} + } }, ], ) @@ -40,7 +39,7 @@ def main() -> None: model_config_name="my_custom_model", # Use your custom model config name here ) - dialog_agent.load_model(model_id = "google/gemma-2b", local_model_path = None) #load gemma-2b-it from Hugging Face + dialog_agent.load_model(model_id = "google/gemma-2b-it", local_model_path = None) #load gemma-2b-it from Hugging Face # dialog_agent.fine_tune(data_path= "GAIR/lima") #fine-tune loaded model with lima dataset with default hyperparameters #fine-tune loaded model with lima dataset with customized hyperparameters (`fine_tune_config` argument is optional. Defaults to None.) From 10a9870b0dd70cda86ab6f2d41f79e49c68d4a04 Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Thu, 25 Apr 2024 17:15:08 +0800 Subject: [PATCH 04/55] decoupled model loading and tokenizer loading. Now can load tokenizer from local. --- .../huggingface_model.py | 112 +++++++++++------- .../load_finetune_huggingface_model.py | 9 +- 2 files changed, 75 insertions(+), 46 deletions(-) diff --git a/examples/load_finetune_huggingface_model/huggingface_model.py b/examples/load_finetune_huggingface_model/huggingface_model.py index fa1b178c4..8c48f6ec0 100644 --- a/examples/load_finetune_huggingface_model/huggingface_model.py +++ b/examples/load_finetune_huggingface_model/huggingface_model.py @@ -17,7 +17,7 @@ class HuggingFaceWrapper(ModelWrapperBase): """ model_type: str = "huggingface" # Unique identifier for this model wrapper - def __init__(self, config_name, model_id, max_length=512, data_path = None, device = None, local_model_path = None, fine_tune_config=None, **kwargs): + def __init__(self, config_name, model_id = None, max_length=512, data_path = None, device = None, local_model_path = None, local_tokenizer_path = None, fine_tune_config=None, **kwargs): """Initializes the HuggingFaceWrapper with the given configuration. Arguments: @@ -42,28 +42,13 @@ def __init__(self, config_name, model_id, max_length=512, data_path = None, devi self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') else: self.device = device - try: - if local_model_path == None: - self.model = AutoModelForCausalLM.from_pretrained(model_id, token = self.huggingface_token, device_map="auto",) - self.tokenizer = AutoTokenizer.from_pretrained(model_id, token = self.huggingface_token) - print("load new model") - else: - self.model = AutoModelForCausalLM.from_pretrained( - local_model_path, local_files_only=True, - device_map="auto" - ) - self.tokenizer = AutoTokenizer.from_pretrained(model_id, token = self.huggingface_token) - print("load local model") - - if data_path != None: - self.model = self.fine_tune_training(self.model, self.tokenizer, data_path, token = self.huggingface_token, fine_tune_config = fine_tune_config) - + + self.load_model(model_id, local_model_path = local_model_path) + self.load_tokenizer(model_id, local_tokenizer_path = local_tokenizer_path) + + if data_path != None: + self.model = self.fine_tune_training(self.model, self.tokenizer, data_path, token = self.huggingface_token, fine_tune_config = fine_tune_config) - - except Exception as e: - logger.error(f"Failed to load model {model_id}: {e}") - raise - def __call__(self, input, **kwargs) -> ModelResponse: """Process the input data to generate a response from the model. @@ -110,23 +95,47 @@ def load_model(self, model_id, local_model_path = None): try: if local_model_path == None: self.model = AutoModelForCausalLM.from_pretrained(model_id, token = self.huggingface_token, device_map="auto",) - self.tokenizer = AutoTokenizer.from_pretrained(model_id, token = self.huggingface_token) print("new model") else: self.model = AutoModelForCausalLM.from_pretrained( local_model_path, local_files_only=True, device_map="auto" ) - self.tokenizer = AutoTokenizer.from_pretrained(model_id, token = self.huggingface_token) print("local model") - - # Optionally, log the successful model loading + #log the successful model loading logger.info(f"Successfully loaded new model '{model_id}' from '{local_model_path}'") except Exception as e: # Handle exceptions during model loading, such as file not found or load errors logger.error(f"Failed to load model '{model_id}' from '{local_model_path}': {e}") raise # Or handle error appropriately + + def load_tokenizer(self, model_id, local_tokenizer_path = None): + """ + Load the tokenizer from a local path. + + Arguments: + local_tokenizer_path (str): The file path to the tokenizer to be loaded. + model_id (str): An identifier for the model on Huggingface. + + Raises: + Exception: If the tokenizer cannot be loaded from the given path or identifier. Possible reasons include file not found, incorrect model ID, or network issues while fetching the tokenizer. + """ + + try: + if local_tokenizer_path == None: + self.tokenizer = AutoTokenizer.from_pretrained(model_id, token = self.huggingface_token) + print("new tokenizer") + else: + self.tokenizer = AutoTokenizer.from_pretrained(local_tokenizer_path) + print("local tokenizer") + + #log the successful tokenizer loading + logger.info(f"Successfully loaded new tokenizer for model '{model_id}' from '{local_tokenizer_path}'") + except Exception as e: + # Handle exceptions during model loading, such as file not found or load errors + logger.error(f"Failed to load tokenizer for model '{model_id}' from '{local_tokenizer_path}': {e}") + raise # Or handle error appropriately def fine_tune(self, data_path, fine_tune_config=None): """ @@ -250,29 +259,29 @@ def formatting_prompts_func(example): # Specify the filename log_name = f"{model.config._name_or_path.split('/')[-1]}_{time_string}_log_history.json" - - relative_path = os.path.join(os.path.dirname(__file__), "../../../examples/load_finetune_huggingface_model/"+log_name) - normalized_path = os.path.normpath(relative_path) - - os.makedirs(os.path.dirname(normalized_path), exist_ok=True) + log_path = os.path.join(os.path.dirname(__file__), log_name) # Writing JSON data - with open(normalized_path, 'w') as f: + with open(log_path, 'w') as f: json.dump(trainer.state.log_history, f) - save_name = f"sft_{model.config._name_or_path.split('/')[-1]}_{time_string}" - relative_path = os.path.join(os.path.dirname(__file__), "../../../examples/load_finetune_huggingface_model/"+save_name) - normalized_path = os.path.normpath(relative_path) + - os.makedirs(os.path.dirname(normalized_path), exist_ok=True) + # os.makedirs(os.path.dirname(model_path), exist_ok=True) # Check if directory exists - if not os.path.exists(normalized_path): - # If not, create the directory - os.makedirs(normalized_path) + # if not os.path.exists(model_path): + # # If not, create the directory + # os.makedirs(model_path) #save model - trainer.save_model(normalized_path) - # trainer.mode.save_config(save_path) + model_name = f"sft_{model.config._name_or_path.split('/')[-1]}_{time_string}" + model_path = os.path.join(os.path.dirname(__file__), model_name) + trainer.save_model(model_path) + + #save tokenizer + tokenizer_name = f"sft_{model.config._name_or_path.split('/')[-1]}_tokenizer_{time_string}" + tokenizer_path = os.path.join(os.path.dirname(__file__), tokenizer_name) + tokenizer.save_pretrained(tokenizer_path) return model @@ -304,12 +313,12 @@ def __init__(self, name: str, sys_prompt: str, model_config_name: str, use_memor - def load_model(self, model_id, local_model_path=None): + def load_model(self, model_id = None, local_model_path=None): """ Load a new model into the agent. Arguments: - model_id (str): The Hugging Face model ID or a custom identifier. + model_id (str): The Hugging Face model ID or a custom identifier. Needed if loading model from Hugging Face. local_model_path (str, optional): Path to a locally saved model. Raises: @@ -321,6 +330,23 @@ def load_model(self, model_id, local_model_path=None): else: logger.error("The model wrapper does not support dynamic model loading.") + def load_tokenizer(self, model_id = None, local_tokenizer_path=None): + """ + Load a new tokenizer for the agent. + + Arguments: + model_id (str): The Hugging Face model ID or a custom identifier. Needed if loading tokenizer from Hugging Face. + local_tokenizer_path (str, optional): Path to a locally saved tokenizer. + + Raises: + Exception: If the model tokenizer process fails or if the model wrapper does not support dynamic loading. + """ + + if hasattr(self.model, "load_tokenizer"): + self.model.load_tokenizer(model_id, local_tokenizer_path) + else: + logger.error("The model wrapper does not support dynamic loading.") + def fine_tune(self, data_path, fine_tune_config=None): """ Fine-tune the agent's underlying model. diff --git a/examples/load_finetune_huggingface_model/load_finetune_huggingface_model.py b/examples/load_finetune_huggingface_model/load_finetune_huggingface_model.py index 7a38654d4..31a53c947 100644 --- a/examples/load_finetune_huggingface_model/load_finetune_huggingface_model.py +++ b/examples/load_finetune_huggingface_model/load_finetune_huggingface_model.py @@ -15,8 +15,9 @@ def main() -> None: { "model_type": "huggingface", "config_name": "my_custom_model", - "model_id": "google/gemma-2b-it", # Or another generative model of your choice - # "local_model_path": # Specify your local model path + # "model_id": "google/gemma-2b-it", # Or another generative model of your choice. Needed from loading from Hugging Face. + # "local_model_path": # Specify your local model path + # "local_tokenizer_path": # Specify your local tokenizer path "max_length": 128, "device": "cuda", "data_path": "GAIR/lima", # Specify a Hugging Face data path if you wish to finetune the model from the start @@ -39,7 +40,9 @@ def main() -> None: model_config_name="my_custom_model", # Use your custom model config name here ) - dialog_agent.load_model(model_id = "google/gemma-2b-it", local_model_path = None) #load gemma-2b-it from Hugging Face + dialog_agent.load_model(model_id = "google/gemma-2b-it", local_model_path = None) #load model gemma-2b-it from Hugging Face + dialog_agent.load_tokenizer(model_id = "google/gemma-2b-it", local_tokenizer_path = None) #load tokenizer for gemma-2b-it from Hugging Face + # dialog_agent.fine_tune(data_path= "GAIR/lima") #fine-tune loaded model with lima dataset with default hyperparameters #fine-tune loaded model with lima dataset with customized hyperparameters (`fine_tune_config` argument is optional. Defaults to None.) From 5237356c116efaaea78aa019e2bcf29aebfeea55 Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Thu, 25 Apr 2024 18:28:41 +0800 Subject: [PATCH 05/55] removed unnecessary info in README --- examples/load_finetune_huggingface_model/README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/examples/load_finetune_huggingface_model/README.md b/examples/load_finetune_huggingface_model/README.md index 400df461f..1373ed6c0 100644 --- a/examples/load_finetune_huggingface_model/README.md +++ b/examples/load_finetune_huggingface_model/README.md @@ -2,10 +2,6 @@ This example demonstrates how to load and optionally fine-tune a Hugging Face model within a multi-agent conversation setup using AgentScope. The complete code is provided in `load_finetune_huggingface_model.py`. -## Background - -In the context of AgentScope, agents are designed to mimic user and assistant roles in a conversation. This setup allows for the integration and testing of different models from the Hugging Face Hub, enhancing their capabilities through fine-tuning with custom datasets. - ## Functionality Overview This example allows you to: From a6918eb2b290fbf56fffb5c8d1c40f46822945b1 Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Thu, 25 Apr 2024 22:31:22 +0800 Subject: [PATCH 06/55] resolved all issues flagged by `pre-commit run` --- .../huggingface_model.py | 498 ++++++++++++------ .../load_finetune_huggingface_model.py | 77 ++- 2 files changed, 404 insertions(+), 171 deletions(-) diff --git a/examples/load_finetune_huggingface_model/huggingface_model.py b/examples/load_finetune_huggingface_model/huggingface_model.py index 8c48f6ec0..ceddb27b7 100644 --- a/examples/load_finetune_huggingface_model/huggingface_model.py +++ b/examples/load_finetune_huggingface_model/huggingface_model.py @@ -1,66 +1,125 @@ -from transformers import AutoModelForCausalLM, AutoTokenizer -from agentscope.agents import DialogAgent +# -*- coding: utf-8 -*- +""" +This module provides a HuggingFaceWrapper to manage +and operate Hugging Face Transformers models, enabling loading, +fine-tuning, and response generation. It includes the +Finetune_DialogAgent class, which extends DialogAgent to +enhance fine-tuning capabilities with custom hyperparameters. +Key features include handling model and tokenizer operations, +adapting to specialized datasets, and robust error management. + +Classes: +- HuggingFaceWrapper: Manages Hugging Face models and tokenizers. +- Finetune_DialogAgent: Extends DialogAgent for model fine-tuning. + +""" +from typing import Optional, List, Dict, Any +import os -from agentscope.models import ModelWrapperBase, ModelResponse +import torch +from transformers import AutoModelForCausalLM, AutoTokenizer from loguru import logger +from dotenv import load_dotenv -import torch -import os -from dotenv import load_dotenv, find_dotenv +from agentscope.agents import DialogAgent +from agentscope.models import ModelWrapperBase, ModelResponse -from typing import Optional class HuggingFaceWrapper(ModelWrapperBase): """Wrapper for a Hugging Face transformer model. - This class is responsible for loading and fine-tuning pre-trained models from the Hugging Face library. + This class is responsible for loading and fine-tuning + pre-trained models from the Hugging Face library. """ + model_type: str = "huggingface" # Unique identifier for this model wrapper - def __init__(self, config_name, model_id = None, max_length=512, data_path = None, device = None, local_model_path = None, local_tokenizer_path = None, fine_tune_config=None, **kwargs): + def __init__( + self, + config_name: str, + model_id: Optional[str] = None, + max_length: int = 512, + data_path: Optional[str] = None, + device: Optional[torch.device] = None, + local_model_path: Optional[str] = None, + local_tokenizer_path: Optional[str] = None, + fine_tune_config: Optional[Dict[str, Any]] = None, + **kwargs: Any, + ) -> None: """Initializes the HuggingFaceWrapper with the given configuration. Arguments: config_name (str): Configuration name for model setup. - model_id (str): Identifier for the pre-trained model on Hugging Face. - max_length (int): Maximum sequence length for the model output per reply. Defaults to 512. - data_path (str, optional): Path to the dataset for fine-tuning the model. - device (torch.device, optional): Device to run the model on. Will default to GPU if available. - local_model_path (str, optional): Local file path to a pre-trained model. - fine_tune_config (dict, optional): Configuration for fine-tuning the model. + model_id (str): Identifier for the pre-trained model on + Hugging Face. + max_length (int): Maximum sequence length for the + model output per reply. + Defaults to 512. + data_path (str, optional): Path to the dataset for + fine-tuning the model. + device (torch.device, optional): Device to run the model on. + Default to GPU if available. + local_model_path (str, optional): Local file path to a + pre-trained model. + fine_tune_config (dict, optional): Configuration for + fine-tuning the model. **kwargs: Additional keyword arguments. """ super().__init__(config_name=config_name) + self.model = None self.max_length = max_length # Set max_length as an attribute self.model_id = model_id - relative_path = os.path.join(os.path.dirname(__file__), "../load_finetune_huggingface_model/.env") + relative_path = os.path.join( + os.path.dirname(__file__), + "../load_finetune_huggingface_model/.env", + ) dotenv_path = os.path.normpath(relative_path) - _ = load_dotenv(dotenv_path) # read local .env file - self.huggingface_token = os.getenv('HUGGINGFACE_TOKEN') + _ = load_dotenv(dotenv_path) # read local .env file + self.huggingface_token = os.getenv("HUGGINGFACE_TOKEN") - if device == None: - self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') + if device is None: + self.device = torch.device( + "cuda" if torch.cuda.is_available() else "cpu", + ) else: self.device = device - - self.load_model(model_id, local_model_path = local_model_path) - self.load_tokenizer(model_id, local_tokenizer_path = local_tokenizer_path) - - if data_path != None: - self.model = self.fine_tune_training(self.model, self.tokenizer, data_path, token = self.huggingface_token, fine_tune_config = fine_tune_config) - - def __call__(self, input, **kwargs) -> ModelResponse: + + self.load_model(model_id, local_model_path=local_model_path) + self.load_tokenizer( + model_id, + local_tokenizer_path=local_tokenizer_path, + ) + + if data_path is not None: + self.model = self.fine_tune_training( + self.model, + self.tokenizer, + data_path, + token=self.huggingface_token, + fine_tune_config=fine_tune_config, + ) + + def __call__( + self, + inputs: List[Dict[str, Any]], + **kwargs: Any, + ) -> ModelResponse: """Process the input data to generate a response from the model. - This method tokenizes the input text, generates a response using the model, + This method tokenizes the input text, generates + a response using the model, and then decodes the generated tokens into a string. Arguments: - input (list): A list of dictionaries where each dictionary contains 'name', 'role' and 'content' keys and their respective values. - **kwargs: Additional keyword arguments for the model's generate function. + input (list): A list of dictionaries where each dictionary contains + 'name', 'role' and 'content' keys + and their respective values. + **kwargs: Additional keyword arguments for the + model's generate function. Returns: - ModelResponse: An object containing the generated text and raw model output. + ModelResponse: An object containing the generated + text and raw model output. Raises: Exception: If an error occurs during text generation. @@ -68,123 +127,229 @@ def __call__(self, input, **kwargs) -> ModelResponse: try: # Tokenize the input text - concatenated_input = "\n".join([f"{d.get('name', 'System')}: {d['content']}" for d in input]) - input_ids = self.tokenizer.encode(f"{concatenated_input}\nAssistent: ", return_tensors='pt') + concatenated_input = "\n".join( + [f"{d.get('name', 'System')}: {d['content']}" for d in inputs], + ) + input_ids = self.tokenizer.encode( + f"{concatenated_input}\nAssistent: ", + return_tensors="pt", + ) # Generate response using the model - outputs = self.model.generate(input_ids.to(self.device), max_new_tokens = self.max_length, **kwargs) + outputs = self.model.generate( + input_ids.to(self.device), + max_new_tokens=self.max_length, + **kwargs, + ) # Decode the generated tokens to a string - generated_text = self.tokenizer.decode(outputs[0][input_ids.shape[1]:], skip_special_tokens=True) - - return ModelResponse(text=generated_text, raw = outputs) + generated_text = self.tokenizer.decode( + outputs[0][input_ids.shape[1]:], + skip_special_tokens=True, + ) + return ModelResponse(text=generated_text, raw=outputs) except Exception as e: logger.error(f"Generation error: {e}") raise - def load_model(self, model_id, local_model_path = None): + def format(self, data: Any) -> Any: """ - Load a new model for the agent from a local path and update the agent's model. - + Pass-through for data formatting. Assume + data is already in the correct format. + + Arguments: + data (Any): Data to be formatted. + + Returns: + Any: The input data unchanged. + """ + return data + + def load_model( + self, + model_id: Optional[str] = None, + local_model_path: Optional[str] = None, + ) -> None: + """ + Load a new model for the agent from + a local path and update the agent's model. + Arguments: local_model_path (str): The file path to the model to be loaded. model_id (str): An identifier for the model on Huggingface. - + Raises: - Exception: If the model cannot be loaded from the given path or identifier. Possible reasons include file not found, incorrect model ID, or network issues while fetching the model. + Exception: If the model cannot be loaded from the given + path or identifier. + Possible reasons include file not found, + incorrect model ID, + or network issues while fetching the model. """ try: - if local_model_path == None: - self.model = AutoModelForCausalLM.from_pretrained(model_id, token = self.huggingface_token, device_map="auto",) + if local_model_path is None: + self.model = AutoModelForCausalLM.from_pretrained( + model_id, + token=self.huggingface_token, + device_map="auto", + ) print("new model") else: self.model = AutoModelForCausalLM.from_pretrained( - local_model_path, local_files_only=True, - device_map="auto" + local_model_path, + local_files_only=True, + device_map="auto", ) print("local model") - - #log the successful model loading - logger.info(f"Successfully loaded new model '{model_id}' from '{local_model_path}'") + + # log the successful model loading + info_msg = ( + f"Successfully loaded new model '{model_id}' from " + f"'{local_model_path}'" + ) + logger.info(info_msg) + except Exception as e: - # Handle exceptions during model loading, such as file not found or load errors - logger.error(f"Failed to load model '{model_id}' from '{local_model_path}': {e}") - raise # Or handle error appropriately - - def load_tokenizer(self, model_id, local_tokenizer_path = None): + # Handle exceptions during model loading, + # such as file not found or load errors + error_msg = ( + f"Failed to load model '{model_id}' " + f"from '{local_model_path}': {e}" + ) + + logger.error(error_msg) + + raise + + def load_tokenizer( + self, + model_id: Optional[str] = None, + local_tokenizer_path: Optional[str] = None, + ) -> None: """ Load the tokenizer from a local path. - + Arguments: - local_tokenizer_path (str): The file path to the tokenizer to be loaded. + local_tokenizer_path (str): The file path to the + tokenizer to be loaded. model_id (str): An identifier for the model on Huggingface. - + Raises: - Exception: If the tokenizer cannot be loaded from the given path or identifier. Possible reasons include file not found, incorrect model ID, or network issues while fetching the tokenizer. + Exception: If the tokenizer cannot be loaded from the + given path or identifier. Possible reasons include file not found, + incorrect model ID, or network issues while fetching the tokenizer. """ try: - if local_tokenizer_path == None: - self.tokenizer = AutoTokenizer.from_pretrained(model_id, token = self.huggingface_token) + if local_tokenizer_path is None: + self.tokenizer = AutoTokenizer.from_pretrained( + model_id, + token=self.huggingface_token, + ) print("new tokenizer") else: - self.tokenizer = AutoTokenizer.from_pretrained(local_tokenizer_path) + self.tokenizer = AutoTokenizer.from_pretrained( + local_tokenizer_path, + ) print("local tokenizer") - - #log the successful tokenizer loading - logger.info(f"Successfully loaded new tokenizer for model '{model_id}' from '{local_tokenizer_path}'") + + # log the successful tokenizer loading + logger.info( + f"Successfully loaded new tokenizer for model '{model_id}' " + f"from '{local_tokenizer_path}'", + ) + except Exception as e: - # Handle exceptions during model loading, such as file not found or load errors - logger.error(f"Failed to load tokenizer for model '{model_id}' from '{local_tokenizer_path}': {e}") - raise # Or handle error appropriately + # Handle exceptions during model loading, + # such as file not found or load errors + error_message = ( + f"Failed to load tokenizer for model '{model_id}' from " + f"'{local_tokenizer_path}': {e}" + ) + logger.error(error_message) + + raise - def fine_tune(self, data_path, fine_tune_config=None): + def fine_tune( + self, + data_path: Optional[str] = None, + fine_tune_config: Optional[Dict[str, Any]] = None, + ) -> None: """ Fine-tune the agent's model using data from the specified path. - + Arguments: - data_path (str): The file path to the training data from Hugging Face. - + data_path (str): The file path to the training + data from Hugging Face. + Raises: - Exception: If the fine-tuning process fails. This could be due to issues with the data path, configuration parameters, or internal errors during the training process. + Exception: If the fine-tuning process fails. This could be + due to issues with the data path, configuration parameters, + or internal errors during the training process. """ try: - self.model = self.fine_tune_training(self.model, self.tokenizer, data_path, token = self.huggingface_token, fine_tune_config = fine_tune_config) - - logger.info(f"Successfully fine-tuned model with data from '{data_path}'") + self.model = self.fine_tune_training( + self.model, + self.tokenizer, + data_path, + token=self.huggingface_token, + fine_tune_config=fine_tune_config, + ) + + logger.info( + f"Successfully fine-tuned model with data from '{data_path}'", + ) except Exception as e: - logger.error(f"Failed to fine-tune model with data from '{data_path}': {e}") - raise # Or handle the error appropriately - + logger.error( + f"Failed to fine-tune model with data from '{data_path}': {e}", + ) + raise - def fine_tune_training(self, model, tokenizer, data_path, token, fine_tune_config=None): - + def fine_tune_training( + self, + model: AutoModelForCausalLM, + tokenizer: AutoTokenizer, + data_path: Optional[str] = None, + token: Optional[str] = None, + fine_tune_config: Optional[Dict[str, Any]] = None, + ) -> AutoModelForCausalLM: """ - The actual method that handles training and fine-tuning the model on the dataset specified by the data_path using a given tokenizer. + The actual method that handles training and fine-tuning + the model on the dataset specified by + the data_path using a given tokenizer. Arguments: - model (AutoModelForCausalLM): The pre-trained causal language model from Hugging Face's transformers. - tokenizer (AutoTokenizer): The tokenizer corresponding to the pre-trained model. - data_path (str): The file path or dataset identifier to load the dataset from Hugging Face. + model (AutoModelForCausalLM): The pre-trained causal language model + from Hugging Face's transformers. + tokenizer (AutoTokenizer): The tokenizer corresponding to + the pre-trained model. + data_path (str): The file path or dataset identifier to load + the dataset from Hugging Face. token (str): The authentication token for Hugging Face. - fine_tune_config (dict, optional): Configuration options for fine-tuning the model, including LoRA and training arguments. + fine_tune_config (dict, optional): Configuration options for + fine-tuning the model, + including LoRA and training + arguments. Returns: AutoModelForCausalLM: The fine-tuned language model. Raises: - Exception: Raises an exception if the dataset loading or fine-tuning process fails. + Exception: Raises an exception if the dataset + loading or fine-tuning process fails. Note: - This method updates the model in place and also logs the fine-tuning process. - It utilizes the LoRA configuration and custom training arguments to adapt the pre-trained model to the specific dataset. - The training log and trained model are saved in the same directory with the specific timestamp at saving time as part of the log/model fodler name. + This method updates the model in place and also logs + the fine-tuning process. + It utilizes the LoRA configuration and custom training arguments + to adapt the pre-trained model to the specific dataset. + The training log and trained model are saved in the same + directory with the specific timestamp at saving time + as part of the log/model fodler name. """ from datasets import load_dataset from datetime import datetime - import os import json - dataset = load_dataset(data_path, token = token) + dataset = load_dataset(data_path, token=token) from peft import LoraConfig @@ -193,13 +358,12 @@ def fine_tune_training(self, model, tokenizer, data_path, token, fine_tune_confi "lora_alpha": 32, "lora_dropout": 0.05, "bias": "none", - "task_type": "CAUSAL_LM" + "task_type": "CAUSAL_LM", } if fine_tune_config is not None: - if fine_tune_config['lora_config'] is not None: - lora_config_default.update(fine_tune_config['lora_config']) - + if fine_tune_config["lora_config"] is not None: + lora_config_default.update(fine_tune_config["lora_config"]) training_defaults = { "per_device_train_batch_size": 1, @@ -215,27 +379,33 @@ def fine_tune_training(self, model, tokenizer, data_path, token, fine_tune_confi } if fine_tune_config is not None: - if fine_tune_config['training_args'] is not None: - training_defaults.update(fine_tune_config['training_args']) + if fine_tune_config["training_args"] is not None: + training_defaults.update(fine_tune_config["training_args"]) from peft import get_peft_model - lora_config = LoraConfig(**lora_config_default) model = get_peft_model(model, lora_config) from trl import SFTTrainer, DataCollatorForCompletionOnlyLM import transformers - def formatting_prompts_func(example): + def formatting_prompts_func( + example: Dict[str, List[List[str]]], + ) -> List[str]: output_texts = [] - for i in range(len(example['conversations'])): - text = f"### Question: {example['conversations'][i][0]}\n ### Answer: {example['conversations'][i][1]}" + for i in range(len(example["conversations"])): + question = f"### Question: {example['conversations'][i][0]}" + answer = f"### Answer: {example['conversations'][i][1]}" + text = f"{question}\n {answer}" output_texts.append(text) return output_texts response_template = " ### Answer:" - collator = DataCollatorForCompletionOnlyLM(response_template, tokenizer=tokenizer) + collator = DataCollatorForCompletionOnlyLM( + response_template, + tokenizer=tokenizer, + ) trainer_args = transformers.TrainingArguments(**training_defaults) @@ -253,93 +423,122 @@ def formatting_prompts_func(example): trainer.train() - now = datetime.now() - time_string = now.strftime('%Y-%m-%d_%H-%M-%S') + time_string = now.strftime("%Y-%m-%d_%H-%M-%S") # Specify the filename - log_name = f"{model.config._name_or_path.split('/')[-1]}_{time_string}_log_history.json" + log_name_temp = model.config.name_or_path.split("/")[-1] + log_name = f"{log_name_temp}_{time_string}_log_history.json" log_path = os.path.join(os.path.dirname(__file__), log_name) - # Writing JSON data - with open(log_path, 'w') as f: + # log training history + with open(log_path, "w", encoding="utf-8") as f: json.dump(trainer.state.log_history, f) - - - # os.makedirs(os.path.dirname(model_path), exist_ok=True) - # Check if directory exists - # if not os.path.exists(model_path): - # # If not, create the directory - # os.makedirs(model_path) - - #save model - model_name = f"sft_{model.config._name_or_path.split('/')[-1]}_{time_string}" + # save model + model_name = ( + f"sft_{model.config.name_or_path.split('/')[-1]}_{time_string}" + ) model_path = os.path.join(os.path.dirname(__file__), model_name) trainer.save_model(model_path) - #save tokenizer - tokenizer_name = f"sft_{model.config._name_or_path.split('/')[-1]}_tokenizer_{time_string}" - tokenizer_path = os.path.join(os.path.dirname(__file__), tokenizer_name) + # save tokenizer + tokenizer_name_temp = model.config.name_or_path.split("/")[-1] + tokenizer_name = f"sft_{tokenizer_name_temp}_tokenizer_{time_string}" + tokenizer_path = os.path.join( + os.path.dirname(__file__), + tokenizer_name, + ) tokenizer.save_pretrained(tokenizer_path) - return model class Finetune_DialogAgent(DialogAgent): """ - A dialog agent capable of fine-tuning its underlying model based on provided data. + A dialog agent capable of fine-tuning its + underlying model based on provided data. - Inherits from DialogAgent and adds functionality for fine-tuning with custom hyperparameters. + Inherits from DialogAgent and adds functionality for + fine-tuning with custom hyperparameters. """ - def __init__(self, name: str, sys_prompt: str, model_config_name: str, use_memory: bool = True, memory_config: Optional[dict] = None): + def __init__( + self, + name: str, + sys_prompt: str, + model_config_name: str, + use_memory: bool = True, + memory_config: Optional[dict] = None, + ): """ Initializes a new Finetune_DialogAgent with specified configuration. Arguments: name (str): Name of the agent. sys_prompt (str): System prompt or description of the agent's role. - model_config_name (str): The configuration name for the underlying model. - use_memory (bool, optional): Indicates whether to utilize memory features. Defaults to True. - memory_config (dict, optional): Configuration for memory functionalities if `use_memory` is True. - + model_config_name (str): The configuration name for + the underlying model. + use_memory (bool, optional): Indicates whether to utilize + memory features. Defaults to True. + memory_config (dict, optional): Configuration for memory + functionalities if + `use_memory` is True. + Note: Refer to `class DialogAgent(AgentBase)` for more information. """ - - super().__init__(name, sys_prompt, model_config_name, use_memory, memory_config) - - - def load_model(self, model_id = None, local_model_path=None): + super().__init__( + name, + sys_prompt, + model_config_name, + use_memory, + memory_config, + ) + + def load_model( + self, + model_id: Optional[str] = None, + local_model_path: Optional[str] = None, + ) -> None: """ Load a new model into the agent. Arguments: - model_id (str): The Hugging Face model ID or a custom identifier. Needed if loading model from Hugging Face. + model_id (str): The Hugging Face model ID or a custom identifier. + Needed if loading model from Hugging Face. local_model_path (str, optional): Path to a locally saved model. - + Raises: - Exception: If the model loading process fails or if the model wrapper does not support dynamic loading. + Exception: If the model loading process fails or if the + model wrapper does not support dynamic loading. """ if hasattr(self.model, "load_model"): self.model.load_model(model_id, local_model_path) else: - logger.error("The model wrapper does not support dynamic model loading.") - - def load_tokenizer(self, model_id = None, local_tokenizer_path=None): + logger.error( + "The model wrapper does not support dynamic model loading.", + ) + + def load_tokenizer( + self, + model_id: Optional[str] = None, + local_tokenizer_path: Optional[str] = None, + ) -> None: """ Load a new tokenizer for the agent. Arguments: - model_id (str): The Hugging Face model ID or a custom identifier. Needed if loading tokenizer from Hugging Face. - local_tokenizer_path (str, optional): Path to a locally saved tokenizer. - + model_id (str): The Hugging Face model ID or a custom identifier. + Needed if loading tokenizer from Hugging Face. + local_tokenizer_path (str, optional): Path to a locally saved + tokenizer. + Raises: - Exception: If the model tokenizer process fails or if the model wrapper does not support dynamic loading. + Exception: If the model tokenizer process fails or if the + model wrapper does not support dynamic loading. """ if hasattr(self.model, "load_tokenizer"): @@ -347,15 +546,20 @@ def load_tokenizer(self, model_id = None, local_tokenizer_path=None): else: logger.error("The model wrapper does not support dynamic loading.") - def fine_tune(self, data_path, fine_tune_config=None): + def fine_tune( + self, + data_path: Optional[str] = None, + fine_tune_config: Optional[Dict[str, Any]] = None, + ) -> None: """ Fine-tune the agent's underlying model. Arguments: data_path (str): The path to the training data. - + Raises: - Exception: If fine-tuning fails or if the model wrapper does not support fine-tuning. + Exception: If fine-tuning fails or if the + model wrapper does not support fine-tuning. """ if hasattr(self.model, "fine_tune"): diff --git a/examples/load_finetune_huggingface_model/load_finetune_huggingface_model.py b/examples/load_finetune_huggingface_model/load_finetune_huggingface_model.py index 31a53c947..b16f51f26 100644 --- a/examples/load_finetune_huggingface_model/load_finetune_huggingface_model.py +++ b/examples/load_finetune_huggingface_model/load_finetune_huggingface_model.py @@ -1,34 +1,50 @@ +# -*- coding: utf-8 -*- +""" +This script sets up a conversational agent using +AgentScope with a Hugging Face model. +It includes initializing a Finetune_DialogAgent, +loading and fine-tuning a pre-trained model, +and conducting a dialogue via a sequential pipeline. +The conversation continues until the user exits. +Features include model and tokenizer loading, +and fine-tuning on the GAIR/lima dataset with adjustable parameters. +""" +from huggingface_model import Finetune_DialogAgent + import agentscope from agentscope.agents.user_agent import UserAgent from agentscope.pipelines.functional import sequentialpipeline -from huggingface_model import Finetune_DialogAgent def main() -> None: """A basic conversation demo with a custom model""" # Initialize AgentScope with your custom model configuration - agentscope.init( model_configs=[ { "model_type": "huggingface", "config_name": "my_custom_model", - # "model_id": "google/gemma-2b-it", # Or another generative model of your choice. Needed from loading from Hugging Face. + # Or another generative model of your choice. + # Needed from loading from Hugging Face. + "model_id": "google/gemma-2b-it", # "local_model_path": # Specify your local model path # "local_tokenizer_path": # Specify your local tokenizer path "max_length": 128, "device": "cuda", - "data_path": "GAIR/lima", # Specify a Hugging Face data path if you wish to finetune the model from the start - - # fine_tune_config (Optional): Configuration for fine-tuning the model. This dictionary - # can include hyperparameters and other training options that - # will be passed to the fine-tuning method. Defaults to None. - "fine_tune_config":{ - "lora_config": {"r": 20, "lora_alpha": 40}, - "training_args": {"max_steps": 20, "logging_steps": 2} - } + # Specify a Hugging Face data path if you + # wish to finetune the model from the start + "data_path": "GAIR/lima", + # fine_tune_config (Optional): Configuration for + # fine-tuning the model. + # This dictionary can include hyperparameters and other + # training options that will be passed to the + # fine-tuning method. Defaults to None. + "fine_tune_config": { + "lora_config": {"r": 20, "lora_alpha": 40}, + "training_args": {"max_steps": 20, "logging_steps": 2}, + }, }, ], ) @@ -37,19 +53,31 @@ def main() -> None: dialog_agent = Finetune_DialogAgent( name="Assistant", sys_prompt="You're a helpful assistant.", - model_config_name="my_custom_model", # Use your custom model config name here + # Use your custom model config name here + model_config_name="my_custom_model", + ) + + dialog_agent.load_model( + model_id="google/gemma-2b-it", + local_model_path=None, + ) # load model gemma-2b-it from Hugging Face + dialog_agent.load_tokenizer( + model_id="google/gemma-2b-it", + local_tokenizer_path=None, + ) # load tokenizer for gemma-2b-it from Hugging Face + + # fine-tune loaded model with lima dataset with default hyperparameters + # dialog_agent.fine_tune(data_path= "GAIR/lima") + + # fine-tune loaded model with lima dataset with customized hyperparameters + # (`fine_tune_config` argument is optional. Defaults to None.) + dialog_agent.fine_tune( + "GAIR/lima", + fine_tune_config={ + "lora_config": {"r": 24, "lora_alpha": 48}, + "training_args": {"max_steps": 30, "logging_steps": 3}, + }, ) - - dialog_agent.load_model(model_id = "google/gemma-2b-it", local_model_path = None) #load model gemma-2b-it from Hugging Face - dialog_agent.load_tokenizer(model_id = "google/gemma-2b-it", local_tokenizer_path = None) #load tokenizer for gemma-2b-it from Hugging Face - - # dialog_agent.fine_tune(data_path= "GAIR/lima") #fine-tune loaded model with lima dataset with default hyperparameters - - #fine-tune loaded model with lima dataset with customized hyperparameters (`fine_tune_config` argument is optional. Defaults to None.) - dialog_agent.fine_tune("GAIR/lima", fine_tune_config ={ - "lora_config": {"r": 24, "lora_alpha": 48}, - "training_args": {"max_steps": 30, "logging_steps": 3} - }) user_agent = UserAgent() @@ -58,5 +86,6 @@ def main() -> None: while x is None or x.content != "exit": x = sequentialpipeline([dialog_agent, user_agent], x) + if __name__ == "__main__": main() From b4f4f40ae56896b73b735d84d6d0c65137ed8517 Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Thu, 25 Apr 2024 22:40:13 +0800 Subject: [PATCH 07/55] further removed info irrelevant to model loading and finetuning --- examples/load_finetune_huggingface_model/README.md | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/examples/load_finetune_huggingface_model/README.md b/examples/load_finetune_huggingface_model/README.md index 1373ed6c0..bdb6172d6 100644 --- a/examples/load_finetune_huggingface_model/README.md +++ b/examples/load_finetune_huggingface_model/README.md @@ -4,15 +4,7 @@ This example demonstrates how to load and optionally fine-tune a Hugging Face mo ## Functionality Overview -This example allows you to: - -- Set up a user agent and an assistant agent for interactive conversations. -- Modify the `sys_prompt` to customize the assistant agent's role. -- Terminate the conversation by entering "exit". - -## Advanced Features - -Beyond basic conversation setup, the example introduces advanced functionalities: +Compared to basic conversation setup, this example introduces model loading and fine-tuning features: - Use `dialog_agent.load_model(model_id, local_model_path)` to load a model either from the Hugging Face Model Hub or a local directory. - Apply `dialog_agent.fine_tune(data_path)` to fine-tune the model based on your dataset. From e33b3ded915b2c75375a27c1de27ea27c2cd1fef Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Fri, 26 Apr 2024 12:43:04 +0800 Subject: [PATCH 08/55] Update huggingface_model.py fixed issue related to `format` method --- .../huggingface_model.py | 96 ++++++++++++++----- 1 file changed, 70 insertions(+), 26 deletions(-) diff --git a/examples/load_finetune_huggingface_model/huggingface_model.py b/examples/load_finetune_huggingface_model/huggingface_model.py index ceddb27b7..1a95ce7eb 100644 --- a/examples/load_finetune_huggingface_model/huggingface_model.py +++ b/examples/load_finetune_huggingface_model/huggingface_model.py @@ -13,7 +13,7 @@ - Finetune_DialogAgent: Extends DialogAgent for model fine-tuning. """ -from typing import Optional, List, Dict, Any +from typing import Sequence, Any, Union, List, Optional, Dict import os import torch @@ -23,6 +23,8 @@ from agentscope.agents import DialogAgent from agentscope.models import ModelWrapperBase, ModelResponse +from agentscope.message import MessageBase +from agentscope.utils.tools import _convert_to_str class HuggingFaceWrapper(ModelWrapperBase): @@ -127,11 +129,11 @@ def __call__( try: # Tokenize the input text - concatenated_input = "\n".join( - [f"{d.get('name', 'System')}: {d['content']}" for d in inputs], + concatenated_input = "\n ".join( + [f"{d.get('role')}: {d['content']}" for d in inputs], ) input_ids = self.tokenizer.encode( - f"{concatenated_input}\nAssistent: ", + f"{concatenated_input}\n assistent: ", return_tensors="pt", ) # Generate response using the model @@ -150,18 +152,56 @@ def __call__( logger.error(f"Generation error: {e}") raise - def format(self, data: Any) -> Any: - """ - Pass-through for data formatting. Assume - data is already in the correct format. + def format( + self, + *args: Union[MessageBase, Sequence[MessageBase]], + ) -> List[dict]: + """A basic strategy to format the input into the required format of + Hugging Face models. - Arguments: - data (Any): Data to be formatted. + Args: + args (`Union[MessageBase, Sequence[MessageBase]]`): + The input arguments to be formatted, where each argument + should be a `Msg` object, or a list of `Msg` objects. + In distribution, placeholder is also allowed. Returns: - Any: The input data unchanged. + `List[dict]`: + The formatted messages. """ - return data + huggingface_msgs = [] + for msg in args: + if msg is None: + continue + if isinstance(msg, MessageBase): + # content shouldn't be empty string + if msg.content == "": + logger.warning( + "The content field cannot be " + "empty string. To avoid error, the empty string is " + "replaced by a blank space automatically, but the " + "model may not work as expected.", + ) + msg.content = " " + + huggingface_msg = { + "role": msg.role, + "content": _convert_to_str(msg.content), + } + + # image url + if msg.url is not None: + huggingface_msg["images"] = [msg.url] + + huggingface_msgs.append(huggingface_msg) + elif isinstance(msg, list): + huggingface_msgs.extend(self.format(*msg)) + else: + raise TypeError( + f"Invalid message type: {type(msg)}, `Msg` is expected.", + ) + + return huggingface_msgs def load_model( self, @@ -191,20 +231,22 @@ def load_model( token=self.huggingface_token, device_map="auto", ) - print("new model") + info_msg = ( + f"Successfully loaded new model '{model_id}' from " + f"Hugging Face" + ) else: self.model = AutoModelForCausalLM.from_pretrained( local_model_path, local_files_only=True, device_map="auto", ) - print("local model") + info_msg = ( + f"Successfully loaded new model '{model_id}' from " + f"'{local_model_path}'" + ) # log the successful model loading - info_msg = ( - f"Successfully loaded new model '{model_id}' from " - f"'{local_model_path}'" - ) logger.info(info_msg) except Exception as e: @@ -244,18 +286,20 @@ def load_tokenizer( model_id, token=self.huggingface_token, ) - print("new tokenizer") + # log the successful tokenizer loading + logger.info( + f"Successfully loaded new tokenizer for model " + f"'{model_id}' from Hugging Face", + ) else: self.tokenizer = AutoTokenizer.from_pretrained( local_tokenizer_path, ) - print("local tokenizer") - - # log the successful tokenizer loading - logger.info( - f"Successfully loaded new tokenizer for model '{model_id}' " - f"from '{local_tokenizer_path}'", - ) + # log the successful tokenizer loading + logger.info( + f"Successfully loaded new tokenizer for model " + f"'{model_id}' from '{local_tokenizer_path}'", + ) except Exception as e: # Handle exceptions during model loading, From 80238205d6fb9e9d63e61f8b62026cfb97d34123 Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Thu, 2 May 2024 11:49:19 +0800 Subject: [PATCH 09/55] updated according to suggestions given --- .../configs/model_configs.json | 18 ++ ...rsation_with_agent_with_finetuned_model.py | 98 +++++++++ .../finetune_dialogagent.py | 132 ++++++++++++ .../huggingface_model.py | 188 +++++------------- .../load_finetune_huggingface_model/README.md | 42 ---- .../load_finetune_huggingface_model.py | 91 --------- 6 files changed, 298 insertions(+), 271 deletions(-) create mode 100644 examples/conversation_with_agent_with_finetuned_model/configs/model_configs.json create mode 100644 examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py create mode 100644 examples/conversation_with_agent_with_finetuned_model/finetune_dialogagent.py rename examples/{load_finetune_huggingface_model => conversation_with_agent_with_finetuned_model}/huggingface_model.py (77%) delete mode 100644 examples/load_finetune_huggingface_model/README.md delete mode 100644 examples/load_finetune_huggingface_model/load_finetune_huggingface_model.py diff --git a/examples/conversation_with_agent_with_finetuned_model/configs/model_configs.json b/examples/conversation_with_agent_with_finetuned_model/configs/model_configs.json new file mode 100644 index 000000000..3b59c8318 --- /dev/null +++ b/examples/conversation_with_agent_with_finetuned_model/configs/model_configs.json @@ -0,0 +1,18 @@ +[ + { + "model_type": "huggingface", + "config_name": "my_custom_model", + + "model_id": "openlm-research/open_llama_3b_v2", + + "max_length": 128, + "device": "cuda", + + "data_path": "databricks/databricks-dolly-15k", + + "fine_tune_config": { + "lora_config": {"r": 20, "lora_alpha": 40}, + "training_args": {"max_steps": 1000, "logging_steps": 1} + } + } +] \ No newline at end of file diff --git a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py new file mode 100644 index 000000000..989e8525f --- /dev/null +++ b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +""" +This script sets up a conversational agent using +AgentScope with a Hugging Face model. +It includes initializing a Finetune_DialogAgent, +loading and fine-tuning a pre-trained model, +and conducting a dialogue via a sequential pipeline. +The conversation continues until the user exits. +Features include model and tokenizer loading, +and fine-tuning on the databricks-dolly-15k dataset with adjustable parameters. +""" +from finetune_dialogagent import Finetune_DialogAgent + +import agentscope +from agentscope.agents.user_agent import UserAgent +from agentscope.pipelines.functional import sequentialpipeline + + +def main() -> None: + """A basic conversation demo with a custom model""" + + # Initialize AgentScope with your custom model configuration + + # agentscope.init( + # model_configs=[ + # { + # "model_type": "huggingface", + # "config_name": "my_custom_model", + # # Or another generative model of your choice. + # # Needed from loading from Hugging Face. + # "model_id": "openlm-research/open_llama_3b_v2", + # # "local_model_path": # Specify your local model path + # # "local_tokenizer_path": # Specify your local tokenizer path + # "max_length": 128, + # "device": "cuda", + # # Specify a Hugging Face data path if you + # # wish to finetune the model from the start + # "data_path": "databricks/databricks-dolly-15k", + # # fine_tune_config (Optional): Configuration for + # # fine-tuning the model. + # # This dictionary can include hyperparameters and other + # # training options that will be passed to the + # # fine-tuning method. Defaults to None. + # # `lora_config` and `training_args` follow + # # the standard lora and sfttrainer fields. + # "fine_tune_config": { + # "lora_config": {"r": 20, "lora_alpha": 40}, + # "training_args": {"max_steps": 1000, "logging_steps": 1}, + # }, + # }, + # ], + # ) + + # alternatively can load `model_configs` from json file + agentscope.init( + model_configs="./configs/model_configs.json", + ) + + # Init agents with the custom model + dialog_agent = Finetune_DialogAgent( + name="Assistant", + sys_prompt="You're a helpful assistant.", + # Use your custom model config name here + model_config_name="my_custom_model", + ) + + dialog_agent.load_model( + model_id="openlm-research/open_llama_3b_v2", + local_model_path=None, + ) # load model gemma-2b-it from Hugging Face + dialog_agent.load_tokenizer( + model_id="openlm-research/open_llama_3b_v2", + local_tokenizer_path=None, + ) # load tokenizer for gemma-2b-it from Hugging Face + + # fine-tune loaded model with databricks-dolly-15k dataset with default hyperparameters + dialog_agent.fine_tune(data_path="databricks/databricks-dolly-15k") + + # fine-tune loaded model with databricks-dolly-15k dataset with customized hyperparameters + # (`fine_tune_config` argument is optional. Defaults to None.) + dialog_agent.fine_tune( + "databricks/databricks-dolly-15k", + fine_tune_config={ + "lora_config": {"r": 24, "lora_alpha": 48}, + "training_args": {"max_steps": 30, "logging_steps": 3}, + }, + ) + + user_agent = UserAgent() + + # Start the conversation between user and assistant + x = None + while x is None or x.content != "exit": + x = sequentialpipeline([dialog_agent, user_agent], x) + + +if __name__ == "__main__": + main() diff --git a/examples/conversation_with_agent_with_finetuned_model/finetune_dialogagent.py b/examples/conversation_with_agent_with_finetuned_model/finetune_dialogagent.py new file mode 100644 index 000000000..1059cc99e --- /dev/null +++ b/examples/conversation_with_agent_with_finetuned_model/finetune_dialogagent.py @@ -0,0 +1,132 @@ +# -*- coding: utf-8 -*- +""" +This module provides the Finetune_DialogAgent class, +which extends DialogAgent to enhance fine-tuning +capabilities with custom hyperparameters. +""" +from typing import Sequence, Any, Union, List, Optional, Dict +import os + +import torch +from transformers import AutoModelForCausalLM, AutoTokenizer +from loguru import logger +from dotenv import load_dotenv + +from agentscope.agents import DialogAgent +from agentscope.models import ModelWrapperBase, ModelResponse +from agentscope.message import MessageBase +from agentscope.utils.tools import _convert_to_str + +class Finetune_DialogAgent(DialogAgent): + """ + A dialog agent capable of fine-tuning its + underlying model based on provided data. + + Inherits from DialogAgent and adds functionality for + fine-tuning with custom hyperparameters. + """ + + def __init__( + self, + name: str, + sys_prompt: str, + model_config_name: str, + use_memory: bool = True, + memory_config: Optional[dict] = None, + ): + """ + Initializes a new Finetune_DialogAgent with specified configuration. + + Arguments: + name (str): Name of the agent. + sys_prompt (str): System prompt or description of the agent's role. + model_config_name (str): The configuration name for + the underlying model. + use_memory (bool, optional): Indicates whether to utilize + memory features. Defaults to True. + memory_config (dict, optional): Configuration for memory + functionalities if + `use_memory` is True. + + Note: + Refer to `class DialogAgent(AgentBase)` for more information. + """ + + super().__init__( + name, + sys_prompt, + model_config_name, + use_memory, + memory_config, + ) + + def load_model( + self, + model_id: Optional[str] = None, + local_model_path: Optional[str] = None, + ) -> None: + """ + Load a new model into the agent. + + Arguments: + model_id (str): The Hugging Face model ID or a custom identifier. + Needed if loading model from Hugging Face. + local_model_path (str, optional): Path to a locally saved model. + + Raises: + Exception: If the model loading process fails or if the + model wrapper does not support dynamic loading. + """ + + if hasattr(self.model, "load_model"): + self.model.load_model(model_id, local_model_path) + else: + logger.error( + "The model wrapper does not support dynamic model loading.", + ) + + def load_tokenizer( + self, + model_id: Optional[str] = None, + local_tokenizer_path: Optional[str] = None, + ) -> None: + """ + Load a new tokenizer for the agent. + + Arguments: + model_id (str): The Hugging Face model ID or a custom identifier. + Needed if loading tokenizer from Hugging Face. + local_tokenizer_path (str, optional): Path to a locally saved + tokenizer. + + Raises: + Exception: If the model tokenizer process fails or if the + model wrapper does not support dynamic loading. + """ + + if hasattr(self.model, "load_tokenizer"): + self.model.load_tokenizer(model_id, local_tokenizer_path) + else: + logger.error("The model wrapper does not support dynamic loading.") + + def fine_tune( + self, + data_path: Optional[str] = None, + fine_tune_config: Optional[Dict[str, Any]] = None, + ) -> None: + """ + Fine-tune the agent's underlying model. + + Arguments: + data_path (str): The path to the training data. + + Raises: + Exception: If fine-tuning fails or if the + model wrapper does not support fine-tuning. + """ + + if hasattr(self.model, "fine_tune"): + self.model.fine_tune(data_path, fine_tune_config) + logger.info("Fine-tuning completed successfully.") + else: + logger.error("The model wrapper does not support fine-tuning.") diff --git a/examples/load_finetune_huggingface_model/huggingface_model.py b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py similarity index 77% rename from examples/load_finetune_huggingface_model/huggingface_model.py rename to examples/conversation_with_agent_with_finetuned_model/huggingface_model.py index 1a95ce7eb..b5c59a4af 100644 --- a/examples/load_finetune_huggingface_model/huggingface_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py @@ -2,16 +2,9 @@ """ This module provides a HuggingFaceWrapper to manage and operate Hugging Face Transformers models, enabling loading, -fine-tuning, and response generation. It includes the -Finetune_DialogAgent class, which extends DialogAgent to -enhance fine-tuning capabilities with custom hyperparameters. +fine-tuning, and response generation. Key features include handling model and tokenizer operations, adapting to specialized datasets, and robust error management. - -Classes: -- HuggingFaceWrapper: Manages Hugging Face models and tokenizers. -- Finetune_DialogAgent: Extends DialogAgent for model fine-tuning. - """ from typing import Sequence, Any, Union, List, Optional, Dict import os @@ -73,7 +66,7 @@ def __init__( self.model_id = model_id relative_path = os.path.join( os.path.dirname(__file__), - "../load_finetune_huggingface_model/.env", + "../conversation_with_agent_with_finetuned_model/.env", ) dotenv_path = os.path.normpath(relative_path) _ = load_dotenv(dotenv_path) # read local .env file @@ -144,7 +137,7 @@ def __call__( ) # Decode the generated tokens to a string generated_text = self.tokenizer.decode( - outputs[0][input_ids.shape[1]:], + outputs[0][input_ids.shape[1] :], # noqa: E203 skip_special_tokens=True, ) return ModelResponse(text=generated_text, raw=outputs) @@ -291,6 +284,7 @@ def load_tokenizer( f"Successfully loaded new tokenizer for model " f"'{model_id}' from Hugging Face", ) + else: self.tokenizer = AutoTokenizer.from_pretrained( local_tokenizer_path, @@ -300,6 +294,7 @@ def load_tokenizer( f"Successfully loaded new tokenizer for model " f"'{model_id}' from '{local_tokenizer_path}'", ) + self.tokenizer.add_special_tokens({"pad_token": "[PAD]"}) except Exception as e: # Handle exceptions during model loading, @@ -394,6 +389,7 @@ def fine_tune_training( import json dataset = load_dataset(data_path, token=token) + dataset = dataset["train"].train_test_split(test_size=0.1) from peft import LoraConfig @@ -406,24 +402,25 @@ def fine_tune_training( } if fine_tune_config is not None: - if fine_tune_config["lora_config"] is not None: + if fine_tune_config.get("lora_config") is not None: lora_config_default.update(fine_tune_config["lora_config"]) training_defaults = { "per_device_train_batch_size": 1, - "gradient_accumulation_steps": 1, + # "gradient_accumulation_steps": 1, "gradient_checkpointing": False, - "max_steps": 10, + # "max_steps": 10, + "num_train_epochs": 10, "output_dir": "./", "optim": "paged_adamw_8bit", "fp16": True, "logging_steps": 1, - # "learning_rate": 2e-6, + "learning_rate": 1e-5, # "num_train_epochs": 10.0, } if fine_tune_config is not None: - if fine_tune_config["training_args"] is not None: + if fine_tune_config.get("training_args") is not None: training_defaults.update(fine_tune_config["training_args"]) from peft import get_peft_model @@ -445,25 +442,53 @@ def formatting_prompts_func( output_texts.append(text) return output_texts - response_template = " ### Answer:" - collator = DataCollatorForCompletionOnlyLM( - response_template, - tokenizer=tokenizer, - ) + def formatting_func(example): + if example.get("context", "") != "": + input_prompt = ( + f"Below is an instruction that describes a task, " + f"paired with an input that provides further context. " + f"Write a response that appropriately " + f"completes the request.\n\n" + f"### Instruction:\n" + f"{example['instruction']}\n\n" + f"### Input: \n" + f"{example['context']}\n\n" + f"### Response: \n" + f"{example['response']}" + ) + + else: + input_prompt = ( + f"Below is an instruction that describes a task. " + "Write a response that appropriately " + f"completes the request.\n\n" + "### Instruction:\n" + f"{example['instruction']}\n\n" + f"### Response:\n" + f"{example['response']}" + ) + + return {"text": input_prompt} + + formatted_dataset = dataset.map(formatting_func) trainer_args = transformers.TrainingArguments(**training_defaults) trainer = SFTTrainer( model, - train_dataset=dataset["train"], - eval_dataset=dataset["train"], - formatting_func=formatting_prompts_func, - data_collator=collator, + train_dataset=formatted_dataset["train"], + eval_dataset=formatted_dataset["test"], + # formatting_func=formatting_prompts_func, + # data_collator=collator, peft_config=lora_config, args=trainer_args, + dataset_text_field="text", + max_seq_length=512, ) - print("fine-tuning model") + logger.info( + "fine-tuning model", + ) trainer.train() @@ -498,116 +523,3 @@ def formatting_prompts_func( return model -class Finetune_DialogAgent(DialogAgent): - """ - A dialog agent capable of fine-tuning its - underlying model based on provided data. - - Inherits from DialogAgent and adds functionality for - fine-tuning with custom hyperparameters. - """ - - def __init__( - self, - name: str, - sys_prompt: str, - model_config_name: str, - use_memory: bool = True, - memory_config: Optional[dict] = None, - ): - """ - Initializes a new Finetune_DialogAgent with specified configuration. - - Arguments: - name (str): Name of the agent. - sys_prompt (str): System prompt or description of the agent's role. - model_config_name (str): The configuration name for - the underlying model. - use_memory (bool, optional): Indicates whether to utilize - memory features. Defaults to True. - memory_config (dict, optional): Configuration for memory - functionalities if - `use_memory` is True. - - Note: - Refer to `class DialogAgent(AgentBase)` for more information. - """ - - super().__init__( - name, - sys_prompt, - model_config_name, - use_memory, - memory_config, - ) - - def load_model( - self, - model_id: Optional[str] = None, - local_model_path: Optional[str] = None, - ) -> None: - """ - Load a new model into the agent. - - Arguments: - model_id (str): The Hugging Face model ID or a custom identifier. - Needed if loading model from Hugging Face. - local_model_path (str, optional): Path to a locally saved model. - - Raises: - Exception: If the model loading process fails or if the - model wrapper does not support dynamic loading. - """ - - if hasattr(self.model, "load_model"): - self.model.load_model(model_id, local_model_path) - else: - logger.error( - "The model wrapper does not support dynamic model loading.", - ) - - def load_tokenizer( - self, - model_id: Optional[str] = None, - local_tokenizer_path: Optional[str] = None, - ) -> None: - """ - Load a new tokenizer for the agent. - - Arguments: - model_id (str): The Hugging Face model ID or a custom identifier. - Needed if loading tokenizer from Hugging Face. - local_tokenizer_path (str, optional): Path to a locally saved - tokenizer. - - Raises: - Exception: If the model tokenizer process fails or if the - model wrapper does not support dynamic loading. - """ - - if hasattr(self.model, "load_tokenizer"): - self.model.load_tokenizer(model_id, local_tokenizer_path) - else: - logger.error("The model wrapper does not support dynamic loading.") - - def fine_tune( - self, - data_path: Optional[str] = None, - fine_tune_config: Optional[Dict[str, Any]] = None, - ) -> None: - """ - Fine-tune the agent's underlying model. - - Arguments: - data_path (str): The path to the training data. - - Raises: - Exception: If fine-tuning fails or if the - model wrapper does not support fine-tuning. - """ - - if hasattr(self.model, "fine_tune"): - self.model.fine_tune(data_path, fine_tune_config) - logger.info("Fine-tuning completed successfully.") - else: - logger.error("The model wrapper does not support fine-tuning.") diff --git a/examples/load_finetune_huggingface_model/README.md b/examples/load_finetune_huggingface_model/README.md deleted file mode 100644 index bdb6172d6..000000000 --- a/examples/load_finetune_huggingface_model/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# Multi-Agent Conversation with Custom Model Loading and Fine-Tuning in AgentScope - -This example demonstrates how to load and optionally fine-tune a Hugging Face model within a multi-agent conversation setup using AgentScope. The complete code is provided in `load_finetune_huggingface_model.py`. - -## Functionality Overview - -Compared to basic conversation setup, this example introduces model loading and fine-tuning features: - -- Use `dialog_agent.load_model(model_id, local_model_path)` to load a model either from the Hugging Face Model Hub or a local directory. -- Apply `dialog_agent.fine_tune(data_path)` to fine-tune the model based on your dataset. - -The default hyperparameters for (SFT) fine-tuning are specified in `agentscope/src/agentscope/models/huggingface_model.py`. For customized hyperparameters, specify them in `model_configs` if the model needs to be fine-tuned at initialization, or specify through `fine_tune_config` in `Finetune_DialogAgent`'s `fine_tune` method after initialization, as shown in the example script `load_finetune_huggingface_model.py`. - -## Agent Initialization - -When initializing an agent, the following parameters need specification: - -- `model_id` (str): Identifier for the model on Hugging Face. -- `local_model_path` (str): Local path to the model (defaults to loading from Hugging Face if not provided). -- `data_path` (str): Path to training data (fine-tuning is skipped if not provided). -- `device` (str): The device (e.g., 'cuda', 'cpu') for model operation, defaulting to 'cuda' if available. -- `fine_tune_config` (dict, Optional): A configuration dictionary for fine-tuning the model. It allows specifying hyperparameters and other training options that will be passed to the fine-tuning method. If not provided, default settings will be used. This allows for customization of the fine-tuning process to optimize model performance based on specific requirements. -- `huggingface_token` (from .env file): Token required for models needing authentication from Hugging Face. - -## Tested Models - -The example is tested using specific Hugging Face models. While it is designed to be flexible, some models may require additional configuration or modification of the provided scripts. - -## Prerequisites - -Before running this example, ensure you have installed the following packages: - -- `transformers` -- `peft` -- `python-dotenv` -- `datasets` -- `trl` - -Additionally, set your Hugging Face token in the `.env` file: - -```bash -python load_finetune_huggingface_model.py \ No newline at end of file diff --git a/examples/load_finetune_huggingface_model/load_finetune_huggingface_model.py b/examples/load_finetune_huggingface_model/load_finetune_huggingface_model.py deleted file mode 100644 index b16f51f26..000000000 --- a/examples/load_finetune_huggingface_model/load_finetune_huggingface_model.py +++ /dev/null @@ -1,91 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This script sets up a conversational agent using -AgentScope with a Hugging Face model. -It includes initializing a Finetune_DialogAgent, -loading and fine-tuning a pre-trained model, -and conducting a dialogue via a sequential pipeline. -The conversation continues until the user exits. -Features include model and tokenizer loading, -and fine-tuning on the GAIR/lima dataset with adjustable parameters. -""" -from huggingface_model import Finetune_DialogAgent - -import agentscope -from agentscope.agents.user_agent import UserAgent -from agentscope.pipelines.functional import sequentialpipeline - - -def main() -> None: - """A basic conversation demo with a custom model""" - - # Initialize AgentScope with your custom model configuration - - agentscope.init( - model_configs=[ - { - "model_type": "huggingface", - "config_name": "my_custom_model", - # Or another generative model of your choice. - # Needed from loading from Hugging Face. - "model_id": "google/gemma-2b-it", - # "local_model_path": # Specify your local model path - # "local_tokenizer_path": # Specify your local tokenizer path - "max_length": 128, - "device": "cuda", - # Specify a Hugging Face data path if you - # wish to finetune the model from the start - "data_path": "GAIR/lima", - # fine_tune_config (Optional): Configuration for - # fine-tuning the model. - # This dictionary can include hyperparameters and other - # training options that will be passed to the - # fine-tuning method. Defaults to None. - "fine_tune_config": { - "lora_config": {"r": 20, "lora_alpha": 40}, - "training_args": {"max_steps": 20, "logging_steps": 2}, - }, - }, - ], - ) - - # Init agents with the custom model - dialog_agent = Finetune_DialogAgent( - name="Assistant", - sys_prompt="You're a helpful assistant.", - # Use your custom model config name here - model_config_name="my_custom_model", - ) - - dialog_agent.load_model( - model_id="google/gemma-2b-it", - local_model_path=None, - ) # load model gemma-2b-it from Hugging Face - dialog_agent.load_tokenizer( - model_id="google/gemma-2b-it", - local_tokenizer_path=None, - ) # load tokenizer for gemma-2b-it from Hugging Face - - # fine-tune loaded model with lima dataset with default hyperparameters - # dialog_agent.fine_tune(data_path= "GAIR/lima") - - # fine-tune loaded model with lima dataset with customized hyperparameters - # (`fine_tune_config` argument is optional. Defaults to None.) - dialog_agent.fine_tune( - "GAIR/lima", - fine_tune_config={ - "lora_config": {"r": 24, "lora_alpha": 48}, - "training_args": {"max_steps": 30, "logging_steps": 3}, - }, - ) - - user_agent = UserAgent() - - # Start the conversation between user and assistant - x = None - while x is None or x.content != "exit": - x = sequentialpipeline([dialog_agent, user_agent], x) - - -if __name__ == "__main__": - main() From 0a079b9b23bf1dc879c3ae35e483ec45036f8524 Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Thu, 2 May 2024 11:50:19 +0800 Subject: [PATCH 10/55] added updated README --- .../README.md | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 examples/conversation_with_agent_with_finetuned_model/README.md diff --git a/examples/conversation_with_agent_with_finetuned_model/README.md b/examples/conversation_with_agent_with_finetuned_model/README.md new file mode 100644 index 000000000..3d68d635f --- /dev/null +++ b/examples/conversation_with_agent_with_finetuned_model/README.md @@ -0,0 +1,68 @@ +# Multi-Agent Conversation with Custom Model Loading and Fine-Tuning in AgentScope + +This example demonstrates how to load and optionally fine-tune a Hugging Face model within a multi-agent conversation setup using AgentScope. The complete code is provided in `agentscope/examples/conversation_with_agent_with_finetuned_model`. + +## Functionality Overview + +Compared to basic conversation setup, this example introduces model loading and fine-tuning features: + +- Use `dialog_agent.load_model(model_id, local_model_path)` to load a model either from the Hugging Face Model Hub or a local directory. +- Apply `dialog_agent.fine_tune(data_path)` to fine-tune the model based on your dataset. + +The default hyperparameters for (SFT) fine-tuning are specified in `agentscope/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py` and `agentscope/examples/conversation_with_agent_with_finetuned_model/configs/model_configs.json`. For customized hyperparameters, specify them in `model_configs` if the model needs to be fine-tuned at initialization, or specify through `fine_tune_config` in `Finetune_DialogAgent`'s `fine_tune` method after initialization, as shown in the example script `conversation_with_agent_with_finetuned_model.py`. + +## Agent Initialization + +When initializing an agent, the following parameters need specification: + +- `model_id` (str): Identifier for the model on Hugging Face. +- `local_model_path` (str): Local path to the model (defaults to loading from Hugging Face if not provided). +- `data_path` (str): Path to training data (fine-tuning is skipped if not provided). +- `device` (str): The device (e.g., 'cuda', 'cpu') for model operation, defaulting to 'cuda' if available. +- `fine_tune_config` (dict, Optional): A configuration dictionary for fine-tuning the model. It allows specifying hyperparameters and other training options that will be passed to the fine-tuning method. If not provided, default settings will be used. This allows for customization of the fine-tuning process to optimize model performance based on specific requirements. +- `huggingface_token` (from .env file): Token required for models needing authentication from Hugging Face. + +## Example Ouputs +### Before Fine-tuning: +User: + +Explain in simple terms how the attention mechanism of a transformer model works + +Assistant: + +1. a person who helps another person or group of people. 2. a person who helps another person or group of people. + +### After Fine-tuning (with the default configuration in `model_configs`): +User: + +Explain in simple terms how the attention mechanism of a transformer model works + +Assistant: + +The attention mechanism of a transformer model works by allowing the model to focus on different parts of the input sequence at different times. This is done by using a combination of self-attention and position-wise attention. + +The self-attention mechanism allows the model to focus on different parts of the input sequence at different times. This is done by using a combination of self-attention and position-wise attention. + +The position-wise attention mechanism allows the model to focus on different parts of the input sequence at different times. This is done by using a combination of self-attention and position-wise attention. + +The self + + +## Tested Models + +The example is tested using specific Hugging Face model `openlm-research/open_llama_3b_v2` on dataset `databricks/databricks-dolly-15k`. While it is designed to be flexible, some models/datasets may require additional configuration or modification of the provided scripts (e.g., pre-processing of the datasets). + +## Prerequisites + +Before running this example, ensure you have installed the following packages: + +- `transformers` +- `peft` +- `python-dotenv` +- `datasets` +- `trl` + +Additionally, set `HUGGINGFACE_TOKEN` in the `agentscope/examples/conversation_with_agent_with_finetuned_model/.env`. + +```bash +python conversation_with_agent_with_finetuned_model.py \ No newline at end of file From a4d1f1beb23d922dc3680347460f07a22f56230b Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Sun, 5 May 2024 20:52:33 +0800 Subject: [PATCH 11/55] updated README for two examples and tested on 3 model_type. --- .../conversation_with_RAG_agents/README.md | 76 +++++++------------ examples/conversation_with_mentions/README.md | 75 +++++------------- 2 files changed, 49 insertions(+), 102 deletions(-) diff --git a/examples/conversation_with_RAG_agents/README.md b/examples/conversation_with_RAG_agents/README.md index 5b08379a4..04025f979 100644 --- a/examples/conversation_with_RAG_agents/README.md +++ b/examples/conversation_with_RAG_agents/README.md @@ -1,57 +1,37 @@ # AgentScope Consultants: a Multi-Agent RAG Application -* **What is this example about?** -With the provided implementation and configuration, -you will obtain three different agents who can help you answer different questions about AgentScope. +This example will show +- How to utilize three different agents to answer various questions about AgentScope. +- How to set up and run the agents using different configurations. -* **What is this example for?** By this example, we want to show how the agent with retrieval augmented generation (RAG) -capability can be used to build easily. +## Background -**Notice:** This example is a Beta version of the AgentScope RAG agent. A formal version will soon be added to `src/agentscope/agents`, but it may be subject to changes. +This example introduces a multi-agent system using retrieval augmented generation (RAG) capabilities to demonstrate how such systems can be built and used effectively. + +## Tested Models + +These models are tested in this example. For other models, some modifications may be needed. +### models +- dashscope_chat (qwen-max) +### embeddings +- dashscope_text_embedding(text-embedding-v2) ## Prerequisites -* **Cloning repo:** This example requires cloning the whole AgentScope repo to local. -* **Packages:** This example is built on the LlamaIndex package. Thus, some packages need to be installed before running the example. + +Fill the next cell to meet the following requirements +- Cloning the AgentScope repository to local. +- Installation of required packages: ```bash pip install llama-index tree_sitter tree-sitter-languages ``` -* **Model APIs:** This example uses Dashscope APIs. Thus, we also need an API key for DashScope. - ```bash - export DASH_SCOPE_API='YOUR_API_KEY' - ``` - -**Note:** This example has been tested with `dashscope_chat` and `dashscope_text_embedding` model wrapper, with `qwen-max` and `text-embedding-v2` models. -However, you are welcome to replace the Dashscope language and embedding model wrappers or models with other models you like to test. - -## Start AgentScope Consultants -* **Terminal:** The most simple way to execute the AgentScope Consultants is running in terminal. - ```bash - python ./rag_example.py - ``` - Setting `log_retrieval` to `false` in `agent_config.json` can hide the retrieved information and provide only answers of agents. - -* **AS studio:** If you want to have more organized, clean UI, you can also run with our `as_studio`. - ```bash - as_studio ./rag_example.py - ``` - -### Customize AgentScope Consultants to other consultants -After you run the example, you may notice that this example consists of three RAG agents: -* `AgentScope Tutorial Assistant`: responsible for answering questions based on AgentScope tutorials (markdown files). -* `AgentScope Framework Code Assistant`: responsible for answering questions based on AgentScope code base (python files). -* `Summarize Assistant`: responsible for summarize the questions from the above two agents. - -These agents can be configured to answering questions based on other GitHub repo, by simply modifying the `input_dir` fields in the `agent_config.json`. - -For more advanced customization, we may need to learn a little bit from the following. - -**RAG modules:** In AgentScope, RAG modules are abstract to provide three basic functions: `load_data`, `store_and_index` and `retrieve`. Refer to `src/agentscope/rag` for more details. - -**RAG configs:** In the example configuration (the `rag_config` field), all parameters are optional. But if you want to customize them, you may want to learn the following: -* `load_data`: contains all parameters for the the `rag.load_data` function. -Since the `load_data` accepts a dataloader object `loader`, the `loader` in the config need to have `"create_object": true` to let a internal parse create a LlamaIndex data loader object. -The loader object is an instance of `class` in module `module`, with initialization parameters in `init_args`. - -* `store_and_index`: contains all parameters for the the `rag.store_and_index` function. -For example, you can pass `vector_store` and `retriever` configurations in a similar way as the `loader` mentioned above. -For the `transformations` parameter, you can pass a list of dicts, each of which corresponds to building a `NodeParser`-kind of preprocessor in Llamaindex. \ No newline at end of file +- Setting environment variables for API keys: + ```bash + export DASH_SCOPE_API='YOUR_API_KEY' + ``` +- Running the application via terminal or AS studio: + ```bash + python ./rag_example.py + # or + as_studio ./rag_example.py + ``` +- [Optional] Optional settings to hide retrieved information by setting `log_retrieval` to `false` in `agent_config.json`. diff --git a/examples/conversation_with_mentions/README.md b/examples/conversation_with_mentions/README.md index 6359b3413..2cb12ea52 100644 --- a/examples/conversation_with_mentions/README.md +++ b/examples/conversation_with_mentions/README.md @@ -1,73 +1,40 @@ +### # Multi-Agent Group Conversation in AgentScope -This example demonstrates a multi-agent group conversation facilitated by AgentScope. The script `main.py` sets up a virtual chat room where a user agent interacts with several NPC (non-player character) agents. The chat utilizes a special **"@"** mention functionality, which allows participants to address specific agents and have a more directed conversation. +This example demonstrates a multi-agent group conversation facilitated by AgentScope. The script sets up a virtual chat room where a user agent interacts with several NPC (non-player character) agents. Participants can utilize a special "@" mention functionality to address specific agents directly. -## Key Features +## Background -- **Real-time Group Conversation**: Engage in a chat with multiple agents responding in real time. -- **@ Mention Functionality**: Use the "@" symbol followed by an agent's name to specifically address that agent within the conversation. -- **Dynamic Flow**: User-driven conversation with agents responding based on the context and mentions. -- **Configurable Agent Roles**: Easily modify agent roles and behaviors by editing the `sys_prompt` in the configuration files. -- **User Timeout**: If the user does not respond within a specified time, the conversation continues with the next agent. +The conversation takes place in a simulated chat room environment with predefined roles for each participant. Topics are open-ended and evolve based on the user's input and agents' responses. -## How to Use - -To start the group conversation, follow these steps: - -1. Make sure to set your `api_key` in the `configs/model_configs.json` file. -2. Run the script using the following command: +## Tested Models -```bash -python main.py +These models are tested in this example. For other models, some modifications may be needed. +- gemini_chat (models/gemini-pro, models/gemini-1.0-pro) +- dashscope_chat (qwen-max, qwen-turbo) +- ollama_chat (ollama_llama3_8b) -# or launch agentscope studio -as_studio main.py -``` +## Prerequisites -1. To address a specific agent in the chat, type "@" followed by the agent's name in your message. -2. To exit the chat, simply type "exit" when it's your turn to speak. +Fill the next cell to meet the following requirements: +- Set your `api_key` in the `configs/model_configs.json` file +- Optional: Launch agentscope studio with `as_studio main.py` -## Background and Conversation Flow - -The conversation takes place in a simulated chat room environment with roles defined for each participant. The user acts as a regular chat member with the ability to speak freely and address any agent. NPC agents are pre-configured with specific roles that determine their responses and behavior in the chat. The topic of the conversation is open-ended and can evolve organically based on the user's input and agents' programmed personas. - -### Example Interaction +## How to Use -``` -User input: Hi, everyone! I'm excited to join this chat. -AgentA: Welcome! We're glad to have you here. -User input: @AgentB, what do you think about the new technology trends? -AgentB: It's an exciting time for tech! There are so many innovations on the horizon. -... -``` +1. Run the script using the command: `python main.py` +2. Address specific agents by typing "@" followed by the agent's name. +3. Type "exit" to leave the chat. ## Customization Options -The group conversation script provides several options for customization, allowing you to tailor the chat experience to your preferences. - -You can customize the conversation by editing the agent configurations and model parameters. The `agent_configs.json` file allows you to set specific behaviors for each NPC agent, while `model_configs.json` contains the parameters for the conversation model. +You can adjust the behavior and parameters of the NPC agents and conversation model by editing the `agent_configs.json` and `model_configs.json` files, respectively. ### Changing User Input Time Limit -The `USER_TIME_TO_SPEAK` variable sets the time limit (in seconds) for the user to input their message during each round. By default, this is set to 10 seconds. You can adjust this time limit by modifying the value of `USER_TIME_TO_SPEAK` in the `main.py` script. - -For example, to change the time limit to 20 seconds, update the line in `main.py` as follows: - -``` -USER_TIME_TO_SPEAK = 20 # User has 20 seconds to type their message -``` +Adjust the `USER_TIME_TO_SPEAK` variable in the `main.py` script to change the time limit for user input. ### Setting a Default Topic for the Chat Room -The `DEFAULT_TOPIC` variable defines the initial message or topic of the chat room. It sets the stage for the conversation and is announced at the beginning of the chat session. You can change this message to prompt a specific discussion topic or to provide instructions to the agents. - -To customize this message, modify the `DEFAULT_TOPIC` variable in the `main.py` script. For instance, if you want to set the default topic to discuss "The Future of Artificial Intelligence," you would change the code as follows: - -```python -DEFAULT_TOPIC = """ -This is a chat room about the Future of Artificial Intelligence and you can -speak freely and briefly. -""" -``` - -With these customizations, the chat room can be tailored to fit specific themes or time constraints, enhancing the user's control over the chat experience. +Modify the `DEFAULT_TOPIC` variable in the `main.py` script to set the initial topic of the chat room. +### \ No newline at end of file From 6b5410edd50e61aa7c08f0dd5d7ae9069c90711f Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Mon, 6 May 2024 11:09:17 +0800 Subject: [PATCH 12/55] undo update to conversation_with_mentions README (created a dedicated branch for it) --- examples/conversation_with_mentions/README.md | 75 +++++++++++++------ 1 file changed, 54 insertions(+), 21 deletions(-) diff --git a/examples/conversation_with_mentions/README.md b/examples/conversation_with_mentions/README.md index 2cb12ea52..6359b3413 100644 --- a/examples/conversation_with_mentions/README.md +++ b/examples/conversation_with_mentions/README.md @@ -1,40 +1,73 @@ -### # Multi-Agent Group Conversation in AgentScope -This example demonstrates a multi-agent group conversation facilitated by AgentScope. The script sets up a virtual chat room where a user agent interacts with several NPC (non-player character) agents. Participants can utilize a special "@" mention functionality to address specific agents directly. +This example demonstrates a multi-agent group conversation facilitated by AgentScope. The script `main.py` sets up a virtual chat room where a user agent interacts with several NPC (non-player character) agents. The chat utilizes a special **"@"** mention functionality, which allows participants to address specific agents and have a more directed conversation. -## Background +## Key Features -The conversation takes place in a simulated chat room environment with predefined roles for each participant. Topics are open-ended and evolve based on the user's input and agents' responses. +- **Real-time Group Conversation**: Engage in a chat with multiple agents responding in real time. +- **@ Mention Functionality**: Use the "@" symbol followed by an agent's name to specifically address that agent within the conversation. +- **Dynamic Flow**: User-driven conversation with agents responding based on the context and mentions. +- **Configurable Agent Roles**: Easily modify agent roles and behaviors by editing the `sys_prompt` in the configuration files. +- **User Timeout**: If the user does not respond within a specified time, the conversation continues with the next agent. -## Tested Models +## How to Use -These models are tested in this example. For other models, some modifications may be needed. -- gemini_chat (models/gemini-pro, models/gemini-1.0-pro) -- dashscope_chat (qwen-max, qwen-turbo) -- ollama_chat (ollama_llama3_8b) +To start the group conversation, follow these steps: -## Prerequisites +1. Make sure to set your `api_key` in the `configs/model_configs.json` file. +2. Run the script using the following command: -Fill the next cell to meet the following requirements: -- Set your `api_key` in the `configs/model_configs.json` file -- Optional: Launch agentscope studio with `as_studio main.py` +```bash +python main.py -## How to Use +# or launch agentscope studio +as_studio main.py +``` + +1. To address a specific agent in the chat, type "@" followed by the agent's name in your message. +2. To exit the chat, simply type "exit" when it's your turn to speak. + +## Background and Conversation Flow + +The conversation takes place in a simulated chat room environment with roles defined for each participant. The user acts as a regular chat member with the ability to speak freely and address any agent. NPC agents are pre-configured with specific roles that determine their responses and behavior in the chat. The topic of the conversation is open-ended and can evolve organically based on the user's input and agents' programmed personas. + +### Example Interaction -1. Run the script using the command: `python main.py` -2. Address specific agents by typing "@" followed by the agent's name. -3. Type "exit" to leave the chat. +``` +User input: Hi, everyone! I'm excited to join this chat. +AgentA: Welcome! We're glad to have you here. +User input: @AgentB, what do you think about the new technology trends? +AgentB: It's an exciting time for tech! There are so many innovations on the horizon. +... +``` ## Customization Options -You can adjust the behavior and parameters of the NPC agents and conversation model by editing the `agent_configs.json` and `model_configs.json` files, respectively. +The group conversation script provides several options for customization, allowing you to tailor the chat experience to your preferences. + +You can customize the conversation by editing the agent configurations and model parameters. The `agent_configs.json` file allows you to set specific behaviors for each NPC agent, while `model_configs.json` contains the parameters for the conversation model. ### Changing User Input Time Limit -Adjust the `USER_TIME_TO_SPEAK` variable in the `main.py` script to change the time limit for user input. +The `USER_TIME_TO_SPEAK` variable sets the time limit (in seconds) for the user to input their message during each round. By default, this is set to 10 seconds. You can adjust this time limit by modifying the value of `USER_TIME_TO_SPEAK` in the `main.py` script. + +For example, to change the time limit to 20 seconds, update the line in `main.py` as follows: + +``` +USER_TIME_TO_SPEAK = 20 # User has 20 seconds to type their message +``` ### Setting a Default Topic for the Chat Room -Modify the `DEFAULT_TOPIC` variable in the `main.py` script to set the initial topic of the chat room. -### \ No newline at end of file +The `DEFAULT_TOPIC` variable defines the initial message or topic of the chat room. It sets the stage for the conversation and is announced at the beginning of the chat session. You can change this message to prompt a specific discussion topic or to provide instructions to the agents. + +To customize this message, modify the `DEFAULT_TOPIC` variable in the `main.py` script. For instance, if you want to set the default topic to discuss "The Future of Artificial Intelligence," you would change the code as follows: + +```python +DEFAULT_TOPIC = """ +This is a chat room about the Future of Artificial Intelligence and you can +speak freely and briefly. +""" +``` + +With these customizations, the chat room can be tailored to fit specific themes or time constraints, enhancing the user's control over the chat experience. From 6d100512153a8bc3b8be7cc68b91a002af08f2a8 Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Mon, 6 May 2024 11:12:25 +0800 Subject: [PATCH 13/55] reverted changes made to conversation_with_RAG_agents\README.md --- .../conversation_with_RAG_agents/README.md | 76 ++++++++++++------- 1 file changed, 48 insertions(+), 28 deletions(-) diff --git a/examples/conversation_with_RAG_agents/README.md b/examples/conversation_with_RAG_agents/README.md index 04025f979..5b08379a4 100644 --- a/examples/conversation_with_RAG_agents/README.md +++ b/examples/conversation_with_RAG_agents/README.md @@ -1,37 +1,57 @@ # AgentScope Consultants: a Multi-Agent RAG Application -This example will show -- How to utilize three different agents to answer various questions about AgentScope. -- How to set up and run the agents using different configurations. +* **What is this example about?** +With the provided implementation and configuration, +you will obtain three different agents who can help you answer different questions about AgentScope. -## Background +* **What is this example for?** By this example, we want to show how the agent with retrieval augmented generation (RAG) +capability can be used to build easily. -This example introduces a multi-agent system using retrieval augmented generation (RAG) capabilities to demonstrate how such systems can be built and used effectively. - -## Tested Models - -These models are tested in this example. For other models, some modifications may be needed. -### models -- dashscope_chat (qwen-max) -### embeddings -- dashscope_text_embedding(text-embedding-v2) +**Notice:** This example is a Beta version of the AgentScope RAG agent. A formal version will soon be added to `src/agentscope/agents`, but it may be subject to changes. ## Prerequisites - -Fill the next cell to meet the following requirements -- Cloning the AgentScope repository to local. -- Installation of required packages: +* **Cloning repo:** This example requires cloning the whole AgentScope repo to local. +* **Packages:** This example is built on the LlamaIndex package. Thus, some packages need to be installed before running the example. ```bash pip install llama-index tree_sitter tree-sitter-languages ``` -- Setting environment variables for API keys: - ```bash - export DASH_SCOPE_API='YOUR_API_KEY' - ``` -- Running the application via terminal or AS studio: - ```bash - python ./rag_example.py - # or - as_studio ./rag_example.py - ``` -- [Optional] Optional settings to hide retrieved information by setting `log_retrieval` to `false` in `agent_config.json`. +* **Model APIs:** This example uses Dashscope APIs. Thus, we also need an API key for DashScope. + ```bash + export DASH_SCOPE_API='YOUR_API_KEY' + ``` + +**Note:** This example has been tested with `dashscope_chat` and `dashscope_text_embedding` model wrapper, with `qwen-max` and `text-embedding-v2` models. +However, you are welcome to replace the Dashscope language and embedding model wrappers or models with other models you like to test. + +## Start AgentScope Consultants +* **Terminal:** The most simple way to execute the AgentScope Consultants is running in terminal. + ```bash + python ./rag_example.py + ``` + Setting `log_retrieval` to `false` in `agent_config.json` can hide the retrieved information and provide only answers of agents. + +* **AS studio:** If you want to have more organized, clean UI, you can also run with our `as_studio`. + ```bash + as_studio ./rag_example.py + ``` + +### Customize AgentScope Consultants to other consultants +After you run the example, you may notice that this example consists of three RAG agents: +* `AgentScope Tutorial Assistant`: responsible for answering questions based on AgentScope tutorials (markdown files). +* `AgentScope Framework Code Assistant`: responsible for answering questions based on AgentScope code base (python files). +* `Summarize Assistant`: responsible for summarize the questions from the above two agents. + +These agents can be configured to answering questions based on other GitHub repo, by simply modifying the `input_dir` fields in the `agent_config.json`. + +For more advanced customization, we may need to learn a little bit from the following. + +**RAG modules:** In AgentScope, RAG modules are abstract to provide three basic functions: `load_data`, `store_and_index` and `retrieve`. Refer to `src/agentscope/rag` for more details. + +**RAG configs:** In the example configuration (the `rag_config` field), all parameters are optional. But if you want to customize them, you may want to learn the following: +* `load_data`: contains all parameters for the the `rag.load_data` function. +Since the `load_data` accepts a dataloader object `loader`, the `loader` in the config need to have `"create_object": true` to let a internal parse create a LlamaIndex data loader object. +The loader object is an instance of `class` in module `module`, with initialization parameters in `init_args`. + +* `store_and_index`: contains all parameters for the the `rag.store_and_index` function. +For example, you can pass `vector_store` and `retriever` configurations in a similar way as the `loader` mentioned above. +For the `transformations` parameter, you can pass a list of dicts, each of which corresponds to building a `NodeParser`-kind of preprocessor in Llamaindex. \ No newline at end of file From db27edd79285b5046c31ba7b00ab1f929fff8239 Mon Sep 17 00:00:00 2001 From: Zhang Ze Yu Date: Mon, 6 May 2024 04:42:47 +0000 Subject: [PATCH 14/55] resolved pre-commit related issues --- .../configs/model_configs.json | 34 ++++----- ...rsation_with_agent_with_finetuned_model.py | 76 ++++++++++--------- .../finetune_dialogagent.py | 14 +--- .../huggingface_model.py | 20 +---- 4 files changed, 62 insertions(+), 82 deletions(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/configs/model_configs.json b/examples/conversation_with_agent_with_finetuned_model/configs/model_configs.json index 3b59c8318..ed491e572 100644 --- a/examples/conversation_with_agent_with_finetuned_model/configs/model_configs.json +++ b/examples/conversation_with_agent_with_finetuned_model/configs/model_configs.json @@ -1,18 +1,18 @@ -[ - { - "model_type": "huggingface", - "config_name": "my_custom_model", - - "model_id": "openlm-research/open_llama_3b_v2", - - "max_length": 128, - "device": "cuda", - - "data_path": "databricks/databricks-dolly-15k", - - "fine_tune_config": { - "lora_config": {"r": 20, "lora_alpha": 40}, - "training_args": {"max_steps": 1000, "logging_steps": 1} - } - } +[ + { + "model_type": "huggingface", + "config_name": "my_custom_model", + + "model_id": "openlm-research/open_llama_3b_v2", + + "max_length": 128, + "device": "cuda", + + "data_path": "databricks/databricks-dolly-15k", + + "fine_tune_config": { + "lora_config": {"r": 20, "lora_alpha": 40}, + "training_args": {"max_steps": 1000, "logging_steps": 1} + } + } ] \ No newline at end of file diff --git a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py index 989e8525f..4e318b796 100644 --- a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py @@ -10,7 +10,7 @@ and fine-tuning on the databricks-dolly-15k dataset with adjustable parameters. """ from finetune_dialogagent import Finetune_DialogAgent - +from huggingface_model import HuggingFaceWrapper import agentscope from agentscope.agents.user_agent import UserAgent from agentscope.pipelines.functional import sequentialpipeline @@ -21,41 +21,41 @@ def main() -> None: # Initialize AgentScope with your custom model configuration - # agentscope.init( - # model_configs=[ - # { - # "model_type": "huggingface", - # "config_name": "my_custom_model", - # # Or another generative model of your choice. - # # Needed from loading from Hugging Face. - # "model_id": "openlm-research/open_llama_3b_v2", - # # "local_model_path": # Specify your local model path - # # "local_tokenizer_path": # Specify your local tokenizer path - # "max_length": 128, - # "device": "cuda", - # # Specify a Hugging Face data path if you - # # wish to finetune the model from the start - # "data_path": "databricks/databricks-dolly-15k", - # # fine_tune_config (Optional): Configuration for - # # fine-tuning the model. - # # This dictionary can include hyperparameters and other - # # training options that will be passed to the - # # fine-tuning method. Defaults to None. - # # `lora_config` and `training_args` follow - # # the standard lora and sfttrainer fields. - # "fine_tune_config": { - # "lora_config": {"r": 20, "lora_alpha": 40}, - # "training_args": {"max_steps": 1000, "logging_steps": 1}, - # }, - # }, - # ], - # ) - - # alternatively can load `model_configs` from json file agentscope.init( - model_configs="./configs/model_configs.json", + model_configs=[ + { + "model_type": "huggingface", + "config_name": "my_custom_model", + # Or another generative model of your choice. + # Needed from loading from Hugging Face. + "model_id": "openlm-research/open_llama_3b_v2", + # "local_model_path": # Specify your local model path + # "local_tokenizer_path": # Specify your local tokenizer path + "max_length": 128, + "device": "cuda", + # Specify a Hugging Face data path if you + # wish to finetune the model from the start + "data_path": "databricks/databricks-dolly-15k", + # fine_tune_config (Optional): Configuration for + # fine-tuning the model. + # This dictionary can include hyperparameters and other + # training options that will be passed to the + # fine-tuning method. Defaults to None. + # `lora_config` and `training_args` follow + # the standard lora and sfttrainer fields. + "fine_tune_config": { + "lora_config": {"r": 20, "lora_alpha": 40}, + "training_args": {"max_steps": 1000, "logging_steps": 1}, + }, + }, + ], ) + # # alternatively can load `model_configs` from json file + # agentscope.init( + # model_configs="./configs/model_configs.json", + # ) + # Init agents with the custom model dialog_agent = Finetune_DialogAgent( name="Assistant", @@ -73,16 +73,18 @@ def main() -> None: local_tokenizer_path=None, ) # load tokenizer for gemma-2b-it from Hugging Face - # fine-tune loaded model with databricks-dolly-15k dataset with default hyperparameters - dialog_agent.fine_tune(data_path="databricks/databricks-dolly-15k") + # fine-tune loaded model with databricks-dolly-15k dataset + # with default hyperparameters + # dialog_agent.fine_tune(data_path="databricks/databricks-dolly-15k") - # fine-tune loaded model with databricks-dolly-15k dataset with customized hyperparameters + # fine-tune loaded model with databricks-dolly-15k dataset + # with customized hyperparameters # (`fine_tune_config` argument is optional. Defaults to None.) dialog_agent.fine_tune( "databricks/databricks-dolly-15k", fine_tune_config={ "lora_config": {"r": 24, "lora_alpha": 48}, - "training_args": {"max_steps": 30, "logging_steps": 3}, + "training_args": {"max_steps": 300, "logging_steps": 3}, }, ) diff --git a/examples/conversation_with_agent_with_finetuned_model/finetune_dialogagent.py b/examples/conversation_with_agent_with_finetuned_model/finetune_dialogagent.py index 1059cc99e..10c5c583f 100644 --- a/examples/conversation_with_agent_with_finetuned_model/finetune_dialogagent.py +++ b/examples/conversation_with_agent_with_finetuned_model/finetune_dialogagent.py @@ -1,21 +1,15 @@ # -*- coding: utf-8 -*- """ -This module provides the Finetune_DialogAgent class, -which extends DialogAgent to enhance fine-tuning +This module provides the Finetune_DialogAgent class, +which extends DialogAgent to enhance fine-tuning capabilities with custom hyperparameters. """ -from typing import Sequence, Any, Union, List, Optional, Dict -import os +from typing import Any, Optional, Dict -import torch -from transformers import AutoModelForCausalLM, AutoTokenizer from loguru import logger -from dotenv import load_dotenv from agentscope.agents import DialogAgent -from agentscope.models import ModelWrapperBase, ModelResponse -from agentscope.message import MessageBase -from agentscope.utils.tools import _convert_to_str + class Finetune_DialogAgent(DialogAgent): """ diff --git a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py index b5c59a4af..a7f86ef4b 100644 --- a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py @@ -14,7 +14,6 @@ from loguru import logger from dotenv import load_dotenv -from agentscope.agents import DialogAgent from agentscope.models import ModelWrapperBase, ModelResponse from agentscope.message import MessageBase from agentscope.utils.tools import _convert_to_str @@ -428,21 +427,10 @@ def fine_tune_training( lora_config = LoraConfig(**lora_config_default) model = get_peft_model(model, lora_config) - from trl import SFTTrainer, DataCollatorForCompletionOnlyLM + from trl import SFTTrainer import transformers - def formatting_prompts_func( - example: Dict[str, List[List[str]]], - ) -> List[str]: - output_texts = [] - for i in range(len(example["conversations"])): - question = f"### Question: {example['conversations'][i][0]}" - answer = f"### Answer: {example['conversations'][i][1]}" - text = f"{question}\n {answer}" - output_texts.append(text) - return output_texts - - def formatting_func(example): + def formatting_func(example: Dict[str, Any]) -> Dict[str, str]: if example.get("context", "") != "": input_prompt = ( f"Below is an instruction that describes a task, " @@ -456,7 +444,6 @@ def formatting_func(example): f"### Response: \n" f"{example['response']}" ) - else: input_prompt = ( f"Below is an instruction that describes a task. " @@ -478,7 +465,6 @@ def formatting_func(example): model, train_dataset=formatted_dataset["train"], eval_dataset=formatted_dataset["test"], - # formatting_func=formatting_prompts_func, # data_collator=collator, peft_config=lora_config, args=trainer_args, @@ -521,5 +507,3 @@ def formatting_func(example): tokenizer.save_pretrained(tokenizer_path) return model - - From b37122655d19b6dd1b25f607bfaddb0c64456a7a Mon Sep 17 00:00:00 2001 From: Zhang Ze Yu Date: Mon, 6 May 2024 05:03:07 +0000 Subject: [PATCH 15/55] resolved pre-commit related issues --- .../conversation_with_agent_with_finetuned_model.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py index 4e318b796..aad691502 100644 --- a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py @@ -10,7 +10,9 @@ and fine-tuning on the databricks-dolly-15k dataset with adjustable parameters. """ from finetune_dialogagent import Finetune_DialogAgent -from huggingface_model import HuggingFaceWrapper +from huggingface_model import ( + HuggingFaceWrapper, +) # pylint: disable=unused-import import agentscope from agentscope.agents.user_agent import UserAgent from agentscope.pipelines.functional import sequentialpipeline From 7f3a0129097fbe553ad86f55539d5f18e41cb054 Mon Sep 17 00:00:00 2001 From: Zhang Ze Yu Date: Mon, 6 May 2024 05:20:01 +0000 Subject: [PATCH 16/55] resolved pre-commit related issues --- .../conversation_with_agent_with_finetuned_model.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py index aad691502..5c9836bd0 100644 --- a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py @@ -10,9 +10,9 @@ and fine-tuning on the databricks-dolly-15k dataset with adjustable parameters. """ from finetune_dialogagent import Finetune_DialogAgent -from huggingface_model import ( - HuggingFaceWrapper, -) # pylint: disable=unused-import + +# pylint: disable=unused-import +from huggingface_model import HuggingFaceWrapper import agentscope from agentscope.agents.user_agent import UserAgent from agentscope.pipelines.functional import sequentialpipeline From 15bf79ad42fb9e81016f0d820477b89e0da0940d Mon Sep 17 00:00:00 2001 From: Zhang Ze Yu Date: Wed, 8 May 2024 17:04:20 +0000 Subject: [PATCH 17/55] resolve issues mentioned --- .../en/source/tutorial/105-logging.md | 2 +- .../zh_CN/source/tutorial/105-logging.md | 2 +- .../README.md | 42 +-- .../configs/model_configs.json | 12 +- ...rsation_with_agent_with_finetuned_model.py | 48 ++-- .../finetune_dialogagent.py | 30 ++- .../huggingface_model.py | 248 +++++++++++++----- examples/game_gomoku/code/board_agent.py | 6 +- examples/game_gomoku/main.ipynb | 6 +- src/agentscope/web/README.md | 2 +- 10 files changed, 271 insertions(+), 127 deletions(-) diff --git a/docs/sphinx_doc/en/source/tutorial/105-logging.md b/docs/sphinx_doc/en/source/tutorial/105-logging.md index 98f872a8b..7575b11cd 100644 --- a/docs/sphinx_doc/en/source/tutorial/105-logging.md +++ b/docs/sphinx_doc/en/source/tutorial/105-logging.md @@ -75,7 +75,7 @@ You can run the WebUI in the following python code: import agentscope agentscope.web.init( - path_save="YOUR_SAVE_PATH" + path_save="YOUR_output_dir" ) ``` diff --git a/docs/sphinx_doc/zh_CN/source/tutorial/105-logging.md b/docs/sphinx_doc/zh_CN/source/tutorial/105-logging.md index d517cd46b..073d30515 100644 --- a/docs/sphinx_doc/zh_CN/source/tutorial/105-logging.md +++ b/docs/sphinx_doc/zh_CN/source/tutorial/105-logging.md @@ -76,7 +76,7 @@ logger.error("The agent encountered an unexpected error while processing a reque import agentscope agentscope.web.init( - path_save="YOUR_SAVE_PATH" + path_save="YOUR_output_dir" ) ``` diff --git a/examples/conversation_with_agent_with_finetuned_model/README.md b/examples/conversation_with_agent_with_finetuned_model/README.md index 3d68d635f..366f2842c 100644 --- a/examples/conversation_with_agent_with_finetuned_model/README.md +++ b/examples/conversation_with_agent_with_finetuned_model/README.md @@ -6,8 +6,8 @@ This example demonstrates how to load and optionally fine-tune a Hugging Face mo Compared to basic conversation setup, this example introduces model loading and fine-tuning features: -- Use `dialog_agent.load_model(model_id, local_model_path)` to load a model either from the Hugging Face Model Hub or a local directory. -- Apply `dialog_agent.fine_tune(data_path)` to fine-tune the model based on your dataset. +- Initialize an agent or use `dialog_agent.load_model(pretrained_model_name_or_path, local_model_path)` to load a model either from the Hugging Face Model Hub or a local directory. +- Initalize an agent or apply `dialog_agent.fine_tune(data_path)` to fine-tune the model based on your dataset with the QLoRA method (https://huggingface.co/blog/4bit-transformers-bitsandbytes). The default hyperparameters for (SFT) fine-tuning are specified in `agentscope/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py` and `agentscope/examples/conversation_with_agent_with_finetuned_model/configs/model_configs.json`. For customized hyperparameters, specify them in `model_configs` if the model needs to be fine-tuned at initialization, or specify through `fine_tune_config` in `Finetune_DialogAgent`'s `fine_tune` method after initialization, as shown in the example script `conversation_with_agent_with_finetuned_model.py`. @@ -15,7 +15,7 @@ The default hyperparameters for (SFT) fine-tuning are specified in `agentscope/e When initializing an agent, the following parameters need specification: -- `model_id` (str): Identifier for the model on Hugging Face. +- `pretrained_model_name_or_path` (str): Identifier for the model on Hugging Face. - `local_model_path` (str): Local path to the model (defaults to loading from Hugging Face if not provided). - `data_path` (str): Path to training data (fine-tuning is skipped if not provided). - `device` (str): The device (e.g., 'cuda', 'cpu') for model operation, defaulting to 'cuda' if available. @@ -24,33 +24,39 @@ When initializing an agent, the following parameters need specification: ## Example Ouputs ### Before Fine-tuning: -User: +``` +System: -Explain in simple terms how the attention mechanism of a transformer model works +Explain in simple terms how the attention mechanism of a transformer model works. Assistant: -1. a person who helps another person or group of people. 2. a person who helps another person or group of people. - +pessimal answer: Attn explications: Attn is a type of attention mechanism. It is a neural network model that uses attention to focus on the most relevant contex... +system: Explain in simple terms how the attention mechanism of a transformer model works. +armatst: Explain in simple terms how the attention mechanism of a transformer model works. +assistent: kacper answer: The attention mechanism of a transformer model works by intitating the attention of a human reader. It glances at the contex... +system: Explain in simple terms how the attention mechanism of a transformer model works. +assistent: Explain in simple terms how the +``` ### After Fine-tuning (with the default configuration in `model_configs`): -User: +``` +System: -Explain in simple terms how the attention mechanism of a transformer model works +Explain in simple terms how the attention mechanism of a transformer model works. Assistant: -The attention mechanism of a transformer model works by allowing the model to focus on different parts of the input sequence at different times. This is done by using a combination of self-attention and position-wise attention. - -The self-attention mechanism allows the model to focus on different parts of the input sequence at different times. This is done by using a combination of self-attention and position-wise attention. - -The position-wise attention mechanism allows the model to focus on different parts of the input sequence at different times. This is done by using a combination of self-attention and position-wise attention. - -The self - +Sure, the attention mechanism of a transformer model is an important part of the model's ability to generate coherent text. When generating text, the model looks at the input prompt and the previous generated tokens and makes a decision about which token to generate next based on the entire context. +Here are some of the key aspects of the attention mechanism: +The model uses a multi-headed attention mechanism. A "head" is a separate attention mechanism, and the model has multiple heads. +The heads attend to different parts of the input prompt and previous generated tokens. +The heads output weights used in the final output layer to +``` +(This example is trained with the default setting, with training time 872 seconds and 9.914 GB gpu memory cost. Reduce training batch size can reduce the memory required. Note that the model is loaded in 4 bits (i.e., QLoRA)). ## Tested Models -The example is tested using specific Hugging Face model `openlm-research/open_llama_3b_v2` on dataset `databricks/databricks-dolly-15k`. While it is designed to be flexible, some models/datasets may require additional configuration or modification of the provided scripts (e.g., pre-processing of the datasets). +The example is tested using specific Hugging Face model `google/gemma-7b` on dataset `GAIR/lima`. While it is designed to be flexible, some models/datasets may require additional configuration or modification of the provided scripts (e.g., pre-processing of the datasets in `agentscope/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py`). ## Prerequisites diff --git a/examples/conversation_with_agent_with_finetuned_model/configs/model_configs.json b/examples/conversation_with_agent_with_finetuned_model/configs/model_configs.json index ed491e572..ff105c00c 100644 --- a/examples/conversation_with_agent_with_finetuned_model/configs/model_configs.json +++ b/examples/conversation_with_agent_with_finetuned_model/configs/model_configs.json @@ -3,16 +3,20 @@ "model_type": "huggingface", "config_name": "my_custom_model", - "model_id": "openlm-research/open_llama_3b_v2", + "pretrained_model_name_or_path": "google/gemma-7b", "max_length": 128, "device": "cuda", - "data_path": "databricks/databricks-dolly-15k", + "data_path": "GAIR/lima", "fine_tune_config": { - "lora_config": {"r": 20, "lora_alpha": 40}, - "training_args": {"max_steps": 1000, "logging_steps": 1} + "lora_config": {"r": 16, "lora_alpha": 32}, + "training_args": {"max_steps": 200, "logging_steps": 1}, + "bnb_config" : {"load_in_4bit": "True", + "bnb_4bit_use_double_quant": "True", + "bnb_4bit_quant_type": "nf4", + "bnb_4bit_compute_dtype": "torch.bfloat16"} } } ] \ No newline at end of file diff --git a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py index 5c9836bd0..9ec04c545 100644 --- a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py @@ -7,12 +7,11 @@ and conducting a dialogue via a sequential pipeline. The conversation continues until the user exits. Features include model and tokenizer loading, -and fine-tuning on the databricks-dolly-15k dataset with adjustable parameters. +and fine-tuning on the lima dataset with adjustable parameters. """ -from finetune_dialogagent import Finetune_DialogAgent - # pylint: disable=unused-import from huggingface_model import HuggingFaceWrapper +from finetune_dialogagent import Finetune_DialogAgent import agentscope from agentscope.agents.user_agent import UserAgent from agentscope.pipelines.functional import sequentialpipeline @@ -30,14 +29,16 @@ def main() -> None: "config_name": "my_custom_model", # Or another generative model of your choice. # Needed from loading from Hugging Face. - "model_id": "openlm-research/open_llama_3b_v2", + "pretrained_model_name_or_path": "google/gemma-7b", # "local_model_path": # Specify your local model path # "local_tokenizer_path": # Specify your local tokenizer path "max_length": 128, + # Device for inference. Fine-tuning occurs on gpus. "device": "cuda", # Specify a Hugging Face data path if you # wish to finetune the model from the start - "data_path": "databricks/databricks-dolly-15k", + "data_path": "GAIR/lima", + # "output_dir": # fine_tune_config (Optional): Configuration for # fine-tuning the model. # This dictionary can include hyperparameters and other @@ -46,8 +47,14 @@ def main() -> None: # `lora_config` and `training_args` follow # the standard lora and sfttrainer fields. "fine_tune_config": { - "lora_config": {"r": 20, "lora_alpha": 40}, - "training_args": {"max_steps": 1000, "logging_steps": 1}, + "lora_config": {"r": 16, "lora_alpha": 32}, + "training_args": {"max_steps": 200, "logging_steps": 1}, + "bnb_config": { + "load_in_4bit": True, + "bnb_4bit_use_double_quant": True, + "bnb_4bit_quant_type": "nf4", + "bnb_4bit_compute_dtype": "torch.bfloat16", + }, }, }, ], @@ -61,34 +68,39 @@ def main() -> None: # Init agents with the custom model dialog_agent = Finetune_DialogAgent( name="Assistant", - sys_prompt="You're a helpful assistant.", + sys_prompt=( + "Explain in simple terms how the attention mechanism of " + "a transformer model works." + ), # Use your custom model config name here model_config_name="my_custom_model", ) + # (Optional) can load another model after + # the agent has been instantiated if needed dialog_agent.load_model( - model_id="openlm-research/open_llama_3b_v2", + pretrained_model_name_or_path="google/gemma-7b", local_model_path=None, ) # load model gemma-2b-it from Hugging Face dialog_agent.load_tokenizer( - model_id="openlm-research/open_llama_3b_v2", + pretrained_model_name_or_path="google/gemma-7b", local_tokenizer_path=None, ) # load tokenizer for gemma-2b-it from Hugging Face # fine-tune loaded model with databricks-dolly-15k dataset # with default hyperparameters - # dialog_agent.fine_tune(data_path="databricks/databricks-dolly-15k") + # dialog_agent.fine_tune(data_path="GAIR/lima") # fine-tune loaded model with databricks-dolly-15k dataset # with customized hyperparameters # (`fine_tune_config` argument is optional. Defaults to None.) - dialog_agent.fine_tune( - "databricks/databricks-dolly-15k", - fine_tune_config={ - "lora_config": {"r": 24, "lora_alpha": 48}, - "training_args": {"max_steps": 300, "logging_steps": 3}, - }, - ) + # dialog_agent.fine_tune( + # "GAIR/lima", + # fine_tune_config={ + # "lora_config": {"r": 24, "lora_alpha": 48}, + # "training_args": {"max_steps": 300, "logging_steps": 3}, + # }, + # ) user_agent = UserAgent() diff --git a/examples/conversation_with_agent_with_finetuned_model/finetune_dialogagent.py b/examples/conversation_with_agent_with_finetuned_model/finetune_dialogagent.py index 10c5c583f..60a68ca31 100644 --- a/examples/conversation_with_agent_with_finetuned_model/finetune_dialogagent.py +++ b/examples/conversation_with_agent_with_finetuned_model/finetune_dialogagent.py @@ -56,15 +56,16 @@ def __init__( def load_model( self, - model_id: Optional[str] = None, + pretrained_model_name_or_path: Optional[str] = None, local_model_path: Optional[str] = None, ) -> None: """ Load a new model into the agent. Arguments: - model_id (str): The Hugging Face model ID or a custom identifier. - Needed if loading model from Hugging Face. + pretrained_model_name_or_path (str): The Hugging Face + model ID or a custom identifier. + Needed if loading model from Hugging Face. local_model_path (str, optional): Path to a locally saved model. Raises: @@ -73,7 +74,10 @@ def load_model( """ if hasattr(self.model, "load_model"): - self.model.load_model(model_id, local_model_path) + self.model.load_model( + pretrained_model_name_or_path, + local_model_path, + ) else: logger.error( "The model wrapper does not support dynamic model loading.", @@ -81,14 +85,15 @@ def load_model( def load_tokenizer( self, - model_id: Optional[str] = None, + pretrained_model_name_or_path: Optional[str] = None, local_tokenizer_path: Optional[str] = None, ) -> None: """ Load a new tokenizer for the agent. Arguments: - model_id (str): The Hugging Face model ID or a custom identifier. + pretrained_model_name_or_path (str): The Hugging Face model + ID or a custom identifier. Needed if loading tokenizer from Hugging Face. local_tokenizer_path (str, optional): Path to a locally saved tokenizer. @@ -99,13 +104,17 @@ def load_tokenizer( """ if hasattr(self.model, "load_tokenizer"): - self.model.load_tokenizer(model_id, local_tokenizer_path) + self.model.load_tokenizer( + pretrained_model_name_or_path, + local_tokenizer_path, + ) else: logger.error("The model wrapper does not support dynamic loading.") def fine_tune( self, data_path: Optional[str] = None, + output_dir: Optional[str] = None, fine_tune_config: Optional[Dict[str, Any]] = None, ) -> None: """ @@ -113,6 +122,11 @@ def fine_tune( Arguments: data_path (str): The path to the training data. + output_dir (str, optional): User specified path + to save the fine-tuned model + and its tokenizer. By default + save to this example's + directory if not specified. Raises: Exception: If fine-tuning fails or if the @@ -120,7 +134,7 @@ def fine_tune( """ if hasattr(self.model, "fine_tune"): - self.model.fine_tune(data_path, fine_tune_config) + self.model.fine_tune(data_path, output_dir, fine_tune_config) logger.info("Fine-tuning completed successfully.") else: logger.error("The model wrapper does not support fine-tuning.") diff --git a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py index a7f86ef4b..692e690f6 100644 --- a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py @@ -10,7 +10,11 @@ import os import torch -from transformers import AutoModelForCausalLM, AutoTokenizer +from transformers import ( + AutoModelForCausalLM, + AutoTokenizer, + BitsAndBytesConfig, +) from loguru import logger from dotenv import load_dotenv @@ -31,9 +35,10 @@ class HuggingFaceWrapper(ModelWrapperBase): def __init__( self, config_name: str, - model_id: Optional[str] = None, + pretrained_model_name_or_path: Optional[str] = None, max_length: int = 512, data_path: Optional[str] = None, + output_dir: Optional[str] = None, device: Optional[torch.device] = None, local_model_path: Optional[str] = None, local_tokenizer_path: Optional[str] = None, @@ -44,13 +49,19 @@ def __init__( Arguments: config_name (str): Configuration name for model setup. - model_id (str): Identifier for the pre-trained model on - Hugging Face. + pretrained_model_name_or_path (str): Identifier for + the pre-trained model on + Hugging Face. max_length (int): Maximum sequence length for the model output per reply. Defaults to 512. data_path (str, optional): Path to the dataset for fine-tuning the model. + output_dir (str, optional): User specified path to save + the fine-tuned model + and its tokenizer. By default + save to this example's + directory if not specified. device (torch.device, optional): Device to run the model on. Default to GPU if available. local_model_path (str, optional): Local file path to a @@ -62,7 +73,7 @@ def __init__( super().__init__(config_name=config_name) self.model = None self.max_length = max_length # Set max_length as an attribute - self.model_id = model_id + self.pretrained_model_name_or_path = pretrained_model_name_or_path relative_path = os.path.join( os.path.dirname(__file__), "../conversation_with_agent_with_finetuned_model/.env", @@ -78,9 +89,12 @@ def __init__( else: self.device = device - self.load_model(model_id, local_model_path=local_model_path) + self.load_model( + pretrained_model_name_or_path, + local_model_path=local_model_path, + ) self.load_tokenizer( - model_id, + pretrained_model_name_or_path, local_tokenizer_path=local_tokenizer_path, ) @@ -89,6 +103,7 @@ def __init__( self.model, self.tokenizer, data_path, + output_dir, token=self.huggingface_token, fine_tune_config=fine_tune_config, ) @@ -197,8 +212,9 @@ def format( def load_model( self, - model_id: Optional[str] = None, + pretrained_model_name_or_path: Optional[str] = None, local_model_path: Optional[str] = None, + fine_tune_config: Optional[Dict[str, Any]] = None, ) -> None: """ Load a new model for the agent from @@ -206,7 +222,8 @@ def load_model( Arguments: local_model_path (str): The file path to the model to be loaded. - model_id (str): An identifier for the model on Huggingface. + pretrained_model_name_or_path (str): An identifier for + the model on Huggingface. Raises: Exception: If the model cannot be loaded from the given @@ -216,25 +233,37 @@ def load_model( or network issues while fetching the model. """ + bnb_config_default = {} + + if fine_tune_config is not None: + if fine_tune_config.get("bnb_config") is not None: + bnb_config_default.update(fine_tune_config["bnb_config"]) + + bnb_config = BitsAndBytesConfig(**bnb_config_default) + try: if local_model_path is None: self.model = AutoModelForCausalLM.from_pretrained( - model_id, + pretrained_model_name_or_path, + quantization_config=bnb_config, token=self.huggingface_token, device_map="auto", ) info_msg = ( - f"Successfully loaded new model '{model_id}' from " + f"Successfully loaded new model " + f"'{pretrained_model_name_or_path}' from " f"Hugging Face" ) else: self.model = AutoModelForCausalLM.from_pretrained( local_model_path, + quantization_config=bnb_config, local_files_only=True, device_map="auto", ) info_msg = ( - f"Successfully loaded new model '{model_id}' from " + f"Successfully loaded new model " + f"'{pretrained_model_name_or_path}' from " f"'{local_model_path}'" ) @@ -245,7 +274,7 @@ def load_model( # Handle exceptions during model loading, # such as file not found or load errors error_msg = ( - f"Failed to load model '{model_id}' " + f"Failed to load model '{pretrained_model_name_or_path}' " f"from '{local_model_path}': {e}" ) @@ -255,7 +284,7 @@ def load_model( def load_tokenizer( self, - model_id: Optional[str] = None, + pretrained_model_name_or_path: Optional[str] = None, local_tokenizer_path: Optional[str] = None, ) -> None: """ @@ -264,8 +293,12 @@ def load_tokenizer( Arguments: local_tokenizer_path (str): The file path to the tokenizer to be loaded. - model_id (str): An identifier for the model on Huggingface. - + pretrained_model_name_or_path (str): An identifier + for the model on Huggingface. + fine_tune_config (dict, optional): Configuration options for + fine-tuning the model, + including QLoRA and training + arguments. Raises: Exception: If the tokenizer cannot be loaded from the given path or identifier. Possible reasons include file not found, @@ -275,13 +308,13 @@ def load_tokenizer( try: if local_tokenizer_path is None: self.tokenizer = AutoTokenizer.from_pretrained( - model_id, + pretrained_model_name_or_path, token=self.huggingface_token, ) # log the successful tokenizer loading logger.info( f"Successfully loaded new tokenizer for model " - f"'{model_id}' from Hugging Face", + f"'{pretrained_model_name_or_path}' from Hugging Face", ) else: @@ -291,15 +324,16 @@ def load_tokenizer( # log the successful tokenizer loading logger.info( f"Successfully loaded new tokenizer for model " - f"'{model_id}' from '{local_tokenizer_path}'", + f"'{pretrained_model_name_or_path}'" + f" from '{local_tokenizer_path}'", ) - self.tokenizer.add_special_tokens({"pad_token": "[PAD]"}) except Exception as e: # Handle exceptions during model loading, # such as file not found or load errors error_message = ( - f"Failed to load tokenizer for model '{model_id}' from " + f"Failed to load tokenizer for model" + f" '{pretrained_model_name_or_path}' from " f"'{local_tokenizer_path}': {e}" ) logger.error(error_message) @@ -309,6 +343,7 @@ def load_tokenizer( def fine_tune( self, data_path: Optional[str] = None, + output_dir: Optional[str] = None, fine_tune_config: Optional[Dict[str, Any]] = None, ) -> None: """ @@ -317,6 +352,11 @@ def fine_tune( Arguments: data_path (str): The file path to the training data from Hugging Face. + output_dir (str, optional): User specified path + to save the fine-tuned model + and its tokenizer. By default + save to this example's + directory if not specified. Raises: Exception: If the fine-tuning process fails. This could be @@ -328,6 +368,7 @@ def fine_tune( self.model, self.tokenizer, data_path, + output_dir, token=self.huggingface_token, fine_tune_config=fine_tune_config, ) @@ -341,11 +382,71 @@ def fine_tune( ) raise + def filer_sequence_lengths( + self, + max_input_seq_length: int, + dataset_obj: List[Dict[str, List[str]]], + ) -> List[int]: + """ + Identifies and returns the indices of conversation + entries that exceed max_input_seq_length characters in length. + + Args: + dataset_obj (List[Dict[str, List[str]]]): A list where + each dictionary contains 'conversations', + a list of two strings (question and answer). + + Returns: + List[int]: Indices of conversations where the combined + length of the question and answer exceeds + max_input_seq_length characters. + """ + # Initialize a list to store the sequence lengths + sequence_lengths = [] + + # list of indices that are too long + too_long = [] + + # Loop over the dataset and get the lengths of text sequences + for idx, example in enumerate(dataset_obj): + sequence_length = len( + example["conversations"][0] + example["conversations"][1], + ) + sequence_lengths.append(sequence_length) + if sequence_length > max_input_seq_length: + too_long.append(idx) + + return too_long + + def formatting_prompts_func( + self, + example: Dict[str, List[List[str]]], + ) -> List[str]: + """ + Formats each conversation in the dataset for training. + Args: + example (Dict[str, List[List[str]]]): A dataset. + + Returns: + List[str]: A dataset with combined field. + """ + output_texts = [] + for i in range(len(example["conversations"])): + text = ( + "### Question: " + + example["conversations"][i][0] + + "\n ### Answer: " + + example["conversations"][i][1] + ) + output_texts.append(text) + return output_texts + def fine_tune_training( self, model: AutoModelForCausalLM, tokenizer: AutoTokenizer, data_path: Optional[str] = None, + output_dir: Optional[str] = None, token: Optional[str] = None, fine_tune_config: Optional[Dict[str, Any]] = None, ) -> AutoModelForCausalLM: @@ -361,10 +462,15 @@ def fine_tune_training( the pre-trained model. data_path (str): The file path or dataset identifier to load the dataset from Hugging Face. + output_dir (str, optional): User specified path + to save the fine-tuned model + and its tokenizer. By default + save to this example's + directory if not specified. token (str): The authentication token for Hugging Face. fine_tune_config (dict, optional): Configuration options for fine-tuning the model, - including LoRA and training + including QLoRA and training arguments. Returns: @@ -377,7 +483,7 @@ def fine_tune_training( Note: This method updates the model in place and also logs the fine-tuning process. - It utilizes the LoRA configuration and custom training arguments + It utilizes the QLoRA configuration and custom training arguments to adapt the pre-trained model to the specific dataset. The training log and trained model are saved in the same directory with the specific timestamp at saving time @@ -387,8 +493,15 @@ def fine_tune_training( from datetime import datetime import json - dataset = load_dataset(data_path, token=token) - dataset = dataset["train"].train_test_split(test_size=0.1) + dataset = load_dataset(data_path, split="train", token=token) + + indexes_to_drop = self.filer_sequence_lengths(300, dataset) + + dataset_reduced = dataset.select( + i for i in range(len(dataset)) if i not in set(indexes_to_drop) + ) + + formatted_dataset = dataset_reduced.train_test_split(test_size=0.1) from peft import LoraConfig @@ -406,70 +519,45 @@ def fine_tune_training( training_defaults = { "per_device_train_batch_size": 1, - # "gradient_accumulation_steps": 1, + "gradient_accumulation_steps": 4, "gradient_checkpointing": False, - # "max_steps": 10, - "num_train_epochs": 10, + "num_train_epochs": 5, "output_dir": "./", "optim": "paged_adamw_8bit", - "fp16": True, "logging_steps": 1, - "learning_rate": 1e-5, - # "num_train_epochs": 10.0, } if fine_tune_config is not None: if fine_tune_config.get("training_args") is not None: training_defaults.update(fine_tune_config["training_args"]) + if output_dir is not None: + training_defaults["output_dir"] = output_dir + from peft import get_peft_model lora_config = LoraConfig(**lora_config_default) model = get_peft_model(model, lora_config) - from trl import SFTTrainer import transformers + from trl import SFTTrainer, DataCollatorForCompletionOnlyLM - def formatting_func(example: Dict[str, Any]) -> Dict[str, str]: - if example.get("context", "") != "": - input_prompt = ( - f"Below is an instruction that describes a task, " - f"paired with an input that provides further context. " - f"Write a response that appropriately " - f"completes the request.\n\n" - f"### Instruction:\n" - f"{example['instruction']}\n\n" - f"### Input: \n" - f"{example['context']}\n\n" - f"### Response: \n" - f"{example['response']}" - ) - else: - input_prompt = ( - f"Below is an instruction that describes a task. " - "Write a response that appropriately " - f"completes the request.\n\n" - "### Instruction:\n" - f"{example['instruction']}\n\n" - f"### Response:\n" - f"{example['response']}" - ) - - return {"text": input_prompt} - - formatted_dataset = dataset.map(formatting_func) + collator = DataCollatorForCompletionOnlyLM( + response_template=" ### Answer:", + tokenizer=tokenizer, + ) trainer_args = transformers.TrainingArguments(**training_defaults) trainer = SFTTrainer( model, + formatting_func=self.formatting_prompts_func, + data_collator=collator, train_dataset=formatted_dataset["train"], eval_dataset=formatted_dataset["test"], - # data_collator=collator, peft_config=lora_config, args=trainer_args, - dataset_text_field="text", - max_seq_length=512, + max_seq_length=2048, ) logger.info( @@ -481,29 +569,49 @@ def formatting_func(example: Dict[str, Any]) -> Dict[str, str]: now = datetime.now() time_string = now.strftime("%Y-%m-%d_%H-%M-%S") + if output_dir is not None: + os.makedirs(output_dir, exist_ok=True) + # Specify the filename log_name_temp = model.config.name_or_path.split("/")[-1] log_name = f"{log_name_temp}_{time_string}_log_history.json" log_path = os.path.join(os.path.dirname(__file__), log_name) # log training history - with open(log_path, "w", encoding="utf-8") as f: - json.dump(trainer.state.log_history, f) + if output_dir is not None: + with open( + os.path.join(output_dir, log_name), + "w", + encoding="utf-8", + ) as f: + json.dump(trainer.state.log_history, f) + else: + with open(log_path, "w", encoding="utf-8") as f: + json.dump(trainer.state.log_history, f) # save model model_name = ( f"sft_{model.config.name_or_path.split('/')[-1]}_{time_string}" ) - model_path = os.path.join(os.path.dirname(__file__), model_name) + if output_dir is not None: + model_path = os.path.join(output_dir, model_name) + else: + model_path = os.path.join(os.path.dirname(__file__), model_name) trainer.save_model(model_path) # save tokenizer tokenizer_name_temp = model.config.name_or_path.split("/")[-1] tokenizer_name = f"sft_{tokenizer_name_temp}_tokenizer_{time_string}" - tokenizer_path = os.path.join( - os.path.dirname(__file__), - tokenizer_name, - ) + if output_dir is not None: + tokenizer_path = os.path.join( + output_dir, + tokenizer_name, + ) + else: + tokenizer_path = os.path.join( + os.path.dirname(__file__), + tokenizer_name, + ) tokenizer.save_pretrained(tokenizer_path) return model diff --git a/examples/game_gomoku/code/board_agent.py b/examples/game_gomoku/code/board_agent.py index 87247111b..f4c8641ea 100644 --- a/examples/game_gomoku/code/board_agent.py +++ b/examples/game_gomoku/code/board_agent.py @@ -25,7 +25,7 @@ EMPTY_PIECE = "0" -def board2img(board: np.ndarray, save_path: str) -> str: +def board2img(board: np.ndarray, output_dir: str) -> str: """Convert the board to an image and save it to the specified path.""" size = board.shape[0] @@ -63,9 +63,9 @@ def board2img(board: np.ndarray, save_path: str) -> str: ax.set_xticklabels(range(size)) ax.set_yticklabels(range(size)) ax.invert_yaxis() - plt.savefig(save_path, bbox_inches="tight", pad_inches=0.1) + plt.savefig(output_dir, bbox_inches="tight", pad_inches=0.1) plt.close(fig) # Close the figure to free memory - return save_path + return output_dir class BoardAgent(AgentBase): diff --git a/examples/game_gomoku/main.ipynb b/examples/game_gomoku/main.ipynb index df3149637..f7fc70f70 100644 --- a/examples/game_gomoku/main.ipynb +++ b/examples/game_gomoku/main.ipynb @@ -70,7 +70,7 @@ "import matplotlib.pyplot as plt\n", "import matplotlib.patches as patches\n", "\n", - "def board2img(board: np.ndarray, save_path: str)->str:\n", + "def board2img(board: np.ndarray, output_dir: str)->str:\n", " size = board.shape[0]\n", " fig, ax = plt.subplots(figsize=(10, 10))\n", " ax.set_xlim(0, size - 1)\n", @@ -100,9 +100,9 @@ " ax.set_xticklabels(range(size))\n", " ax.set_yticklabels(range(size))\n", " ax.invert_yaxis()\n", - " plt.savefig(save_path, bbox_inches='tight', pad_inches=0.1)\n", + " plt.savefig(output_dir, bbox_inches='tight', pad_inches=0.1)\n", " plt.close(fig) # Close the figure to free memory\n", - " return save_path" + " return output_dir" ], "metadata": { "collapsed": false, diff --git a/src/agentscope/web/README.md b/src/agentscope/web/README.md index 19011ab4b..118e65dca 100644 --- a/src/agentscope/web/README.md +++ b/src/agentscope/web/README.md @@ -12,7 +12,7 @@ To start a web UI, you can run the following python code: import agentscope agentscope.web.init( - path_save="YOUR_SAVE_PATH", + path_save="YOUR_output_dir", host="YOUR_WEB_IP", # defaults to 127.0.0.1 port=5000 # defaults to 5000 ) From 9998e66e91ceaac5be68303dccf4f46655a1716e Mon Sep 17 00:00:00 2001 From: zyzhang Date: Wed, 8 May 2024 17:24:07 +0000 Subject: [PATCH 18/55] resolve issues raised --- ...rsation_with_agent_with_finetuned_model.py | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py index 9ec04c545..244b7ec5d 100644 --- a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py @@ -76,22 +76,22 @@ def main() -> None: model_config_name="my_custom_model", ) - # (Optional) can load another model after - # the agent has been instantiated if needed - dialog_agent.load_model( - pretrained_model_name_or_path="google/gemma-7b", - local_model_path=None, - ) # load model gemma-2b-it from Hugging Face - dialog_agent.load_tokenizer( - pretrained_model_name_or_path="google/gemma-7b", - local_tokenizer_path=None, - ) # load tokenizer for gemma-2b-it from Hugging Face + # # (Optional) can load another model after + # # the agent has been instantiated if needed + # dialog_agent.load_model( + # pretrained_model_name_or_path="google/gemma-7b", + # local_model_path=None, + # ) # load model gemma-2b-it from Hugging Face + # dialog_agent.load_tokenizer( + # pretrained_model_name_or_path="google/gemma-7b", + # local_tokenizer_path=None, + # ) # load tokenizer for gemma-2b-it from Hugging Face - # fine-tune loaded model with databricks-dolly-15k dataset + # fine-tune loaded model with lima dataset # with default hyperparameters # dialog_agent.fine_tune(data_path="GAIR/lima") - # fine-tune loaded model with databricks-dolly-15k dataset + # fine-tune loaded model with lima dataset # with customized hyperparameters # (`fine_tune_config` argument is optional. Defaults to None.) # dialog_agent.fine_tune( From f6b46ed25ee945f2658e8087dafa9c3ae0ff1031 Mon Sep 17 00:00:00 2001 From: zyzhang Date: Wed, 8 May 2024 17:31:29 +0000 Subject: [PATCH 19/55] resolve issues raised --- .../huggingface_model.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py index 692e690f6..1ce44c86c 100644 --- a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py @@ -8,6 +8,8 @@ """ from typing import Sequence, Any, Union, List, Optional, Dict import os +from datetime import datetime +import json import torch from transformers import ( @@ -15,6 +17,9 @@ AutoTokenizer, BitsAndBytesConfig, ) +import transformers +from trl import SFTTrainer, DataCollatorForCompletionOnlyLM +from datasets import load_dataset from loguru import logger from dotenv import load_dotenv @@ -489,9 +494,6 @@ def fine_tune_training( directory with the specific timestamp at saving time as part of the log/model fodler name. """ - from datasets import load_dataset - from datetime import datetime - import json dataset = load_dataset(data_path, split="train", token=token) @@ -539,9 +541,6 @@ def fine_tune_training( lora_config = LoraConfig(**lora_config_default) model = get_peft_model(model, lora_config) - import transformers - from trl import SFTTrainer, DataCollatorForCompletionOnlyLM - collator = DataCollatorForCompletionOnlyLM( response_template=" ### Answer:", tokenizer=tokenizer, From 6bf09f1ca9a4f07d1a5ca01d631da7e46c116a58 Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Fri, 10 May 2024 17:30:50 +0800 Subject: [PATCH 20/55] Update README.md updated the dependencies needed --- examples/conversation_with_agent_with_finetuned_model/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/conversation_with_agent_with_finetuned_model/README.md b/examples/conversation_with_agent_with_finetuned_model/README.md index 366f2842c..a1ad7fe45 100644 --- a/examples/conversation_with_agent_with_finetuned_model/README.md +++ b/examples/conversation_with_agent_with_finetuned_model/README.md @@ -67,6 +67,7 @@ Before running this example, ensure you have installed the following packages: - `python-dotenv` - `datasets` - `trl` +- `bitsandbytes` Additionally, set `HUGGINGFACE_TOKEN` in the `agentscope/examples/conversation_with_agent_with_finetuned_model/.env`. From 8d7e8808aec4ac3f97a73bae4fea3d48df2503d9 Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Fri, 10 May 2024 17:51:49 +0800 Subject: [PATCH 21/55] Update README.md --- examples/conversation_with_agent_with_finetuned_model/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/README.md b/examples/conversation_with_agent_with_finetuned_model/README.md index a1ad7fe45..d9f682a5f 100644 --- a/examples/conversation_with_agent_with_finetuned_model/README.md +++ b/examples/conversation_with_agent_with_finetuned_model/README.md @@ -63,7 +63,6 @@ The example is tested using specific Hugging Face model `google/gemma-7b` on dat Before running this example, ensure you have installed the following packages: - `transformers` -- `peft` - `python-dotenv` - `datasets` - `trl` From 98b471ee164736ec145d28d9836aadbba86c7a5c Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Mon, 20 May 2024 22:37:14 +0800 Subject: [PATCH 22/55] Update huggingface_model.py Updated the way to read token from .env file, so that it can work in any example directory. --- .../huggingface_model.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py index 1ce44c86c..c5c2cbf3e 100644 --- a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py @@ -79,11 +79,9 @@ def __init__( self.model = None self.max_length = max_length # Set max_length as an attribute self.pretrained_model_name_or_path = pretrained_model_name_or_path - relative_path = os.path.join( - os.path.dirname(__file__), - "../conversation_with_agent_with_finetuned_model/.env", - ) - dotenv_path = os.path.normpath(relative_path) + script_path = os.path.abspath(__file__) + script_dir = os.path.dirname(script_path) + dotenv_path = os.path.join(script_dir, ".env") _ = load_dotenv(dotenv_path) # read local .env file self.huggingface_token = os.getenv("HUGGINGFACE_TOKEN") From ee062fd4a256ab7c08e2c4a4f59493248bf13df8 Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Wed, 22 May 2024 20:23:44 +0800 Subject: [PATCH 23/55] reverted unnecessary changes --- src/agentscope/web/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/agentscope/web/README.md b/src/agentscope/web/README.md index 855e2d831..1fa92ce7d 100644 --- a/src/agentscope/web/README.md +++ b/src/agentscope/web/README.md @@ -12,7 +12,7 @@ To start a web UI, you can run the following python code: import agentscope agentscope.web.init( - path_save="YOUR_output_dir", + path_save="YOUR_SAVE_PATH", host="YOUR_WEB_IP", # defaults to 127.0.0.1 port=5000 # defaults to 5000 ) From 6203f511829d9365bc2d16d05b232a7b8526c677 Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Wed, 22 May 2024 20:29:27 +0800 Subject: [PATCH 24/55] Revert back unnecessary changes --- docs/sphinx_doc/en/source/tutorial/105-logging.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sphinx_doc/en/source/tutorial/105-logging.md b/docs/sphinx_doc/en/source/tutorial/105-logging.md index 7575b11cd..98f872a8b 100644 --- a/docs/sphinx_doc/en/source/tutorial/105-logging.md +++ b/docs/sphinx_doc/en/source/tutorial/105-logging.md @@ -75,7 +75,7 @@ You can run the WebUI in the following python code: import agentscope agentscope.web.init( - path_save="YOUR_output_dir" + path_save="YOUR_SAVE_PATH" ) ``` From ce0671f01e1dec999eeb40470fd01b64b78b44e5 Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Wed, 22 May 2024 20:32:09 +0800 Subject: [PATCH 25/55] revert unnecessary change --- docs/sphinx_doc/zh_CN/source/tutorial/105-logging.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sphinx_doc/zh_CN/source/tutorial/105-logging.md b/docs/sphinx_doc/zh_CN/source/tutorial/105-logging.md index 073d30515..d517cd46b 100644 --- a/docs/sphinx_doc/zh_CN/source/tutorial/105-logging.md +++ b/docs/sphinx_doc/zh_CN/source/tutorial/105-logging.md @@ -76,7 +76,7 @@ logger.error("The agent encountered an unexpected error while processing a reque import agentscope agentscope.web.init( - path_save="YOUR_output_dir" + path_save="YOUR_SAVE_PATH" ) ``` From 456f1aeeb9eb314fee8e1ef4555d17015bd6a60f Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Wed, 22 May 2024 20:36:26 +0800 Subject: [PATCH 26/55] revert back unnecessary changes --- examples/game_gomoku/code/board_agent.py | 6 +- examples/game_gomoku/main.ipynb | 260 ++++++++++++----------- 2 files changed, 143 insertions(+), 123 deletions(-) diff --git a/examples/game_gomoku/code/board_agent.py b/examples/game_gomoku/code/board_agent.py index d84051277..6cbef4ced 100644 --- a/examples/game_gomoku/code/board_agent.py +++ b/examples/game_gomoku/code/board_agent.py @@ -25,7 +25,7 @@ EMPTY_PIECE = "0" -def board2img(board: np.ndarray, output_dir: str) -> str: +def board2img(board: np.ndarray, save_path: str) -> str: """Convert the board to an image and save it to the specified path.""" size = board.shape[0] @@ -63,9 +63,9 @@ def board2img(board: np.ndarray, output_dir: str) -> str: ax.set_xticklabels(range(size)) ax.set_yticklabels(range(size)) ax.invert_yaxis() - plt.savefig(output_dir, bbox_inches="tight", pad_inches=0.1) + plt.savefig(save_path, bbox_inches="tight", pad_inches=0.1) plt.close(fig) # Close the figure to free memory - return output_dir + return save_path class BoardAgent(AgentBase): diff --git a/examples/game_gomoku/main.ipynb b/examples/game_gomoku/main.ipynb index 7044a8243..569321c15 100644 --- a/examples/game_gomoku/main.ipynb +++ b/examples/game_gomoku/main.ipynb @@ -31,6 +31,13 @@ { "cell_type": "code", "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-27T08:09:57.602994Z", + "start_time": "2024-03-27T08:09:57.565787Z" + }, + "collapsed": false + }, "outputs": [], "source": [ "YOUR_MODEL_CONFIGURATION_NAME = \"{YOUR_MODEL_CONFIGURATION_NAME}\"\n", @@ -39,38 +46,38 @@ " \n", " # ...\n", "}" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2024-03-27T08:09:57.602994Z", - "start_time": "2024-03-27T08:09:57.565787Z" - } - } + ] }, { "cell_type": "markdown", + "metadata": { + "collapsed": false + }, "source": [ "## Step 1: Prepare a board for Gomoku\n", "\n", "First we create a `BoardAgent` class by inheriting from `AgentBase`, which manage the game board and update the game status as follows.\n", "\n", "To create a better visual experience, we also provide a function `board2img` to convert the board to an image. " - ], - "metadata": { - "collapsed": false - } + ] }, { "cell_type": "code", "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-27T08:09:58.153932Z", + "start_time": "2024-03-27T08:09:57.571266Z" + }, + "collapsed": false + }, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import matplotlib.patches as patches\n", "\n", - "def board2img(board: np.ndarray, output_dir: str)->str:\n", + "def board2img(board: np.ndarray, save_path: str)->str:\n", " size = board.shape[0]\n", " fig, ax = plt.subplots(figsize=(10, 10))\n", " ax.set_xlim(0, size - 1)\n", @@ -100,29 +107,30 @@ " ax.set_xticklabels(range(size))\n", " ax.set_yticklabels(range(size))\n", " ax.invert_yaxis()\n", - " plt.savefig(output_dir, bbox_inches='tight', pad_inches=0.1)\n", + " plt.savefig(save_path, bbox_inches='tight', pad_inches=0.1)\n", " plt.close(fig) # Close the figure to free memory\n", - " return output_dir" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2024-03-27T08:09:58.153932Z", - "start_time": "2024-03-27T08:09:57.571266Z" - } - } + " return save_path" + ] }, { "cell_type": "markdown", - "source": [ - "The following code shows the implementation of the `BoardAgent` class. The agent manages the game board and updates the game status." - ], "metadata": { "collapsed": false - } + }, + "source": [ + "The following code shows the implementation of the `BoardAgent` class. The agent manages the game board and updates the game status." + ] }, { "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-27T08:09:59.392069Z", + "start_time": "2024-03-27T08:09:58.159470Z" + }, + "collapsed": false + }, "outputs": [], "source": [ "import numpy as np\n", @@ -229,18 +237,13 @@ " else:\n", " count = 0\n", " return False\n" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2024-03-27T08:09:59.392069Z", - "start_time": "2024-03-27T08:09:58.159470Z" - } - }, - "execution_count": 3 + ] }, { "cell_type": "markdown", + "metadata": { + "collapsed": false + }, "source": [ "### Step2: Prepare a Gomoku Player Agent\n", "\n", @@ -250,13 +253,18 @@ "2. Within the agent, to enable the agent to think, we ask LLMs to respond in a dictionary format, which contains the thought and the move (\"thought\" field must come before \"move\"). To achieve this, we prepare a parsing function to extract the dictionary from response. \n", "\n", "The implementation of the Gomoku agent is as follows: " - ], - "metadata": { - "collapsed": false - } + ] }, { "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-27T08:09:59.397713Z", + "start_time": "2024-03-27T08:09:59.392729Z" + }, + "collapsed": false + }, "outputs": [], "source": [ "import json\n", @@ -327,15 +335,7 @@ " \n", " # Hide thought from the response\n", " return Msg(self.name, response[\"move\"], role=\"assistant\") \n" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2024-03-27T08:09:59.397713Z", - "start_time": "2024-03-27T08:09:59.392729Z" - } - }, - "execution_count": 4 + ] }, { "cell_type": "markdown", @@ -346,17 +346,25 @@ }, { "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-27T08:09:59.446367Z", + "start_time": "2024-03-27T08:09:59.398116Z" + }, + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\u001B[32m2024-03-27 16:09:59.427\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36magentscope.models\u001B[0m:\u001B[36mread_model_configs\u001B[0m:\u001B[36m171\u001B[0m - \u001B[1mLoad configs for model wrapper: post_api\u001B[0m\n", - "\u001B[32m2024-03-27 16:09:59.435\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36magentscope.utils.monitor\u001B[0m:\u001B[36m_create_monitor_table\u001B[0m:\u001B[36m341\u001B[0m - \u001B[1mInit [monitor_metrics] as the monitor table\u001B[0m\n", - "\u001B[32m2024-03-27 16:09:59.435\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36magentscope.utils.monitor\u001B[0m:\u001B[36m_create_monitor_table\u001B[0m:\u001B[36m342\u001B[0m - \u001B[1mInit [monitor_metrics_quota_exceeded] as the monitor trigger\u001B[0m\n", - "\u001B[32m2024-03-27 16:09:59.436\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36magentscope.utils.monitor\u001B[0m:\u001B[36m__init__\u001B[0m:\u001B[36m311\u001B[0m - \u001B[1mSqliteMonitor initialization completed at [./runs/run_20240327-160958_kbf2ta/agentscope.db]\u001B[0m\n", - "\u001B[32m2024-03-27 16:09:59.440\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36magentscope.models.model\u001B[0m:\u001B[36m__init__\u001B[0m:\u001B[36m257\u001B[0m - \u001B[1mInitialize model [post_api]\u001B[0m\n", - "\u001B[32m2024-03-27 16:09:59.441\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36magentscope.models.model\u001B[0m:\u001B[36m__init__\u001B[0m:\u001B[36m257\u001B[0m - \u001B[1mInitialize model [post_api]\u001B[0m\n" + "\u001b[32m2024-03-27 16:09:59.427\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36magentscope.models\u001b[0m:\u001b[36mread_model_configs\u001b[0m:\u001b[36m171\u001b[0m - \u001b[1mLoad configs for model wrapper: post_api\u001b[0m\n", + "\u001b[32m2024-03-27 16:09:59.435\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36magentscope.utils.monitor\u001b[0m:\u001b[36m_create_monitor_table\u001b[0m:\u001b[36m341\u001b[0m - \u001b[1mInit [monitor_metrics] as the monitor table\u001b[0m\n", + "\u001b[32m2024-03-27 16:09:59.435\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36magentscope.utils.monitor\u001b[0m:\u001b[36m_create_monitor_table\u001b[0m:\u001b[36m342\u001b[0m - \u001b[1mInit [monitor_metrics_quota_exceeded] as the monitor trigger\u001b[0m\n", + "\u001b[32m2024-03-27 16:09:59.436\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36magentscope.utils.monitor\u001b[0m:\u001b[36m__init__\u001b[0m:\u001b[36m311\u001b[0m - \u001b[1mSqliteMonitor initialization completed at [./runs/run_20240327-160958_kbf2ta/agentscope.db]\u001b[0m\n", + "\u001b[32m2024-03-27 16:09:59.440\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36magentscope.models.model\u001b[0m:\u001b[36m__init__\u001b[0m:\u001b[36m257\u001b[0m - \u001b[1mInitialize model [post_api]\u001b[0m\n", + "\u001b[32m2024-03-27 16:09:59.441\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36magentscope.models.model\u001b[0m:\u001b[36m__init__\u001b[0m:\u001b[36m257\u001b[0m - \u001b[1mInitialize model [post_api]\u001b[0m\n" ] } ], @@ -381,18 +389,13 @@ ")\n", "\n", "board = BoardAgent(name=\"Host\")" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2024-03-27T08:09:59.446367Z", - "start_time": "2024-03-27T08:09:59.398116Z" - } - }, - "execution_count": 5 + ] }, { "cell_type": "markdown", + "metadata": { + "collapsed": false + }, "source": [ "### Step 3: Start the Gomoku game\n", "\n", @@ -401,26 +404,32 @@ "In this game, we use a message hub to share messages between the two players (board agent doesn't have memory), so that one player can hear what the board agent says to the other player, and what moves the other player makes. \n", "\n", "Note here we only show 10 steps of the game. You can adjust the `MAX_STEPS` to play more rounds." - ], - "metadata": { - "collapsed": false - } + ] }, { "cell_type": "code", "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-27T08:10:33.989202Z", + "start_time": "2024-03-27T08:09:59.446824Z" + }, + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: Welcome to the Gomoku game! Black player goes first. Please make your move.\n" + "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: Welcome to the Gomoku game! Black player goes first. Please make your move.\n" ] }, { "data": { - "text/plain": "
", - "image/png": "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" + "image/png": "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", + "text/plain": [ + "
" + ] }, "metadata": { "needs_background": "light" @@ -431,14 +440,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001B[32m\u001B[1mAlice\u001B[0m\u001B[32m\u001B[0m: {\n", + "\u001b[32m\u001b[1mAlice\u001b[0m\u001b[32m\u001b[0m: {\n", " \"thought\": \"As the first move of the game, it's best to place the piece in the center of the board to maximize possible winning directions.\",\n", " \"move\": [\n", " 7,\n", " 7\n", " ]\n", "}\n", - "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", + "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -459,8 +468,10 @@ }, { "data": { - "text/plain": "
", - "image/png": "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" + "image/png": "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", + "text/plain": [ + "
" + ] }, "metadata": { "needs_background": "light" @@ -471,14 +482,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001B[35m\u001B[1mBob\u001B[0m\u001B[35m\u001B[0m: {\n", + "\u001b[35m\u001b[1mBob\u001b[0m\u001b[35m\u001b[0m: {\n", " \"thought\": \"As the game has just started, I will place my piece near Alice's to prevent her from forming a line and to start building my own line.\",\n", " \"move\": [\n", " 7,\n", " 8\n", " ]\n", "}\n", - "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", + "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -499,8 +510,10 @@ }, { "data": { - "text/plain": "
", - "image/png": "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O/m+++77P4FAgLtb8+HDh2fu27fPkcvluG8n8cQTTyzYvn37xL6+Pm539uzZsY6ODsXtdnN1H0+n04YHHnhg8S9/+cv5fX19XB2mM5mM8ac//ekVTz/99Phdu3YVHT6DwaC9+uqr5e3t7XObm5trN23adLmqqkWFwGAwsG3btlk9Hs8Et9ttffvttycUO67ZbGa7d+82dnd3TxozZoz7ueeeW5jJZIp6wzEajWzv3r1aZ2fnZLPZnPjTn/60JJvNFv1m1dLSkm9ubp7x+9//fsFDDz30xVAo9LnPt6TgMsYMVquVjRs3LqOqKner9GnTpiUNBoMqMrbH43Gk02nbNddcw30Pmblz52bnz58/mEwmbbzu3r17v3DBBRdUejyeol8UBSZMmHDEYrEk/vznP8/jdVOpVMWkSZPk1tbWL/C6ZrNZPXHixLirrrrqNI+nqqrBYrHkxo4d68/lclzfMMrLy7U777zzqM1mq8vn80W/iG02mzZp0qQ4Y8w8efJkqa6urugxLRYLmzx5ctxut2tXXHFFgme+ADBlypSYyWRinZ2ds6ZOnXqmvLy86KNF06ZNixmNRtTX14c/7B9ddLamTZsWb29vL+/o6LjU6XRO8vv9n/tNsKTg1tbWKitXruyxWq01CxYs8PL6iURienV1dU1fXx/3p1dvb+/cpUuXGhKJBPfX3ffee69+4sSJZcuWLRvmdR9++OFt995770sNDQ39vG5XV9eYqqqqmmuvvbaP1/3ud7/bVlNTY168eHE3rxuJRExXXnll37Rp0zI8XmVlpfbNb35zYOHChdr48eODvONOmDDBuGzZsv7ly5f3FOvIsmyePHny5L6+PlsqlXJOnz69p9g7ruTzedPEiROntLW1Te/p6ZnidDqna5pW1Ke1oijG2traacePH5/h9XovWbp0qUVRlKJcTdMMTqfzwp6enilvvvnmoiVLlvgsFku+GBcAbDbbhZMnT67YvHnzc9/+9re3TZs2Lft5joExul6YIPQGXTlFEDqEgksQOoSCSxA6hIJLEDqEgksQOoSCSxA6hIJLEDqEgksQOoSCSxA65P8D2qq520he9+8AAAAASUVORK5CYII=" + "image/png": "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O/m+++77P4FAgLtb8+HDh2fu27fPkcvluG8n8cQTTyzYvn37xL6+Pm539uzZsY6ODsXtdnN1H0+n04YHHnhg8S9/+cv5fX19XB2mM5mM8ac//ekVTz/99Phdu3YVHT6DwaC9+uqr5e3t7XObm5trN23adLmqqkWFwGAwsG3btlk9Hs8Et9ttffvttycUO67ZbGa7d+82dnd3TxozZoz7ueeeW5jJZIp6wzEajWzv3r1aZ2fnZLPZnPjTn/60JJvNFv1m1dLSkm9ubp7x+9//fsFDDz30xVAo9LnPt6TgMsYMVquVjRs3LqOqKner9GnTpiUNBoMqMrbH43Gk02nbNddcw30Pmblz52bnz58/mEwmbbzu3r17v3DBBRdUejyeol8UBSZMmHDEYrEk/vznP8/jdVOpVMWkSZPk1tbWL/C6ZrNZPXHixLirrrrqNI+nqqrBYrHkxo4d68/lclzfMMrLy7U777zzqM1mq8vn80W/iG02mzZp0qQ4Y8w8efJkqa6urugxLRYLmzx5ctxut2tXXHFFgme+ADBlypSYyWRinZ2ds6ZOnXqmvLy86KNF06ZNixmNRtTX14c/7B9ddLamTZsWb29vL+/o6LjU6XRO8vv9n/tNsKTg1tbWKitXruyxWq01CxYs8PL6iURienV1dU1fXx/3p1dvb+/cpUuXGhKJBPfX3ffee69+4sSJZcuWLRvmdR9++OFt995770sNDQ39vG5XV9eYqqqqmmuvvbaP1/3ud7/bVlNTY168eHE3rxuJRExXXnll37Rp0zI8XmVlpfbNb35zYOHChdr48eODvONOmDDBuGzZsv7ly5f3FOvIsmyePHny5L6+PlsqlXJOnz69p9g7ruTzedPEiROntLW1Te/p6ZnidDqna5pW1Ke1oijG2traacePH5/h9XovWbp0qUVRlKJcTdMMTqfzwp6enilvvvnmoiVLlvgsFku+GBcAbDbbhZMnT67YvHnzc9/+9re3TZs2Lft5joExul6YIPQGXTlFEDqEgksQOoSCSxA6hIJLEDqEgksQOoSCSxA6hIJLEDqEgksQOoSCSxA65P8D2qq520he9+8AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] }, "metadata": { "needs_background": "light" @@ -511,14 +524,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001B[32m\u001B[1mAlice\u001B[0m\u001B[32m\u001B[0m: {\n", + "\u001b[32m\u001b[1mAlice\u001b[0m\u001b[32m\u001b[0m: {\n", " \"thought\": \"My opponent placed his piece next to mine. I should block him and also try to create a potential line for myself.\",\n", " \"move\": [\n", " 7,\n", " 6\n", " ]\n", "}\n", - "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", + "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -539,8 +552,10 @@ }, { "data": { - "text/plain": "
", - "image/png": "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" + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAO4AAADnCAYAAAAZ4WrqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAAsTAAALEwEAmpwYAAAjBklEQVR4nO2de3BU5f3/33vLbrKbkHBP5CYQUAT8ChVBBH+2Iqgt/mhDK8VbW7W2OtQ6nbY67fQy+q3Wjq2tl2nHS1ssXsAqF0XwEkAghCRAEmBJQjbJZrOb7P1+9uyec57fH7j8bIu6z7NAPNPPaybjOOzrPM+ez773cs55zsfAGANBEPrCONwTIAiCHwouQegQCi5B6BAKLkHoEAouQegQCi5B6BAKLkHoEO7gHj9+vHL9+vWLBgcHy87FhAiC+GwMvBdgrFmzZllVVZVSU1OT/tnPftYoy7KZMWY6R/MjiP8azGazYjab1YIey7txRVHMF110kd/v94+QZdm4devWLxw+fPjh2bNnV/NuS9M0HD16FHPnzuVVwRhDW1sbLr30Um4XAFpbW4XcZDKJoaEhTJs2jduVJAn9/f2YMWMGtyvLMlwuFy6++GJuV1EUdHR04JJLLuF2NU3DsWPHMGfOHG6XMYb29vbzXt94PI5gMIipU6dyu6lUCl6vF7W1tdxuJpNBb28vLrroIm43l8ux0tLS/129evWGggTGGNffa6+9NuXOO+/8elNT0xjGGGRZtrz00kttTIBcLsf+/ve/i6hM0zT217/+Vdh98cUXhVyv18u2b98u5AaDQbZ582YhNx6Ps40bNwq56XSabdiwQcjNZrNs/fr1Qq6qquxvf/ubkFtMjfr7+9nOnTuF3KGhIbZt2zYhNxKJsH/+859CbjKZVF599dV7WIE55P7EXb16de/q1at7eT2CIM4edFSZIHTIsAbXYDAM5/AEoVuGNbiMlhQShBD0VZkgdAgFlyB0CAWXIHQIBZcgdAgFlyB0CAWXIHQIncclCB3CHdy9e/dO/NnPfrb2bAxO53EJQgzua5UnT57sczqdmqZpBk3TcPz48Qlut9t65MgR7sE1TYPb7YaIyxgTdgGgv79fyA0Gg3C5XEJuLBZDT0+PkJtOp9Hb2yvkZrNZ9PX1Cbmqqgq7w1WjoaEh4X0ViUSE65tMJoXrm8lkIMtywY/nDq7BYLDIslwRi8Vs5eXlGU3TDIwxaJrGuylomnb6TwTRcT8+tsiYouMW42qapju3mOeb9/+b9jMP3ME1Go22u+++uzMUCpVVVVVJs2fP7nc6nfK8efN4NwVFUeB0OiHiso/Weoq6bW1tQq7P54OqqkJuKBRCPB4XchOJBAYHB4VcSZLQ09Mj5OZyOXR0dAi5+bW857tGHo8HJpNJyPX7/chkMkJuNBpFKBQSclOpFDweT8GP5w5uTU1NZOXKlfW8HkEQZw86HUQQOoSCSxA6hIJLEDqEgksQOoSunCIIHUJ3wCAIHUJflQlCh1BwCUKHUHAJQodwBzcSiVj9fv8IRVHoyBJBDBPclzw+99xz1U6n8/KlS5ceueOOO7rOxaQIgvh0uIN722239d93332XVFRUpPNNvw4cOOAwmfgb9mmahgMHDsBisXC7jDE0NjbCarVyuwDQ2NgIm83G7UWjUfT19SEajXK7yWQSHR0dSKfT3K4kSWhra4OiKNxuNptFc3Oz0Ok3VVXR0NAAs5n7pXK6viUlJdxuvr4iNQqFQvB6vQiFQtxuPB5Hd3c3EokEt5tOp3Hs2DGu5Xl5ZFnmqi13NR555JEFpaWlU2bNmtVgtVq16667rjWZTKZuuukm3k1BVVVIkgQRlzGGZDIp5AKnVtuIuIODg2hvb8eyZcu43XA4jMrKStx4443cbiKRgNVqFZpzJpMBACFXURTIsizkapqGdDp93us7MDCAjo4OfPGLX+R2A4EAWlpasGLFCm43FovBbrdj5cqV3G46nca7775b8OO5g/urX/3qSDab7bDb7QkAsNlsOYvFwkpLS3k3BUVRUFJSAhGXMVaUa7FYhFybzSY8bjFuMfsKgPDzzeVywuNqmvZfVSNZlovaV0Zj4YecuINbVVUlAZB4PYIgzh50OoggdAgFlyB0CAWXIHQIBZcgdAgFlyB0CAWXIHQIBZcgdAgFlyB0CAWXIHQId3D37ds3etu2bfODwSD/1d8EQZwVuC95dLlc8vPPPz/j61//eub73//+MUVRTJqmCa1aUVUVqqoKuYwxYRc4dW3o+Z5zMa6iKEWNK/p8ixlX07Si6lvMnPVYX557sHEHd+HChVJTU5M/nU5bPlrWN7+hoaGcdzvA/1/2JbIkEDi1NE9kSSAA4eWEsVgMbrcb4XCY202lUujs7EQymeR2M5kM2tvbkc1mud1cLoeWlhbhZlQHDhzgugA+D2MMBw4cEFoSCIjXNxKJwOv1wu/3c7uJRAIulwuxWIzblSQJx48fhyTxX8rPW1fuPbp169YLTSZT1aJFi5xWq1VbtWrVQUVREmvX8rfMVRQFRqMRt956K7ebf0cWdVVVFXJ9Ph9aW1uFln2FQiHs27dPaNlXIpFAVVUV6urquF1JklBaWoo1a9Zwu7lcDiaTCbfccgu3m3+jON818ng8cDqdQksv/X4/mpqahJZeRqNR1NfXY9WqVdxuKpXCW2+9VfDjuYP7wAMPdAE4K3e+oPsqE4QYdF9lgtAhdDqIIHQIBZcgdAj1DiIIHUK/cQlCh9BXZYLQIRRcgtAhFFyC0CEUXILQIXRUmSB0CHdwY7GY8f777/+Kx+MZVezgdFSZIMTgvlZ58+bN019++eVJd955Z2t1dXW4u7t7nM/ns5w4cYJ7cE3T4PP5IOIyxoRd4FQPIBE3GAzC4/EIubFYDAMDA0JuKpWC1+sVcmVZFt5XqqrqrkZDQ0PCNQqHw8JuIpEQrq8kSVwrhLiDG41GJ0yfPn1MT09P9cyZM/uj0ag9lUqZRJa5aZqGZDIptEQOOPViFnVFx41Go0gkEkJuPB4XdiVJEp5zNpsVdlVVFXYZY0XVSNQtpkbFuKlUSnhfZTIZrmWX3MFdt27dB5dffvmxiy66KGmxWNj8+fNdLpcrc+WVV/JuCoqioKenByIuYwxdXV3Cbmdnp5Dr8/lgNpuF3FAohGw2K+QmEglEIhEhV5Ik+Hw+ITeXy6Gvr0/I1TQN3d3d571GHo8HZWVlQq7f7wdjTMiNRqNIJpNCbiqVQjAYLPjxQiucFy1aNCTiEQRxdqDTQQShQ+h0EEHoEFpkQBA6hL4qE4QOoeAShA6h4BKEDqHgEoQOoaPKBKFD6KgyQegQ7uD29fVVb9++fWEymSw9FxMiCOKz4b7kcc+ePZc0NTXZFi1axADgo6Zfhlwuxz14vkmSiJtvUSHi5scWcfNNsMj9bPJNv0RrpGmarp5vse45bfo1YcKEw3v37p33/PPPz7rvvvuOfNT0yyHyezXfUEqkKRRjDI2NjSgpKeF2AeDgwYOwWq3cXjQahdvtRiQS4XaTySQ6OzuRSqW43Uwmg7a2NqEXRS6XQ3NzM7cHnHqDE23Mlq+RaGM20fqGw2F4vV6ui/bzxONxuFwuxONxbjedTuP48ePIZDLcrizLXI/nTsyRI0cq7Xb7iEWLFh07G02/DAaDUEOpfNMvUVdRFCF3OJt+VVZWCjf9stlsw9L0izF23mtETb/OwA9/+MNuAN28HkEQZw86j0sQOoSCSxA6hIJLEDqEgksQOoSCSxA6hIJLEDqEgksQOoSCSxA6hIJLEDqEgksQOoQ7uLt27Rrzk5/8ZOUbb7wx9lxMiCCIz4b7WuU//vGPCw0GQ+lll11mUFXVcPLkyfFer7fE6XRyD66qKrxeL0RcxpiwC5xaLCDiBgIBuN1uITcajaK/v1/ITaVSpy+e50WWZQwMDAi5iqII72dN04qqr2iNBgcHhWsUDoeFa5RIJIRrdM6bfk2aNEkGkDl69OgldXV1/kQiUSpJkjEWi/FuCpqmIZ1OQ8RljEGSJCEXgLCbSCSE51yMm06nheeczWaFXVVVqUYFkkwmhd3z0fSrobm5+ZLa2lqn2Wxml112Wc/JkyczCxcu5N0UFEVBd3c3RNx8UyhR98SJE0Kuz+eDyWQSckOhEDKZjJCb7yAn4kqShIGBASE3l8uhp6dHyNU0DV1dXee9Rh6PB6WlpUKu3++HqqpCbr7Tn4ibSqXg9/sLfjx3cKdOnZqYOnXqAV6PIIizBx1VJggdQsElCB1CwSUIHULBJQgdItSR/mxBnQw+HcYYcrkc/H4/+vr60NfXB5fLherqathstk/dfx93PR4P3G43t+v1euHxeNDV1YWOjg5MnDgRpaWlVLfPAcMaXOpkcGby94xubm5GZ2cnxo4di3HjxuFLX/oSent7sX//fowZMwZLliz5jyDl747Y0tLyL+7y5ctPu2PHjsVVV111xhDmcjns2rULzzzzDA4ePIhAIABVVfHMM89g9uzZ+M53voOvfvWrFOBhZliDS5yZTCaDbdu2oaamBt/4xjdQUlJyOiT5UHd2dmLTpk244YYbMGrUqNP/Xojb0dFxRleSJDz22GP4/e9//x/3FQ4Gg9i1axcaGhrwzjvv4IknnsCYMWMovMME/cb9nKGqKnbu3IlZs2bhyiuvhNVq/ZdwGAwGmM1mXHzxxbjuuuuwffv20zfTVlUVO3bs+Ex31qxZZ3SfffZZPProo596M3BZlvHyyy/jpz/9KfdNvImzBwX3cwRjDD09PafD9WmfZgaDAePGjcOcOXNw4MABMMbgcrlQUlLC5TY2NoIxho6ODjz++OMFhVHTNLzyyit455136OfOMMEd3EQiYYlEIuWSJIn1lSA+ldbWVixYsKCgr6AGgwGzZs2C2+2GoijCbi6Xw6ZNmzA0NFTwPCVJwvr164X7AhHFwR3ctra2cffcc883/vGPf8w+FxP6byZ/Qf+oUaMKdiwWCyoqKhAMBpHJZDBy5Egu1+FwIBQKobm5mfvT8/Dhw0gkElwOcXbgPji1ePFiz29/+9vokiVLumVZNm7fvv2ygwcPOkQaaGmahqamJpSW8nfsZIyhqakJdrud2wWA5uZmOBwObi8ajaK3txfJZJLbTSaTOHHixCcu35JlGfF4HEZj4e+nBoMBFosFGzduhMVi4TpYZDAYYDKZsHHjRuFlips2bfrEN5p8jcrKyri3DYjXKBQKYWBgQGiVTjwex8mTJyFJErebTqdx9OhRqKrK7cqyzHXMgDu4nZ2dDpvNpsycOTMOAEuXLnWGQqH08uXLeTcFVVURi8Ug4jLGEA6HhVzg1FFSEXdoaAjt7e249tprud1wOIzS0tJPHFdRFGzevBmaphUc3vw51xUrVuDAAb61H/mjzNdffz3efvttnDx5kssvLy/HihUrPvFTXtM0RCIR4fqK1mhgYACdnZ245ppruN1gMIiKigqhcWOxGMxms5CbTqdRX19f8OO5g3vBBRek//SnP72T/3+Hw5Gx2WxaeXk576agKApsNhtEXMbYsLjJZBKlpaVCbjab/VSXMQa73Y5oNFrwV15FURCPxzFlyhQcOXIEsVgMlZWVBbvJZBKTJk3C/PnzsWPHjkKfCgBgzpw5GDduHGw22xn/XdO0YamRw+EQrpEkScKuqqrCrtFo5Pqmxf0b1263a2PHjuVvAHoG6BzgfzJ79my0tLQU/Hvz5MmTqK6uhsViwezZs9HU1FSQyxhDV1cXqqurUVJSgrq6Oq7f1iUlJVi7dq1Qj2GieIb1dBCdSvhXDAYDamtrEY1G4XK5PnX/5H8qHDx4EFdeeSUMBgNmzJhRsBuJRNDU1IRFixbBYDBgzpw5uPfeewtqQm0wGLBy5Up85StfoTffYWJYg0tF/0/MZjOuv/56HDhwAEeOHIGiKP8SwnxD776+PmzZsgXLli07ffDn311VVc/o9vb2ntH90Y9+hO9973uf+NX342M88cQTwgcGieKha5U/h9jtdtTV1WHfvn145ZVXMGnSJFRXV8NkMiEQCKC3txdWqxWrVq1CRUXFv7wBftx9+eWXuVyHw4HHHnsMixcvxtNPP4329nbEYjEwxuBwODBt2jTccccduP322zFixAh64x1G6FrlzyEGgwFWqxXXXHMN0uk0PB4Penp60NLSgi9/+ctYvnw5Kioqzngw40yu2+1GQ0MDbrrpps90bTYbVq9ejRtuuAEulwsulwt79uzBzTffjNraWowYMYLrIApxbqDgfo4xGAyw2+2YOXMmampqEI/HMWfOHG530qRJ8Pv9XK7D4cDcuXNx8cUXI5lMYsGCBcU8FeIsQ2+dBKFDKLgEoUMouAShQyi4BKFDuIPrdrsr3nvvvUs7OzvFrhz/GHQ6gSDE4D6q/Itf/OLy3bt3z7jnnnuMP/7xjw9rmmbIn9jnRdM0iLqMMWE375/vcYtxh2tfFTOuHudcbH01TStqzoXCHVxVVdmoUaNCZrPZKsuy8Y033liwb9++ctHJNjQ0cHvAqZ20f/9+4XOK+/fvh8lk4vai0SjcbjcCgQC3m0wm0dXVJdwUqr29XWi5WTabxaFDh6AoCrerqurpu2Twomka9u/fL/TNijGGhoYGoRqFw2H4fD4MDg5yu/F4HC6XC+FwmNtNp9M4fvw4UqkUtyvLMtdrmTu4S5YsCSeTyfFVVVV+q9Wqfe1rX2vUNC2xdu1a3k1BURSYTCbceuut3G7+hXTbbbcJuZqmCbk+nw+tra1YsWIFtxsKhbBv3z6sXLmS200kEhg5ciTq6uq4XUmSYLfbsWbNGm43l8vBYrHglltu4XbzyxNFa8QYE3LzrS6XLVvG7fr9fjQ1NeHGG2/kdqPRKOrr67Fq1SpuN5VK4a233ir48dzBveuuu47cddddR3g9giDOHnRUmSB0CAWXIHQIBZcgdAgFlyB0CAWXIHQIBZcgdAgFlyB0CAWXIHQIBZcgdAjd5ZEgdAh3cLdu3Tpt3bp1K9va2qqKHZzu8kgQYnBfq7xhw4Zaj8fDXnvttXlz58593+12jw4EAhaXy8U9uKqq8Pv9EHEZYwgEAkIuAGE3EAhgcHBQyI1GoxgaGhJyU6mU8L6SZVnYVRRFdzUaHBwUrlE4HBZ2E4mEcH0lSeJqWcod3HXr1jU/++yzX7RYLIFcLmfwer1VoVDI3N/fz7spaJqGcDgMETd/J38RF4CwGw6HEQgEhNx4PC7sptNpBINBITebzSIUCgm5qqoWVSPRcQHxGgUCAeH9HI1GhfdzMpkUdjOZDNeyS+7gjh492nTNNdd4ly1bdsRisbCFCxd29ff3S1dffTXvpqAoCjweD0Rcxhj6+vqE3Z6eHiHX5/OhtLRUyA2FQmCMCbmJRAKpVErIlSQJwWBQyM3lcvB6vUKupmlwu93nvUYejwcjRowQcv1+P8xms5AbjUaRzWaF3HO+rK+2tnaotra28NblBEGcdeh0EEHoEAouQegQOo9LEDqE+uMShA6hT1yC0CH0iUsQOoQOThGEDqHgEoQOod+4BKFDCgquLMum+vr6S4eGhuzvvffeRY2NjePOxuD0G5cgxCjokkdVVfGb3/xm+r333mt/9dVXx8qyXLJx48aNRqORaZpmZIxBVVXuwfMNkkRc4FTwz7dbzJyLdYuZ83A833yrl+GokV7rWygFBbesrEydNm2aD4BtwYIFwb6+vgsA4KOmX5cX2/RLtClUMU2/RBtKxWIx9PX1IRgMcrv5pl/xeJzbLabpVy6XQ0tLS1FNv0QYrhoV2/Srp6cHkUiE202n03A6nZ+fpl+ZTMZit9unHT16NNbT02MbP36812g0MqvVyqjpV+EMZ9OvsrKyYWn6ZTAYznuNqOnXR9hsttzvfve79dyzIQjinEBHlQlCh9CVUwShQ+gCDILQIRRcgtAhFFyC0CEUXILQIRRcgtAhFFyC0CEUXILQIRRcgtAhBQU3kUhYHnzwwdWtra01P/jBD762d+/eMed6YgRBfDIFXatcXl6e6+/v9zPGbNXV1cETJ044rrrqqgAA9PX1jfH7/Zbu7m7uwfNNv0RcxpiwC5zqLyPiBgIB+Hw+ITcajWJwcFDITaVSGBoaEnLzTb9E3HzTLxFX07RhqdHg4KBwjfIri0TcRCIhXN9z1vTLarVaMpmMrbKy0pLNZm0AkMvlDIODgyMikYh5YGCAe7KapiESiUDEZYwJuwCE3XA4jFAoJOTG43FhN51OIxwOC7nZbFbYzTf90lONAoEAgsGgkBuNRoVrlEwmhffVOWn6JcuyedmyZdrAwICjsrJSGzlypB0ALBYLu+KKK0663W5p6dKl3JNVFAX9/f0QcRlj6O3tFXZdLpeQ6/P5YLPZhNxQKARN04TcRCKBZDIp5EqShEAgIOTmcjkMDAwIuZqmoa+v77zXyOPxoKKiQsj1+/0wmUxCbjQahSzLQu45WdZntVqVm2+++QPu2RAEcU6go8oEoUMouAShQ2ghPUHoEFpITxA6hL4qE4QOoeAShA6h4BKEDqHgEoQOoeAShA4pOLipVMqmKIoxmUza0uk0f18IgiDOGgUFNxaLldTV1d2yf//+2gcffPD/rFu37rpzPTGCID6Zgq5VHjFiRHbSpEnO0aNHZ+vq6pxPPfXULADIZrPGnTt3zj106JDd4XBwD65pGg4dOoSKigpulzGGQ4cOobKyktsFgMOHD6Oqqorbi0Qi6OnpgSzL3G4ikYDT6RQ6fy1JEg4fPgyLxcLtZrNZtLS0oKysjNtVVRUtLS0oLy/ndvM1GjFiBLcLiNcoFArB4/EgnU5zu7FYDF1dXUIN0lKpFNrb24WanMmyzNUsrKDgZrNZUzKZnLRr167yF154Ye599933FgCUlJRoCxYs6PZ6vdKSJUu4J6uqKoaGhiDiMsbg9XqFXODUChIR1+/3w263C7mRSARGo1HITSaTyGQyQq4sy4jFYkKuoigIBAJCrqZp8Pl8wjUaGBgQcr1eL6qqqoTcYDCIkpISITcej0NVVSE3nU7jww8/LPjxBQXXZDJpjzzyyG5VVdny5cuP2Wy2028NlZWVKbvdro0cOZJ7soqiwG63Q8RljA2LK8syysvLhcd1OBxCrsViEXYlSRJ+vrlcTtjVNK2oGpWVlQm56XRaeF8piiJcX6PRKDyu1WrlailaaHDZlClTvNyzIQjinECngwhCh1BwCUKHUHAJQodQcAlCh1BwCUKHUHAJQodQcAlCh1BwCUKHUHAJQocUFNxsNmtsbGy8KBgMOhobG2e2traOPhuD010eCUKMgi55zOVyhoceemjuL3/5S/XEiROV27Ztu2zz5s2vAABjzPDRf7kHZ4yd/hNxRcf9922IeOd7XD0+32Lq+/FtiDrDUd9in2+hFBRcu92uzpgxw1NVVaXU1taGDAbDFACQZdn4+uuvX/Hhhx+WiyyD0jQNDQ0NwsXZt28ft/dxV+QTPxqNor+/H36/n9tNJpPo6upCJBLhdjOZDNrb27mWfuXJZrM4dOgQstkst6uqKhobG6FpGrebr68IxdQo33HP6+W/vD4ej6OnpwehUIjbTafTcDqdSCQS3K4sy1zLAQsKbiaTsZjN5totW7aMNRqN6vTp00MAYLVatbq6ugOMscTatWu5J6soCsxmM2699VZulzEGg8GA22+/XcgFIOT6fD60trZixYoV3G4oFMK+ffuwcuVKbjeRSGDHjh2oq6vjdiVJgsPhwJo1a7jdXC6HkpIS3HLLLdyupmkwmUy47bbbuN1iauTxeOB0OrFs2TJu1+/3o6mpCTfeeCO3G41GUV9fj1WrVnG756Tpl81myz355JN/z+9Mk8lEdzIniGGk4P64RqORwkoQnxOodxBB6BDqHUQQOoQuwCAIHULBJQgdQr9xCUKH0G9cgtAh9FWZIHQIBZcgdAgFlyB0SEHBTSaTlocffvj/Dg0Njdy5c+fUp59+ev65nhhBEJ9MQZc8Wq1W5dixY7GjR4+OffLJJ+eqqirfe++9LQDg8/kqI5GIwePxcC89UVUV4XDY4PF4uI9SMcbw0bhCR7hEXb/fj2AwKORGo1GEQiEhN5VKCe8rWZaFXUVRiqqRqAuI18jn8wnXKBQKCbuJREK4vpIkaTwr7AoKrsViYQ6HAx988MEFo0aNquns7DSFw2FjeXk5O3ny5LiBgYF/OJ3OQ7yT1TTN6PV65zmdzmZelzFm8Hq9X3A6nU28LgB4vd7LRdxwOFzR399f43Q6T/C6iUTC3t/ff6HT6TzK60qSZPN4PDOdTmcrr5vNZi0DAwOznU7nYV5XVVWT1+v9H6fT2cLrFlkjYTcYDFa63e6xTqezk9eNRqOO/v7+SU6n8zivm0qlSj0ez3Sn09nO62YymZJsNltSsPDxxc6f9CdJkvmFF15YsXnz5ivi8Xjpm2++OTX/b9ls1vTWW2/NKWQ7//6nKIph69atl4q4jDFs3rz5f863GwgEHHv37p0u4kaj0dL6+vqZIm4ymSzZuXPnLBE3k8mY3377baEa5XI547Zt2+aK7uctW7ac9/oODg5WNDQ0TBVxQ6FQ2Z49e2aIuPF43Pree+9dLOKm02nLO++8c0mhjy/oN67NZlO+9a1vvbNy5crG8vJy6aabbnLl/62+vn5iIBCwp1Ip7i71jY2NF1ZUVAhdhbFp06Zp0Wi0LBKJFP4u9RFvvPHGxEgk4ggGgzZet7S0NNXd3V0Ri8W4m836/f4xPp/vgng8bud1A4GA0ePxVO3du3cMr3vs2LHKYDA4/oMPPpjB6+7atetCv99f0dvby72fd+/ePcXv95fGYrGCV6FlMhnzSy+9tLSnp6cqEomUbNmyZWqhbjabNW7YsOGqVCplPXbsWPWRI0dGFeoqimJ45ZVXrgyHwyPcbvfITZs2zSzU1TTNsGnTpit8Pt+YRCJR+uqrr87OZrMFv67ffPPN+R6PZ/ysWbN6X3rppXmFOEUdVQ6Hw6bHH3/88h07dlTs37+/htcfGhpKvP766wXvoI8zcuTIwPvvv1+1ffv2sbxuOp2OPfPMM9Pr6+vH87rvv//+hAceeOBLfr+fu1tzc3PztD179tiz2Sz37SSeeuqpeVu3bh3f29vL7c6YMSPa1tamuFwuru7jqVTK8NBDDy389a9/Pbe3t5erw3Q6nTb+/Oc/v+K5554bu2PHjoLDZzAYtNdff72stbV1dkNDw6j169dfrqpqQSEwGAxsy5YtJW63e5zL5Sp59913xxU6rtlsZjt37jR2dXXVjBw50vXiiy/OT6fTBb3hGI1Gtnv3bq29vX2C2WyO//nPf16UyWQKfrNqbGzMNTQ0TP3DH/4w7+GHH74yGAx+5vMtKriMMUNJSQkbM2ZMWlVV7lbpkydPThgMBlVkbLfbbU+lUtZrr72W+x4ys2fPzsydO3cgkUhYed3du3d/4YILLqhwu90FvyjyjBs37pDFYon/5S9/mcPrJpPJ8pqaGrmpqekLvK7ZbFaPHTs25uqrr+7g8VRVNVgsluzo0aN92WyW6xtGWVmZdvfddx+2Wq3VuVyu4Bex1WrVampqYowx84QJE6Tq6uqCx7RYLGzChAkxm82mXXHFFXGe+QLAxIkToyaTibW3t0+fNGnSybKysoKPFk2ePDlqNBpRW1sb+qh/dMHZmjx5cqy1tbWsra3tUofDUePz+T7zm2BRwR01apSyfPny7pKSkqp58+Z5eP14PD6lsrKyqre3l/vTq6enZ/bixYsN8Xic++vuBx98UDt+/PjSJUuWDPG6jz766Jb777//1VmzZvXxup2dnSNHjBhRdf311/fyut/97ndbqqqqzAsXLuzidcPhsOmqq67qnTx5cprHq6io0L75zW/2z58/Xxs7dmyAd9xx48YZlyxZ0rd06dLuQh1Zls0TJkyY0Nvba00mk44pU6Z0F3rHlVwuZxo/fvzElpaWKd3d3RMdDscUTdMK+rRWFMU4atSoyUePHp3q8XguWbx4sUVRlIJcTdMMDofjwu7u7olvv/32gkWLFnktFkuuEBcArFbrhRMmTCjfsGHDi9/+9re3TJ48OfNZjoExul6YIPQGXTlFEDqEgksQOoSCSxA6hIJLEDqEgksQOoSCSxA6hIJLEDqEgksQOoSCSxA65P8BmEt6Ngtc35AAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] }, "metadata": { "needs_background": "light" @@ -551,14 +566,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001B[35m\u001B[1mBob\u001B[0m\u001B[35m\u001B[0m: {\n", + "\u001b[35m\u001b[1mBob\u001b[0m\u001b[35m\u001b[0m: {\n", " \"thought\": \"I see Alice is trying to create a line horizontally. I need to block her next move otherwise she will have a chance to win. I will place my piece at [7, 5].\",\n", " \"move\": [\n", " 7,\n", " 5\n", " ]\n", "}\n", - "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", + "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -579,8 +594,10 @@ }, { "data": { - "text/plain": "
", - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAO4AAADnCAYAAAAZ4WrqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAAsTAAALEwEAmpwYAAAkT0lEQVR4nO2de3BU5f3/33vfZDc3IreIgGBAMeBXqQgq+LMtBaXCjxparaitVWurY9XptKNjp5ex32rp2Noqjp1aW7EIBUu5KIKXgAJJSAIkISwkZLPZbHaTvd93z+455/n9gctPWy/7PCHQYz+vmYzjsK/zPHs++97LOec5Hx1jDARBaAv9uZ4AQRD8UHAJQoNQcAlCg1BwCUKDUHAJQoNQcAlCg1BwCUKDcAf32LFjlevWrVswNDRUOhoTIgjis9HxXoBx6623Lq6qqpJramrSjz/+eLMkSUbGmGGU5kcQ/zUYjUbZaDQqRT2Wd+OyLBsvvvhiv9/vr5AkSb99+/YvHD58+Im6urqJvNtSVRVHjx7FnDlzeFUwxtDR0YHLLruM2wWA9vZ2ITeZTGJ4eBjTp0/ndjOZDAYGBjBjxgxuV5IkOJ1OXHLJJdyuLMs4ceIELr30Um5XVVV0dXVh9uzZ3C5jDJ2dnWe9vvF4HMFgENOmTeN2U6kUvF4vamtrud1sNguXy4WLL76Y283n86ykpOR/V61atb4ogTHG9ff3v/996t133/31lpaWsYwxSJJkeuWVVzqYAPl8nr388ssiKlNVlf3lL38Rdl966SUh1+v1sp07dwq5wWCQbd26VciNx+Ns06ZNQm46nWbr168XcnO5HFu3bp2QqygK++tf/yrkjqRGAwMDbPfu3ULu8PAw27Fjh5AbiUTYP/7xDyE3mUzKGzduvI8VmUPuT9xVq1a5Vq1a5eL1CII4c9BRZYLQIOc0uDqd7lwOTxCa5ZwGl9GSQoIQgr4qE4QGoeAShAah4BKEBqHgEoQGoeAShAah4BKEBqHzuAShQbiDu2/fvgsef/zx287E4HQelyDE4L5WecqUKT6Hw6GqqqpTVRXHjh2b5Ha7LUeOHOEeXFVVuN1uiLiMMWEXAAYGBoTcYDAIp9Mp5MZiMfT19Qm56XQaLpdLyM3lcujv7xdyFUURds9VjYaHh4X3VSQSEa5vMpkUrm82m4UkSUU/nju4Op3OJElSeSwWs5aVlWVVVdUxxqCqKu+moKrq6T8RRMf98NgiY4qOOxJXVVXNuSN5vgX/v2k/88AdXL1eb7333nu7Q6FQaVVVVaaurm7A4XBIV1xxBe+mIMsyHA4HRFz2wVpPUbejo0PI9fl8UBRFyA2FQojH40JuIpHA0NCQkJvJZNDX1yfk5vN5nDhxQsgtrOU92zXyeDwwGAxCrt/vRzabFXKj0ShCoZCQm0ql4PF4in48d3Bramoiy5cvb+D1CII4c9DpIILQIBRcgtAgFFyC0CAUXILQIHTlFEFoELoDBkFoEPqqTBAahIJLEBqEgksQGoQ7uJFIxOL3+ytkWaYjSwRxjuC+5PFPf/rTRIfDceWiRYuOfOtb3+oZjUkRBPHpcAf3jjvuGHjggQcuLS8vTxeafjU1NdkNBv6GfaqqoqmpCSaTidtljKG5uRkWi4XbBYDm5mZYrVZuLxqNor+/H9FolNtNJpM4ceIE0uk0t5vJZNDR0QFZlrndXC6H1tZWodNviqKgsbERRiP3S+V0fc1mM7dbqK9IjUKhELxeL0KhELcbj8fR29uLRCLB7abTaXR1dXEtzysgSRJXbbmr8ctf/nJeSUnJ1FmzZjVaLBb1K1/5SnsymUytWLGCd1NQFAWZTAYiLmMMyWRSyAVOrbYRcYeGhtDZ2YnFixdzu+FwGJWVlVi2bBm3m0gkYLFYhOaczWYBQMiVZRmSJAm5qqoinU6f9foODg7ixIkT+OIXv8jtBgIBtLW1YenSpdxuLBaDzWbD8uXLud10Oo233nqr6MdzB/fnP//5kVwud8JmsyUAwGq15k0mEyspKeHdFGRZhtlshojLGBuRazKZhFyr1So87kjckewrAMLPN5/PC4+rqup/VY0kSRrRvtLriz/kxB3cqqqqDIAMr0cQxJmDTgcRhAah4BKEBqHgEoQGoeAShAah4BKEBqHgEoQGoeAShAah4BKEBqHgEoQG4Q7u/v37z9uxY8fcYDDIf/U3QRBnBO5LHp1Op/Tiiy/O+PrXv579/ve/3yXLskFVVaFVK4qiQFEUIZcxJuwCp64NPdtzHokry/KIxhV9viMZV1XVEdV3JHPWYn157sHGHdz58+dnWlpa/Ol02vTBsr65jY2NZbzbAf7/si+RJYHAqaV5IksCAQgvJ4zFYnC73QiHw9xuKpVCd3c3kskkt5vNZtHZ2YlcLsft5vN5tLW1CTejampq4roAvgBjDE1NTUJLAgHx+kYiEXi9Xvj9fm43kUjA6XQiFotxu5lMBseOHUMmw38pP29duffo9u3bLzQYDFULFixwWCwWdeXKlQdlWU7cdht/y1xZlqHX63H77bdzu4V3ZFFXURQh1+fzob29XWjZVygUwv79+4WWfSUSCVRVVaG+vp7bzWQyKCkpwa233srt5vN5GAwGrF69mtstvFGc7Rp5PB44HA6hpZd+vx8tLS1CSy+j0SgaGhqwcuVKbjeVSuH1118v+vHcwX3kkUd6AJyRO1/QfZUJQgy6rzJBaBA6HUQQGoSCSxAahHoHEYQGod+4BKFB6KsyQWgQCi5BaBAKLkFoEAouQWgQOqpMEBqEO7ixWEz/0EMP3eTxeKpHOjgdVSYIMbivVd66detFr7766uS77767feLEieHe3t7xPp/PdPz4ce7BVVWFz+eDiMsYE3aBUz2ARNxgMAiPxyPkxmIxDA4OCrmpVAper1fIlSRJeF8piqK5Gg0PDwvXKBwOC7uJREK4vplMhmuFEHdwo9HopIsuumhsX1/fxJkzZw5Eo1FbKpUyiCxzU1UVyWRSaIkccOrFLOqKjhuNRpFIJITceDwu7GYyGeE553I5YVdRFGGXMTaiGom6I6nRSNxUKiW8r7LZLNeyS+7gPvjgg+9eeeWVXRdffHHSZDKxuXPnOp1OZ/bqq6/m3RRkWUZfXx9EXMYYenp6hN3u7m4h1+fzwWg0CrmhUAi5XE7ITSQSiEQiQm4mk4HP5xNy8/k8+vv7hVxVVdHb23vWa+TxeFBaWirk+v1+MMaE3Gg0imQyKeSmUikEg8GiHy+0wnnBggXDIh5BEGcGOh1EEBqETgcRhAahRQYEoUHoqzJBaBAKLkFoEAouQWgQCi5BaBA6qkwQGoSOKhOEBuEObn9//8SdO3fOTyaTJaMxIYIgPhvuSx7fe++9S1taWqwLFixgAPBB0y9dPp/nHrzQJEnELbSoEHELY4u4hSZY5H42haZfojVSVVVTz3ek7qg2/Zo0adLhffv2XfHiiy/OeuCBB4580PTLLvJ7tdBQSqQpFGMMzc3NMJvN3C4AHDx4EBaLhduLRqNwu92IRCLcbjKZRHd3N1KpFLebzWbR0dEh9KLI5/NobW3l9oBTb3CijdkKNRJtzCZa33A4DK/Xy3XRfoF4PA6n04l4PM7tptNpHDt2DNlsltuVJInr8dyJOXLkSKXNZqtYsGBB15lo+qXT6YQaShWafom6siwLueey6VdlZaVw0y+r1XpOmn4xxs56jajp18fw8MMP9wLo5fUIgjhz0HlcgtAgFFyC0CAUXILQIBRcgtAgFFyC0CAUXILQIBRcgtAgFFyC0CAUXILQIBRcgtAg3MHds2fP2B//+MfLt2zZMm40JkQQxGfDfa3y73//+/k6na7k8ssv1ymKojt58uQEr9drdjgc3IMrigKv1wsRlzEm7AKnFguIuIFAAG63W8iNRqMYGBgQclOp1OmL53mRJAmDg4NCrizLwvtZVdUR1Ve0RkNDQ8I1CofDwjVKJBLCNRr1pl+TJ0+WAGSPHj16aX19vT+RSJRkMhl9LBbj3RRUVUU6nYaIyxhDJpMRcgEIu4lEQnjOI3HT6bTwnHO5nLCrKArVqEiSyaSwezaafjW2trZeWltb6zAajezyyy/vO3nyZHb+/Pm8m4Isy+jt7YWIW2gKJeoeP35cyPX5fDAYDEJuKBRCNpsVcgsd5ETcTCaDwcFBITefz6Ovr0/IVVUVPT09Z71GHo8HJSUlQq7f74eiKEJuodOfiJtKpeD3+4t+PHdwp02blpg2bVoTr0cQxJmDjioThAah4BKEBqHgEoQGoeAShAahTgajDGMMuVwOLpcLra2tOH78OE6cOIF0Ov2Zt+MsuB6PBx0dHejv74fT6UQmk+Fy29vb4Xa7uV2Xy4Xm5mb09PQUPWfi7MB/X9QzyOf5RVC47/OePXuwdu1aNDc3IxAIQFEUrFmzBpdeeinuuusu1NfXo6Sk5CNvYgW3tbUV3d3dGDduHMaPH48vfelLcLlcOHDgAMaOHYuFCxd+rCvLMtra2j7iLlmy5LQ7btw4XHvttf/mAqdO/xTmfPDgwdNzXrt2Lerq6vCd73wHX/va1z7WJc4e5zS4n2ey2SyefPJJPPPMM/92Qj4YDGLv3r1oamrCW2+9hd/85jcYP378R9wdO3agpqYG3/jGN2A2m0+HpBDq7u5ubN68GTfeeCOqq6tP/3sx7okTJz7WzWQyeOqpp/Db3/723+4rHAwGsWfPHjQ2NuLNN9/E008/jbFjx1J4zxEU3FFAURS88MILePLJJz/1MjZJkrB+/XoYjUasXbsWJSUlUBQFu3fvxqxZszBr1qx/C4ZOp4PRaMQll1yCMWPGYOfOnVi1ahWsVisURcGuXbs+0501axaqq6v/zX3++efx5JNPfurNuSVJwquvvgqz2Yy1a9fCarWObGcRQtDBqTMMYwwnTpzAmjVrirr2VFVVbNy4EW+88QYYY+jr6zsdrk/7NNPpdBg/fjxmz56NpqYmMMbgdDphNpu53Obm5o/MuZg76quqig0bNuDNN9/8XP/c+U+GO7iJRMIUiUTKMpmMWF+J/wK2bNkCn89X9OMzmQxefvllKIqC9vZ2zJs3r6ivoDqdDrNmzYLb7YYsy8JuPp/H5s2bMTw8zDXndevWCfcFIkYGd3A7OjrG33fffd/429/+VjcaE9I6qqpi//793J9Ex44dg9/vRzqdRnV1ddGeyWRCeXk5gsEgstksxowZw+Xa7XaEQiG0trZyz/nw4cNIJBJcDnFm4P6Ne80113h+/etfRxcuXNgrSZJ+586dlx88eNAu0kBLVVW0tLSgpIS/YydjDC0tLbDZbNwuALS2tsJut3N70WgULpcLyWTyY/89n8/D5XJxb3d4eBgbNmyAxWKBXl/8+6lOp4PJZMKmTZtgMpm4DhbpdDoYDAZs2rRJeJni5s2bP/GNplCj0tJS7m0D4jUKhUIYHBwUWqUTj8dx8uRJZDIZbjedTuPo0aNQFIXblSSJq/EXd3C7u7vtVqtVnjlzZhwAFi1a5AiFQuklS5bwbgqKoiAWi0HEZYwhHA4LucCpo6Qi7vDwMDo7O/HlL3/5Y/9dURS8+OKL3EGorq7GsmXL0NjYCFVViw4vYwz5fB5Lly5FUxPf2o/CUeYbbrgBb7zxBk6ePMnll5WVYenSpZ/4Ka+qKiKRiHB9RWs0ODiI7u5uXH/99dxuMBhEeXm50LixWAxGo1HITafTaGhoKPrx3ME9//zz03/4wx/eLPy/3W7PWq1WtaysjHdTkGUZVqsVIi5j7Jy4yWQSJSUln+gyxrBgwQK88847XNudOXMmpk2bho6ODkSj0aK/8sqyjHg8jqlTp+LIkSOIxWKorKws2k0mk5g8eTLmzp2LXbt2cc159uzZGD9+/CceWVZV9ZzUyG63f2qNPo1MJiPsKooi7Or1eq5vWty/cW02mzpu3Dj+BqAfw+f1HODNN9+MsWPHFv14s9mM1atXw2g0oq6uDm1tbUX/3jx58iQmTpwIk8mEuro6tLS0FOUyxtDT04OJEyfCbDajvr6e67e12WzGbbfdJtRjmBg55/R00OfxVIJOp0NdXR0eeOCBohp263Q63HTTTVixYgV0Oh1qa2sRjUbhdDo/df8UfiocPHgQV199NXQ6HWbMmFG0G4lE0NLSggULFkCn02H27Nm4//77i2pCrdPpsHz5ctx0002f2zff/3ToWuVRwGg04uGHH8Z99933qQfeDAYDbrzxRjz99NOnv14ZjUbccMMNaGpqwpEjRyDL8kdCWGjo3d/fj23btmHx4sWnD/78q6soyse6LpfrY90f/vCH+N73vvepF1UUxnj66aeFDwwSI4euVR4l7HY71qxZg4ULF+L5559He3s7YrEYGGOw2+2YNm0a7rzzTnz7299GRUXFR1ybzYb6+nrs378fGzZswOTJkzFx4kQYDAYEAgG4XC5YLBasXLkS5eXlH3kD/LD76quvcrl2ux1PPfUUrrnmGjz33HPo7Oz8yJynT5+Ob33rW7jzzjtRUVHxuX3j1QJ0yeMoodPpYLVasWrVKixbtgxOpxNHjx5FV1cXli9fjtraWlRUVHzsAQmdTgeLxYLrr78e6XQaHo8HfX19aGtrw1e/+lUsWbIE5eXlRbtutxuNjY1YsWLFZ7qFOd94441wOp1wOp147733cMstt3zqnImzCwV3lNHpdLDZbJg9ezZqampgs9kwb948LnfmzJmoqalBPB7H7Nmzud3JkyfD7/dzuXa7HXPmzMEll1yCZDJZ9JyJswO9dRKEBqHgEoQGoeAShAah4BKEBuEOrtvtLn/77bcv6+7uFrty/EPQ6QSCEIP7qPJPf/rTK/fu3Tvjvvvu0//oRz86rKqqrnBinxdVVSHqMsaE3YJ/tscdiXuu9tVIxtXinEdaX1VVRzTnYuEOrqIorLq6OmQ0Gi2SJOm3bNkyb//+/WWik21sbOT2gFM76cCBA8LnFA8cOACDwcDtRaNRuN1uBAIBbjeZTKKnp0e4KVRnZ6fQcrNcLodDhw5BlmVuV1GU03fJ4EVVVRw4cEDomxVjDI2NjUI1CofD8Pl8GBoa4nbj8TicTifC4TC3m06ncezYMaRSKW5XkiSu1zJ3cBcuXBhOJpMTqqqq/BaLRb355pubVVVN3HbbbbybgizLMBgMuP3227ndwgvpjjvuEHJVVRVyfT4f2tvbsXTpUm43FAph//79WL58ObebSCQwZswY1NfXc7uZTAY2mw233nort5vP52EymbB69Wput7A8UbRGjDEht9DqcvHixdyu3+9HS0sLli1bxu1Go1E0NDRg5cqV3G4qlcLrr79e9OO5g3vPPfccueeee47wegRBnDnoqDJBaBAKLkFoEAouQWgQCi5BaBAKLkFoEAouQWgQCi5BaBAKLkFoEAouQWgQussjQWgQ7uBu3759+oMPPri8o6OjaqSDf57v8kgQown3tcrr16+v9Xg87O9///sVc+bMecftdp8XCARMTqeTe3BFUeD3+yHiMsYQCASEXADCbiAQwNDQkJAbjUYxPDws5KZSKeF9JUmSsCvLsuZqNDQ0JFyjcDgs7CYSCeH6ZjIZrpal3MF98MEHW59//vkvmkymQD6f13m93qpQKGQcGBjg3RRUVUU4HIaIW7iTv4gLQNgNh8MIBAJCbjweF3bT6TSCwaCQm8vlEAqFhFxFUUZUI9FxAfEaBQIB4f0cjUaF93MymRR2s9ks17JL7uCed955huuvv967ePHiIyaTic2fP79nYGAgc9111/FuCrIsw+PxQMRljKG/v1/Y7evrE3J9Ph9KSkqE3FAoBMaYkJtIJJBKpYTcTCaDYDAo5ObzeXi9XiFXVVW43e6zXiOPx4OKigoh1+/3w2g0CrnRaBS5XE7IHfVlfbW1tcO1tbXFty4nCOKMQ6eDCEKDUHAJQoPQeVyC0CDUH5cgNAh94hKEBqFPXILQIHRwiiA0CAWXIDQI/cYlCA1SVHAlSTI0NDRcNjw8bHv77bcvbm5uHn8mBqffuAQhRlGXPCqKgl/96lcX3X///baNGzeOkyTJvGnTpk16vZ6pqqpnjEFRFO7BCw2SRFzgVPDPtjuSOY/UHcmcz8XzLbR6ORc10mp9i6Wo4JaWlirTp0/3AbDOmzcv2N/ffz4AfND068qRNv0SbQo1kqZfog2lYrEY+vv7EQwGud1C0694PM7tjqTpVz6fR1tb24iafolwrmo00qZffX19iEQi3G46nYbD4fjPafqVzWZNNptt+tGjR2N9fX3WCRMmePV6PbNYLIyafhXPuWz6VVpaek6aful0urNeI2r69QFWqzX/m9/8Zh33bAiCGBXoqDJBaBC6coogNAhdgEEQGoSCSxAahIJLEBqEgksQGoSCSxAahIJLEBqEgksQGoSCSxAapKjgJhIJ06OPPrqqvb295gc/+MHN+/btGzvaEyMI4pMp6lrlsrKy/MDAgJ8xZp04cWLw+PHj9muvvTYAAP39/WP9fr+pt7eXe/BC0y8RlzEm7AKn+suIuIFAAD6fT8iNRqMYGhoSclOpFIaHh4XcQtMvEbfQ9EvEVVX1nNRoaGhIuEaFlUUibiKREK7vqDX9slgspmw2a62srDTlcjkrAOTzed3Q0FBFJBIxDg4Ock9WVVVEIhGIuIwxYReAsBsOhxEKhYTceDwu7KbTaYTDYSE3l8sJu4WmX1qqUSAQQDAYFHKj0ahwjZLJpPC+GpWmX5IkGRcvXqwODg7aKysr1TFjxtgAwGQysauuuuqk2+3OLFq0iHuysixjYGAAIi5jDC6XS9h1Op1Crs/ng9VqFXJDoRBUVRVyE4kEksmkkJvJZBAIBITcfD6PwcFBIVdVVfT395/1Gnk8HpSXlwu5fr8fBoNByI1Go5AkScgdlWV9FotFvuWWW97lng1BEKMCHVUmCA1CwSUIDUIL6QlCg9BCeoLQIPRVmSA0CAWXIDQIBZcgNAgFlyA0CAWXIDRI0cFNpVJWWZb1yWTSmk6n+ftCEARxxigquLFYzFxfX7/6wIEDtY8++uj/efDBB78y2hMjCOKTKepa5YqKitzkyZMd5513Xq6+vt7x7LPPzgKAXC6n371795xDhw7Z7HY79+CqquLQoUMoLy/ndhljOHToECorK7ldADh8+DCqqqq4vUgkgr6+PkiSxO0mEgk4HA6h89eZTAaHDx+GyWTidnO5HNra2lBaWsrtKoqCtrY2lJWVcbuFGlVUVHC7gHiNQqEQPB4P0uk0txuLxdDT0yPUIC2VSqGzs1OoyZkkSVzNwooKbi6XMySTycl79uwp+/Of/zzngQceeB0AzGazOm/evF6v15tZuHAh92QVRcHw8DBEXMYYvF6vkAucWkEi4vr9fthsNiE3EolAr9cLuclkEtlsVsiVJAmxWEzIlWUZgUBAyFVVFT6fT7hGg4ODQq7X60VVVZWQGwwGYTabhdx4PA5FUYTcdDqN999/v+jHFxVcg8Gg/vKXv9yrKApbsmRJl9VqPf3WUFlZmbLZbOqYMWO4JyvLMmw2G0Rcxtg5cSVJQllZmfC4drtdyDWZTMJuJpMRfr75fF7YVVV1RDUqLS0VctPptPC+kmVZuL56vV54XIvFwtVStNjgsqlTp3q5Z0MQxKhAp4MIQoNQcAlCg1BwCUKDUHAJQoNQcAlCg1BwCUKDUHAJQoNQcAlCg1BwCUKDFBXcXC6nb25uvjgYDNqbm5tntre3n3cmBqe7PBKEGEVd8pjP53WPPfbYnJ/97GfK8ePHK3fs2HH51q1bNwAAY0z3wX+5B2eMnf4TcUXH/ddtiHhne1wtPt+R1PfD2xB1zkV9R/p8i6Wo4NpsNmXGjBmeqqoquba2NqTT6aYCgCRJ+tdee+2q999/v0xkGZSqqmhsbBQuzv79+7m9D7sin/jRaBQDAwPw+/3cbjKZRE9PDyKRCLebzWbR2dnJtfSrQC6Xw6FDh5DL5bhdRVHQ3NwMVVW53UJ9RRhJjQod97xe/svr4/E4+vr6EAqFuN10Og2Hw4FEIsHtSpLEtRywqOBms1mT0Wis3bZt2zi9Xq9cdNFFIQCwWCxqfX19E2Mscdttt3FPVpZlGI1G3H777dwuYww6nQ533nmnkAtAyPX5fGhvb8fSpUu53VAohP3792P58uXcbiKRwK5du1BfX8/tZjIZ2O123HrrrdxuPp+H2WzG6tWruV1VVWEwGHDHHXdwuyOpkcfjgcPhwOLFi7ldv9+PlpYWLFu2jNuNRqNoaGjAypUrud1RafpltVrzzzzzzMuFnWkwGOhO5gRxDim6P65er6ewEsR/CNQ7iCA0CPUOIggNQhdgEIQGoeAShAah37gEoUHoNy5BaBD6qkwQGoSCSxAahIJLEBqkqOAmk0nTE0888X+Hh4fH7N69e9pzzz03d7QnRhDEJ1PUJY8Wi0Xu6uqKHT16dNwzzzwzR1EU6f77728DAJ/PVxmJRHQej4d76YmiKAiHwzqPx8N9lIoxhg/GFTrCJer6/X4Eg0EhNxqNIhQKCbmpVEp4X0mSJOzKsjyiGom6gHiNfD6fcI1CoZCwm0gkhOubyWRUnhV2RQXXZDIxu92Od9999/zq6uqa7u5uQzgc1peVlbGTJ0+OHxwc/JvD4TjEO1lVVfVer/cKh8PRyusyxnRer/cLDoejhdcFAK/Xe6WIGw6HywcGBmocDsdxXjeRSNgGBgYudDgcR3ndTCZj9Xg8Mx0ORzuvm8vlTIODg3UOh+Mwr6soisHr9f6Pw+Fo43VHWCNhNxgMVrrd7nEOh6Ob141Go/aBgYHJDofjGK+bSqVKPB7PRQ6Ho5PXzWaz5lwuZy5a+PBi50/6y2Qyxj//+c9Lt27delU8Hi/55z//Oa3wb7lczvD666/PLmY7//ony7Ju+/btl4m4jDFs3br1f862GwgE7Pv27btIxI1GoyUNDQ0zRdxkMmnevXv3LBE3m80a33jjDaEa5fN5/Y4dO+aI7udt27ad9foODQ2VNzY2ThNxQ6FQ6XvvvTdDxI3H45a33377EhE3nU6b3nzzzUuLfXxRv3GtVqv87W9/+83ly5c3l5WVZVasWOEs/FtDQ8MFgUDAlkqluLvUNzc3X1heXi50FcbmzZunR6PR0kgkUvy71Ads2bLlgkgkYg8Gg1Zet6SkJNXb21sei8W4m836/f6xPp/v/Hg8buN1A4GA3uPxVO3bt28sr9vV1VUZDAYnvPvuuzN43T179lzo9/vLXS4X937eu3fvVL/fXxKLxYpehZbNZo2vvPLKor6+vqpIJGLetm3btGLdXC6nX79+/bWpVMrS1dU18ciRI9XFurIs6zZs2HB1OByucLvdYzZv3jyzWFdVVd3mzZuv8vl8YxOJRMnGjRvrcrlc0a/rf/7zn3M9Hs+EWbNmuV555ZUrinFGdFQ5HA4b1qxZc+WuXbvKDxw4UMPrDw8PJ1577bWid9CHGTNmTOCdd96p2rlz5zheN51Ox9auXXtRQ0PDBF73nXfemfTII498ye/3c3drbm1tnf7ee+/Zcrkc9+0knn322Su2b98+weVycbszZsyIdnR0yE6nk6v7eCqV0j322GPzf/GLX8xxuVxcHabT6bT+Jz/5yVV/+tOfxu3atavo8Ol0OvW1114rbW9vr2tsbKxet27dlYqiFBUCnU7Htm3bZna73eOdTqf5rbfeGl/suEajke3evVvf09NTM2bMGOdLL700N51OF/WGo9fr2d69e9XOzs5JRqMx/sILLyzIZrNFv1k1NzfnGxsbp/3ud7+74oknnrg6GAx+5vMdUXAZYzqz2czGjh2bVhSFu1X6lClTEjqdThEZ2+1221KplOXLX/4y9z1k6urqsnPmzBlMJBIWXnfv3r1fOP/888vdbnfRL4oC48ePP2QymeJ//OMfZ/O6yWSyrKamRmppafkCr2s0GpWurq6x11133QkeT1EUnclkyp133nm+XC7H9Q2jtLRUvffeew9bLJaJ+Xy+6BexxWJRa2pqYowx46RJkzITJ04sekyTycQmTZoUs1qt6lVXXRXnmS8AXHDBBVGDwcA6Ozsvmjx58snS0tKijxZNmTIlqtfrUVtbG/qgf3TR2ZoyZUqsvb29tKOj4zK73V7j8/k+85vgiIJbXV0tL1mypNdsNlddccUVHl4/Ho9PraysrHK5XNyfXn19fXXXXHONLh6Pc3/dfffdd2snTJhQsnDhwmFe98knn9z20EMPbZw1a1Y/r9vd3T2moqKi6oYbbnDxut/97nfbqqqqjPPnz+/hdcPhsOHaa691TZkyJc3jlZeXq9/85jcH5s6dq44bNy7AO+748eP1Cxcu7F+0aFFvsY4kScZJkyZNcrlclmQyaZ86dWpvsXdcyefzhgkTJlzQ1tY2tbe39wK73T5VVdWiPq1lWdZXV1dPOXr06DSPx3PpNddcY5JluShXVVWd3W6/sLe394I33nhj3oIFC7wmkylfjAsAFovlwkmTJpWtX7/+pbvuumvblClTsp/l6Bij64UJQmvQlVMEoUEouAShQSi4BKFBKLgEoUEouAShQSi4BKFBKLgEoUEouAShQSi4BKFB/h/uKyQQEcAo6gAAAABJRU5ErkJggg==" + "image/png": "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", + "text/plain": [ + "
" + ] }, "metadata": { "needs_background": "light" @@ -591,14 +608,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001B[32m\u001B[1mAlice\u001B[0m\u001B[32m\u001B[0m: {\n", + "\u001b[32m\u001b[1mAlice\u001b[0m\u001b[32m\u001b[0m: {\n", " \"thought\": \"My opponent is trying to block me. I should place my piece at [7, 9] to create a potential line for myself.\",\n", " \"move\": [\n", " 7,\n", " 9\n", " ]\n", "}\n", - "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", + "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -619,8 +636,10 @@ }, { "data": { - "text/plain": "
", - "image/png": "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" + "image/png": "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", + "text/plain": [ + "
" + ] }, "metadata": { "needs_background": "light" @@ -631,14 +650,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001B[35m\u001B[1mBob\u001B[0m\u001B[35m\u001B[0m: {\n", + "\u001b[35m\u001b[1mBob\u001b[0m\u001b[35m\u001b[0m: {\n", " \"thought\": \"Alice is trying to create a line horizontally again. I need to block her next move otherwise she will have a chance to win. I will place my piece at [7, 10].\",\n", " \"move\": [\n", " 7,\n", " 10\n", " ]\n", "}\n", - "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", + "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -659,8 +678,10 @@ }, { "data": { - "text/plain": "
", - "image/png": "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" + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAO4AAADnCAYAAAAZ4WrqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAAsTAAALEwEAmpwYAAAmkUlEQVR4nO2deXBU15m3f7cXdUvd2tnEHrBYBY5NzGKWfHaCwcHGYRBJGLCdZLJ4xi5PkkrNVFLJZGbK+eIJM6nJJIHKVBwnBmMw2A6LwRBjGRsQQgiQhGjQ0pJarW71vu/33vP9YZovHmPoc8QyF79PlcqF1c89R/ftXy/33nNfiTEGgiC0he52T4AgCH4ouAShQSi4BKFBKLgEoUEouAShQSi4BKFBKLgEoUG4g3vhwoWKrVu3LhoaGiq5GRMiCOL6SLwXYKxfv355ZWWlPHbs2OSPfvSjpkwmY2CM6W/S/AjiE4PBYJANBoNS0GN5Ny7LsmHGjBler9dbnslkdPv27fvM2bNnn6urq6vh3Zaqqjh//jzmzp3Lq4Ixhra2Ntx9993cLgC0trYKufF4HB6PB1OnTuV2U6kUBgYGMG3aNG43k8nAbrdj5syZ3K4sy7h06RJmz57N7aqqio6ODsyZM4fbZYyhvb39ltc3Go3C7/djypQp3G4ikYDL5UJtbS23m06n0dfXhxkzZnC7uVyOFRcX/99169ZtL0hgjHH9vPrqq5O/8Y1vfKm5uXkkYwyZTMa4bdu2NiZALpdjL730kojKVFVlf/jDH4TdF198Uch1uVzs4MGDQq7f72d79uwRcqPRKNu1a5eQm0wm2fbt24XcbDbLtm7dKuQqisL++Mc/CrnDqdHAwAA7fPiwkOvxeNj+/fuF3FAoxF5//XUhNx6Pyzt37nyKFZhD7nfcdevW9a1bt66P1yMI4sZBR5UJQoPc1uBKknQ7hycIzXJbg8toSSFBCEEflQlCg1BwCUKDUHAJQoNQcAlCg1BwCUKDUHAJQoPQeVyC0CDcwT127NiEH/3oRxtuxOB0HpcgxOC+VnnSpElum82mqqoqqaqKCxcujHc4HKZz585xD66qKhwOB0RcxpiwCwADAwNCrt/vh91uF3IjkQh6e3uF3GQyib6+PiE3m82iv79fyFUURdi9XTXyeDzC+yoUCgnXNx6PC9c3nU4jk8kU/Hju4EqSZMxkMmWRSMRcWlqaVlVVYoxBVVXeTUFV1Ss/IoiO+5dji4wpOu5wXFVVNecO5+/N+5+k/cwDd3B1Op35W9/6VmcgECiprKxM1dXVDdhstsy9997LuynIsgybzQYRl11e6ynqtrW1CblutxuKogi5gUAA0WhUyI3FYhgaGhJyU6kUent7hdxcLodLly4Jufm1vLe6Rk6nE3q9Xsj1er1Ip9NCbjgcRiAQEHITiQScTmfBj+cO7tixY0OrV69u4PUIgrhx0OkggtAgFFyC0CAUXILQIBRcgtAgdOUUQWgQugMGQWgQ+qhMEBqEgksQGoSCSxAahDu4oVDI5PV6y2VZpiNLBHGb4L7k8Xe/+12NzWa7b9myZee++tWvdt2MSREEcW24g/vEE08MPPPMM7PLysqS+aZfJ0+etOr1/A37VFXFyZMnYTQauV3GGJqammAymbhdAGhqaoLZbOb2wuEw+vv7EQ6Hud14PI5Lly4hmUxyu6lUCm1tbZBlmdvNZrM4ffq00Ok3RVHQ2NgIg4H7qXKlvkVFRdxuvr4iNQoEAnC5XAgEAtxuNBpFT08PYrEYt5tMJtHR0cG1PC9PJpPhqi13NX7605/OLy4unjxr1qxGk8mkPvTQQ63xeDzx2GOP8W4KiqIglUpBxGWMIR6PC7nAB6ttRNyhoSG0t7dj+fLl3G4wGERFRQVWrVrF7cZiMZhMJqE5p9NpABByZVlGJpMRclVVRTKZvOX1HRwcxKVLl/Dggw9yuz6fDy0tLVi5ciW3G4lEYLFYsHr1am43mUziz3/+c8GP5w7uv/zLv5zLZrOXLBZLDADMZnPOaDSy4uJi3k1BlmUUFRVBxGWMDcs1Go1CrtlsFh53OO5w9hUA4b83l8sJj6uq6ieqRplMZlj7Sqcr/JATd3ArKytTAFK8HkEQNw46HUQQGoSCSxAahIJLEBqEgksQGoSCSxAahIJLEBqEgksQGoSCSxAahIJLEBqEO7jHjx8fsX///nl+v5//6m+CIG4I3Jc82u32zAsvvDDtS1/6Uvrv/u7vOmRZ1quqKrRqRVEUKIoi5DLGhF3gg2tDb/Wch+PKsjyscUX/3uGMq6rqsOo7nDlrsb4892DjDu7ChQtTzc3N3mQyaby8rG9eY2NjKe92gP+/7EtkSSDwwdI8kSWBAISXE0YiETgcDgSDQW43kUigs7MT8Xic202n02hvb0c2m+V2c7kcWlpahJtRnTx5kusC+DyMMZw8eVJoSSAgXt9QKASXywWv18vtxmIx2O12RCIRbjeVSuHChQtIpfgv5eetK/ce3bdv36f0en3lokWLbCaTSV2zZs0pWZZjGzbwt8yVZRk6nQ6PP/44t5t/RRZ1FUURct1uN1pbW4WWfQUCARw/flxo2VcsFkNlZSXq6+u53VQqheLiYqxfv57bzeVy0Ov12LhxI7ebf6G41TVyOp2w2WxCSy+9Xi+am5uFll6Gw2E0NDRgzZo13G4ikcCbb75Z8OO5g/u9732vC8ANufMF3VeZIMSg+yoThAah00EEoUEouAShQah3EEFoEPqOSxAahD4qE4QGoeAShAah4BKEBqHgEoQGoaPKBKFBuIMbiUR03/nOdx51Op3Vwx2cjioThBjc1yrv2bPnrldeeWXiN77xjdaamppgT0/PaLfbbbx48SL34Kqqwu12Q8RljAm7wAc9gERcv98Pp9Mp5EYiEQwODgq5iUQCLpdLyM1kMsL7SlEUzdXI4/EI1ygYDAq7sVhMuL6pVIprhRB3cMPh8Pi77rprZG9vb8306dMHwuGwJZFI6EWWuamqing8LrREDvjgySzqio4bDocRi8WE3Gg0KuymUinhOWezWWFXURRhlzE2rBqJusOp0XDcRCIhvK/S6TTXskvu4D777LPv3HfffR0zZsyIG41GNm/ePLvdbk/ff//9vJuCLMvo7e2FiMsYQ1dXl7Db2dkp5LrdbhgMBiE3EAggm80KubFYDKFQSMhNpVJwu91Cbi6XQ39/v5Crqip6enpueY2cTidKSkqEXK/XC8aYkBsOhxGPx4XcRCIBv99f8OOFVjgvWrTII+IRBHFjoNNBBKFB6HQQQWgQWmRAEBqEPioThAah4BKEBqHgEoQGoeAShAaho8oEoUHoqDJBaBDu4Pb399ccPHhwYTweL74ZEyII4vpwX/L43nvvzW5ubjYvWrSIAcDlpl9SLpfjHjzfJEnEzbeoEHHzY4u4+SZY5F6ffNMv0Rqpqqqpv3e47k1t+jV+/Pizx44du/eFF16Y9cwzz5y73PTLKvJ9Nd9QSqQpFGMMTU1NKCoq4nYB4NSpUzCZTNxeOByGw+FAKBTiduPxODo7O5FIJLjddDqNtrY2oSdFLpfD6dOnuT3ggxc40cZs+RqJNmYTrW8wGITL5eK6aD9PNBqF3W5HNBrldpPJJC5cuIB0Os3tZjIZrsdzJ+bcuXMVFoulfNGiRR03oumXJElCDaXyTb9EXVmWhdzb2fSroqJCuOmX2Wy+LU2/GGO3vEbU9OsqfPe73+0B0MPrEQRx46DzuAShQSi4BKFBKLgEoUEouAShQSi4BKFBKLgEoUEouAShQSi4BKFBKLgEoUEouAShQbiD++677478x3/8x9VvvPHGqJsxIYIgrg/3tcr/9V//tVCSpOJ77rlHUhRF6u7uHuNyuYpsNhv34IqiwOVyQcRljAm7wAeLBURcn88Hh8Mh5IbDYQwMDAi5iUTiysXzvGQyGQwODgq5siwL72dVVYdVX9EaDQ0NCdcoGAwK1ygWiwnX6KY3/Zo4cWIGQPr8+fOz6+vrvbFYrDiVSukikQjvpqCqKpLJJERcxhhSqZSQC0DYjcViwnMejptMJoXnnM1mhV1FUahGBRKPx4XdW9H0q/H06dOza2trbQaDgd1zzz293d3d6YULF/JuCrIso6enByJuvimUqHvx4kUh1+12Q6/XC7mBQADpdFrIzXeQE3FTqRQGBweF3Fwuh97eXiFXVVV0dXXd8ho5nU4UFxcLuV6vF4qiCLn5Tn8ibiKRgNfrLfjx3MGdMmVKbMqUKSd5PYIgbhx0VJkgNAgFlyA0CAWXIDQIBZcgNIhQR/obxSehkwFjDLlcDi6XC5cuXcLFixcxffp0TJgwAcXFxdfcB3nX6/Wiv78f/f39sNvtqKmpgdlsLth1Op1wOBzcrsvlgtPpRFdXFy5dusQ9Z4/Hg4GBAaFxXS4Xuru7cenSJUycOPG67ieN2xrcO7mTQf6+z++++y42b96MpqYm+Hw+KIqCTZs2Yfbs2fj617+O+vr6j4Qh754+fRqdnZ0YNWoURo8ejc997nPo6+vDiRMnMHLkSCxduvSqrizLaGlp+ZC7YsWKK+6oUaOwZMmSq4Ywl8tdmfOpU6euzHnz5s2oq6vD3/zN3+Cv/uqvCh531apV1x037zY0NGDLli0fGve3v/3tNcf9xMIYG9ZPJpMxbtu2rY0JkMvl2EsvvSSiMlVV2R/+8Adh98UXXxRyXS4XO3jw4HUfl0wm2T/90z+x8vJyBuCqPyaTiW3cuJENDQ19xH311VfZsWPHWDqdZqqqfmjuuVyOdXR0sD/+8Y/M5/N96PeFuOfPn/9Y9yc/+QkrKyu75pw3bNjAPB7PR9ydO3cWNK7f77/ye1VVWSKRYD/+8Y+vO+7jjz/OvF7vh7Z9NQYGBtjhw4evW6Or4fF42P79+4XcUCjEXn/9dSE3Ho/LO3fufIoVmLvb+o57p5J/p3j++eeveRlbJpPB9u3bYTAYsHnzZhQXF0NRFBw+fBizZs3CrFmzPvLuIkkSDAYDZs6ciaqqKhw8eBDr1q2D2WyGoig4dOjQdd1Zs2ahurr6I+6WLVvw/PPPX/Pm3JlMBq+88gqKioqwefNmmM1mqKqKt956C3V1dZg5c+Y1x62qqsKBAweujMsYw5YtW/Dzn//8uuO+/PLLMJlM+NWvfgWz2XytEtzx0MGpGwxjDJcuXcKmTZsKuvZUVVXs3LkTBw4cAGMMvb29V57k1/pIKEkSRo8ejTlz5uDkyZNgjMFut6OoqIjLbWpq+tCcC7mjvqqq2LFjB9566y0wxtDd3Q2z2YwZM2Zcd9wxY8Zg9uzZOHXqFBhjsNlsXONu27YNhw8fvqO/ZhUCd3BjsZgxFAqVplIpsb4SnwDeeOMNuN3ugh+fSqXw0ksvQVEUtLa2Yv78+QV9j5MkCbNmzYLD4YAsy8JuLpfD7t274fF4uOa8detWZLNZtLa2YsGCBdDprv90kiQJdXV16O/vRzabxWuvvcZ1qV86nca2bdsgy3LBzp0Id3Db2tpGP/XUU19++eWX627GhLSOqqo4fvw49zvChQsX4PV6kUwmUV1dXbBnNBpRVlYGv9+PdDqNqqoqLtdqtSIQCOD06dPccz579iyCwSByuRzKy8u5xi0tLUUoFMKxY8e4xz1z5ozwwoU7Be7vuIsXL3b+/Oc/Dy9durQnk8noDh48eM+pU6esIg20VFVFc3Mziov5O3YyxtDc3AyLxcLtAsDp06dhtVq5vXA4jL6+PsTj8av+PpfLoa+vj3u7Ho8HO3bsgMlkKuidK48kSTAajdi1axeMRiPXEVdJkqDX67Fr1y7hZYq7d++GyWTiPtIrSRJef/11dHZ2co/r8Xjw+uuvf+yLVCAQwODgoFC4o9Eouru7kUqluN1kMonz589DURRuN5PJcDX+4g5uZ2en1Ww2y9OnT48CwLJly2yBQCC5YsUK3k1BURREIhGIuIwxBINBIRcA/H6/kOvxeNDe3o7Pf/7zV/29oih44YUXuINQXV2NVatWobGxEaqqFhxedvnc58qVK3HyJN/aD3b5tNPDDz+MAwcOoLu7m8svLS3FihUrrnxf5R37oYcews6dO9Hf38/lVldXY/ny5RgxYsRVfz84OIjOzk488MADXNsFPnhelJWVCT03IpEIDAaDkJtMJtHQ0FDw47mDO27cuOSvfvWrt/L/tlqtabPZrJaWlvJuCrIsw2w2Q8RljN0WNx6Po7i4+GNdxhgWLVqEI0eOcG13+vTpmDJlCtra2hAOhwv+yCvLMqLRKCZPnoxz584hEomgoqKiYDcej2PixImYN28eDh06xDXnOXPmYMKECTh79izi8XjBH5cVRUE8Hse4ceOwZMkSvP/++1zB//SnP41x48Z9bAtOq9V6zRpdi1QqJewqiiLs6nQ6rk9a3N9xLRaLOmrUKP4GoFfhTj2RvnbtWowcObLgxxcVFWHjxo0wGAyoq6tDS0tLwU/k7u5u1NTUwGg0oq6uDs3NzQW5jDF0dXWhpqYGRUVFqK+v5/puXVRUhA0bNsBsNnOPe/HixStXUq1duxaVlZVc465fv1645+6dwm09HXQnHtLPHzV95plnCmrYLUkSHn30UTz22GOQJAm1tbUIh8Ow2+3X3D/5rwqnTp3C/fffD0mSMG3atILdUCiE5uZmLFq0CJIkYc6cOXj66acLCoQkSVi9ejUeffRRSJKE6dOnIxgMore3t6BxW1pasHDhQkiShLlz53KN+8UvfhGrVq26Y1/0C+W2BvdO3fkGgwHf/e538dRTT13zwJter8cXvvAF/OIXv7jy8cpgMODhhx/GyZMnce7cOciy/KEwsMsNvfv7+7F3714sX74cJSUlV3UVRbmq29fXd1X3+9//Pv72b//2mhc35Mf4xS9+ceXAYP7/nThxAq2trR87bm9vL/bu3YuHHnroyrh6vR7f//738e1vf/u64z7yyCP4j//4D+EDkncSdK3yTcJqtWLTpk1YunQptmzZgtbWVkQiETDGYLVaMWXKFDz55JP42te+9pHvhhaLBfX19Th+/Dh27NiBiRMnoqamBnq9Hj6fD319fTCZTFizZg3Kyso+9AL4l+4rr7zC5VqtVvzbv/0bFi9ejN/85jdob2//0JynTp2Kr371q3jyySdRXl7+Efda4/b29qK4uPgj40qShNLSUmzatAmLFy/Gli1buMb9pEKXPN4kJEmC2WzGunXrsGrVKtjtdpw/fx4dHR1YvXo1amtrUV5eftUDEpIkwWQy4YEHHkAymYTT6URvby9aWlrwyCOPYMWKFSgrKyvYdTgcaGxsxGOPPXZdNz/nL3zhC7Db7bDb7Xjvvffwla985bpzNpvNePDBB6+M63K50NDQgLVr12LlypXXHffLX/4yHnnkEdjtdvT19eHIkSPYsGHDNcf9pELBvclIkgSLxYI5c+Zg7NixsFgsmD9/Ppc7ffp0jB07FtFoFHPmzOF2J06cCK/Xy+VarVbMnTsXM2fORDweF5pzbW0t+vv7hcadM2cOgsFgweN+0qCXMILQIBRcgtAgFFyC0CAUXILQINzBdTgcZW+//fbdnZ2dJcMdnA7rE4QY3EeVf/KTn9x39OjRaU899ZTuH/7hH86qqirlT7DzoqoqRN38LTxE3Lx/q8cdjnu79tVwxtXinIdbX1VVhzXnQuEOrqIorLq6OmAwGEyZTEb3xhtvzD9+/Hip6GQbGxu5PeCDnXTixAnhc3snTpyAXq/n9sLhMBwOB3w+H7cbj8fR1dUl3BSqvb1daLlZNpvFmTNnhBafK4py5S4ZvKiqihMnTgh9smKMobGxUahGwWAQbrcbQ0ND3G40GoXdbkcwGOR2k8kkLly4gEQiwe1mMhmu5zJ3cJcuXRqMx+NjKisrvSaTSV27dm2TqqqxDRs28G4KsixDr9fj8ccf53bzT6QnnnhCyFVVVch1u91obW3FypUrud1AIIDjx49j9erV3G4sFkNVVRXq6+u53VQqBYvFgvXr13O7uVwORqMRGzdu5HbzyxNFa8QYE3LzrS6XL1/O7Xq9XjQ3N2PVqlXcbjgcRkNDA9asWcPtJhIJvPnmmwU/nju43/zmN89985vfPMfrEQRx46CjygShQSi4BKFBKLgEoUEouAShQSi4BKFBKLgEoUEouAShQSi4BKFBKLgEoUHoLo8EoUG4g7tv376pzz777Oq2trbC72L9MdzJd3kkiJsJ97XK27dvr3U6nezVV1+9d+7cuUccDscIn89ntNvt3IMrigKv1wsRlzEGn88n5AIQdn0+H4aGhoTccDgMj8cj5CYSCeF9lclkhF1ZljVXo6GhIeEaBYNBYTcWiwnXN5VKIZfLFfx47uA+++yzp7ds2fKg0Wj05XI5yeVyVQYCAcPAwADvpqCqKoLBIETc/J38RVwAwm4wGITP5xNyo9GosJtMJuH3+4XcbDaLQCAg5CqKMqwaiY4LiNfI5/MJ7+dwOCy8n+PxuLCbTqe5ll1yB3fEiBH6Bx54wLV8+fJzRqORLVy4sGtgYCD12c9+lndTkGUZTqcTIi5jDP39/cJub2+vkOt2u1FcXCzkBgIBMMaE3FgshkQiIeSmUin4/X4hN5fLweVyCbmqqsLhcNzyGjmdTpSXlwu5Xq8XBoNByA2Hw8hms0LuTV/WV1tb66mtrS28dTlBEDccOh1EEBqEgksQGoTO4xKEBqH+uAShQegdlyA0CL3jEoQGoYNTBKFBKLgEoUHoOy5BaJCCgpvJZPQNDQ13ezwey9tvvz2jqalp9I0YnL7jEoQYBV3yqCgKfvazn9319NNPW3bu3Dkqk8kU7dq1a5dOp2OqquoYY1AUhXvwfIMkERf4IPi32h3OnIfrDmfOt+Pvzbd6uR010mp9C6Wg4JaUlChTp051AzDPnz/f39/fPw4ALjf9um+4Tb9Em0INp+mXaEOpSCSC/v5++P1+bjff9CsajXK7w2n6lcvl0NLSMqymXyLcrhoNt+lXb28vQqEQt5tMJmGz2f73NP1Kp9NGi8Uy9fz585He3l7zmDFjXDqdjplMJkZNvwrndjb9KikpuS1NvyRJuuU1oqZflzGbzbl///d/38o9G4Igbgp0VJkgNAhdOUUQGoQuwCAIDULBJQgNQsElCA1CwSUIDULBJQgNQsElCA1CwSUIDULBJQgNUlBwY7GY8Qc/+MG61tbWsX//93+/9tixYyNv9sQIgvh4CrpWubS0NDcwMOBljJlramr8Fy9etC5ZssQHAP39/SO9Xq+xp6eHe/B80y8RlzEm7AIf9JcRcX0+H9xut5AbDocxNDQk5CYSCXg8HiE33/RLxM03/RJxVVW9LTUaGhoSrlF+ZZGIG4vFhOt705p+mUwmYzqdNldUVBiz2awZAHK5nDQ0NFQeCoUMg4OD3JNVVRWhUAgiLmNM2AUg7AaDQQQCASE3Go0Ku8lkEsFgUMjNZrPCbr7pl5Zq5PP54Pf7hdxwOCxco3g8LryvbkrTr0wmY1i+fLk6ODhoraioUKuqqiwAYDQa2YIFC7odDkdq2bJl3JOVZRkDAwMQcRlj6OvrE3btdruQ63a7YTabhdxAIABVVYXcWCyGeDwu5KZSKfh8PiE3l8thcHBQyFVVFf39/be8Rk6nE2VlZUKu1+uFXq8XcsPhMDKZjJB7U5b1mUwm+Stf+co73LMhCOKmQEeVCUKDUHAJQoPQQnqC0CC0kJ4gNAh9VCYIDULBJQgNQsElCA1CwSUIDULBJQgNUnBwE4mEWZZlXTweNyeTSf6+EARB3DAKCm4kEimqr6/feOLEidof/OAH/+fZZ5996GZPjCCIj6ega5XLy8uzEydOtI0YMSJbX19v+/Wvfz0LALLZrO7w4cNzz5w5Y7FardyDq6qKM2fOoKysjNtljOHMmTOoqKjgdgHg7NmzqKys5PZCoRB6e3uRyWS43VgsBpvNJnT+OpVK4ezZszAajdxuNptFS0sLSkpKuF1FUdDS0oLS0lJuN1+j8vJybhcQr1EgEIDT6UQymeR2I5EIurq6hBqkJRIJtLe3CzU5y2QyXM3CCgpuNpvVx+Pxie+++27p73//+7nPPPPMmwBQVFSkzp8/v8flcqWWLl3KPVlFUeDxeCDiMsbgcrmEXOCDFSQirtfrhcViEXJDoRB0Op2QG4/HkU6nhdxMJoNIJCLkyrIMn88n5KqqCrfbLVyjwcFBIdflcqGyslLI9fv9KCoqEnKj0SgURRFyk8kk3n///YIfX1Bw9Xq9+tOf/vSooihsxYoVHWaz+cpLQ0VFRcJisahVVVXck5VlGRaLBSIuY+y2uJlMBqWlpcLjWq1WIddoNAq7qVRK+O/N5XLCrqqqw6pRSUmJkJtMJoX3lSzLwvXV6XTC45pMJq6WooUGl02ePNnFPRuCIG4KdDqIIDQIBZcgNAgFlyA0CAWXIDQIBZcgNAgFlyA0CAWXIDQIBZcgNAgFlyA0SEHBzWazuqamphl+v9/a1NQ0vbW1dcSNGJzu8kgQYhR0yWMul5N++MMfzv3nf/5n5eLFixX79++/Z8+ePTsAgDEmXf4v9+CMsSs/Iq7ouP9zGyLerR5Xi3/vcOr7l9sQdW5HfYf79xZKQcG1WCzKtGnTnJWVlXJtbW1AkqTJAJDJZHSvvfbagvfff79UZBmUqqpobGwULs7x48e5vb90Rd7xw+EwBgYG4PV6ud14PI6uri6EQiFuN51Oo729nWvpV55sNoszZ84gm81yu4qioKmpCaqqcrv5+oownBrlO+65XPyX10ejUfT29iIQCHC7yWQSNpsNsViM281kMlzLAQsKbjqdNhoMhtq9e/eO0ul0yl133RUAAJPJpNbX159kjMU2bNjAPVlZlmEwGPD4449zu4wxSJKEJ598UsgFIOS63W60trZi5cqV3G4gEMDx48exevVqbjcWi+HQoUOor6/ndlOpFKxWK9avX8/t5nI5FBUVYePGjdyuqqrQ6/V44oknuN3h1MjpdMJms2H58uXcrtfrRXNzM1atWsXthsNhNDQ0YM2aNdzuTWn6ZTabc7/85S9fyu9MvV5PdzIniNtIwf1xdTodhZUg/pdAvYMIQoNQ7yCC0CB0AQZBaBAKLkFoEPqOSxAahL7jEoQGoY/KBKFBKLgEoUEouAShQQoKbjweNz733HNf9Hg8VYcPH57ym9/8Zt7NnhhBEB9PQZc8mkwmuaOjI3L+/PlRv/zlL+cqipJ5+umnWwDA7XZXhEIhyel0ci89URQFwWBQcjqd3EepGGO4PK7QES5R1+v1wu/3C7nhcBiBQEDITSQSwvsqk8kIu7IsD6tGoi4gXiO32y1co0AgIOzGYjHh+qZSKZVnhV1BwTUajcxqteKdd94ZV11dPbazs1MfDAZ1paWlrLu7e/Tg4ODLNpvtDO9kVVXVuVyue20222lelzEmuVyuz9hstmZeFwBcLtd9Im4wGCwbGBgYa7PZLvK6sVjMMjAw8CmbzXae102lUman0zndZrO18rrZbNY4ODhYZ7PZzvK6iqLoXS7Xp202WwuvO8waCbt+v7/C4XCMstlsnbxuOBy2DgwMTLTZbBd43UQiUex0Ou+y2WztvG46nS7KZrNFBQt/udj5435SqZTh97///co9e/YsiEajxX/605+m5H+XzWb1b7755pxCtvM/f2RZlvbt23e3iMsYw549ez59q12fz2c9duzYXSJuOBwubmhomC7ixuPxosOHD88ScdPptOHAgQNCNcrlcrr9+/fPFd3Pe/fuveX1HRoaKmtsbJwi4gYCgZL33ntvmogbjUZNb7/99kwRN5lMGt96663ZhT6+oO+4ZrNZ/trXvvbW6tWrm0pLS1OPPfaYPf+7hoaGCT6fz5JIJLi71Dc1NX2qrKxM6CqM3bt3Tw2HwyWhUKjwV6nLvPHGGxNCoZDV7/ebed3i4uJET09PWSQS4W426/V6R7rd7nHRaNTC6/p8Pp3T6aw8duzYSF63o6Ojwu/3j3nnnXem8brvvvvup7xeb1lfXx/3fj569Ohkr9dbHIlECl6Flk6nDdu2bVvW29tbGQqFivbu3TulUDebzeq2b9++JJFImDo6OmrOnTtXXagry7K0Y8eO+4PBYLnD4ajavXv39EJdVVWl3bt3L3C73SNjsVjxzp0767LZbMHP6z/96U/znE7nmFmzZvVt27bt3kKcYR1VDgaD+k2bNt136NChshMnTozl9T0eT+y1114reAf9JVVVVb4jR45UHjx4cBSvm0wmI5s3b76roaFhDK975MiR8d/73vc+5/V6ubs1nz59eup7771nyWaz3LeT+PWvf33vvn37xvT19XG706ZNC7e1tcl2u52r+3gikZB++MMfLvzXf/3XuX19fVwdppPJpO7HP/7xgt/97nejDh06VHD4JElSX3vttZLW1ta6xsbG6q1bt96nKEpBIZAkie3du7fI4XCMttvtRX/+859HFzquwWBghw8f1nV1dY2tqqqyv/jii/OSyWRBLzg6nY4dPXpUbW9vH28wGKK//e1vF6XT6YJfrJqamnKNjY1T/vM///Pe55577n6/33/dv3dYwWWMSUVFRWzkyJFJRVG4W6VPmjQpJkmSIjK2w+GwJBIJ0+c//3nue8jU1dWl586dOxiLxUy87tGjRz8zbty4MofDUfCTIs/o0aPPGI3G6H//93/P4XXj8Xjp2LFjM83NzZ/hdQ0Gg9LR0THys5/97CUeT1EUyWg0ZkeMGOHOZrNcnzBKSkrUb33rW2dNJlNNLpcr+ElsMpnUsWPHRhhjhvHjx6dqamoKHtNoNLLx48dHzGazumDBgijPfAFgwoQJYb1ez9rb2++aOHFid0lJScFHiyZNmhTW6XSora0NXO4fXXC2Jk2aFGltbS1pa2u722q1jnW73df9JDis4FZXV8srVqzoKSoqqrz33nudvH40Gp1cUVFR2dfXx/3u1dvbW7d48WIpGo1yf9x95513aseMGVO8dOlSD6/7/PPP7/3Od76zc9asWf28bmdnZ1V5eXnlww8/3Mfrfvvb326prKw0LFy4sIvXDQaD+iVLlvRNmjQpyeOVlZWpf/3Xfz0wb948ddSoUT7ecUePHq1bunRp/7Jly3oKdTKZjGH8+PHj+/r6TPF43Dp58uSeQu+4ksvl9GPGjJnQ0tIyuaenZ4LVap2sqmpB79ayLOuqq6snnT9/forT6Zy9ePFioyzLBbmqqkpWq/VTPT09Ew4cODB/0aJFLqPRmCvEBQCTyfSp8ePHl27fvv3Fr3/963snTZqUvp4jMUbXCxOE1qArpwhCg1BwCUKDUHAJQoNQcAlCg1BwCUKDUHAJQoNQcAlCg1BwCUKDUHAJQoP8PzS/I+ovoNUlAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] }, "metadata": { "needs_background": "light" @@ -671,14 +692,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001B[32m\u001B[1mAlice\u001B[0m\u001B[32m\u001B[0m: {\n", + "\u001b[32m\u001b[1mAlice\u001b[0m\u001b[32m\u001b[0m: {\n", " \"thought\": \"My opponent is trying to block me. I should place my piece at [6, 7] to create a potential line for myself.\",\n", " \"move\": [\n", " 6,\n", " 7\n", " ]\n", "}\n", - "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", + "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -699,8 +720,10 @@ }, { "data": { - "text/plain": "
", - "image/png": "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a7PZmnldAHC5XLeLuMFgsGxwcHCCzWY7x+vGYjHL4ODgZ2w2Wwevm0qlzE6nc7bNZmvldbPZrHFoaKjWZrOd5nUVRdG7XK5bbTZbC687wjESdv1+f8XAwMBYm83WxeuGw2Hr4ODgFJvNdpbXTSQSxU6nc6bNZmvnddPpdFE2my0qWPjzxc6X+kulUobf/e53q3fv3n1HNBot/uMf/zg9/1g2m9W/+eabCwrZz1/+ybIs7d279xYRlzGG3bt333q9XZ/PZz1y5MhMETccDhc3NDTMFnHj8XjRoUOH5om46XTasH//fqExyuVyun379i0UPc579uy57uM7PDxc1tjYOF3EDQQCJe+///4sETcajZrefvvtuSJuMpk0vvXWW/ML3b6g37hms1n+2te+9tbatWubSktLUw8++KA9/1hDQ8Nkn89nSSQS3FXqm5qaPlNWViY0C2Pnzp0zwuFwSSgUKvxd6iN27do1ORQKWf1+v5nXLS4uTvT29pZFIhHuYrNer3eM2+2eGI1GLbyuz+fTOZ3OyiNHjozhdTs7Oyv8fv/4w4cPz+J133333c94vd6yvr4+7uP83nvvTfN6vcWRSKTgVWjpdNqwbdu2FQ6HozIUChXt2bNneqFuNpvVbd++/a5EImHq7OysPnPmTFWhrizL0iuvvHJnMBgsHxgYGLVz587Zhbqqqko7d+68w+12j4nFYsU7duyozWazBb+u//jHPy52Op3j582b17dt27ZFhTgjOqscDAb1mzdvvv3gwYNlx44dm8Drezye2Ouvv17wAfpzRo0a5XvnnXcqDxw4MJbXTSaTkS1btsxsaGgYz+u+8847k773ve993uv1cldrPnny5Iz333/fks1muW8n8atf/WrR3r17x/f19XG7s2bNCre1tcl2u52r+ngikZB++MMfLv23f/u3hX19fVwVppPJpO7HP/7xHb/97W/HHjx4sODwSZKkvv766yWtra21jY2NVS+++OLtiqIUFAJJktiePXuKBgYGxtnt9qI//elP4wpt12AwsEOHDum6u7snjBo1yv78888vTiaTBb3h6HQ69t5776nt7e2TDAZD9De/+U1dOp0u+M2qqakp19jYOP2///u/Fz3zzDN3+v3+Kz7fEQWXMSYVFRWxMWPGJBVF4S6VPnXq1JgkSYpI2wMDA5ZEImH6whe+wH0Pmdra2vTChQuHYrGYidd97733Pjtx4sSygYGBgl8UecaNG3fKaDRG//d//3cBrxuPx0snTJiQaW5u/iyvazAYlM7OzjGf+9znzvN4iqJIRqMxO3r0aHc2m+X6hlFSUqJ+61vfOm0ymapzuVzBL2KTyaROmDAhwhgzTJo0KVVdXV1wm0ajkU2aNCliNpvVO+64I8rTXwCYPHlyWK/Xs/b29plTpkzpKSkpKfhs0dSpU8M6nQ41NTWBj+pHF5ytqVOnRlpbW0va2tpusVqtE9xu9xW/CY4ouFVVVfKqVat6i4qKKhctWuTk9aPR6LSKiorKvr4+7k8vh8NRu2zZMikajXJ/3T18+HDN+PHji5cvX+7hdZ999tk93/nOd3bMmzevn9ft6uoaVV5eXnnffff18brf/va3WyorKw1Lly7t5nWDwaD+rrvu6ps6dWqSxysrK1P/5m/+ZnDx4sXq2LFjfbztjhs3Trd8+fL+FStW9BbqZDIZw6RJkyb19fWZ4vG4ddq0ab2F3nEll8vpx48fP7mlpWVab2/vZKvVOk1V1YI+rWVZ1lVVVU3t6OiY7nQ65y9btswoy3JBrqqqktVq/Uxvb+/k/fv3L6mrq3MZjcZcIS4AmEymz0yaNKl0+/btz3/961/fM3Xq1PSVHIkxmi9MEFqDZk4RhAah4BKEBqHgEoQGoeAShAah4BKEBqHgEoQGoeAShAah4BKEBqHgEoQG+X/Dcc4OaIWRHwAAAABJRU5ErkJggg==" + "image/png": "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a7PZmnldAHC5XLeLuMFgsGxwcHCCzWY7x+vGYjHL4ODgZ2w2Wwevm0qlzE6nc7bNZmvldbPZrHFoaKjWZrOd5nUVRdG7XK5bbTZbC687wjESdv1+f8XAwMBYm83WxeuGw2Hr4ODgFJvNdpbXTSQSxU6nc6bNZmvnddPpdFE2my0qWPjzxc6X+kulUobf/e53q3fv3n1HNBot/uMf/zg9/1g2m9W/+eabCwrZz1/+ybIs7d279xYRlzGG3bt333q9XZ/PZz1y5MhMETccDhc3NDTMFnHj8XjRoUOH5om46XTasH//fqExyuVyun379i0UPc579uy57uM7PDxc1tjYOF3EDQQCJe+///4sETcajZrefvvtuSJuMpk0vvXWW/ML3b6g37hms1n+2te+9tbatWubSktLUw8++KA9/1hDQ8Nkn89nSSQS3FXqm5qaPlNWViY0C2Pnzp0zwuFwSSgUKvxd6iN27do1ORQKWf1+v5nXLS4uTvT29pZFIhHuYrNer3eM2+2eGI1GLbyuz+fTOZ3OyiNHjozhdTs7Oyv8fv/4w4cPz+J133333c94vd6yvr4+7uP83nvvTfN6vcWRSKTgVWjpdNqwbdu2FQ6HozIUChXt2bNneqFuNpvVbd++/a5EImHq7OysPnPmTFWhrizL0iuvvHJnMBgsHxgYGLVz587Zhbqqqko7d+68w+12j4nFYsU7duyozWazBb+u//jHPy52Op3j582b17dt27ZFhTgjOqscDAb1mzdvvv3gwYNlx44dm8Drezye2Ouvv17wAfpzRo0a5XvnnXcqDxw4MJbXTSaTkS1btsxsaGgYz+u+8847k773ve993uv1cldrPnny5Iz333/fks1muW8n8atf/WrR3r17x/f19XG7s2bNCre1tcl2u52r+ngikZB++MMfLv23f/u3hX19fVwVppPJpO7HP/7xHb/97W/HHjx4sODwSZKkvv766yWtra21jY2NVS+++OLtiqIUFAJJktiePXuKBgYGxtnt9qI//elP4wpt12AwsEOHDum6u7snjBo1yv78888vTiaTBb3h6HQ69t5776nt7e2TDAZD9De/+U1dOp0u+M2qqakp19jYOP2///u/Fz3zzDN3+v3+Kz7fEQWXMSYVFRWxMWPGJBVF4S6VPnXq1JgkSYpI2wMDA5ZEImH6whe+wH0Pmdra2vTChQuHYrGYidd97733Pjtx4sSygYGBgl8UecaNG3fKaDRG//d//3cBrxuPx0snTJiQaW5u/iyvazAYlM7OzjGf+9znzvN4iqJIRqMxO3r0aHc2m+X6hlFSUqJ+61vfOm0ymapzuVzBL2KTyaROmDAhwhgzTJo0KVVdXV1wm0ajkU2aNCliNpvVO+64I8rTXwCYPHlyWK/Xs/b29plTpkzpKSkpKfhs0dSpU8M6nQ41NTWBj+pHF5ytqVOnRlpbW0va2tpusVqtE9xu9xW/CY4ouFVVVfKqVat6i4qKKhctWuTk9aPR6LSKiorKvr4+7k8vh8NRu2zZMikajXJ/3T18+HDN+PHji5cvX+7hdZ999tk93/nOd3bMmzevn9ft6uoaVV5eXnnffff18brf/va3WyorKw1Lly7t5nWDwaD+rrvu6ps6dWqSxysrK1P/5m/+ZnDx4sXq2LFjfbztjhs3Trd8+fL+FStW9BbqZDIZw6RJkyb19fWZ4vG4ddq0ab2F3nEll8vpx48fP7mlpWVab2/vZKvVOk1V1YI+rWVZ1lVVVU3t6OiY7nQ65y9btswoy3JBrqqqktVq/Uxvb+/k/fv3L6mrq3MZjcZcIS4AmEymz0yaNKl0+/btz3/961/fM3Xq1PSVHIkxmi9MEFqDZk4RhAah4BKEBqHgEoQGoeAShAah4BKEBqHgEoQGoeAShAah4BKEBqHgEoQG+X/Dcc4OaIWRHwAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] }, "metadata": { "needs_background": "light" @@ -711,14 +734,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001B[35m\u001B[1mBob\u001B[0m\u001B[35m\u001B[0m: {\n", + "\u001b[35m\u001b[1mBob\u001b[0m\u001b[35m\u001b[0m: {\n", " \"thought\": \"Alice is trying to build a vertical line now. I need to block her next move otherwise she will have a chance to win. I will place my piece at [5, 7].\",\n", " \"move\": [\n", " 5,\n", " 7\n", " ]\n", "}\n", - "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", + "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -739,8 +762,10 @@ }, { "data": { - "text/plain": "
", - "image/png": "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" + "image/png": "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", + "text/plain": [ + "
" + ] }, "metadata": { "needs_background": "light" @@ -751,14 +776,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001B[32m\u001B[1mAlice\u001B[0m\u001B[32m\u001B[0m: {\n", + "\u001b[32m\u001b[1mAlice\u001b[0m\u001b[32m\u001b[0m: {\n", " \"thought\": \"My opponent is trying to block me. I should place my piece at [8, 7] to create a potential line for myself.\",\n", " \"move\": [\n", " 8,\n", " 7\n", " ]\n", "}\n", - "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", + "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -779,8 +804,10 @@ }, { "data": { - "text/plain": "
", - "image/png": "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" + "image/png": "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", + "text/plain": [ + "
" + ] }, "metadata": { "needs_background": "light" @@ -791,7 +818,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001B[35m\u001B[1mBob\u001B[0m\u001B[35m\u001B[0m: {\n", + "\u001b[35m\u001b[1mBob\u001b[0m\u001b[35m\u001b[0m: {\n", " \"thought\": \"Alice is trying to build a vertical line again. I need to block her next move otherwise she will have a chance to win. I will place my piece at [9, 7].\",\n", " \"move\": [\n", " 9,\n", @@ -824,17 +851,13 @@ " msg = player(msg)\n", " \n", " i += 1" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2024-03-27T08:10:33.989202Z", - "start_time": "2024-03-27T08:09:59.446824Z" - } - } + ] }, { "cell_type": "markdown", + "metadata": { + "collapsed": false + }, "source": [ "## Future Direction\n", "\n", @@ -845,10 +868,7 @@ "- Fine tune a model to improve the performance of the agent\n", "\n", "For complete code, we provide in [code/game_gomoku.py](./code/game_gomoku.py)." - ], - "metadata": { - "collapsed": false - } + ] } ], "metadata": { From fbca61ffdc590a7cd20492684114f4574febd142 Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Wed, 22 May 2024 20:42:37 +0800 Subject: [PATCH 27/55] revert back unnecessary changes --- examples/game_gomoku/main.ipynb | 260 +++++++++++++++----------------- 1 file changed, 120 insertions(+), 140 deletions(-) diff --git a/examples/game_gomoku/main.ipynb b/examples/game_gomoku/main.ipynb index 569321c15..7044a8243 100644 --- a/examples/game_gomoku/main.ipynb +++ b/examples/game_gomoku/main.ipynb @@ -31,13 +31,6 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-27T08:09:57.602994Z", - "start_time": "2024-03-27T08:09:57.565787Z" - }, - "collapsed": false - }, "outputs": [], "source": [ "YOUR_MODEL_CONFIGURATION_NAME = \"{YOUR_MODEL_CONFIGURATION_NAME}\"\n", @@ -46,38 +39,38 @@ " \n", " # ...\n", "}" - ] + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-03-27T08:09:57.602994Z", + "start_time": "2024-03-27T08:09:57.565787Z" + } + } }, { "cell_type": "markdown", - "metadata": { - "collapsed": false - }, "source": [ "## Step 1: Prepare a board for Gomoku\n", "\n", "First we create a `BoardAgent` class by inheriting from `AgentBase`, which manage the game board and update the game status as follows.\n", "\n", "To create a better visual experience, we also provide a function `board2img` to convert the board to an image. " - ] + ], + "metadata": { + "collapsed": false + } }, { "cell_type": "code", "execution_count": 2, - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-27T08:09:58.153932Z", - "start_time": "2024-03-27T08:09:57.571266Z" - }, - "collapsed": false - }, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import matplotlib.patches as patches\n", "\n", - "def board2img(board: np.ndarray, save_path: str)->str:\n", + "def board2img(board: np.ndarray, output_dir: str)->str:\n", " size = board.shape[0]\n", " fig, ax = plt.subplots(figsize=(10, 10))\n", " ax.set_xlim(0, size - 1)\n", @@ -107,30 +100,29 @@ " ax.set_xticklabels(range(size))\n", " ax.set_yticklabels(range(size))\n", " ax.invert_yaxis()\n", - " plt.savefig(save_path, bbox_inches='tight', pad_inches=0.1)\n", + " plt.savefig(output_dir, bbox_inches='tight', pad_inches=0.1)\n", " plt.close(fig) # Close the figure to free memory\n", - " return save_path" - ] + " return output_dir" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-03-27T08:09:58.153932Z", + "start_time": "2024-03-27T08:09:57.571266Z" + } + } }, { "cell_type": "markdown", - "metadata": { - "collapsed": false - }, "source": [ "The following code shows the implementation of the `BoardAgent` class. The agent manages the game board and updates the game status." - ] + ], + "metadata": { + "collapsed": false + } }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-27T08:09:59.392069Z", - "start_time": "2024-03-27T08:09:58.159470Z" - }, - "collapsed": false - }, "outputs": [], "source": [ "import numpy as np\n", @@ -237,13 +229,18 @@ " else:\n", " count = 0\n", " return False\n" - ] + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-03-27T08:09:59.392069Z", + "start_time": "2024-03-27T08:09:58.159470Z" + } + }, + "execution_count": 3 }, { "cell_type": "markdown", - "metadata": { - "collapsed": false - }, "source": [ "### Step2: Prepare a Gomoku Player Agent\n", "\n", @@ -253,18 +250,13 @@ "2. Within the agent, to enable the agent to think, we ask LLMs to respond in a dictionary format, which contains the thought and the move (\"thought\" field must come before \"move\"). To achieve this, we prepare a parsing function to extract the dictionary from response. \n", "\n", "The implementation of the Gomoku agent is as follows: " - ] + ], + "metadata": { + "collapsed": false + } }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-27T08:09:59.397713Z", - "start_time": "2024-03-27T08:09:59.392729Z" - }, - "collapsed": false - }, "outputs": [], "source": [ "import json\n", @@ -335,7 +327,15 @@ " \n", " # Hide thought from the response\n", " return Msg(self.name, response[\"move\"], role=\"assistant\") \n" - ] + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-03-27T08:09:59.397713Z", + "start_time": "2024-03-27T08:09:59.392729Z" + } + }, + "execution_count": 4 }, { "cell_type": "markdown", @@ -346,25 +346,17 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-27T08:09:59.446367Z", - "start_time": "2024-03-27T08:09:59.398116Z" - }, - "collapsed": false - }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\u001b[32m2024-03-27 16:09:59.427\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36magentscope.models\u001b[0m:\u001b[36mread_model_configs\u001b[0m:\u001b[36m171\u001b[0m - \u001b[1mLoad configs for model wrapper: post_api\u001b[0m\n", - "\u001b[32m2024-03-27 16:09:59.435\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36magentscope.utils.monitor\u001b[0m:\u001b[36m_create_monitor_table\u001b[0m:\u001b[36m341\u001b[0m - \u001b[1mInit [monitor_metrics] as the monitor table\u001b[0m\n", - "\u001b[32m2024-03-27 16:09:59.435\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36magentscope.utils.monitor\u001b[0m:\u001b[36m_create_monitor_table\u001b[0m:\u001b[36m342\u001b[0m - \u001b[1mInit [monitor_metrics_quota_exceeded] as the monitor trigger\u001b[0m\n", - "\u001b[32m2024-03-27 16:09:59.436\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36magentscope.utils.monitor\u001b[0m:\u001b[36m__init__\u001b[0m:\u001b[36m311\u001b[0m - \u001b[1mSqliteMonitor initialization completed at [./runs/run_20240327-160958_kbf2ta/agentscope.db]\u001b[0m\n", - "\u001b[32m2024-03-27 16:09:59.440\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36magentscope.models.model\u001b[0m:\u001b[36m__init__\u001b[0m:\u001b[36m257\u001b[0m - \u001b[1mInitialize model [post_api]\u001b[0m\n", - "\u001b[32m2024-03-27 16:09:59.441\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36magentscope.models.model\u001b[0m:\u001b[36m__init__\u001b[0m:\u001b[36m257\u001b[0m - \u001b[1mInitialize model [post_api]\u001b[0m\n" + "\u001B[32m2024-03-27 16:09:59.427\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36magentscope.models\u001B[0m:\u001B[36mread_model_configs\u001B[0m:\u001B[36m171\u001B[0m - \u001B[1mLoad configs for model wrapper: post_api\u001B[0m\n", + "\u001B[32m2024-03-27 16:09:59.435\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36magentscope.utils.monitor\u001B[0m:\u001B[36m_create_monitor_table\u001B[0m:\u001B[36m341\u001B[0m - \u001B[1mInit [monitor_metrics] as the monitor table\u001B[0m\n", + "\u001B[32m2024-03-27 16:09:59.435\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36magentscope.utils.monitor\u001B[0m:\u001B[36m_create_monitor_table\u001B[0m:\u001B[36m342\u001B[0m - \u001B[1mInit [monitor_metrics_quota_exceeded] as the monitor trigger\u001B[0m\n", + "\u001B[32m2024-03-27 16:09:59.436\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36magentscope.utils.monitor\u001B[0m:\u001B[36m__init__\u001B[0m:\u001B[36m311\u001B[0m - \u001B[1mSqliteMonitor initialization completed at [./runs/run_20240327-160958_kbf2ta/agentscope.db]\u001B[0m\n", + "\u001B[32m2024-03-27 16:09:59.440\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36magentscope.models.model\u001B[0m:\u001B[36m__init__\u001B[0m:\u001B[36m257\u001B[0m - \u001B[1mInitialize model [post_api]\u001B[0m\n", + "\u001B[32m2024-03-27 16:09:59.441\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36magentscope.models.model\u001B[0m:\u001B[36m__init__\u001B[0m:\u001B[36m257\u001B[0m - \u001B[1mInitialize model [post_api]\u001B[0m\n" ] } ], @@ -389,13 +381,18 @@ ")\n", "\n", "board = BoardAgent(name=\"Host\")" - ] + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-03-27T08:09:59.446367Z", + "start_time": "2024-03-27T08:09:59.398116Z" + } + }, + "execution_count": 5 }, { "cell_type": "markdown", - "metadata": { - "collapsed": false - }, "source": [ "### Step 3: Start the Gomoku game\n", "\n", @@ -404,32 +401,26 @@ "In this game, we use a message hub to share messages between the two players (board agent doesn't have memory), so that one player can hear what the board agent says to the other player, and what moves the other player makes. \n", "\n", "Note here we only show 10 steps of the game. You can adjust the `MAX_STEPS` to play more rounds." - ] + ], + "metadata": { + "collapsed": false + } }, { "cell_type": "code", "execution_count": 6, - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-27T08:10:33.989202Z", - "start_time": "2024-03-27T08:09:59.446824Z" - }, - "collapsed": false - }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: Welcome to the Gomoku game! Black player goes first. Please make your move.\n" + "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: Welcome to the Gomoku game! Black player goes first. Please make your move.\n" ] }, { "data": { - "image/png": "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", - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/png": "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" }, "metadata": { "needs_background": "light" @@ -440,14 +431,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[32m\u001b[1mAlice\u001b[0m\u001b[32m\u001b[0m: {\n", + "\u001B[32m\u001B[1mAlice\u001B[0m\u001B[32m\u001B[0m: {\n", " \"thought\": \"As the first move of the game, it's best to place the piece in the center of the board to maximize possible winning directions.\",\n", " \"move\": [\n", " 7,\n", " 7\n", " ]\n", "}\n", - "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", + "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -468,10 +459,8 @@ }, { "data": { - "image/png": "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", - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/png": "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" }, "metadata": { "needs_background": "light" @@ -482,14 +471,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[35m\u001b[1mBob\u001b[0m\u001b[35m\u001b[0m: {\n", + "\u001B[35m\u001B[1mBob\u001B[0m\u001B[35m\u001B[0m: {\n", " \"thought\": \"As the game has just started, I will place my piece near Alice's to prevent her from forming a line and to start building my own line.\",\n", " \"move\": [\n", " 7,\n", " 8\n", " ]\n", "}\n", - "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", + "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -510,10 +499,8 @@ }, { "data": { - "image/png": "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O/m+++77P4FAgLtb8+HDh2fu27fPkcvluG8n8cQTTyzYvn37xL6+Pm539uzZsY6ODsXtdnN1H0+n04YHHnhg8S9/+cv5fX19XB2mM5mM8ac//ekVTz/99Phdu3YVHT6DwaC9+uqr5e3t7XObm5trN23adLmqqkWFwGAwsG3btlk9Hs8Et9ttffvttycUO67ZbGa7d+82dnd3TxozZoz7ueeeW5jJZIp6wzEajWzv3r1aZ2fnZLPZnPjTn/60JJvNFv1m1dLSkm9ubp7x+9//fsFDDz30xVAo9LnPt6TgMsYMVquVjRs3LqOqKner9GnTpiUNBoMqMrbH43Gk02nbNddcw30Pmblz52bnz58/mEwmbbzu3r17v3DBBRdUejyeol8UBSZMmHDEYrEk/vznP8/jdVOpVMWkSZPk1tbWL/C6ZrNZPXHixLirrrrqNI+nqqrBYrHkxo4d68/lclzfMMrLy7U777zzqM1mq8vn80W/iG02mzZp0qQ4Y8w8efJkqa6urugxLRYLmzx5ctxut2tXXHFFgme+ADBlypSYyWRinZ2ds6ZOnXqmvLy86KNF06ZNixmNRtTX14c/7B9ddLamTZsWb29vL+/o6LjU6XRO8vv9n/tNsKTg1tbWKitXruyxWq01CxYs8PL6iURienV1dU1fXx/3p1dvb+/cpUuXGhKJBPfX3ffee69+4sSJZcuWLRvmdR9++OFt995770sNDQ39vG5XV9eYqqqqmmuvvbaP1/3ud7/bVlNTY168eHE3rxuJRExXXnll37Rp0zI8XmVlpfbNb35zYOHChdr48eODvONOmDDBuGzZsv7ly5f3FOvIsmyePHny5L6+PlsqlXJOnz69p9g7ruTzedPEiROntLW1Te/p6ZnidDqna5pW1Ke1oijG2traacePH5/h9XovWbp0qUVRlKJcTdMMTqfzwp6enilvvvnmoiVLlvgsFku+GBcAbDbbhZMnT67YvHnzc9/+9re3TZs2Lft5joExul6YIPQGXTlFEDqEgksQOoSCSxA6hIJLEDqEgksQOoSCSxA6hIJLEDqEgksQOoSCSxA65P8D2qq520he9+8AAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/png": "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O/m+++77P4FAgLtb8+HDh2fu27fPkcvluG8n8cQTTyzYvn37xL6+Pm539uzZsY6ODsXtdnN1H0+n04YHHnhg8S9/+cv5fX19XB2mM5mM8ac//ekVTz/99Phdu3YVHT6DwaC9+uqr5e3t7XObm5trN23adLmqqkWFwGAwsG3btlk9Hs8Et9ttffvttycUO67ZbGa7d+82dnd3TxozZoz7ueeeW5jJZIp6wzEajWzv3r1aZ2fnZLPZnPjTn/60JJvNFv1m1dLSkm9ubp7x+9//fsFDDz30xVAo9LnPt6TgMsYMVquVjRs3LqOqKner9GnTpiUNBoMqMrbH43Gk02nbNddcw30Pmblz52bnz58/mEwmbbzu3r17v3DBBRdUejyeol8UBSZMmHDEYrEk/vznP8/jdVOpVMWkSZPk1tbWL/C6ZrNZPXHixLirrrrqNI+nqqrBYrHkxo4d68/lclzfMMrLy7U777zzqM1mq8vn80W/iG02mzZp0qQ4Y8w8efJkqa6urugxLRYLmzx5ctxut2tXXHFFgme+ADBlypSYyWRinZ2ds6ZOnXqmvLy86KNF06ZNixmNRtTX14c/7B9ddLamTZsWb29vL+/o6LjU6XRO8vv9n/tNsKTg1tbWKitXruyxWq01CxYs8PL6iURienV1dU1fXx/3p1dvb+/cpUuXGhKJBPfX3ffee69+4sSJZcuWLRvmdR9++OFt995770sNDQ39vG5XV9eYqqqqmmuvvbaP1/3ud7/bVlNTY168eHE3rxuJRExXXnll37Rp0zI8XmVlpfbNb35zYOHChdr48eODvONOmDDBuGzZsv7ly5f3FOvIsmyePHny5L6+PlsqlXJOnz69p9g7ruTzedPEiROntLW1Te/p6ZnidDqna5pW1Ke1oijG2traacePH5/h9XovWbp0qUVRlKJcTdMMTqfzwp6enilvvvnmoiVLlvgsFku+GBcAbDbbhZMnT67YvHnzc9/+9re3TZs2Lft5joExul6YIPQGXTlFEDqEgksQOoSCSxA6hIJLEDqEgksQOoSCSxA6hIJLEDqEgksQOoSCSxA65P8D2qq520he9+8AAAAASUVORK5CYII=" }, "metadata": { "needs_background": "light" @@ -524,14 +511,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[32m\u001b[1mAlice\u001b[0m\u001b[32m\u001b[0m: {\n", + "\u001B[32m\u001B[1mAlice\u001B[0m\u001B[32m\u001B[0m: {\n", " \"thought\": \"My opponent placed his piece next to mine. I should block him and also try to create a potential line for myself.\",\n", " \"move\": [\n", " 7,\n", " 6\n", " ]\n", "}\n", - "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", + "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -552,10 +539,8 @@ }, { "data": { - "image/png": "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", - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/png": "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" }, "metadata": { "needs_background": "light" @@ -566,14 +551,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[35m\u001b[1mBob\u001b[0m\u001b[35m\u001b[0m: {\n", + "\u001B[35m\u001B[1mBob\u001B[0m\u001B[35m\u001B[0m: {\n", " \"thought\": \"I see Alice is trying to create a line horizontally. I need to block her next move otherwise she will have a chance to win. I will place my piece at [7, 5].\",\n", " \"move\": [\n", " 7,\n", " 5\n", " ]\n", "}\n", - "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", + "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -594,10 +579,8 @@ }, { "data": { - "image/png": "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", - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/png": "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" }, "metadata": { "needs_background": "light" @@ -608,14 +591,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[32m\u001b[1mAlice\u001b[0m\u001b[32m\u001b[0m: {\n", + "\u001B[32m\u001B[1mAlice\u001B[0m\u001B[32m\u001B[0m: {\n", " \"thought\": \"My opponent is trying to block me. I should place my piece at [7, 9] to create a potential line for myself.\",\n", " \"move\": [\n", " 7,\n", " 9\n", " ]\n", "}\n", - "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", + "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -636,10 +619,8 @@ }, { "data": { - "image/png": "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", - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/png": "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" }, "metadata": { "needs_background": "light" @@ -650,14 +631,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[35m\u001b[1mBob\u001b[0m\u001b[35m\u001b[0m: {\n", + "\u001B[35m\u001B[1mBob\u001B[0m\u001B[35m\u001B[0m: {\n", " \"thought\": \"Alice is trying to create a line horizontally again. I need to block her next move otherwise she will have a chance to win. I will place my piece at [7, 10].\",\n", " \"move\": [\n", " 7,\n", " 10\n", " ]\n", "}\n", - "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", + "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -678,10 +659,8 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAO4AAADnCAYAAAAZ4WrqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAAsTAAALEwEAmpwYAAAmkUlEQVR4nO2deXBU15m3f7cXdUvd2tnEHrBYBY5NzGKWfHaCwcHGYRBJGLCdZLJ4xi5PkkrNVFLJZGbK+eIJM6nJJIHKVBwnBmMw2A6LwRBjGRsQQgiQhGjQ0pJarW71vu/33vP9YZovHmPoc8QyF79PlcqF1c89R/ftXy/33nNfiTEGgiC0he52T4AgCH4ouAShQSi4BKFBKLgEoUEouAShQSi4BKFBKLgEoUG4g3vhwoWKrVu3LhoaGiq5GRMiCOL6SLwXYKxfv355ZWWlPHbs2OSPfvSjpkwmY2CM6W/S/AjiE4PBYJANBoNS0GN5Ny7LsmHGjBler9dbnslkdPv27fvM2bNnn6urq6vh3Zaqqjh//jzmzp3Lq4Ixhra2Ntx9993cLgC0trYKufF4HB6PB1OnTuV2U6kUBgYGMG3aNG43k8nAbrdj5syZ3K4sy7h06RJmz57N7aqqio6ODsyZM4fbZYyhvb39ltc3Go3C7/djypQp3G4ikYDL5UJtbS23m06n0dfXhxkzZnC7uVyOFRcX/99169ZtL0hgjHH9vPrqq5O/8Y1vfKm5uXkkYwyZTMa4bdu2NiZALpdjL730kojKVFVlf/jDH4TdF198Uch1uVzs4MGDQq7f72d79uwRcqPRKNu1a5eQm0wm2fbt24XcbDbLtm7dKuQqisL++Mc/CrnDqdHAwAA7fPiwkOvxeNj+/fuF3FAoxF5//XUhNx6Pyzt37nyKFZhD7nfcdevW9a1bt66P1yMI4sZBR5UJQoPc1uBKknQ7hycIzXJbg8toSSFBCEEflQlCg1BwCUKDUHAJQoNQcAlCg1BwCUKDUHAJQoPQeVyC0CDcwT127NiEH/3oRxtuxOB0HpcgxOC+VnnSpElum82mqqoqqaqKCxcujHc4HKZz585xD66qKhwOB0RcxpiwCwADAwNCrt/vh91uF3IjkQh6e3uF3GQyib6+PiE3m82iv79fyFUURdi9XTXyeDzC+yoUCgnXNx6PC9c3nU4jk8kU/Hju4EqSZMxkMmWRSMRcWlqaVlVVYoxBVVXeTUFV1Ss/IoiO+5dji4wpOu5wXFVVNecO5+/N+5+k/cwDd3B1Op35W9/6VmcgECiprKxM1dXVDdhstsy9997LuynIsgybzQYRl11e6ynqtrW1CblutxuKogi5gUAA0WhUyI3FYhgaGhJyU6kUent7hdxcLodLly4Jufm1vLe6Rk6nE3q9Xsj1er1Ip9NCbjgcRiAQEHITiQScTmfBj+cO7tixY0OrV69u4PUIgrhx0OkggtAgFFyC0CAUXILQIBRcgtAgdOUUQWgQugMGQWgQ+qhMEBqEgksQGoSCSxAahDu4oVDI5PV6y2VZpiNLBHGb4L7k8Xe/+12NzWa7b9myZee++tWvdt2MSREEcW24g/vEE08MPPPMM7PLysqS+aZfJ0+etOr1/A37VFXFyZMnYTQauV3GGJqammAymbhdAGhqaoLZbOb2wuEw+vv7EQ6Hud14PI5Lly4hmUxyu6lUCm1tbZBlmdvNZrM4ffq00Ok3RVHQ2NgIg4H7qXKlvkVFRdxuvr4iNQoEAnC5XAgEAtxuNBpFT08PYrEYt5tMJtHR0cG1PC9PJpPhqi13NX7605/OLy4unjxr1qxGk8mkPvTQQ63xeDzx2GOP8W4KiqIglUpBxGWMIR6PC7nAB6ttRNyhoSG0t7dj+fLl3G4wGERFRQVWrVrF7cZiMZhMJqE5p9NpABByZVlGJpMRclVVRTKZvOX1HRwcxKVLl/Dggw9yuz6fDy0tLVi5ciW3G4lEYLFYsHr1am43mUziz3/+c8GP5w7uv/zLv5zLZrOXLBZLDADMZnPOaDSy4uJi3k1BlmUUFRVBxGWMDcs1Go1CrtlsFh53OO5w9hUA4b83l8sJj6uq6ieqRplMZlj7Sqcr/JATd3ArKytTAFK8HkEQNw46HUQQGoSCSxAahIJLEBqEgksQGoSCSxAahIJLEBqEgksQGoSCSxAahIJLEBqEO7jHjx8fsX///nl+v5//6m+CIG4I3Jc82u32zAsvvDDtS1/6Uvrv/u7vOmRZ1quqKrRqRVEUKIoi5DLGhF3gg2tDb/Wch+PKsjyscUX/3uGMq6rqsOo7nDlrsb4892DjDu7ChQtTzc3N3mQyaby8rG9eY2NjKe92gP+/7EtkSSDwwdI8kSWBAISXE0YiETgcDgSDQW43kUigs7MT8Xic202n02hvb0c2m+V2c7kcWlpahJtRnTx5kusC+DyMMZw8eVJoSSAgXt9QKASXywWv18vtxmIx2O12RCIRbjeVSuHChQtIpfgv5eetK/ce3bdv36f0en3lokWLbCaTSV2zZs0pWZZjGzbwt8yVZRk6nQ6PP/44t5t/RRZ1FUURct1uN1pbW4WWfQUCARw/flxo2VcsFkNlZSXq6+u53VQqheLiYqxfv57bzeVy0Ov12LhxI7ebf6G41TVyOp2w2WxCSy+9Xi+am5uFll6Gw2E0NDRgzZo13G4ikcCbb75Z8OO5g/u9732vC8ANufMF3VeZIMSg+yoThAah00EEoUEouAShQah3EEFoEPqOSxAahD4qE4QGoeAShAah4BKEBqHgEoQGoaPKBKFBuIMbiUR03/nOdx51Op3Vwx2cjioThBjc1yrv2bPnrldeeWXiN77xjdaamppgT0/PaLfbbbx48SL34Kqqwu12Q8RljAm7wAc9gERcv98Pp9Mp5EYiEQwODgq5iUQCLpdLyM1kMsL7SlEUzdXI4/EI1ygYDAq7sVhMuL6pVIprhRB3cMPh8Pi77rprZG9vb8306dMHwuGwJZFI6EWWuamqing8LrREDvjgySzqio4bDocRi8WE3Gg0KuymUinhOWezWWFXURRhlzE2rBqJusOp0XDcRCIhvK/S6TTXskvu4D777LPv3HfffR0zZsyIG41GNm/ePLvdbk/ff//9vJuCLMvo7e2FiMsYQ1dXl7Db2dkp5LrdbhgMBiE3EAggm80KubFYDKFQSMhNpVJwu91Cbi6XQ39/v5Crqip6enpueY2cTidKSkqEXK/XC8aYkBsOhxGPx4XcRCIBv99f8OOFVjgvWrTII+IRBHFjoNNBBKFB6HQQQWgQWmRAEBqEPioThAah4BKEBqHgEoQGoeAShAaho8oEoUHoqDJBaBDu4Pb399ccPHhwYTweL74ZEyII4vpwX/L43nvvzW5ubjYvWrSIAcDlpl9SLpfjHjzfJEnEzbeoEHHzY4u4+SZY5F6ffNMv0Rqpqqqpv3e47k1t+jV+/Pizx44du/eFF16Y9cwzz5y73PTLKvJ9Nd9QSqQpFGMMTU1NKCoq4nYB4NSpUzCZTNxeOByGw+FAKBTiduPxODo7O5FIJLjddDqNtrY2oSdFLpfD6dOnuT3ggxc40cZs+RqJNmYTrW8wGITL5eK6aD9PNBqF3W5HNBrldpPJJC5cuIB0Os3tZjIZrsdzJ+bcuXMVFoulfNGiRR03oumXJElCDaXyTb9EXVmWhdzb2fSroqJCuOmX2Wy+LU2/GGO3vEbU9OsqfPe73+0B0MPrEQRx46DzuAShQSi4BKFBKLgEoUEouAShQSi4BKFBKLgEoUEouAShQSi4BKFBKLgEoUEouAShQbiD++677478x3/8x9VvvPHGqJsxIYIgrg/3tcr/9V//tVCSpOJ77rlHUhRF6u7uHuNyuYpsNhv34IqiwOVyQcRljAm7wAeLBURcn88Hh8Mh5IbDYQwMDAi5iUTiysXzvGQyGQwODgq5siwL72dVVYdVX9EaDQ0NCdcoGAwK1ygWiwnX6KY3/Zo4cWIGQPr8+fOz6+vrvbFYrDiVSukikQjvpqCqKpLJJERcxhhSqZSQC0DYjcViwnMejptMJoXnnM1mhV1FUahGBRKPx4XdW9H0q/H06dOza2trbQaDgd1zzz293d3d6YULF/JuCrIso6enByJuvimUqHvx4kUh1+12Q6/XC7mBQADpdFrIzXeQE3FTqRQGBweF3Fwuh97eXiFXVVV0dXXd8ho5nU4UFxcLuV6vF4qiCLn5Tn8ibiKRgNfrLfjx3MGdMmVKbMqUKSd5PYIgbhx0VJkgNAgFlyA0CAWXIDQIBZcgNIhQR/obxSehkwFjDLlcDi6XC5cuXcLFixcxffp0TJgwAcXFxdfcB3nX6/Wiv78f/f39sNvtqKmpgdlsLth1Op1wOBzcrsvlgtPpRFdXFy5dusQ9Z4/Hg4GBAaFxXS4Xuru7cenSJUycOPG67ieN2xrcO7mTQf6+z++++y42b96MpqYm+Hw+KIqCTZs2Yfbs2fj617+O+vr6j4Qh754+fRqdnZ0YNWoURo8ejc997nPo6+vDiRMnMHLkSCxduvSqrizLaGlp+ZC7YsWKK+6oUaOwZMmSq4Ywl8tdmfOpU6euzHnz5s2oq6vD3/zN3+Cv/uqvCh531apV1x037zY0NGDLli0fGve3v/3tNcf9xMIYG9ZPJpMxbtu2rY0JkMvl2EsvvSSiMlVV2R/+8Adh98UXXxRyXS4XO3jw4HUfl0wm2T/90z+x8vJyBuCqPyaTiW3cuJENDQ19xH311VfZsWPHWDqdZqqqfmjuuVyOdXR0sD/+8Y/M5/N96PeFuOfPn/9Y9yc/+QkrKyu75pw3bNjAPB7PR9ydO3cWNK7f77/ye1VVWSKRYD/+8Y+vO+7jjz/OvF7vh7Z9NQYGBtjhw4evW6Or4fF42P79+4XcUCjEXn/9dSE3Ho/LO3fufIoVmLvb+o57p5J/p3j++eeveRlbJpPB9u3bYTAYsHnzZhQXF0NRFBw+fBizZs3CrFmzPvLuIkkSDAYDZs6ciaqqKhw8eBDr1q2D2WyGoig4dOjQdd1Zs2ahurr6I+6WLVvw/PPPX/Pm3JlMBq+88gqKioqwefNmmM1mqKqKt956C3V1dZg5c+Y1x62qqsKBAweujMsYw5YtW/Dzn//8uuO+/PLLMJlM+NWvfgWz2XytEtzx0MGpGwxjDJcuXcKmTZsKuvZUVVXs3LkTBw4cAGMMvb29V57k1/pIKEkSRo8ejTlz5uDkyZNgjMFut6OoqIjLbWpq+tCcC7mjvqqq2LFjB9566y0wxtDd3Q2z2YwZM2Zcd9wxY8Zg9uzZOHXqFBhjsNlsXONu27YNhw8fvqO/ZhUCd3BjsZgxFAqVplIpsb4SnwDeeOMNuN3ugh+fSqXw0ksvQVEUtLa2Yv78+QV9j5MkCbNmzYLD4YAsy8JuLpfD7t274fF4uOa8detWZLNZtLa2YsGCBdDprv90kiQJdXV16O/vRzabxWuvvcZ1qV86nca2bdsgy3LBzp0Id3Db2tpGP/XUU19++eWX627GhLSOqqo4fvw49zvChQsX4PV6kUwmUV1dXbBnNBpRVlYGv9+PdDqNqqoqLtdqtSIQCOD06dPccz579iyCwSByuRzKy8u5xi0tLUUoFMKxY8e4xz1z5ozwwoU7Be7vuIsXL3b+/Oc/Dy9durQnk8noDh48eM+pU6esIg20VFVFc3Mziov5O3YyxtDc3AyLxcLtAsDp06dhtVq5vXA4jL6+PsTj8av+PpfLoa+vj3u7Ho8HO3bsgMlkKuidK48kSTAajdi1axeMRiPXEVdJkqDX67Fr1y7hZYq7d++GyWTiPtIrSRJef/11dHZ2co/r8Xjw+uuvf+yLVCAQwODgoFC4o9Eouru7kUqluN1kMonz589DURRuN5PJcDX+4g5uZ2en1Ww2y9OnT48CwLJly2yBQCC5YsUK3k1BURREIhGIuIwxBINBIRcA/H6/kOvxeNDe3o7Pf/7zV/29oih44YUXuINQXV2NVatWobGxEaqqFhxedvnc58qVK3HyJN/aD3b5tNPDDz+MAwcOoLu7m8svLS3FihUrrnxf5R37oYcews6dO9Hf38/lVldXY/ny5RgxYsRVfz84OIjOzk488MADXNsFPnhelJWVCT03IpEIDAaDkJtMJtHQ0FDw47mDO27cuOSvfvWrt/L/tlqtabPZrJaWlvJuCrIsw2w2Q8RljN0WNx6Po7i4+GNdxhgWLVqEI0eOcG13+vTpmDJlCtra2hAOhwv+yCvLMqLRKCZPnoxz584hEomgoqKiYDcej2PixImYN28eDh06xDXnOXPmYMKECTh79izi8XjBH5cVRUE8Hse4ceOwZMkSvP/++1zB//SnP41x48Z9bAtOq9V6zRpdi1QqJewqiiLs6nQ6rk9a3N9xLRaLOmrUKP4GoFfhTj2RvnbtWowcObLgxxcVFWHjxo0wGAyoq6tDS0tLwU/k7u5u1NTUwGg0oq6uDs3NzQW5jDF0dXWhpqYGRUVFqK+v5/puXVRUhA0bNsBsNnOPe/HixStXUq1duxaVlZVc465fv1645+6dwm09HXQnHtLPHzV95plnCmrYLUkSHn30UTz22GOQJAm1tbUIh8Ow2+3X3D/5rwqnTp3C/fffD0mSMG3atILdUCiE5uZmLFq0CJIkYc6cOXj66acLCoQkSVi9ejUeffRRSJKE6dOnIxgMore3t6BxW1pasHDhQkiShLlz53KN+8UvfhGrVq26Y1/0C+W2BvdO3fkGgwHf/e538dRTT13zwJter8cXvvAF/OIXv7jy8cpgMODhhx/GyZMnce7cOciy/KEwsMsNvfv7+7F3714sX74cJSUlV3UVRbmq29fXd1X3+9//Pv72b//2mhc35Mf4xS9+ceXAYP7/nThxAq2trR87bm9vL/bu3YuHHnroyrh6vR7f//738e1vf/u64z7yyCP4j//4D+EDkncSdK3yTcJqtWLTpk1YunQptmzZgtbWVkQiETDGYLVaMWXKFDz55JP42te+9pHvhhaLBfX19Th+/Dh27NiBiRMnoqamBnq9Hj6fD319fTCZTFizZg3Kyso+9AL4l+4rr7zC5VqtVvzbv/0bFi9ejN/85jdob2//0JynTp2Kr371q3jyySdRXl7+Efda4/b29qK4uPgj40qShNLSUmzatAmLFy/Gli1buMb9pEKXPN4kJEmC2WzGunXrsGrVKtjtdpw/fx4dHR1YvXo1amtrUV5eftUDEpIkwWQy4YEHHkAymYTT6URvby9aWlrwyCOPYMWKFSgrKyvYdTgcaGxsxGOPPXZdNz/nL3zhC7Db7bDb7Xjvvffwla985bpzNpvNePDBB6+M63K50NDQgLVr12LlypXXHffLX/4yHnnkEdjtdvT19eHIkSPYsGHDNcf9pELBvclIkgSLxYI5c+Zg7NixsFgsmD9/Ppc7ffp0jB07FtFoFHPmzOF2J06cCK/Xy+VarVbMnTsXM2fORDweF5pzbW0t+vv7hcadM2cOgsFgweN+0qCXMILQIBRcgtAgFFyC0CAUXILQINzBdTgcZW+//fbdnZ2dJcMdnA7rE4QY3EeVf/KTn9x39OjRaU899ZTuH/7hH86qqirlT7DzoqoqRN38LTxE3Lx/q8cdjnu79tVwxtXinIdbX1VVhzXnQuEOrqIorLq6OmAwGEyZTEb3xhtvzD9+/Hip6GQbGxu5PeCDnXTixAnhc3snTpyAXq/n9sLhMBwOB3w+H7cbj8fR1dUl3BSqvb1daLlZNpvFmTNnhBafK4py5S4ZvKiqihMnTgh9smKMobGxUahGwWAQbrcbQ0ND3G40GoXdbkcwGOR2k8kkLly4gEQiwe1mMhmu5zJ3cJcuXRqMx+NjKisrvSaTSV27dm2TqqqxDRs28G4KsixDr9fj8ccf53bzT6QnnnhCyFVVVch1u91obW3FypUrud1AIIDjx49j9erV3G4sFkNVVRXq6+u53VQqBYvFgvXr13O7uVwORqMRGzdu5HbzyxNFa8QYE3LzrS6XL1/O7Xq9XjQ3N2PVqlXcbjgcRkNDA9asWcPtJhIJvPnmmwU/nju43/zmN89985vfPMfrEQRx46CjygShQSi4BKFBKLgEoUEouAShQSi4BKFBKLgEoUEouAShQSi4BKFBKLgEoUHoLo8EoUG4g7tv376pzz777Oq2trbC72L9MdzJd3kkiJsJ97XK27dvr3U6nezVV1+9d+7cuUccDscIn89ntNvt3IMrigKv1wsRlzEGn88n5AIQdn0+H4aGhoTccDgMj8cj5CYSCeF9lclkhF1ZljVXo6GhIeEaBYNBYTcWiwnXN5VKIZfLFfx47uA+++yzp7ds2fKg0Wj05XI5yeVyVQYCAcPAwADvpqCqKoLBIETc/J38RVwAwm4wGITP5xNyo9GosJtMJuH3+4XcbDaLQCAg5CqKMqwaiY4LiNfI5/MJ7+dwOCy8n+PxuLCbTqe5ll1yB3fEiBH6Bx54wLV8+fJzRqORLVy4sGtgYCD12c9+lndTkGUZTqcTIi5jDP39/cJub2+vkOt2u1FcXCzkBgIBMMaE3FgshkQiIeSmUin4/X4hN5fLweVyCbmqqsLhcNzyGjmdTpSXlwu5Xq8XBoNByA2Hw8hms0LuTV/WV1tb66mtrS28dTlBEDccOh1EEBqEgksQGoTO4xKEBqH+uAShQegdlyA0CL3jEoQGoYNTBKFBKLgEoUHoOy5BaJCCgpvJZPQNDQ13ezwey9tvvz2jqalp9I0YnL7jEoQYBV3yqCgKfvazn9319NNPW3bu3Dkqk8kU7dq1a5dOp2OqquoYY1AUhXvwfIMkERf4IPi32h3OnIfrDmfOt+Pvzbd6uR010mp9C6Wg4JaUlChTp051AzDPnz/f39/fPw4ALjf9um+4Tb9Em0INp+mXaEOpSCSC/v5++P1+bjff9CsajXK7w2n6lcvl0NLSMqymXyLcrhoNt+lXb28vQqEQt5tMJmGz2f73NP1Kp9NGi8Uy9fz585He3l7zmDFjXDqdjplMJkZNvwrndjb9KikpuS1NvyRJuuU1oqZflzGbzbl///d/38o9G4Igbgp0VJkgNAhdOUUQGoQuwCAIDULBJQgNQsElCA1CwSUIDULBJQgNQsElCA1CwSUIDULBJQgNUlBwY7GY8Qc/+MG61tbWsX//93+/9tixYyNv9sQIgvh4CrpWubS0NDcwMOBljJlramr8Fy9etC5ZssQHAP39/SO9Xq+xp6eHe/B80y8RlzEm7AIf9JcRcX0+H9xut5AbDocxNDQk5CYSCXg8HiE33/RLxM03/RJxVVW9LTUaGhoSrlF+ZZGIG4vFhOt705p+mUwmYzqdNldUVBiz2awZAHK5nDQ0NFQeCoUMg4OD3JNVVRWhUAgiLmNM2AUg7AaDQQQCASE3Go0Ku8lkEsFgUMjNZrPCbr7pl5Zq5PP54Pf7hdxwOCxco3g8LryvbkrTr0wmY1i+fLk6ODhoraioUKuqqiwAYDQa2YIFC7odDkdq2bJl3JOVZRkDAwMQcRlj6OvrE3btdruQ63a7YTabhdxAIABVVYXcWCyGeDwu5KZSKfh8PiE3l8thcHBQyFVVFf39/be8Rk6nE2VlZUKu1+uFXq8XcsPhMDKZjJB7U5b1mUwm+Stf+co73LMhCOKmQEeVCUKDUHAJQoPQQnqC0CC0kJ4gNAh9VCYIDULBJQgNQsElCA1CwSUIDULBJQgNUnBwE4mEWZZlXTweNyeTSf6+EARB3DAKCm4kEimqr6/feOLEidof/OAH/+fZZ5996GZPjCCIj6ega5XLy8uzEydOtI0YMSJbX19v+/Wvfz0LALLZrO7w4cNzz5w5Y7FardyDq6qKM2fOoKysjNtljOHMmTOoqKjgdgHg7NmzqKys5PZCoRB6e3uRyWS43VgsBpvNJnT+OpVK4ezZszAajdxuNptFS0sLSkpKuF1FUdDS0oLS0lJuN1+j8vJybhcQr1EgEIDT6UQymeR2I5EIurq6hBqkJRIJtLe3CzU5y2QyXM3CCgpuNpvVx+Pxie+++27p73//+7nPPPPMmwBQVFSkzp8/v8flcqWWLl3KPVlFUeDxeCDiMsbgcrmEXOCDFSQirtfrhcViEXJDoRB0Op2QG4/HkU6nhdxMJoNIJCLkyrIMn88n5KqqCrfbLVyjwcFBIdflcqGyslLI9fv9KCoqEnKj0SgURRFyk8kk3n///YIfX1Bw9Xq9+tOf/vSooihsxYoVHWaz+cpLQ0VFRcJisahVVVXck5VlGRaLBSIuY+y2uJlMBqWlpcLjWq1WIddoNAq7qVRK+O/N5XLCrqqqw6pRSUmJkJtMJoX3lSzLwvXV6XTC45pMJq6WooUGl02ePNnFPRuCIG4KdDqIIDQIBZcgNAgFlyA0CAWXIDQIBZcgNAgFlyA0CAWXIDQIBZcgNAgFlyA0SEHBzWazuqamphl+v9/a1NQ0vbW1dcSNGJzu8kgQYhR0yWMul5N++MMfzv3nf/5n5eLFixX79++/Z8+ePTsAgDEmXf4v9+CMsSs/Iq7ouP9zGyLerR5Xi3/vcOr7l9sQdW5HfYf79xZKQcG1WCzKtGnTnJWVlXJtbW1AkqTJAJDJZHSvvfbagvfff79UZBmUqqpobGwULs7x48e5vb90Rd7xw+EwBgYG4PV6ud14PI6uri6EQiFuN51Oo729nWvpV55sNoszZ84gm81yu4qioKmpCaqqcrv5+oownBrlO+65XPyX10ejUfT29iIQCHC7yWQSNpsNsViM281kMlzLAQsKbjqdNhoMhtq9e/eO0ul0yl133RUAAJPJpNbX159kjMU2bNjAPVlZlmEwGPD4449zu4wxSJKEJ598UsgFIOS63W60trZi5cqV3G4gEMDx48exevVqbjcWi+HQoUOor6/ndlOpFKxWK9avX8/t5nI5FBUVYePGjdyuqqrQ6/V44oknuN3h1MjpdMJms2H58uXcrtfrRXNzM1atWsXthsNhNDQ0YM2aNdzuTWn6ZTabc7/85S9fyu9MvV5PdzIniNtIwf1xdTodhZUg/pdAvYMIQoNQ7yCC0CB0AQZBaBAKLkFoEPqOSxAahL7jEoQGoY/KBKFBKLgEoUEouAShQQoKbjweNz733HNf9Hg8VYcPH57ym9/8Zt7NnhhBEB9PQZc8mkwmuaOjI3L+/PlRv/zlL+cqipJ5+umnWwDA7XZXhEIhyel0ci89URQFwWBQcjqd3EepGGO4PK7QES5R1+v1wu/3C7nhcBiBQEDITSQSwvsqk8kIu7IsD6tGoi4gXiO32y1co0AgIOzGYjHh+qZSKZVnhV1BwTUajcxqteKdd94ZV11dPbazs1MfDAZ1paWlrLu7e/Tg4ODLNpvtDO9kVVXVuVyue20222lelzEmuVyuz9hstmZeFwBcLtd9Im4wGCwbGBgYa7PZLvK6sVjMMjAw8CmbzXae102lUman0zndZrO18rrZbNY4ODhYZ7PZzvK6iqLoXS7Xp202WwuvO8waCbt+v7/C4XCMstlsnbxuOBy2DgwMTLTZbBd43UQiUex0Ou+y2WztvG46nS7KZrNFBQt/udj5435SqZTh97///co9e/YsiEajxX/605+m5H+XzWb1b7755pxCtvM/f2RZlvbt23e3iMsYw549ez59q12fz2c9duzYXSJuOBwubmhomC7ixuPxosOHD88ScdPptOHAgQNCNcrlcrr9+/fPFd3Pe/fuveX1HRoaKmtsbJwi4gYCgZL33ntvmogbjUZNb7/99kwRN5lMGt96663ZhT6+oO+4ZrNZ/trXvvbW6tWrm0pLS1OPPfaYPf+7hoaGCT6fz5JIJLi71Dc1NX2qrKxM6CqM3bt3Tw2HwyWhUKjwV6nLvPHGGxNCoZDV7/ebed3i4uJET09PWSQS4W426/V6R7rd7nHRaNTC6/p8Pp3T6aw8duzYSF63o6Ojwu/3j3nnnXem8brvvvvup7xeb1lfXx/3fj569Ohkr9dbHIlECl6Flk6nDdu2bVvW29tbGQqFivbu3TulUDebzeq2b9++JJFImDo6OmrOnTtXXagry7K0Y8eO+4PBYLnD4ajavXv39EJdVVWl3bt3L3C73SNjsVjxzp0767LZbMHP6z/96U/znE7nmFmzZvVt27bt3kKcYR1VDgaD+k2bNt136NChshMnTozl9T0eT+y1114reAf9JVVVVb4jR45UHjx4cBSvm0wmI5s3b76roaFhDK975MiR8d/73vc+5/V6ubs1nz59eup7771nyWaz3LeT+PWvf33vvn37xvT19XG706ZNC7e1tcl2u52r+3gikZB++MMfLvzXf/3XuX19fVwdppPJpO7HP/7xgt/97nejDh06VHD4JElSX3vttZLW1ta6xsbG6q1bt96nKEpBIZAkie3du7fI4XCMttvtRX/+859HFzquwWBghw8f1nV1dY2tqqqyv/jii/OSyWRBLzg6nY4dPXpUbW9vH28wGKK//e1vF6XT6YJfrJqamnKNjY1T/vM///Pe55577n6/33/dv3dYwWWMSUVFRWzkyJFJRVG4W6VPmjQpJkmSIjK2w+GwJBIJ0+c//3nue8jU1dWl586dOxiLxUy87tGjRz8zbty4MofDUfCTIs/o0aPPGI3G6H//93/P4XXj8Xjp2LFjM83NzZ/hdQ0Gg9LR0THys5/97CUeT1EUyWg0ZkeMGOHOZrNcnzBKSkrUb33rW2dNJlNNLpcr+ElsMpnUsWPHRhhjhvHjx6dqamoKHtNoNLLx48dHzGazumDBgijPfAFgwoQJYb1ez9rb2++aOHFid0lJScFHiyZNmhTW6XSora0NXO4fXXC2Jk2aFGltbS1pa2u722q1jnW73df9JDis4FZXV8srVqzoKSoqqrz33nudvH40Gp1cUVFR2dfXx/3u1dvbW7d48WIpGo1yf9x95513aseMGVO8dOlSD6/7/PPP7/3Od76zc9asWf28bmdnZ1V5eXnlww8/3Mfrfvvb326prKw0LFy4sIvXDQaD+iVLlvRNmjQpyeOVlZWpf/3Xfz0wb948ddSoUT7ecUePHq1bunRp/7Jly3oKdTKZjGH8+PHj+/r6TPF43Dp58uSeQu+4ksvl9GPGjJnQ0tIyuaenZ4LVap2sqmpB79ayLOuqq6snnT9/forT6Zy9ePFioyzLBbmqqkpWq/VTPT09Ew4cODB/0aJFLqPRmCvEBQCTyfSp8ePHl27fvv3Fr3/963snTZqUvp4jMUbXCxOE1qArpwhCg1BwCUKDUHAJQoNQcAlCg1BwCUKDUHAJQoNQcAlCg1BwCUKDUHAJQoP8PzS/I+ovoNUlAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/png": "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" }, "metadata": { "needs_background": "light" @@ -692,14 +671,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[32m\u001b[1mAlice\u001b[0m\u001b[32m\u001b[0m: {\n", + "\u001B[32m\u001B[1mAlice\u001B[0m\u001B[32m\u001B[0m: {\n", " \"thought\": \"My opponent is trying to block me. I should place my piece at [6, 7] to create a potential line for myself.\",\n", " \"move\": [\n", " 6,\n", " 7\n", " ]\n", "}\n", - "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", + "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -720,10 +699,8 @@ }, { "data": { - "image/png": "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a7PZmnldAHC5XLeLuMFgsGxwcHCCzWY7x+vGYjHL4ODgZ2w2Wwevm0qlzE6nc7bNZmvldbPZrHFoaKjWZrOd5nUVRdG7XK5bbTZbC687wjESdv1+f8XAwMBYm83WxeuGw2Hr4ODgFJvNdpbXTSQSxU6nc6bNZmvnddPpdFE2my0qWPjzxc6X+kulUobf/e53q3fv3n1HNBot/uMf/zg9/1g2m9W/+eabCwrZz1/+ybIs7d279xYRlzGG3bt333q9XZ/PZz1y5MhMETccDhc3NDTMFnHj8XjRoUOH5om46XTasH//fqExyuVyun379i0UPc579uy57uM7PDxc1tjYOF3EDQQCJe+///4sETcajZrefvvtuSJuMpk0vvXWW/ML3b6g37hms1n+2te+9tbatWubSktLUw8++KA9/1hDQ8Nkn89nSSQS3FXqm5qaPlNWViY0C2Pnzp0zwuFwSSgUKvxd6iN27do1ORQKWf1+v5nXLS4uTvT29pZFIhHuYrNer3eM2+2eGI1GLbyuz+fTOZ3OyiNHjozhdTs7Oyv8fv/4w4cPz+J133333c94vd6yvr4+7uP83nvvTfN6vcWRSKTgVWjpdNqwbdu2FQ6HozIUChXt2bNneqFuNpvVbd++/a5EImHq7OysPnPmTFWhrizL0iuvvHJnMBgsHxgYGLVz587Zhbqqqko7d+68w+12j4nFYsU7duyozWazBb+u//jHPy52Op3j582b17dt27ZFhTgjOqscDAb1mzdvvv3gwYNlx44dm8Drezye2Ouvv17wAfpzRo0a5XvnnXcqDxw4MJbXTSaTkS1btsxsaGgYz+u+8847k773ve993uv1cldrPnny5Iz333/fks1muW8n8atf/WrR3r17x/f19XG7s2bNCre1tcl2u52r+ngikZB++MMfLv23f/u3hX19fVwVppPJpO7HP/7xHb/97W/HHjx4sODwSZKkvv766yWtra21jY2NVS+++OLtiqIUFAJJktiePXuKBgYGxtnt9qI//elP4wpt12AwsEOHDum6u7snjBo1yv78888vTiaTBb3h6HQ69t5776nt7e2TDAZD9De/+U1dOp0u+M2qqakp19jYOP2///u/Fz3zzDN3+v3+Kz7fEQWXMSYVFRWxMWPGJBVF4S6VPnXq1JgkSYpI2wMDA5ZEImH6whe+wH0Pmdra2vTChQuHYrGYidd97733Pjtx4sSygYGBgl8UecaNG3fKaDRG//d//3cBrxuPx0snTJiQaW5u/iyvazAYlM7OzjGf+9znzvN4iqJIRqMxO3r0aHc2m+X6hlFSUqJ+61vfOm0ymapzuVzBL2KTyaROmDAhwhgzTJo0KVVdXV1wm0ajkU2aNCliNpvVO+64I8rTXwCYPHlyWK/Xs/b29plTpkzpKSkpKfhs0dSpU8M6nQ41NTWBj+pHF5ytqVOnRlpbW0va2tpusVqtE9xu9xW/CY4ouFVVVfKqVat6i4qKKhctWuTk9aPR6LSKiorKvr4+7k8vh8NRu2zZMikajXJ/3T18+HDN+PHji5cvX+7hdZ999tk93/nOd3bMmzevn9ft6uoaVV5eXnnffff18brf/va3WyorKw1Lly7t5nWDwaD+rrvu6ps6dWqSxysrK1P/5m/+ZnDx4sXq2LFjfbztjhs3Trd8+fL+FStW9BbqZDIZw6RJkyb19fWZ4vG4ddq0ab2F3nEll8vpx48fP7mlpWVab2/vZKvVOk1V1YI+rWVZ1lVVVU3t6OiY7nQ65y9btswoy3JBrqqqktVq/Uxvb+/k/fv3L6mrq3MZjcZcIS4AmEymz0yaNKl0+/btz3/961/fM3Xq1PSVHIkxmi9MEFqDZk4RhAah4BKEBqHgEoQGoeAShAah4BKEBqHgEoQGoeAShAah4BKEBqHgEoQG+X/Dcc4OaIWRHwAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/png": "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a7PZmnldAHC5XLeLuMFgsGxwcHCCzWY7x+vGYjHL4ODgZ2w2Wwevm0qlzE6nc7bNZmvldbPZrHFoaKjWZrOd5nUVRdG7XK5bbTZbC687wjESdv1+f8XAwMBYm83WxeuGw2Hr4ODgFJvNdpbXTSQSxU6nc6bNZmvnddPpdFE2my0qWPjzxc6X+kulUobf/e53q3fv3n1HNBot/uMf/zg9/1g2m9W/+eabCwrZz1/+ybIs7d279xYRlzGG3bt333q9XZ/PZz1y5MhMETccDhc3NDTMFnHj8XjRoUOH5om46XTasH//fqExyuVyun379i0UPc579uy57uM7PDxc1tjYOF3EDQQCJe+///4sETcajZrefvvtuSJuMpk0vvXWW/ML3b6g37hms1n+2te+9tbatWubSktLUw8++KA9/1hDQ8Nkn89nSSQS3FXqm5qaPlNWViY0C2Pnzp0zwuFwSSgUKvxd6iN27do1ORQKWf1+v5nXLS4uTvT29pZFIhHuYrNer3eM2+2eGI1GLbyuz+fTOZ3OyiNHjozhdTs7Oyv8fv/4w4cPz+J133333c94vd6yvr4+7uP83nvvTfN6vcWRSKTgVWjpdNqwbdu2FQ6HozIUChXt2bNneqFuNpvVbd++/a5EImHq7OysPnPmTFWhrizL0iuvvHJnMBgsHxgYGLVz587Zhbqqqko7d+68w+12j4nFYsU7duyozWazBb+u//jHPy52Op3j582b17dt27ZFhTgjOqscDAb1mzdvvv3gwYNlx44dm8Drezye2Ouvv17wAfpzRo0a5XvnnXcqDxw4MJbXTSaTkS1btsxsaGgYz+u+8847k773ve993uv1cldrPnny5Iz333/fks1muW8n8atf/WrR3r17x/f19XG7s2bNCre1tcl2u52r+ngikZB++MMfLv23f/u3hX19fVwVppPJpO7HP/7xHb/97W/HHjx4sODwSZKkvv766yWtra21jY2NVS+++OLtiqIUFAJJktiePXuKBgYGxtnt9qI//elP4wpt12AwsEOHDum6u7snjBo1yv78888vTiaTBb3h6HQ69t5776nt7e2TDAZD9De/+U1dOp0u+M2qqakp19jYOP2///u/Fz3zzDN3+v3+Kz7fEQWXMSYVFRWxMWPGJBVF4S6VPnXq1JgkSYpI2wMDA5ZEImH6whe+wH0Pmdra2vTChQuHYrGYidd97733Pjtx4sSygYGBgl8UecaNG3fKaDRG//d//3cBrxuPx0snTJiQaW5u/iyvazAYlM7OzjGf+9znzvN4iqJIRqMxO3r0aHc2m+X6hlFSUqJ+61vfOm0ymapzuVzBL2KTyaROmDAhwhgzTJo0KVVdXV1wm0ajkU2aNCliNpvVO+64I8rTXwCYPHlyWK/Xs/b29plTpkzpKSkpKfhs0dSpU8M6nQ41NTWBj+pHF5ytqVOnRlpbW0va2tpusVqtE9xu9xW/CY4ouFVVVfKqVat6i4qKKhctWuTk9aPR6LSKiorKvr4+7k8vh8NRu2zZMikajXJ/3T18+HDN+PHji5cvX+7hdZ999tk93/nOd3bMmzevn9ft6uoaVV5eXnnffff18brf/va3WyorKw1Lly7t5nWDwaD+rrvu6ps6dWqSxysrK1P/5m/+ZnDx4sXq2LFjfbztjhs3Trd8+fL+FStW9BbqZDIZw6RJkyb19fWZ4vG4ddq0ab2F3nEll8vpx48fP7mlpWVab2/vZKvVOk1V1YI+rWVZ1lVVVU3t6OiY7nQ65y9btswoy3JBrqqqktVq/Uxvb+/k/fv3L6mrq3MZjcZcIS4AmEymz0yaNKl0+/btz3/961/fM3Xq1PSVHIkxmi9MEFqDZk4RhAah4BKEBqHgEoQGoeAShAah4BKEBqHgEoQGoeAShAah4BKEBqHgEoQG+X/Dcc4OaIWRHwAAAABJRU5ErkJggg==" }, "metadata": { "needs_background": "light" @@ -734,14 +711,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[35m\u001b[1mBob\u001b[0m\u001b[35m\u001b[0m: {\n", + "\u001B[35m\u001B[1mBob\u001B[0m\u001B[35m\u001B[0m: {\n", " \"thought\": \"Alice is trying to build a vertical line now. I need to block her next move otherwise she will have a chance to win. I will place my piece at [5, 7].\",\n", " \"move\": [\n", " 5,\n", " 7\n", " ]\n", "}\n", - "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", + "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -762,10 +739,8 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAO4AAADnCAYAAAAZ4WrqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAAsTAAALEwEAmpwYAAAp0klEQVR4nO2deXQU15m3f9WLuiW1NsQmFkEwAgOC2BBjZAz5nASDg4NNEEkYwA6ZLJ6xj7Mcz8xxjjMZz0m+eMyMz2TiwMkkthMbY2NjCIvByItsDAghBNqgkdCuVrd63/equt8fdvPFMUvfKwQp/D7n6Phg1VP3qm7/uqur7q1XYoyBIAhtobveHSAIgh8KLkFoEAouQWgQCi5BaBAKLkFoEAouQWgQCi5BaBDu4J49e7b4pZdeqhoaGsobiQ4RBHFlJN4JGOvWrVtWUlIiT5gwIfbEE0/UJ5NJA2NMP0L9I4jPDAaDQTYYDEpW2/LuXJZlw8033+xyuVxFyWRSt2/fvi+cPn36F5WVlWW8+1JVFW1tbZg3bx6vCsYYWlpa8PnPf57bBYDm5mYhNxKJwOl04qabbuJ24/E4BgYGMGPGDG43mUyiu7sbs2bN4nZlWUZ7ezvmzJnD7aqqijNnzmDu3LncLmMMra2t13x8Q6EQPB4Ppk2bxu1Go1HY7XZUVFRwu4lEAr29vbj55pu53XQ6zXJzc//v2rVrt2clMMa4fl577bWp3/3ud7/R0NAwhjGGZDJp3LZtWwsTIJ1OsxdffFFEZaqqsj/+8Y/C7gsvvCDk2u12dvDgQSHX4/GwPXv2CLmhUIi9/vrrQm4sFmPbt28XclOpFHvppZeEXEVR2J/+9CchdzhjNDAwwGpqaoRcp9PJ9u/fL+T6/X62a9cuITcSicg7dux4iGWZQ+5P3LVr1/auXbu2l9cjCOLqQVeVCUKDXNfgSpJ0PZsnCM1yXYPLaEkhQQhBp8oEoUEouAShQSi4BKFBKLgEoUEouAShQSi4BKFB6D4uQWgQ7uAeOXJk8hNPPLH+ajRO93EJQgzuucpTpkxxWK1WVVVVSVVVnD17dlJ/f7+pqamJu3FVVdHf3w8RlzEm7ALAwMCAkOvxeNDd3S3kBoNB9PT0CLmxWAy9vb1CbiqVQl9fn5CrKIqwe73GyOl0Ch8rv98vPL6RSER4fBOJBJLJZNbbcwdXkiRjMpksDAaD5oKCgoSqqhJjDKqq8u4Kqqpe+BFBtN2/bFukTdF2h+Oqqqo5dzh/b8b/LB1nHriDq9PpzN///vc7vF5vXklJSbyysnLAarUm58+fz7sryLIMq9UKEZd9vNZT1G1paRFyHQ4HFEURcr1eL0KhkJAbDocxNDQk5MbjcfT09Ai56XQa7e3tQm5mLe+1HiObzQa9Xi/kulwuJBIJITcQCMDr9Qq50WgUNpst6+25gzthwgT/qlWrank9giCuHnQ7iCA0CAWXIDQIBZcgNAgFlyA0CM2cIggNQk/AIAgNQqfKBKFBKLgEoUEouAShQbiD6/f7TS6Xq0iWZbqyRBDXCe4pj3/4wx/KrFbrbUuXLm369re/fX4kOkUQxOXhDu4DDzww8Mgjj8wpLCyMZYp+HT9+3KLX8xfsU1UVx48fh9Fo5HYZY6ivr4fJZOJ2AaC+vh5ms5nbCwQC6OvrQyAQ4HYjkQja29sRi8W43Xg8jpaWFsiyzO2mUimcPHlS6Paboiioq6uDwcD9Urkwvjk5OdxuZnxFxsjr9cJut8Pr9XK7oVAIXV1dCIfD3G4sFsOZM2e4ludlSCaTXGPLPRq//OUvF+bm5k6dPXt2nclkUu++++7mSCQSve+++3h3BUVREI/HIeIyxhCJRIRc4KPVNiLu0NAQWltbsWzZMm7X5/OhuLgYK1eu5HbD4TBMJpNQnxOJBAAIubIsI5lMCrmqqiIWi13z8R0cHER7ezu+9KUvcbtutxuNjY1YsWIFtxsMBpGfn49Vq1Zxu7FYDG+//XbW23MH98knn2xKpVLt+fn5YQAwm81po9HIcnNzeXcFWZaRk5MDEZcxNizXaDQKuWazWbjd4bjDOVYAhP/edDot3K6qqp+pMUomk8M6Vjpd9pecuINbUlISBxDn9QiCuHrQ7SCC0CAUXILQIBRcgtAgFFyC0CAUXILQIBRcgtAgFFyC0CAUXILQIBRcgtAg3ME9evTo6P379y/weDz8s78JgrgqcE957O7uTj733HMzvvGNbyT+8R//8Ywsy3pVVYVWrSiKAkVRhFzGmLALfDQ39Fr3eTiuLMvDalf07x1Ou6qqDmt8h9NnLY4vzzPYuIO7aNGieENDgysWixk/Xta3oK6uroB3P8D/X/YlsiQQ+GhpnsiSQADCywmDwSD6+/vh8/m43Wg0io6ODkQiEW43kUigtbUVqVSK202n02hsbBQuRnX8+HGuCfAZGGM4fvy40JJAQHx8/X4/7HY7XC4XtxsOh9Hd3Y1gMMjtxuNxnD17FvE4/1R+3nHlPqL79u37nF6vL6mqqrKaTCZ19erVJ2RZDq9fz18yV5Zl6HQ6bNy4kdvNvCOLuoqiCLkOhwPNzc1Cy768Xi+OHj0qtOwrHA6jpKQE1dXV3G48Hkdubi7WrVvH7abTaej1emzYsIHbzbxRXOsxstlssFqtQksvXS4XGhoahJZeBgIB1NbWYvXq1dxuNBrFm2++mfX23MH9yU9+ch7AVXnyBT1XmSDEoOcqE4QGodtBBKFBKLgEoUGodhBBaBD6jksQGoROlQlCg1BwCUKDUHAJQoNQcAlCg9BVZYLQINzBDQaDuh/96Edfs9lspcNtnK4qE4QY3HOV9+zZM/2VV14p/+53v9tcVlbm6+rqGudwOIznzp3jblxVVTgcDoi4jDFhF/ioBpCI6/F4YLPZhNxgMIjBwUEhNxqNwm63C7nJZFL4WCmKorkxcjqdwmPk8/mE3XA4LDy+8Xica4UQd3ADgcCk6dOnj+np6SmbOXPmQCAQyI9Go3qRZW6qqiISiQgtkQM+ejGLuqLtBgIBhMNhITcUCgm78XhcuM+pVErYVRRF2GWMDWuMRN3hjNFw3Gg0KnysEokE17JL7uA++uij7912221nbr755ojRaGQLFizo7u7uTtxxxx28u4Isy+jp6YGIyxjD+fPnhd2Ojg4h1+FwwGAwCLlerxepVErIDYfD8Pv9Qm48HofD4RBy0+k0+vr6hFxVVdHV1XXNx8hmsyEvL0/IdblcYIwJuYFAAJFIRMiNRqPweDxZby+0wrmqqsop4hEEcXWg20EEoUHodhBBaBBaZEAQGoROlQlCg4g9fo/4m0dVVbjdbrS0tKClpQVNTU3Iz8/H3LlzUV5eDp1OR19VNAwF9waDMYZgMIjf//73+P3vf4+enh4oigLGGF555RWMGzcOa9aswT/90z9h0qRJFF6NQsG9gWCMwe1246GHHsK+ffs+9WBuRVFgt9vx7LPPoq6uDs8//zwqKyspvBqErirfQKRSKTz55JPYs2fPZZ+mzxjDyZMn8cMf/hB+v/8a9pC4WtBV5RuIhoYGvPjii1lPnTt8+DB27NhB46BBuIPb19dXdvDgwUWRSCR3JDpEiMEYw86dO7nKmyiKgh07diCZTI5gz4iRgPs77uHDh+c0NDSYq6qqGAB8XPRLSqfT3I1niiSJuJkSFSJupm0RN1ME62/NTSaTsFqt3Pvt7e2Fx+PBuHHjhNq9HJmiX6JjpKrq39xxHkl3RIt+TZo06fSRI0fmP/fcc7MfeeSRpo+LfllEvq9mCkqJFIVijKG+vh45OTncLgCcOHECJpOJ2wsEAujv7xf6bhiJRNDR0YFoNMrtJhIJtLS0XDa4fX193PsNh8PYuXMnRo8efdHfK4oiXJgtM0aihdlEx9fn88Fut3NN2s8QCoXQ3d2NUCjE7cZiMZw9exaJRILb5T3r4U5MU1NTcX5+flFVVdWZq1H0S5IkoYJSmaJfoq4sy0Lu9Sz6VVxcfMmiX+l0GgcPHkR7ezvXfkePHo0HH3wQJSUll9zvcIp+Mcau+RhR0a+L8OMf/7gLQBevR4wsmaWGu3bt4jrlWrhwISwWywj2jBgJaMrjDYIkSVi9ejWmTZuWtVNYWIhNmzYJ168lrh8U3BuIKVOm4Mknn0RhYeEVt83JycHDDz+MJUuW0P10DULBvYHQ6XT45je/iWeeeQYTJ0685HZFRUV47LHH8PjjjwtfOCKuL3SOdIOh1+uxadMmLFq0CM8//zxqamrg8XiQSCQwevRoLF68GJs2bcIdd9xBodUwFNwbDEmSIEkS5syZg6effhpPPPEEBgYG8Pbbb2Pjxo0oKSmBwWCg02ONQ8G9AcmsEDp58iScTickSYLFYsHbb7+NwsJCLFiwAGVlZRReDUPBvcFgjKGpqQltbW1YuHAhli5deuGqsaqqGBoawtGjR1FaWvqJ3xHagi5O3UBkQtvf349vfOMbmDFjBnJycqDT6aDT6WAwGDBp0iR8/etfh8lkwjvvvMP1LF/ibwcK7g2E3+9HW1sb7rnnHphMpkueCuv1elRVVUGWZXR2dtLqIA1Cwb2BOHnyJKqqqrK6WqzT6bB06VI0NjbSp64G4Q7u+++/P+Zf/uVfVu3evXvsSHSIEENRFDidTkyZMiXri04WiwU6nQ7xeHyEe0dcbbivTPzP//zPIkmScm+99VZJURSps7NzvN1uzxFZUpZ5lIqIyxgTdoGPFguIuG63G/39/UJuIBDAwMCAkBuNRi9Mnr8Y8XgciqJwXWySJAn5+flobGzE2LEXfx+WZVn4OKuqOqzxFR2joaEh4THy+XzCYxQOhy87RpdjxIt+lZeXJwEk2tra5lRXV7vC4XBuPB7XBYNB3l1BVVXEYjGIuIwxxONxIReAsBsOh4X7PBw3Fotdts/JZPKyj6u5FIqiIBqNXnK/iqLQGGVJJBIRdq9F0a+6kydPzqmoqLAaDAZ266239nR2diYWLVrEuyvIsoyuri6IuJmiUKLuuXPnhFyHwwG9Xi/ker1eJBIJITdTQe5SrqqqGBgYQCqVynqdcaaa3v3334+8vLyLbpNOp9HT0yPUZ1VVcf78+Ws+RjabDbm5uUKuy+WCoihCbqbSn4gbjUbhcrmy3p47uNOmTQtPmzbtOK9HjCySJKG8vBwdHR1ZP7nR5/PBaDTCbDZfgx4SVxO6qnyDIEkS5s+fj1OnTiEWi11xe1mWUVtbi0WLFkGno5eB1qARu4HIz8/HHXfcgb179yIUCl30/ixjDMlkEjU1NZgwYQImTZp0HXpKDBea73YDIUkSpk+fDoPBgN27d6OiogKzZs1CYWEhJElCNBpFT08PmpqaUFlZiVtuuYXmK2sUCu4NhiRJmDp1KsrKynDu3Dm89957CIVCGBwcREVFBSZPnozVq1fDYrFQaDXMdQ3uZ+GFwxhDOp2G3W5He3s7zp07h5kzZ2Ly5MnIzc297DHIuC6XC319fejr60N3dzfKyspgNpsv6UqSBJPJhNmzZ2P06NEYGBiA0+nEbbfddkX3r/tss9lw/vx5tLe3c/fZ6XRiYGAgqz7/dbt2ux2dnZ1ob29HeXn5Fd3PGtc1uDfyHNnMc5/ff/99bNmyBfX19XC73VAUBZs3b8acOXPwne98B9XV1Z8KQ8Y9efIkOjo6MHbsWIwbNw5f/vKX0dvbi2PHjmHMmDFYsmTJRV1ZltHY2PgJd8WKFRfcsWPH4s4777xoCNPp9IU+nzhx4kKft2zZgsrKSvz93/89vv71r2fd7sqVK6/Ybsatra3F1q1bP9Hu7373u8u2+5mFMTasn2Qyady2bVsLEyCdTrMXX3xRRGWqqrI//vGPwu4LL7wg5Nrtdnbw4MErbheLxdi//uu/sqKiIgbgoj8mk4lt2LCBDQ0Nfcp97bXX2JEjR1gikWCqqn6i7+l0mp05c4b96U9/Ym63+xO/z8Zta2u7pPvzn/+cFRYWXrbP69evZ06n81Pujh07smrX4/Fc+L2qqiwajbKf/exnV2x348aNzOVyfWLfF2NgYIDV1NRccYwuhtPpZPv37xdy/X4/27Vrl5AbiUTkHTt2PMSyzB19xx0BMp8UTz311GWnsSWTSWzfvh0GgwFbtmxBbm4uFEVBTU0NZs+ejdmzZ3/q00WSJBgMBsyaNQujRo3CwYMHsXbtWpjNZiiKgkOHDl3RnT17NkpLSz/lbt26FU899dRlH86dTCbxyiuvICcnB1u2bIHZbIaqqnjrrbdQWVmJWbNmXbbdUaNG4cCBAxfaZYxh69atePrpp6/Y7ssvvwyTyYTf/OY3n/l7z3Q76CrDGEN7ezs2b96c1dxTVVWxY8cOHDhwAIwx9PT0XHiRX+6UUJIkjBs3DnPnzsXx48fBGEN3dzdycnK43Pr6+k/0OZsn6quqildffRVvvfUWGGPo7OyE2WzGzTfffMV2x48fjzlz5uDEiRNgjMFqtXK1u23bNtTU1NzQX7OygTu44XDY6Pf7C+LxOD1p7BLs3r0bDocj6+3j8ThefPFFKIqC5uZmLFy4MKvvcZIkYfbs2ejv74csy8JuOp3Gzp074XQ6ufr80ksvIZVKobm5GbfffntWEzkkSUJlZSX6+vqQSqXwxhtvcE31SyQS2LZtm9C87BsJ7uC2tLSMe+ihh7758ssvV45Eh7SOqqo4evQo9yfC2bNn4XK5EIvFUFpamrVnNBpRWFh44UmOo0aN4nItFgu8Xi9OnjzJ3efTp0/D5/MhnU6jqKiIq92CggL4/X4cOXKEu91Tp04JL1y4UeD+jrt48WLb008/HViyZElXMpnUHTx48NYTJ05YRApoqaqKhoYG5ObyV+xkjKGhoQH5+fncLvDRonOR0huBQAC9vb2XLGeZTqfR29vLvV+n04lXX30VJpOJawqiJEkwGo14/fXXYTQaua64SpIEvV6P119/XXiZ4s6dOy/7tI3Ltb1r1y50dHRwt+t0OrFr165Lvkl5vV4MDg4KhTsUCqGzs1NojXIsFkNbWxsUReF2k8kkV+Ev7uB2dHRYzGazPHPmzBAALF261Or1emPLly/n3RUURUEwGISIyxiDz+cTcgHA4/EIuU6nE62trfjKV75y0d8rioLnnnuOOwilpaVYuXIl6urqoKpq1uFlH9/7XLFiBY4f51v7wT6+7XTPPffgwIED6Ozs5PILCgqwfPnyC99Xedu+++67sWPHDu4qg6WlpVi2bNklKwwODg6io6MDd911F9d+gY9eF4WFhUKvjWAwCIPBIOTGYjHU1tZmvT13cCdOnBj7zW9+81bm3xaLJWE2m9WCggLeXUGWZZjNZoi4jLHr4kYiEeTm5l7SZYyhqqoK7777Ltd+Z86ciWnTpqGlpQWBQCDrU15ZlhEKhTB16lQ0NTUhGAyiuLg4azcSiaC8vBwLFizAoUOHuPo8d+5cTJ48GadPn0YkEsn6dFlRFEQiEUycOBF33nknPvzwQ67g33LLLZg4ceIlS3BaLJbLjtHliMfjwq6iKMJu5oF+WW/P20B+fr46duxY/gKgF+FGvZG+Zs0ajBkzJuvtc3JysGHDBhgMBlRWVqKxsTHrF3JnZyfKyspgNBpRWVmJhoaGrFzGGM6fP4+ysjLk5OSgurqa67t1Tk4O1q9fD7PZzN3uuXPnLsykWrNmzSVLfF6q3XXr1n3mqzBc19tBN+Il/cxV00ceeSSrx8hIkoSvfe1ruO+++yBJEioqKhAIBNDd3X3Z45P5qnDixAnccccdkCQJM2bMyNr1+/1oaGhAVVUVJEnC3Llz8fDDD2cVCEmSsGrVKnzta1+DJEmYOXMmfD4fenp6smq3sbERixYtgiRJmDdvHle7999/P1auXHnDvulny3UN7o168A0GA3784x/joYceuuyFN71ej69+9at45plnLpxeGQwG3HPPPTh+/Diampogy/InwsA+Lujd19eHvXv3YtmyZReeXvHXrqIoF3V7e3sv6j722GP4h3/4h8tObsi08cwzz1y4MJj5f8eOHUNzc/Ml2+3p6cHevXtx9913X2hXr9fjscceww9+8IMrtnvvvffiv/7rv4QvSN5I0FzlEcJisWDz5s1YsmQJtm7diubmZgSDQTDGYLFYMG3aNDz44IPYtGnTp74b5ufno7q6GkePHsWrr76K8vJylJWVQa/Xw+12o7e3FyaTCatXr76wZO9i7iuvvMLlWiwW/Md//AcWL16M3/72t2htbf1En2+66SZ8+9vfxoMPPoiioqJPuZdrt6enB7m5uZ9qV5IkFBQUYPPmzVi8eDG2bt3K1e5nFZryOEJIkgSz2Yy1a9di5cqV6O7uRltbG86cOYNVq1ahoqICRUVFF70gkVndc9dddyEWi8Fms6GnpweNjY249957sXz5chQWFmbt9vf3o66uDvfdd98V3Uyfv/rVr6K7uxvd3d04fPgwvvWtb12xz2azGV/60pcutGu321FbW4s1a9ZgxYoVV2z3m9/8Ju699150d3ejt7cX7777LtavX3/Zdj+rUHBHmMwjUOfOnYsJEyYgPz8fCxcu5HJnzpyJCRMmIBQKYe7cudxueXk5XC4Xl2uxWDBv3jzMmjULkUhEqM8VFRXo6+sTanfu3Lnw+XxZt/tZg97CCEKDUHAJQoNQcAlCg1BwCUKDcAe3v7+/8J133vl8R0fHxR99zwFd1icIMbivKv/85z+/7YMPPpjx0EMP6f75n//5tKqqUuYGOy+qqkLUzTzCQ7RE5PVodzju9TpWw2lXi30e7viqqjqsPmcLd3AVRWGlpaVeg8FgSiaTut27dy88evRogWhn6+rquD3go4N07Ngx4Xt7x44dg16v5/YCgQD6+/vhdru53UgkgvPnzwsXhWptbRVabpZKpXDq1CnhomCZp2Twoqoqjh07JnRmxRhDXV2d0Bj5fD44HA4MDQ1xu6FQCN3d3fD5fNxuLBbD2bNnEY1Gud1kMsn1WuYO7pIlS3yRSGR8SUmJy2QyqWvWrKlXVTW8fv163l1BlmXo9Xps3LiR2828kB544AEhV1VVIdfhcKC5uRkrVqzgdr1eL44ePYpVq1Zxu+FwGKNGjUJ1dTW3G4/HkZ+fj3Xr1nG76XQaRqMRGzZs4HYzyxNFx4gxJuRmSl0uW7aM23W5XGhoaMDKlSu53UAggNraWqxevZrbjUajePPNN7Penju43/ve95q+973vNfF6BEFcPeiqMkFoEAouQWgQCi5BaBAKLkFoEAouQWgQCi5BaBAKLkFoEAouQWgQCi5BaBB6yiNBaBDu4O7bt++mRx99dFVLS0v2T7G+BDfyUx4JYiThnqu8ffv2CpvNxl577bX58+bNe7e/v3+02+02dnd3czeuKApcLhdEXMYY3G63kAtA2HW73RgaGhJyA4EAnE6nkBuNRoWPVTKZFHZlWdbcGA0NDQmPkc/nE3bD4bDw+MbjcaTT6ay35w7uo48+enLr1q1fMhqN7nQ6Ldnt9hKv12sYGBjg3RVUVYXP54OIm3mSv4gLQNj1+Xxwu91CbigUEnZjsRg8Ho+Qm0ql4PV6hVxFUYY1RqLtAuJj5Ha7hY9zIBAQPs6RSETYTSQSXMsuuYM7evRo/V133WVftmxZk9FoZIsWLTo/MDAQ/+IXv8i7K8iyDJvNBhGXMYa+vj5ht6enR8h1OBzIzc0Vcr1eLxhjQm44HEY0GhVy4/E4PB6PkJtOp2G324VcVVXR399/zcfIZrOhqKhIyHW5XDAYDEJuIBBAKpUSckd8WV9FRYWzoqIi+9LlBEFcdeh2EEFoEAouQWgQuo9LEBqE6uMShAahT1yC0CD0iUsQGoQuThGEBqHgEoQGoe+4BKFBsgpuMpnU19bWft7pdOa/8847N9fX14+7Go3Td1yCECOrKY+KouBXv/rV9Icffjh/x44dY5PJZM7rr7/+uk6nY6qq6hhjUBSFu/FMgSQRF/go+NfaHU6fh+sOp8/X4+/NlHq5HmOk1fHNlqyCm5eXp9x0000OAOaFCxd6+vr6JgLAx0W/bhtu0S/RolDDKfolWlAqGAyir68PHo+H280U/QqFQtzucIp+pdNpNDY2DqvolwjXa4yGW/Srp6cHfr+f243FYrBarX87Rb8SiYQxPz//pra2tmBPT495/Pjxdp1Ox0wmE6OiX9lzPYt+5eXlXZeiX5IkXfMxoqJfH2M2m9P/+Z//+RJ3bwiCGBHoqjJBaBCaOUUQGoQmYBCEBqHgEoQGoeAShAah4BKEBqHgEoQGoeAShAah4BKEBqHgEoQGySq44XDY+Pjjj69tbm6e8MMf/nDNkSNHxox0xwiCuDRZzVUuKChIDwwMuBhj5rKyMs+5c+csd955pxsA+vr6xrhcLmNXVxd345miXyIuY0zYBT6qLyPiut1uOBwOITcQCGBoaEjIjUajcDqdQm6m6JeImyn6JeKqqnpdxmhoaEh4jDIri0TccDgsPL4jVvTLZDIZE4mEubi42JhKpcwAkE6npaGhoSK/328YHBzk7qyqqvD7/RBxGWPCLgBh1+fzwev1CrmhUEjYjcVi8Pl8Qm4qlRJ2M0W/tDRGbrcbHo9HyA0EAsJjFIlEhI/ViBT9SiaThmXLlqmDg4OW4uJiddSoUfkAYDQa2e23397Z398fX7p0KXdnZVnGwMAARFzGGHp7e4Xd7u5uIdfhcMBsNgu5Xq8XqqoKueFwGJFIRMiNx+Nwu91CbjqdxuDgoJCrqir6+vqu+RjZbDYUFhYKuS6XC3q9XsgNBAJIJpNC7ogs6zOZTPK3vvWt97h7QxDEiEBXlQlCg1BwCUKD0EJ6gtAgtJCeIDQInSoThAah4BKEBqHgEoQGoeAShAah4BKEBsk6uNFo1CzLsi4SiZhjsRh/XQiCIK4aWQU3GAzmVFdXbzh27FjF448//n8effTRu0e6YwRBXJqs5ioXFRWlysvLraNHj05VV1dbn3322dkAkEqldDU1NfNOnTqVb7FYuBtXVRWnTp1CYWEht8sYw6lTp1BcXMztAsDp06dRUlLC7fn9fvT09CCZTHK74XAYVqtV6P51PB7H6dOnYTQaud1UKoXGxkbk5eVxu4qioLGxEQUFBdxuZoyKioq4XUB8jLxeL2w2G2KxGLcbDAZx/vx5oQJp0WgUra2tQkXOkskkV7GwrIKbSqX0kUik/P333y94/vnn5z3yyCNvAkBOTo66cOHCLrvdHl+yZAl3ZxVFgdPphIjLGIPdbhdygY9WkIi4LpcL+fn5Qq7f74dOpxNyI5EIEomEkJtMJhEMBoVcWZbhdruFXFVV4XA4hMdocHBQyLXb7SgpKRFyPR4PcnJyhNxQKARFUYTcWCyGDz/8MOvtswquXq9Xf/nLX36gKApbvnz5GbPZfOGtobi4OJqfn6+OGjWKu7OyLCM/Px8iLmPsurjJZBIFBQXC7VosFiHXaDQKu/F4XPjvTafTwq6qqsMao7y8PCE3FosJHytZloXHV6fTCbdrMpm4SopmG1w2depUO3dvCIIYEeh2EEFoEAouQWgQCi5BaBAKLkFoEAouQWgQCi5BaBAKLkFoEAouQWgQCi5BaJCsgptKpXT19fU3ezweS319/czm5ubRV6NxesojQYiR1ZTHdDot/fSnP533b//2b8q5c+eK9+/ff+uePXteBQDGmPTxf7kbZ4xd+BFxRdv9632IeNe6XS3+vcMZ37/ch6hzPcZ3uH9vtmQV3Pz8fGXGjBm2kpISuaKiwitJ0lQASCaTujfeeOP2Dz/8sEBkGZSqqqirqxMenKNHj3J7f+mKfOIHAgEMDAzA5XJxu5FIBOfPn4ff7+d2E4kEWltbuZZ+ZUilUjh16hRSqRS3qygK6uvroaoqt5sZXxGGM0aZint2O//0+lAohJ6eHni9Xm43FovBarUiHA5zu8lkkms5YFbBTSQSRoPBULF3796xOp1OmT59uhcATCaTWl1dfZwxFl6/fj13Z2VZhsFgwMaNG7ldxhgkScKDDz4o5AIQch0OB5qbm7FixQpu1+v14ujRo1i1ahW3Gw6HcejQIVRXV3O78XgcFosF69at43bT6TRycnKwYcMGbldVVej1ejzwwAPc7nDGyGazwWq1YtmyZdyuy+VCQ0MDVq5cye0GAgHU1tZi9erV3O6IFP0ym83pX//61y9mDqZer6cnmRPEdSTr+rg6nY7CShB/I1DtIILQIFQ7iCA0CE3AIAgNQsElCA1C33EJQoPQd1yC0CB0qkwQGoSCSxAahIJLEBokq+BGIhHjL37xi/udTueompqaab/97W8XjHTHCIK4NFlNeTSZTPKZM2eCbW1tY3/961/PUxQl+fDDDzcCgMPhKPb7/ZLNZuNeeqIoCnw+n2Sz2bivUjHG8HG7Qle4RF2XywWPxyPkBgIBeL1eITcajQofq2QyKezKsjysMRJ1AfExcjgcwmPk9XqF3XA4LDy+8Xhc5Vlhl1VwjUYjs1gseO+99yaWlpZO6Ojo0Pt8Pl1BQQHr7OwcNzg4+LLVaj3F21lVVXV2u32+1Wo9yesyxiS73f4Fq9XawOsCgN1uv03E9fl8hQMDAxOsVus5XjccDucPDAx8zmq1tvG68XjcbLPZZlqt1mZeN5VKGQcHByutVutpXldRFL3dbr/FarU28rrDHCNh1+PxFPf394+1Wq0dvG4gELAMDAyUW63Ws7xuNBrNtdls061Wayuvm0gkclKpVE7Wwl8udr7UTzweNzz//PMr9uzZc3soFMr985//PC3zu1QqpX/zzTfnZrOfv/6RZVnat2/f50Vcxhj27Nlzy7V23W635ciRI9NF3EAgkFtbWztTxI1EIjk1NTWzRdxEImE4cOCA0Bil02nd/v3754ke5717917z8R0aGiqsq6ubJuJ6vd68w4cPzxBxQ6GQ6Z133pkl4sZiMeNbb701J9vts/qOazab5U2bNr21atWq+oKCgvh9993XnfldbW3tZLfbnR+NRrmr1NfX13+usLBQaBbGzp07bwoEAnl+vz/7d6mP2b1792S/32/xeDxmXjc3Nzfa1dVVGAwGuYvNulyuMQ6HY2IoFMrndd1ut85ms5UcOXJkDK975syZYo/HM/69996bweu+//77n3O5XIW9vb3cx/mDDz6Y6nK5coPBYNar0BKJhGHbtm1Le3p6Svx+f87evXunZeumUind9u3b74xGo6YzZ86UNTU1lWbryrIsvfrqq3f4fL6i/v7+UTt37pyZrauqqrRz587bHQ7HmHA4nLtjx47KVCqV9ev6z3/+8wKbzTZ+9uzZvdu2bZufjTOsq8o+n0+/efPm2w4dOlR47NixCby+0+kMv/HGG1kfoL9k1KhR7nfffbfk4MGDY3ndWCwW3LJly/Ta2trxvO6777476Sc/+cmXXS4Xd7XmkydP3nT48OH8VCrF/TiJZ599dv6+ffvG9/b2crszZswItLS0yN3d3VzVx6PRqPTTn/500b//+7/P6+3t5aowHYvFdD/72c9u/8Mf/jD20KFDWYdPkiT1jTfeyGtubq6sq6srfemll25TFCWrEEiSxPbu3ZvT398/rru7O+ftt98el227BoOB1dTU6M6fPz9h1KhR3S+88MKCWCyW1RuOTqdjH3zwgdra2jrJYDCEfve731UlEoms36zq6+vTdXV10/77v/97/i9+8Ys7PB7PFf/eYQWXMSbl5OSwMWPGxBRF4S6VPmXKlLAkSYpI2/39/fnRaNT0la98hfsZMpWVlYl58+YNhsNhE6/7wQcffGHixImF/f39Wb8oMowbN+6U0WgM/e///u9cXjcSiRRMmDAh2dDQ8AVe12AwKGfOnBnzxS9+sZ3HUxRFMhqNqdGjRztSqRTXGUZeXp76/e9//7TJZCpLp9NZv4hNJpM6YcKEIGPMMGnSpHhZWVnWbRqNRjZp0qSg2WxWb7/99hBPfwFg8uTJAb1ez1pbW6eXl5d35uXlZX21aMqUKQGdToeKigrvx/Wjs87WlClTgs3NzXktLS2ft1gsExwOxxXPBIcV3NLSUnn58uVdOTk5JfPnz7fx+qFQaGpxcXFJb28v96dXT09P5eLFi6VQKMR9uvvee+9VjB8/PnfJkiVOXvepp57a+6Mf/WjH7Nmz+3jdjo6OUUVFRSX33HNPL6/7gx/8oLGkpMSwaNGi87yuz+fT33nnnb1TpkyJ8XiFhYXq3/3d3w0sWLBAHTt2rJu33XHjxumWLFnSt3Tp0q5snWQyaZg0adKk3t5eUyQSsUydOrUr2yeupNNp/fjx4yc3NjZO7erqmmyxWKaqqprVp7Usy7rS0tIpbW1t02w225zFixcbZVnOylVVVbJYLJ/r6uqafODAgYVVVVV2o9GYzsYFAJPJ9LlJkyYVbN++/YXvfOc7e6dMmZK4kiMxRvOFCUJr0MwpgtAgFFyC0CAUXILQIBRcgtAgFFyC0CAUXILQIBRcgtAgFFyC0CAUXILQIP8PnxFgaq7ZgpQAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAO4AAADnCAYAAAAZ4WrqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAAsTAAALEwEAmpwYAAAp0klEQVR4nO2deXQU15m3f9WLuiW1NsQmFkEwAgOC2BBjZAz5nASDg4NNEEkYwA6ZLJ6xj7Mcz8xxjjMZz0m+eMyMz2TiwMkkthMbY2NjCIvByItsDAghBNqgkdCuVrd63/equt8fdvPFMUvfKwQp/D7n6Phg1VP3qm7/uqur7q1XYoyBIAhtobveHSAIgh8KLkFoEAouQWgQCi5BaBAKLkFoEAouQWgQCi5BaBDu4J49e7b4pZdeqhoaGsobiQ4RBHFlJN4JGOvWrVtWUlIiT5gwIfbEE0/UJ5NJA2NMP0L9I4jPDAaDQTYYDEpW2/LuXJZlw8033+xyuVxFyWRSt2/fvi+cPn36F5WVlWW8+1JVFW1tbZg3bx6vCsYYWlpa8PnPf57bBYDm5mYhNxKJwOl04qabbuJ24/E4BgYGMGPGDG43mUyiu7sbs2bN4nZlWUZ7ezvmzJnD7aqqijNnzmDu3LncLmMMra2t13x8Q6EQPB4Ppk2bxu1Go1HY7XZUVFRwu4lEAr29vbj55pu53XQ6zXJzc//v2rVrt2clMMa4fl577bWp3/3ud7/R0NAwhjGGZDJp3LZtWwsTIJ1OsxdffFFEZaqqsj/+8Y/C7gsvvCDk2u12dvDgQSHX4/GwPXv2CLmhUIi9/vrrQm4sFmPbt28XclOpFHvppZeEXEVR2J/+9CchdzhjNDAwwGpqaoRcp9PJ9u/fL+T6/X62a9cuITcSicg7dux4iGWZQ+5P3LVr1/auXbu2l9cjCOLqQVeVCUKDXNfgSpJ0PZsnCM1yXYPLaEkhQQhBp8oEoUEouAShQSi4BKFBKLgEoUEouAShQSi4BKFB6D4uQWgQ7uAeOXJk8hNPPLH+ajRO93EJQgzuucpTpkxxWK1WVVVVSVVVnD17dlJ/f7+pqamJu3FVVdHf3w8RlzEm7ALAwMCAkOvxeNDd3S3kBoNB9PT0CLmxWAy9vb1CbiqVQl9fn5CrKIqwe73GyOl0Ch8rv98vPL6RSER4fBOJBJLJZNbbcwdXkiRjMpksDAaD5oKCgoSqqhJjDKqq8u4Kqqpe+BFBtN2/bFukTdF2h+Oqqqo5dzh/b8b/LB1nHriDq9PpzN///vc7vF5vXklJSbyysnLAarUm58+fz7sryLIMq9UKEZd9vNZT1G1paRFyHQ4HFEURcr1eL0KhkJAbDocxNDQk5MbjcfT09Ai56XQa7e3tQm5mLe+1HiObzQa9Xi/kulwuJBIJITcQCMDr9Qq50WgUNpst6+25gzthwgT/qlWrank9giCuHnQ7iCA0CAWXIDQIBZcgNAgFlyA0CM2cIggNQk/AIAgNQqfKBKFBKLgEoUEouAShQbiD6/f7TS6Xq0iWZbqyRBDXCe4pj3/4wx/KrFbrbUuXLm369re/fX4kOkUQxOXhDu4DDzww8Mgjj8wpLCyMZYp+HT9+3KLX8xfsU1UVx48fh9Fo5HYZY6ivr4fJZOJ2AaC+vh5ms5nbCwQC6OvrQyAQ4HYjkQja29sRi8W43Xg8jpaWFsiyzO2mUimcPHlS6Paboiioq6uDwcD9Urkwvjk5OdxuZnxFxsjr9cJut8Pr9XK7oVAIXV1dCIfD3G4sFsOZM2e4ludlSCaTXGPLPRq//OUvF+bm5k6dPXt2nclkUu++++7mSCQSve+++3h3BUVREI/HIeIyxhCJRIRc4KPVNiLu0NAQWltbsWzZMm7X5/OhuLgYK1eu5HbD4TBMJpNQnxOJBAAIubIsI5lMCrmqqiIWi13z8R0cHER7ezu+9KUvcbtutxuNjY1YsWIFtxsMBpGfn49Vq1Zxu7FYDG+//XbW23MH98knn2xKpVLt+fn5YQAwm81po9HIcnNzeXcFWZaRk5MDEZcxNizXaDQKuWazWbjd4bjDOVYAhP/edDot3K6qqp+pMUomk8M6Vjpd9pecuINbUlISBxDn9QiCuHrQ7SCC0CAUXILQIBRcgtAgFFyC0CAUXILQIBRcgtAgFFyC0CAUXILQIBRcgtAg3ME9evTo6P379y/weDz8s78JgrgqcE957O7uTj733HMzvvGNbyT+8R//8Ywsy3pVVYVWrSiKAkVRhFzGmLALfDQ39Fr3eTiuLMvDalf07x1Ou6qqDmt8h9NnLY4vzzPYuIO7aNGieENDgysWixk/Xta3oK6uroB3P8D/X/YlsiQQ+GhpnsiSQADCywmDwSD6+/vh8/m43Wg0io6ODkQiEW43kUigtbUVqVSK202n02hsbBQuRnX8+HGuCfAZGGM4fvy40JJAQHx8/X4/7HY7XC4XtxsOh9Hd3Y1gMMjtxuNxnD17FvE4/1R+3nHlPqL79u37nF6vL6mqqrKaTCZ19erVJ2RZDq9fz18yV5Zl6HQ6bNy4kdvNvCOLuoqiCLkOhwPNzc1Cy768Xi+OHj0qtOwrHA6jpKQE1dXV3G48Hkdubi7WrVvH7abTaej1emzYsIHbzbxRXOsxstlssFqtQksvXS4XGhoahJZeBgIB1NbWYvXq1dxuNBrFm2++mfX23MH9yU9+ch7AVXnyBT1XmSDEoOcqE4QGodtBBKFBKLgEoUGodhBBaBD6jksQGoROlQlCg1BwCUKDUHAJQoNQcAlCg9BVZYLQINzBDQaDuh/96Edfs9lspcNtnK4qE4QY3HOV9+zZM/2VV14p/+53v9tcVlbm6+rqGudwOIznzp3jblxVVTgcDoi4jDFhF/ioBpCI6/F4YLPZhNxgMIjBwUEhNxqNwm63C7nJZFL4WCmKorkxcjqdwmPk8/mE3XA4LDy+8Xica4UQd3ADgcCk6dOnj+np6SmbOXPmQCAQyI9Go3qRZW6qqiISiQgtkQM+ejGLuqLtBgIBhMNhITcUCgm78XhcuM+pVErYVRRF2GWMDWuMRN3hjNFw3Gg0KnysEokE17JL7uA++uij7912221nbr755ojRaGQLFizo7u7uTtxxxx28u4Isy+jp6YGIyxjD+fPnhd2Ojg4h1+FwwGAwCLlerxepVErIDYfD8Pv9Qm48HofD4RBy0+k0+vr6hFxVVdHV1XXNx8hmsyEvL0/IdblcYIwJuYFAAJFIRMiNRqPweDxZby+0wrmqqsop4hEEcXWg20EEoUHodhBBaBBaZEAQGoROlQlCg4g9fo/4m0dVVbjdbrS0tKClpQVNTU3Iz8/H3LlzUV5eDp1OR19VNAwF9waDMYZgMIjf//73+P3vf4+enh4oigLGGF555RWMGzcOa9aswT/90z9h0qRJFF6NQsG9gWCMwe1246GHHsK+ffs+9WBuRVFgt9vx7LPPoq6uDs8//zwqKyspvBqErirfQKRSKTz55JPYs2fPZZ+mzxjDyZMn8cMf/hB+v/8a9pC4WtBV5RuIhoYGvPjii1lPnTt8+DB27NhB46BBuIPb19dXdvDgwUWRSCR3JDpEiMEYw86dO7nKmyiKgh07diCZTI5gz4iRgPs77uHDh+c0NDSYq6qqGAB8XPRLSqfT3I1niiSJuJkSFSJupm0RN1ME62/NTSaTsFqt3Pvt7e2Fx+PBuHHjhNq9HJmiX6JjpKrq39xxHkl3RIt+TZo06fSRI0fmP/fcc7MfeeSRpo+LfllEvq9mCkqJFIVijKG+vh45OTncLgCcOHECJpOJ2wsEAujv7xf6bhiJRNDR0YFoNMrtJhIJtLS0XDa4fX193PsNh8PYuXMnRo8efdHfK4oiXJgtM0aihdlEx9fn88Fut3NN2s8QCoXQ3d2NUCjE7cZiMZw9exaJRILb5T3r4U5MU1NTcX5+flFVVdWZq1H0S5IkoYJSmaJfoq4sy0Lu9Sz6VVxcfMmiX+l0GgcPHkR7ezvXfkePHo0HH3wQJSUll9zvcIp+Mcau+RhR0a+L8OMf/7gLQBevR4wsmaWGu3bt4jrlWrhwISwWywj2jBgJaMrjDYIkSVi9ejWmTZuWtVNYWIhNmzYJ168lrh8U3BuIKVOm4Mknn0RhYeEVt83JycHDDz+MJUuW0P10DULBvYHQ6XT45je/iWeeeQYTJ0685HZFRUV47LHH8PjjjwtfOCKuL3SOdIOh1+uxadMmLFq0CM8//zxqamrg8XiQSCQwevRoLF68GJs2bcIdd9xBodUwFNwbDEmSIEkS5syZg6effhpPPPEEBgYG8Pbbb2Pjxo0oKSmBwWCg02ONQ8G9AcmsEDp58iScTickSYLFYsHbb7+NwsJCLFiwAGVlZRReDUPBvcFgjKGpqQltbW1YuHAhli5deuGqsaqqGBoawtGjR1FaWvqJ3xHagi5O3UBkQtvf349vfOMbmDFjBnJycqDT6aDT6WAwGDBp0iR8/etfh8lkwjvvvMP1LF/ibwcK7g2E3+9HW1sb7rnnHphMpkueCuv1elRVVUGWZXR2dtLqIA1Cwb2BOHnyJKqqqrK6WqzT6bB06VI0NjbSp64G4Q7u+++/P+Zf/uVfVu3evXvsSHSIEENRFDidTkyZMiXri04WiwU6nQ7xeHyEe0dcbbivTPzP//zPIkmScm+99VZJURSps7NzvN1uzxFZUpZ5lIqIyxgTdoGPFguIuG63G/39/UJuIBDAwMCAkBuNRi9Mnr8Y8XgciqJwXWySJAn5+flobGzE2LEXfx+WZVn4OKuqOqzxFR2joaEh4THy+XzCYxQOhy87RpdjxIt+lZeXJwEk2tra5lRXV7vC4XBuPB7XBYNB3l1BVVXEYjGIuIwxxONxIReAsBsOh4X7PBw3Fotdts/JZPKyj6u5FIqiIBqNXnK/iqLQGGVJJBIRdq9F0a+6kydPzqmoqLAaDAZ266239nR2diYWLVrEuyvIsoyuri6IuJmiUKLuuXPnhFyHwwG9Xi/ker1eJBIJITdTQe5SrqqqGBgYQCqVynqdcaaa3v3334+8vLyLbpNOp9HT0yPUZ1VVcf78+Ws+RjabDbm5uUKuy+WCoihCbqbSn4gbjUbhcrmy3p47uNOmTQtPmzbtOK9HjCySJKG8vBwdHR1ZP7nR5/PBaDTCbDZfgx4SVxO6qnyDIEkS5s+fj1OnTiEWi11xe1mWUVtbi0WLFkGno5eB1qARu4HIz8/HHXfcgb179yIUCl30/ixjDMlkEjU1NZgwYQImTZp0HXpKDBea73YDIUkSpk+fDoPBgN27d6OiogKzZs1CYWEhJElCNBpFT08PmpqaUFlZiVtuuYXmK2sUCu4NhiRJmDp1KsrKynDu3Dm89957CIVCGBwcREVFBSZPnozVq1fDYrFQaDXMdQ3uZ+GFwxhDOp2G3W5He3s7zp07h5kzZ2Ly5MnIzc297DHIuC6XC319fejr60N3dzfKyspgNpsv6UqSBJPJhNmzZ2P06NEYGBiA0+nEbbfddkX3r/tss9lw/vx5tLe3c/fZ6XRiYGAgqz7/dbt2ux2dnZ1ob29HeXn5Fd3PGtc1uDfyHNnMc5/ff/99bNmyBfX19XC73VAUBZs3b8acOXPwne98B9XV1Z8KQ8Y9efIkOjo6MHbsWIwbNw5f/vKX0dvbi2PHjmHMmDFYsmTJRV1ZltHY2PgJd8WKFRfcsWPH4s4777xoCNPp9IU+nzhx4kKft2zZgsrKSvz93/89vv71r2fd7sqVK6/Ybsatra3F1q1bP9Hu7373u8u2+5mFMTasn2Qyady2bVsLEyCdTrMXX3xRRGWqqrI//vGPwu4LL7wg5Nrtdnbw4MErbheLxdi//uu/sqKiIgbgoj8mk4lt2LCBDQ0Nfcp97bXX2JEjR1gikWCqqn6i7+l0mp05c4b96U9/Ym63+xO/z8Zta2u7pPvzn/+cFRYWXrbP69evZ06n81Pujh07smrX4/Fc+L2qqiwajbKf/exnV2x348aNzOVyfWLfF2NgYIDV1NRccYwuhtPpZPv37xdy/X4/27Vrl5AbiUTkHTt2PMSyzB19xx0BMp8UTz311GWnsSWTSWzfvh0GgwFbtmxBbm4uFEVBTU0NZs+ejdmzZ3/q00WSJBgMBsyaNQujRo3CwYMHsXbtWpjNZiiKgkOHDl3RnT17NkpLSz/lbt26FU899dRlH86dTCbxyiuvICcnB1u2bIHZbIaqqnjrrbdQWVmJWbNmXbbdUaNG4cCBAxfaZYxh69atePrpp6/Y7ssvvwyTyYTf/OY3n/l7z3Q76CrDGEN7ezs2b96c1dxTVVWxY8cOHDhwAIwx9PT0XHiRX+6UUJIkjBs3DnPnzsXx48fBGEN3dzdycnK43Pr6+k/0OZsn6quqildffRVvvfUWGGPo7OyE2WzGzTfffMV2x48fjzlz5uDEiRNgjMFqtXK1u23bNtTU1NzQX7OygTu44XDY6Pf7C+LxOD1p7BLs3r0bDocj6+3j8ThefPFFKIqC5uZmLFy4MKvvcZIkYfbs2ejv74csy8JuOp3Gzp074XQ6ufr80ksvIZVKobm5GbfffntWEzkkSUJlZSX6+vqQSqXwxhtvcE31SyQS2LZtm9C87BsJ7uC2tLSMe+ihh7758ssvV45Eh7SOqqo4evQo9yfC2bNn4XK5EIvFUFpamrVnNBpRWFh44UmOo0aN4nItFgu8Xi9OnjzJ3efTp0/D5/MhnU6jqKiIq92CggL4/X4cOXKEu91Tp04JL1y4UeD+jrt48WLb008/HViyZElXMpnUHTx48NYTJ05YRApoqaqKhoYG5ObyV+xkjKGhoQH5+fncLvDRonOR0huBQAC9vb2XLGeZTqfR29vLvV+n04lXX30VJpOJawqiJEkwGo14/fXXYTQaua64SpIEvV6P119/XXiZ4s6dOy/7tI3Ltb1r1y50dHRwt+t0OrFr165Lvkl5vV4MDg4KhTsUCqGzs1NojXIsFkNbWxsUReF2k8kkV+Ev7uB2dHRYzGazPHPmzBAALF261Or1emPLly/n3RUURUEwGISIyxiDz+cTcgHA4/EIuU6nE62trfjKV75y0d8rioLnnnuOOwilpaVYuXIl6urqoKpq1uFlH9/7XLFiBY4f51v7wT6+7XTPPffgwIED6Ozs5PILCgqwfPnyC99Xedu+++67sWPHDu4qg6WlpVi2bNklKwwODg6io6MDd911F9d+gY9eF4WFhUKvjWAwCIPBIOTGYjHU1tZmvT13cCdOnBj7zW9+81bm3xaLJWE2m9WCggLeXUGWZZjNZoi4jLHr4kYiEeTm5l7SZYyhqqoK7777Ltd+Z86ciWnTpqGlpQWBQCDrU15ZlhEKhTB16lQ0NTUhGAyiuLg4azcSiaC8vBwLFizAoUOHuPo8d+5cTJ48GadPn0YkEsn6dFlRFEQiEUycOBF33nknPvzwQ67g33LLLZg4ceIlS3BaLJbLjtHliMfjwq6iKMJu5oF+WW/P20B+fr46duxY/gKgF+FGvZG+Zs0ajBkzJuvtc3JysGHDBhgMBlRWVqKxsTHrF3JnZyfKyspgNBpRWVmJhoaGrFzGGM6fP4+ysjLk5OSgurqa67t1Tk4O1q9fD7PZzN3uuXPnLsykWrNmzSVLfF6q3XXr1n3mqzBc19tBN+Il/cxV00ceeSSrx8hIkoSvfe1ruO+++yBJEioqKhAIBNDd3X3Z45P5qnDixAnccccdkCQJM2bMyNr1+/1oaGhAVVUVJEnC3Llz8fDDD2cVCEmSsGrVKnzta1+DJEmYOXMmfD4fenp6smq3sbERixYtgiRJmDdvHle7999/P1auXHnDvulny3UN7o168A0GA3784x/joYceuuyFN71ej69+9at45plnLpxeGQwG3HPPPTh+/Diampogy/InwsA+Lujd19eHvXv3YtmyZReeXvHXrqIoF3V7e3sv6j722GP4h3/4h8tObsi08cwzz1y4MJj5f8eOHUNzc/Ml2+3p6cHevXtx9913X2hXr9fjscceww9+8IMrtnvvvffiv/7rv4QvSN5I0FzlEcJisWDz5s1YsmQJtm7diubmZgSDQTDGYLFYMG3aNDz44IPYtGnTp74b5ufno7q6GkePHsWrr76K8vJylJWVQa/Xw+12o7e3FyaTCatXr76wZO9i7iuvvMLlWiwW/Md//AcWL16M3/72t2htbf1En2+66SZ8+9vfxoMPPoiioqJPuZdrt6enB7m5uZ9qV5IkFBQUYPPmzVi8eDG2bt3K1e5nFZryOEJIkgSz2Yy1a9di5cqV6O7uRltbG86cOYNVq1ahoqICRUVFF70gkVndc9dddyEWi8Fms6GnpweNjY249957sXz5chQWFmbt9vf3o66uDvfdd98V3Uyfv/rVr6K7uxvd3d04fPgwvvWtb12xz2azGV/60pcutGu321FbW4s1a9ZgxYoVV2z3m9/8Ju699150d3ejt7cX7777LtavX3/Zdj+rUHBHmMwjUOfOnYsJEyYgPz8fCxcu5HJnzpyJCRMmIBQKYe7cudxueXk5XC4Xl2uxWDBv3jzMmjULkUhEqM8VFRXo6+sTanfu3Lnw+XxZt/tZg97CCEKDUHAJQoNQcAlCg1BwCUKDcAe3v7+/8J133vl8R0fHxR99zwFd1icIMbivKv/85z+/7YMPPpjx0EMP6f75n//5tKqqUuYGOy+qqkLUzTzCQ7RE5PVodzju9TpWw2lXi30e7viqqjqsPmcLd3AVRWGlpaVeg8FgSiaTut27dy88evRogWhn6+rquD3go4N07Ngx4Xt7x44dg16v5/YCgQD6+/vhdru53UgkgvPnzwsXhWptbRVabpZKpXDq1CnhomCZp2Twoqoqjh07JnRmxRhDXV2d0Bj5fD44HA4MDQ1xu6FQCN3d3fD5fNxuLBbD2bNnEY1Gud1kMsn1WuYO7pIlS3yRSGR8SUmJy2QyqWvWrKlXVTW8fv163l1BlmXo9Xps3LiR2828kB544AEhV1VVIdfhcKC5uRkrVqzgdr1eL44ePYpVq1Zxu+FwGKNGjUJ1dTW3G4/HkZ+fj3Xr1nG76XQaRqMRGzZs4HYzyxNFx4gxJuRmSl0uW7aM23W5XGhoaMDKlSu53UAggNraWqxevZrbjUajePPNN7Penju43/ve95q+973vNfF6BEFcPeiqMkFoEAouQWgQCi5BaBAKLkFoEAouQWgQCi5BaBAKLkFoEAouQWgQCi5BaBB6yiNBaBDu4O7bt++mRx99dFVLS0v2T7G+BDfyUx4JYiThnqu8ffv2CpvNxl577bX58+bNe7e/v3+02+02dnd3czeuKApcLhdEXMYY3G63kAtA2HW73RgaGhJyA4EAnE6nkBuNRoWPVTKZFHZlWdbcGA0NDQmPkc/nE3bD4bDw+MbjcaTT6ay35w7uo48+enLr1q1fMhqN7nQ6Ldnt9hKv12sYGBjg3RVUVYXP54OIm3mSv4gLQNj1+Xxwu91CbigUEnZjsRg8Ho+Qm0ql4PV6hVxFUYY1RqLtAuJj5Ha7hY9zIBAQPs6RSETYTSQSXMsuuYM7evRo/V133WVftmxZk9FoZIsWLTo/MDAQ/+IXv8i7K8iyDJvNBhGXMYa+vj5ht6enR8h1OBzIzc0Vcr1eLxhjQm44HEY0GhVy4/E4PB6PkJtOp2G324VcVVXR399/zcfIZrOhqKhIyHW5XDAYDEJuIBBAKpUSckd8WV9FRYWzoqIi+9LlBEFcdeh2EEFoEAouQWgQuo9LEBqE6uMShAahT1yC0CD0iUsQGoQuThGEBqHgEoQGoe+4BKFBsgpuMpnU19bWft7pdOa/8847N9fX14+7Go3Td1yCECOrKY+KouBXv/rV9Icffjh/x44dY5PJZM7rr7/+uk6nY6qq6hhjUBSFu/FMgSQRF/go+NfaHU6fh+sOp8/X4+/NlHq5HmOk1fHNlqyCm5eXp9x0000OAOaFCxd6+vr6JgLAx0W/bhtu0S/RolDDKfolWlAqGAyir68PHo+H280U/QqFQtzucIp+pdNpNDY2DqvolwjXa4yGW/Srp6cHfr+f243FYrBarX87Rb8SiYQxPz//pra2tmBPT495/Pjxdp1Ox0wmE6OiX9lzPYt+5eXlXZeiX5IkXfMxoqJfH2M2m9P/+Z//+RJ3bwiCGBHoqjJBaBCaOUUQGoQmYBCEBqHgEoQGoeAShAah4BKEBqHgEoQGoeAShAah4BKEBqHgEoQGySq44XDY+Pjjj69tbm6e8MMf/nDNkSNHxox0xwiCuDRZzVUuKChIDwwMuBhj5rKyMs+5c+csd955pxsA+vr6xrhcLmNXVxd345miXyIuY0zYBT6qLyPiut1uOBwOITcQCGBoaEjIjUajcDqdQm6m6JeImyn6JeKqqnpdxmhoaEh4jDIri0TccDgsPL4jVvTLZDIZE4mEubi42JhKpcwAkE6npaGhoSK/328YHBzk7qyqqvD7/RBxGWPCLgBh1+fzwev1CrmhUEjYjcVi8Pl8Qm4qlRJ2M0W/tDRGbrcbHo9HyA0EAsJjFIlEhI/ViBT9SiaThmXLlqmDg4OW4uJiddSoUfkAYDQa2e23397Z398fX7p0KXdnZVnGwMAARFzGGHp7e4Xd7u5uIdfhcMBsNgu5Xq8XqqoKueFwGJFIRMiNx+Nwu91CbjqdxuDgoJCrqir6+vqu+RjZbDYUFhYKuS6XC3q9XsgNBAJIJpNC7ogs6zOZTPK3vvWt97h7QxDEiEBXlQlCg1BwCUKD0EJ6gtAgtJCeIDQInSoThAah4BKEBqHgEoQGoeAShAah4BKEBsk6uNFo1CzLsi4SiZhjsRh/XQiCIK4aWQU3GAzmVFdXbzh27FjF448//n8effTRu0e6YwRBXJqs5ioXFRWlysvLraNHj05VV1dbn3322dkAkEqldDU1NfNOnTqVb7FYuBtXVRWnTp1CYWEht8sYw6lTp1BcXMztAsDp06dRUlLC7fn9fvT09CCZTHK74XAYVqtV6P51PB7H6dOnYTQaud1UKoXGxkbk5eVxu4qioLGxEQUFBdxuZoyKioq4XUB8jLxeL2w2G2KxGLcbDAZx/vx5oQJp0WgUra2tQkXOkskkV7GwrIKbSqX0kUik/P333y94/vnn5z3yyCNvAkBOTo66cOHCLrvdHl+yZAl3ZxVFgdPphIjLGIPdbhdygY9WkIi4LpcL+fn5Qq7f74dOpxNyI5EIEomEkJtMJhEMBoVcWZbhdruFXFVV4XA4hMdocHBQyLXb7SgpKRFyPR4PcnJyhNxQKARFUYTcWCyGDz/8MOvtswquXq9Xf/nLX36gKApbvnz5GbPZfOGtobi4OJqfn6+OGjWKu7OyLCM/Px8iLmPsurjJZBIFBQXC7VosFiHXaDQKu/F4XPjvTafTwq6qqsMao7y8PCE3FosJHytZloXHV6fTCbdrMpm4SopmG1w2depUO3dvCIIYEeh2EEFoEAouQWgQCi5BaBAKLkFoEAouQWgQCi5BaBAKLkFoEAouQWgQCi5BaJCsgptKpXT19fU3ezweS319/czm5ubRV6NxesojQYiR1ZTHdDot/fSnP533b//2b8q5c+eK9+/ff+uePXteBQDGmPTxf7kbZ4xd+BFxRdv9632IeNe6XS3+vcMZ37/ch6hzPcZ3uH9vtmQV3Pz8fGXGjBm2kpISuaKiwitJ0lQASCaTujfeeOP2Dz/8sEBkGZSqqqirqxMenKNHj3J7f+mKfOIHAgEMDAzA5XJxu5FIBOfPn4ff7+d2E4kEWltbuZZ+ZUilUjh16hRSqRS3qygK6uvroaoqt5sZXxGGM0aZint2O//0+lAohJ6eHni9Xm43FovBarUiHA5zu8lkkms5YFbBTSQSRoPBULF3796xOp1OmT59uhcATCaTWl1dfZwxFl6/fj13Z2VZhsFgwMaNG7ldxhgkScKDDz4o5AIQch0OB5qbm7FixQpu1+v14ujRo1i1ahW3Gw6HcejQIVRXV3O78XgcFosF69at43bT6TRycnKwYcMGbldVVej1ejzwwAPc7nDGyGazwWq1YtmyZdyuy+VCQ0MDVq5cye0GAgHU1tZi9erV3O6IFP0ym83pX//61y9mDqZer6cnmRPEdSTr+rg6nY7CShB/I1DtIILQIFQ7iCA0CE3AIAgNQsElCA1C33EJQoPQd1yC0CB0qkwQGoSCSxAahIJLEBokq+BGIhHjL37xi/udTueompqaab/97W8XjHTHCIK4NFlNeTSZTPKZM2eCbW1tY3/961/PUxQl+fDDDzcCgMPhKPb7/ZLNZuNeeqIoCnw+n2Sz2bivUjHG8HG7Qle4RF2XywWPxyPkBgIBeL1eITcajQofq2QyKezKsjysMRJ1AfExcjgcwmPk9XqF3XA4LDy+8Xhc5Vlhl1VwjUYjs1gseO+99yaWlpZO6Ojo0Pt8Pl1BQQHr7OwcNzg4+LLVaj3F21lVVXV2u32+1Wo9yesyxiS73f4Fq9XawOsCgN1uv03E9fl8hQMDAxOsVus5XjccDucPDAx8zmq1tvG68XjcbLPZZlqt1mZeN5VKGQcHByutVutpXldRFL3dbr/FarU28rrDHCNh1+PxFPf394+1Wq0dvG4gELAMDAyUW63Ws7xuNBrNtdls061Wayuvm0gkclKpVE7Wwl8udr7UTzweNzz//PMr9uzZc3soFMr985//PC3zu1QqpX/zzTfnZrOfv/6RZVnat2/f50Vcxhj27Nlzy7V23W635ciRI9NF3EAgkFtbWztTxI1EIjk1NTWzRdxEImE4cOCA0Bil02nd/v3754ke5717917z8R0aGiqsq6ubJuJ6vd68w4cPzxBxQ6GQ6Z133pkl4sZiMeNbb701J9vts/qOazab5U2bNr21atWq+oKCgvh9993XnfldbW3tZLfbnR+NRrmr1NfX13+usLBQaBbGzp07bwoEAnl+vz/7d6mP2b1792S/32/xeDxmXjc3Nzfa1dVVGAwGuYvNulyuMQ6HY2IoFMrndd1ut85ms5UcOXJkDK975syZYo/HM/69996bweu+//77n3O5XIW9vb3cx/mDDz6Y6nK5coPBYNar0BKJhGHbtm1Le3p6Svx+f87evXunZeumUind9u3b74xGo6YzZ86UNTU1lWbryrIsvfrqq3f4fL6i/v7+UTt37pyZrauqqrRz587bHQ7HmHA4nLtjx47KVCqV9ev6z3/+8wKbzTZ+9uzZvdu2bZufjTOsq8o+n0+/efPm2w4dOlR47NixCby+0+kMv/HGG1kfoL9k1KhR7nfffbfk4MGDY3ndWCwW3LJly/Ta2trxvO6777476Sc/+cmXXS4Xd7XmkydP3nT48OH8VCrF/TiJZ599dv6+ffvG9/b2crszZswItLS0yN3d3VzVx6PRqPTTn/500b//+7/P6+3t5aowHYvFdD/72c9u/8Mf/jD20KFDWYdPkiT1jTfeyGtubq6sq6srfemll25TFCWrEEiSxPbu3ZvT398/rru7O+ftt98el227BoOB1dTU6M6fPz9h1KhR3S+88MKCWCyW1RuOTqdjH3zwgdra2jrJYDCEfve731UlEoms36zq6+vTdXV10/77v/97/i9+8Ys7PB7PFf/eYQWXMSbl5OSwMWPGxBRF4S6VPmXKlLAkSYpI2/39/fnRaNT0la98hfsZMpWVlYl58+YNhsNhE6/7wQcffGHixImF/f39Wb8oMowbN+6U0WgM/e///u9cXjcSiRRMmDAh2dDQ8AVe12AwKGfOnBnzxS9+sZ3HUxRFMhqNqdGjRztSqRTXGUZeXp76/e9//7TJZCpLp9NZv4hNJpM6YcKEIGPMMGnSpHhZWVnWbRqNRjZp0qSg2WxWb7/99hBPfwFg8uTJAb1ez1pbW6eXl5d35uXlZX21aMqUKQGdToeKigrvx/Wjs87WlClTgs3NzXktLS2ft1gsExwOxxXPBIcV3NLSUnn58uVdOTk5JfPnz7fx+qFQaGpxcXFJb28v96dXT09P5eLFi6VQKMR9uvvee+9VjB8/PnfJkiVOXvepp57a+6Mf/WjH7Nmz+3jdjo6OUUVFRSX33HNPL6/7gx/8oLGkpMSwaNGi87yuz+fT33nnnb1TpkyJ8XiFhYXq3/3d3w0sWLBAHTt2rJu33XHjxumWLFnSt3Tp0q5snWQyaZg0adKk3t5eUyQSsUydOrUr2yeupNNp/fjx4yc3NjZO7erqmmyxWKaqqprVp7Usy7rS0tIpbW1t02w225zFixcbZVnOylVVVbJYLJ/r6uqafODAgYVVVVV2o9GYzsYFAJPJ9LlJkyYVbN++/YXvfOc7e6dMmZK4kiMxRvOFCUJr0MwpgtAgFFyC0CAUXILQIBRcgtAgFFyC0CAUXILQIBRcgtAgFFyC0CAUXILQIP8PnxFgaq7ZgpQAAAAASUVORK5CYII=" }, "metadata": { "needs_background": "light" @@ -776,14 +751,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[32m\u001b[1mAlice\u001b[0m\u001b[32m\u001b[0m: {\n", + "\u001B[32m\u001B[1mAlice\u001B[0m\u001B[32m\u001B[0m: {\n", " \"thought\": \"My opponent is trying to block me. I should place my piece at [8, 7] to create a potential line for myself.\",\n", " \"move\": [\n", " 8,\n", " 7\n", " ]\n", "}\n", - "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", + "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -804,10 +779,8 @@ }, { "data": { - "image/png": "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", - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/png": "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" }, "metadata": { "needs_background": "light" @@ -818,7 +791,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[35m\u001b[1mBob\u001b[0m\u001b[35m\u001b[0m: {\n", + "\u001B[35m\u001B[1mBob\u001B[0m\u001B[35m\u001B[0m: {\n", " \"thought\": \"Alice is trying to build a vertical line again. I need to block her next move otherwise she will have a chance to win. I will place my piece at [9, 7].\",\n", " \"move\": [\n", " 9,\n", @@ -851,13 +824,17 @@ " msg = player(msg)\n", " \n", " i += 1" - ] + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-03-27T08:10:33.989202Z", + "start_time": "2024-03-27T08:09:59.446824Z" + } + } }, { "cell_type": "markdown", - "metadata": { - "collapsed": false - }, "source": [ "## Future Direction\n", "\n", @@ -868,7 +845,10 @@ "- Fine tune a model to improve the performance of the agent\n", "\n", "For complete code, we provide in [code/game_gomoku.py](./code/game_gomoku.py)." - ] + ], + "metadata": { + "collapsed": false + } } ], "metadata": { From a0882fa26db5518552ade0fe13a6d2ea5b3ee749 Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Wed, 22 May 2024 20:44:36 +0800 Subject: [PATCH 28/55] revert back unnecessary changes --- examples/game_gomoku/main.ipynb | 260 +++++++++++++++++--------------- 1 file changed, 140 insertions(+), 120 deletions(-) diff --git a/examples/game_gomoku/main.ipynb b/examples/game_gomoku/main.ipynb index 7044a8243..569321c15 100644 --- a/examples/game_gomoku/main.ipynb +++ b/examples/game_gomoku/main.ipynb @@ -31,6 +31,13 @@ { "cell_type": "code", "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-27T08:09:57.602994Z", + "start_time": "2024-03-27T08:09:57.565787Z" + }, + "collapsed": false + }, "outputs": [], "source": [ "YOUR_MODEL_CONFIGURATION_NAME = \"{YOUR_MODEL_CONFIGURATION_NAME}\"\n", @@ -39,38 +46,38 @@ " \n", " # ...\n", "}" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2024-03-27T08:09:57.602994Z", - "start_time": "2024-03-27T08:09:57.565787Z" - } - } + ] }, { "cell_type": "markdown", + "metadata": { + "collapsed": false + }, "source": [ "## Step 1: Prepare a board for Gomoku\n", "\n", "First we create a `BoardAgent` class by inheriting from `AgentBase`, which manage the game board and update the game status as follows.\n", "\n", "To create a better visual experience, we also provide a function `board2img` to convert the board to an image. " - ], - "metadata": { - "collapsed": false - } + ] }, { "cell_type": "code", "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-27T08:09:58.153932Z", + "start_time": "2024-03-27T08:09:57.571266Z" + }, + "collapsed": false + }, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import matplotlib.patches as patches\n", "\n", - "def board2img(board: np.ndarray, output_dir: str)->str:\n", + "def board2img(board: np.ndarray, save_path: str)->str:\n", " size = board.shape[0]\n", " fig, ax = plt.subplots(figsize=(10, 10))\n", " ax.set_xlim(0, size - 1)\n", @@ -100,29 +107,30 @@ " ax.set_xticklabels(range(size))\n", " ax.set_yticklabels(range(size))\n", " ax.invert_yaxis()\n", - " plt.savefig(output_dir, bbox_inches='tight', pad_inches=0.1)\n", + " plt.savefig(save_path, bbox_inches='tight', pad_inches=0.1)\n", " plt.close(fig) # Close the figure to free memory\n", - " return output_dir" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2024-03-27T08:09:58.153932Z", - "start_time": "2024-03-27T08:09:57.571266Z" - } - } + " return save_path" + ] }, { "cell_type": "markdown", - "source": [ - "The following code shows the implementation of the `BoardAgent` class. The agent manages the game board and updates the game status." - ], "metadata": { "collapsed": false - } + }, + "source": [ + "The following code shows the implementation of the `BoardAgent` class. The agent manages the game board and updates the game status." + ] }, { "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-27T08:09:59.392069Z", + "start_time": "2024-03-27T08:09:58.159470Z" + }, + "collapsed": false + }, "outputs": [], "source": [ "import numpy as np\n", @@ -229,18 +237,13 @@ " else:\n", " count = 0\n", " return False\n" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2024-03-27T08:09:59.392069Z", - "start_time": "2024-03-27T08:09:58.159470Z" - } - }, - "execution_count": 3 + ] }, { "cell_type": "markdown", + "metadata": { + "collapsed": false + }, "source": [ "### Step2: Prepare a Gomoku Player Agent\n", "\n", @@ -250,13 +253,18 @@ "2. Within the agent, to enable the agent to think, we ask LLMs to respond in a dictionary format, which contains the thought and the move (\"thought\" field must come before \"move\"). To achieve this, we prepare a parsing function to extract the dictionary from response. \n", "\n", "The implementation of the Gomoku agent is as follows: " - ], - "metadata": { - "collapsed": false - } + ] }, { "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-27T08:09:59.397713Z", + "start_time": "2024-03-27T08:09:59.392729Z" + }, + "collapsed": false + }, "outputs": [], "source": [ "import json\n", @@ -327,15 +335,7 @@ " \n", " # Hide thought from the response\n", " return Msg(self.name, response[\"move\"], role=\"assistant\") \n" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2024-03-27T08:09:59.397713Z", - "start_time": "2024-03-27T08:09:59.392729Z" - } - }, - "execution_count": 4 + ] }, { "cell_type": "markdown", @@ -346,17 +346,25 @@ }, { "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-27T08:09:59.446367Z", + "start_time": "2024-03-27T08:09:59.398116Z" + }, + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\u001B[32m2024-03-27 16:09:59.427\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36magentscope.models\u001B[0m:\u001B[36mread_model_configs\u001B[0m:\u001B[36m171\u001B[0m - \u001B[1mLoad configs for model wrapper: post_api\u001B[0m\n", - "\u001B[32m2024-03-27 16:09:59.435\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36magentscope.utils.monitor\u001B[0m:\u001B[36m_create_monitor_table\u001B[0m:\u001B[36m341\u001B[0m - \u001B[1mInit [monitor_metrics] as the monitor table\u001B[0m\n", - "\u001B[32m2024-03-27 16:09:59.435\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36magentscope.utils.monitor\u001B[0m:\u001B[36m_create_monitor_table\u001B[0m:\u001B[36m342\u001B[0m - \u001B[1mInit [monitor_metrics_quota_exceeded] as the monitor trigger\u001B[0m\n", - "\u001B[32m2024-03-27 16:09:59.436\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36magentscope.utils.monitor\u001B[0m:\u001B[36m__init__\u001B[0m:\u001B[36m311\u001B[0m - \u001B[1mSqliteMonitor initialization completed at [./runs/run_20240327-160958_kbf2ta/agentscope.db]\u001B[0m\n", - "\u001B[32m2024-03-27 16:09:59.440\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36magentscope.models.model\u001B[0m:\u001B[36m__init__\u001B[0m:\u001B[36m257\u001B[0m - \u001B[1mInitialize model [post_api]\u001B[0m\n", - "\u001B[32m2024-03-27 16:09:59.441\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36magentscope.models.model\u001B[0m:\u001B[36m__init__\u001B[0m:\u001B[36m257\u001B[0m - \u001B[1mInitialize model [post_api]\u001B[0m\n" + "\u001b[32m2024-03-27 16:09:59.427\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36magentscope.models\u001b[0m:\u001b[36mread_model_configs\u001b[0m:\u001b[36m171\u001b[0m - \u001b[1mLoad configs for model wrapper: post_api\u001b[0m\n", + "\u001b[32m2024-03-27 16:09:59.435\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36magentscope.utils.monitor\u001b[0m:\u001b[36m_create_monitor_table\u001b[0m:\u001b[36m341\u001b[0m - \u001b[1mInit [monitor_metrics] as the monitor table\u001b[0m\n", + "\u001b[32m2024-03-27 16:09:59.435\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36magentscope.utils.monitor\u001b[0m:\u001b[36m_create_monitor_table\u001b[0m:\u001b[36m342\u001b[0m - \u001b[1mInit [monitor_metrics_quota_exceeded] as the monitor trigger\u001b[0m\n", + "\u001b[32m2024-03-27 16:09:59.436\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36magentscope.utils.monitor\u001b[0m:\u001b[36m__init__\u001b[0m:\u001b[36m311\u001b[0m - \u001b[1mSqliteMonitor initialization completed at [./runs/run_20240327-160958_kbf2ta/agentscope.db]\u001b[0m\n", + "\u001b[32m2024-03-27 16:09:59.440\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36magentscope.models.model\u001b[0m:\u001b[36m__init__\u001b[0m:\u001b[36m257\u001b[0m - \u001b[1mInitialize model [post_api]\u001b[0m\n", + "\u001b[32m2024-03-27 16:09:59.441\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36magentscope.models.model\u001b[0m:\u001b[36m__init__\u001b[0m:\u001b[36m257\u001b[0m - \u001b[1mInitialize model [post_api]\u001b[0m\n" ] } ], @@ -381,18 +389,13 @@ ")\n", "\n", "board = BoardAgent(name=\"Host\")" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2024-03-27T08:09:59.446367Z", - "start_time": "2024-03-27T08:09:59.398116Z" - } - }, - "execution_count": 5 + ] }, { "cell_type": "markdown", + "metadata": { + "collapsed": false + }, "source": [ "### Step 3: Start the Gomoku game\n", "\n", @@ -401,26 +404,32 @@ "In this game, we use a message hub to share messages between the two players (board agent doesn't have memory), so that one player can hear what the board agent says to the other player, and what moves the other player makes. \n", "\n", "Note here we only show 10 steps of the game. You can adjust the `MAX_STEPS` to play more rounds." - ], - "metadata": { - "collapsed": false - } + ] }, { "cell_type": "code", "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-27T08:10:33.989202Z", + "start_time": "2024-03-27T08:09:59.446824Z" + }, + "collapsed": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: Welcome to the Gomoku game! Black player goes first. Please make your move.\n" + "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: Welcome to the Gomoku game! Black player goes first. Please make your move.\n" ] }, { "data": { - "text/plain": "
", - "image/png": "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" + "image/png": "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", + "text/plain": [ + "
" + ] }, "metadata": { "needs_background": "light" @@ -431,14 +440,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001B[32m\u001B[1mAlice\u001B[0m\u001B[32m\u001B[0m: {\n", + "\u001b[32m\u001b[1mAlice\u001b[0m\u001b[32m\u001b[0m: {\n", " \"thought\": \"As the first move of the game, it's best to place the piece in the center of the board to maximize possible winning directions.\",\n", " \"move\": [\n", " 7,\n", " 7\n", " ]\n", "}\n", - "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", + "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -459,8 +468,10 @@ }, { "data": { - "text/plain": "
", - "image/png": "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" + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAO4AAADnCAYAAAAZ4WrqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAAsTAAALEwEAmpwYAAAgxElEQVR4nO2de3Ab1d33f7pZkiU7tnO1CUkIcZKaJDwkJSSQhJe+hECZN7yZOm1TAr0MUKYwKeWPdmDo9DLwttP2j9LSdtrh0hYaGgiFXCAkQEwgjmMcJ7EdR4kdy7IkS7auK+1qV3s75/0jiIfnmYeic2THXfr7zHgYJvrsOdqfvrrs7tmfjVIKCIJYC/tUTwBBEHYwuAhiQTC4CGJBMLgIYkEwuAhiQTC4CGJBMLgIYkGYg3v27Nm6559/fu3Y2Fj1ZEwIQZBPx8Z6Aca2bds21tfXG01NTfJjjz3Wqaqqk1LqmKT5Ici/DU6n03A6nWZZj2XduGEYzqVLlyYSicQ0VVXt+/bt+/ypU6ceX7ZsWSPrtgghcObMGVixYgWrCpRS6O3thauvvprZBQDo6enhciVJgvHxcbjyyiuZXUVRIBKJwOLFi5ldVVUhGAzC5z73OWbXMAw4f/48XHXVVcwuIQT6+/th+fLlzC6lFPr6+i55ffP5PKRSKVi4cCGzWygUIBaLQXNzM7NbLBYhFArB0qVLmV1d16nX6/1/W7du3VmWQCll+nvppZcW3HPPPV/u6uqaSSkFVVVdL7zwQi/lQNd1+te//pVHpYQQ+uc//5nbfe6557jcWCxGDxw4wOWmUim6Z88eLjefz9OXX36Zy5Vlme7cuZPL1TSNPv/881yuaZr0L3/5C5dbSY0ikQg9dOgQlzs+Pk7379/P5WazWfqPf/yDy5Ukydi1a9f9tMwcMn/ibt26NbR169YQq4cgyMSBR5URxIJMaXBtNttUDo8glmVKg0txSSGCcIFflRHEgmBwEcSCYHARxIJgcBHEgmBwEcSCYHARxILgeVwEsSDMwT169Ojljz322J0TMTiex0UQPpivVZ4/f348EAgQQoiNEAJnz56dGw6H3adPn2YenBAC4XAYeFxKKbcLABCJRLjcVCoFwWCQy83lcjA8PMzlyrIMoVCIy9U0DUZGRrhc0zS53amq0fj4OPe+ymaz3PWVJIm7vsViEVRVLfvxzMG12WwuVVVrc7mcp6ampkgIsVFKgRDCuikghHz0xwPvuB8fm2dM3nErcQkhlnMreb4l/99pP7PAHFy73e657777BtLpdHV9fb2ybNmySCAQUFeuXMm6KTAMAwKBAPC49MO1nrxub28vlxuPx8E0TS43nU5DPp/nckVRhLGxMS5XURQYHh7mcnVdh/Pnz3O5pbW8l7pG0WgUHA4Hl5tIJKBYLHK5giBAOp3mcguFAkSj0bIfzxzcpqam7ObNm9tYPQRBJg48HYQgFgSDiyAWBIOLIBYEg4sgFgSvnEIQC4J3wEAQC4JflRHEgmBwEcSCYHARxIIwBzebzboTicQ0wzDwyBKCTBHMlzw+/fTTjYFA4NoNGzac/sY3vjE4GZNCEOSfwxzcu+++O/Lggw9eVVtbK5eafh0/ftzvcLA37COEwPHjx8HlcjG7lFLo7OwEt9vN7AIAdHZ2gsfjYfYEQYCRkREQBIHZlSQJzp8/D7IsM7uKokBvby8YhsHsapoGJ06c4Dr9ZpomdHR0gNPJ/FL5qL5VVVXMbqm+PDVKp9MQi8UgnU4zu/l8HoaGhkAURWZXlmXo7+9nWp5XQlVVptoyV+OJJ55Y7fV6F7S0tHS43W5yyy239EiSVLjjjjtYNwWmaYKiKMDjUkpBkiQuF+Diahsed2xsDPr6+mDjxo3MbiaTgbq6Orj99tuZXVEUwe12c825WCwCAHC5hmGAqqpcLiEEZFm+5PUdHR2F8+fPwxe+8AVmN5lMQnd3N9x6663Mbi6XA5/PB5s3b2Z2ZVmGt956q+zHMwf3Jz/5yWlN0877fD4RAMDj8egul4t6vV7WTYFhGFBVVQU8LqW0ItflcnG5Ho+He9xK3Er2FQBwP19d17nHJYT8W9VIVdWK9pXdXv4hJ+bg1tfXKwCgsHoIgkwceDoIQSwIBhdBLAgGF0EsCAYXQSwIBhdBLAgGF0EsCAYXQSwIBhdBLAgGF0EsCHNw29vbZ+zfv39VKpViv/obQZAJgfmSx2AwqD7zzDOLv/zlLxe/853v9BuG4SCEcK1aMU0TTNPkciml3C7AxWtDL/WcK3ENw6hoXN7nW8m4hJCK6lvJnK1YX5Z7sDEHd82aNUpXV1dClmXXh8v6VnV0dNSwbgfgP5d98SwJBLi4NI9nSSAAcC8nzOVyEA6HIZPJMLuFQgEGBgZAkiRmt1gsQl9fH2iaxuzqug7d3d3czaiOHz/OdAF8CUopHD9+nGtJIAB/fbPZLMRiMUgkEsyuKIoQDAYhl8sxu4qiwNmzZ0FR2C/lZ60r8x7dt2/fFQ6Ho37t2rUBt9tNtmzZ8oFhGOKdd7K3zDUMA+x2O9x1113Mbukdmdc1TZPLjcfj0NPTw7XsK51OQ3t7O9eyL1EUob6+HlpbW5ldRVHA6/XCtm3bmF1d18HhcMD27duZ3dIbxaWuUTQahUAgwLX0MpFIQFdXF9fSS0EQoK2tDbZs2cLsFgoFeP3118t+PHNwH3744UEAmJA7X+B9lRGED7yvMoJYEDwdhCAWBIOLIBYEewchiAXB37gIYkHwqzKCWBAMLoJYEAwuglgQDC6CWBA8qowgFoQ5uLlczv7QQw/9n2g0Or3SwfGoMoLwwXyt8p49exa9+OKL8+65556exsbGzNDQ0Ox4PO46d+4c8+CEEIjH48DjUkq5XYCLPYB43FQqBdFolMvN5XIwOjrK5RYKBYjFYlyuqqrc+8o0TcvVaHx8nLtGmUyG2xVFkbu+iqIwrRBiDq4gCHMXLVo0c3h4uHHJkiURQRB8hULBwbPMjRACkiRxLZEDuPhi5nV5xxUEAURR5HLz+Ty3qygK95w1TeN2TdPkdimlFdWI162kRpW4hUKBe18Vi0WmZZfMwd2xY8fha6+9tn/p0qWSy+Wiq1atCgaDweL111/PuikwDAOGh4eBx6WUwuDgILc7MDDA5cbjcXA6nVxuOp0GTdO4XFEUIZvNcrmKokA8HudydV2HkZERLpcQAkNDQ5e8RtFoFKqrq7ncRCIBlFIuVxAEkCSJyy0UCpBKpcp+PNcK57Vr147zeAiCTAx4OghBLAieDkIQC4KLDBDEguBXZQSxIBhcBLEgGFwEsSAYXASxIHhUGUEsCB5VRhALwhzckZGRxgMHDqyRJMk7GRNCEOTTYb7k8b333ruqq6vLs3btWgoA8GHTL5uu68yDl5ok8bilFhU8bmlsHrfUBAvdT6fU9Iu3RoQQSz3fSt1Jbfo1d+7cU0ePHl35zDPPtDz44IOnP2z65ef5vVpqKMXTFIpSCp2dnVBVVcXsAgB88MEH4Ha7mT1BECAcDkM2m2V2JUmCgYEBKBQKzG6xWITe3l6uF4Wu63DixAlmD+DiGxxvY7ZSjXgbs/HWN5PJQCwWY7pov0Q+n4dgMAj5fJ7ZlWUZzp49C8VikdlVVZXp8cyJOX36dJ3P55u2du3a/olo+mWz2bgaSpWafvG6hmFwuVPZ9Kuuro676ZfH45mSpl+U0kteI2z69T/wve99bwgAhlg9BEEmDjyPiyAWBIOLIBYEg4sgFgSDiyAWBIOLIBYEg4sgFgSDiyAWBIOLIBYEg4sgFgSDiyAWhDm477777swf/OAHm1999dVZkzEhBEE+HeZrlX/zm9+ssdls3muuucZmmqbtwoULc2KxWFUgEGAe3DRNiMViwONSSrldgIuLBXjcZDIJ4XCYyxUEASKRCJdbKBQ+unieFVVVYXR0lMs1DIN7PxNCKqovb43Gxsa4a5TJZLhrJIoid40mvenXvHnzVAAonjlz5qrW1taEKIpeRVHsuVyOdVNACAFZloHHpZSCoihcLgBwu6Iocs+5EleWZe45a5rG7ZqmiTUqE0mSuN1L0fSr48SJE1c1NzcHnE4nveaaa4YvXLhQXLNmDeumwDAMGBoaAh631BSK1z137hyXG4/HweFwcLnpdBqKxSKXW+ogx+MqigKjo6Ncrq7rMDw8zOUSQmBwcPCS1ygajYLX6+VyE4kEmKbJ5ZY6/fG4hUIBEolE2Y9nDu7ChQvFhQsXHmf1EASZOPCoMoJYEAwuglgQDC6CWBAMLoJYEK6O9BMFdjKYPCiloOs6JBIJiEajEA6HIRgMQmNjI3g8Htz3FmdKg4udDCae0t0Ru7u7YWBgAGbNmgWzZ8+GTZs2QSgUgmPHjsGsWbNg3bp14PV6McAWZUqDi0w8xWIR9u/fD01NTfCVr3wFqqqqPgpn6Sby58+fh927d8MXv/hFmD59OobXguBv3M8QpmnCwYMHoaWlBa6//npwu93/JZQ2mw2cTie0tLTALbfcAgcOHGC+ETfyrwEG9zNEMBiEqqoqaGlp+aefojabDWbPng3Lly+Hzs5O/MliQZiDK4qiK5vN1iiKwtdXApkUKKXQ09MDq1evLuurr81mg5aWFgiHw9y9fZCpgzm4vb29s++///6v/O1vf1s2GRNC+NB1HYrFIjQ0NJTtuFwu8Pv9IEnSJM4MmQyYD07dcMMN0V/84hfC+vXrh1RVtR84cOCaDz74wM/TQIsQAl1dXeD1snfspJRCV1cX+Hw+ZhcA4MSJE+D3+5k9QRAgFApxvdglSYJz584xLd8qoSgK9PT0fOK/q6oKoigyHWiy2WzgcDhg9+7dnxh40zThgw8+AI/HwzznUo2qq6uZXQD+GqXTaRgdHeVapZPP5+HChQugKAqzK8synDlzBkzTZHZVVWU63sAc3IGBAb/H4zGWLFmSBwDYsGFDIJ1Oy5s2bWLdFJimCblcDnhcSilkMhkuFwAglUpxuePj49DX1wc333wzs5vJZMDr9XKNW3qj+CRX0zSmplEA/3mUedOmTZ8YXMMwQBRFrjkTQiCbzXLXl7dGo6OjMDAwADfddBOzm0qloLa2lmvcXC4HTqeTy5VlGdra2sp+PHNwL7vsMvm3v/3tm6X/9/v9RY/HQ2pqalg3BYZhgMfjAR6XUjolriRJ4PV6uVxN07hdAPinbuk55XI5qKurK2t7hmGAJEnQ2Nj4ie0sdV3n3leEkCmpkd/v597PiqJwu6Zpcrt2ux3s9vJ/uTL/xvX5fGTWrFnsDUD/B/D84cRhs9lg2bJl0NXVVdZRYkopDA4OQmNjI3f/WmTqmNLTQXgaYmJZvHgxCIIAwWDwn+5bSilks1no6uqCtWvX4huoBZnS4OILZmJxOp1w2223wfHjx+H06dNgmuZ/CXCpGXgoFIK9e/fCxo0buQ8cIVMLXqv8GcPn80Frayu0t7fDiy++CPPmzYPGxkZwOByQTCYhFAqB2+2GLVu2QG1tLb55WhS8Vvkzhs1mA7fbDTfddBPIsvzRyqCOjg644447YNOmTVBbW8t0IAT51wOD+xnFZrOBz+eDJUuWwLx58yCRSMDy5cunelrIBIFvuwhiQTC4CGJBMLgIYkEwuAhiQZiDGw6Ha99+++2rBwYGKj4BiKciEIQP5qPKP/rRj649cuTI4vvvv9/+/e9//xQhxFY6sc8KIQR4XUopt1vyL/W4lbhTta8qGdeKc660voSQiuZcLszBNU2TTp8+Pe10Ot2qqtpfffXV1e3t7TW8k+3o6GD2AC7upGPHjnGfjzx27Bg4HA5mTxAECIfDkEwmmV1JkmBwcJC7KVRfXx/XcjNN0+DkyZNgGAaza5om910yCCFw7Ngxrm9WlFLo6OjgqlEmk4F4PA5jY2PMbj6fh2AwCJlMhtmVZRnOnj0LhUKB2VVVlem1zBzc9evXZyRJmlNfX59wu93kS1/6UichRLzzzjtZNwWGYYDD4YC77rqL2S29kO6++24ulxDC5cbjcejp6YFbb72V2U2n09De3g6bN29mdkVRhIaGBmhtbWV2FUUBn88H27ZtY3Z1XQeXywXbt29ndgkhYLfbuWtEKeVyS60uN27cyOwmEgno6uqC22+/ndkVBAHa2tpgy5YtzG6hUGBalskc3Hvvvff0vffee5rVQxBk4sCjyghiQTC4CGJBMLgIYkEwuAhiQTC4CGJBMLgIYkEwuAhiQTC4CGJBMLgIYkHwLo8IYkGYg7tv374rd+zYsbm3t7e+0sHxLo8Iwgfztco7d+5sjkaj9KWXXlq5YsWKd8Lh8IxkMukKBoPMg5umCYlEAnhcSikkk0kuFwC43WQyCWNjY1yuIAgwPj7O5RYKBe59paoqt2sYhuVqNDY2xl2jTCbD7YqiyF1fRVGY2p0yB3fHjh0n/vCHP3zB5XIldV23xWKx+nQ67YxEIqybAkIIZDIZ4HFLTb94XADgdjOZDCSTSS43n89zu7IsQyqV4nI1TYN0Os3lmqZZUY14xwXgr1EymeTez4IgcO9nSZK43WKxyLTskjm4M2bMcNx0002xjRs3nna5XHTNmjWDkUhEufHGG1k3BYZhQDQaBR6XUgojIyPc7vDwMJcbj8fB6/Vyuel0GiilXK4oilAoFLhcRVEglUpxubquQywW43IJIRAOhy95jaLRKEybNo3LTSQS4HQ6uVxBEEDTNC530pf1NTc3jzc3N4+zegiCTBx4OghBLAgGF0EsCJ7HRRALgv1xEcSC4CcuglgQ/MRFEAuCB6cQxIJgcBHEguBvXASxIGUFV1VVR1tb29Xj4+O+t99+e2lnZ+fsiRgcf+MiCB9lXfJomib87Gc/W/TAAw/4du3aNUtV1aqXX375ZbvdTgkhdkopmKbJPHipQRKPC3Ax+JfarWTOlbqVzHkqnm+p1ctU1Miq9S2XsoJbXV1tXnnllXEA8KxevTo1MjJyGQDAh02/rq206RdvU6hKmn7xNpTK5XIwMjICqVSK2S01/crn88xuJU2/dF2H7u7uipp+8TBVNaq06dfw8DBks1lmV5ZlCAQC/zpNv4rFosvn81155syZ3PDwsGfOnDkxu91O3W43xaZf5TOVTb+qq6unpOmXzWa75DXCpl8f4vF49F/96lfPM88GQZBJAY8qI4gFwSunEMSC4AUYCGJBMLgIYkEwuAhiQTC4CGJBMLgIYkEwuAhiQTC4CGJBMLgIYkHKCq4oiq5HHnlka09PT9N3v/vdLx09enTmZE8MQZBPpqxrlWtqavRIJJKglHoaGxtT586d869bty4JADAyMjIzkUi4hoaGmAcvNf3icSml3C7Axf4yPG4ymYR4PM7lCoIAY2NjXG6hUIDx8XEut9T0i8ctNf3icQkhU1KjsbEx7hqVVhbxuKIoctd30pp+ud1uV7FY9NTV1bk0TfMAAOi6bhsbG5uWzWado6OjzJMlhEA2mwUel1LK7QIAt5vJZCCdTnO5+Xye25VlGTKZDJeraRq3W2r6ZaUaJZNJSKVSXK4gCNw1kiSJe19NStMvVVWdGzduJKOjo/66ujrS0NDgAwBwuVz0uuuuuxAOh5UNGzYwT9YwDIhEIsDjUkohFApxu8FgkMuNx+Pg8Xi43HQ6DYQQLlcURZAkictVFAWSySSXq+s6jI6OcrmEEBgZGbnkNYpGo1BbW8vlJhIJcDgcXK4gCKCqKpc7Kcv63G638dWvfvUw82wQBJkU8KgyglgQDC6CWBBcSI8gFgQX0iOIBcGvyghiQTC4CGJBMLgIYkEwuAhiQTC4CGJByg5uoVDwGIZhlyTJI8sye18IBEEmjLKCm8vlqlpbW7cfO3as+ZFHHvlfO3bsuGWyJ4YgyCdT1rXK06ZN0+bNmxeYMWOG1traGnjqqadaAAA0TbMfOnRoxcmTJ31+v595cEIInDx5Empra5ldSimcPHkS6urqmF0AgFOnTkF9fT2zl81mYXh4GFRVZXZFUYRAIMB1/lpRFDh16hS4XC5mV9M06O7uhurqambXNE3o7u6GmpoaZrdUo2nTpjG7APw1SqfTEI1GQZZlZjeXy8Hg4CBXg7RCoQB9fX1cTc5UVWVqFlZWcDVNc0iSNO/dd9+tefbZZ1c8+OCDrwMAVFVVkdWrVw/FYjFl/fr1zJM1TRPGx8eBx6WUQiwW43IBLq4g4XETiQT4fD4uN5vNgt1u53IlSYJiscjlqqoKuVyOyzUMA5LJJJdLCIF4PM5do9HRUS43FotBfX09l5tKpaCqqorLzefzYJomlyvLMrz//vtlP76s4DocDvLEE08cMU2Tbtq0qd/j8Xz01lBXV1fw+XykoaGBebKGYYDP5wMel1I6Ja6qqlBTU8M9rt/v53JdLhe3qygK9/PVdZ3bJYRUVKPq6mouV5Zl7n1lGAZ3fe12O/e4brebqaVoucGlCxYsiDHPBkGQSQFPByGIBcHgIogFweAiiAXB4CKIBcHgIogFweAiiAXB4CKIBcHgIogFweAiiAUpK7iaptk7OzuXplIpf2dn55Kenp4ZEzE43uURQfgo65JHXddtjz766Iof//jH5rlz5+r2799/zZ49e/4OAEAptX34X+bBKaUf/fG4vOP+923weJd6XCs+30rq+/Ft8DpTUd9Kn2+5lBVcn89nLl68OFpfX280NzenbTbbAgAAVVXtr7zyynXvv/9+Dc8yKEIIdHR0cBenvb2d2fu4y/OJLwgCRCIRSCQSzK4kSTA4OAjZbJbZLRaL0NfXx7T0q4SmaXDy5EnQNI3ZNU0TOjs7gRDC7Jbqy0MlNSp13IvF2C+vz+fzMDw8DOl0mtmVZRkCgQCIosjsqqrKtBywrOAWi0WX0+ls3rt37yy73W4uWrQoDQDgdrtJa2vrcUqpeOeddzJP1jAMcDqdcNdddzG7lFKw2Wzw9a9/ncsFAC43Ho9DT08P3HrrrcxuOp2G9vZ22Lx5M7MriiIcPHgQWltbmV1FUcDv98O2bduYXV3XoaqqCrZv387sEkLA4XDA3XffzexWUqNoNAqBQAA2btzI7CYSCejq6oLbb7+d2RUEAdra2mDLli3M7qQ0/fJ4PPqTTz7519LOdDgceCdzBJlCyu6Pa7fbMawI8i8C9g5CEAuCvYMQxILgBRgIYkEwuAhiQfA3LoJYEPyNiyAWBL8qI4gFweAiiAXB4CKIBSkruJIkuR5//PH/Oz4+3nDo0KGFv/vd71ZN9sQQBPlkyrrk0e12G/39/bkzZ87MevLJJ1eYpqk+8MAD3QAA8Xi8LpvN2qLRKPPSE9M0IZPJ2KLRKPNRKkopfDgu1xEuXjeRSEAqleJyBUGAdDrN5RYKBe59paoqt2sYRkU14nUB+GsUj8e5a5ROp7ldURS566soCmFZYVdWcF0uF/X7/XD48OHLpk+f3jQwMODIZDL2mpoaeuHChdmjo6N/CwQCJ1knSwixx2KxlYFA4ASrSym1xWKxzwcCgS5WFwAgFotdy+NmMpnaSCTSFAgEzrG6oij6IpHIFYFA4AyrqyiKJxqNLgkEAj2srqZprtHR0WWBQOAUq2uapiMWi/1HIBDoZnUrrBG3m0ql6sLh8KxAIDDA6gqC4I9EIvMCgcBZVrdQKHij0eiiQCDQx+oWi8UqTdOqyhY+vtj5k/4URXE+++yzt+7Zs+e6fD7vfe211xaW/k3TNMfrr7++vJzt/Pc/wzBs+/btu5rHpZTCnj17/uNSu8lk0n/06NFFPK4gCN62trYlPK4kSVWHDh1q4XGLxaLzjTfe4KqRruv2/fv3r+Ddz3v37r3k9R0bG6vt6OhYyOOm0+nq9957bzGPm8/n3W+//fbneFxZll1vvvnmVeU+vqzfuB6Px/jmN7/55ubNmztramqUO+64I1j6t7a2tsuTyaSvUCgwd6nv7Oy8ora2lusqjN27d18pCEJ1Npst/13qQ1599dXLs9msP5VKeVhdr9dbGBoaqs3lcszNZhOJxMx4PH5ZPp/3sbrJZNIejUbrjx49OpPV7e/vr0ulUnMOHz68mNV99913r0gkErWhUIh5Px85cmRBIpHw5nK5slehFYtF5wsvvLBheHi4PpvNVu3du3dhua6mafadO3euKxQK7v7+/sbTp09PL9c1DMP297///fpMJjMtHA437N69e0m5LiHEtnv37uvi8fhMURS9u3btWqZpWtmv69dee21VNBqd09LSEnrhhRdWluNUdFQ5k8k4fvnLX1578ODB2mPHjjWx+uPj4+Irr7xS9g76OA0NDcl33nmn/sCBA7NYXVmWc7///e8XtbW1zWF133nnnbkPP/zw/04kEszdmk+cOHHle++959M0jfl2Ek899dTKffv2zQmFQszu4sWLhd7eXiMYDDJ1Hy8UCrZHH310zU9/+tMVoVCIqcO0LMv2H/7wh9c9/fTTsw4ePFh2+Gw2G3nllVeqe3p6lnV0dEx//vnnrzVNs6wQ2Gw2unfv3qpwODw7GAxWvfXWW7PLHdfpdNJDhw7ZBwcHmxoaGoLPPffcKlmWy3rDsdvt9MiRI6Svr2+u0+nM//GPf1xbLBbLfrPq7OzUOzo6Fv76179e+fjjj1+fSqU+9flWFFxKqa2qqorOnDlTNk2TuVX6/PnzRZvNZvKMHQ6HfYVCwX3zzTcz30Nm2bJlxRUrVoyKouhmdY8cOfL5yy67rDYcDpf9oigxe/bsky6XK/+nP/1pOasrSVJNU1OT2tXV9XlW1+l0mv39/TNvvPHG8yyeaZo2l8ulzZgxI65pGtM3jOrqanLfffedcrvdjbqul/0idrvdpKmpKUcpdc6dO1dpbGwse0yXy0Xnzp2b83g85LrrrsuzzBcA4PLLLxccDgft6+tbNG/evAvV1dVlHy2aP3++YLfbobm5Of1h/+iyszV//vxcT09PdW9v79V+v78pHo9/6jfBioI7ffp0Y9OmTUNVVVX1K1eujLL6+Xx+QV1dXX0oFGL+9BoeHl52ww032PL5PPPX3cOHDzfPmTPHu379+nFW9+c///nehx56aFdLS8sIqzswMNAwbdq0+ttuuy3E6n7729/urq+vd65Zs2aQ1c1kMo5169aF5s+fL7N4tbW15Gtf+1pk1apVZNasWUnWcWfPnm1fv379yIYNG4bKdVRVdc6dO3duKBRyS5LkX7BgwVC5d1zRdd0xZ86cy7u7uxcMDQ1d7vf7FxBCyvq0NgzDPn369PlnzpxZGI1Gr7rhhhtchmGU5RJCbH6//4qhoaHL33jjjdVr166NuVwuvRwXAMDtdl8xd+7cmp07dz73rW99a+/8+fOLn+bYKMXrhRHEauCVUwhiQTC4CGJBMLgIYkEwuAhiQTC4CGJBMLgIYkEwuAhiQTC4CGJBMLgIYkH+PwdzHyydJxCfAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] }, "metadata": { "needs_background": "light" @@ -471,14 +482,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001B[35m\u001B[1mBob\u001B[0m\u001B[35m\u001B[0m: {\n", + "\u001b[35m\u001b[1mBob\u001b[0m\u001b[35m\u001b[0m: {\n", " \"thought\": \"As the game has just started, I will place my piece near Alice's to prevent her from forming a line and to start building my own line.\",\n", " \"move\": [\n", " 7,\n", " 8\n", " ]\n", "}\n", - "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", + "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -499,8 +510,10 @@ }, { "data": { - "text/plain": "
", - "image/png": "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O/m+++77P4FAgLtb8+HDh2fu27fPkcvluG8n8cQTTyzYvn37xL6+Pm539uzZsY6ODsXtdnN1H0+n04YHHnhg8S9/+cv5fX19XB2mM5mM8ac//ekVTz/99Phdu3YVHT6DwaC9+uqr5e3t7XObm5trN23adLmqqkWFwGAwsG3btlk9Hs8Et9ttffvttycUO67ZbGa7d+82dnd3TxozZoz7ueeeW5jJZIp6wzEajWzv3r1aZ2fnZLPZnPjTn/60JJvNFv1m1dLSkm9ubp7x+9//fsFDDz30xVAo9LnPt6TgMsYMVquVjRs3LqOqKner9GnTpiUNBoMqMrbH43Gk02nbNddcw30Pmblz52bnz58/mEwmbbzu3r17v3DBBRdUejyeol8UBSZMmHDEYrEk/vznP8/jdVOpVMWkSZPk1tbWL/C6ZrNZPXHixLirrrrqNI+nqqrBYrHkxo4d68/lclzfMMrLy7U777zzqM1mq8vn80W/iG02mzZp0qQ4Y8w8efJkqa6urugxLRYLmzx5ctxut2tXXHFFgme+ADBlypSYyWRinZ2ds6ZOnXqmvLy86KNF06ZNixmNRtTX14c/7B9ddLamTZsWb29vL+/o6LjU6XRO8vv9n/tNsKTg1tbWKitXruyxWq01CxYs8PL6iURienV1dU1fXx/3p1dvb+/cpUuXGhKJBPfX3ffee69+4sSJZcuWLRvmdR9++OFt995770sNDQ39vG5XV9eYqqqqmmuvvbaP1/3ud7/bVlNTY168eHE3rxuJRExXXnll37Rp0zI8XmVlpfbNb35zYOHChdr48eODvONOmDDBuGzZsv7ly5f3FOvIsmyePHny5L6+PlsqlXJOnz69p9g7ruTzedPEiROntLW1Te/p6ZnidDqna5pW1Ke1oijG2traacePH5/h9XovWbp0qUVRlKJcTdMMTqfzwp6enilvvvnmoiVLlvgsFku+GBcAbDbbhZMnT67YvHnzc9/+9re3TZs2Lft5joExul6YIPQGXTlFEDqEgksQOoSCSxA6hIJLEDqEgksQOoSCSxA6hIJLEDqEgksQOoSCSxA65P8D2qq520he9+8AAAAASUVORK5CYII=" + "image/png": "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O/m+++77P4FAgLtb8+HDh2fu27fPkcvluG8n8cQTTyzYvn37xL6+Pm539uzZsY6ODsXtdnN1H0+n04YHHnhg8S9/+cv5fX19XB2mM5mM8ac//ekVTz/99Phdu3YVHT6DwaC9+uqr5e3t7XObm5trN23adLmqqkWFwGAwsG3btlk9Hs8Et9ttffvttycUO67ZbGa7d+82dnd3TxozZoz7ueeeW5jJZIp6wzEajWzv3r1aZ2fnZLPZnPjTn/60JJvNFv1m1dLSkm9ubp7x+9//fsFDDz30xVAo9LnPt6TgMsYMVquVjRs3LqOqKner9GnTpiUNBoMqMrbH43Gk02nbNddcw30Pmblz52bnz58/mEwmbbzu3r17v3DBBRdUejyeol8UBSZMmHDEYrEk/vznP8/jdVOpVMWkSZPk1tbWL/C6ZrNZPXHixLirrrrqNI+nqqrBYrHkxo4d68/lclzfMMrLy7U777zzqM1mq8vn80W/iG02mzZp0qQ4Y8w8efJkqa6urugxLRYLmzx5ctxut2tXXHFFgme+ADBlypSYyWRinZ2ds6ZOnXqmvLy86KNF06ZNixmNRtTX14c/7B9ddLamTZsWb29vL+/o6LjU6XRO8vv9n/tNsKTg1tbWKitXruyxWq01CxYs8PL6iURienV1dU1fXx/3p1dvb+/cpUuXGhKJBPfX3ffee69+4sSJZcuWLRvmdR9++OFt995770sNDQ39vG5XV9eYqqqqmmuvvbaP1/3ud7/bVlNTY168eHE3rxuJRExXXnll37Rp0zI8XmVlpfbNb35zYOHChdr48eODvONOmDDBuGzZsv7ly5f3FOvIsmyePHny5L6+PlsqlXJOnz69p9g7ruTzedPEiROntLW1Te/p6ZnidDqna5pW1Ke1oijG2traacePH5/h9XovWbp0qUVRlKJcTdMMTqfzwp6enilvvvnmoiVLlvgsFku+GBcAbDbbhZMnT67YvHnzc9/+9re3TZs2Lft5joExul6YIPQGXTlFEDqEgksQOoSCSxA6hIJLEDqEgksQOoSCSxA6hIJLEDqEgksQOoSCSxA65P8D2qq520he9+8AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] }, "metadata": { "needs_background": "light" @@ -511,14 +524,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001B[32m\u001B[1mAlice\u001B[0m\u001B[32m\u001B[0m: {\n", + "\u001b[32m\u001b[1mAlice\u001b[0m\u001b[32m\u001b[0m: {\n", " \"thought\": \"My opponent placed his piece next to mine. I should block him and also try to create a potential line for myself.\",\n", " \"move\": [\n", " 7,\n", " 6\n", " ]\n", "}\n", - "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", + "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -539,8 +552,10 @@ }, { "data": { - "text/plain": "
", - "image/png": "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" + "image/png": "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", + "text/plain": [ + "
" + ] }, "metadata": { "needs_background": "light" @@ -551,14 +566,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001B[35m\u001B[1mBob\u001B[0m\u001B[35m\u001B[0m: {\n", + "\u001b[35m\u001b[1mBob\u001b[0m\u001b[35m\u001b[0m: {\n", " \"thought\": \"I see Alice is trying to create a line horizontally. I need to block her next move otherwise she will have a chance to win. I will place my piece at [7, 5].\",\n", " \"move\": [\n", " 7,\n", " 5\n", " ]\n", "}\n", - "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", + "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -579,8 +594,10 @@ }, { "data": { - "text/plain": "
", - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAO4AAADnCAYAAAAZ4WrqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAAsTAAALEwEAmpwYAAAkT0lEQVR4nO2de3BU5f3/33vfZDc3IreIgGBAMeBXqQgq+LMtBaXCjxparaitVWurY9XptKNjp5ex32rp2Noqjp1aW7EIBUu5KIKXgAJJSAIkISwkZLPZbHaTvd93z+455/n9gctPWy/7PCHQYz+vmYzjsK/zPHs++97LOec5Hx1jDARBaAv9uZ4AQRD8UHAJQoNQcAlCg1BwCUKDUHAJQoNQcAlCg1BwCUKDcAf32LFjlevWrVswNDRUOhoTIgjis9HxXoBx6623Lq6qqpJramrSjz/+eLMkSUbGmGGU5kcQ/zUYjUbZaDQqRT2Wd+OyLBsvvvhiv9/vr5AkSb99+/YvHD58+Im6urqJvNtSVRVHjx7FnDlzeFUwxtDR0YHLLruM2wWA9vZ2ITeZTGJ4eBjTp0/ndjOZDAYGBjBjxgxuV5IkOJ1OXHLJJdyuLMs4ceIELr30Um5XVVV0dXVh9uzZ3C5jDJ2dnWe9vvF4HMFgENOmTeN2U6kUvF4vamtrud1sNguXy4WLL76Y283n86ykpOR/V61atb4ogTHG9ff3v/996t133/31lpaWsYwxSJJkeuWVVzqYAPl8nr388ssiKlNVlf3lL38Rdl966SUh1+v1sp07dwq5wWCQbd26VciNx+Ns06ZNQm46nWbr168XcnO5HFu3bp2QqygK++tf/yrkjqRGAwMDbPfu3ULu8PAw27Fjh5AbiUTYP/7xDyE3mUzKGzduvI8VmUPuT9xVq1a5Vq1a5eL1CII4c9BRZYLQIOc0uDqd7lwOTxCa5ZwGl9GSQoIQgr4qE4QGoeAShAah4BKEBqHgEoQGoeAShAah4BKEBqHzuAShQbiDu2/fvgsef/zx287E4HQelyDE4L5WecqUKT6Hw6GqqqpTVRXHjh2b5Ha7LUeOHOEeXFVVuN1uiLiMMWEXAAYGBoTcYDAIp9Mp5MZiMfT19Qm56XQaLpdLyM3lcujv7xdyFUURds9VjYaHh4X3VSQSEa5vMpkUrm82m4UkSUU/nju4Op3OJElSeSwWs5aVlWVVVdUxxqCqKu+moKrq6T8RRMf98NgiY4qOOxJXVVXNuSN5vgX/v2k/88AdXL1eb7333nu7Q6FQaVVVVaaurm7A4XBIV1xxBe+mIMsyHA4HRFz2wVpPUbejo0PI9fl8UBRFyA2FQojH40JuIpHA0NCQkJvJZNDX1yfk5vN5nDhxQsgtrOU92zXyeDwwGAxCrt/vRzabFXKj0ShCoZCQm0ql4PF4in48d3Bramoiy5cvb+D1CII4c9DpIILQIBRcgtAgFFyC0CAUXILQIHTlFEFoELoDBkFoEPqqTBAahIJLEBqEgksQGoQ7uJFIxOL3+ytkWaYjSwRxjuC+5PFPf/rTRIfDceWiRYuOfOtb3+oZjUkRBPHpcAf3jjvuGHjggQcuLS8vTxeafjU1NdkNBv6GfaqqoqmpCSaTidtljKG5uRkWi4XbBYDm5mZYrVZuLxqNor+/H9FolNtNJpM4ceIE0uk0t5vJZNDR0QFZlrndXC6H1tZWodNviqKgsbERRiP3S+V0fc1mM7dbqK9IjUKhELxeL0KhELcbj8fR29uLRCLB7abTaXR1dXEtzysgSRJXbbmr8ctf/nJeSUnJ1FmzZjVaLBb1K1/5SnsymUytWLGCd1NQFAWZTAYiLmMMyWRSyAVOrbYRcYeGhtDZ2YnFixdzu+FwGJWVlVi2bBm3m0gkYLFYhOaczWYBQMiVZRmSJAm5qqoinU6f9foODg7ixIkT+OIXv8jtBgIBtLW1YenSpdxuLBaDzWbD8uXLud10Oo233nqr6MdzB/fnP//5kVwud8JmsyUAwGq15k0mEyspKeHdFGRZhtlshojLGBuRazKZhFyr1So87kjckewrAMLPN5/PC4+rqup/VY0kSRrRvtLriz/kxB3cqqqqDIAMr0cQxJmDTgcRhAah4BKEBqHgEoQGoeAShAah4BKEBqHgEoQGoeAShAah4BKEBqHgEoQG4Q7u/v37z9uxY8fcYDDIf/U3QRBnBO5LHp1Op/Tiiy/O+PrXv579/ve/3yXLskFVVaFVK4qiQFEUIZcxJuwCp64NPdtzHokry/KIxhV9viMZV1XVEdV3JHPWYn157sHGHdz58+dnWlpa/Ol02vTBsr65jY2NZbzbAf7/si+RJYHAqaV5IksCAQgvJ4zFYnC73QiHw9xuKpVCd3c3kskkt5vNZtHZ2YlcLsft5vN5tLW1CTejampq4roAvgBjDE1NTUJLAgHx+kYiEXi9Xvj9fm43kUjA6XQiFotxu5lMBseOHUMmw38pP29duffo9u3bLzQYDFULFixwWCwWdeXKlQdlWU7cdht/y1xZlqHX63H77bdzu4V3ZFFXURQh1+fzob29XWjZVygUwv79+4WWfSUSCVRVVaG+vp7bzWQyKCkpwa233srt5vN5GAwGrF69mtstvFGc7Rp5PB44HA6hpZd+vx8tLS1CSy+j0SgaGhqwcuVKbjeVSuH1118v+vHcwX3kkUd6AJyRO1/QfZUJQgy6rzJBaBA6HUQQGoSCSxAahHoHEYQGod+4BKFB6KsyQWgQCi5BaBAKLkFoEAouQWgQOqpMEBqEO7ixWEz/0EMP3eTxeKpHOjgdVSYIMbivVd66detFr7766uS77767feLEieHe3t7xPp/PdPz4ce7BVVWFz+eDiMsYE3aBUz2ARNxgMAiPxyPkxmIxDA4OCrmpVAper1fIlSRJeF8piqK5Gg0PDwvXKBwOC7uJREK4vplMhmuFEHdwo9HopIsuumhsX1/fxJkzZw5Eo1FbKpUyiCxzU1UVyWRSaIkccOrFLOqKjhuNRpFIJITceDwu7GYyGeE553I5YVdRFGGXMTaiGom6I6nRSNxUKiW8r7LZLNeyS+7gPvjgg+9eeeWVXRdffHHSZDKxuXPnOp1OZ/bqq6/m3RRkWUZfXx9EXMYYenp6hN3u7m4h1+fzwWg0CrmhUAi5XE7ITSQSiEQiQm4mk4HP5xNy8/k8+vv7hVxVVdHb23vWa+TxeFBaWirk+v1+MMaE3Gg0imQyKeSmUikEg8GiHy+0wnnBggXDIh5BEGcGOh1EEBqETgcRhAahRQYEoUHoqzJBaBAKLkFoEAouQWgQCi5BaBA6qkwQGoSOKhOEBuEObn9//8SdO3fOTyaTJaMxIYIgPhvuSx7fe++9S1taWqwLFixgAPBB0y9dPp/nHrzQJEnELbSoEHELY4u4hSZY5H42haZfojVSVVVTz3ek7qg2/Zo0adLhffv2XfHiiy/OeuCBB4580PTLLvJ7tdBQSqQpFGMMzc3NMJvN3C4AHDx4EBaLhduLRqNwu92IRCLcbjKZRHd3N1KpFLebzWbR0dEh9KLI5/NobW3l9oBTb3CijdkKNRJtzCZa33A4DK/Xy3XRfoF4PA6n04l4PM7tptNpHDt2DNlsltuVJInr8dyJOXLkSKXNZqtYsGBB15lo+qXT6YQaShWafom6siwLueey6VdlZaVw0y+r1XpOmn4xxs56jajp18fw8MMP9wLo5fUIgjhz0HlcgtAgFFyC0CAUXILQIBRcgtAgFFyC0CAUXILQIBRcgtAgFFyC0CAUXILQIBRcgtAg3MHds2fP2B//+MfLt2zZMm40JkQQxGfDfa3y73//+/k6na7k8ssv1ymKojt58uQEr9drdjgc3IMrigKv1wsRlzEm7AKnFguIuIFAAG63W8iNRqMYGBgQclOp1OmL53mRJAmDg4NCrizLwvtZVdUR1Ve0RkNDQ8I1CofDwjVKJBLCNRr1pl+TJ0+WAGSPHj16aX19vT+RSJRkMhl9LBbj3RRUVUU6nYaIyxhDJpMRcgEIu4lEQnjOI3HT6bTwnHO5nLCrKArVqEiSyaSwezaafjW2trZeWltb6zAajezyyy/vO3nyZHb+/Pm8m4Isy+jt7YWIW2gKJeoeP35cyPX5fDAYDEJuKBRCNpsVcgsd5ETcTCaDwcFBITefz6Ovr0/IVVUVPT09Z71GHo8HJSUlQq7f74eiKEJuodOfiJtKpeD3+4t+PHdwp02blpg2bVoTr0cQxJmDjioThAah4BKEBqHgEoQGoeAShAahTgajDGMMuVwOLpcLra2tOH78OE6cOIF0Ov2Zt+MsuB6PBx0dHejv74fT6UQmk+Fy29vb4Xa7uV2Xy4Xm5mb09PQUPWfi7MB/X9QzyOf5RVC47/OePXuwdu1aNDc3IxAIQFEUrFmzBpdeeinuuusu1NfXo6Sk5CNvYgW3tbUV3d3dGDduHMaPH48vfelLcLlcOHDgAMaOHYuFCxd+rCvLMtra2j7iLlmy5LQ7btw4XHvttf/mAqdO/xTmfPDgwdNzXrt2Lerq6vCd73wHX/va1z7WJc4e5zS4n2ey2SyefPJJPPPMM/92Qj4YDGLv3r1oamrCW2+9hd/85jcYP378R9wdO3agpqYG3/jGN2A2m0+HpBDq7u5ubN68GTfeeCOqq6tP/3sx7okTJz7WzWQyeOqpp/Db3/723+4rHAwGsWfPHjQ2NuLNN9/E008/jbFjx1J4zxEU3FFAURS88MILePLJJz/1MjZJkrB+/XoYjUasXbsWJSUlUBQFu3fvxqxZszBr1qx/C4ZOp4PRaMQll1yCMWPGYOfOnVi1ahWsVisURcGuXbs+0501axaqq6v/zX3++efx5JNPfurNuSVJwquvvgqz2Yy1a9fCarWObGcRQtDBqTMMYwwnTpzAmjVrirr2VFVVbNy4EW+88QYYY+jr6zsdrk/7NNPpdBg/fjxmz56NpqYmMMbgdDphNpu53Obm5o/MuZg76quqig0bNuDNN9/8XP/c+U+GO7iJRMIUiUTKMpmMWF+J/wK2bNkCn89X9OMzmQxefvllKIqC9vZ2zJs3r6ivoDqdDrNmzYLb7YYsy8JuPp/H5s2bMTw8zDXndevWCfcFIkYGd3A7OjrG33fffd/429/+VjcaE9I6qqpi//793J9Ex44dg9/vRzqdRnV1ddGeyWRCeXk5gsEgstksxowZw+Xa7XaEQiG0trZyz/nw4cNIJBJcDnFm4P6Ne80113h+/etfRxcuXNgrSZJ+586dlx88eNAu0kBLVVW0tLSgpIS/YydjDC0tLbDZbNwuALS2tsJut3N70WgULpcLyWTyY/89n8/D5XJxb3d4eBgbNmyAxWKBXl/8+6lOp4PJZMKmTZtgMpm4DhbpdDoYDAZs2rRJeJni5s2bP/GNplCj0tJS7m0D4jUKhUIYHBwUWqUTj8dx8uRJZDIZbjedTuPo0aNQFIXblSSJq/EXd3C7u7vtVqtVnjlzZhwAFi1a5AiFQuklS5bwbgqKoiAWi0HEZYwhHA4LucCpo6Qi7vDwMDo7O/HlL3/5Y/9dURS8+OKL3EGorq7GsmXL0NjYCFVViw4vYwz5fB5Lly5FUxPf2o/CUeYbbrgBb7zxBk6ePMnll5WVYenSpZ/4Ka+qKiKRiHB9RWs0ODiI7u5uXH/99dxuMBhEeXm50LixWAxGo1HITafTaGhoKPrx3ME9//zz03/4wx/eLPy/3W7PWq1WtaysjHdTkGUZVqsVIi5j7Jy4yWQSJSUln+gyxrBgwQK88847XNudOXMmpk2bho6ODkSj0aK/8sqyjHg8jqlTp+LIkSOIxWKorKws2k0mk5g8eTLmzp2LXbt2cc159uzZGD9+/CceWVZV9ZzUyG63f2qNPo1MJiPsKooi7Or1eq5vWty/cW02mzpu3Dj+BqAfw+f1HODNN9+MsWPHFv14s9mM1atXw2g0oq6uDm1tbUX/3jx58iQmTpwIk8mEuro6tLS0FOUyxtDT04OJEyfCbDajvr6e67e12WzGbbfdJtRjmBg55/R00OfxVIJOp0NdXR0eeOCBohp263Q63HTTTVixYgV0Oh1qa2sRjUbhdDo/df8UfiocPHgQV199NXQ6HWbMmFG0G4lE0NLSggULFkCn02H27Nm4//77i2pCrdPpsHz5ctx0002f2zff/3ToWuVRwGg04uGHH8Z99933qQfeDAYDbrzxRjz99NOnv14ZjUbccMMNaGpqwpEjRyDL8kdCWGjo3d/fj23btmHx4sWnD/78q6soyse6LpfrY90f/vCH+N73vvepF1UUxnj66aeFDwwSI4euVR4l7HY71qxZg4ULF+L5559He3s7YrEYGGOw2+2YNm0a7rzzTnz7299GRUXFR1ybzYb6+nrs378fGzZswOTJkzFx4kQYDAYEAgG4XC5YLBasXLkS5eXlH3kD/LD76quvcrl2ux1PPfUUrrnmGjz33HPo7Oz8yJynT5+Ob33rW7jzzjtRUVHxuX3j1QJ0yeMoodPpYLVasWrVKixbtgxOpxNHjx5FV1cXli9fjtraWlRUVHzsAQmdTgeLxYLrr78e6XQaHo8HfX19aGtrw1e/+lUsWbIE5eXlRbtutxuNjY1YsWLFZ7qFOd94441wOp1wOp147733cMstt3zqnImzCwV3lNHpdLDZbJg9ezZqampgs9kwb948LnfmzJmoqalBPB7H7Nmzud3JkyfD7/dzuXa7HXPmzMEll1yCZDJZ9JyJswO9dRKEBqHgEoQGoeAShAah4BKEBuEOrtvtLn/77bcv6+7uFrty/EPQ6QSCEIP7qPJPf/rTK/fu3Tvjvvvu0//oRz86rKqqrnBinxdVVSHqMsaE3YJ/tscdiXuu9tVIxtXinEdaX1VVRzTnYuEOrqIorLq6OmQ0Gi2SJOm3bNkyb//+/WWik21sbOT2gFM76cCBA8LnFA8cOACDwcDtRaNRuN1uBAIBbjeZTKKnp0e4KVRnZ6fQcrNcLodDhw5BlmVuV1GU03fJ4EVVVRw4cEDomxVjDI2NjUI1CofD8Pl8GBoa4nbj8TicTifC4TC3m06ncezYMaRSKW5XkiSu1zJ3cBcuXBhOJpMTqqqq/BaLRb355pubVVVN3HbbbbybgizLMBgMuP3227ndwgvpjjvuEHJVVRVyfT4f2tvbsXTpUm43FAph//79WL58ObebSCQwZswY1NfXc7uZTAY2mw233nort5vP52EymbB69Wput7A8UbRGjDEht9DqcvHixdyu3+9HS0sLli1bxu1Go1E0NDRg5cqV3G4qlcLrr79e9OO5g3vPPfccueeee47wegRBnDnoqDJBaBAKLkFoEAouQWgQCi5BaBAKLkFoEAouQWgQCi5BaBAKLkFoEAouQWgQussjQWgQ7uBu3759+oMPPri8o6OjaqSDf57v8kgQown3tcrr16+v9Xg87O9///sVc+bMecftdp8XCARMTqeTe3BFUeD3+yHiMsYQCASEXADCbiAQwNDQkJAbjUYxPDws5KZSKeF9JUmSsCvLsuZqNDQ0JFyjcDgs7CYSCeH6ZjIZrpal3MF98MEHW59//vkvmkymQD6f13m93qpQKGQcGBjg3RRUVUU4HIaIW7iTv4gLQNgNh8MIBAJCbjweF3bT6TSCwaCQm8vlEAqFhFxFUUZUI9FxAfEaBQIB4f0cjUaF93MymRR2s9ks17JL7uCed955huuvv967ePHiIyaTic2fP79nYGAgc9111/FuCrIsw+PxQMRljKG/v1/Y7evrE3J9Ph9KSkqE3FAoBMaYkJtIJJBKpYTcTCaDYDAo5ObzeXi9XiFXVVW43e6zXiOPx4OKigoh1+/3w2g0CrnRaBS5XE7IHfVlfbW1tcO1tbXFty4nCOKMQ6eDCEKDUHAJQoPQeVyC0CDUH5cgNAh94hKEBqFPXILQIHRwiiA0CAWXIDQI/cYlCA1SVHAlSTI0NDRcNjw8bHv77bcvbm5uHn8mBqffuAQhRlGXPCqKgl/96lcX3X///baNGzeOkyTJvGnTpk16vZ6pqqpnjEFRFO7BCw2SRFzgVPDPtjuSOY/UHcmcz8XzLbR6ORc10mp9i6Wo4JaWlirTp0/3AbDOmzcv2N/ffz4AfND068qRNv0SbQo1kqZfog2lYrEY+vv7EQwGud1C0694PM7tjqTpVz6fR1tb24iafolwrmo00qZffX19iEQi3G46nYbD4fjPafqVzWZNNptt+tGjR2N9fX3WCRMmePV6PbNYLIyafhXPuWz6VVpaek6aful0urNeI2r69QFWqzX/m9/8Zh33bAiCGBXoqDJBaBC6coogNAhdgEEQGoSCSxAahIJLEBqEgksQGoSCSxAahIJLEBqEgksQGoSCSxAapKjgJhIJ06OPPrqqvb295gc/+MHN+/btGzvaEyMI4pMp6lrlsrKy/MDAgJ8xZp04cWLw+PHj9muvvTYAAP39/WP9fr+pt7eXe/BC0y8RlzEm7AKn+suIuIFAAD6fT8iNRqMYGhoSclOpFIaHh4XcQtMvEbfQ9EvEVVX1nNRoaGhIuEaFlUUibiKREK7vqDX9slgspmw2a62srDTlcjkrAOTzed3Q0FBFJBIxDg4Ock9WVVVEIhGIuIwxYReAsBsOhxEKhYTceDwu7KbTaYTDYSE3l8sJu4WmX1qqUSAQQDAYFHKj0ahwjZLJpPC+GpWmX5IkGRcvXqwODg7aKysr1TFjxtgAwGQysauuuuqk2+3OLFq0iHuysixjYGAAIi5jDC6XS9h1Op1Crs/ng9VqFXJDoRBUVRVyE4kEksmkkJvJZBAIBITcfD6PwcFBIVdVVfT395/1Gnk8HpSXlwu5fr8fBoNByI1Go5AkScgdlWV9FotFvuWWW97lng1BEKMCHVUmCA1CwSUIDUIL6QlCg9BCeoLQIPRVmSA0CAWXIDQIBZcgNAgFlyA0CAWXIDRI0cFNpVJWWZb1yWTSmk6n+ftCEARxxigquLFYzFxfX7/6wIEDtY8++uj/efDBB78y2hMjCOKTKepa5YqKitzkyZMd5513Xq6+vt7x7LPPzgKAXC6n371795xDhw7Z7HY79+CqquLQoUMoLy/ndhljOHToECorK7ldADh8+DCqqqq4vUgkgr6+PkiSxO0mEgk4HA6h89eZTAaHDx+GyWTidnO5HNra2lBaWsrtKoqCtrY2lJWVcbuFGlVUVHC7gHiNQqEQPB4P0uk0txuLxdDT0yPUIC2VSqGzs1OoyZkkSVzNwooKbi6XMySTycl79uwp+/Of/zzngQceeB0AzGazOm/evF6v15tZuHAh92QVRcHw8DBEXMYYvF6vkAucWkEi4vr9fthsNiE3EolAr9cLuclkEtlsVsiVJAmxWEzIlWUZgUBAyFVVFT6fT7hGg4ODQq7X60VVVZWQGwwGYTabhdx4PA5FUYTcdDqN999/v+jHFxVcg8Gg/vKXv9yrKApbsmRJl9VqPf3WUFlZmbLZbOqYMWO4JyvLMmw2G0Rcxtg5cSVJQllZmfC4drtdyDWZTMJuJpMRfr75fF7YVVV1RDUqLS0VctPptPC+kmVZuL56vV54XIvFwtVStNjgsqlTp3q5Z0MQxKhAp4MIQoNQcAlCg1BwCUKDUHAJQoNQcAlCg1BwCUKDUHAJQoNQcAlCg1BwCUKDFBXcXC6nb25uvjgYDNqbm5tntre3n3cmBqe7PBKEGEVd8pjP53WPPfbYnJ/97GfK8ePHK3fs2HH51q1bNwAAY0z3wX+5B2eMnf4TcUXH/ddtiHhne1wtPt+R1PfD2xB1zkV9R/p8i6Wo4NpsNmXGjBmeqqoquba2NqTT6aYCgCRJ+tdee+2q999/v0xkGZSqqmhsbBQuzv79+7m9D7sin/jRaBQDAwPw+/3cbjKZRE9PDyKRCLebzWbR2dnJtfSrQC6Xw6FDh5DL5bhdRVHQ3NwMVVW53UJ9RRhJjQod97xe/svr4/E4+vr6EAqFuN10Og2Hw4FEIsHtSpLEtRywqOBms1mT0Wis3bZt2zi9Xq9cdNFFIQCwWCxqfX19E2Mscdttt3FPVpZlGI1G3H777dwuYww6nQ533nmnkAtAyPX5fGhvb8fSpUu53VAohP3792P58uXcbiKRwK5du1BfX8/tZjIZ2O123HrrrdxuPp+H2WzG6tWruV1VVWEwGHDHHXdwuyOpkcfjgcPhwOLFi7ldv9+PlpYWLFu2jNuNRqNoaGjAypUrud1RafpltVrzzzzzzMuFnWkwGOhO5gRxDim6P65er6ewEsR/CNQ7iCA0CPUOIggNQhdgEIQGoeAShAah37gEoUHoNy5BaBD6qkwQGoSCSxAahIJLEBqkqOAmk0nTE0888X+Hh4fH7N69e9pzzz03d7QnRhDEJ1PUJY8Wi0Xu6uqKHT16dNwzzzwzR1EU6f77728DAJ/PVxmJRHQej4d76YmiKAiHwzqPx8N9lIoxhg/GFTrCJer6/X4Eg0EhNxqNIhQKCbmpVEp4X0mSJOzKsjyiGom6gHiNfD6fcI1CoZCwm0gkhOubyWRUnhV2RQXXZDIxu92Od9999/zq6uqa7u5uQzgc1peVlbGTJ0+OHxwc/JvD4TjEO1lVVfVer/cKh8PRyusyxnRer/cLDoejhdcFAK/Xe6WIGw6HywcGBmocDsdxXjeRSNgGBgYudDgcR3ndTCZj9Xg8Mx0ORzuvm8vlTIODg3UOh+Mwr6soisHr9f6Pw+Fo43VHWCNhNxgMVrrd7nEOh6Ob141Go/aBgYHJDofjGK+bSqVKPB7PRQ6Ho5PXzWaz5lwuZy5a+PBi50/6y2Qyxj//+c9Lt27delU8Hi/55z//Oa3wb7lczvD666/PLmY7//ony7Ju+/btl4m4jDFs3br1f862GwgE7Pv27btIxI1GoyUNDQ0zRdxkMmnevXv3LBE3m80a33jjDaEa5fN5/Y4dO+aI7udt27ad9foODQ2VNzY2ThNxQ6FQ6XvvvTdDxI3H45a33377EhE3nU6b3nzzzUuLfXxRv3GtVqv87W9/+83ly5c3l5WVZVasWOEs/FtDQ8MFgUDAlkqluLvUNzc3X1heXi50FcbmzZunR6PR0kgkUvy71Ads2bLlgkgkYg8Gg1Zet6SkJNXb21sei8W4m836/f6xPp/v/Hg8buN1A4GA3uPxVO3bt28sr9vV1VUZDAYnvPvuuzN43T179lzo9/vLXS4X937eu3fvVL/fXxKLxYpehZbNZo2vvPLKor6+vqpIJGLetm3btGLdXC6nX79+/bWpVMrS1dU18ciRI9XFurIs6zZs2HB1OByucLvdYzZv3jyzWFdVVd3mzZuv8vl8YxOJRMnGjRvrcrlc0a/rf/7zn3M9Hs+EWbNmuV555ZUrinFGdFQ5HA4b1qxZc+WuXbvKDxw4UMPrDw8PJ1577bWid9CHGTNmTOCdd96p2rlz5zheN51Ox9auXXtRQ0PDBF73nXfemfTII498ye/3c3drbm1tnf7ee+/Zcrkc9+0knn322Su2b98+weVycbszZsyIdnR0yE6nk6v7eCqV0j322GPzf/GLX8xxuVxcHabT6bT+Jz/5yVV/+tOfxu3atavo8Ol0OvW1114rbW9vr2tsbKxet27dlYqiFBUCnU7Htm3bZna73eOdTqf5rbfeGl/suEajke3evVvf09NTM2bMGOdLL700N51OF/WGo9fr2d69e9XOzs5JRqMx/sILLyzIZrNFv1k1NzfnGxsbp/3ud7+74oknnrg6GAx+5vMdUXAZYzqz2czGjh2bVhSFu1X6lClTEjqdThEZ2+1221KplOXLX/4y9z1k6urqsnPmzBlMJBIWXnfv3r1fOP/888vdbnfRL4oC48ePP2QymeJ//OMfZ/O6yWSyrKamRmppafkCr2s0GpWurq6x11133QkeT1EUnclkyp133nm+XC7H9Q2jtLRUvffeew9bLJaJ+Xy+6BexxWJRa2pqYowx46RJkzITJ04sekyTycQmTZoUs1qt6lVXXRXnmS8AXHDBBVGDwcA6Ozsvmjx58snS0tKijxZNmTIlqtfrUVtbG/qgf3TR2ZoyZUqsvb29tKOj4zK73V7j8/k+85vgiIJbXV0tL1mypNdsNlddccUVHl4/Ho9PraysrHK5XNyfXn19fXXXXHONLh6Pc3/dfffdd2snTJhQsnDhwmFe98knn9z20EMPbZw1a1Y/r9vd3T2moqKi6oYbbnDxut/97nfbqqqqjPPnz+/hdcPhsOHaa691TZkyJc3jlZeXq9/85jcH5s6dq44bNy7AO+748eP1Cxcu7F+0aFFvsY4kScZJkyZNcrlclmQyaZ86dWpvsXdcyefzhgkTJlzQ1tY2tbe39wK73T5VVdWiPq1lWdZXV1dPOXr06DSPx3PpNddcY5JluShXVVWd3W6/sLe394I33nhj3oIFC7wmkylfjAsAFovlwkmTJpWtX7/+pbvuumvblClTsp/l6Bij64UJQmvQlVMEoUEouAShQSi4BKFBKLgEoUEouAShQSi4BKFBKLgEoUEouAShQSi4BKFB/h/uKyQQEcAo6gAAAABJRU5ErkJggg==" + "image/png": "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", + "text/plain": [ + "
" + ] }, "metadata": { "needs_background": "light" @@ -591,14 +608,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001B[32m\u001B[1mAlice\u001B[0m\u001B[32m\u001B[0m: {\n", + "\u001b[32m\u001b[1mAlice\u001b[0m\u001b[32m\u001b[0m: {\n", " \"thought\": \"My opponent is trying to block me. I should place my piece at [7, 9] to create a potential line for myself.\",\n", " \"move\": [\n", " 7,\n", " 9\n", " ]\n", "}\n", - "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", + "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -619,8 +636,10 @@ }, { "data": { - "text/plain": "
", - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAO4AAADnCAYAAAAZ4WrqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAAsTAAALEwEAmpwYAAAlPUlEQVR4nO2deXRU5f3/33eWzCQz2UCWRLaCAYSAX6WyqNCftixKxR81tLWidq+tHrucnm6nPV2O/mprj61d9LSn1lYsQsFaFtlcAhZIQgiQhDAkITPJZDKTzL7P3Jl77/P7Q4dv/RZlnicEvtd+Xufk9FjmdZ9n7mfes9x7n/uRGGMgCEJfGK70BAiC4IeCSxA6hIJLEDqEgksQOoSCSxA6hIJLEDqEgksQOoQ7uGfOnKnatGnTsuHh4bKxmBBBEBdH4r0A45577llZXV2t1NbWpr///e+3yLJsYowZx2h+BPEfg8lkUkwmk1rUY3k3riiKae7cuX6/318py7Jh165dHzx58uSj9fX1Nbzb0jQNp0+fxsKFC3lVMMbQ0dGB6667jtsFgPb2diE3mUxiZGQEs2bN4nYzmQwGBwcxe/ZsbleWZTidTlx77bXcrqIo6O7uxvz587ldTdPQ1dWFBQsWcLuMMXR2dl72+sbjcQSDQcycOZPbTaVS8Hq9qKur43az2Sz6+/sxd+5cbjefz7PS0tL/t2HDhs1FCYwxrr+//e1vMz7/+c9/vLW1dQJjDLIsm1944YUOJkA+n2fPP/+8iMo0TWN//vOfhd3nnntOyPV6vWzv3r1CbjAYZDt27BBy4/E427Ztm5CbTqfZ5s2bhdxcLsc2bdok5Kqqyv7yl78IuaOp0eDgIDtw4ICQOzIywnbv3i3kRiIR9ve//13ITSaTytatWx9kReaQ+xN3w4YN/Rs2bOjn9QiCuHTQUWWC0CFXNLiSJF3J4QlCt1zR4DJaUkgQQtBXZYLQIRRcgtAhFFyC0CEUXILQIRRcgtAhFFyC0CF0HpcgdAh3cA8fPjz1+9///r2XYnA6j0sQYnBfqzx9+nSfw+HQNE2TNE3DmTNnprjdbsupU6e4B9c0DW63GyIuY0zYBYDBwUEhNxgMwul0CrmxWAwul0vITafT6O/vF3JzuRwGBgaEXFVVhd0rVaORkRHhfRWJRITrm0wmheubzWYhy3LRj+cOriRJZlmWK2KxmLW8vDyraZrEGIOmabybgqZp5/9EEB33X8cWGVN03NG4mqbpzh3N8y34/0n7mQfu4BoMBusXv/jFnlAoVFZdXZ2pr68fdDgc8g033MC7KSiKAofDARGXvb3WU9Tt6OgQcn0+H1RVFXJDoRDi8biQm0gkMDw8LORmMhm4XC4hN5/Po7u7W8gtrOW93DXyeDwwGo1Crt/vRzabFXKj0ShCoZCQm0ql4PF4in48d3Bra2sj69ata+T1CIK4dNDpIILQIRRcgtAhFFyC0CEUXILQIXTlFEHoELoDBkHoEPqqTBA6hIJLEDqEgksQOoQ7uJFIxOL3+ysVRaEjSwRxheC+5PGPf/xjjcPhuHHFihWnPv3pT/eOxaQIgnhvuIN7//33Dz788MPzKyoq0oWmX83NzXajkb9hn6ZpaG5uhtls5nYZY2hpaYHFYuF2AaClpQVWq5Xbi0ajGBgYQDQa5XaTySS6u7uRTqe53Uwmg46ODiiKwu3mcjkcP35c6PSbqqpoamqCycT9Ujlf35KSEm63UF+RGoVCIXi9XoRCIW43Ho+jr68PiUSC202n0+jq6uJanldAlmWu2nJX47HHHltcWlo6Y968eU0Wi0VbtWpVezKZTN111128m4KqqshkMhBxGWNIJpNCLvDWahsRd3h4GJ2dnVi5ciW3Gw6HUVVVhbVr13K7iUQCFotFaM7ZbBYAhFxFUSDLspCraRrS6fRlr+/Q0BC6u7tx2223cbuBQABtbW1Ys2YNtxuLxWCz2bBu3TpuN51O49VXXy368dzB/fGPf3wql8t122y2BABYrda82WxmpaWlvJuCoigoKSmBiMsYG5VrNpuFXKvVKjzuaNzR7CsAws83n88Lj6tp2n9UjWRZHtW+MhiKP+TEHdzq6uoMgAyvRxDEpYNOBxGEDqHgEoQOoeAShA6h4BKEDqHgEoQOoeAShA6h4BKEDqHgEoQOoeAShA7hDu6RI0eu2r1796JgMMh/9TdBEJcE7ksenU6n/Oyzz87++Mc/nv3KV77SpSiKUdM0oVUrqqpCVVUhlzEm7AJvXRt6uec8GldRlFGNK/p8RzOupmmjqu9o5qzH+vLcg407uEuXLs20trb60+m0+e1lfYuamprKebcD/PeyL5ElgcBbS/NElgQCEF5OGIvF4Ha7EQ6Hud1UKoWenh4kk0luN5vNorOzE7lcjtvN5/Noa2sTbkbV3NzMdQF8AcYYmpubhZYEAuL1jUQi8Hq98Pv93G4ikYDT6UQsFuN2M5kMzpw5g0yG/1J+3rpy79Fdu3Z9wGg0Vi9btsxhsVi09evXH1MUJXHvvfwtcxVFgcFgwH333cftFt6RRV1VVYVcn8+H9vZ2oWVfoVAIR44cEVr2lUgkUF1djYaGBm43k8mgtLQU99xzD7ebz+dhNBqxceNGbrfwRnG5a+TxeOBwOISWXvr9frS2tgotvYxGo2hsbMT69eu53VQqhVdeeaXox3MH9xvf+EYvgEty5wu6rzJBiEH3VSYIHUKngwhCh1BwCUKHUO8ggtAh9BuXIHQIfVUmCB1CwSUIHULBJQgdQsElCB1CR5UJQodwBzcWixm+9rWv3enxeMaPdnA6qkwQYnBfq7xjx45rXnzxxWmf//zn22tqasJ9fX2TfD6f+ezZs9yDa5oGn88HEZcxJuwCb/UAEnGDwSA8Ho+QG4vFMDQ0JOSmUil4vV4hV5Zl4X2lqqruajQyMiJco3A4LOwmEgnh+mYyGa4VQtzBjUajU6655poJLperZs6cOYPRaNSWSqWMIsvcNE1DMpkUWiIHvPViFnVFx41Go0gkEkJuPB4XdjOZjPCcc7mcsKuqqrDLGBtVjUTd0dRoNG4qlRLeV9lslmvZJXdwH3nkkTduvPHGrrlz5ybNZjNbtGiR0+l0Zm+66SbeTUFRFLhcLoi4jDH09vYKuz09PUKuz+eDyWQSckOhEHK5nJCbSCQQiUSE3EwmA5/PJ+Tm83kMDAwIuZqmoa+v77LXyOPxoKysTMj1+/1gjAm50WgUyWRSyE2lUggGg0U/XmiF87Jly0ZEPIIgLg10OoggdAidDiIIHUKLDAhCh9BXZYLQIRRcgtAhFFyC0CEUXILQIXRUmSB0CB1VJggdwh3cgYGBmr179y5NJpOlYzEhgiAuDvclj2+++eb81tZW67JlyxgAvN30S8rn89yDF5okibiFFhUibmFsEbfQBIvci1No+iVaI03TdPV8R+uOadOvKVOmnDx8+PANzz777LyHH3741NtNv+wiv1cLDaVEmkIxxtDS0oKSkhJuFwCOHTsGi8XC7UWjUbjdbkQiEW43mUyip6cHqVSK281ms+jo6BB6UeTzeRw/fpzbA956gxNtzFaokWhjNtH6hsNheL1erov2C8TjcTidTsTjcW43nU7jzJkzyGaz3K4sy1yP507MqVOnqmw2W+WyZcu6LkXTL0mShBpKFZp+ibqKogi5V7LpV1VVlXDTL6vVekWafjHGLnuNqOnXBfj617/eB6CP1yMI4tJB53EJQodQcAlCh1BwCUKHUHAJQodQcAlCh1BwCUKHUHAJQodQcAlCh1BwCUKHUHAJQodwB/fgwYMTvv3tb697+eWXJ47FhAiCuDjc1yr/+te/XipJUun1118vqaoqnTt3brLX6y1xOBzcg6uqCq/XCxGXMSbsAm8tFhBxA4EA3G63kBuNRjE4OCjkplKp8xfP8yLLMoaGhoRcRVGE97OmaaOqr2iNhoeHhWsUDoeFa5RIJIRrNOZNv6ZNmyYDyJ4+fXp+Q0ODP5FIlGYyGUMsFuPdFDRNQzqdhojLGEMmkxFyAQi7iURCeM6jcdPptPCcc7mcsKuqKtWoSJLJpLB7OZp+NR0/fnx+XV2dw2Qyseuvv9517ty57NKlS3k3BUVR0NfXBxG30BRK1D179qyQ6/P5YDQahdxQKIRsNivkFjrIibiZTAZDQ0NCbj6fh8vlEnI1TUNvb+9lr5HH40FpaamQ6/f7oaqqkFvo9CfiplIp+P3+oh/PHdyZM2cmZs6c2czrEQRx6aCjygShQyi4BKFDKLgEoUMouAShQ4Q60l8q/hM6GTDGkM/n4fV60d3djbNnz2LOnDmYOnUqSktL33MfFFy/34+BgQEMDAzA6XSipqYGVqu1aNfj8cDtdnO7Xq8XHo8Hvb296O7u5p7zyMgIBgcHix6XKJ4rGtz3cyeDwn2fDx48iKeffhotLS0IBAJQVRVPPPEE5s+fj89+9rNoaGj4tzAU3OPHj6OnpwcTJ07EpEmT8OEPfxj9/f04evQoJkyYgOXLl1/QVRQFbW1t73BXr1593p04cSJuueWWC4Ywn8+fn/OxY8fOz/npp59GfX09Pve5z+FjH/tY0eOuXbu2qHEJPq5ocN/PZLNZPP7443jqqaf+7YR8MBjEoUOH0NzcjFdffRW/+MUvMGnSpHe4u3fvRm1tLT7xiU+gpKTk/Au9EOqenh5s374dd9xxB8aPH3/+34txu7u7L+hmMhn87Gc/wy9/+ct/u69wMBjEwYMH0dTUhH379uHJJ5/EhAkT3jHurl27cPXVV1903LVr12LcuHEU3lFAv3HHAFVV8fvf/x6PP/74e15FI8syNm/ejO985zvIZDLn3QMHDmDevHm46aabYLFY3vEClyQJJpMJ1157LVatWoW9e/eev5m2qqrYv3//Rd158+Zd0H3mmWfw+OOPv+fNwGVZxosvvojvfOc7511N07Bv3z7U19dfdNyVK1diz5493DcAJ94JBfcSwxhDd3c3nnjiiaKuPdU0DVu3bsWePXvAGIPL5Tr/In+vTyRJkjBp0iQsWLAAzc3NYIzB6XSipKSEy21paXnHnIsJlKZp2LJlC/bt2wfGGM6dOwer1Yq5c+dedNzJkydj/vz5OHbs2Pv6p9JYwx3cRCJhjkQi5ZlMRqyvxH8AL7/8Mnw+X9GPz2QyeP7556GqKtrb27F48eKivkZKkoR58+bB7XZDURRhN5/PY/v27RgZGeGa86ZNm5DL5dDe3o4lS5bAYLj4y0mSJNTX12NgYEC4pxAhENyOjo5JDz744Cf++te/1o/FhPSOpmk4cuQI96fJmTNn4Pf7kU6nMX78+KI9s9mMiooKBINBZLNZjBs3jsu12+0IhUI4fvw495xPnjyJcDiMfD6PyspKrnHLy8uRSCS4xiP+G+6DUzfffLPn5z//eXT58uV9siwb9u7de/2xY8fsIg20NE1Da2srSkv5O3YyxtDa2gqbzcbtAsDx48dht9u5vWg0iv7+fiSTyQv+ez6fR39/P/d2R0ZGsGXLFlgslqI+uQpIkgSz2Yxt27bBbDZzHfCRJAlGoxHbtm0TXqa4ffv2f/tNW+zYf//731FdXf2ujxGtUSgUwtDQkNAqnXg8jnPnzp0/5sBDOp3G6dOnoaoqtyvLMtfvfu7g9vT02K1WqzJnzpw4AKxYscIRCoXSq1ev5t0UVFVFLBaDiMsYQzgcFnKBt46SirgjIyPo7OzERz7ykQv+u6qqePbZZ7mDMH78eKxduxZNTU3QNK3o8BbOm65ZswbNzXxrPwpHe2+//Xbs2bMH586d4/LLy8uxevVqod+rjDGsWrXqXb8hMMaEazQ0NISenh7ceuut3G4wGERFRYXQuLFYDCaTSchNp9NobGws+vHcwb366qvTv/nNb/YV/ttut2etVqtWXl7OuykoigKr1QoRlzF2RdxkMonS0tJ3dRljWLZsGV5//XWu7c6ZMwczZ85ER0cHotFo0V95FUVBPB7HjBkzcOrUKcRiMVRVVRXtJpNJTJs2DYsWLcL+/fu55rxgwQJMnToVJ0+eRDKZLPrrsqqqSCaTmDx58ru2Oh1Njex2+3vW6L3IZDLCrqqqwq7BYOD6psX9G9dms2kTJ07kbwB6Ad6v5/HuvvtuTJgwoejHl5SUYOPGjTCZTKivr0dbW1vRn2Dnzp1DTU0NzGYz6uvr0draWpTLGENvby9qampQUlKChoYGrt/WJSUluPfee2G1WrnHPXv27PlxCTGu6Omg9+PpgMJR04cffrioht2SJOHOO+/EXXfdBUmSUFdXh2g0CqfT+Z77p/BT4dixY7jpppsgSRJmz55dtBuJRNDa2oply5ZBkiQsWLAADz30UFFNqCVJwrp163DnnXdCkiTMmTMH4XAYLperqHHb2tqwdOnS9+0b9+Xgigb3/Vo4k8mEr3/963jwwQff88Cb0WjEHXfcgSeffPL81yuTyYTbb78dzc3NOHXqFBRFeUcYCg29BwYGsHPnTqxcuRJlZWUXdFVVvaDb399/Qfeb3/wmvvzlL8Nqtb7nc7v99tvx5JNPnj8wWPj/jh49ivb29ncd1+VyYefOnVi1atX5cQkx6FrlMcJut+OJJ57A8uXL8cwzz6C9vR2xWAyMMdjtdsycORMPPPAAPvOZz/zbb0ObzYaGhgYcOXIEW7ZswbRp01BTUwOj0YhAIID+/n5YLBasX78eFRUV73gD/Ff3xRdf5HLtdjt+9rOf4eabb8bvfvc7dHZ2vmPOs2bNwqc//Wk88MADqKys/Df3vcZ1uVwoLS294LgEP3St8hghSRKsVis2bNiAtWvXwul04vTp0+jq6sK6detQV1eHysrKCx6QkCQJFosFt956K9LpNDweD1wuF9ra2vDRj34Uq1evRkVFRdGu2+1GU1MT7rrrrou6hTnfcccdcDqdcDqdePPNN/HJT37yonO2Wq247bbbzo/r9XrR2NiIu+++G2vWrHnXcQl+KLhjjCRJsNlsWLBgAWpra2Gz2bB48WIud86cOaitrUU8HseCBQu43WnTpsHv93O5drsdCxcuxLXXXotkMik057q6OgwMDBQ9LlE89PZHEDqEgksQOoSCSxA6hIJLEDqEO7hut7vitddeu66np2fUJ+LolABBiMF9VPmHP/zhjYcOHZr94IMPGr71rW+d1DRNKpxg50XTNIi6jDFht+Bf7nFH416pfTWacfU459HWV9O0Uc25WLiDq6oqGz9+fMhkMllkWTa8/PLLi48cOVIuOtmmpiZuD3hrJx09elT4vODRo0dhNBq5vWg0CrfbjUAgwO0mk0n09vYKN4Xq7OwUWm6Wy+Vw4sQJKIrC7aqqev4uGbxomoajR48KfbNijKGpqUmoRuFwGD6fD8PDw9xuPB6H0+lEOBzmdtPpNM6cOYNUKsXtyrLM9VrmDu7y5cvDyWRycnV1td9isWh33313i6ZpiXvvvZd3U1AUBUajEffddx+3W3gh3X///UKupmlCrs/nQ3t7O9asWcPthkIhHDlyBOvWreN2E4kExo0bh4aGBm43k8nAZrPhnnvu4Xbz+TzMZjM2btzI7RaWJ4rWiDEm5BZaXa5cuZLb9fv9aG1txdq1a7ndaDSKxsZGrF+/nttNpVJ45ZVXin48d3C/8IUvnPrCF75witcjCOLSQUeVCUKHUHAJQodQcAlCh1BwCUKHUHAJQodQcAlCh1BwCUKHUHAJQodQcAlCh9BdHglCh3AHd9euXbMeeeSRdR0dHe/e9KVI3s93eSSIsYT7WuXNmzfXeTwe9re//e2GhQsXvu52u68KBAJmp9PJPbiqqvD7/RBxGWMIBAJCLgBhNxAIYHh4WMiNRqMYGRkRclOplPC+kmVZ2FUURXc1Gh4eFq5ROBwWdhOJhHB9M5kMV9tR7uA+8sgjx5955pnbzGZzIJ/PS16vtzoUCpkGBwd5NwVN0xAOhyHiFu7kL+ICEHbD4TACgYCQG4/Hhd10Oo1gMCjk5nI5hEIhIVdV1VHVSHRcQLxGgUBAeD9Ho1Hh/ZxMJoXdbDbLteySO7hXXXWV8dZbb/WuXLnylNlsZkuXLu0dHBzMfOhDH+LdFBRFgcfjgYjLGMPAwICw63K5hFyfz4fS0lIhNxQKgTEm5CYSCaRSKSE3k8kgGAwKufl8Hl6vV8jVNA1ut/uy18jj8aCyslLI9fv9MJlMQm40GkUulxNyx3xZX11d3UhdXV3xrcsJgrjk0OkggtAhFFyC0CF0HpcgdAj1xyUIHUKfuAShQ+gTlyB0CB2cIggdQsElCB1Cv3EJQocUFVxZlo2NjY3XjYyM2F577bW5LS0tky7F4PQblyDEKOqSR1VV8dOf/vSahx56yLZ169aJsiyXbNu2bZvBYGCaphkYY1BVlXvwQoMkERd4K/iX2x3NnEfrjmbOV+L5Flq9XIka6bW+xVJUcMvKytRZs2b5AFgXL14cHBgYuBoA3m76deNom36JNoUaTdMv0YZSsVgMAwMDCAaD3G6h6Vc8Hud2R9P0K5/Po62tbVRNv0S4UjUabdMvl8uFSCTC7abTaTgcjv89Tb+y2azZZrPNOn36dMzlclknT57sNRgMzGKxMGr6VTxXsulXWVnZFWn6JUnSZa8RNf16G6vVmv/FL36xiXs2BEGMCXRUmSB0CF05RRA6hC7AIAgdQsElCB1CwSUIHULBJQgdQsElCB1CwSUIHULBJQgdQsElCB1SVHATiYT5u9/97ob29vbar371q3cfPnx4wlhPjCCId6eoa5XLy8vzg4ODfsaYtaamJnj27Fn7LbfcEgCAgYGBCX6/39zX18c9eKHpl4jLGBN2gbf6y4i4gUAAPp9PyI1GoxgeHhZyU6kURkZGhNxC0y8Rt9D0S8TVNO2K1Gh4eFi4RoWVRSJuIpEQru+YNf2yWCzmbDZrraqqMudyOSsA5PN5aXh4uDISiZiGhoa4J6tpGiKRCERcxpiwC0DYDYfDCIVCQm48Hhd20+k0wuGwkJvL5YTdQtMvPdUoEAggGAwKudFoVLhGyWRSeF+NSdMvWZZNK1eu1IaGhuxVVVXauHHjbABgNpvZkiVLzrnd7syKFSu4J6soCgYHByHiMsbQ398v7DqdTiHX5/PBarUKuaFQCJqmCbmJRALJZFLIzWQyCAQCQm4+n8fQ0JCQq2kaBgYGLnuNPB4PKioqhFy/3w+j0SjkRqNRyLIs5I7Jsj6LxaJ88pOffIN7NgRBjAl0VJkgdAgFlyB0CC2kJwgdQgvpCUKH0FdlgtAhFFyC0CEUXILQIRRcgtAhFFyC0CFFBzeVSlkVRTEkk0lrOp3m7wtBEMQlo6jgxmKxkoaGho1Hjx6t++53v/t/HnnkkVVjPTGCIN6doq5VrqyszE2bNs1x1VVX5RoaGhy//e1v5wFALpczHDhwYOGJEydsdrude3BN03DixAlUVFRwu4wxnDhxAlVVVdwuAJw8eRLV1dXcXiQSgcvlgizL3G4ikYDD4RA6f53JZHDy5EmYzWZuN5fLoa2tDWVlZdyuqqpoa2tDeXk5t1uoUWVlJbcLiNcoFArB4/EgnU5zu7FYDL29vUIN0lKpFDo7O4WanMmyzNUsrKjg5nI5YzKZnHbw4MHyP/3pTwsffvjhVwCgpKREW7x4cZ/X680sX76ce7KqqmJkZAQiLmMMXq9XyAXeWkEi4vr9fthsNiE3EonAYDAIuclkEtlsVsiVZRmxWEzIVRQFgUBAyNU0DT6fT7hGQ0NDQq7X60V1dbWQGwwGUVJSIuTG43GoqirkptNp/POf/yz68UUF12g0ao899tghVVXZ6tWru6xW6/m3hqqqqpTNZtPGjRvHPVlFUWCz2SDiMsauiCvLMsrLy4XHtdvtQq7ZbBZ2M5mM8PPN5/PCrqZpo6pRWVmZkJtOp4X3laIowvU1GAzC41osFq6WosUGl82YMcPLPRuCIMYEOh1EEDqEgksQOoSCSxA6hIJLEDqEgksQOoSCSxA6hIJLEDqEgksQOoSCSxA6pKjg5nI5Q0tLy9xgMGhvaWmZ097eftWlGJzu8kgQYhR1yWM+n5e+973vLfzRj36knj17tmr37t3X79ixYwsAMMakt/+Xe3DG2Pk/EVd03P+5DRHvco+rx+c7mvr+6zZEnStR39E+32IpKrg2m02dPXu2p7q6WqmrqwtJkjQDAGRZNrz00ktL/vnPf5aLLIPSNA1NTU3CxTly5Ai396+uyCd+NBrF4OAg/H4/t5tMJtHb24tIJMLtZrNZdHZ2ci39KpDL5XDixAnkcjluV1VVtLS0QNM0brdQXxFGU6NCxz2vl//y+ng8DpfLhVAoxO2m02k4HA4kEgluV5ZlruWARQU3m82aTSZT3c6dOycaDAb1mmuuCQGAxWLRGhoamhljiXvvvZd7soqiwGQy4b777uN2GWOQJAkPPPCAkAtAyPX5fGhvb8eaNWu43VAohCNHjmDdunXcbiKRwP79+9HQ0MDtZjIZ2O123HPPPdxuPp9HSUkJNm7cyO1qmgaj0Yj777+f2x1NjTweDxwOB1auXMnt+v1+tLa2Yu3atdxuNBpFY2Mj1q9fz+2OSdMvq9Waf+qpp54v7Eyj0Uh3MieIK0jR/XENBgOFlSD+l0C9gwhCh1DvIILQIXQBBkHoEAouQegQ+o1LEDqEfuMShA6hr8oEoUMouAShQyi4BKFDigpuMpk0P/roo/93ZGRk3IEDB2b+7ne/WzTWEyMI4t0p6pJHi8WidHV1xU6fPj3xqaeeWqiqqvzQQw+1AYDP56uKRCKSx+PhXnqiqirC4bDk8Xi4j1IxxvD2uEJHuERdv9+PYDAo5EajUYRCISE3lUoJ7ytZloVdRVFGVSNRFxCvkc/nE65RKBQSdhOJhHB9M5mMxrPCrqjgms1mZrfb8cYbb1w9fvz42p6eHmM4HDaUl5ezc+fOTRoaGvqrw+E4wTtZTdMMXq/3BofDcZzXZYxJXq/3gw6Ho5XXBQCv13ujiBsOhysGBwdrHQ7HWV43kUjYBgcHP+BwOE7zuplMxurxeOY4HI52XjeXy5mHhobqHQ7HSV5XVVWj1+v9L4fD0cbrjrJGwm4wGKxyu90THQ5HD68bjUbtg4OD0xwOxxleN5VKlXo8nmscDkcnr5vNZktyuVxJ0cK/LnZ+t79MJmP605/+tGbHjh1L4vF46T/+8Y+ZhX/L5XLGV155ZUEx2/mff4qiSLt27bpOxGWMYceOHf91ud1AIGA/fPjwNSJuNBotbWxsnCPiJpPJkgMHDswTcbPZrGnPnj1CNcrn84bdu3cvFN3PO3fuvOz1HR4ermhqapop4oZCobI333xztogbj8ctr7322rUibjqdNu/bt29+sY8v6jeu1WpVPvOZz+xbt25dS3l5eeauu+5yFv6tsbFxaiAQsKVSKe4u9S0tLR+oqKgQugpj+/bts6LRaFkkEin+XeptXn755amRSMQeDAatvG5paWmqr6+vIhaLcTeb9fv9E3w+39XxeNzG6wYCAYPH46k+fPjwBF63q6urKhgMTn7jjTdm87oHDx78gN/vr+jv7+fez4cOHZrh9/tLY7FY0avQstms6YUXXljhcrmqI5FIyc6dO2cW6+ZyOcPmzZtvSaVSlq6urppTp06NL9ZVFEXasmXLTeFwuNLtdo/bvn37nGJdTdOk7du3L/H5fBMSiUTp1q1b63O5XNGv63/84x+LPB7P5Hnz5vW/8MILNxTjjOqocjgcNj7xxBM37t+/v+Lo0aO1vP7IyEjipZdeKnoH/Svjxo0LvP7669V79+6dyOum0+nY008/fU1jY+NkXvf111+f8o1vfOPDfr+fu1vz8ePHZ7355pu2XC7HfTuJ3/72tzfs2rVrcn9/P7c7e/bsaEdHh+J0Orm6j6dSKel73/ve0p/85CcL+/v7uTpMp9Npww9+8IMlf/zjHyfu37+/6PBJkqS99NJLZe3t7fVNTU3jN23adKOqqkWFQJIktnPnzhK32z3J6XSWvPrqq5OKHddkMrEDBw4Yent7a8eNG+d87rnnFqXT6aLecAwGAzt06JDW2dk5xWQyxX//+98vy2azRb9ZtbS05Juammb+6le/uuHRRx+9KRgMXvT5jiq4jDGppKSETZgwIa2qKner9OnTpyckSVJFxna73bZUKmX5yEc+wn0Pmfr6+uzChQuHEomEhdc9dOjQB6+++uoKt9td9IuiwKRJk06Yzeb4H/7whwW8bjKZLK+trZVbW1s/yOuaTCa1q6trwoc+9KFuHk9VVclsNueuuuoqXy6X4/qGUVZWpn3xi188abFYavL5fNEvYovFotXW1sYYY6YpU6Zkampqih7TbDazKVOmxKxWq7ZkyZI4z3wBYOrUqVGj0cg6OzuvmTZt2rmysrKijxZNnz49ajAYUFdXF3q7f3TR2Zo+fXqsvb29rKOj4zq73V7r8/ku+k1wVMEdP368snr16r6SkpLqG264wcPrx+PxGVVVVdX9/f3cn14ul6v+5ptvluLxOPfX3TfeeKNu8uTJpcuXLx/hdR9//PGdX/va17bOmzdvgNft6ekZV1lZWX377bf387pf+tKX2qqrq01Lly7t5XXD4bDxlltu6Z8+fXqax6uoqNA+9alPDS5atEibOHFigHfcSZMmGZYvXz6wYsWKvmIdWZZNU6ZMmdLf329JJpP2GTNm9BV7x5V8Pm+cPHny1La2thl9fX1T7Xb7DE3Tivq0VhTFMH78+OmnT5+e6fF45t98881mRVGKcjVNk+x2+wf6+vqm7tmzZ/GyZcu8ZrM5X4wLABaL5QNTpkwp37x583Of/exnd06fPj17MUdijK4XJgi9QVdOEYQOoeAShA6h4BKEDqHgEoQOoeAShA6h4BKEDqHgEoQOoeAShA6h4BKEDvn/RevMzWmw9XQAAAAASUVORK5CYII=" + "image/png": "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", + "text/plain": [ + "
" + ] }, "metadata": { "needs_background": "light" @@ -631,14 +650,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001B[35m\u001B[1mBob\u001B[0m\u001B[35m\u001B[0m: {\n", + "\u001b[35m\u001b[1mBob\u001b[0m\u001b[35m\u001b[0m: {\n", " \"thought\": \"Alice is trying to create a line horizontally again. I need to block her next move otherwise she will have a chance to win. I will place my piece at [7, 10].\",\n", " \"move\": [\n", " 7,\n", " 10\n", " ]\n", "}\n", - "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", + "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -659,8 +678,10 @@ }, { "data": { - "text/plain": "
", - "image/png": "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" + "image/png": "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", + "text/plain": [ + "
" + ] }, "metadata": { "needs_background": "light" @@ -671,14 +692,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001B[32m\u001B[1mAlice\u001B[0m\u001B[32m\u001B[0m: {\n", + "\u001b[32m\u001b[1mAlice\u001b[0m\u001b[32m\u001b[0m: {\n", " \"thought\": \"My opponent is trying to block me. I should place my piece at [6, 7] to create a potential line for myself.\",\n", " \"move\": [\n", " 6,\n", " 7\n", " ]\n", "}\n", - "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", + "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -699,8 +720,10 @@ }, { "data": { - "text/plain": "
", - "image/png": "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a7PZmnldAHC5XLeLuMFgsGxwcHCCzWY7x+vGYjHL4ODgZ2w2Wwevm0qlzE6nc7bNZmvldbPZrHFoaKjWZrOd5nUVRdG7XK5bbTZbC687wjESdv1+f8XAwMBYm83WxeuGw2Hr4ODgFJvNdpbXTSQSxU6nc6bNZmvnddPpdFE2my0qWPjzxc6X+kulUobf/e53q3fv3n1HNBot/uMf/zg9/1g2m9W/+eabCwrZz1/+ybIs7d279xYRlzGG3bt333q9XZ/PZz1y5MhMETccDhc3NDTMFnHj8XjRoUOH5om46XTasH//fqExyuVyun379i0UPc579uy57uM7PDxc1tjYOF3EDQQCJe+///4sETcajZrefvvtuSJuMpk0vvXWW/ML3b6g37hms1n+2te+9tbatWubSktLUw8++KA9/1hDQ8Nkn89nSSQS3FXqm5qaPlNWViY0C2Pnzp0zwuFwSSgUKvxd6iN27do1ORQKWf1+v5nXLS4uTvT29pZFIhHuYrNer3eM2+2eGI1GLbyuz+fTOZ3OyiNHjozhdTs7Oyv8fv/4w4cPz+J133333c94vd6yvr4+7uP83nvvTfN6vcWRSKTgVWjpdNqwbdu2FQ6HozIUChXt2bNneqFuNpvVbd++/a5EImHq7OysPnPmTFWhrizL0iuvvHJnMBgsHxgYGLVz587Zhbqqqko7d+68w+12j4nFYsU7duyozWazBb+u//jHPy52Op3j582b17dt27ZFhTgjOqscDAb1mzdvvv3gwYNlx44dm8Drezye2Ouvv17wAfpzRo0a5XvnnXcqDxw4MJbXTSaTkS1btsxsaGgYz+u+8847k773ve993uv1cldrPnny5Iz333/fks1muW8n8atf/WrR3r17x/f19XG7s2bNCre1tcl2u52r+ngikZB++MMfLv23f/u3hX19fVwVppPJpO7HP/7xHb/97W/HHjx4sODwSZKkvv766yWtra21jY2NVS+++OLtiqIUFAJJktiePXuKBgYGxtnt9qI//elP4wpt12AwsEOHDum6u7snjBo1yv78888vTiaTBb3h6HQ69t5776nt7e2TDAZD9De/+U1dOp0u+M2qqakp19jYOP2///u/Fz3zzDN3+v3+Kz7fEQWXMSYVFRWxMWPGJBVF4S6VPnXq1JgkSYpI2wMDA5ZEImH6whe+wH0Pmdra2vTChQuHYrGYidd97733Pjtx4sSygYGBgl8UecaNG3fKaDRG//d//3cBrxuPx0snTJiQaW5u/iyvazAYlM7OzjGf+9znzvN4iqJIRqMxO3r0aHc2m+X6hlFSUqJ+61vfOm0ymapzuVzBL2KTyaROmDAhwhgzTJo0KVVdXV1wm0ajkU2aNCliNpvVO+64I8rTXwCYPHlyWK/Xs/b29plTpkzpKSkpKfhs0dSpU8M6nQ41NTWBj+pHF5ytqVOnRlpbW0va2tpusVqtE9xu9xW/CY4ouFVVVfKqVat6i4qKKhctWuTk9aPR6LSKiorKvr4+7k8vh8NRu2zZMikajXJ/3T18+HDN+PHji5cvX+7hdZ999tk93/nOd3bMmzevn9ft6uoaVV5eXnnffff18brf/va3WyorKw1Lly7t5nWDwaD+rrvu6ps6dWqSxysrK1P/5m/+ZnDx4sXq2LFjfbztjhs3Trd8+fL+FStW9BbqZDIZw6RJkyb19fWZ4vG4ddq0ab2F3nEll8vpx48fP7mlpWVab2/vZKvVOk1V1YI+rWVZ1lVVVU3t6OiY7nQ65y9btswoy3JBrqqqktVq/Uxvb+/k/fv3L6mrq3MZjcZcIS4AmEymz0yaNKl0+/btz3/961/fM3Xq1PSVHIkxmi9MEFqDZk4RhAah4BKEBqHgEoQGoeAShAah4BKEBqHgEoQGoeAShAah4BKEBqHgEoQG+X/Dcc4OaIWRHwAAAABJRU5ErkJggg==" + "image/png": "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a7PZmnldAHC5XLeLuMFgsGxwcHCCzWY7x+vGYjHL4ODgZ2w2Wwevm0qlzE6nc7bNZmvldbPZrHFoaKjWZrOd5nUVRdG7XK5bbTZbC687wjESdv1+f8XAwMBYm83WxeuGw2Hr4ODgFJvNdpbXTSQSxU6nc6bNZmvnddPpdFE2my0qWPjzxc6X+kulUobf/e53q3fv3n1HNBot/uMf/zg9/1g2m9W/+eabCwrZz1/+ybIs7d279xYRlzGG3bt333q9XZ/PZz1y5MhMETccDhc3NDTMFnHj8XjRoUOH5om46XTasH//fqExyuVyun379i0UPc579uy57uM7PDxc1tjYOF3EDQQCJe+///4sETcajZrefvvtuSJuMpk0vvXWW/ML3b6g37hms1n+2te+9tbatWubSktLUw8++KA9/1hDQ8Nkn89nSSQS3FXqm5qaPlNWViY0C2Pnzp0zwuFwSSgUKvxd6iN27do1ORQKWf1+v5nXLS4uTvT29pZFIhHuYrNer3eM2+2eGI1GLbyuz+fTOZ3OyiNHjozhdTs7Oyv8fv/4w4cPz+J133333c94vd6yvr4+7uP83nvvTfN6vcWRSKTgVWjpdNqwbdu2FQ6HozIUChXt2bNneqFuNpvVbd++/a5EImHq7OysPnPmTFWhrizL0iuvvHJnMBgsHxgYGLVz587Zhbqqqko7d+68w+12j4nFYsU7duyozWazBb+u//jHPy52Op3j582b17dt27ZFhTgjOqscDAb1mzdvvv3gwYNlx44dm8Drezye2Ouvv17wAfpzRo0a5XvnnXcqDxw4MJbXTSaTkS1btsxsaGgYz+u+8847k773ve993uv1cldrPnny5Iz333/fks1muW8n8atf/WrR3r17x/f19XG7s2bNCre1tcl2u52r+ngikZB++MMfLv23f/u3hX19fVwVppPJpO7HP/7xHb/97W/HHjx4sODwSZKkvv766yWtra21jY2NVS+++OLtiqIUFAJJktiePXuKBgYGxtnt9qI//elP4wpt12AwsEOHDum6u7snjBo1yv78888vTiaTBb3h6HQ69t5776nt7e2TDAZD9De/+U1dOp0u+M2qqakp19jYOP2///u/Fz3zzDN3+v3+Kz7fEQWXMSYVFRWxMWPGJBVF4S6VPnXq1JgkSYpI2wMDA5ZEImH6whe+wH0Pmdra2vTChQuHYrGYidd97733Pjtx4sSygYGBgl8UecaNG3fKaDRG//d//3cBrxuPx0snTJiQaW5u/iyvazAYlM7OzjGf+9znzvN4iqJIRqMxO3r0aHc2m+X6hlFSUqJ+61vfOm0ymapzuVzBL2KTyaROmDAhwhgzTJo0KVVdXV1wm0ajkU2aNCliNpvVO+64I8rTXwCYPHlyWK/Xs/b29plTpkzpKSkpKfhs0dSpU8M6nQ41NTWBj+pHF5ytqVOnRlpbW0va2tpusVqtE9xu9xW/CY4ouFVVVfKqVat6i4qKKhctWuTk9aPR6LSKiorKvr4+7k8vh8NRu2zZMikajXJ/3T18+HDN+PHji5cvX+7hdZ999tk93/nOd3bMmzevn9ft6uoaVV5eXnnffff18brf/va3WyorKw1Lly7t5nWDwaD+rrvu6ps6dWqSxysrK1P/5m/+ZnDx4sXq2LFjfbztjhs3Trd8+fL+FStW9BbqZDIZw6RJkyb19fWZ4vG4ddq0ab2F3nEll8vpx48fP7mlpWVab2/vZKvVOk1V1YI+rWVZ1lVVVU3t6OiY7nQ65y9btswoy3JBrqqqktVq/Uxvb+/k/fv3L6mrq3MZjcZcIS4AmEymz0yaNKl0+/btz3/961/fM3Xq1PSVHIkxmi9MEFqDZk4RhAah4BKEBqHgEoQGoeAShAah4BKEBqHgEoQGoeAShAah4BKEBqHgEoQG+X/Dcc4OaIWRHwAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] }, "metadata": { "needs_background": "light" @@ -711,14 +734,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001B[35m\u001B[1mBob\u001B[0m\u001B[35m\u001B[0m: {\n", + "\u001b[35m\u001b[1mBob\u001b[0m\u001b[35m\u001b[0m: {\n", " \"thought\": \"Alice is trying to build a vertical line now. I need to block her next move otherwise she will have a chance to win. I will place my piece at [5, 7].\",\n", " \"move\": [\n", " 5,\n", " 7\n", " ]\n", "}\n", - "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", + "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -739,8 +762,10 @@ }, { "data": { - "text/plain": "
", - "image/png": "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" + "image/png": "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", + "text/plain": [ + "
" + ] }, "metadata": { "needs_background": "light" @@ -751,14 +776,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001B[32m\u001B[1mAlice\u001B[0m\u001B[32m\u001B[0m: {\n", + "\u001b[32m\u001b[1mAlice\u001b[0m\u001b[32m\u001b[0m: {\n", " \"thought\": \"My opponent is trying to block me. I should place my piece at [8, 7] to create a potential line for myself.\",\n", " \"move\": [\n", " 8,\n", " 7\n", " ]\n", "}\n", - "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", + "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -779,8 +804,10 @@ }, { "data": { - "text/plain": "
", - "image/png": "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" + "image/png": "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", + "text/plain": [ + "
" + ] }, "metadata": { "needs_background": "light" @@ -791,7 +818,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001B[35m\u001B[1mBob\u001B[0m\u001B[35m\u001B[0m: {\n", + "\u001b[35m\u001b[1mBob\u001b[0m\u001b[35m\u001b[0m: {\n", " \"thought\": \"Alice is trying to build a vertical line again. I need to block her next move otherwise she will have a chance to win. I will place my piece at [9, 7].\",\n", " \"move\": [\n", " 9,\n", @@ -824,17 +851,13 @@ " msg = player(msg)\n", " \n", " i += 1" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2024-03-27T08:10:33.989202Z", - "start_time": "2024-03-27T08:09:59.446824Z" - } - } + ] }, { "cell_type": "markdown", + "metadata": { + "collapsed": false + }, "source": [ "## Future Direction\n", "\n", @@ -845,10 +868,7 @@ "- Fine tune a model to improve the performance of the agent\n", "\n", "For complete code, we provide in [code/game_gomoku.py](./code/game_gomoku.py)." - ], - "metadata": { - "collapsed": false - } + ] } ], "metadata": { From 6e9dca67edc51ae27d6239663103198a96f6bc7d Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Wed, 22 May 2024 20:45:57 +0800 Subject: [PATCH 29/55] revert unnecessary changes --- examples/game_gomoku/main.ipynb | 254 +++++++++++++++----------------- 1 file changed, 117 insertions(+), 137 deletions(-) diff --git a/examples/game_gomoku/main.ipynb b/examples/game_gomoku/main.ipynb index 569321c15..04be0c07b 100644 --- a/examples/game_gomoku/main.ipynb +++ b/examples/game_gomoku/main.ipynb @@ -31,13 +31,6 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-27T08:09:57.602994Z", - "start_time": "2024-03-27T08:09:57.565787Z" - }, - "collapsed": false - }, "outputs": [], "source": [ "YOUR_MODEL_CONFIGURATION_NAME = \"{YOUR_MODEL_CONFIGURATION_NAME}\"\n", @@ -46,31 +39,31 @@ " \n", " # ...\n", "}" - ] + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-03-27T08:09:57.602994Z", + "start_time": "2024-03-27T08:09:57.565787Z" + } + } }, { "cell_type": "markdown", - "metadata": { - "collapsed": false - }, "source": [ "## Step 1: Prepare a board for Gomoku\n", "\n", "First we create a `BoardAgent` class by inheriting from `AgentBase`, which manage the game board and update the game status as follows.\n", "\n", "To create a better visual experience, we also provide a function `board2img` to convert the board to an image. " - ] + ], + "metadata": { + "collapsed": false + } }, { "cell_type": "code", "execution_count": 2, - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-27T08:09:58.153932Z", - "start_time": "2024-03-27T08:09:57.571266Z" - }, - "collapsed": false - }, "outputs": [], "source": [ "import numpy as np\n", @@ -110,27 +103,26 @@ " plt.savefig(save_path, bbox_inches='tight', pad_inches=0.1)\n", " plt.close(fig) # Close the figure to free memory\n", " return save_path" - ] + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-03-27T08:09:58.153932Z", + "start_time": "2024-03-27T08:09:57.571266Z" + } + } }, { "cell_type": "markdown", - "metadata": { - "collapsed": false - }, "source": [ "The following code shows the implementation of the `BoardAgent` class. The agent manages the game board and updates the game status." - ] + ], + "metadata": { + "collapsed": false + } }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-27T08:09:59.392069Z", - "start_time": "2024-03-27T08:09:58.159470Z" - }, - "collapsed": false - }, "outputs": [], "source": [ "import numpy as np\n", @@ -237,13 +229,18 @@ " else:\n", " count = 0\n", " return False\n" - ] + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-03-27T08:09:59.392069Z", + "start_time": "2024-03-27T08:09:58.159470Z" + } + }, + "execution_count": 3 }, { "cell_type": "markdown", - "metadata": { - "collapsed": false - }, "source": [ "### Step2: Prepare a Gomoku Player Agent\n", "\n", @@ -253,18 +250,13 @@ "2. Within the agent, to enable the agent to think, we ask LLMs to respond in a dictionary format, which contains the thought and the move (\"thought\" field must come before \"move\"). To achieve this, we prepare a parsing function to extract the dictionary from response. \n", "\n", "The implementation of the Gomoku agent is as follows: " - ] + ], + "metadata": { + "collapsed": false + } }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-27T08:09:59.397713Z", - "start_time": "2024-03-27T08:09:59.392729Z" - }, - "collapsed": false - }, "outputs": [], "source": [ "import json\n", @@ -335,7 +327,15 @@ " \n", " # Hide thought from the response\n", " return Msg(self.name, response[\"move\"], role=\"assistant\") \n" - ] + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-03-27T08:09:59.397713Z", + "start_time": "2024-03-27T08:09:59.392729Z" + } + }, + "execution_count": 4 }, { "cell_type": "markdown", @@ -346,25 +346,17 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-27T08:09:59.446367Z", - "start_time": "2024-03-27T08:09:59.398116Z" - }, - "collapsed": false - }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\u001b[32m2024-03-27 16:09:59.427\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36magentscope.models\u001b[0m:\u001b[36mread_model_configs\u001b[0m:\u001b[36m171\u001b[0m - \u001b[1mLoad configs for model wrapper: post_api\u001b[0m\n", - "\u001b[32m2024-03-27 16:09:59.435\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36magentscope.utils.monitor\u001b[0m:\u001b[36m_create_monitor_table\u001b[0m:\u001b[36m341\u001b[0m - \u001b[1mInit [monitor_metrics] as the monitor table\u001b[0m\n", - "\u001b[32m2024-03-27 16:09:59.435\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36magentscope.utils.monitor\u001b[0m:\u001b[36m_create_monitor_table\u001b[0m:\u001b[36m342\u001b[0m - \u001b[1mInit [monitor_metrics_quota_exceeded] as the monitor trigger\u001b[0m\n", - "\u001b[32m2024-03-27 16:09:59.436\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36magentscope.utils.monitor\u001b[0m:\u001b[36m__init__\u001b[0m:\u001b[36m311\u001b[0m - \u001b[1mSqliteMonitor initialization completed at [./runs/run_20240327-160958_kbf2ta/agentscope.db]\u001b[0m\n", - "\u001b[32m2024-03-27 16:09:59.440\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36magentscope.models.model\u001b[0m:\u001b[36m__init__\u001b[0m:\u001b[36m257\u001b[0m - \u001b[1mInitialize model [post_api]\u001b[0m\n", - "\u001b[32m2024-03-27 16:09:59.441\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36magentscope.models.model\u001b[0m:\u001b[36m__init__\u001b[0m:\u001b[36m257\u001b[0m - \u001b[1mInitialize model [post_api]\u001b[0m\n" + "\u001B[32m2024-03-27 16:09:59.427\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36magentscope.models\u001B[0m:\u001B[36mread_model_configs\u001B[0m:\u001B[36m171\u001B[0m - \u001B[1mLoad configs for model wrapper: post_api\u001B[0m\n", + "\u001B[32m2024-03-27 16:09:59.435\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36magentscope.utils.monitor\u001B[0m:\u001B[36m_create_monitor_table\u001B[0m:\u001B[36m341\u001B[0m - \u001B[1mInit [monitor_metrics] as the monitor table\u001B[0m\n", + "\u001B[32m2024-03-27 16:09:59.435\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36magentscope.utils.monitor\u001B[0m:\u001B[36m_create_monitor_table\u001B[0m:\u001B[36m342\u001B[0m - \u001B[1mInit [monitor_metrics_quota_exceeded] as the monitor trigger\u001B[0m\n", + "\u001B[32m2024-03-27 16:09:59.436\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36magentscope.utils.monitor\u001B[0m:\u001B[36m__init__\u001B[0m:\u001B[36m311\u001B[0m - \u001B[1mSqliteMonitor initialization completed at [./runs/run_20240327-160958_kbf2ta/agentscope.db]\u001B[0m\n", + "\u001B[32m2024-03-27 16:09:59.440\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36magentscope.models.model\u001B[0m:\u001B[36m__init__\u001B[0m:\u001B[36m257\u001B[0m - \u001B[1mInitialize model [post_api]\u001B[0m\n", + "\u001B[32m2024-03-27 16:09:59.441\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36magentscope.models.model\u001B[0m:\u001B[36m__init__\u001B[0m:\u001B[36m257\u001B[0m - \u001B[1mInitialize model [post_api]\u001B[0m\n" ] } ], @@ -389,13 +381,18 @@ ")\n", "\n", "board = BoardAgent(name=\"Host\")" - ] + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-03-27T08:09:59.446367Z", + "start_time": "2024-03-27T08:09:59.398116Z" + } + }, + "execution_count": 5 }, { "cell_type": "markdown", - "metadata": { - "collapsed": false - }, "source": [ "### Step 3: Start the Gomoku game\n", "\n", @@ -404,32 +401,26 @@ "In this game, we use a message hub to share messages between the two players (board agent doesn't have memory), so that one player can hear what the board agent says to the other player, and what moves the other player makes. \n", "\n", "Note here we only show 10 steps of the game. You can adjust the `MAX_STEPS` to play more rounds." - ] + ], + "metadata": { + "collapsed": false + } }, { "cell_type": "code", "execution_count": 6, - "metadata": { - "ExecuteTime": { - "end_time": "2024-03-27T08:10:33.989202Z", - "start_time": "2024-03-27T08:09:59.446824Z" - }, - "collapsed": false - }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: Welcome to the Gomoku game! Black player goes first. Please make your move.\n" + "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: Welcome to the Gomoku game! Black player goes first. Please make your move.\n" ] }, { "data": { - "image/png": "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", - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/png": "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" }, "metadata": { "needs_background": "light" @@ -440,14 +431,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[32m\u001b[1mAlice\u001b[0m\u001b[32m\u001b[0m: {\n", + "\u001B[32m\u001B[1mAlice\u001B[0m\u001B[32m\u001B[0m: {\n", " \"thought\": \"As the first move of the game, it's best to place the piece in the center of the board to maximize possible winning directions.\",\n", " \"move\": [\n", " 7,\n", " 7\n", " ]\n", "}\n", - "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", + "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -468,10 +459,8 @@ }, { "data": { - "image/png": "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", - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/png": "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" }, "metadata": { "needs_background": "light" @@ -482,14 +471,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[35m\u001b[1mBob\u001b[0m\u001b[35m\u001b[0m: {\n", + "\u001B[35m\u001B[1mBob\u001B[0m\u001B[35m\u001B[0m: {\n", " \"thought\": \"As the game has just started, I will place my piece near Alice's to prevent her from forming a line and to start building my own line.\",\n", " \"move\": [\n", " 7,\n", " 8\n", " ]\n", "}\n", - "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", + "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -510,10 +499,8 @@ }, { "data": { - "image/png": "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O/m+++77P4FAgLtb8+HDh2fu27fPkcvluG8n8cQTTyzYvn37xL6+Pm539uzZsY6ODsXtdnN1H0+n04YHHnhg8S9/+cv5fX19XB2mM5mM8ac//ekVTz/99Phdu3YVHT6DwaC9+uqr5e3t7XObm5trN23adLmqqkWFwGAwsG3btlk9Hs8Et9ttffvttycUO67ZbGa7d+82dnd3TxozZoz7ueeeW5jJZIp6wzEajWzv3r1aZ2fnZLPZnPjTn/60JJvNFv1m1dLSkm9ubp7x+9//fsFDDz30xVAo9LnPt6TgMsYMVquVjRs3LqOqKner9GnTpiUNBoMqMrbH43Gk02nbNddcw30Pmblz52bnz58/mEwmbbzu3r17v3DBBRdUejyeol8UBSZMmHDEYrEk/vznP8/jdVOpVMWkSZPk1tbWL/C6ZrNZPXHixLirrrrqNI+nqqrBYrHkxo4d68/lclzfMMrLy7U777zzqM1mq8vn80W/iG02mzZp0qQ4Y8w8efJkqa6urugxLRYLmzx5ctxut2tXXHFFgme+ADBlypSYyWRinZ2ds6ZOnXqmvLy86KNF06ZNixmNRtTX14c/7B9ddLamTZsWb29vL+/o6LjU6XRO8vv9n/tNsKTg1tbWKitXruyxWq01CxYs8PL6iURienV1dU1fXx/3p1dvb+/cpUuXGhKJBPfX3ffee69+4sSJZcuWLRvmdR9++OFt995770sNDQ39vG5XV9eYqqqqmmuvvbaP1/3ud7/bVlNTY168eHE3rxuJRExXXnll37Rp0zI8XmVlpfbNb35zYOHChdr48eODvONOmDDBuGzZsv7ly5f3FOvIsmyePHny5L6+PlsqlXJOnz69p9g7ruTzedPEiROntLW1Te/p6ZnidDqna5pW1Ke1oijG2traacePH5/h9XovWbp0qUVRlKJcTdMMTqfzwp6enilvvvnmoiVLlvgsFku+GBcAbDbbhZMnT67YvHnzc9/+9re3TZs2Lft5joExul6YIPQGXTlFEDqEgksQOoSCSxA6hIJLEDqEgksQOoSCSxA6hIJLEDqEgksQOoSCSxA65P8D2qq520he9+8AAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/png": "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O/m+++77P4FAgLtb8+HDh2fu27fPkcvluG8n8cQTTyzYvn37xL6+Pm539uzZsY6ODsXtdnN1H0+n04YHHnhg8S9/+cv5fX19XB2mM5mM8ac//ekVTz/99Phdu3YVHT6DwaC9+uqr5e3t7XObm5trN23adLmqqkWFwGAwsG3btlk9Hs8Et9ttffvttycUO67ZbGa7d+82dnd3TxozZoz7ueeeW5jJZIp6wzEajWzv3r1aZ2fnZLPZnPjTn/60JJvNFv1m1dLSkm9ubp7x+9//fsFDDz30xVAo9LnPt6TgMsYMVquVjRs3LqOqKner9GnTpiUNBoMqMrbH43Gk02nbNddcw30Pmblz52bnz58/mEwmbbzu3r17v3DBBRdUejyeol8UBSZMmHDEYrEk/vznP8/jdVOpVMWkSZPk1tbWL/C6ZrNZPXHixLirrrrqNI+nqqrBYrHkxo4d68/lclzfMMrLy7U777zzqM1mq8vn80W/iG02mzZp0qQ4Y8w8efJkqa6urugxLRYLmzx5ctxut2tXXHFFgme+ADBlypSYyWRinZ2ds6ZOnXqmvLy86KNF06ZNixmNRtTX14c/7B9ddLamTZsWb29vL+/o6LjU6XRO8vv9n/tNsKTg1tbWKitXruyxWq01CxYs8PL6iURienV1dU1fXx/3p1dvb+/cpUuXGhKJBPfX3ffee69+4sSJZcuWLRvmdR9++OFt995770sNDQ39vG5XV9eYqqqqmmuvvbaP1/3ud7/bVlNTY168eHE3rxuJRExXXnll37Rp0zI8XmVlpfbNb35zYOHChdr48eODvONOmDDBuGzZsv7ly5f3FOvIsmyePHny5L6+PlsqlXJOnz69p9g7ruTzedPEiROntLW1Te/p6ZnidDqna5pW1Ke1oijG2traacePH5/h9XovWbp0qUVRlKJcTdMMTqfzwp6enilvvvnmoiVLlvgsFku+GBcAbDbbhZMnT67YvHnzc9/+9re3TZs2Lft5joExul6YIPQGXTlFEDqEgksQOoSCSxA6hIJLEDqEgksQOoSCSxA6hIJLEDqEgksQOoSCSxA65P8D2qq520he9+8AAAAASUVORK5CYII=" }, "metadata": { "needs_background": "light" @@ -524,14 +511,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[32m\u001b[1mAlice\u001b[0m\u001b[32m\u001b[0m: {\n", + "\u001B[32m\u001B[1mAlice\u001B[0m\u001B[32m\u001B[0m: {\n", " \"thought\": \"My opponent placed his piece next to mine. I should block him and also try to create a potential line for myself.\",\n", " \"move\": [\n", " 7,\n", " 6\n", " ]\n", "}\n", - "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", + "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -552,10 +539,8 @@ }, { "data": { - "image/png": "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", - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/png": "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" }, "metadata": { "needs_background": "light" @@ -566,14 +551,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[35m\u001b[1mBob\u001b[0m\u001b[35m\u001b[0m: {\n", + "\u001B[35m\u001B[1mBob\u001B[0m\u001B[35m\u001B[0m: {\n", " \"thought\": \"I see Alice is trying to create a line horizontally. I need to block her next move otherwise she will have a chance to win. I will place my piece at [7, 5].\",\n", " \"move\": [\n", " 7,\n", " 5\n", " ]\n", "}\n", - "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", + "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -594,10 +579,8 @@ }, { "data": { - "image/png": "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", - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/png": "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" }, "metadata": { "needs_background": "light" @@ -608,14 +591,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[32m\u001b[1mAlice\u001b[0m\u001b[32m\u001b[0m: {\n", + "\u001B[32m\u001B[1mAlice\u001B[0m\u001B[32m\u001B[0m: {\n", " \"thought\": \"My opponent is trying to block me. I should place my piece at [7, 9] to create a potential line for myself.\",\n", " \"move\": [\n", " 7,\n", " 9\n", " ]\n", "}\n", - "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", + "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -636,10 +619,8 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAO4AAADnCAYAAAAZ4WrqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAAsTAAALEwEAmpwYAAAlPUlEQVR4nO2deXRU5f3/33eWzCQz2UCWRLaCAYSAX6WyqNCftixKxR81tLWidq+tHrucnm6nPV2O/mprj61d9LSn1lYsQsFaFtlcAhZIQgiQhDAkITPJZDKTzL7P3Jl77/P7Q4dv/RZlnicEvtd+Xufk9FjmdZ9n7mfes9x7n/uRGGMgCEJfGK70BAiC4IeCSxA6hIJLEDqEgksQOoSCSxA6hIJLEDqEgksQOoQ7uGfOnKnatGnTsuHh4bKxmBBBEBdH4r0A45577llZXV2t1NbWpr///e+3yLJsYowZx2h+BPEfg8lkUkwmk1rUY3k3riiKae7cuX6/318py7Jh165dHzx58uSj9fX1Nbzb0jQNp0+fxsKFC3lVMMbQ0dGB6667jtsFgPb2diE3mUxiZGQEs2bN4nYzmQwGBwcxe/ZsbleWZTidTlx77bXcrqIo6O7uxvz587ldTdPQ1dWFBQsWcLuMMXR2dl72+sbjcQSDQcycOZPbTaVS8Hq9qKur43az2Sz6+/sxd+5cbjefz7PS0tL/t2HDhs1FCYwxrr+//e1vMz7/+c9/vLW1dQJjDLIsm1944YUOJkA+n2fPP/+8iMo0TWN//vOfhd3nnntOyPV6vWzv3r1CbjAYZDt27BBy4/E427Ztm5CbTqfZ5s2bhdxcLsc2bdok5Kqqyv7yl78IuaOp0eDgIDtw4ICQOzIywnbv3i3kRiIR9ve//13ITSaTytatWx9kReaQ+xN3w4YN/Rs2bOjn9QiCuHTQUWWC0CFXNLiSJF3J4QlCt1zR4DJaUkgQQtBXZYLQIRRcgtAhFFyC0CEUXILQIRRcgtAhFFyC0CF0HpcgdAh3cA8fPjz1+9///r2XYnA6j0sQYnBfqzx9+nSfw+HQNE2TNE3DmTNnprjdbsupU6e4B9c0DW63GyIuY0zYBYDBwUEhNxgMwul0CrmxWAwul0vITafT6O/vF3JzuRwGBgaEXFVVhd0rVaORkRHhfRWJRITrm0wmheubzWYhy3LRj+cOriRJZlmWK2KxmLW8vDyraZrEGIOmabybgqZp5/9EEB33X8cWGVN03NG4mqbpzh3N8y34/0n7mQfu4BoMBusXv/jFnlAoVFZdXZ2pr68fdDgc8g033MC7KSiKAofDARGXvb3WU9Tt6OgQcn0+H1RVFXJDoRDi8biQm0gkMDw8LORmMhm4XC4hN5/Po7u7W8gtrOW93DXyeDwwGo1Crt/vRzabFXKj0ShCoZCQm0ql4PF4in48d3Bra2sj69ata+T1CIK4dNDpIILQIRRcgtAhFFyC0CEUXILQIXTlFEHoELoDBkHoEPqqTBA6hIJLEDqEgksQOoQ7uJFIxOL3+ysVRaEjSwRxheC+5PGPf/xjjcPhuHHFihWnPv3pT/eOxaQIgnhvuIN7//33Dz788MPzKyoq0oWmX83NzXajkb9hn6ZpaG5uhtls5nYZY2hpaYHFYuF2AaClpQVWq5Xbi0ajGBgYQDQa5XaTySS6u7uRTqe53Uwmg46ODiiKwu3mcjkcP35c6PSbqqpoamqCycT9Ujlf35KSEm63UF+RGoVCIXi9XoRCIW43Ho+jr68PiUSC202n0+jq6uJanldAlmWu2nJX47HHHltcWlo6Y968eU0Wi0VbtWpVezKZTN111128m4KqqshkMhBxGWNIJpNCLvDWahsRd3h4GJ2dnVi5ciW3Gw6HUVVVhbVr13K7iUQCFotFaM7ZbBYAhFxFUSDLspCraRrS6fRlr+/Q0BC6u7tx2223cbuBQABtbW1Ys2YNtxuLxWCz2bBu3TpuN51O49VXXy368dzB/fGPf3wql8t122y2BABYrda82WxmpaWlvJuCoigoKSmBiMsYG5VrNpuFXKvVKjzuaNzR7CsAws83n88Lj6tp2n9UjWRZHtW+MhiKP+TEHdzq6uoMgAyvRxDEpYNOBxGEDqHgEoQOoeAShA6h4BKEDqHgEoQOoeAShA6h4BKEDqHgEoQOoeAShA7hDu6RI0eu2r1796JgMMh/9TdBEJcE7ksenU6n/Oyzz87++Mc/nv3KV77SpSiKUdM0oVUrqqpCVVUhlzEm7AJvXRt6uec8GldRlFGNK/p8RzOupmmjqu9o5qzH+vLcg407uEuXLs20trb60+m0+e1lfYuamprKebcD/PeyL5ElgcBbS/NElgQCEF5OGIvF4Ha7EQ6Hud1UKoWenh4kk0luN5vNorOzE7lcjtvN5/Noa2sTbkbV3NzMdQF8AcYYmpubhZYEAuL1jUQi8Hq98Pv93G4ikYDT6UQsFuN2M5kMzpw5g0yG/1J+3rpy79Fdu3Z9wGg0Vi9btsxhsVi09evXH1MUJXHvvfwtcxVFgcFgwH333cftFt6RRV1VVYVcn8+H9vZ2oWVfoVAIR44cEVr2lUgkUF1djYaGBm43k8mgtLQU99xzD7ebz+dhNBqxceNGbrfwRnG5a+TxeOBwOISWXvr9frS2tgotvYxGo2hsbMT69eu53VQqhVdeeaXox3MH9xvf+EYvgEty5wu6rzJBiEH3VSYIHUKngwhCh1BwCUKHUO8ggtAh9BuXIHQIfVUmCB1CwSUIHULBJQgdQsElCB1CR5UJQodwBzcWixm+9rWv3enxeMaPdnA6qkwQYnBfq7xjx45rXnzxxWmf//zn22tqasJ9fX2TfD6f+ezZs9yDa5oGn88HEZcxJuwCb/UAEnGDwSA8Ho+QG4vFMDQ0JOSmUil4vV4hV5Zl4X2lqqruajQyMiJco3A4LOwmEgnh+mYyGa4VQtzBjUajU6655poJLperZs6cOYPRaNSWSqWMIsvcNE1DMpkUWiIHvPViFnVFx41Go0gkEkJuPB4XdjOZjPCcc7mcsKuqqrDLGBtVjUTd0dRoNG4qlRLeV9lslmvZJXdwH3nkkTduvPHGrrlz5ybNZjNbtGiR0+l0Zm+66SbeTUFRFLhcLoi4jDH09vYKuz09PUKuz+eDyWQSckOhEHK5nJCbSCQQiUSE3EwmA5/PJ+Tm83kMDAwIuZqmoa+v77LXyOPxoKysTMj1+/1gjAm50WgUyWRSyE2lUggGg0U/XmiF87Jly0ZEPIIgLg10OoggdAidDiIIHUKLDAhCh9BXZYLQIRRcgtAhFFyC0CEUXILQIXRUmSB0CB1VJggdwh3cgYGBmr179y5NJpOlYzEhgiAuDvclj2+++eb81tZW67JlyxgAvN30S8rn89yDF5okibiFFhUibmFsEbfQBIvci1No+iVaI03TdPV8R+uOadOvKVOmnDx8+PANzz777LyHH3741NtNv+wiv1cLDaVEmkIxxtDS0oKSkhJuFwCOHTsGi8XC7UWjUbjdbkQiEW43mUyip6cHqVSK281ms+jo6BB6UeTzeRw/fpzbA956gxNtzFaokWhjNtH6hsNheL1erov2C8TjcTidTsTjcW43nU7jzJkzyGaz3K4sy1yP507MqVOnqmw2W+WyZcu6LkXTL0mShBpKFZp+ibqKogi5V7LpV1VVlXDTL6vVekWafjHGLnuNqOnXBfj617/eB6CP1yMI4tJB53EJQodQcAlCh1BwCUKHUHAJQodQcAlCh1BwCUKHUHAJQodQcAlCh1BwCUKHUHAJQodwB/fgwYMTvv3tb697+eWXJ47FhAiCuDjc1yr/+te/XipJUun1118vqaoqnTt3brLX6y1xOBzcg6uqCq/XCxGXMSbsAm8tFhBxA4EA3G63kBuNRjE4OCjkplKp8xfP8yLLMoaGhoRcRVGE97OmaaOqr2iNhoeHhWsUDoeFa5RIJIRrNOZNv6ZNmyYDyJ4+fXp+Q0ODP5FIlGYyGUMsFuPdFDRNQzqdhojLGEMmkxFyAQi7iURCeM6jcdPptPCcc7mcsKuqKtWoSJLJpLB7OZp+NR0/fnx+XV2dw2Qyseuvv9517ty57NKlS3k3BUVR0NfXBxG30BRK1D179qyQ6/P5YDQahdxQKIRsNivkFjrIibiZTAZDQ0NCbj6fh8vlEnI1TUNvb+9lr5HH40FpaamQ6/f7oaqqkFvo9CfiplIp+P3+oh/PHdyZM2cmZs6c2czrEQRx6aCjygShQyi4BKFDKLgEoUMouAShQ4Q60l8q/hM6GTDGkM/n4fV60d3djbNnz2LOnDmYOnUqSktL33MfFFy/34+BgQEMDAzA6XSipqYGVqu1aNfj8cDtdnO7Xq8XHo8Hvb296O7u5p7zyMgIBgcHix6XKJ4rGtz3cyeDwn2fDx48iKeffhotLS0IBAJQVRVPPPEE5s+fj89+9rNoaGj4tzAU3OPHj6OnpwcTJ07EpEmT8OEPfxj9/f04evQoJkyYgOXLl1/QVRQFbW1t73BXr1593p04cSJuueWWC4Ywn8+fn/OxY8fOz/npp59GfX09Pve5z+FjH/tY0eOuXbu2qHEJPq5ocN/PZLNZPP7443jqqaf+7YR8MBjEoUOH0NzcjFdffRW/+MUvMGnSpHe4u3fvRm1tLT7xiU+gpKTk/Au9EOqenh5s374dd9xxB8aPH3/+34txu7u7L+hmMhn87Gc/wy9/+ct/u69wMBjEwYMH0dTUhH379uHJJ5/EhAkT3jHurl27cPXVV1903LVr12LcuHEU3lFAv3HHAFVV8fvf/x6PP/74e15FI8syNm/ejO985zvIZDLn3QMHDmDevHm46aabYLFY3vEClyQJJpMJ1157LVatWoW9e/eev5m2qqrYv3//Rd158+Zd0H3mmWfw+OOPv+fNwGVZxosvvojvfOc7511N07Bv3z7U19dfdNyVK1diz5493DcAJ94JBfcSwxhDd3c3nnjiiaKuPdU0DVu3bsWePXvAGIPL5Tr/In+vTyRJkjBp0iQsWLAAzc3NYIzB6XSipKSEy21paXnHnIsJlKZp2LJlC/bt2wfGGM6dOwer1Yq5c+dedNzJkydj/vz5OHbs2Pv6p9JYwx3cRCJhjkQi5ZlMRqyvxH8AL7/8Mnw+X9GPz2QyeP7556GqKtrb27F48eKivkZKkoR58+bB7XZDURRhN5/PY/v27RgZGeGa86ZNm5DL5dDe3o4lS5bAYLj4y0mSJNTX12NgYEC4pxAhENyOjo5JDz744Cf++te/1o/FhPSOpmk4cuQI96fJmTNn4Pf7kU6nMX78+KI9s9mMiooKBINBZLNZjBs3jsu12+0IhUI4fvw495xPnjyJcDiMfD6PyspKrnHLy8uRSCS4xiP+G+6DUzfffLPn5z//eXT58uV9siwb9u7de/2xY8fsIg20NE1Da2srSkv5O3YyxtDa2gqbzcbtAsDx48dht9u5vWg0iv7+fiSTyQv+ez6fR39/P/d2R0ZGsGXLFlgslqI+uQpIkgSz2Yxt27bBbDZzHfCRJAlGoxHbtm0TXqa4ffv2f/tNW+zYf//731FdXf2ujxGtUSgUwtDQkNAqnXg8jnPnzp0/5sBDOp3G6dOnoaoqtyvLMtfvfu7g9vT02K1WqzJnzpw4AKxYscIRCoXSq1ev5t0UVFVFLBaDiMsYQzgcFnKBt46SirgjIyPo7OzERz7ykQv+u6qqePbZZ7mDMH78eKxduxZNTU3QNK3o8BbOm65ZswbNzXxrPwpHe2+//Xbs2bMH586d4/LLy8uxevVqod+rjDGsWrXqXb8hMMaEazQ0NISenh7ceuut3G4wGERFRYXQuLFYDCaTSchNp9NobGws+vHcwb366qvTv/nNb/YV/ttut2etVqtWXl7OuykoigKr1QoRlzF2RdxkMonS0tJ3dRljWLZsGV5//XWu7c6ZMwczZ85ER0cHotFo0V95FUVBPB7HjBkzcOrUKcRiMVRVVRXtJpNJTJs2DYsWLcL+/fu55rxgwQJMnToVJ0+eRDKZLPrrsqqqSCaTmDx58ru2Oh1Njex2+3vW6L3IZDLCrqqqwq7BYOD6psX9G9dms2kTJ07kbwB6Ad6v5/HuvvtuTJgwoejHl5SUYOPGjTCZTKivr0dbW1vRn2Dnzp1DTU0NzGYz6uvr0draWpTLGENvby9qampQUlKChoYGrt/WJSUluPfee2G1WrnHPXv27PlxCTGu6Omg9+PpgMJR04cffrioht2SJOHOO+/EXXfdBUmSUFdXh2g0CqfT+Z77p/BT4dixY7jpppsgSRJmz55dtBuJRNDa2oply5ZBkiQsWLAADz30UFFNqCVJwrp163DnnXdCkiTMmTMH4XAYLperqHHb2tqwdOnS9+0b9+Xgigb3/Vo4k8mEr3/963jwwQff88Cb0WjEHXfcgSeffPL81yuTyYTbb78dzc3NOHXqFBRFeUcYCg29BwYGsHPnTqxcuRJlZWUXdFVVvaDb399/Qfeb3/wmvvzlL8Nqtb7nc7v99tvx5JNPnj8wWPj/jh49ivb29ncd1+VyYefOnVi1atX5cQkx6FrlMcJut+OJJ57A8uXL8cwzz6C9vR2xWAyMMdjtdsycORMPPPAAPvOZz/zbb0ObzYaGhgYcOXIEW7ZswbRp01BTUwOj0YhAIID+/n5YLBasX78eFRUV73gD/Ff3xRdf5HLtdjt+9rOf4eabb8bvfvc7dHZ2vmPOs2bNwqc//Wk88MADqKys/Df3vcZ1uVwoLS294LgEP3St8hghSRKsVis2bNiAtWvXwul04vTp0+jq6sK6detQV1eHysrKCx6QkCQJFosFt956K9LpNDweD1wuF9ra2vDRj34Uq1evRkVFRdGu2+1GU1MT7rrrrou6hTnfcccdcDqdcDqdePPNN/HJT37yonO2Wq247bbbzo/r9XrR2NiIu+++G2vWrHnXcQl+KLhjjCRJsNlsWLBgAWpra2Gz2bB48WIud86cOaitrUU8HseCBQu43WnTpsHv93O5drsdCxcuxLXXXotkMik057q6OgwMDBQ9LlE89PZHEDqEgksQOoSCSxA6hIJLEDqEO7hut7vitddeu66np2fUJ+LolABBiMF9VPmHP/zhjYcOHZr94IMPGr71rW+d1DRNKpxg50XTNIi6jDFht+Bf7nFH416pfTWacfU459HWV9O0Uc25WLiDq6oqGz9+fMhkMllkWTa8/PLLi48cOVIuOtmmpiZuD3hrJx09elT4vODRo0dhNBq5vWg0CrfbjUAgwO0mk0n09vYKN4Xq7OwUWm6Wy+Vw4sQJKIrC7aqqev4uGbxomoajR48KfbNijKGpqUmoRuFwGD6fD8PDw9xuPB6H0+lEOBzmdtPpNM6cOYNUKsXtyrLM9VrmDu7y5cvDyWRycnV1td9isWh33313i6ZpiXvvvZd3U1AUBUajEffddx+3W3gh3X///UKupmlCrs/nQ3t7O9asWcPthkIhHDlyBOvWreN2E4kExo0bh4aGBm43k8nAZrPhnnvu4Xbz+TzMZjM2btzI7RaWJ4rWiDEm5BZaXa5cuZLb9fv9aG1txdq1a7ndaDSKxsZGrF+/nttNpVJ45ZVXin48d3C/8IUvnPrCF75witcjCOLSQUeVCUKHUHAJQodQcAlCh1BwCUKHUHAJQodQcAlCh1BwCUKHUHAJQodQcAlCh9BdHglCh3AHd9euXbMeeeSRdR0dHe/e9KVI3s93eSSIsYT7WuXNmzfXeTwe9re//e2GhQsXvu52u68KBAJmp9PJPbiqqvD7/RBxGWMIBAJCLgBhNxAIYHh4WMiNRqMYGRkRclOplPC+kmVZ2FUURXc1Gh4eFq5ROBwWdhOJhHB9M5kMV9tR7uA+8sgjx5955pnbzGZzIJ/PS16vtzoUCpkGBwd5NwVN0xAOhyHiFu7kL+ICEHbD4TACgYCQG4/Hhd10Oo1gMCjk5nI5hEIhIVdV1VHVSHRcQLxGgUBAeD9Ho1Hh/ZxMJoXdbDbLteySO7hXXXWV8dZbb/WuXLnylNlsZkuXLu0dHBzMfOhDH+LdFBRFgcfjgYjLGMPAwICw63K5hFyfz4fS0lIhNxQKgTEm5CYSCaRSKSE3k8kgGAwKufl8Hl6vV8jVNA1ut/uy18jj8aCyslLI9fv9MJlMQm40GkUulxNyx3xZX11d3UhdXV3xrcsJgrjk0OkggtAhFFyC0CF0HpcgdAj1xyUIHUKfuAShQ+gTlyB0CB2cIggdQsElCB1Cv3EJQocUFVxZlo2NjY3XjYyM2F577bW5LS0tky7F4PQblyDEKOqSR1VV8dOf/vSahx56yLZ169aJsiyXbNu2bZvBYGCaphkYY1BVlXvwQoMkERd4K/iX2x3NnEfrjmbOV+L5Flq9XIka6bW+xVJUcMvKytRZs2b5AFgXL14cHBgYuBoA3m76deNom36JNoUaTdMv0YZSsVgMAwMDCAaD3G6h6Vc8Hud2R9P0K5/Po62tbVRNv0S4UjUabdMvl8uFSCTC7abTaTgcjv89Tb+y2azZZrPNOn36dMzlclknT57sNRgMzGKxMGr6VTxXsulXWVnZFWn6JUnSZa8RNf16G6vVmv/FL36xiXs2BEGMCXRUmSB0CF05RRA6hC7AIAgdQsElCB1CwSUIHULBJQgdQsElCB1CwSUIHULBJQgdQsElCB1SVHATiYT5u9/97ob29vbar371q3cfPnx4wlhPjCCId6eoa5XLy8vzg4ODfsaYtaamJnj27Fn7LbfcEgCAgYGBCX6/39zX18c9eKHpl4jLGBN2gbf6y4i4gUAAPp9PyI1GoxgeHhZyU6kURkZGhNxC0y8Rt9D0S8TVNO2K1Gh4eFi4RoWVRSJuIpEQru+YNf2yWCzmbDZrraqqMudyOSsA5PN5aXh4uDISiZiGhoa4J6tpGiKRCERcxpiwC0DYDYfDCIVCQm48Hhd20+k0wuGwkJvL5YTdQtMvPdUoEAggGAwKudFoVLhGyWRSeF+NSdMvWZZNK1eu1IaGhuxVVVXauHHjbABgNpvZkiVLzrnd7syKFSu4J6soCgYHByHiMsbQ398v7DqdTiHX5/PBarUKuaFQCJqmCbmJRALJZFLIzWQyCAQCQm4+n8fQ0JCQq2kaBgYGLnuNPB4PKioqhFy/3w+j0SjkRqNRyLIs5I7Jsj6LxaJ88pOffIN7NgRBjAl0VJkgdAgFlyB0CC2kJwgdQgvpCUKH0FdlgtAhFFyC0CEUXILQIRRcgtAhFFyC0CFFBzeVSlkVRTEkk0lrOp3m7wtBEMQlo6jgxmKxkoaGho1Hjx6t++53v/t/HnnkkVVjPTGCIN6doq5VrqyszE2bNs1x1VVX5RoaGhy//e1v5wFALpczHDhwYOGJEydsdrude3BN03DixAlUVFRwu4wxnDhxAlVVVdwuAJw8eRLV1dXcXiQSgcvlgizL3G4ikYDD4RA6f53JZHDy5EmYzWZuN5fLoa2tDWVlZdyuqqpoa2tDeXk5t1uoUWVlJbcLiNcoFArB4/EgnU5zu7FYDL29vUIN0lKpFDo7O4WanMmyzNUsrKjg5nI5YzKZnHbw4MHyP/3pTwsffvjhVwCgpKREW7x4cZ/X680sX76ce7KqqmJkZAQiLmMMXq9XyAXeWkEi4vr9fthsNiE3EonAYDAIuclkEtlsVsiVZRmxWEzIVRQFgUBAyNU0DT6fT7hGQ0NDQq7X60V1dbWQGwwGUVJSIuTG43GoqirkptNp/POf/yz68UUF12g0ao899tghVVXZ6tWru6xW6/m3hqqqqpTNZtPGjRvHPVlFUWCz2SDiMsauiCvLMsrLy4XHtdvtQq7ZbBZ2M5mM8PPN5/PCrqZpo6pRWVmZkJtOp4X3laIowvU1GAzC41osFq6WosUGl82YMcPLPRuCIMYEOh1EEDqEgksQOoSCSxA6hIJLEDqEgksQOoSCSxA6hIJLEDqEgksQOoSCSxA6pKjg5nI5Q0tLy9xgMGhvaWmZ097eftWlGJzu8kgQYhR1yWM+n5e+973vLfzRj36knj17tmr37t3X79ixYwsAMMakt/+Xe3DG2Pk/EVd03P+5DRHvco+rx+c7mvr+6zZEnStR39E+32IpKrg2m02dPXu2p7q6WqmrqwtJkjQDAGRZNrz00ktL/vnPf5aLLIPSNA1NTU3CxTly5Ai396+uyCd+NBrF4OAg/H4/t5tMJtHb24tIJMLtZrNZdHZ2ci39KpDL5XDixAnkcjluV1VVtLS0QNM0brdQXxFGU6NCxz2vl//y+ng8DpfLhVAoxO2m02k4HA4kEgluV5ZlruWARQU3m82aTSZT3c6dOycaDAb1mmuuCQGAxWLRGhoamhljiXvvvZd7soqiwGQy4b777uN2GWOQJAkPPPCAkAtAyPX5fGhvb8eaNWu43VAohCNHjmDdunXcbiKRwP79+9HQ0MDtZjIZ2O123HPPPdxuPp9HSUkJNm7cyO1qmgaj0Yj777+f2x1NjTweDxwOB1auXMnt+v1+tLa2Yu3atdxuNBpFY2Mj1q9fz+2OSdMvq9Waf+qpp54v7Eyj0Uh3MieIK0jR/XENBgOFlSD+l0C9gwhCh1DvIILQIXQBBkHoEAouQegQ+o1LEDqEfuMShA6hr8oEoUMouAShQyi4BKFDigpuMpk0P/roo/93ZGRk3IEDB2b+7ne/WzTWEyMI4t0p6pJHi8WidHV1xU6fPj3xqaeeWqiqqvzQQw+1AYDP56uKRCKSx+PhXnqiqirC4bDk8Xi4j1IxxvD2uEJHuERdv9+PYDAo5EajUYRCISE3lUoJ7ytZloVdRVFGVSNRFxCvkc/nE65RKBQSdhOJhHB9M5mMxrPCrqjgms1mZrfb8cYbb1w9fvz42p6eHmM4HDaUl5ezc+fOTRoaGvqrw+E4wTtZTdMMXq/3BofDcZzXZYxJXq/3gw6Ho5XXBQCv13ujiBsOhysGBwdrHQ7HWV43kUjYBgcHP+BwOE7zuplMxurxeOY4HI52XjeXy5mHhobqHQ7HSV5XVVWj1+v9L4fD0cbrjrJGwm4wGKxyu90THQ5HD68bjUbtg4OD0xwOxxleN5VKlXo8nmscDkcnr5vNZktyuVxJ0cK/LnZ+t79MJmP605/+tGbHjh1L4vF46T/+8Y+ZhX/L5XLGV155ZUEx2/mff4qiSLt27bpOxGWMYceOHf91ud1AIGA/fPjwNSJuNBotbWxsnCPiJpPJkgMHDswTcbPZrGnPnj1CNcrn84bdu3cvFN3PO3fuvOz1HR4ermhqapop4oZCobI333xztogbj8ctr7322rUibjqdNu/bt29+sY8v6jeu1WpVPvOZz+xbt25dS3l5eeauu+5yFv6tsbFxaiAQsKVSKe4u9S0tLR+oqKgQugpj+/bts6LRaFkkEin+XeptXn755amRSMQeDAatvG5paWmqr6+vIhaLcTeb9fv9E3w+39XxeNzG6wYCAYPH46k+fPjwBF63q6urKhgMTn7jjTdm87oHDx78gN/vr+jv7+fez4cOHZrh9/tLY7FY0avQstms6YUXXljhcrmqI5FIyc6dO2cW6+ZyOcPmzZtvSaVSlq6urppTp06NL9ZVFEXasmXLTeFwuNLtdo/bvn37nGJdTdOk7du3L/H5fBMSiUTp1q1b63O5XNGv63/84x+LPB7P5Hnz5vW/8MILNxTjjOqocjgcNj7xxBM37t+/v+Lo0aO1vP7IyEjipZdeKnoH/Svjxo0LvP7669V79+6dyOum0+nY008/fU1jY+NkXvf111+f8o1vfOPDfr+fu1vz8ePHZ7355pu2XC7HfTuJ3/72tzfs2rVrcn9/P7c7e/bsaEdHh+J0Orm6j6dSKel73/ve0p/85CcL+/v7uTpMp9Npww9+8IMlf/zjHyfu37+/6PBJkqS99NJLZe3t7fVNTU3jN23adKOqqkWFQJIktnPnzhK32z3J6XSWvPrqq5OKHddkMrEDBw4Yent7a8eNG+d87rnnFqXT6aLecAwGAzt06JDW2dk5xWQyxX//+98vy2azRb9ZtbS05Juammb+6le/uuHRRx+9KRgMXvT5jiq4jDGppKSETZgwIa2qKner9OnTpyckSVJFxna73bZUKmX5yEc+wn0Pmfr6+uzChQuHEomEhdc9dOjQB6+++uoKt9td9IuiwKRJk06Yzeb4H/7whwW8bjKZLK+trZVbW1s/yOuaTCa1q6trwoc+9KFuHk9VVclsNueuuuoqXy6X4/qGUVZWpn3xi188abFYavL5fNEvYovFotXW1sYYY6YpU6Zkampqih7TbDazKVOmxKxWq7ZkyZI4z3wBYOrUqVGj0cg6OzuvmTZt2rmysrKijxZNnz49ajAYUFdXF3q7f3TR2Zo+fXqsvb29rKOj4zq73V7r8/ku+k1wVMEdP368snr16r6SkpLqG264wcPrx+PxGVVVVdX9/f3cn14ul6v+5ptvluLxOPfX3TfeeKNu8uTJpcuXLx/hdR9//PGdX/va17bOmzdvgNft6ekZV1lZWX377bf387pf+tKX2qqrq01Lly7t5XXD4bDxlltu6Z8+fXqax6uoqNA+9alPDS5atEibOHFigHfcSZMmGZYvXz6wYsWKvmIdWZZNU6ZMmdLf329JJpP2GTNm9BV7x5V8Pm+cPHny1La2thl9fX1T7Xb7DE3Tivq0VhTFMH78+OmnT5+e6fF45t98881mRVGKcjVNk+x2+wf6+vqm7tmzZ/GyZcu8ZrM5X4wLABaL5QNTpkwp37x583Of/exnd06fPj17MUdijK4XJgi9QVdOEYQOoeAShA6h4BKEDqHgEoQOoeAShA6h4BKEDqHgEoQOoeAShA6h4BKEDvn/RevMzWmw9XQAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/png": "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" }, "metadata": { "needs_background": "light" @@ -650,14 +631,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[35m\u001b[1mBob\u001b[0m\u001b[35m\u001b[0m: {\n", + "\u001B[35m\u001B[1mBob\u001B[0m\u001B[35m\u001B[0m: {\n", " \"thought\": \"Alice is trying to create a line horizontally again. I need to block her next move otherwise she will have a chance to win. I will place my piece at [7, 10].\",\n", " \"move\": [\n", " 7,\n", " 10\n", " ]\n", "}\n", - "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", + "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -678,10 +659,8 @@ }, { "data": { - "image/png": "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", - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/png": "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" }, "metadata": { "needs_background": "light" @@ -692,14 +671,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[32m\u001b[1mAlice\u001b[0m\u001b[32m\u001b[0m: {\n", + "\u001B[32m\u001B[1mAlice\u001B[0m\u001B[32m\u001B[0m: {\n", " \"thought\": \"My opponent is trying to block me. I should place my piece at [6, 7] to create a potential line for myself.\",\n", " \"move\": [\n", " 6,\n", " 7\n", " ]\n", "}\n", - "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", + "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -720,10 +699,8 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAO4AAADnCAYAAAAZ4WrqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAAsTAAALEwEAmpwYAAAoS0lEQVR4nO2deZRU5Z33v7eWruqu6o1ma/YAzdqgQkRahLyaIBgUJTYmDKhJJoszepwkJ2fmJCeZzMwx7zhhJmcySeBkToyJIoqihEUQorQL0DRNA71R0EtVL9VVXfu+33uf9w8t3hhZ6nmaJRd/n3P6eLDu5z5P3ae+tdz7PPcnMcZAEIS20N3oDhAEwQ8FlyA0CAWXIDQIBZcgNAgFlyA0CAWXIDQIBZcgNAh3cM+ePVvx4osv1g0PD5dciw4RBHFlJN4JGBs2bFhZWVkpT5gwIfmjH/2oKZPJGBhj+mvUP4L41GAwGGSDwaAUtC3vzmVZNsyZM8fr9XrLM5mMbu/evZ89ffr0M7W1tdW8+1JVFR0dHVi4cCGvCsYY2tracMstt3C7ANDa2irkxuNxeDwezJgxg9tNpVIYHBzErFmzuN1MJgO73Y65c+dyu7Is4/z585g/fz63q6oqOjs7sWDBAm6XMYb29vbrPr7RaBR+vx/Tp0/ndhOJBFwuF2pqarjddDqNvr4+zJkzh9vN5XKsuLj4/65fv357QQJjjOvv1VdfnfaNb3zjkebm5jGMMWQyGeO2bdvamAC5XI698MILIipTVZX9/ve/F3aff/55IdflcrEDBw4IuX6/n+3evVvIjUaj7LXXXhNyk8kk2759u5CbzWbZiy++KOQqisL+8Ic/CLkjGaPBwUF26NAhIdfj8bB9+/YJuaFQiL3xxhtCbjwel3fs2PEEKzCH3J+469ev71u/fn0fr0cQxNWDzioThAa5ocGVJOlGNk8QmuWGBpfRkkKCEIK+KhOEBqHgEoQGoeAShAah4BKEBqHgEoQGoeAShAah67gEoUG4g3vkyJHJP/rRjzZejcbpOi5BiME9V3nq1Klum82mqqoqqaqKs2fPThoYGDCdOXOGu3FVVTEwMAARlzEm7ALA4OCgkOv3+2G324XcSCQCh8Mh5CaTSfT19Qm52WwW/f39Qq6iKMLujRojj8cjfKxCoZDw+MbjceHxTafTyGQyBW/PHVxJkoyZTKYsEomYS0tL06qqSowxqKrKuyuoqnrhTwTRdv+8bZE2RdsdiauqqubckTzfvP9pOs48cAdXp9OZv/Wtb3UFAoGSysrKVG1t7aDNZsssWrSId1eQZRk2mw0iLvtoraeo29bWJuS63W4oiiLkBgIBRKNRITcWi2F4eFjITaVScDgcQm4ul8P58+eF3Pxa3us9Rk6nE3q9Xsj1er1Ip9NCbjgcRiAQEHITiQScTmfB23MHd8KECaG1a9c28HoEQVw96HIQQWgQCi5BaBAKLkFoEAouQWgQmjlFEBqE7oBBEBqEvioThAah4BKEBqHgEoQG4Q5uKBQyeb3eclmW6cwSQdwguKc8/va3v6222Wy3r1ix4sxXv/rV7mvRKYIgLg93cB977LHBp556an5ZWVkyX/Tr+PHjVr2ev2Cfqqo4fvw4jEYjt8sYQ1NTE0wmE7cLAE1NTTCbzdxeOBxGf38/wuEwtxuPx3H+/Hkkk0luN5VKoa2tDbIsc7vZbBYnT54UuvymKAoaGxthMHC/VC6Mb1FREbebH1+RMQoEAnC5XAgEAtxuNBpFb28vYrEYt5tMJtHZ2cm1PC9PJpPhGlvu0fjpT3+6pLi4eNq8efMaTSaTeu+997bG4/HEgw8+yLsrKIqCVCoFEZcxhng8LuQCH662EXGHh4fR3t6OlStXcrvBYBAVFRVYs2YNtxuLxWAymYT6nE6nAUDIlWUZmUxGyFVVFclk8rqP79DQEM6fP4977rmH2/X5fGhpacHq1au53UgkAovFgrVr13K7yWQSf/rTnwrenju4//qv/3omm82et1gsMQAwm805o9HIiouLeXcFWZZRVFQEEZcxNiLXaDQKuWazWbjdkbgjOVYAhJ9vLpcTbldV1U/VGGUymREdK52u8FNO3MGtrKxMAUjxegRBXD3ochBBaBAKLkFoEAouQWgQCi5BaBAKLkFoEAouQWgQCi5BaBAKLkFoEAouQWgQ7uAePXp09L59+xb7/X7+2d8EQVwVuKc82u32zHPPPTfrkUceSf/93/99pyzLelVVhVatKIoCRVGEXMaYsAt8ODf0evd5JK4syyNqV/T5jqRdVVVHNL4j6bMWx5fnHmzcwV26dGmqubnZm0wmjR8t61vc2NhYyrsf4P8v+xJZEgh8uDRPZEkgAOHlhJFIBAMDAwgGg9xuIpFAV1cX4vE4t5tOp9He3o5sNsvt5nI5tLS0CBejOn78ONcE+DyMMRw/flxoSSAgPr6hUAgulwter5fbjcVisNvtiEQi3G4qlcLZs2eRSvFP5ecdV+4junfv3s/o9frKuro6m8lkUtetW3dCluXYxo38JXNlWYZOp8Ojjz7K7ebfkUVdRVGEXLfbjdbWVqFlX4FAAEePHhVa9hWLxVBZWYn6+npuN5VKobi4GBs2bOB2c7kc9Ho9Nm3axO3m3yiu9xg5nU7YbDahpZderxfNzc1CSy/D4TAaGhqwbt06bjeRSODNN98seHvu4H7ve9/rBnBV7nxB91UmCDHovsoEoUHochBBaBAKLkFoEKodRBAahH7jEoQGoa/KBKFBKLgEoUEouAShQSi4BKFB6KwyQWgQ7uBGIhHdd77znQecTmfVSBuns8oEIQb3XOXdu3fPfPnll6d84xvfaK2urg729vaOc7vdxnPnznE3rqoq3G43RFzGmLALfFgDSMT1+/1wOp1CbiQSwdDQkJCbSCTgcrmE3EwmI3ysFEXR3Bh5PB7hMQoGg8JuLBYTHt9UKsW1Qog7uOFweNLMmTPHOByO6tmzZw+Gw2FLIpHQiyxzU1UV8XhcaIkc8OGLWdQVbTccDiMWiwm50WhU2E2lUsJ9zmazwq6iKMIuY2xEYyTqjmSMRuImEgnhY5VOp7mWXXIH9+mnnz58++23d86ZMyduNBrZ4sWL7Xa7PX3nnXfy7gqyLMPhcEDEZYyhu7tb2O3q6hJy3W43DAaDkBsIBJDNZoXcWCyGUCgk5KZSKbjdbiE3l8uhv79fyFVVFb29vdd9jJxOJ0pKSoRcr9cLxpiQGw6HEY/HhdxEIgG/31/w9kIrnOvq6jwiHkEQVwe6HEQQGoQuBxGEBqFFBgShQeirMkFoEAouQWgQCi5BaBAKLkFoEDqrTBAahM4qE4QG4Q5uf39/9YEDB5bG4/Hia9EhgiCuDPeUx/fff39+c3Ozua6ujgHAR0W/pFwux914vkiSiJsvUSHi5tsWcfNFsMi9MvmiX6JjpKqqpp7vSN1rWvRr0qRJp48cObLoueeem/fUU0+d+ajol1Xk92q+oJRIUSjGGJqamlBUVMTtAsCJEydgMpm4vXA4jIGBAYRCIW43Ho+jq6sLiUSC202n02hraxN6UeRyOZw8eZLbAz58gxMtzJYfI9HCbKLjGwwG4XK5uCbt54lGo7Db7YhGo9xuMpnE2bNnkU6nud1MJsO1PXdizpw5U2GxWMrr6uo6r0bRL0mShApK5Yt+ibqyLAu5N7LoV0VFhXDRL7PZfEOKfjHGrvsYUdGvi/Dd7363F0Avr0cQxNWDruMShAah4BKEBqHgEoQGoeAShAah4N7E5M/MptNp5HI55HI5mq12kyB0zynirxvGGCKRCE6ePAmPxwNJkpBKpfDqq6+irKwMixcvRnV1Nc0V1zAU3JsMxhjOnDmDjo4OLFmyBCtWrLgwwUVVVQwPD+Po0aOoqqr62GOEtqCvyjcR+dAODAzgkUcewaxZs1BUVASdTgedTgeDwYBJkybhS1/6EkwmE95++22ue/kSfz1QcG8iQqEQOjo6cN9998FkMl3yq7Ber0ddXR1kWUZPTw/97tUgFNybiJMnT6Kurq6gucE6nQ4rVqxAS0sLfepqEO7gvvvuu2P+6Z/+ae2uXbvGXosOEWIoigKPx4OpU6cWfNLJarVCp9MhlUpd494RVxvuMxP/8z//s1SSpOLbbrtNUhRF6unpGe9yuYpsNht344qiwOVyQcRljAm7wIeLBURcn8+HgYEBITccDmNwcFDITSQSFybPX4xUKgVFUbhONkmSBIvFgpaWFowde/H3YVmWhY+zqqojGl/RMRoeHhYeo2AwKDxGsVjssmN0Oa550a8pU6ZkAKQ7Ojrm19fXe2OxWHEqldJFIhHeXUFVVSSTSYi4jDGkUikhF4CwG4vFhPs8EjeZTF62z5lMBrIsc+9XURQkEolL7ldRFBqjAonH48Lu9Sj61Xjy5Mn5NTU1NoPBwG677TZHT09PeunSpby7gizL6O3thYibLwol6p47d07Idbvd0Ov1Qm4gEEA6nRZy8xXkLuWqqorBwUFks9mC1xnnq+k99NBDKCkpueg2uVwODodDqM+qqqK7u/u6j5HT6URxcbGQ6/V6oSiKkJuv9CfiJhIJeL3egrfnDu706dNj06dPP87rEdcWSZIwZcoUdHV1oba2tqDfucFgEEajEWaz+Tr0kLia0FnlmwRJkrBo0SKcOnUKyWTyitvLsoyGhgYsXboUOh29DLQGjdhNhMViwZ133ok9e/YgGo1e9PosYwyZTAaHDh3ChAkTMGnSpBvQU2Kk0Hy3mwhJkjBz5kwYDAbs2rULNTU1mDt3LsrKyiBJEhKJBBwOB86cOYPa2lrceuutNF9Zo1BwbzIkScK0adNQXV2Nc+fO4fDhw4hGoxgaGkJNTQ0mT56MdevWwWq1Umg1zA0N7qfhhcMYQy6Xg8vlwvnz53Hu3DnMnj0bkydPRnFx8WWPQd71er3o7+9Hf38/7HY7qqurYTabL+lKkgSTyYR58+Zh9OjRGBwchMfjwe23335F9y/77HQ60d3djfPnz3P32ePxYHBwsKA+/2W7LpcLPT09OH/+PKZMmXJF99PGDQ3uzTxHNn/f53fffRdbtmxBU1MTfD4fFEXB5s2bMX/+fHz9619HfX39J8KQd0+ePImuri6MHTsW48aNw+c//3n09fXh2LFjGDNmDJYvX35RV5ZltLS0fMxdvXr1BXfs2LG46667LhrCXC53oc8nTpy40OctW7agtrYWf/u3f4svfelLBbe7Zs2aK7abdxsaGrB169aPtfub3/zmsu1+amGMjegvk8kYt23b1sYEyOVy7IUXXhBRmaqq7Pe//72w+/zzzwu5LpeLHThw4IrbJZNJ9s///M+svLycAbjon8lkYps2bWLDw8OfcF999VV25MgRlk6nmaqqH+t7LpdjnZ2d7A9/+APz+Xwfe7wQt6Oj45LuT37yE1ZWVnbZPm/cuJF5PJ5PuDt27CioXb/ff+FxVVVZIpFgP/7xj6/Y7qOPPsq8Xu/H9n0xBgcH2aFDh644RhfD4/Gwffv2CbmhUIi98cYbQm48Hpd37NjxBCswd/Qb9xqQ/6R49tlnLzuNLZPJYPv27TAYDNiyZQuKi4uhKAoOHTqEefPmYd68eZ/4dJEkCQaDAXPnzsWoUaNw4MABrF+/HmazGYqi4ODBg1d0582bh6qqqk+4W7duxbPPPnvZm3NnMhm8/PLLKCoqwpYtW2A2m6GqKt566y3U1tZi7ty5l2131KhR2L9//4V2GWPYunUrfvazn12x3Zdeegkmkwm//OUvP/XXnuly0FWGMYbz589j8+bNBc09VVUVO3bswP79+8EYg8PhuPAiv9xXQkmSMG7cOCxYsADHjx8HYwx2ux1FRUVcblNT08f6XMgd9VVVxSuvvIK33noLjDH09PTAbDZjzpw5V2x3/PjxmD9/Pk6cOAHGGGw2G1e727Ztw6FDh27qn1mFwB3cWCxmDIVCpalUSqyuxKeAXbt2we12F7x9KpXCCy+8AEVR0NraiiVLlhT0O06SJMybNw8DAwOQZVnYzeVy2LlzJzweD1efX3zxRWSzWbS2tuKOO+4oaCKHJEmora1Ff38/stksXn/9da6pful0Gtu2bROal30zwR3ctra2cU888cSXX3rppdpr0SGto6oqjh49yv2JcPbsWXi9XiSTSVRVVRXsGY1GlJWVwe/3I51OY9SoUVyu1WpFIBDAyZMnuft8+vRpBINB5HI5lJeXc7VbWlqKUCiEI0eOcLd76tQp4YULNwvcv3GXLVvm/NnPfhZevnx5byaT0R04cOC2EydOWEUKaKmqiubmZhQX81fsZIyhubkZFouF2wU+XHRutVq5vXA4jL6+PsTj8Ys+nsvl0NfXx71fj8eDV155BSaTiWsKoiRJMBqNeO2112A0GrnOuEqSBL1ej9dee014meLOnTsve7eNy7X9xhtvoKuri7tdj8eDN95445JvUoFAAENDQ0Lhjkaj6OnpEVqjnEwm0dHRAUVRuN1MJsNV+Is7uF1dXVaz2SzPnj07CgArVqywBQKB5KpVq3h3BUVREIlEIOIyxhAMBoVcAPD7/UKux+NBe3s7vvCFL1z0cUVR8Nxzz3EHoaqqCmvWrEFjYyNUVS04vOyja5+rV6/G8eN8az/YR5ed7rvvPuzfvx89PT1cfmlpKVatWnXh9ypv2/feey927NiB/v5+LreqqgorV67E6NGjL/r40NAQurq6cPfdd3PtF/jwdVFWVib02ohEIjAYDEJuMplEQ0NDwdtzB3fixInJX/7yl2/l/221WtNms1ktLS3l3RVkWYbZbIaIyxi7IW48HkdxcfElXcYY6urq8M4773Dtd/bs2Zg+fTra2toQDocL/soryzKi0SimTZuGM2fOIBKJoKKiomA3Ho9jypQpWLx4MQ4ePMjV5wULFmDy5Mk4ffo04vF4wV+XFUVBPB7HxIkTcdddd+GDDz7gCv6tt96KiRMnXrIEp9VqvewYXY5UKiXsKooi7OZv6Ffw9rwNWCwWdezYsfwFQC/CzXoh/eGHH8aYMWMK3r6oqAibNm2CwWBAbW0tWlpaCn4h9/T0oLq6GkajEbW1tWhubi7IZYyhu7sb1dXVKCoqQn19Pddv66KiImzcuBFms5m73XPnzl2YSfXwww+jsrKSq90NGzYI19y9Wbihl4NuxlP6+bOmTz31VEG3kZEkCQ888AAefPBBSJKEmpoahMNh2O32yx6f/E+FEydO4M4774QkSZg1a1bBbigUQnNzM+rq6iBJEhYsWIAnn3yyoEBIkoS1a9figQcegCRJmD17NoLBIBwOR0HttrS0YOnSpZAkCQsXLuRq96GHHsKaNWtu2jf9Qrmhwb1ZD77BYMB3v/tdPPHEE5c98abX6/HFL34RP//5zy98vTIYDLjvvvtw/PhxnDlzBrIsfywM7KOC3v39/dizZw9Wrlx54e4Vf+kqinJRt6+v76Lu97//ffzd3/3dZSc35Nv4+c9/fuHEYP7/HTt2DK2trZds1+FwYM+ePbj33nsvtKvX6/H9738f3/72t6/Y7v3334//+q//Ej4heTNBc5WvEVarFZs3b8by5cuxdetWtLa2IhKJgDEGq9WK6dOn4/HHH8fXvva1T/w2tFgsqK+vx9GjR/HKK69gypQpqK6uhl6vh8/nQ19fH0wmE9atW3dhyd7F3JdffpnLtVqt+I//+A8sW7YMv/71r9He3v6xPs+YMQNf/epX8fjjj6O8vPwT7uXadTgcKC4u/kS7kiShtLQUmzdvxrJly7B161audj+t0JTHa4QkSTCbzVi/fj3WrFkDu92Ojo4OdHZ2Yu3ataipqUF5eflFT0jkV/fcfffdSCaTcDqdcDgcaGlpwf33349Vq1ahrKysYHdgYACNjY148MEHr+jm+/zFL34Rdrsddrsd77//Pr7yla9csc9msxn33HPPhXZdLhcaGhrw8MMPY/Xq1Vds98tf/jLuv/9+2O129PX14Z133sHGjRsv2+6nFQruNSZ/C9QFCxZgwoQJsFgsWLJkCZc7e/ZsTJgwAdFoFAsWLOB2p0yZAq/Xy+VarVYsXLgQc+fORTweF+pzTU0N+vv7hdpdsGABgsFgwe1+2qC3MILQIBRcgtAgFFyC0CAUXILQINzBHRgYKHv77bdv6erquvit7zmg0/oEIQb3WeWf/OQnt7/33nuznnjiCd0//uM/nlZVVcpfYOdFVVWIuvlbeIiWiLwR7Y7EvVHHaiTtarHPIx1fVVVH1OdC4Q6uoiisqqoqYDAYTJlMRrdr164lR48eLRXtbGNjI7cHfHiQjh07Jnxt79ixY9Dr9dxeOBzGwMAAfD4ftxuPx9Hd3S1cFKq9vV1ouVk2m8WpU6eEi4Ll75LBi6qqOHbsmNA3K8YYGhsbhcYoGAzC7XZjeHiY241Go7Db7QgGg9xuMpnE2bNnkUgkuN1MJsP1WuYO7vLly4PxeHx8ZWWl12QyqQ8//HCTqqqxjRs38u4KsixDr9fj0Ucf5XbzL6THHntMyFVVVch1u91obW3F6tWrud1AIICjR49i7dq13G4sFsOoUaNQX1/P7aZSKVgsFmzYsIHbzeVyMBqN2LRpE7ebX54oOkaMMSE3X+py5cqV3K7X60VzczPWrFnD7YbDYTQ0NGDdunXcbiKRwJtvvlnw9tzB/eY3v3nmm9/85hlejyCIqwedVSYIDULBJQgNQsElCA1CwSUIDULBJQgNQsElCA1CwSUIDULBJQgNQsElCA1Cd3kkCA3CHdy9e/fOePrpp9e2tbUVfhfrS3Az3+WRIK4l3HOVt2/fXuN0Otmrr766aOHChe8MDAyM9vl8Rrvdzt24oijwer0QcRlj8Pl8Qi4AYdfn82F4eFjIDYfD8Hg8Qm4ikRA+VplMRtiVZVlzYzQ8PCw8RsFgUNiNxWLC45tKpZDL5Qrenju4Tz/99MmtW7feYzQafblcTnK5XJWBQMAwODjIuyuoqopgMAgRN38nfxEXgLAbDAbh8/mE3Gg0Kuwmk0n4/X4hN5vNIhAICLmKooxojETbBcTHyOfzCR/ncDgsfJzj8biwm06nuZZdcgd39OjR+rvvvtu1cuXKM0ajkS1durR7cHAw9bnPfY53V5BlGU6nEyIuYwz9/f3CrsPhEHLdbjeKi4uF3EAgAMaYkBuLxZBIJITcVCoFv98v5OZyObhcLiFXVVUMDAxc9zFyOp0oLy8Xcr1eLwwGg5AbDoeRzWaF3Gu+rK+mpsZTU1NTeOlygiCuOnQ5iCA0CAWXIDQIXcclCA1C9XEJQoPQJy5BaBD6xCUIDUInpwhCg1BwCUKD0G9cgtAgBQU3k8noGxoabvF4PJa33357TlNT07ir0Tj9xiUIMQqa8qgoCv793/995pNPPmnZsWPH2EwmU/Taa6+9ptPpmKqqOsYYFEXhbjxfIEnEBT4M/vV2R9Lnkboj6fONeL75Ui83Yoy0Or6FUlBwS0pKlBkzZrgBmJcsWeLv7++fCAAfFf26faRFv0SLQo2k6JdoQalIJIL+/n74/X5uN1/0KxqNcrsjKfqVy+XQ0tIyoqJfItyoMRpp0S+Hw4FQKMTtJpNJ2Gy2v56iX+l02mixWGZ0dHREHA6Hefz48S6dTsdMJhOjol+FcyOLfpWUlNyQol+SJF33MaKiXx9hNptz//mf//kid28Igrgm0FllgtAgNHOKIDQITcAgCA1CwSUIDULBJQgNQsElCA1CwSUIDULBJQgNQsElCA1CwSUIDVJQcGOxmPEHP/jB+tbW1gn/8A//8PCRI0fGXOuOEQRxaQqaq1xaWpobHBz0MsbM1dXV/nPnzlnvuusuHwD09/eP8Xq9xt7eXu7G80W/RFzGmLALfFhfRsT1+Xxwu91CbjgcxvDwsJCbSCTg8XiE3HzRLxE3X/RLxFVV9YaM0fDwsPAY5VcWibixWEx4fK9Z0S+TyWRMp9PmiooKYzabNQNALpeThoeHy0OhkGFoaIi7s6qqIhQKQcRljAm7AITdYDCIQCAg5EajUWE3mUwiGAwKudlsVtjNF/3S0hj5fD74/X4hNxwOC49RPB4XPlbXpOhXJpMxrFy5Uh0aGrJWVFSoo0aNsgCA0Whkd9xxR8/AwEBqxYoV3J2VZRmDg4MQcRlj6OvrE3btdruQ63a7YTabhdxAIABVVYXcWCyGeDwu5KZSKfh8PiE3l8thaGhIyFVVFf39/dd9jJxOJ8rKyoRcr9cLvV4v5IbDYWQyGSH3mizrM5lM8le+8pXD3L0hCOKaQGeVCUKDUHAJQoPQQnqC0CC0kJ4gNAh9VSYIDULBJQgNQsElCA1CwSUIDULBJQgNUnBwE4mEWZZlXTweNyeTSf66EARBXDUKCm4kEimqr6/fdOzYsZof/OAH/+fpp5++91p3jCCIS1PQXOXy8vLslClTbKNHj87W19fbfvWrX80DgGw2qzt06NDCU6dOWaxWK3fjqqri1KlTKCsr43YZYzh16hQqKiq4XQA4ffo0Kisrub1QKASHw4FMJsPtxmIx2Gw2oevXqVQKp0+fhtFo5Haz2SxaWlpQUlLC7SqKgpaWFpSWlnK7+TEqLy/ndgHxMQoEAnA6nUgmk9xuJBJBd3e3UIG0RCKB9vZ2oSJnmUyGq1hYQcHNZrP6eDw+5d133y393e9+t/Cpp556EwCKiorUJUuW9LpcrtTy5cu5O6soCjweD0RcxhhcLpeQC3y4gkTE9Xq9sFgsQm4oFIJOpxNy4/E40um0kJvJZBCJRIRcWZbh8/mEXFVV4Xa7hcdoaGhIyHW5XKisrBRy/X4/ioqKhNxoNApFUYTcZDKJDz74oODtCwquXq9Xf/rTn76nKApbtWpVp9lsvvDWUFFRkbBYLOqoUaO4OyvLMiwWC0RcxtgNcTOZDEpLS4XbtVqtQq7RaBR2U6mU8PPN5XLCrqqqIxqjkpISITeZTAofK1mWhcdXp9MJt2symbhKihYaXDZt2jQXd28Igrgm0OUggtAgFFyC0CAUXILQIBRcgtAgFFyC0CAUXILQIBRcgtAgFFyC0CAUXILQIAUFN5vN6pqamub4/X5rU1PT7NbW1tFXo3G6yyNBiFHQlMdcLif98Ic/XPgv//Ivyrlz5yr27dt32+7du18BAMaY9NF/uRtnjF34E3FF2/3LfYh417tdLT7fkYzvn+9D1LkR4zvS51soBQXXYrEos2bNclZWVso1NTUBSZKmAUAmk9G9/vrrd3zwwQelIsugVFVFY2Oj8OAcPXqU2/tzV+QTPxwOY3BwEF6vl9uNx+Po7u5GKBTidtPpNNrb27mWfuXJZrM4deoUstkst6soCpqamqCqKrebH18RRjJG+Yp7Lhf/9PpoNAqHw4FAIMDtJpNJ2Gw2xGIxbjeTyXAtBywouOl02mgwGGr27NkzVqfTKTNnzgwAgMlkUuvr648zxmIbN27k7qwsyzAYDHj00Ue5XcYYJEnC448/LuQCEHLdbjdaW1uxevVqbjcQCODo0aNYu3YttxuLxXDw4EHU19dzu6lUClarFRs2bOB2c7kcioqKsGnTJm5XVVXo9Xo89thj3O5IxsjpdMJms2HlypXcrtfrRXNzM9asWcPthsNhNDQ0YN26ddzuNSn6ZTabc7/4xS9eyB9MvV5PdzIniBtIwfVxdTodhZUg/kqg2kEEoUGodhBBaBCagEEQGoSCSxAahH7jEoQGod+4BKFB6KsyQWgQCi5BaBAKLkFokIKCG4/Hjc8888xDHo9n1KFDh6b/+te/XnytO0YQxKUpaMqjyWSSOzs7Ix0dHWN/8YtfLFQUJfPkk0+2AIDb7a4IhUKS0+nkXnqiKAqCwaDkdDq5z1IxxvBRu0JnuERdr9cLv98v5IbDYQQCASE3kUgIH6tMJiPsyrI8ojESdQHxMXK73cJjFAgEhN1YLCY8vqlUSuVZYVdQcI1GI7NarTh8+PDEqqqqCV1dXfpgMKgrLS1lPT0944aGhl6y2WyneDurqqrO5XItstlsJ3ldxpjkcrk+a7PZmnldAHC5XLeLuMFgsGxwcHCCzWY7x+vGYjHL4ODgZ2w2Wwevm0qlzE6nc7bNZmvldbPZrHFoaKjWZrOd5nUVRdG7XK5bbTZbC687wjESdv1+f8XAwMBYm83WxeuGw2Hr4ODgFJvNdpbXTSQSxU6nc6bNZmvnddPpdFE2my0qWPjzxc6X+kulUobf/e53q3fv3n1HNBot/uMf/zg9/1g2m9W/+eabCwrZz1/+ybIs7d279xYRlzGG3bt333q9XZ/PZz1y5MhMETccDhc3NDTMFnHj8XjRoUOH5om46XTasH//fqExyuVyun379i0UPc579uy57uM7PDxc1tjYOF3EDQQCJe+///4sETcajZrefvvtuSJuMpk0vvXWW/ML3b6g37hms1n+2te+9tbatWubSktLUw8++KA9/1hDQ8Nkn89nSSQS3FXqm5qaPlNWViY0C2Pnzp0zwuFwSSgUKvxd6iN27do1ORQKWf1+v5nXLS4uTvT29pZFIhHuYrNer3eM2+2eGI1GLbyuz+fTOZ3OyiNHjozhdTs7Oyv8fv/4w4cPz+J133333c94vd6yvr4+7uP83nvvTfN6vcWRSKTgVWjpdNqwbdu2FQ6HozIUChXt2bNneqFuNpvVbd++/a5EImHq7OysPnPmTFWhrizL0iuvvHJnMBgsHxgYGLVz587Zhbqqqko7d+68w+12j4nFYsU7duyozWazBb+u//jHPy52Op3j582b17dt27ZFhTgjOqscDAb1mzdvvv3gwYNlx44dm8Drezye2Ouvv17wAfpzRo0a5XvnnXcqDxw4MJbXTSaTkS1btsxsaGgYz+u+8847k773ve993uv1cldrPnny5Iz333/fks1muW8n8atf/WrR3r17x/f19XG7s2bNCre1tcl2u52r+ngikZB++MMfLv23f/u3hX19fVwVppPJpO7HP/7xHb/97W/HHjx4sODwSZKkvv766yWtra21jY2NVS+++OLtiqIUFAJJktiePXuKBgYGxtnt9qI//elP4wpt12AwsEOHDum6u7snjBo1yv78888vTiaTBb3h6HQ69t5776nt7e2TDAZD9De/+U1dOp0u+M2qqakp19jYOP2///u/Fz3zzDN3+v3+Kz7fEQWXMSYVFRWxMWPGJBVF4S6VPnXq1JgkSYpI2wMDA5ZEImH6whe+wH0Pmdra2vTChQuHYrGYidd97733Pjtx4sSygYGBgl8UecaNG3fKaDRG//d//3cBrxuPx0snTJiQaW5u/iyvazAYlM7OzjGf+9znzvN4iqJIRqMxO3r0aHc2m+X6hlFSUqJ+61vfOm0ymapzuVzBL2KTyaROmDAhwhgzTJo0KVVdXV1wm0ajkU2aNCliNpvVO+64I8rTXwCYPHlyWK/Xs/b29plTpkzpKSkpKfhs0dSpU8M6nQ41NTWBj+pHF5ytqVOnRlpbW0va2tpusVqtE9xu9xW/CY4ouFVVVfKqVat6i4qKKhctWuTk9aPR6LSKiorKvr4+7k8vh8NRu2zZMikajXJ/3T18+HDN+PHji5cvX+7hdZ999tk93/nOd3bMmzevn9ft6uoaVV5eXnnffff18brf/va3WyorKw1Lly7t5nWDwaD+rrvu6ps6dWqSxysrK1P/5m/+ZnDx4sXq2LFjfbztjhs3Trd8+fL+FStW9BbqZDIZw6RJkyb19fWZ4vG4ddq0ab2F3nEll8vpx48fP7mlpWVab2/vZKvVOk1V1YI+rWVZ1lVVVU3t6OiY7nQ65y9btswoy3JBrqqqktVq/Uxvb+/k/fv3L6mrq3MZjcZcIS4AmEymz0yaNKl0+/btz3/961/fM3Xq1PSVHIkxmi9MEFqDZk4RhAah4BKEBqHgEoQGoeAShAah4BKEBqHgEoQGoeAShAah4BKEBqHgEoQG+X/Dcc4OaIWRHwAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAO4AAADnCAYAAAAZ4WrqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAAsTAAALEwEAmpwYAAAoS0lEQVR4nO2deZRU5Z33v7eWruqu6o1ma/YAzdqgQkRahLyaIBgUJTYmDKhJJoszepwkJ2fmJCeZzMwx7zhhJmcySeBkToyJIoqihEUQorQL0DRNA71R0EtVL9VVXfu+33uf9w8t3hhZ6nmaJRd/n3P6eLDu5z5P3ae+tdz7PPcnMcZAEIS20N3oDhAEwQ8FlyA0CAWXIDQIBZcgNAgFlyA0CAWXIDQIBZcgNAh3cM+ePVvx4osv1g0PD5dciw4RBHFlJN4JGBs2bFhZWVkpT5gwIfmjH/2oKZPJGBhj+mvUP4L41GAwGGSDwaAUtC3vzmVZNsyZM8fr9XrLM5mMbu/evZ89ffr0M7W1tdW8+1JVFR0dHVi4cCGvCsYY2tracMstt3C7ANDa2irkxuNxeDwezJgxg9tNpVIYHBzErFmzuN1MJgO73Y65c+dyu7Is4/z585g/fz63q6oqOjs7sWDBAm6XMYb29vbrPr7RaBR+vx/Tp0/ndhOJBFwuF2pqarjddDqNvr4+zJkzh9vN5XKsuLj4/65fv357QQJjjOvv1VdfnfaNb3zjkebm5jGMMWQyGeO2bdvamAC5XI698MILIipTVZX9/ve/F3aff/55IdflcrEDBw4IuX6/n+3evVvIjUaj7LXXXhNyk8kk2759u5CbzWbZiy++KOQqisL+8Ic/CLkjGaPBwUF26NAhIdfj8bB9+/YJuaFQiL3xxhtCbjwel3fs2PEEKzCH3J+469ev71u/fn0fr0cQxNWDzioThAa5ocGVJOlGNk8QmuWGBpfRkkKCEIK+KhOEBqHgEoQGoeAShAah4BKEBqHgEoQGoeAShAah67gEoUG4g3vkyJHJP/rRjzZejcbpOi5BiME9V3nq1Klum82mqqoqqaqKs2fPThoYGDCdOXOGu3FVVTEwMAARlzEm7ALA4OCgkOv3+2G324XcSCQCh8Mh5CaTSfT19Qm52WwW/f39Qq6iKMLujRojj8cjfKxCoZDw+MbjceHxTafTyGQyBW/PHVxJkoyZTKYsEomYS0tL06qqSowxqKrKuyuoqnrhTwTRdv+8bZE2RdsdiauqqubckTzfvP9pOs48cAdXp9OZv/Wtb3UFAoGSysrKVG1t7aDNZsssWrSId1eQZRk2mw0iLvtoraeo29bWJuS63W4oiiLkBgIBRKNRITcWi2F4eFjITaVScDgcQm4ul8P58+eF3Pxa3us9Rk6nE3q9Xsj1er1Ip9NCbjgcRiAQEHITiQScTmfB23MHd8KECaG1a9c28HoEQVw96HIQQWgQCi5BaBAKLkFoEAouQWgQmjlFEBqE7oBBEBqEvioThAah4BKEBqHgEoQG4Q5uKBQyeb3eclmW6cwSQdwguKc8/va3v6222Wy3r1ix4sxXv/rV7mvRKYIgLg93cB977LHBp556an5ZWVkyX/Tr+PHjVr2ev2Cfqqo4fvw4jEYjt8sYQ1NTE0wmE7cLAE1NTTCbzdxeOBxGf38/wuEwtxuPx3H+/Hkkk0luN5VKoa2tDbIsc7vZbBYnT54UuvymKAoaGxthMHC/VC6Mb1FREbebH1+RMQoEAnC5XAgEAtxuNBpFb28vYrEYt5tMJtHZ2cm1PC9PJpPhGlvu0fjpT3+6pLi4eNq8efMaTSaTeu+997bG4/HEgw8+yLsrKIqCVCoFEZcxhng8LuQCH662EXGHh4fR3t6OlStXcrvBYBAVFRVYs2YNtxuLxWAymYT6nE6nAUDIlWUZmUxGyFVVFclk8rqP79DQEM6fP4977rmH2/X5fGhpacHq1au53UgkAovFgrVr13K7yWQSf/rTnwrenju4//qv/3omm82et1gsMQAwm805o9HIiouLeXcFWZZRVFQEEZcxNiLXaDQKuWazWbjdkbgjOVYAhJ9vLpcTbldV1U/VGGUymREdK52u8FNO3MGtrKxMAUjxegRBXD3ochBBaBAKLkFoEAouQWgQCi5BaBAKLkFoEAouQWgQCi5BaBAKLkFoEAouQWgQ7uAePXp09L59+xb7/X7+2d8EQVwVuKc82u32zHPPPTfrkUceSf/93/99pyzLelVVhVatKIoCRVGEXMaYsAt8ODf0evd5JK4syyNqV/T5jqRdVVVHNL4j6bMWx5fnHmzcwV26dGmqubnZm0wmjR8t61vc2NhYyrsf4P8v+xJZEgh8uDRPZEkgAOHlhJFIBAMDAwgGg9xuIpFAV1cX4vE4t5tOp9He3o5sNsvt5nI5tLS0CBejOn78ONcE+DyMMRw/flxoSSAgPr6hUAgulwter5fbjcVisNvtiEQi3G4qlcLZs2eRSvFP5ecdV+4junfv3s/o9frKuro6m8lkUtetW3dCluXYxo38JXNlWYZOp8Ojjz7K7ebfkUVdRVGEXLfbjdbWVqFlX4FAAEePHhVa9hWLxVBZWYn6+npuN5VKobi4GBs2bOB2c7kc9Ho9Nm3axO3m3yiu9xg5nU7YbDahpZderxfNzc1CSy/D4TAaGhqwbt06bjeRSODNN98seHvu4H7ve9/rBnBV7nxB91UmCDHovsoEoUHochBBaBAKLkFoEKodRBAahH7jEoQGoa/KBKFBKLgEoUEouAShQSi4BKFB6KwyQWgQ7uBGIhHdd77znQecTmfVSBuns8oEIQb3XOXdu3fPfPnll6d84xvfaK2urg729vaOc7vdxnPnznE3rqoq3G43RFzGmLALfFgDSMT1+/1wOp1CbiQSwdDQkJCbSCTgcrmE3EwmI3ysFEXR3Bh5PB7hMQoGg8JuLBYTHt9UKsW1Qog7uOFweNLMmTPHOByO6tmzZw+Gw2FLIpHQiyxzU1UV8XhcaIkc8OGLWdQVbTccDiMWiwm50WhU2E2lUsJ9zmazwq6iKMIuY2xEYyTqjmSMRuImEgnhY5VOp7mWXXIH9+mnnz58++23d86ZMyduNBrZ4sWL7Xa7PX3nnXfy7gqyLMPhcEDEZYyhu7tb2O3q6hJy3W43DAaDkBsIBJDNZoXcWCyGUCgk5KZSKbjdbiE3l8uhv79fyFVVFb29vdd9jJxOJ0pKSoRcr9cLxpiQGw6HEY/HhdxEIgG/31/w9kIrnOvq6jwiHkEQVwe6HEQQGoQuBxGEBqFFBgShQeirMkFoEAouQWgQCi5BaBAKLkFoEDqrTBAahM4qE4QG4Q5uf39/9YEDB5bG4/Hia9EhgiCuDPeUx/fff39+c3Ozua6ujgHAR0W/pFwux914vkiSiJsvUSHi5tsWcfNFsMi9MvmiX6JjpKqqpp7vSN1rWvRr0qRJp48cObLoueeem/fUU0+d+ajol1Xk92q+oJRIUSjGGJqamlBUVMTtAsCJEydgMpm4vXA4jIGBAYRCIW43Ho+jq6sLiUSC202n02hraxN6UeRyOZw8eZLbAz58gxMtzJYfI9HCbKLjGwwG4XK5uCbt54lGo7Db7YhGo9xuMpnE2bNnkU6nud1MJsO1PXdizpw5U2GxWMrr6uo6r0bRL0mShApK5Yt+ibqyLAu5N7LoV0VFhXDRL7PZfEOKfjHGrvsYUdGvi/Dd7363F0Avr0cQxNWDruMShAah4BKEBqHgEoQGoeAShAah4N7E5M/MptNp5HI55HI5mq12kyB0zynirxvGGCKRCE6ePAmPxwNJkpBKpfDqq6+irKwMixcvRnV1Nc0V1zAU3JsMxhjOnDmDjo4OLFmyBCtWrLgwwUVVVQwPD+Po0aOoqqr62GOEtqCvyjcR+dAODAzgkUcewaxZs1BUVASdTgedTgeDwYBJkybhS1/6EkwmE95++22ue/kSfz1QcG8iQqEQOjo6cN9998FkMl3yq7Ber0ddXR1kWUZPTw/97tUgFNybiJMnT6Kurq6gucE6nQ4rVqxAS0sLfepqEO7gvvvuu2P+6Z/+ae2uXbvGXosOEWIoigKPx4OpU6cWfNLJarVCp9MhlUpd494RVxvuMxP/8z//s1SSpOLbbrtNUhRF6unpGe9yuYpsNht344qiwOVyQcRljAm7wIeLBURcn8+HgYEBITccDmNwcFDITSQSFybPX4xUKgVFUbhONkmSBIvFgpaWFowde/H3YVmWhY+zqqojGl/RMRoeHhYeo2AwKDxGsVjssmN0Oa550a8pU6ZkAKQ7Ojrm19fXe2OxWHEqldJFIhHeXUFVVSSTSYi4jDGkUikhF4CwG4vFhPs8EjeZTF62z5lMBrIsc+9XURQkEolL7ldRFBqjAonH48Lu9Sj61Xjy5Mn5NTU1NoPBwG677TZHT09PeunSpby7gizL6O3thYibLwol6p47d07Idbvd0Ov1Qm4gEEA6nRZy8xXkLuWqqorBwUFks9mC1xnnq+k99NBDKCkpueg2uVwODodDqM+qqqK7u/u6j5HT6URxcbGQ6/V6oSiKkJuv9CfiJhIJeL3egrfnDu706dNj06dPP87rEdcWSZIwZcoUdHV1oba2tqDfucFgEEajEWaz+Tr0kLia0FnlmwRJkrBo0SKcOnUKyWTyitvLsoyGhgYsXboUOh29DLQGjdhNhMViwZ133ok9e/YgGo1e9PosYwyZTAaHDh3ChAkTMGnSpBvQU2Kk0Hy3mwhJkjBz5kwYDAbs2rULNTU1mDt3LsrKyiBJEhKJBBwOB86cOYPa2lrceuutNF9Zo1BwbzIkScK0adNQXV2Nc+fO4fDhw4hGoxgaGkJNTQ0mT56MdevWwWq1Umg1zA0N7qfhhcMYQy6Xg8vlwvnz53Hu3DnMnj0bkydPRnFx8WWPQd71er3o7+9Hf38/7HY7qqurYTabL+lKkgSTyYR58+Zh9OjRGBwchMfjwe23335F9y/77HQ60d3djfPnz3P32ePxYHBwsKA+/2W7LpcLPT09OH/+PKZMmXJF99PGDQ3uzTxHNn/f53fffRdbtmxBU1MTfD4fFEXB5s2bMX/+fHz9619HfX39J8KQd0+ePImuri6MHTsW48aNw+c//3n09fXh2LFjGDNmDJYvX35RV5ZltLS0fMxdvXr1BXfs2LG46667LhrCXC53oc8nTpy40OctW7agtrYWf/u3f4svfelLBbe7Zs2aK7abdxsaGrB169aPtfub3/zmsu1+amGMjegvk8kYt23b1sYEyOVy7IUXXhBRmaqq7Pe//72w+/zzzwu5LpeLHThw4IrbJZNJ9s///M+svLycAbjon8lkYps2bWLDw8OfcF999VV25MgRlk6nmaqqH+t7LpdjnZ2d7A9/+APz+Xwfe7wQt6Oj45LuT37yE1ZWVnbZPm/cuJF5PJ5PuDt27CioXb/ff+FxVVVZIpFgP/7xj6/Y7qOPPsq8Xu/H9n0xBgcH2aFDh644RhfD4/Gwffv2CbmhUIi98cYbQm48Hpd37NjxBCswd/Qb9xqQ/6R49tlnLzuNLZPJYPv27TAYDNiyZQuKi4uhKAoOHTqEefPmYd68eZ/4dJEkCQaDAXPnzsWoUaNw4MABrF+/HmazGYqi4ODBg1d0582bh6qqqk+4W7duxbPPPnvZm3NnMhm8/PLLKCoqwpYtW2A2m6GqKt566y3U1tZi7ty5l2131KhR2L9//4V2GWPYunUrfvazn12x3Zdeegkmkwm//OUvP/XXnuly0FWGMYbz589j8+bNBc09VVUVO3bswP79+8EYg8PhuPAiv9xXQkmSMG7cOCxYsADHjx8HYwx2ux1FRUVcblNT08f6XMgd9VVVxSuvvIK33noLjDH09PTAbDZjzpw5V2x3/PjxmD9/Pk6cOAHGGGw2G1e727Ztw6FDh27qn1mFwB3cWCxmDIVCpalUSqyuxKeAXbt2we12F7x9KpXCCy+8AEVR0NraiiVLlhT0O06SJMybNw8DAwOQZVnYzeVy2LlzJzweD1efX3zxRWSzWbS2tuKOO+4oaCKHJEmora1Ff38/stksXn/9da6pful0Gtu2bROal30zwR3ctra2cU888cSXX3rppdpr0SGto6oqjh49yv2JcPbsWXi9XiSTSVRVVRXsGY1GlJWVwe/3I51OY9SoUVyu1WpFIBDAyZMnuft8+vRpBINB5HI5lJeXc7VbWlqKUCiEI0eOcLd76tQp4YULNwvcv3GXLVvm/NnPfhZevnx5byaT0R04cOC2EydOWEUKaKmqiubmZhQX81fsZIyhubkZFouF2wU+XHRutVq5vXA4jL6+PsTj8Ys+nsvl0NfXx71fj8eDV155BSaTiWsKoiRJMBqNeO2112A0GrnOuEqSBL1ej9dee014meLOnTsve7eNy7X9xhtvoKuri7tdj8eDN95445JvUoFAAENDQ0Lhjkaj6OnpEVqjnEwm0dHRAUVRuN1MJsNV+Is7uF1dXVaz2SzPnj07CgArVqywBQKB5KpVq3h3BUVREIlEIOIyxhAMBoVcAPD7/UKux+NBe3s7vvCFL1z0cUVR8Nxzz3EHoaqqCmvWrEFjYyNUVS04vOyja5+rV6/G8eN8az/YR5ed7rvvPuzfvx89PT1cfmlpKVatWnXh9ypv2/feey927NiB/v5+LreqqgorV67E6NGjL/r40NAQurq6cPfdd3PtF/jwdVFWVib02ohEIjAYDEJuMplEQ0NDwdtzB3fixInJX/7yl2/l/221WtNms1ktLS3l3RVkWYbZbIaIyxi7IW48HkdxcfElXcYY6urq8M4773Dtd/bs2Zg+fTra2toQDocL/soryzKi0SimTZuGM2fOIBKJoKKiomA3Ho9jypQpWLx4MQ4ePMjV5wULFmDy5Mk4ffo04vF4wV+XFUVBPB7HxIkTcdddd+GDDz7gCv6tt96KiRMnXrIEp9VqvewYXY5UKiXsKooi7OZv6Ffw9rwNWCwWdezYsfwFQC/CzXoh/eGHH8aYMWMK3r6oqAibNm2CwWBAbW0tWlpaCn4h9/T0oLq6GkajEbW1tWhubi7IZYyhu7sb1dXVKCoqQn19Pddv66KiImzcuBFms5m73XPnzl2YSfXwww+jsrKSq90NGzYI19y9Wbihl4NuxlP6+bOmTz31VEG3kZEkCQ888AAefPBBSJKEmpoahMNh2O32yx6f/E+FEydO4M4774QkSZg1a1bBbigUQnNzM+rq6iBJEhYsWIAnn3yyoEBIkoS1a9figQcegCRJmD17NoLBIBwOR0HttrS0YOnSpZAkCQsXLuRq96GHHsKaNWtu2jf9Qrmhwb1ZD77BYMB3v/tdPPHEE5c98abX6/HFL34RP//5zy98vTIYDLjvvvtw/PhxnDlzBrIsfywM7KOC3v39/dizZw9Wrlx54e4Vf+kqinJRt6+v76Lu97//ffzd3/3dZSc35Nv4+c9/fuHEYP7/HTt2DK2trZds1+FwYM+ePbj33nsvtKvX6/H9738f3/72t6/Y7v3334//+q//Ej4heTNBc5WvEVarFZs3b8by5cuxdetWtLa2IhKJgDEGq9WK6dOn4/HHH8fXvva1T/w2tFgsqK+vx9GjR/HKK69gypQpqK6uhl6vh8/nQ19fH0wmE9atW3dhyd7F3JdffpnLtVqt+I//+A8sW7YMv/71r9He3v6xPs+YMQNf/epX8fjjj6O8vPwT7uXadTgcKC4u/kS7kiShtLQUmzdvxrJly7B161audj+t0JTHa4QkSTCbzVi/fj3WrFkDu92Ojo4OdHZ2Yu3ataipqUF5eflFT0jkV/fcfffdSCaTcDqdcDgcaGlpwf33349Vq1ahrKysYHdgYACNjY148MEHr+jm+/zFL34Rdrsddrsd77//Pr7yla9csc9msxn33HPPhXZdLhcaGhrw8MMPY/Xq1Vds98tf/jLuv/9+2O129PX14Z133sHGjRsv2+6nFQruNSZ/C9QFCxZgwoQJsFgsWLJkCZc7e/ZsTJgwAdFoFAsWLOB2p0yZAq/Xy+VarVYsXLgQc+fORTweF+pzTU0N+vv7hdpdsGABgsFgwe1+2qC3MILQIBRcgtAgFFyC0CAUXILQINzBHRgYKHv77bdv6erquvit7zmg0/oEIQb3WeWf/OQnt7/33nuznnjiCd0//uM/nlZVVcpfYOdFVVWIuvlbeIiWiLwR7Y7EvVHHaiTtarHPIx1fVVVH1OdC4Q6uoiisqqoqYDAYTJlMRrdr164lR48eLRXtbGNjI7cHfHiQjh07Jnxt79ixY9Dr9dxeOBzGwMAAfD4ftxuPx9Hd3S1cFKq9vV1ouVk2m8WpU6eEi4Ll75LBi6qqOHbsmNA3K8YYGhsbhcYoGAzC7XZjeHiY241Go7Db7QgGg9xuMpnE2bNnkUgkuN1MJsP1WuYO7vLly4PxeHx8ZWWl12QyqQ8//HCTqqqxjRs38u4KsixDr9fj0Ucf5XbzL6THHntMyFVVVch1u91obW3F6tWrud1AIICjR49i7dq13G4sFsOoUaNQX1/P7aZSKVgsFmzYsIHbzeVyMBqN2LRpE7ebX54oOkaMMSE3X+py5cqV3K7X60VzczPWrFnD7YbDYTQ0NGDdunXcbiKRwJtvvlnw9tzB/eY3v3nmm9/85hlejyCIqwedVSYIDULBJQgNQsElCA1CwSUIDULBJQgNQsElCA1CwSUIDULBJQgNQsElCA1Cd3kkCA3CHdy9e/fOePrpp9e2tbUVfhfrS3Az3+WRIK4l3HOVt2/fXuN0Otmrr766aOHChe8MDAyM9vl8Rrvdzt24oijwer0QcRlj8Pl8Qi4AYdfn82F4eFjIDYfD8Hg8Qm4ikRA+VplMRtiVZVlzYzQ8PCw8RsFgUNiNxWLC45tKpZDL5Qrenju4Tz/99MmtW7feYzQafblcTnK5XJWBQMAwODjIuyuoqopgMAgRN38nfxEXgLAbDAbh8/mE3Gg0Kuwmk0n4/X4hN5vNIhAICLmKooxojETbBcTHyOfzCR/ncDgsfJzj8biwm06nuZZdcgd39OjR+rvvvtu1cuXKM0ajkS1durR7cHAw9bnPfY53V5BlGU6nEyIuYwz9/f3CrsPhEHLdbjeKi4uF3EAgAMaYkBuLxZBIJITcVCoFv98v5OZyObhcLiFXVVUMDAxc9zFyOp0oLy8Xcr1eLwwGg5AbDoeRzWaF3Gu+rK+mpsZTU1NTeOlygiCuOnQ5iCA0CAWXIDQIXcclCA1C9XEJQoPQJy5BaBD6xCUIDUInpwhCg1BwCUKD0G9cgtAgBQU3k8noGxoabvF4PJa33357TlNT07ir0Tj9xiUIMQqa8qgoCv793/995pNPPmnZsWPH2EwmU/Taa6+9ptPpmKqqOsYYFEXhbjxfIEnEBT4M/vV2R9Lnkboj6fONeL75Ui83Yoy0Or6FUlBwS0pKlBkzZrgBmJcsWeLv7++fCAAfFf26faRFv0SLQo2k6JdoQalIJIL+/n74/X5uN1/0KxqNcrsjKfqVy+XQ0tIyoqJfItyoMRpp0S+Hw4FQKMTtJpNJ2Gy2v56iX+l02mixWGZ0dHREHA6Hefz48S6dTsdMJhOjol+FcyOLfpWUlNyQol+SJF33MaKiXx9hNptz//mf//kid28Igrgm0FllgtAgNHOKIDQITcAgCA1CwSUIDULBJQgNQsElCA1CwSUIDULBJQgNQsElCA1CwSUIDVJQcGOxmPEHP/jB+tbW1gn/8A//8PCRI0fGXOuOEQRxaQqaq1xaWpobHBz0MsbM1dXV/nPnzlnvuusuHwD09/eP8Xq9xt7eXu7G80W/RFzGmLALfFhfRsT1+Xxwu91CbjgcxvDwsJCbSCTg8XiE3HzRLxE3X/RLxFVV9YaM0fDwsPAY5VcWibixWEx4fK9Z0S+TyWRMp9PmiooKYzabNQNALpeThoeHy0OhkGFoaIi7s6qqIhQKQcRljAm7AITdYDCIQCAg5EajUWE3mUwiGAwKudlsVtjNF/3S0hj5fD74/X4hNxwOC49RPB4XPlbXpOhXJpMxrFy5Uh0aGrJWVFSoo0aNsgCA0Whkd9xxR8/AwEBqxYoV3J2VZRmDg4MQcRlj6OvrE3btdruQ63a7YTabhdxAIABVVYXcWCyGeDwu5KZSKfh8PiE3l8thaGhIyFVVFf39/dd9jJxOJ8rKyoRcr9cLvV4v5IbDYWQyGSH3mizrM5lM8le+8pXD3L0hCOKaQGeVCUKDUHAJQoPQQnqC0CC0kJ4gNAh9VSYIDULBJQgNQsElCA1CwSUIDULBJQgNUnBwE4mEWZZlXTweNyeTSf66EARBXDUKCm4kEimqr6/fdOzYsZof/OAH/+fpp5++91p3jCCIS1PQXOXy8vLslClTbKNHj87W19fbfvWrX80DgGw2qzt06NDCU6dOWaxWK3fjqqri1KlTKCsr43YZYzh16hQqKiq4XQA4ffo0Kisrub1QKASHw4FMJsPtxmIx2Gw2oevXqVQKp0+fhtFo5Haz2SxaWlpQUlLC7SqKgpaWFpSWlnK7+TEqLy/ndgHxMQoEAnA6nUgmk9xuJBJBd3e3UIG0RCKB9vZ2oSJnmUyGq1hYQcHNZrP6eDw+5d133y393e9+t/Cpp556EwCKiorUJUuW9LpcrtTy5cu5O6soCjweD0RcxhhcLpeQC3y4gkTE9Xq9sFgsQm4oFIJOpxNy4/E40um0kJvJZBCJRIRcWZbh8/mEXFVV4Xa7hcdoaGhIyHW5XKisrBRy/X4/ioqKhNxoNApFUYTcZDKJDz74oODtCwquXq9Xf/rTn76nKApbtWpVp9lsvvDWUFFRkbBYLOqoUaO4OyvLMiwWC0RcxtgNcTOZDEpLS4XbtVqtQq7RaBR2U6mU8PPN5XLCrqqqIxqjkpISITeZTAofK1mWhcdXp9MJt2symbhKihYaXDZt2jQXd28Igrgm0OUggtAgFFyC0CAUXILQIBRcgtAgFFyC0CAUXILQIBRcgtAgFFyC0CAUXILQIAUFN5vN6pqamub4/X5rU1PT7NbW1tFXo3G6yyNBiFHQlMdcLif98Ic/XPgv//Ivyrlz5yr27dt32+7du18BAMaY9NF/uRtnjF34E3FF2/3LfYh417tdLT7fkYzvn+9D1LkR4zvS51soBQXXYrEos2bNclZWVso1NTUBSZKmAUAmk9G9/vrrd3zwwQelIsugVFVFY2Oj8OAcPXqU2/tzV+QTPxwOY3BwEF6vl9uNx+Po7u5GKBTidtPpNNrb27mWfuXJZrM4deoUstkst6soCpqamqCqKrebH18RRjJG+Yp7Lhf/9PpoNAqHw4FAIMDtJpNJ2Gw2xGIxbjeTyXAtBywouOl02mgwGGr27NkzVqfTKTNnzgwAgMlkUuvr648zxmIbN27k7qwsyzAYDHj00Ue5XcYYJEnC448/LuQCEHLdbjdaW1uxevVqbjcQCODo0aNYu3YttxuLxXDw4EHU19dzu6lUClarFRs2bOB2c7kcioqKsGnTJm5XVVXo9Xo89thj3O5IxsjpdMJms2HlypXcrtfrRXNzM9asWcPthsNhNDQ0YN26ddzuNSn6ZTabc7/4xS9eyB9MvV5PdzIniBtIwfVxdTodhZUg/kqg2kEEoUGodhBBaBCagEEQGoSCSxAahH7jEoQGod+4BKFB6KsyQWgQCi5BaBAKLkFokIKCG4/Hjc8888xDHo9n1KFDh6b/+te/XnytO0YQxKUpaMqjyWSSOzs7Ix0dHWN/8YtfLFQUJfPkk0+2AIDb7a4IhUKS0+nkXnqiKAqCwaDkdDq5z1IxxvBRu0JnuERdr9cLv98v5IbDYQQCASE3kUgIH6tMJiPsyrI8ojESdQHxMXK73cJjFAgEhN1YLCY8vqlUSuVZYVdQcI1GI7NarTh8+PDEqqqqCV1dXfpgMKgrLS1lPT0944aGhl6y2WyneDurqqrO5XItstlsJ3ldxpjkcrk+a7PZmnldAHC5XLeLuMFgsGxwcHCCzWY7x+vGYjHL4ODgZ2w2Wwevm0qlzE6nc7bNZmvldbPZrHFoaKjWZrOd5nUVRdG7XK5bbTZbC687wjESdv1+f8XAwMBYm83WxeuGw2Hr4ODgFJvNdpbXTSQSxU6nc6bNZmvnddPpdFE2my0qWPjzxc6X+kulUobf/e53q3fv3n1HNBot/uMf/zg9/1g2m9W/+eabCwrZz1/+ybIs7d279xYRlzGG3bt333q9XZ/PZz1y5MhMETccDhc3NDTMFnHj8XjRoUOH5om46XTasH//fqExyuVyun379i0UPc579uy57uM7PDxc1tjYOF3EDQQCJe+///4sETcajZrefvvtuSJuMpk0vvXWW/ML3b6g37hms1n+2te+9tbatWubSktLUw8++KA9/1hDQ8Nkn89nSSQS3FXqm5qaPlNWViY0C2Pnzp0zwuFwSSgUKvxd6iN27do1ORQKWf1+v5nXLS4uTvT29pZFIhHuYrNer3eM2+2eGI1GLbyuz+fTOZ3OyiNHjozhdTs7Oyv8fv/4w4cPz+J133333c94vd6yvr4+7uP83nvvTfN6vcWRSKTgVWjpdNqwbdu2FQ6HozIUChXt2bNneqFuNpvVbd++/a5EImHq7OysPnPmTFWhrizL0iuvvHJnMBgsHxgYGLVz587Zhbqqqko7d+68w+12j4nFYsU7duyozWazBb+u//jHPy52Op3j582b17dt27ZFhTgjOqscDAb1mzdvvv3gwYNlx44dm8Drezye2Ouvv17wAfpzRo0a5XvnnXcqDxw4MJbXTSaTkS1btsxsaGgYz+u+8847k773ve993uv1cldrPnny5Iz333/fks1muW8n8atf/WrR3r17x/f19XG7s2bNCre1tcl2u52r+ngikZB++MMfLv23f/u3hX19fVwVppPJpO7HP/7xHb/97W/HHjx4sODwSZKkvv766yWtra21jY2NVS+++OLtiqIUFAJJktiePXuKBgYGxtnt9qI//elP4wpt12AwsEOHDum6u7snjBo1yv78888vTiaTBb3h6HQ69t5776nt7e2TDAZD9De/+U1dOp0u+M2qqakp19jYOP2///u/Fz3zzDN3+v3+Kz7fEQWXMSYVFRWxMWPGJBVF4S6VPnXq1JgkSYpI2wMDA5ZEImH6whe+wH0Pmdra2vTChQuHYrGYidd97733Pjtx4sSygYGBgl8UecaNG3fKaDRG//d//3cBrxuPx0snTJiQaW5u/iyvazAYlM7OzjGf+9znzvN4iqJIRqMxO3r0aHc2m+X6hlFSUqJ+61vfOm0ymapzuVzBL2KTyaROmDAhwhgzTJo0KVVdXV1wm0ajkU2aNCliNpvVO+64I8rTXwCYPHlyWK/Xs/b29plTpkzpKSkpKfhs0dSpU8M6nQ41NTWBj+pHF5ytqVOnRlpbW0va2tpusVqtE9xu9xW/CY4ouFVVVfKqVat6i4qKKhctWuTk9aPR6LSKiorKvr4+7k8vh8NRu2zZMikajXJ/3T18+HDN+PHji5cvX+7hdZ999tk93/nOd3bMmzevn9ft6uoaVV5eXnnffff18brf/va3WyorKw1Lly7t5nWDwaD+rrvu6ps6dWqSxysrK1P/5m/+ZnDx4sXq2LFjfbztjhs3Trd8+fL+FStW9BbqZDIZw6RJkyb19fWZ4vG4ddq0ab2F3nEll8vpx48fP7mlpWVab2/vZKvVOk1V1YI+rWVZ1lVVVU3t6OiY7nQ65y9btswoy3JBrqqqktVq/Uxvb+/k/fv3L6mrq3MZjcZcIS4AmEymz0yaNKl0+/btz3/961/fM3Xq1PSVHIkxmi9MEFqDZk4RhAah4BKEBqHgEoQGoeAShAah4BKEBqHgEoQGoeAShAah4BKEBqHgEoQG+X/Dcc4OaIWRHwAAAABJRU5ErkJggg==" }, "metadata": { "needs_background": "light" @@ -734,14 +711,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[35m\u001b[1mBob\u001b[0m\u001b[35m\u001b[0m: {\n", + "\u001B[35m\u001B[1mBob\u001B[0m\u001B[35m\u001B[0m: {\n", " \"thought\": \"Alice is trying to build a vertical line now. I need to block her next move otherwise she will have a chance to win. I will place my piece at [5, 7].\",\n", " \"move\": [\n", " 5,\n", " 7\n", " ]\n", "}\n", - "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", + "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -762,10 +739,8 @@ }, { "data": { - "image/png": "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", - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/png": "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" }, "metadata": { "needs_background": "light" @@ -776,14 +751,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[32m\u001b[1mAlice\u001b[0m\u001b[32m\u001b[0m: {\n", + "\u001B[32m\u001B[1mAlice\u001B[0m\u001B[32m\u001B[0m: {\n", " \"thought\": \"My opponent is trying to block me. I should place my piece at [8, 7] to create a potential line for myself.\",\n", " \"move\": [\n", " 8,\n", " 7\n", " ]\n", "}\n", - "\u001b[36m\u001b[1mHost\u001b[0m\u001b[36m\u001b[0m: The current board is as follows:\n", + "\u001B[36m\u001B[1mHost\u001B[0m\u001B[36m\u001B[0m: The current board is as follows:\n", "000000000000000\n", "000000000000000\n", "000000000000000\n", @@ -804,10 +779,8 @@ }, { "data": { - "image/png": "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", - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAO4AAADnCAYAAAAZ4WrqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAAsTAAALEwEAmpwYAAArfUlEQVR4nO2deZSU1Z33v08tXdXd1RvdLM0u0CDQoEIEWoS8miAQECU0SQioIZPFGT1mOc7MMcdMxjnJO47MeCYTAyeTqIkStJUlLIKg0oJA0zQNvUFB03tXV3Xt+17Pc98/tHhjZKl7mwaf9vc5p48Huz7Pvf3c+lY9y73PT2KMgSAIdaG51R0gCIIfCi5BqBAKLkGoEAouQagQCi5BqBAKLkGoEAouQagQ7uCeP3++8PXXX6/o7+/PGYwOEQRxfSTeCRjr1q1bUlRUlBo9enTk2WefrY3H4zrGmHaQ+kcQXxh0Ol1Kp9PJGb2Wd+OpVEp3++23OxwOR0E8Htfs3bv3S2fPnv1leXl5Ke+2FEVBS0sLZs+ezauCMYampibccccd3C4ANDY2CrmhUAh2ux2TJ0/mdqPRKHp7ezF16lRuNx6Po6OjA9OnT+d2U6kULl68iJkzZ3K7iqLg3LlzmDVrFrfLGENzc/NNH99AIACXy4VJkyZxu+FwGFarFWVlZdxuLBZDV1cXbr/9dm43mUyy7Ozs/7t27dptGQmMMa6ft956a+L3vve9b9TV1Q1njCEej+u3bt3axARIJpPstddeE1GZoijsj3/8o7D76quvCrlWq5UdOHBAyHW5XGz37t1CbiAQYG+//baQG4lE2LZt24TcRCLBXn/9dSFXlmX2pz/9ScgdyBj19vayQ4cOCbl2u53t27dPyPV6vWznzp1CbigUSlVVVT3OMswh9zfu2rVru9auXdvF6xEEceOgq8oEoUJuaXAlSbqVzROEarmlwWW0pJAghKBDZYJQIRRcglAhFFyCUCEUXIJQIRRcglAhFFyCUCF0H5cgVAh3cI8dOzbu2WefXX8jGqf7uAQhBvdc5QkTJtjMZrOiKIqkKArOnz8/tqenx9DQ0MDduKIo6OnpgYjLGBN2AaC3t1fIdblc6OjoEHL9fj86OzuF3Egkgq6uLiE3kUigu7tbyJVlWdi9VWNkt9uF95XX6xUe31AoJDy+sVgM8Xg849dzB1eSJH08Hs/3+/3GvLy8mKIoEmMMiqLwbgqKolz+EUG03b9uW6RN0XYH4iqKojp3IH9v2v8i7WceuIOr0WiMP/jBD1rdbndOUVFRtLy8vNdsNsfnzJnDuymkUimYzWaIuOyTtZ6iblNTk5Brs9kgy7KQ63a7EQgEhNxgMIj+/n4hNxqNorOzU8hNJpO4ePGikJtey3uzx8hisUCr1Qq5DocDsVhMyPX5fHC73UJuOByGxWLJ+PXcwR09erR31apV1bweQRA3DrodRBAqhIJLECqEgksQKoSCSxAqhGZOEYQKoSdgEIQKoUNlglAhFFyCUCEUXIJQIdzB9Xq9BofDUZBKpejKEkHcIrinPP7hD38oNZvNdy9evLjhO9/5zqXB6BRBENeGO7iPPvpo75NPPjkzPz8/ki76dfLkSZNWy1+wT1EUnDx5Enq9nttljKG2thYGg4HbBYDa2loYjUZuz+fzobu7Gz6fj9sNhUK4ePEiIpEItxuNRtHU1IRUKsXtJhIJnD59Wuj2myzLqKmpgU7H/Va5PL5ZWVncbnp8RcbI7XbDarXC7XZzu4FAAO3t7QgGg9xuJBLBuXPnuJbnpYnH41xjyz0av/rVr+ZlZ2dPnDFjRo3BYFAeeOCBxlAoFH7ooYd4NwVZlhGNRiHiMsYQCoWEXODj1TYibn9/P5qbm7FkyRJu1+PxoLCwECtWrOB2g8EgDAaDUJ9jsRgACLmpVArxeFzIVRQFkUjkpo9vX18fLl68iPvvv5/bdTqdqK+vx7Jly7hdv9+P3NxcrFq1ituNRCJ47733Mn49d3Cfe+65hkQicTE3NzcIAEajManX61l2djbvppBKpZCVlQURlzE2IFev1wu5RqNRuN2BuAPZVwCE/95kMincrqIoX6gxisfjA9pXGk3ml5y4g1tUVBQFEOX1CIK4cdDtIIJQIRRcglAhFFyCUCEUXIJQIRRcglAhFFyCUCEUXIJQIRRcglAhFFyCUCHcwT1+/HjJvn375rpcLv7Z3wRB3BC4pzx2dHTEX3755anf+MY3Yv/wD/9wLpVKaRVFEVq1IssyZFkWchljwi7w8dzQm93ngbipVGpA7Yr+vQNpV1GUAY3vQPqsxvHleQYbd3AXLFgQraurc0QiEf0ny/rm1tTU5PFuB/j/y75ElgQCHy/NE1kSCEB4OaHf70dPTw88Hg+3Gw6H0drailAoxO3GYjE0NzcjkUhwu8lkEvX19cLFqE6ePMk1AT4NYwwnT54UWhIIiI+v1+uF1WqFw+HgdoPBIDo6OuD3+7ndaDSK8+fPIxrln8rPO67ce3Tv3r23abXaooqKCrPBYFBWr159KpVKBdev5y+Zm0qloNFo8Mgjj3C76U9kUVeWZSHXZrOhsbFRaNmX2+3G8ePHhZZ9BYNBFBUVobKyktuNRqPIzs7GunXruN1kMgmtVosNGzZwu+kPips9RhaLBWazWWjppcPhQF1dndDSS5/Ph+rqaqxevZrbDYfDeOeddzJ+PXdwf/rTn14CcEOefEHPVSYIMei5ygShQuh2EEGoEAouQagQqh1EECqEznEJQoXQoTJBqBAKLkGoEAouQagQCi5BqBC6qkwQKoQ7uH6/X/PjH//4QYvFUjzQxumqMkGIwT1Xeffu3VPeeOON8d/73vcaS0tLPe3t7SNtNpv+woUL3I0rigKbzQYRlzEm7AIf1wAScV0uFywWi5Dr9/vR19cn5IbDYVitViE3Ho8L7ytZllU3Rna7XXiMPB6PsBsMBoXHNxqNcq0Q4g6uz+cbO2XKlOGdnZ2l06ZN6/X5fLnhcFgrssxNURSEQiGhJXLAx29mUVe0XZ/Ph2AwKOQGAgFhNxqNCvc5kUgIu7IsC7uMsQGNkag7kDEaiBsOh4X3VSwW41p2yR3cp5566vDdd9997vbbbw/p9Xo2d+7cjo6Ojtg999zDuymkUil0dnZCxGWM4dKlS8Jua2urkGuz2aDT6YRct9uNRCIh5AaDQXi9XiE3Go3CZrMJuclkEt3d3UKuoihob2+/6WNksViQk5Mj5DocDjDGhFyfz4dQKCTkhsNhuFyujF8vtMK5oqLCLuIRBHFjoNtBBKFC6HYQQagQWmRAECqEDpUJQoWIPX6P+NyjKAqcTieamprQ1NSEhoYG5ObmYtasWRg/fjw0Gg2dqqgYCu4QgzEGv9+P3//+9/j973+Pzs5OyLIMxhjeeOMNjBw5EmvWrME//uM/YuzYsRRelULBHUIwxuB0OvH4449j7969n3kwtyzLsFqteOmll1BTU4NXXnkF5eXlFF4VQleVhxCJRALPPfccdu/efc2n6TPGcPr0afzoRz+C1+u9iT0kbhR0VXkIUVdXh9deey3jqXNHjx5FVVUVjYMK4Q5ud3d36YEDBxaEQqHswegQIQZjDNu3b+cqbyLLMqqqqhCPxwexZ8RgwH2Oe/To0Zl1dXXGiooKBgCfFP2Skskkd+PpIkkibrpEhYibblvETRfB+ry58XgcZrOZe7tdXV1wuVwYOXKkULvXIl30S3SMFEX53O3nwXQHtejX2LFjzx47dmzOyy+/POPJJ59s+KTol0nkfDVdUEqkKBRjDLW1tcjKyuJ2AeDUqVMwGAzcns/nQ09Pj9C5YSgUQmtrK8LhMLcbi8XQ1NR0zeB2d3dzbzcYDGL79u0oKSm54u9lWRYuzJYeI9HCbKLj6/F4YLVauSbtpwkEAujo6EAgEOB2I5EIzp8/j1gsxu3yHvVwJ6ahoaEwNze3oKKi4tyNKPolSZJQQal00S9RN5VKCbm3suhXYWHhVYt+JZNJHDhwABcvXuTabklJCR577DEUFRVddbsDKfrFGLvpY0RFv67AT37yk3YA7bweMbiklxru3LmT65Br3rx5MJlMg9gzYjCgKY9DBEmSsHr1akyaNCljJz8/Hxs3bhSuX0vcOii4Q4gJEybgueeeQ35+/nVfm5WVhSeeeAKLFi2i++kqhII7hNBoNPjmN7+JF198EWPGjLnq6woKCvD000/jmWeeEb5wRNxa6BhpiKHVarFx40YsWLAAr7zyCg4dOgSXy4VYLIaSkhIsXLgQGzduxD333EOhVTEU3CGGJEmQJAkzZ87ECy+8gGeffRa9vb1477338Mgjj6CoqAg6nY4Oj1UOBXcIkl4hdPr0adjtdkiSBJPJhPfeew/5+fmYO3cuSktLKbwqhoI7xGCMoaGhAS0tLZg3bx4WL158+aqxoijo7+/H8ePHUVxc/KnfEeqCLk4NIdKh7enpwTe+8Q1MnToVWVlZ0Gg00Gg00Ol0GDt2LL7+9a/DYDDg/fff53qWL/H5gYI7hPB6vWhpacHy5cthMBiueiis1WpRUVGBVCqFtrY2Wh2kQii4Q4jTp0+joqIio6vFGo0GixcvRn19PX3rqhDu4H744YfD//mf/3nVrl27RgxGhwgxZFmG3W7HhAkTMr7oZDKZoNFoEI1GB7l3xI2G+8rE//zP/yyQJCn7rrvukmRZltra2kZZrdYskSVl6UepiLiMMWEX+HixgIjrdDrR09Mj5Pp8PvT29gq54XD48uT5KxGNRiHLMtfFJkmSkJubi/r6eowYceXP4VQqJbyfFUUZ0PiKjlF/f7/wGHk8HuExCgaD1xyjazHoRb/Gjx8fBxBraWmZWVlZ6QgGg9nRaFTj9/t5NwVFURCJRCDiMsYQjUaFXADCbjAYFO7zQNxIJHLNPsfj8Ws+ruZqyLKMcDh81e3KskxjlCGhUEjYvRlFv2pOnz49s6yszKzT6dhdd93V2dbWFluwYAHvppBKpdDe3g4RN10UStS9cOGCkGuz2aDVaoVct9uNWCwm5KYryF3NVRQFvb29SCQSGa8zTlfTe/jhh5GTk3PF1ySTSXR2dgr1WVEUXLp06aaPkcViQXZ2tpDrcDggy7KQm670J+KGw2E4HI6MX88d3EmTJgUnTZp0ktcjBhdJkjB+/Hi0trZm/ORGj8cDvV4Po9F4E3pI3EjoqvIQQZIkzJkzB2fOnEEkErnu61OpFKqrq7FgwQJoNPQ2UBs0YkOI3Nxc3HPPPdizZw8CgcAV788yxhCPx3Ho0CGMHj0aY8eOvQU9JQYKzXcbQkiShClTpkCn02HXrl0oKyvD9OnTkZ+fD0mSEA6H0dnZiYaGBpSXl+POO++k+coqhYI7xJAkCRMnTkRpaSkuXLiAw4cPIxAIoK+vD2VlZRg3bhxWr14Nk8lEoVUxtzS4X4Q3DmMMyWQSVqsVFy9exIULFzBt2jSMGzcO2dnZ19wHadfhcKC7uxvd3d3o6OhAaWkpjEbjVV1JkmAwGDBjxgyUlJSgt7cXdrsdd99993Xdv+2zxWLBpUuXcPHiRe4+2+129Pb2ZtTnv23XarWira0NFy9exPjx46/rftG4pcEdynNk0899/vDDD7F582bU1tbC6XRClmVs2rQJM2fOxHe/+11UVlZ+Jgxp9/Tp02htbcWIESMwcuRIfOUrX0FXVxdOnDiB4cOHY9GiRVd0U6kU6uvrP+UuW7bssjtixAjce++9VwxhMpm83OdTp05d7vPmzZtRXl6Ov/u7v8PXv/71jNtdsWLFddtNu9XV1diyZcun2v3d7353zXa/sDDGBvQTj8f1W7dubWICJJNJ9tprr4moTFEU9sc//lHYffXVV4Vcq9XKDhw4cN3XRSIR9i//8i+soKCAAbjij8FgYBs2bGD9/f2fcd966y127NgxFovFmKIon+p7Mplk586dY3/605+Y0+n81O8zcVtaWq7q/uIXv2D5+fnX7PP69euZ3W7/jFtVVZVRuy6X6/LvFUVh4XCY/fznP79uu4888ghzOByf2vaV6O3tZYcOHbruGF0Ju93O9u3bJ+R6vV62c+dOITcUCqWqqqoeZxnmjs5xB4H0N8Xzzz9/zWls8Xgc27Ztg06nw+bNm5GdnQ1ZlnHo0CHMmDEDM2bM+My3iyRJ0Ol0mD59OoYNG4YDBw5g7dq1MBqNkGUZBw8evK47Y8YMFBcXf8bdsmULnn/++Ws+nDsej+ONN95AVlYWNm/eDKPRCEVR8O6776K8vBzTp0+/ZrvDhg3D/v37L7fLGMOWLVvwwgsvXLfdP//5zzAYDPjNb37zhb/3TLeDbjCMMVy8eBGbNm3KaO6poiioqqrC/v37wRhDZ2fn5Tf5tQ4JJUnCyJEjMWvWLJw8eRKMMXR0dCArK4vLra2t/VSfM3mivqIoePPNN/Huu++CMYa2tjYYjUbcfvvt12131KhRmDlzJk6dOgXGGMxmM1e7W7duxaFDh4b0aVYmcAc3GAzqvV5vXjQapSeNXYVdu3bBZrNl/PpoNIrXXnsNsiyjsbER8+bNy+g8TpIkzJgxAz09PUilUsJuMpnE9u3bYbfbufr8+uuvI5FIoLGxEfPnz89oIockSSgvL0d3dzcSiQR27NjBNdUvFoth69atQvOyhxLcwW1qahr5+OOPf/PPf/5z+WB0SO0oioLjx49zfyOcP38eDocDkUgExcXFGXt6vR75+fmXn+Q4bNgwLtdkMsHtduP06dPcfT579iw8Hg+SySQKCgq42s3Ly4PX68WxY8e42z1z5ozwwoWhAvc57sKFCy0vvPCCb9GiRe3xeFxz4MCBu06dOmUSKaClKArq6uqQnc1fsZMxhrq6OuTm5nK7wMeLzkVKb/h8PnR1dV21nGUymURXVxf3du12O958800YDAauKYiSJEGv1+Ptt9+GXq/nuuIqSRK0Wi3efvtt4WWK27dvv+bTNq7V9s6dO9Ha2srdrt1ux86dO6/6IeV2u9HX1ycU7kAggLa2NqE1ypFIBC0tLZBlmduNx+Nchb+4g9va2moyGo2padOmBQBg8eLFZrfbHVm6dCnvpiDLMvx+P0Rcxhg8Ho+QCwAul0vItdvtaG5uxle/+tUr/l6WZbz88svcQSguLsaKFStQU1MDRVEyDi/75N7nsmXLcPIk39oP9sltp+XLl2P//v1oa2vj8vPy8rB06dLL56u8bT/wwAOoqqrirjJYXFyMJUuWXLXCYF9fH1pbW3HfffdxbRf4+H2Rn58v9N7w+/3Q6XRCbiQSQXV1dcav5w7umDFjIr/5zW/eTf/bZDLFjEajkpeXx7sppFIpGI1GiLiMsVvihkIhZGdnX9VljKGiogIffPAB13anTZuGSZMmoampCT6fL+ND3lQqhUAggIkTJ6KhoQF+vx+FhYUZu6FQCOPHj8fcuXNx8OBBrj7PmjUL48aNw9mzZxEKhTI+XJZlGaFQCGPGjMG9996Ljz76iCv4d955J8aMGXPVEpwmk+maY3QtotGosCvLsrCbfqBfxq/nbSA3N1cZMWIEfwHQKzBUb6SvWbMGw4cPz/j1WVlZ2LBhA3Q6HcrLy1FfX5/xG7mtrQ2lpaXQ6/UoLy9HXV1dRi5jDJcuXUJpaSmysrJQWVnJdW6dlZWF9evXw2g0crd74cKFyzOp1qxZc9USn1drd926dV/4Kgy39HbQULykn75q+uSTT2b0GBlJkvDggw/ioYcegiRJKCsrg8/nQ0dHxzX3T/pU4dSpU7jnnnsgSRKmTp2asev1elFXV4eKigpIkoRZs2bhiSeeyCgQkiRh1apVePDBByFJEqZNmwaPx4POzs6M2q2vr8eCBQsgSRJmz57N1e7DDz+MFStWDNkP/Uy5pcEdqjtfp9PhJz/5CR5//PFrXnjTarX42te+hhdffPHy4ZVOp8Py5ctx8uRJNDQ0IJVKfSoM7JOC3t3d3dizZw+WLFly+ekVf+vKsnxFt6ur64ru008/jb//+7+/5uSGdBsvvvji5QuD6f934sQJNDY2XrXdzs5O7NmzBw888MDldrVaLZ5++mn88Ic/vG67K1euxH/9138JX5AcStBc5UHCZDJh06ZNWLRoEbZs2YLGxkb4/X4wxmAymTBp0iQ89thj2Lhx42fODXNzc1FZWYnjx4/jzTffxPjx41FaWgqtVgun04muri4YDAasXr368pK9K7lvvPEGl2symfAf//EfWLhwIX7729+iubn5U32ePHkyvvOd7+Cxxx5DQUHBZ9xrtdvZ2Yns7OzPtCtJEvLy8rBp0yYsXLgQW7Zs4Wr3iwpNeRwkJEmC0WjE2rVrsWLFCnR0dKClpQXnzp3DqlWrUFZWhoKCgitekEiv7rnvvvsQiURgsVjQ2dmJ+vp6rFy5EkuXLkV+fn7Gbnd3N2pqavDwww9f1033+Wtf+xo6OjrQ0dGBo0eP4lvf+tZ1+2w0GnH//fdfbtdqtaK6uhpr1qzBsmXLrtvuN7/5TaxcuRIdHR3o6urCBx98gPXr11+z3S8qFNxBJv0I1FmzZmH06NHIzc3FvHnzuNxp06Zh9OjRCAQCmDVr1nW99G2evr4+tLW1we12X34wn6IomDZt2jXvvaaLhM2ePRvTp09HKBQS6nNZWRm6u7sz6vPftjtr1ix4PJ6M2/2iQcEdYjDG0N/fj8OHD2PkyJG46667UFxcDEmSEAgE0NraiqqqKsyfPx/Tpk2jw06VQsEdQjDG0NvbiyNHjmDZsmUoKSn5VDBLSkpQXFyMO+64AwcPHkQkEsFdd91F4VUhdNIwhIhGo6iursaqVas+E9o06UPZlStX4sKFC1wLC4jPDxTcIURDQwNmzZr1mavFVyIrKwv3338/Tpw4QUW/VAh3cHt6evLff//9O1pbW6/86HsO6BDtxpG+T3qlhexXY/jw4YhGo1yT24nPB9znuL/4xS/uPnLkyNTHH39c80//9E9nFUWR0jfYeVEUBaJu+hEeot8Wt6LdgbjX21fRaBQajYbryRAajQaFhYXwer1XLVsykDG6VeN7q9pNewPpc6ZwB1eWZVZcXOzW6XSGeDyu2bVr17zjx4/niXa2pqaG2wM+3kknTpwQvrd34sQJaLVabs/n86GnpwdOp5PbDYVCuHTpknBRqObm5qsuN+NdFgZ8fMSTSCSwffv2qy5MkGX58lMyeFEUBSdOnBA6smKMoaamRmiMPB4PbDYb+vv7ud1AIICOjg54PB5uNxKJ4Pz58wiHw9xuPB7nei9zB3fRokWeUCg0qqioyGEwGJQ1a9bUKooSXL9+Pe+mkEqloNVq8cgjj3C76TfSo48+KuQqiiLk2mw2NDY2YtmyZdyu2+3G8ePHsWrVKm43GAxi2LBhqKysvOLvZVnGtm3buEptppcEbty48aorWpLJJPR6PTZs2MDd5/TyRNExYowJuelSl0uWLOF2HQ4H6urqsGLFCm7X5/Ohuroaq1ev5nbD4TDeeeedjF/PHdzvf//7Dd///vcbeD1icNFoNCgpKYHFYsm4uHU4HEYymbxqpT7i8wtdVR4iSJKEuXPnoqamJqPnMaVPNe644w6aSqhCaMSGEMOHD8fEiRNx+PBhJJPJq56XKoqCs2fPIhqNcl2FJj4/UHCHEJIkYf78+cjLy8OOHTtgsVguX61M/7jdbrzzzjuwWq1Yvnw5fduqFJryOMTQaDSoqKjA5MmTcerUKRw5cgTZ2dmXbxfp9XrMmTMHt912G4VWxVBwhyDpB56vXLkSiUQCPp8P+/btw7e//W0qnjVEoOAOYdJrc/Pz85GTkyP0GFzi8wkdKxGECqHgEoQKoeAShAqhpzwShArhDu7evXsnP/XUU6uampoyf4r1VRjKT3kkiMGE+6rytm3byiwWC3vrrbfmzJ49+4Oenp4Sp9Op7+jo4G5clmU4HA6IuIwxOJ1OIReAsOt0OtHf3y/k+nw+2O12ITccDgvvq3g8LuymUinVjVF/f7/wGHk8HmE3GAwKj280GkUymcz49dzBfeqpp05v2bLlfr1e70wmk5LVai1yu9263t5e3k1BURR4PB6IuOkn+Yu4AIRdj8cDp9Mp5AYCAWE3EonA5XIJuYlEAm63W8iVZXlAYyTaLiA+Rk6nU3g/+3w+4f0cCoWE3VgsxlXzlzu4JSUl2vvuu8+6ZMmSBr1ezxYsWHCpt7c3+uUvf5l3U0ilUrBYLBBxGWPo7u4Wdjs7O4Vcm82G7OxsIdftdoMxJuQGg0GEw2EhNxqNwuVyCbnJZBJWq1XIVRQFPT09N32MLBYLCgoKhFyHwwGdTifk+nw+JBIJIXfQl/WVlZXZy8rK6AljBHELodtBBKFCKLgEoULoPi5BqBCqj0sQKoS+cQlChdA3LkGoELo4RRAqhIJLECqEznEJQoVkFNx4PK6trq6+w263577//vu319bWjrwRjdM5LkGIkdGUR1mW8e///u9TnnjiidyqqqoR8Xg86+23335bo9EwRVE0jDHIsszdeLpAkogLfBz8m+0OpM8DdQfS51vx96ZLvdyKMVLr+GZKRsHNycmRJ0+ebANgnDdvnqu7u3sMAHxS9OvugRb9Ei0KNZCiX6IFpfx+P7q7u+FyubjddNGvQCDA7V6v6Ne1SCaTqK+v51p9kiZd9EuEWzVGAy361dnZCa/Xy+1GIhGYzebPT9GvWCymz83NndzS0uLv7Ow0jho1yqrRaJjBYGBU9CtzBrPo17WIRqPIycnBunXruN2BFv2SJOmmjxEV/foEo9GY/M///M/XuXtDEMSgQFeVCUKF0MwpglAhNAGDIFQIBZcgVAgFlyBUCAWXIFQIBZcgVAgFlyBUCAWXIFQIBZcgVEhGwQ0Gg/pnnnlmbWNj4+gf/ehHa44dOzZ8sDtGEMTVyWiucl5eXrK3t9fBGDOWlpa6Lly4YLr33nudANDd3T3c4XDo29vbuRtPF/0ScRljwi7wcX0ZEdfpdMJmswm5Pp8P/f39Qm44HIbdbhdy00W/RNx00S8RV1GUWzJG/f39wmOUXlkk4gaDQeHxHbSiXwaDQR+LxYyFhYX6RCJhBIBkMin19/cXeL1eXV9fH3dnFUWB1+uFiMsYE3YBCLsejwdut1vIDQQCwm4kEoHH4xFyE4mEsJsu+qWmMXI6nXC5XEKuz+cTHqNQKCS8rwal6Fc8HtctWbJE6evrMxUWFirDhg3LBQC9Xs/mz5/f1tPTE128eDF3Z1OpFHp7eyHiMsbQ1dUl7HZ0dAi5NpsNRqNRyHW73VAURcgNBoMIhUJCbjQahdPpFHKTyST6+vqEXEVR0N3dfdPHyGKxID8/X8h1OBzQarVCrs/nQzweF3IHZVmfwWBIfetb3zrM3RuCIAYFuqpMECqEgksQKoQW0hOECqGF9AShQuhQmSBUCAWXIFQIBZcgVAgFlyBUCAWXIFRIxsENh8PGVCqlCYVCxkgkwl8XgiCIG0ZGwfX7/VmVlZUbTpw4UfbMM8/8n6eeeuqBwe4YQRBXJ6O5ygUFBYnx48ebS0pKEpWVleaXXnppBgAkEgnNoUOHZp85cybXZDJxN64oCs6cOYP8/HxulzGGM2fOoLCwkNsFgLNnz6KoqIjb83q96OzsRDwe53aDwSDMZrPQ/etoNIqzZ89Cr9dzu4lEAvX19cjJyeF2ZVlGfX098vLyuN30GBUUFHC7gPgYud1uWCwWRCIRbtfv9+PSpUtCBdLC4TCam5uFipzF43GuYmEZBTeRSGhDodD4Dz/8MO+VV16Z/eSTT74DAFlZWcq8efParVZrdNGiRdydlWUZdrsdIi5jDFarVcgFPl5BIuI6HA7k5uYKuV6vFxqNRsgNhUKIxWJCbjweh9/vF3JTqRScTqeQqygKbDab8Bj19fUJuVarFUVFRUKuy+VCVlaWkBsIBCDLspAbiUTw0UcfZfz6jIKr1WqVX/3qV0dkWWZLly49ZzQaL380FBYWhnNzc5Vhw4ZxdzaVSiE3NxciLmPslrjxeBx5eXnC7ZpMJiFXr9cLu9FoVPjvTSaTwq6iKAMao5ycHCE3EokI76tUKiU8vhqNRrhdg8HAVVI00+CyiRMnWrl7QxDEoEC3gwhChVBwCUKFUHAJQoVQcAlChVBwCUKFUHAJQoVQcAlChVBwCUKFUHAJQoVkFNxEIqGpra293eVymWpra6c1NjaW3IjG6SmPBCFGRlMek8mk9LOf/Wz2v/7rv8oXLlwo3Ldv3127d+9+EwAYY9In/+VunDF2+UfEFW33b7ch4t3sdtX49w5kfP96G6LOrRjfgf69mZJRcHNzc+WpU6daioqKUmVlZW5JkiYCQDwe1+zYsWP+Rx99lCeyDEpRFNTU1AgPzvHjx7m9v3ZFvvF9Ph96e3vhcDi43VAohEuXLsHr9XK7sVgMzc3NXEu/0iQSCZw5cwaJRILblWUZtbW1UBSF202PrwgDGaN0xT2rlX96fSAQQGdnJ9xuN7cbiURgNpsRDAa53Xg8zrUcMKPgxmIxvU6nK9uzZ88IjUYjT5kyxQ0ABoNBqaysPMkYC65fv567s6lUCjqdDo888gi3yxiDJEl47LHHhFwAQq7NZkNjYyOWLVvG7brdbhw/fhyrVq3idoPBIA4ePIjKykpuNxqNwmQyYd26ddxuMplEVlYWNmzYwO0qigKtVotHH32U2x3IGFksFpjNZixZsoTbdTgcqKurw4oVK7hdn8+H6upqrF69mtsdlKJfRqMx+etf//q19M7UarX0JHOCuIVkXB9Xo9FQWAnicwLVDiIIFUK1gwhChdAEDIJQIRRcglAhdI5LECqEznEJQoXQoTJBqBAKLkGoEAouQaiQjIIbCoX0v/zlLx+22+3DDh06NOm3v/3t3MHuGEEQVyejKY8GgyF17tw5f0tLy4hf//rXs2VZjj/xxBP1AGCz2Qq9Xq9ksVi4l57IsgyPxyNZLBbuq1SMMXzSrtAVLlHX4XDA5XIJuT6fD263W8gNh8PC+yoejwu7qVRqQGMk6gLiY2Sz2YTHyO12C7vBYFB4fKPRqMKzwi6j4Or1emYymXD48OExxcXFo1tbW7Uej0eTl5fH2traRvb19f3ZbDaf4e2soigaq9U6x2w2n+Z1GWOS1Wr9ktlsruN1AcBqtd4t4no8nvze3t7RZrP5Aq8bDAZze3t7bzObzS28bjQaNVoslmlms7mR100kEvq+vr5ys9l8lteVZVlrtVrvNJvN9bzuAMdI2HW5XIU9PT0jzGZzK6/r8/lMvb29481m83leNxwOZ1sslilms7mZ143FYlmJRCIrY+GvFztf7ScajepeeeWVZbt3754fCASy//KXv0xK/y6RSGjfeeedWZls529/UqmUtHfv3jtEXMYYdu/efefNdp1Op+nYsWNTRFyfz5ddXV09TcQNhUJZhw4dmiHixmIx3f79+4XGKJlMavbt2zdbdD/v2bPnpo9vf39/fk1NzSQR1+125xw9enSqiBsIBAzvv//+dBE3Eono33333ZmZvj6jc1yj0ZjauHHju6tWrarNy8uLPvTQQx3p31VXV49zOp254XCYu0p9bW3tbfn5+UKzMLZv3z7Z5/PleL3ezD+lPmHXrl3jvF6vyeVyGXnd7OzscHt7e77f7+cuNutwOIbbbLYxgUAgl9d1Op0ai8VSdOzYseG87rlz5wpdLteow4cPT+V1P/zww9scDkd+V1cX934+cuTIRIfDke33+zNehRaLxXRbt25d3NnZWeT1erP27NkzKVM3kUhotm3bdm84HDacO3eutKGhoThTN5VKSW+++eY9Ho+noKenZ9j27dunZeoqiiJt3759vs1mGx4MBrOrqqrKE4lExu/rv/zlL3MtFsuoGTNmdG3dunVOJs6Arip7PB7tpk2b7j548GD+iRMnRvP6drs9uGPHjox30F8zbNgw5wcffFB04MCBEbxuJBLxb968eUp1dfUoXveDDz4Y+9Of/vQrDoeDu1rz6dOnJx89ejQ3kUhwP07ipZdemrN3795RXV1d3O7UqVN9TU1NqY6ODq7q4+FwWPrZz3624N/+7d9md3V1cVWYjkQimp///Ofz//CHP4w4ePBgxuGTJEnZsWNHTmNjY3lNTU3x66+/frcsyxmFQJIktmfPnqyenp6RHR0dWe+9997ITNvV6XTs0KFDmkuXLo0eNmxYx6uvvjo3Eolk9IGj0WjYkSNHlObm5rE6nS7wu9/9riIWi2X8YVVbW5usqamZ9N///d9zfvnLX97jcrmu+/cOKLiMMSkrK4sNHz48Issyd6n0CRMmBCVJkkXa7unpyQ2Hw4avfvWr3M+QKS8vj82ePbsvGAwaeN0jR458acyYMfk9PT0ZvynSjBw58oxerw/87//+7yxeNxQK5Y0ePTpeV1f3JV5Xp9PJ586dG/7lL3/5Io8ny7Kk1+sTJSUltkQiwXWEkZOTo/zgBz84azAYSpPJZMZvYoPBoIwePdrPGNONHTs2WlpamnGber2ejR071m80GpX58+cHePoLAOPGjfNptVrW3Nw8Zfz48W05OTkZXy2aMGGCT6PRoKyszP1J/eiMszVhwgR/Y2NjTlNT0x0mk2m0zWa77pHggIJbXFycWrp0aXtWVlbRnDlzLLx+IBCYWFhYWNTV1cX97dXZ2Vm+cOFCKRAIcB/uHj58uGzUqFHZixYtsvO6zz///J4f//jHVTNmzOjmdVtbW4cVFBQULV++vIvX/eEPf1hfVFSkW7BgwSVe1+PxaO+9996uCRMmRHi8/Px85dvf/nbv3LlzlREjRjh52x05cqRm0aJF3YsXL27P1InH47qxY8eO7erqMoRCIdPEiRPbM33iSjKZ1I4aNWpcfX39xPb29nEmk2mioigZfVunUilNcXHxhJaWlkkWi2XmwoUL9alUKiNXURTJZDLd1t7ePm7//v3zKioqrHq9PpmJCwAGg+G2sWPH5m3btu3V7373u3smTJgQu54jMUbzhQlCbdDMKYJQIRRcglAhFFyCUCEUXIJQIRRcglAhFFyCUCEUXIJQIRRcglAhFFyCUCH/D8X2FmPZ/VMzAAAAAElFTkSuQmCC" }, "metadata": { "needs_background": "light" @@ -818,7 +791,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[35m\u001b[1mBob\u001b[0m\u001b[35m\u001b[0m: {\n", + "\u001B[35m\u001B[1mBob\u001B[0m\u001B[35m\u001B[0m: {\n", " \"thought\": \"Alice is trying to build a vertical line again. I need to block her next move otherwise she will have a chance to win. I will place my piece at [9, 7].\",\n", " \"move\": [\n", " 9,\n", @@ -851,13 +824,17 @@ " msg = player(msg)\n", " \n", " i += 1" - ] + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-03-27T08:10:33.989202Z", + "start_time": "2024-03-27T08:09:59.446824Z" + } + } }, { "cell_type": "markdown", - "metadata": { - "collapsed": false - }, "source": [ "## Future Direction\n", "\n", @@ -868,7 +845,10 @@ "- Fine tune a model to improve the performance of the agent\n", "\n", "For complete code, we provide in [code/game_gomoku.py](./code/game_gomoku.py)." - ] + ], + "metadata": { + "collapsed": false + } } ], "metadata": { From 46233ffb87a1f55c6545e16577be39f98a9feb18 Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Fri, 24 May 2024 12:12:58 +0800 Subject: [PATCH 30/55] optimized data filtering speed (data preprocessing) --- .../huggingface_model.py | 44 +- .../distributed_simulation/run_simlation.sh | 25 + src/agentscope/server/__init__.py | 10 + src/agentscope/server/launcher.py | 449 ++++++++++++++++++ src/agentscope/server/servicer.py | 313 ++++++++++++ 5 files changed, 801 insertions(+), 40 deletions(-) create mode 100644 examples/distributed_simulation/run_simlation.sh create mode 100644 src/agentscope/server/__init__.py create mode 100644 src/agentscope/server/launcher.py create mode 100644 src/agentscope/server/servicer.py diff --git a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py index c5c2cbf3e..809c1fd1a 100644 --- a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py @@ -385,42 +385,6 @@ def fine_tune( ) raise - def filer_sequence_lengths( - self, - max_input_seq_length: int, - dataset_obj: List[Dict[str, List[str]]], - ) -> List[int]: - """ - Identifies and returns the indices of conversation - entries that exceed max_input_seq_length characters in length. - - Args: - dataset_obj (List[Dict[str, List[str]]]): A list where - each dictionary contains 'conversations', - a list of two strings (question and answer). - - Returns: - List[int]: Indices of conversations where the combined - length of the question and answer exceeds - max_input_seq_length characters. - """ - # Initialize a list to store the sequence lengths - sequence_lengths = [] - - # list of indices that are too long - too_long = [] - - # Loop over the dataset and get the lengths of text sequences - for idx, example in enumerate(dataset_obj): - sequence_length = len( - example["conversations"][0] + example["conversations"][1], - ) - sequence_lengths.append(sequence_length) - if sequence_length > max_input_seq_length: - too_long.append(idx) - - return too_long - def formatting_prompts_func( self, example: Dict[str, List[List[str]]], @@ -495,10 +459,10 @@ def fine_tune_training( dataset = load_dataset(data_path, split="train", token=token) - indexes_to_drop = self.filer_sequence_lengths(300, dataset) - - dataset_reduced = dataset.select( - i for i in range(len(dataset)) if i not in set(indexes_to_drop) + # filter out input sequences that are longer than certain threshold + dataset_reduced = dataset.filter( + lambda x: len(x["conversations"][0] + x["conversations"][1]) + <= 1000, ) formatted_dataset = dataset_reduced.train_test_split(test_size=0.1) diff --git a/examples/distributed_simulation/run_simlation.sh b/examples/distributed_simulation/run_simlation.sh new file mode 100644 index 000000000..6fac7c4c4 --- /dev/null +++ b/examples/distributed_simulation/run_simlation.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +# default values +base_port=12330 +hosts="localhost" # or "server1 server2 server3 ..." +moderator_per_host=4 +model_per_host=8 +agent_type="random" # or "llm" +max_value=100 + +# check server-per-host +if ! [[ "$1" =~ ^[0-9]+$ ]]; then + echo "Usage: $0 " + exit 1 +fi + +# check participant-num +if ! [[ "$2" =~ ^[0-9]+$ ]]; then + echo "Usage: $0 " + exit 1 +fi + +mkdir -p log + +python main.py --role main --hosts ${hosts} --base-port ${base_port} --participant-num $2 --server-per-host $1 --model-per-host ${model_per_host} --moderator-per-host ${moderator_per_host} --agent-type ${agent_type} --max-value ${max_value} diff --git a/src/agentscope/server/__init__.py b/src/agentscope/server/__init__.py new file mode 100644 index 000000000..8b69a542a --- /dev/null +++ b/src/agentscope/server/__init__.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +"""Import all server related modules in the package.""" +from .launcher import RpcAgentServerLauncher, as_server +from .servicer import AgentServerServicer + +__all__ = [ + "RpcAgentServerLauncher", + "AgentServerServicer", + "as_server", +] diff --git a/src/agentscope/server/launcher.py b/src/agentscope/server/launcher.py new file mode 100644 index 000000000..ed5ed7f67 --- /dev/null +++ b/src/agentscope/server/launcher.py @@ -0,0 +1,449 @@ +# -*- coding: utf-8 -*- +""" Server of distributed agent""" +import os +from multiprocessing import Process, Event, Pipe +from multiprocessing.synchronize import Event as EventClass +import asyncio +import signal +import argparse +from typing import Type +from concurrent import futures +from loguru import logger + +try: + import grpc + from agentscope.rpc.rpc_agent_pb2_grpc import ( + add_RpcAgentServicer_to_server, + ) +except ImportError as import_error: + from agentscope.utils.tools import ImportErrorReporter + + grpc = ImportErrorReporter(import_error, "distribute") + add_RpcAgentServicer_to_server = ImportErrorReporter( + import_error, + "distribute", + ) + +import agentscope +from agentscope.server.servicer import AgentServerServicer +from agentscope.agents.agent import AgentBase +from agentscope.utils.tools import ( + _get_timestamp, + check_port, +) + + +def _setup_agent_server( + host: str, + port: int, + server_id: str, + init_settings: dict = None, + start_event: EventClass = None, + stop_event: EventClass = None, + pipe: int = None, + local_mode: bool = True, + max_pool_size: int = 8192, + max_timeout_seconds: int = 1800, + custom_agents: list = None, +) -> None: + """Setup agent server. + + Args: + host (`str`, defaults to `"localhost"`): + Hostname of the agent server. + port (`int`): + The socket port monitored by the agent server. + server_id (`str`): + The id of the server. + init_settings (`dict`, defaults to `None`): + Init settings for agentscope.init. + start_event (`EventClass`, defaults to `None`): + An Event instance used to determine whether the child process + has been started. + stop_event (`EventClass`, defaults to `None`): + The stop Event instance used to determine whether the child + process has been stopped. + pipe (`int`, defaults to `None`): + A pipe instance used to pass the actual port of the server. + local_mode (`bool`, defaults to `None`): + Only listen to local requests. + max_pool_size (`int`, defaults to `8192`): + Max number of agent replies that the server can accommodate. + max_timeout_seconds (`int`, defaults to `1800`): + Timeout for agent replies. + custom_agents (`list`, defaults to `None`): + A list of custom agent classes that are not in `agentscope.agents`. + """ + asyncio.run( + _setup_agent_server_async( + host=host, + port=port, + server_id=server_id, + init_settings=init_settings, + start_event=start_event, + stop_event=stop_event, + pipe=pipe, + local_mode=local_mode, + max_pool_size=max_pool_size, + max_timeout_seconds=max_timeout_seconds, + custom_agents=custom_agents, + ), + ) + + +async def _setup_agent_server_async( + host: str, + port: int, + server_id: str, + init_settings: dict = None, + start_event: EventClass = None, + stop_event: EventClass = None, + pipe: int = None, + local_mode: bool = True, + max_pool_size: int = 8192, + max_timeout_seconds: int = 1800, + custom_agents: list = None, +) -> None: + """Setup agent server in an async way. + + Args: + host (`str`, defaults to `"localhost"`): + Hostname of the agent server. + port (`int`): + The socket port monitored by the agent server. + server_id (`str`): + The id of the server. + init_settings (`dict`, defaults to `None`): + Init settings for agentscope.init. + start_event (`EventClass`, defaults to `None`): + An Event instance used to determine whether the child process + has been started. + stop_event (`EventClass`, defaults to `None`): + The stop Event instance used to determine whether the child + process has been stopped. + pipe (`int`, defaults to `None`): + A pipe instance used to pass the actual port of the server. + local_mode (`bool`, defaults to `None`): + If `True`, only listen to requests from "localhost", otherwise, + listen to requests from all hosts. + max_pool_size (`int`, defaults to `8192`): + The max number of agent reply messages that the server can + accommodate. Note that the oldest message will be deleted + after exceeding the pool size. + max_timeout_seconds (`int`, defaults to `1800`): + Maximum time for reply messages to be cached in the server. + Note that expired messages will be deleted. + custom_agents (`list`, defaults to `None`): + A list of custom agent classes that are not in `agentscope.agents`. + """ + from agentscope._init import init_process + + if init_settings is not None: + init_process(**init_settings) + servicer = AgentServerServicer( + host=host, + port=port, + max_pool_size=max_pool_size, + max_timeout_seconds=max_timeout_seconds, + ) + # update agent registry + if custom_agents is not None: + for agent_class in custom_agents: + AgentBase.register_agent_class(agent_class=agent_class) + + async def shutdown_signal_handler() -> None: + logger.info( + f"Received shutdown signal. Gracefully stopping the server at " + f"[{host}:{port}].", + ) + await server.stop(grace=5) + + loop = asyncio.get_running_loop() + if os.name != "nt": + # windows does not support add_signal_handler + for sig in (signal.SIGINT, signal.SIGTERM): + loop.add_signal_handler( + sig, + lambda: asyncio.create_task(shutdown_signal_handler()), + ) + while True: + try: + port = check_port(port) + servicer.port = port + server = grpc.aio.server( + futures.ThreadPoolExecutor(max_workers=None), + ) + add_RpcAgentServicer_to_server(servicer, server) + if local_mode: + server.add_insecure_port(f"localhost:{port}") + else: + server.add_insecure_port(f"0.0.0.0:{port}") + await server.start() + break + except OSError: + logger.warning( + f"Failed to start agent server at port [{port}]" + f"try another port", + ) + logger.info( + f"agent server [{server_id}] at {host}:{port} started successfully", + ) + if start_event is not None: + pipe.send(port) + start_event.set() + while not stop_event.is_set(): + await asyncio.sleep(1) + logger.info( + f"Stopping agent server at [{host}:{port}]", + ) + await server.stop(grace=10.0) + else: + await server.wait_for_termination() + logger.info( + f"agent server [{server_id}] at {host}:{port} stopped successfully", + ) + + +class RpcAgentServerLauncher: + """The launcher of AgentServer.""" + + def __init__( + self, + host: str = "localhost", + port: int = None, + max_pool_size: int = 8192, + max_timeout_seconds: int = 1800, + local_mode: bool = False, + custom_agents: list = None, + server_id: str = None, + agent_class: Type[AgentBase] = None, + agent_args: tuple = (), + agent_kwargs: dict = None, + ) -> None: + """Init a launcher of agent server. + + Args: + host (`str`, defaults to `"localhost"`): + Hostname of the agent server. + port (`int`, defaults to `None`): + Socket port of the agent server. + max_pool_size (`int`, defaults to `8192`): + The max number of agent reply messages that the server can + accommodate. Note that the oldest message will be deleted + after exceeding the pool size. + max_timeout_seconds (`int`, defaults to `1800`): + Maximum time for reply messages to be cached in the server. + Note that expired messages will be deleted. + local_mode (`bool`, defaults to `False`): + If `True`, only listen to requests from "localhost", otherwise, + listen to requests from all hosts. + custom_agents (`list`, defaults to `None`): + A list of custom agent classes that are not in + `agentscope.agents`. + server_id (`str`, defaults to `None`): + The id of the agent server. If not specified, a random id + will be generated. + agent_class (`Type[AgentBase]`, deprecated): + The AgentBase subclass encapsulated by this wrapper. + agent_args (`tuple`, deprecated): The args tuple used to + initialize the agent_class. + agent_kwargs (`dict`, deprecated): The args dict used to + initialize the agent_class. + """ + self.host = host + self.port = check_port(port) + self.max_pool_size = max_pool_size + self.max_timeout_seconds = max_timeout_seconds + self.local_mode = local_mode + self.server = None + self.stop_event = None + self.parent_con = None + self.custom_agents = custom_agents + self.server_id = ( + self.generate_server_id() if server_id is None else server_id + ) + if ( + agent_class is not None + or len(agent_args) > 0 + or agent_kwargs is not None + ): + logger.warning( + "`agent_class`, `agent_args` and `agent_kwargs` is deprecated" + " in `RpcAgentServerLauncher`", + ) + + def generate_server_id(self) -> str: + """Generate server id""" + return f"{self.host}:{self.port}-{_get_timestamp('%y%m%d-%H:%M:%S')}" + + def _launch_in_main(self) -> None: + """Launch agent server in main-process""" + logger.info( + f"Launching agent server at [{self.host}:{self.port}]...", + ) + asyncio.run( + _setup_agent_server_async( + host=self.host, + port=self.port, + server_id=self.server_id, + max_pool_size=self.max_pool_size, + max_timeout_seconds=self.max_timeout_seconds, + local_mode=self.local_mode, + custom_agents=self.custom_agents, + ), + ) + + def _launch_in_sub(self) -> None: + """Launch an agent server in sub-process.""" + from agentscope._init import _INIT_SETTINGS + + self.stop_event = Event() + self.parent_con, child_con = Pipe() + start_event = Event() + server_process = Process( + target=_setup_agent_server, + kwargs={ + "host": self.host, + "port": self.port, + "server_id": self.server_id, + "init_settings": _INIT_SETTINGS, + "start_event": start_event, + "stop_event": self.stop_event, + "pipe": child_con, + "max_pool_size": self.max_pool_size, + "max_timeout_seconds": self.max_timeout_seconds, + "local_mode": self.local_mode, + "custom_agents": self.custom_agents, + }, + ) + server_process.start() + self.port = self.parent_con.recv() + start_event.wait() + self.server = server_process + logger.info( + f"Launch agent server at [{self.host}:{self.port}] success", + ) + + def launch(self, in_subprocess: bool = True) -> None: + """launch an agent server. + + Args: + in_subprocess (bool, optional): launch the server in subprocess. + Defaults to True. For agents that need to obtain command line + input, such as UserAgent, please set this value to False. + """ + if in_subprocess: + self._launch_in_sub() + else: + self._launch_in_main() + + def wait_until_terminate(self) -> None: + """Wait for server process""" + if self.server is not None: + self.server.join() + + def shutdown(self) -> None: + """Shutdown the agent server.""" + if self.server is not None: + if self.stop_event is not None: + self.stop_event.set() + self.stop_event = None + self.server.join() + if self.server.is_alive(): + self.server.kill() + logger.info( + f"Agent server at port [{self.port}] is killed.", + ) + self.server = None + + +def as_server() -> None: + """Launch an agent server with terminal command. + + Note: + + The arguments of `as_server` are listed as follows: + + * `--host`: the hostname of the server. + * `--port`: the socket port of the server. + * `--max-pool-size`: max number of agent reply messages that the server + can accommodate. Note that the oldest message will be deleted + after exceeding the pool size. + * `--max-timeout-seconds`: max time for reply messages to be cached + in the server. Note that expired messages will be deleted. + * `--local-mode`: whether the started agent server only listens to + local requests. + * `--model-config-path`: the path to the model config json file + + In most cases, you only need to specify the `--host`, `--port` and + `--model-config-path`. + + .. code-block:: shell + + as_server --host localhost --port 12345 --model-config-path config.json + + """ # noqa + parser = argparse.ArgumentParser() + parser.add_argument( + "--host", + type=str, + default="localhost", + help="hostname of the server", + ) + parser.add_argument( + "--port", + type=int, + default=12310, + help="socket port of the server", + ) + parser.add_argument( + "--max-pool-size", + type=int, + default=8192, + help=( + "max number of agent reply messages that the server " + "can accommodate. Note that the oldest message will be deleted " + "after exceeding the pool size." + ), + ) + parser.add_argument( + "--max-timeout-seconds", + type=int, + default=1800, + help=( + "max time for agent reply messages to be cached" + "in the server. Note that expired messages will be deleted." + ), + ) + parser.add_argument( + "--local-mode", + type=bool, + default=False, + help=( + "If `True`, only listen to requests from 'localhost', otherwise, " + "listen to requests from all hosts." + ), + ) + parser.add_argument( + "--model-config-path", + type=str, + help="path to the model config json file", + ) + args = parser.parse_args() + agentscope.init( + project="agent_server", + name=f"server_{args.host}:{args.port}", + runtime_id=_get_timestamp( + "server_{}_{}_%y%m%d-%H%M%S", + ).format(args.host, args.port), + model_configs=args.model_config_path, + ) + launcher = RpcAgentServerLauncher( + host=args.host, + port=args.port, + max_pool_size=args.max_pool_size, + max_timeout_seconds=args.max_timeout_seconds, + local_mode=args.local_mode, + ) + launcher.launch(in_subprocess=False) + launcher.wait_until_terminate() diff --git a/src/agentscope/server/servicer.py b/src/agentscope/server/servicer.py new file mode 100644 index 000000000..53c63425f --- /dev/null +++ b/src/agentscope/server/servicer.py @@ -0,0 +1,313 @@ +# -*- coding: utf-8 -*- +""" Server of distributed agent""" +import threading +import base64 +import json +import traceback +from concurrent import futures +from loguru import logger + +try: + import dill + import grpc + from grpc import ServicerContext + from expiringdict import ExpiringDict + from ..rpc.rpc_agent_pb2 import RpcMsg # pylint: disable=E0611 + from ..rpc.rpc_agent_pb2_grpc import RpcAgentServicer +except ImportError as import_error: + from agentscope.utils.tools import ImportErrorReporter + + dill = ImportErrorReporter(import_error, "distribute") + grpc = ImportErrorReporter(import_error, "distribute") + ServicerContext = ImportErrorReporter(import_error, "distribute") + ExpiringDict = ImportErrorReporter(import_error, "distribute") + RpcMsg = ImportErrorReporter( # type: ignore[misc] + import_error, + "distribute", + ) + RpcAgentServicer = ImportErrorReporter(import_error, "distribute") + +from ..agents.agent import AgentBase +from ..message import ( + Msg, + PlaceholderMessage, + deserialize, +) + + +class AgentServerServicer(RpcAgentServicer): + """A Servicer for RPC Agent Server (formerly RpcServerSideWrapper)""" + + def __init__( + self, + host: str = "localhost", + port: int = None, + max_pool_size: int = 8192, + max_timeout_seconds: int = 1800, + ): + """Init the AgentServerServicer. + + Args: + host (`str`, defaults to "localhost"): + Hostname of the rpc agent server. + port (`int`, defaults to `None`): + Port of the rpc agent server. + max_pool_size (`int`, defaults to `8192`): + The max number of agent reply messages that the server can + accommodate. Note that the oldest message will be deleted + after exceeding the pool size. + max_timeout_seconds (`int`, defaults to `1800`): + Maximum time for reply messages to be cached in the server. + Note that expired messages will be deleted. + """ + self.host = host + self.port = port + self.result_pool = ExpiringDict( + max_len=max_pool_size, + max_age_seconds=max_timeout_seconds, + ) + self.executor = futures.ThreadPoolExecutor(max_workers=None) + self.task_id_lock = threading.Lock() + self.agent_id_lock = threading.Lock() + self.task_id_counter = 0 + self.agent_pool: dict[str, AgentBase] = {} + + def get_task_id(self) -> int: + """Get the auto-increment task id. + Each reply call will get a unique task id.""" + with self.task_id_lock: + self.task_id_counter += 1 + return self.task_id_counter + + def agent_exists(self, agent_id: str) -> bool: + """Check whether the agent exists. + + Args: + agent_id (`str`): the agent id. + + Returns: + bool: whether the agent exists. + """ + return agent_id in self.agent_pool + + def check_and_generate_agent( + self, + agent_id: str, + agent_configs: dict, + ) -> None: + """ + Check whether the agent exists, and create new agent instance + for new agent. + + Args: + agent_id (`str`): the agent id. + agent_configs (`dict`): configuration used to initialize the agent, + with three fields (generated in `_AgentMeta`): + + .. code-block:: python + + { + "class_name": {name of the agent} + "args": {args in tuple type to init the agent} + "kwargs": {args in dict type to init the agent} + } + + """ + with self.agent_id_lock: + if agent_id not in self.agent_pool: + agent_class_name = agent_configs["class_name"] + agent_instance = AgentBase.get_agent_class(agent_class_name)( + *agent_configs["args"], + **agent_configs["kwargs"], + ) + agent_instance._agent_id = agent_id # pylint: disable=W0212 + self.agent_pool[agent_id] = agent_instance + logger.info(f"create agent instance [{agent_id}]") + + def check_and_delete_agent(self, agent_id: str) -> None: + """ + Check whether the agent exists, and delete the agent instance + for the agent_id. + + Args: + agent_id (`str`): the agent id. + """ + with self.agent_id_lock: + if agent_id in self.agent_pool: + self.agent_pool.pop(agent_id) + logger.info(f"delete agent instance [{agent_id}]") + + def call_func( # pylint: disable=W0236 + self, + request: RpcMsg, + context: ServicerContext, + ) -> RpcMsg: + """Call the specific servicer function.""" + if hasattr(self, request.target_func): + if request.target_func not in ["_create_agent", "_get"]: + if not self.agent_exists(request.agent_id): + return context.abort( + grpc.StatusCode.INVALID_ARGUMENT, + f"Agent [{request.agent_id}] not exists.", + ) + return getattr(self, request.target_func)(request) + else: + # TODO: support other user defined method + logger.error(f"Unsupported method {request.target_func}") + return context.abort( + grpc.StatusCode.INVALID_ARGUMENT, + f"Unsupported method {request.target_func}", + ) + + def _reply(self, request: RpcMsg) -> RpcMsg: + """Call function of RpcAgentService + + Args: + request (`RpcMsg`): + Message containing input parameters or input parameter + placeholders. + + Returns: + `RpcMsg`: A serialized Msg instance with attributes name, host, + port and task_id + """ + if request.value: + msg = deserialize(request.value) + else: + msg = None + task_id = self.get_task_id() + self.result_pool[task_id] = threading.Condition() + self.executor.submit( + self.process_messages, + task_id, + request.agent_id, + msg, # type: ignore[arg-type] + ) + return RpcMsg( + value=Msg( # type: ignore[arg-type] + name=self.agent_pool[request.agent_id].name, + content=None, + task_id=task_id, + ).serialize(), + ) + + def _get(self, request: RpcMsg) -> RpcMsg: + """Get a reply message with specific task_id. + + Args: + request (`RpcMsg`): + The task id that generated this message, with json format:: + + { + 'task_id': int + } + + Returns: + `RpcMsg`: Concrete values of the specific message (or part of it). + """ + msg = json.loads(request.value) + while True: + result = self.result_pool.get(msg["task_id"]) + if isinstance(result, threading.Condition): + with result: + result.wait(timeout=1) + else: + break + return RpcMsg(value=result.serialize()) + + def _observe(self, request: RpcMsg) -> RpcMsg: + """Observe function of the original agent. + + Args: + request (`RpcMsg`): + The serialized input to be observed. + + Returns: + `RpcMsg`: Empty RpcMsg. + """ + msgs = deserialize(request.value) + for msg in msgs: + if isinstance(msg, PlaceholderMessage): + msg.update_value() + self.agent_pool[request.agent_id].observe(msgs) + return RpcMsg() + + def _create_agent(self, request: RpcMsg) -> RpcMsg: + """Create a new agent instance with the given agent_id. + + Args: + request (RpcMsg): request message with a `agent_id` field. + """ + self.check_and_generate_agent( + request.agent_id, + agent_configs=( + dill.loads(base64.b64decode(request.value)) + if request.value + else None + ), + ) + return RpcMsg() + + def _clone_agent(self, request: RpcMsg) -> RpcMsg: + """Clone a new agent instance from the origin instance. + + Args: + request (RpcMsg): The `agent_id` field is the agent_id of the + agent to be cloned. + + Returns: + `RpcMsg`: The `value` field contains the agent_id of generated + agent. + """ + agent_id = request.agent_id + with self.agent_id_lock: + if agent_id not in self.agent_pool: + raise ValueError(f"Agent [{agent_id}] not exists") + ori_agent = self.agent_pool[agent_id] + new_agent = ori_agent.__class__( + *ori_agent._init_settings["args"], # pylint: disable=W0212 + **ori_agent._init_settings["kwargs"], # pylint: disable=W0212 + ) + with self.agent_id_lock: + self.agent_pool[new_agent.agent_id] = new_agent + return RpcMsg(value=new_agent.agent_id) # type: ignore[arg-type] + + def _delete_agent(self, request: RpcMsg) -> RpcMsg: + """Delete the agent instance of the specific agent_id. + + Args: + request (RpcMsg): request message with a `agent_id` field. + """ + self.check_and_delete_agent(request.agent_id) + return RpcMsg() + + def process_messages( + self, + task_id: int, + agent_id: str, + task_msg: dict = None, + ) -> None: + """Processing an input message and generate its reply message. + + Args: + task_id (`int`): task id of the input message, . + agent_id (`str`): the id of the agent that accepted the message. + task_msg (`dict`): the input message. + """ + if isinstance(task_msg, PlaceholderMessage): + task_msg.update_value() + cond = self.result_pool[task_id] + try: + result = self.agent_pool[agent_id].reply(task_msg) + self.result_pool[task_id] = result + except Exception: + error_msg = traceback.format_exc() + logger.error(f"Error in agent [{agent_id}]:\n{error_msg}") + self.result_pool[task_id] = Msg( + name="ERROR", + role="assistant", + __status="ERROR", + content=f"Error in agent [{agent_id}]:\n{error_msg}", + ) + with cond: + cond.notify_all() From 5b6cf2cca2a4ee865170670a3eeecb0475810e6a Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Fri, 24 May 2024 12:14:26 +0800 Subject: [PATCH 31/55] Delete examples/distributed_simulation/run_simlation.sh --- .../distributed_simulation/run_simlation.sh | 25 ------------------- 1 file changed, 25 deletions(-) delete mode 100644 examples/distributed_simulation/run_simlation.sh diff --git a/examples/distributed_simulation/run_simlation.sh b/examples/distributed_simulation/run_simlation.sh deleted file mode 100644 index 6fac7c4c4..000000000 --- a/examples/distributed_simulation/run_simlation.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -# default values -base_port=12330 -hosts="localhost" # or "server1 server2 server3 ..." -moderator_per_host=4 -model_per_host=8 -agent_type="random" # or "llm" -max_value=100 - -# check server-per-host -if ! [[ "$1" =~ ^[0-9]+$ ]]; then - echo "Usage: $0 " - exit 1 -fi - -# check participant-num -if ! [[ "$2" =~ ^[0-9]+$ ]]; then - echo "Usage: $0 " - exit 1 -fi - -mkdir -p log - -python main.py --role main --hosts ${hosts} --base-port ${base_port} --participant-num $2 --server-per-host $1 --model-per-host ${model_per_host} --moderator-per-host ${moderator_per_host} --agent-type ${agent_type} --max-value ${max_value} From 28037bc76b993bce6aab7a553dcd74eacd4dd753 Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Sat, 25 May 2024 19:38:39 +0800 Subject: [PATCH 32/55] renamed `Finetune_DialogAgent` to `FinetuneDialogAgent` --- .../conversation_with_agent_with_finetuned_model/README.md | 2 +- .../conversation_with_agent_with_finetuned_model.py | 6 +++--- .../finetune_dialogagent.py | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/README.md b/examples/conversation_with_agent_with_finetuned_model/README.md index d9f682a5f..06f405c44 100644 --- a/examples/conversation_with_agent_with_finetuned_model/README.md +++ b/examples/conversation_with_agent_with_finetuned_model/README.md @@ -9,7 +9,7 @@ Compared to basic conversation setup, this example introduces model loading and - Initialize an agent or use `dialog_agent.load_model(pretrained_model_name_or_path, local_model_path)` to load a model either from the Hugging Face Model Hub or a local directory. - Initalize an agent or apply `dialog_agent.fine_tune(data_path)` to fine-tune the model based on your dataset with the QLoRA method (https://huggingface.co/blog/4bit-transformers-bitsandbytes). -The default hyperparameters for (SFT) fine-tuning are specified in `agentscope/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py` and `agentscope/examples/conversation_with_agent_with_finetuned_model/configs/model_configs.json`. For customized hyperparameters, specify them in `model_configs` if the model needs to be fine-tuned at initialization, or specify through `fine_tune_config` in `Finetune_DialogAgent`'s `fine_tune` method after initialization, as shown in the example script `conversation_with_agent_with_finetuned_model.py`. +The default hyperparameters for (SFT) fine-tuning are specified in `agentscope/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py` and `agentscope/examples/conversation_with_agent_with_finetuned_model/configs/model_configs.json`. For customized hyperparameters, specify them in `model_configs` if the model needs to be fine-tuned at initialization, or specify through `fine_tune_config` in `FinetuneDialogAgent`'s `fine_tune` method after initialization, as shown in the example script `conversation_with_agent_with_finetuned_model.py`. ## Agent Initialization diff --git a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py index 244b7ec5d..a2c2190e4 100644 --- a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py @@ -2,7 +2,7 @@ """ This script sets up a conversational agent using AgentScope with a Hugging Face model. -It includes initializing a Finetune_DialogAgent, +It includes initializing a FinetuneDialogAgent, loading and fine-tuning a pre-trained model, and conducting a dialogue via a sequential pipeline. The conversation continues until the user exits. @@ -11,7 +11,7 @@ """ # pylint: disable=unused-import from huggingface_model import HuggingFaceWrapper -from finetune_dialogagent import Finetune_DialogAgent +from FinetuneDialogAgent import FinetuneDialogAgent import agentscope from agentscope.agents.user_agent import UserAgent from agentscope.pipelines.functional import sequentialpipeline @@ -66,7 +66,7 @@ def main() -> None: # ) # Init agents with the custom model - dialog_agent = Finetune_DialogAgent( + dialog_agent = FinetuneDialogAgent( name="Assistant", sys_prompt=( "Explain in simple terms how the attention mechanism of " diff --git a/examples/conversation_with_agent_with_finetuned_model/finetune_dialogagent.py b/examples/conversation_with_agent_with_finetuned_model/finetune_dialogagent.py index 60a68ca31..b708ca81b 100644 --- a/examples/conversation_with_agent_with_finetuned_model/finetune_dialogagent.py +++ b/examples/conversation_with_agent_with_finetuned_model/finetune_dialogagent.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """ -This module provides the Finetune_DialogAgent class, +This module provides the FinetuneDialogAgent class, which extends DialogAgent to enhance fine-tuning capabilities with custom hyperparameters. """ @@ -11,7 +11,7 @@ from agentscope.agents import DialogAgent -class Finetune_DialogAgent(DialogAgent): +class FinetuneDialogAgent(DialogAgent): """ A dialog agent capable of fine-tuning its underlying model based on provided data. @@ -29,7 +29,7 @@ def __init__( memory_config: Optional[dict] = None, ): """ - Initializes a new Finetune_DialogAgent with specified configuration. + Initializes a new FinetuneDialogAgent with specified configuration. Arguments: name (str): Name of the agent. From 3fcc03b18c24d271e2a938244e0977e17e515d9b Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Sat, 25 May 2024 21:05:49 +0800 Subject: [PATCH 33/55] rename `finetune_dialogAgent` to `FinetuneDialogAgent` --- .../{finetune_dialogagent.py => FinetuneDialogAgent.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/conversation_with_agent_with_finetuned_model/{finetune_dialogagent.py => FinetuneDialogAgent.py} (100%) diff --git a/examples/conversation_with_agent_with_finetuned_model/finetune_dialogagent.py b/examples/conversation_with_agent_with_finetuned_model/FinetuneDialogAgent.py similarity index 100% rename from examples/conversation_with_agent_with_finetuned_model/finetune_dialogagent.py rename to examples/conversation_with_agent_with_finetuned_model/FinetuneDialogAgent.py From 3fb3540b65d279fe68686696977a88c6a826f159 Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Tue, 28 May 2024 22:52:38 +0800 Subject: [PATCH 34/55] Updated README to be more precise in its description --- .../conversation_with_agent_with_finetuned_model/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/README.md b/examples/conversation_with_agent_with_finetuned_model/README.md index 06f405c44..847888a0e 100644 --- a/examples/conversation_with_agent_with_finetuned_model/README.md +++ b/examples/conversation_with_agent_with_finetuned_model/README.md @@ -1,6 +1,6 @@ -# Multi-Agent Conversation with Custom Model Loading and Fine-Tuning in AgentScope +# User-Agent Conversation with Custom Model Loading and Fine-Tuning in AgentScope -This example demonstrates how to load and optionally fine-tune a Hugging Face model within a multi-agent conversation setup using AgentScope. The complete code is provided in `agentscope/examples/conversation_with_agent_with_finetuned_model`. +This example demonstrates how to load and optionally fine-tune a Hugging Face model within a user-agent conversation setup using AgentScope. The complete code is provided in `agentscope/examples/conversation_with_agent_with_finetuned_model`. ## Functionality Overview From ce1373bba6a6b562578cde83665a62e9c6af19b4 Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Thu, 30 May 2024 17:16:28 +0800 Subject: [PATCH 35/55] fixed error on quantization/QLora --- .../conversation_with_agent_with_finetuned_model.py | 2 +- .../huggingface_model.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py index a2c2190e4..233dbfee1 100644 --- a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py @@ -53,7 +53,7 @@ def main() -> None: "load_in_4bit": True, "bnb_4bit_use_double_quant": True, "bnb_4bit_quant_type": "nf4", - "bnb_4bit_compute_dtype": "torch.bfloat16", + "bnb_4bit_compute_dtype": "bfloat16", }, }, }, diff --git a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py index 809c1fd1a..8f4604638 100644 --- a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py @@ -95,6 +95,7 @@ def __init__( self.load_model( pretrained_model_name_or_path, local_model_path=local_model_path, + fine_tune_config=fine_tune_config, ) self.load_tokenizer( pretrained_model_name_or_path, From b2f2b09cbaa1348d7b78039ce7d2b8bc7aa85a2d Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Thu, 30 May 2024 18:55:55 +0800 Subject: [PATCH 36/55] add required dependencies for some use cases --- examples/conversation_with_agent_with_finetuned_model/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/conversation_with_agent_with_finetuned_model/README.md b/examples/conversation_with_agent_with_finetuned_model/README.md index 847888a0e..99e3fcaa7 100644 --- a/examples/conversation_with_agent_with_finetuned_model/README.md +++ b/examples/conversation_with_agent_with_finetuned_model/README.md @@ -67,6 +67,7 @@ Before running this example, ensure you have installed the following packages: - `datasets` - `trl` - `bitsandbytes` +- `sentencepiece` Additionally, set `HUGGINGFACE_TOKEN` in the `agentscope/examples/conversation_with_agent_with_finetuned_model/.env`. From 1d0704d544e80d30ecd5d12db35a64c73f0a60af Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Thu, 30 May 2024 19:39:53 +0800 Subject: [PATCH 37/55] optimized the behavior of `device_map` when loading a huggingface model. optimized the behavior of `device_map` when loading a huggingface model. Now if `device` is not given by the user, `device_map="auto"` by default; otherwise `device_map` is set to the user-specified `device`. --- .../huggingface_model.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py index 8f4604638..97315ff8e 100644 --- a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py @@ -86,10 +86,12 @@ def __init__( self.huggingface_token = os.getenv("HUGGINGFACE_TOKEN") if device is None: + self.device_map = 'auto' self.device = torch.device( "cuda" if torch.cuda.is_available() else "cpu", ) else: + self.device_map = device self.device = device self.load_model( @@ -251,7 +253,7 @@ def load_model( pretrained_model_name_or_path, quantization_config=bnb_config, token=self.huggingface_token, - device_map="auto", + device_map=self.device_map, ) info_msg = ( f"Successfully loaded new model " @@ -263,7 +265,7 @@ def load_model( local_model_path, quantization_config=bnb_config, local_files_only=True, - device_map="auto", + device_map=self.device_map, ) info_msg = ( f"Successfully loaded new model " From 86852139d8107fcebf974ccecbcfd66d67eaec94 Mon Sep 17 00:00:00 2001 From: zyzhang Date: Thu, 30 May 2024 13:04:22 +0000 Subject: [PATCH 38/55] optimized the behavior of device_map when loading a huggingface model. --- .../huggingface_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py index 97315ff8e..4502b5ad5 100644 --- a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py @@ -86,7 +86,7 @@ def __init__( self.huggingface_token = os.getenv("HUGGINGFACE_TOKEN") if device is None: - self.device_map = 'auto' + self.device_map = "auto" self.device = torch.device( "cuda" if torch.cuda.is_available() else "cpu", ) From 3da24f446cd67d87ec81ded714330aceaf734569 Mon Sep 17 00:00:00 2001 From: zyzhang Date: Thu, 30 May 2024 13:42:46 +0000 Subject: [PATCH 39/55] optimized the behavior of when loading a huggingface model (default to disable ). --- .../huggingface_model.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py index 4502b5ad5..ea4b8cd90 100644 --- a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py @@ -240,20 +240,22 @@ def load_model( """ bnb_config_default = {} + bnb_config = {} if fine_tune_config is not None: if fine_tune_config.get("bnb_config") is not None: bnb_config_default.update(fine_tune_config["bnb_config"]) - - bnb_config = BitsAndBytesConfig(**bnb_config_default) + if bnb_config != bnb_config_default: + bnb_config = BitsAndBytesConfig(**bnb_config_default) try: if local_model_path is None: self.model = AutoModelForCausalLM.from_pretrained( pretrained_model_name_or_path, - quantization_config=bnb_config, - token=self.huggingface_token, device_map=self.device_map, + torch_dtype=torch.bfloat16, + **({"quantization_config": bnb_config} if bnb_config != {} else {}), + token = self.huggingface_token, ) info_msg = ( f"Successfully loaded new model " @@ -263,9 +265,10 @@ def load_model( else: self.model = AutoModelForCausalLM.from_pretrained( local_model_path, - quantization_config=bnb_config, - local_files_only=True, device_map=self.device_map, + torch_dtype=torch.bfloat16, + **({"quantization_config": bnb_config} if bnb_config != {} else {}), + local_files_only=True, ) info_msg = ( f"Successfully loaded new model " From 2ea87031d6b8d41e4aa663d4fbd72d55ade6c4fe Mon Sep 17 00:00:00 2001 From: zyzhang Date: Thu, 30 May 2024 13:56:54 +0000 Subject: [PATCH 40/55] optimized the behavior of when loading a huggingface model (default to disable ). --- .../huggingface_model.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py index ea4b8cd90..4e5084552 100644 --- a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py @@ -254,8 +254,12 @@ def load_model( pretrained_model_name_or_path, device_map=self.device_map, torch_dtype=torch.bfloat16, - **({"quantization_config": bnb_config} if bnb_config != {} else {}), - token = self.huggingface_token, + **( + {"quantization_config": bnb_config} + if bnb_config != {} + else {} + ), + token=self.huggingface_token, ) info_msg = ( f"Successfully loaded new model " @@ -267,7 +271,11 @@ def load_model( local_model_path, device_map=self.device_map, torch_dtype=torch.bfloat16, - **({"quantization_config": bnb_config} if bnb_config != {} else {}), + **( + {"quantization_config": bnb_config} + if bnb_config != {} + else {} + ), local_files_only=True, ) info_msg = ( From e0ba28284036f468137cd83481e8dad8600dd2df Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Fri, 7 Jun 2024 05:07:32 +0800 Subject: [PATCH 41/55] updated peft config now the user can choose to do full-parameter finetuning by not passing `lora_config` --- ...rsation_with_agent_with_finetuned_model.py | 2 +- .../huggingface_model.py | 29 ++++++++++--------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py index 233dbfee1..f915a3d2a 100644 --- a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py @@ -48,7 +48,7 @@ def main() -> None: # the standard lora and sfttrainer fields. "fine_tune_config": { "lora_config": {"r": 16, "lora_alpha": 32}, - "training_args": {"max_steps": 200, "logging_steps": 1}, + "training_args": {"num_train_epochs": 5, "logging_steps": 1}, "bnb_config": { "load_in_4bit": True, "bnb_4bit_use_double_quant": True, diff --git a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py index 4e5084552..699a21359 100644 --- a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py @@ -239,13 +239,13 @@ def load_model( or network issues while fetching the model. """ + bnb_config = None bnb_config_default = {} - bnb_config = {} if fine_tune_config is not None: if fine_tune_config.get("bnb_config") is not None: bnb_config_default.update(fine_tune_config["bnb_config"]) - if bnb_config != bnb_config_default: + if bnb_config_default != {}: bnb_config = BitsAndBytesConfig(**bnb_config_default) try: @@ -256,7 +256,7 @@ def load_model( torch_dtype=torch.bfloat16, **( {"quantization_config": bnb_config} - if bnb_config != {} + if bnb_config is not None else {} ), token=self.huggingface_token, @@ -273,7 +273,7 @@ def load_model( torch_dtype=torch.bfloat16, **( {"quantization_config": bnb_config} - if bnb_config != {} + if bnb_config is not None else {} ), local_files_only=True, @@ -344,6 +344,7 @@ def load_tokenizer( f"'{pretrained_model_name_or_path}'" f" from '{local_tokenizer_path}'", ) + self.tokenizer.add_special_tokens({'pad_token': '[PAD]'}) except Exception as e: # Handle exceptions during model loading, @@ -483,13 +484,8 @@ def fine_tune_training( from peft import LoraConfig - lora_config_default = { - "r": 16, - "lora_alpha": 32, - "lora_dropout": 0.05, - "bias": "none", - "task_type": "CAUSAL_LM", - } + lora_config = None + lora_config_default = {} if fine_tune_config is not None: if fine_tune_config.get("lora_config") is not None: @@ -514,8 +510,9 @@ def fine_tune_training( from peft import get_peft_model - lora_config = LoraConfig(**lora_config_default) - model = get_peft_model(model, lora_config) + if lora_config_default != {}: + lora_config = LoraConfig(**lora_config_default) + model = get_peft_model(model, lora_config) collator = DataCollatorForCompletionOnlyLM( response_template=" ### Answer:", @@ -530,7 +527,11 @@ def fine_tune_training( data_collator=collator, train_dataset=formatted_dataset["train"], eval_dataset=formatted_dataset["test"], - peft_config=lora_config, + **( + {"peft_config": lora_config} + if lora_config is not None + else {} + ), args=trainer_args, max_seq_length=2048, ) From 7f2f56537dcc48040a233f19df2532d11c7c8a3e Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Fri, 7 Jun 2024 05:45:23 +0800 Subject: [PATCH 42/55] updated peft config now the user can choose to do full-parameter finetuning by not passing `lora_config` and `bnb_config` --- .../huggingface_model.py | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py index 699a21359..6367382fe 100644 --- a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py @@ -18,6 +18,8 @@ BitsAndBytesConfig, ) import transformers +from peft import LoraConfig +from peft import get_peft_model from trl import SFTTrainer, DataCollatorForCompletionOnlyLM from datasets import load_dataset from loguru import logger @@ -245,7 +247,7 @@ def load_model( if fine_tune_config is not None: if fine_tune_config.get("bnb_config") is not None: bnb_config_default.update(fine_tune_config["bnb_config"]) - if bnb_config_default != {}: + if bnb_config_default: bnb_config = BitsAndBytesConfig(**bnb_config_default) try: @@ -344,7 +346,7 @@ def load_tokenizer( f"'{pretrained_model_name_or_path}'" f" from '{local_tokenizer_path}'", ) - self.tokenizer.add_special_tokens({'pad_token': '[PAD]'}) + self.tokenizer.add_special_tokens({"pad_token": "[PAD]"}) except Exception as e: # Handle exceptions during model loading, @@ -482,15 +484,9 @@ def fine_tune_training( formatted_dataset = dataset_reduced.train_test_split(test_size=0.1) - from peft import LoraConfig - lora_config = None lora_config_default = {} - if fine_tune_config is not None: - if fine_tune_config.get("lora_config") is not None: - lora_config_default.update(fine_tune_config["lora_config"]) - training_defaults = { "per_device_train_batch_size": 1, "gradient_accumulation_steps": 4, @@ -502,15 +498,15 @@ def fine_tune_training( } if fine_tune_config is not None: + if fine_tune_config.get("lora_config") is not None: + lora_config_default.update(fine_tune_config["lora_config"]) if fine_tune_config.get("training_args") is not None: training_defaults.update(fine_tune_config["training_args"]) if output_dir is not None: training_defaults["output_dir"] = output_dir - from peft import get_peft_model - - if lora_config_default != {}: + if lora_config_default: lora_config = LoraConfig(**lora_config_default) model = get_peft_model(model, lora_config) @@ -528,9 +524,7 @@ def fine_tune_training( train_dataset=formatted_dataset["train"], eval_dataset=formatted_dataset["test"], **( - {"peft_config": lora_config} - if lora_config is not None - else {} + {"peft_config": lora_config} if lora_config is not None else {} ), args=trainer_args, max_seq_length=2048, From 427f9f51ad8dff2e1d3d0d3b4e97110335264aee Mon Sep 17 00:00:00 2001 From: Ze Yu Zhang Date: Fri, 7 Jun 2024 05:52:10 +0800 Subject: [PATCH 43/55] now the user can choose to do full-parameter finetuning by not passing and --- ...rsation_with_agent_with_finetuned_model.py | 5 ++++- .../huggingface_model.py | 22 +++++++------------ 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py index f915a3d2a..6301c39c8 100644 --- a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py @@ -48,7 +48,10 @@ def main() -> None: # the standard lora and sfttrainer fields. "fine_tune_config": { "lora_config": {"r": 16, "lora_alpha": 32}, - "training_args": {"num_train_epochs": 5, "logging_steps": 1}, + "training_args": { + "num_train_epochs": 5, + "logging_steps": 1, + }, "bnb_config": { "load_in_4bit": True, "bnb_4bit_use_double_quant": True, diff --git a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py index 699a21359..6367382fe 100644 --- a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py @@ -18,6 +18,8 @@ BitsAndBytesConfig, ) import transformers +from peft import LoraConfig +from peft import get_peft_model from trl import SFTTrainer, DataCollatorForCompletionOnlyLM from datasets import load_dataset from loguru import logger @@ -245,7 +247,7 @@ def load_model( if fine_tune_config is not None: if fine_tune_config.get("bnb_config") is not None: bnb_config_default.update(fine_tune_config["bnb_config"]) - if bnb_config_default != {}: + if bnb_config_default: bnb_config = BitsAndBytesConfig(**bnb_config_default) try: @@ -344,7 +346,7 @@ def load_tokenizer( f"'{pretrained_model_name_or_path}'" f" from '{local_tokenizer_path}'", ) - self.tokenizer.add_special_tokens({'pad_token': '[PAD]'}) + self.tokenizer.add_special_tokens({"pad_token": "[PAD]"}) except Exception as e: # Handle exceptions during model loading, @@ -482,15 +484,9 @@ def fine_tune_training( formatted_dataset = dataset_reduced.train_test_split(test_size=0.1) - from peft import LoraConfig - lora_config = None lora_config_default = {} - if fine_tune_config is not None: - if fine_tune_config.get("lora_config") is not None: - lora_config_default.update(fine_tune_config["lora_config"]) - training_defaults = { "per_device_train_batch_size": 1, "gradient_accumulation_steps": 4, @@ -502,15 +498,15 @@ def fine_tune_training( } if fine_tune_config is not None: + if fine_tune_config.get("lora_config") is not None: + lora_config_default.update(fine_tune_config["lora_config"]) if fine_tune_config.get("training_args") is not None: training_defaults.update(fine_tune_config["training_args"]) if output_dir is not None: training_defaults["output_dir"] = output_dir - from peft import get_peft_model - - if lora_config_default != {}: + if lora_config_default: lora_config = LoraConfig(**lora_config_default) model = get_peft_model(model, lora_config) @@ -528,9 +524,7 @@ def fine_tune_training( train_dataset=formatted_dataset["train"], eval_dataset=formatted_dataset["test"], **( - {"peft_config": lora_config} - if lora_config is not None - else {} + {"peft_config": lora_config} if lora_config is not None else {} ), args=trainer_args, max_seq_length=2048, From 432bb210e73359e20489f2f2b2524b9bb6be6eef Mon Sep 17 00:00:00 2001 From: Ze Yu Zhang Date: Fri, 7 Jun 2024 18:16:19 +0800 Subject: [PATCH 44/55] moved peft loading to ; removed independently saving tokenizer --- ...rsation_with_agent_with_finetuned_model.py | 12 +++- .../huggingface_model.py | 67 +++++++++---------- 2 files changed, 40 insertions(+), 39 deletions(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py index 6301c39c8..79ba887a9 100644 --- a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py @@ -30,8 +30,8 @@ def main() -> None: # Or another generative model of your choice. # Needed from loading from Hugging Face. "pretrained_model_name_or_path": "google/gemma-7b", - # "local_model_path": # Specify your local model path - # "local_tokenizer_path": # Specify your local tokenizer path + # "local_model_path": , # Specify your local model path + # "local_tokenizer_path":, # Specify your local tokenizer path "max_length": 128, # Device for inference. Fine-tuning occurs on gpus. "device": "cuda", @@ -47,7 +47,13 @@ def main() -> None: # `lora_config` and `training_args` follow # the standard lora and sfttrainer fields. "fine_tune_config": { - "lora_config": {"r": 16, "lora_alpha": 32}, + "lora_config": { + "r": 16, + "lora_alpha": 32, + "lora_dropout": 0.05, + "bias": "none", + "task_type": "CAUSAL_LM", + }, "training_args": { "num_train_epochs": 5, "logging_steps": 1, diff --git a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py index 6367382fe..e734aa34d 100644 --- a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py @@ -48,7 +48,6 @@ def __init__( output_dir: Optional[str] = None, device: Optional[torch.device] = None, local_model_path: Optional[str] = None, - local_tokenizer_path: Optional[str] = None, fine_tune_config: Optional[Dict[str, Any]] = None, **kwargs: Any, ) -> None: @@ -72,7 +71,7 @@ def __init__( device (torch.device, optional): Device to run the model on. Default to GPU if available. local_model_path (str, optional): Local file path to a - pre-trained model. + pre-trained model and its tokenizer. fine_tune_config (dict, optional): Configuration for fine-tuning the model. **kwargs: Additional keyword arguments. @@ -103,7 +102,7 @@ def __init__( ) self.load_tokenizer( pretrained_model_name_or_path, - local_tokenizer_path=local_tokenizer_path, + local_model_path=local_model_path, ) if data_path is not None: @@ -250,6 +249,9 @@ def load_model( if bnb_config_default: bnb_config = BitsAndBytesConfig(**bnb_config_default) + self.lora_config = None + lora_config_default = {} + try: if local_model_path is None: self.model = AutoModelForCausalLM.from_pretrained( @@ -263,6 +265,14 @@ def load_model( ), token=self.huggingface_token, ) + + if fine_tune_config is not None: + if fine_tune_config.get("lora_config") is not None: + lora_config_default.update(fine_tune_config["lora_config"]) + if lora_config_default != {}: + self.lora_config = LoraConfig(**lora_config_default) + self.model = get_peft_model(self.model, self.lora_config) + info_msg = ( f"Successfully loaded new model " f"'{pretrained_model_name_or_path}' from " @@ -280,6 +290,14 @@ def load_model( ), local_files_only=True, ) + + if fine_tune_config is not None: + if fine_tune_config.get("lora_config") is not None: + lora_config_default.update(fine_tune_config["lora_config"]) + if lora_config_default != {}: + lora_config = LoraConfig(**lora_config_default) + self.model = get_peft_model(self.model, lora_config) + info_msg = ( f"Successfully loaded new model " f"'{pretrained_model_name_or_path}' from " @@ -304,14 +322,15 @@ def load_model( def load_tokenizer( self, pretrained_model_name_or_path: Optional[str] = None, - local_tokenizer_path: Optional[str] = None, + local_model_path: Optional[str] = None, ) -> None: """ Load the tokenizer from a local path. Arguments: - local_tokenizer_path (str): The file path to the - tokenizer to be loaded. + local_model_path (str): The file path to the + tokenizer to be loaded + (same as `local_model_path`). pretrained_model_name_or_path (str): An identifier for the model on Huggingface. fine_tune_config (dict, optional): Configuration options for @@ -325,7 +344,7 @@ def load_tokenizer( """ try: - if local_tokenizer_path is None: + if local_model_path is None: self.tokenizer = AutoTokenizer.from_pretrained( pretrained_model_name_or_path, token=self.huggingface_token, @@ -338,13 +357,13 @@ def load_tokenizer( else: self.tokenizer = AutoTokenizer.from_pretrained( - local_tokenizer_path, + local_model_path, ) # log the successful tokenizer loading logger.info( f"Successfully loaded new tokenizer for model " f"'{pretrained_model_name_or_path}'" - f" from '{local_tokenizer_path}'", + f" from '{local_model_path}'", ) self.tokenizer.add_special_tokens({"pad_token": "[PAD]"}) @@ -354,7 +373,7 @@ def load_tokenizer( error_message = ( f"Failed to load tokenizer for model" f" '{pretrained_model_name_or_path}' from " - f"'{local_tokenizer_path}': {e}" + f"'{local_model_path}': {e}" ) logger.error(error_message) @@ -484,9 +503,6 @@ def fine_tune_training( formatted_dataset = dataset_reduced.train_test_split(test_size=0.1) - lora_config = None - lora_config_default = {} - training_defaults = { "per_device_train_batch_size": 1, "gradient_accumulation_steps": 4, @@ -498,18 +514,12 @@ def fine_tune_training( } if fine_tune_config is not None: - if fine_tune_config.get("lora_config") is not None: - lora_config_default.update(fine_tune_config["lora_config"]) if fine_tune_config.get("training_args") is not None: training_defaults.update(fine_tune_config["training_args"]) if output_dir is not None: training_defaults["output_dir"] = output_dir - if lora_config_default: - lora_config = LoraConfig(**lora_config_default) - model = get_peft_model(model, lora_config) - collator = DataCollatorForCompletionOnlyLM( response_template=" ### Answer:", tokenizer=tokenizer, @@ -524,7 +534,7 @@ def fine_tune_training( train_dataset=formatted_dataset["train"], eval_dataset=formatted_dataset["test"], **( - {"peft_config": lora_config} if lora_config is not None else {} + {"peft_config": self.lora_config} if self.lora_config is not None else {} ), args=trainer_args, max_seq_length=2048, @@ -569,19 +579,4 @@ def fine_tune_training( model_path = os.path.join(os.path.dirname(__file__), model_name) trainer.save_model(model_path) - # save tokenizer - tokenizer_name_temp = model.config.name_or_path.split("/")[-1] - tokenizer_name = f"sft_{tokenizer_name_temp}_tokenizer_{time_string}" - if output_dir is not None: - tokenizer_path = os.path.join( - output_dir, - tokenizer_name, - ) - else: - tokenizer_path = os.path.join( - os.path.dirname(__file__), - tokenizer_name, - ) - tokenizer.save_pretrained(tokenizer_path) - - return model + return model \ No newline at end of file From a27c3a82fe9bd508ac615fc9cc20ffcba59c27e2 Mon Sep 17 00:00:00 2001 From: Ze Yu Zhang Date: Fri, 7 Jun 2024 18:22:13 +0800 Subject: [PATCH 45/55] moved peft loading to ; removed independently saving tokenizer --- .../huggingface_model.py | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py index e734aa34d..f2fb2cf30 100644 --- a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py @@ -71,7 +71,8 @@ def __init__( device (torch.device, optional): Device to run the model on. Default to GPU if available. local_model_path (str, optional): Local file path to a - pre-trained model and its tokenizer. + pre-trained model + and its tokenizer. fine_tune_config (dict, optional): Configuration for fine-tuning the model. **kwargs: Additional keyword arguments. @@ -268,8 +269,10 @@ def load_model( if fine_tune_config is not None: if fine_tune_config.get("lora_config") is not None: - lora_config_default.update(fine_tune_config["lora_config"]) - if lora_config_default != {}: + lora_config_default.update( + fine_tune_config["lora_config"], + ) + if lora_config_default: self.lora_config = LoraConfig(**lora_config_default) self.model = get_peft_model(self.model, self.lora_config) @@ -293,8 +296,10 @@ def load_model( if fine_tune_config is not None: if fine_tune_config.get("lora_config") is not None: - lora_config_default.update(fine_tune_config["lora_config"]) - if lora_config_default != {}: + lora_config_default.update( + fine_tune_config["lora_config"], + ) + if lora_config_default: lora_config = LoraConfig(**lora_config_default) self.model = get_peft_model(self.model, lora_config) @@ -534,7 +539,9 @@ def fine_tune_training( train_dataset=formatted_dataset["train"], eval_dataset=formatted_dataset["test"], **( - {"peft_config": self.lora_config} if self.lora_config is not None else {} + {"peft_config": self.lora_config} + if self.lora_config is not None + else {} ), args=trainer_args, max_seq_length=2048, @@ -579,4 +586,4 @@ def fine_tune_training( model_path = os.path.join(os.path.dirname(__file__), model_name) trainer.save_model(model_path) - return model \ No newline at end of file + return model From b5323461757edd7966d66326cbab33e7dbe1a7bd Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Mon, 24 Jun 2024 12:08:45 +0800 Subject: [PATCH 46/55] Update huggingface_model.py updated according to the latest comments --- .../huggingface_model.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py index f2fb2cf30..1dbfcd846 100644 --- a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py @@ -79,6 +79,8 @@ def __init__( """ super().__init__(config_name=config_name) self.model = None + self.lora_config = None + self.tokenizer = None self.max_length = max_length # Set max_length as an attribute self.pretrained_model_name_or_path = pretrained_model_name_or_path script_path = os.path.abspath(__file__) @@ -218,7 +220,7 @@ def format( return huggingface_msgs - def load_model( + def _load_model( self, pretrained_model_name_or_path: Optional[str] = None, local_model_path: Optional[str] = None, @@ -250,7 +252,6 @@ def load_model( if bnb_config_default: bnb_config = BitsAndBytesConfig(**bnb_config_default) - self.lora_config = None lora_config_default = {} try: @@ -324,7 +325,7 @@ def load_model( raise - def load_tokenizer( + def _load_tokenizer( self, pretrained_model_name_or_path: Optional[str] = None, local_model_path: Optional[str] = None, @@ -384,7 +385,7 @@ def load_tokenizer( raise - def fine_tune( + def _fine_tune( self, data_path: Optional[str] = None, output_dir: Optional[str] = None, @@ -426,7 +427,7 @@ def fine_tune( ) raise - def formatting_prompts_func( + def _formatting_prompts_func( self, example: Dict[str, List[List[str]]], ) -> List[str]: @@ -449,7 +450,7 @@ def formatting_prompts_func( output_texts.append(text) return output_texts - def fine_tune_training( + def _fine_tune_training( self, model: AutoModelForCausalLM, tokenizer: AutoTokenizer, @@ -548,7 +549,9 @@ def fine_tune_training( ) logger.info( - "fine-tuning model", + "Starting fine-tuning of the model '{model_name}' at {timestamp}", + model_name=self.model.config.name_or_path, + timestamp=datetime.now().strftime("%Y-%m-%d %H:%M:%S"), ) trainer.train() From d0bcc344ae508d4b7c88837dc77ba2b709a41ec4 Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Mon, 24 Jun 2024 13:57:20 +0800 Subject: [PATCH 47/55] updated example `conversation_with_agent_with_finetuned_model` according to comments --- .../FinetuneDialogAgent.py | 26 ++++------ ...rsation_with_agent_with_finetuned_model.py | 52 +++++++++++-------- .../huggingface_model.py | 31 ++++++----- 3 files changed, 59 insertions(+), 50 deletions(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/FinetuneDialogAgent.py b/examples/conversation_with_agent_with_finetuned_model/FinetuneDialogAgent.py index b708ca81b..dd1ac2121 100644 --- a/examples/conversation_with_agent_with_finetuned_model/FinetuneDialogAgent.py +++ b/examples/conversation_with_agent_with_finetuned_model/FinetuneDialogAgent.py @@ -5,9 +5,7 @@ capabilities with custom hyperparameters. """ from typing import Any, Optional, Dict - from loguru import logger - from agentscope.agents import DialogAgent @@ -45,7 +43,6 @@ def __init__( Note: Refer to `class DialogAgent(AgentBase)` for more information. """ - super().__init__( name, sys_prompt, @@ -58,6 +55,7 @@ def load_model( self, pretrained_model_name_or_path: Optional[str] = None, local_model_path: Optional[str] = None, + fine_tune_config: Optional[Dict[str, Any]] = None, ) -> None: """ Load a new model into the agent. @@ -72,11 +70,11 @@ def load_model( Exception: If the model loading process fails or if the model wrapper does not support dynamic loading. """ - - if hasattr(self.model, "load_model"): - self.model.load_model( + if hasattr(self.model, "_load_model"): + self.model._load_model( pretrained_model_name_or_path, local_model_path, + fine_tune_config ) else: logger.error( @@ -86,7 +84,7 @@ def load_model( def load_tokenizer( self, pretrained_model_name_or_path: Optional[str] = None, - local_tokenizer_path: Optional[str] = None, + local_model_path: Optional[str] = None, ) -> None: """ Load a new tokenizer for the agent. @@ -102,12 +100,8 @@ def load_tokenizer( Exception: If the model tokenizer process fails or if the model wrapper does not support dynamic loading. """ - - if hasattr(self.model, "load_tokenizer"): - self.model.load_tokenizer( - pretrained_model_name_or_path, - local_tokenizer_path, - ) + if hasattr(self.model, "_load_tokenizer"): + self.model._load_tokenizer(pretrained_model_name_or_path, local_model_path) else: logger.error("The model wrapper does not support dynamic loading.") @@ -132,9 +126,7 @@ def fine_tune( Exception: If fine-tuning fails or if the model wrapper does not support fine-tuning. """ - - if hasattr(self.model, "fine_tune"): - self.model.fine_tune(data_path, output_dir, fine_tune_config) - logger.info("Fine-tuning completed successfully.") + if hasattr(self.model, "_fine_tune"): + self.model._fine_tune(data_path, output_dir, fine_tune_config) else: logger.error("The model wrapper does not support fine-tuning.") diff --git a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py index 79ba887a9..929a4aee9 100644 --- a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py @@ -85,31 +85,41 @@ def main() -> None: model_config_name="my_custom_model", ) - # # (Optional) can load another model after - # # the agent has been instantiated if needed - # dialog_agent.load_model( - # pretrained_model_name_or_path="google/gemma-7b", - # local_model_path=None, - # ) # load model gemma-2b-it from Hugging Face - # dialog_agent.load_tokenizer( - # pretrained_model_name_or_path="google/gemma-7b", - # local_tokenizer_path=None, - # ) # load tokenizer for gemma-2b-it from Hugging Face + # (Optional) can load another model after + # the agent has been instantiated if needed + # (for `fine_tune_config` specify only + # `lora_config` and `bnb_config` if used) + dialog_agent.load_model( + pretrained_model_name_or_path="google/gemma-7b", + local_model_path=None, + fine_tune_config={ + "lora_config": {"r": 24, "lora_alpha": 48}, + "bnb_config": { + "load_in_4bit": True, + "bnb_4bit_use_double_quant": True, + "bnb_4bit_quant_type": "nf4", + "bnb_4bit_compute_dtype": "bfloat16", + }, + }, + ) # load model from Hugging Face - # fine-tune loaded model with lima dataset - # with default hyperparameters - # dialog_agent.fine_tune(data_path="GAIR/lima") + dialog_agent.load_tokenizer( + pretrained_model_name_or_path="google/gemma-7b", + local_model_path=None, + ) # load tokenizer # fine-tune loaded model with lima dataset # with customized hyperparameters - # (`fine_tune_config` argument is optional. Defaults to None.) - # dialog_agent.fine_tune( - # "GAIR/lima", - # fine_tune_config={ - # "lora_config": {"r": 24, "lora_alpha": 48}, - # "training_args": {"max_steps": 300, "logging_steps": 3}, - # }, - # ) + # (`fine_tune_config` argument is optional + # (specify only `lora_config` and + # `training_args` if used). Defaults to None.) + dialog_agent.fine_tune( + "GAIR/lima", + fine_tune_config={ + "lora_config": {"r": 24, "lora_alpha": 48}, + "training_args": {"max_steps": 300, "logging_steps": 3}, + }, + ) user_agent = UserAgent() diff --git a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py index 1dbfcd846..4f892090e 100644 --- a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py @@ -79,8 +79,6 @@ def __init__( """ super().__init__(config_name=config_name) self.model = None - self.lora_config = None - self.tokenizer = None self.max_length = max_length # Set max_length as an attribute self.pretrained_model_name_or_path = pretrained_model_name_or_path script_path = os.path.abspath(__file__) @@ -98,18 +96,18 @@ def __init__( self.device_map = device self.device = device - self.load_model( + self._load_model( pretrained_model_name_or_path, local_model_path=local_model_path, fine_tune_config=fine_tune_config, ) - self.load_tokenizer( + self._load_tokenizer( pretrained_model_name_or_path, local_model_path=local_model_path, ) if data_path is not None: - self.model = self.fine_tune_training( + self.model = self._fine_tune_training( self.model, self.tokenizer, data_path, @@ -252,6 +250,7 @@ def _load_model( if bnb_config_default: bnb_config = BitsAndBytesConfig(**bnb_config_default) + self.lora_config = None lora_config_default = {} try: @@ -409,7 +408,7 @@ def _fine_tune( or internal errors during the training process. """ try: - self.model = self.fine_tune_training( + self.model = self._fine_tune_training( self.model, self.tokenizer, data_path, @@ -519,9 +518,20 @@ def _fine_tune_training( "logging_steps": 1, } + self.lora_config = None + lora_config_default = {} + if fine_tune_config is not None: if fine_tune_config.get("training_args") is not None: training_defaults.update(fine_tune_config["training_args"]) + if fine_tune_config.get("lora_config") is not None: + lora_config_default.update( + fine_tune_config["lora_config"], + ) + + if lora_config_default: + self.lora_config = LoraConfig(**lora_config_default) + self.model = get_peft_model(self.model, self.lora_config) if output_dir is not None: training_defaults["output_dir"] = output_dir @@ -535,7 +545,7 @@ def _fine_tune_training( trainer = SFTTrainer( model, - formatting_func=self.formatting_prompts_func, + formatting_func=self._formatting_prompts_func, data_collator=collator, train_dataset=formatted_dataset["train"], eval_dataset=formatted_dataset["test"], @@ -548,11 +558,8 @@ def _fine_tune_training( max_seq_length=2048, ) - logger.info( - "Starting fine-tuning of the model '{model_name}' at {timestamp}", - model_name=self.model.config.name_or_path, - timestamp=datetime.now().strftime("%Y-%m-%d %H:%M:%S"), - ) + logger.info("Starting fine-tuning of the model '{model_name}' at {timestamp}", model_name=self.model.config.name_or_path, timestamp=datetime.now().strftime("%Y-%m-%d %H:%M:%S")) + trainer.train() From 21a9f21683587c3cf682574d460c512af4f06e3d Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Mon, 24 Jun 2024 14:08:00 +0800 Subject: [PATCH 48/55] bug fixing --- .../FinetuneDialogAgent.py | 10 +++++----- .../huggingface_model.py | 12 ++++++------ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/FinetuneDialogAgent.py b/examples/conversation_with_agent_with_finetuned_model/FinetuneDialogAgent.py index dd1ac2121..a8b919a1f 100644 --- a/examples/conversation_with_agent_with_finetuned_model/FinetuneDialogAgent.py +++ b/examples/conversation_with_agent_with_finetuned_model/FinetuneDialogAgent.py @@ -43,7 +43,7 @@ def __init__( Note: Refer to `class DialogAgent(AgentBase)` for more information. """ - super().__init__( + super().__init__( # pylint: disable=useless-parent-delegation name, sys_prompt, model_config_name, @@ -100,8 +100,8 @@ def load_tokenizer( Exception: If the model tokenizer process fails or if the model wrapper does not support dynamic loading. """ - if hasattr(self.model, "_load_tokenizer"): - self.model._load_tokenizer(pretrained_model_name_or_path, local_model_path) + if hasattr(self.model, "load_tokenizer"): + self.model.load_tokenizer(pretrained_model_name_or_path, local_model_path) else: logger.error("The model wrapper does not support dynamic loading.") @@ -126,7 +126,7 @@ def fine_tune( Exception: If fine-tuning fails or if the model wrapper does not support fine-tuning. """ - if hasattr(self.model, "_fine_tune"): - self.model._fine_tune(data_path, output_dir, fine_tune_config) + if hasattr(self.model, "fine_tune"): + self.model.fine_tune(data_path, output_dir, fine_tune_config) else: logger.error("The model wrapper does not support fine-tuning.") diff --git a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py index 4f892090e..2cac69aaa 100644 --- a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py @@ -101,13 +101,13 @@ def __init__( local_model_path=local_model_path, fine_tune_config=fine_tune_config, ) - self._load_tokenizer( + self.load_tokenizer( pretrained_model_name_or_path, local_model_path=local_model_path, ) if data_path is not None: - self.model = self._fine_tune_training( + self.model = self.fine_tune_training( self.model, self.tokenizer, data_path, @@ -324,7 +324,7 @@ def _load_model( raise - def _load_tokenizer( + def load_tokenizer( self, pretrained_model_name_or_path: Optional[str] = None, local_model_path: Optional[str] = None, @@ -384,7 +384,7 @@ def _load_tokenizer( raise - def _fine_tune( + def fine_tune( self, data_path: Optional[str] = None, output_dir: Optional[str] = None, @@ -408,7 +408,7 @@ def _fine_tune( or internal errors during the training process. """ try: - self.model = self._fine_tune_training( + self.model = self.fine_tune_training( self.model, self.tokenizer, data_path, @@ -449,7 +449,7 @@ def _formatting_prompts_func( output_texts.append(text) return output_texts - def _fine_tune_training( + def fine_tune_training( self, model: AutoModelForCausalLM, tokenizer: AutoTokenizer, From 97e633010b5bb66eea00e277ed835b85f0a63098 Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Mon, 24 Jun 2024 14:15:02 +0800 Subject: [PATCH 49/55] bug fixing --- .../FinetuneDialogAgent.py | 7 ++++--- .../huggingface_model.py | 4 ++-- tests/model_test.py | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/FinetuneDialogAgent.py b/examples/conversation_with_agent_with_finetuned_model/FinetuneDialogAgent.py index a8b919a1f..68ff08b2e 100644 --- a/examples/conversation_with_agent_with_finetuned_model/FinetuneDialogAgent.py +++ b/examples/conversation_with_agent_with_finetuned_model/FinetuneDialogAgent.py @@ -43,7 +43,8 @@ def __init__( Note: Refer to `class DialogAgent(AgentBase)` for more information. """ - super().__init__( # pylint: disable=useless-parent-delegation + # pylint: disable=useless-parent-delegation + super().__init__( name, sys_prompt, model_config_name, @@ -70,8 +71,8 @@ def load_model( Exception: If the model loading process fails or if the model wrapper does not support dynamic loading. """ - if hasattr(self.model, "_load_model"): - self.model._load_model( + if hasattr(self.model, "load_model"): + self.model.load_model( pretrained_model_name_or_path, local_model_path, fine_tune_config diff --git a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py index 2cac69aaa..49ea6d522 100644 --- a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py @@ -96,7 +96,7 @@ def __init__( self.device_map = device self.device = device - self._load_model( + self.load_model( pretrained_model_name_or_path, local_model_path=local_model_path, fine_tune_config=fine_tune_config, @@ -218,7 +218,7 @@ def format( return huggingface_msgs - def _load_model( + def load_model( self, pretrained_model_name_or_path: Optional[str] = None, local_model_path: Optional[str] = None, diff --git a/tests/model_test.py b/tests/model_test.py index f361b7f0d..e3d22f41d 100644 --- a/tests/model_test.py +++ b/tests/model_test.py @@ -55,7 +55,7 @@ def test_model_registry(self) -> None: ) @patch("loguru.logger.warning") - def test_load_model_configs(self, mock_logging: MagicMock) -> None: + def testload_model_configs(self, mock_logging: MagicMock) -> None: """Test to load model configs""" configs = [ { From b4a3849308e4f312a25e08a004e93cbc84814fb7 Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Mon, 24 Jun 2024 14:18:52 +0800 Subject: [PATCH 50/55] bug fixing --- .../FinetuneDialogAgent.py | 7 +++++-- .../huggingface_model.py | 9 ++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/FinetuneDialogAgent.py b/examples/conversation_with_agent_with_finetuned_model/FinetuneDialogAgent.py index 68ff08b2e..f3167fde4 100644 --- a/examples/conversation_with_agent_with_finetuned_model/FinetuneDialogAgent.py +++ b/examples/conversation_with_agent_with_finetuned_model/FinetuneDialogAgent.py @@ -75,7 +75,7 @@ def load_model( self.model.load_model( pretrained_model_name_or_path, local_model_path, - fine_tune_config + fine_tune_config, ) else: logger.error( @@ -102,7 +102,10 @@ def load_tokenizer( model wrapper does not support dynamic loading. """ if hasattr(self.model, "load_tokenizer"): - self.model.load_tokenizer(pretrained_model_name_or_path, local_model_path) + self.model.load_tokenizer( + pretrained_model_name_or_path, + local_model_path, + ) else: logger.error("The model wrapper does not support dynamic loading.") diff --git a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py index 49ea6d522..4dbab7a52 100644 --- a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py @@ -531,7 +531,7 @@ def fine_tune_training( if lora_config_default: self.lora_config = LoraConfig(**lora_config_default) - self.model = get_peft_model(self.model, self.lora_config) + self.model = get_peft_model(self.model, self.lora_config) if output_dir is not None: training_defaults["output_dir"] = output_dir @@ -558,8 +558,11 @@ def fine_tune_training( max_seq_length=2048, ) - logger.info("Starting fine-tuning of the model '{model_name}' at {timestamp}", model_name=self.model.config.name_or_path, timestamp=datetime.now().strftime("%Y-%m-%d %H:%M:%S")) - + logger.info( + "Starting fine-tuning of the model '{model_name}' at {timestamp}", + model_name=self.model.config.name_or_path, + timestamp=datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + ) trainer.train() From 799cac5574859795014eef0047f0ff63f8935d6e Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Wed, 17 Jul 2024 19:40:35 +0800 Subject: [PATCH 51/55] changed to using `chat_template` format for finetuning. Resolve the bug for continual finetuning. --- ...rsation_with_agent_with_finetuned_model.py | 62 +++-- .../huggingface_model.py | 223 ++++++++++++------ 2 files changed, 184 insertions(+), 101 deletions(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py index 929a4aee9..2a1c34d80 100644 --- a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py @@ -9,6 +9,7 @@ Features include model and tokenizer loading, and fine-tuning on the lima dataset with adjustable parameters. """ + # pylint: disable=unused-import from huggingface_model import HuggingFaceWrapper from FinetuneDialogAgent import FinetuneDialogAgent @@ -30,9 +31,8 @@ def main() -> None: # Or another generative model of your choice. # Needed from loading from Hugging Face. "pretrained_model_name_or_path": "google/gemma-7b", - # "local_model_path": , # Specify your local model path - # "local_tokenizer_path":, # Specify your local tokenizer path - "max_length": 128, + # "local_model_path": "", # Specify your local model path + "max_length": 256, # Device for inference. Fine-tuning occurs on gpus. "device": "cuda", # Specify a Hugging Face data path if you @@ -46,8 +46,13 @@ def main() -> None: # fine-tuning method. Defaults to None. # `lora_config` and `training_args` follow # the standard lora and sfttrainer fields. + # "lora_config" shouldn't be specified if + # loading a model saved as lora model + # '"continue_lora_finetuning": True' if + # loading a model saved as lora model "fine_tune_config": { - "lora_config": { + "continue_lora_finetuning": False, + "lora_config": { "r": 16, "lora_alpha": 32, "lora_dropout": 0.05, @@ -56,14 +61,16 @@ def main() -> None: }, "training_args": { "num_train_epochs": 5, + # "max_steps": 100, "logging_steps": 1, + # "learning_rate": 5e-07 }, - "bnb_config": { - "load_in_4bit": True, - "bnb_4bit_use_double_quant": True, - "bnb_4bit_quant_type": "nf4", - "bnb_4bit_compute_dtype": "bfloat16", - }, + # "bnb_config": { + # "load_in_8bit": True, + # "bnb_4bit_use_double_quant": True, + # "bnb_4bit_quant_type": "nf4", + # "bnb_4bit_compute_dtype": "bfloat16", + # }, }, }, ], @@ -78,8 +85,7 @@ def main() -> None: dialog_agent = FinetuneDialogAgent( name="Assistant", sys_prompt=( - "Explain in simple terms how the attention mechanism of " - "a transformer model works." + "You're a helpful assistant." ), # Use your custom model config name here model_config_name="my_custom_model", @@ -91,32 +97,36 @@ def main() -> None: # `lora_config` and `bnb_config` if used) dialog_agent.load_model( pretrained_model_name_or_path="google/gemma-7b", - local_model_path=None, + # local_model_path="", fine_tune_config={ - "lora_config": {"r": 24, "lora_alpha": 48}, - "bnb_config": { - "load_in_4bit": True, - "bnb_4bit_use_double_quant": True, - "bnb_4bit_quant_type": "nf4", - "bnb_4bit_compute_dtype": "bfloat16", - }, + # "bnb_config": { + # "load_in_4bit": True, + # "bnb_4bit_use_double_quant": True, + # "bnb_4bit_quant_type": "nf4", + # "bnb_4bit_compute_dtype": "bfloat16", + # }, }, ) # load model from Hugging Face dialog_agent.load_tokenizer( pretrained_model_name_or_path="google/gemma-7b", - local_model_path=None, + # local_model_path="", ) # load tokenizer # fine-tune loaded model with lima dataset # with customized hyperparameters - # (`fine_tune_config` argument is optional - # (specify only `lora_config` and - # `training_args` if used). Defaults to None.) + # `fine_tune_config` argument is optional + # specify only `lora_config` and + # `training_args` if used). Defaults to None. + # "lora_config" shouldn't be specified if + # loading a model saved as lora model + # '"continue_lora_finetuning": True' if + # loading a model saved as lora model dialog_agent.fine_tune( "GAIR/lima", fine_tune_config={ - "lora_config": {"r": 24, "lora_alpha": 48}, + "continue_lora_finetuning": True, + # "lora_config": {"r": 24, "lora_alpha": 48}, "training_args": {"max_steps": 300, "logging_steps": 3}, }, ) @@ -126,7 +136,7 @@ def main() -> None: # Start the conversation between user and assistant x = None while x is None or x.content != "exit": - x = sequentialpipeline([dialog_agent, user_agent], x) + x = sequentialpipeline([user_agent, dialog_agent], x) if __name__ == "__main__": diff --git a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py index 4dbab7a52..a844b22ec 100644 --- a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py @@ -6,22 +6,26 @@ Key features include handling model and tokenizer operations, adapting to specialized datasets, and robust error management. """ -from typing import Sequence, Any, Union, List, Optional, Dict +from typing import Sequence, Any, Union, List, Optional, Dict, Literal, Tuple import os from datetime import datetime import json +from dataclasses import dataclass import torch from transformers import ( AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig, + PreTrainedModel, + PreTrainedTokenizer, ) import transformers from peft import LoraConfig from peft import get_peft_model +from peft import PeftModel, PeftConfig from trl import SFTTrainer, DataCollatorForCompletionOnlyLM -from datasets import load_dataset +from datasets import load_dataset, Dataset from loguru import logger from dotenv import load_dotenv @@ -30,6 +34,7 @@ from agentscope.utils.tools import _convert_to_str + class HuggingFaceWrapper(ModelWrapperBase): """Wrapper for a Hugging Face transformer model. @@ -81,6 +86,7 @@ def __init__( self.model = None self.max_length = max_length # Set max_length as an attribute self.pretrained_model_name_or_path = pretrained_model_name_or_path + self.local_model_path = local_model_path script_path = os.path.abspath(__file__) script_dir = os.path.dirname(script_path) dotenv_path = os.path.join(script_dir, ".env") @@ -105,7 +111,7 @@ def __init__( pretrained_model_name_or_path, local_model_path=local_model_path, ) - + if data_path is not None: self.model = self.fine_tune_training( self.model, @@ -142,15 +148,24 @@ def __call__( Exception: If an error occurs during text generation. """ + if self.local_model_path is not None: + if self.tokenizer.chat_template is not None: + if self.model.get_input_embeddings().weight.size()[0] != len(self.tokenizer): + self.model, self.tokenizer = self.setup_chat_format(self.model, self.tokenizer) + loaded_embed_tokens_weights = torch.load(self.local_model_path+'/embed_tokens_weights.pt') + self.model.get_input_embeddings().weight.data.copy_(loaded_embed_tokens_weights) + del loaded_embed_tokens_weights + torch.cuda.empty_cache() + else: + if self.tokenizer.chat_template is None: + self.model, self.tokenizer = self.setup_chat_format(self.model, self.tokenizer) + else: + if self.tokenizer.chat_template is None: + self.model, self.tokenizer = self.setup_chat_format(self.model, self.tokenizer) + try: - # Tokenize the input text - concatenated_input = "\n ".join( - [f"{d.get('role')}: {d['content']}" for d in inputs], - ) - input_ids = self.tokenizer.encode( - f"{concatenated_input}\n assistent: ", - return_tensors="pt", - ) + + input_ids = self.tokenizer.apply_chat_template(inputs, tokenize=True, add_generation_prompt=True, return_tensors="pt") # Generate response using the model outputs = self.model.generate( input_ids.to(self.device), @@ -240,7 +255,7 @@ def load_model( incorrect model ID, or network issues while fetching the model. """ - + self.local_model_path = local_model_path bnb_config = None bnb_config_default = {} @@ -250,9 +265,6 @@ def load_model( if bnb_config_default: bnb_config = BitsAndBytesConfig(**bnb_config_default) - self.lora_config = None - lora_config_default = {} - try: if local_model_path is None: self.model = AutoModelForCausalLM.from_pretrained( @@ -267,15 +279,6 @@ def load_model( token=self.huggingface_token, ) - if fine_tune_config is not None: - if fine_tune_config.get("lora_config") is not None: - lora_config_default.update( - fine_tune_config["lora_config"], - ) - if lora_config_default: - self.lora_config = LoraConfig(**lora_config_default) - self.model = get_peft_model(self.model, self.lora_config) - info_msg = ( f"Successfully loaded new model " f"'{pretrained_model_name_or_path}' from " @@ -294,15 +297,6 @@ def load_model( local_files_only=True, ) - if fine_tune_config is not None: - if fine_tune_config.get("lora_config") is not None: - lora_config_default.update( - fine_tune_config["lora_config"], - ) - if lora_config_default: - lora_config = LoraConfig(**lora_config_default) - self.model = get_peft_model(self.model, lora_config) - info_msg = ( f"Successfully loaded new model " f"'{pretrained_model_name_or_path}' from " @@ -338,16 +332,13 @@ def load_tokenizer( (same as `local_model_path`). pretrained_model_name_or_path (str): An identifier for the model on Huggingface. - fine_tune_config (dict, optional): Configuration options for - fine-tuning the model, - including QLoRA and training - arguments. + Raises: Exception: If the tokenizer cannot be loaded from the given path or identifier. Possible reasons include file not found, incorrect model ID, or network issues while fetching the tokenizer. """ - + self.local_model_path = local_model_path try: if local_model_path is None: self.tokenizer = AutoTokenizer.from_pretrained( @@ -370,7 +361,7 @@ def load_tokenizer( f"'{pretrained_model_name_or_path}'" f" from '{local_model_path}'", ) - self.tokenizer.add_special_tokens({"pad_token": "[PAD]"}) + self.tokenizer.padding_side = 'right' except Exception as e: # Handle exceptions during model loading, @@ -383,6 +374,60 @@ def load_tokenizer( logger.error(error_message) raise + + def setup_chat_format( + self, + model: PreTrainedModel, + tokenizer: PreTrainedTokenizer, + resize_to_multiple_of: Optional[int] = None, + ) -> Tuple[PreTrainedModel, PreTrainedTokenizer]: + """ + Setup chat format by adding special tokens to the tokenizer, setting the correct format, and extending the embedding layer of the model based on the new special tokens. + + Args: + model (`~transformers.PreTrainedModel`): The model to be modified. + tokenizer (`~transformers.PreTrainedTokenizer`): The tokenizer to be modified. + format (`Optional[Literal["chatml"]]`): The format to be set. Defaults to "chatml". + resize_to_multiple_of (`Optional[int]`): Number to resize the embedding layer to. Defaults to None. + Returns: + model (`~transformers.PreTrainedModel`): The modified model. + tokenizer (`~transformers.PreTrainedTokenizer`): The modified tokenizer. + """ + + + # set special tokens and them + tokenizer.add_special_tokens({"additional_special_tokens": ['<|system|>', '<|user|>', '<|assistant|>']}) + # set chat format for tokenizer + tokenizer.chat_template = """{% for message in messages %} + {% if message['role'] == 'user' %} + {{ '<|user|>\n' + message['content'] + eos_token }} + {% elif message['role'] == 'system' %} + {{ '<|system|>\n' + message['content'] + eos_token }} + {% elif message['role'] == 'assistant' %} + {{ '<|assistant|>\n' + message['content'] + eos_token }} + {% endif %} + {% if loop.last and add_generation_prompt %} + {{ '<|assistant|>' }} + {% endif %} + {% endfor %}""" + + # resize embedding layer to a multiple of 64, https://x.com/karpathy/status/1621578354024677377 + model.resize_token_embeddings( + len(tokenizer), pad_to_multiple_of=resize_to_multiple_of if resize_to_multiple_of is not None else None + ) + # Update the model config to use the new eos & bos tokens + if getattr(model, "config", None) is not None: + model.config.pad_token_id = tokenizer.pad_token_id + model.config.bos_token_id = tokenizer.bos_token_id + model.config.eos_token_id = tokenizer.eos_token_id + # Update the generation config to use the new eos & bos token + if getattr(model, "generation_config", None) is not None: + model.generation_config.bos_token_id = tokenizer.bos_token_id + model.generation_config.eos_token_id = tokenizer.eos_token_id + model.generation_config.pad_token_id = tokenizer.pad_token_id + + return model, tokenizer + def fine_tune( self, @@ -498,21 +543,46 @@ def fine_tune_training( as part of the log/model fodler name. """ + if self.local_model_path is not None: + if tokenizer.chat_template is not None: + if model.get_input_embeddings().weight.size()[0] != len(tokenizer): + model, tokenizer = self.setup_chat_format(model, tokenizer) + loaded_embed_tokens_weights = torch.load(self.local_model_path+'/embed_tokens_weights.pt') + model.get_input_embeddings().weight.data.copy_(loaded_embed_tokens_weights) + del loaded_embed_tokens_weights + torch.cuda.empty_cache() + else: + if tokenizer.chat_template is None: + model, tokenizer = self.setup_chat_format(model, tokenizer) + else: + if tokenizer.chat_template is None: + model, tokenizer = self.setup_chat_format(model, tokenizer) + dataset = load_dataset(data_path, split="train", token=token) - # filter out input sequences that are longer than certain threshold + # # filter out input sequences that are longer than certain threshold dataset_reduced = dataset.filter( lambda x: len(x["conversations"][0] + x["conversations"][1]) - <= 1000, + <=3000, ) - formatted_dataset = dataset_reduced.train_test_split(test_size=0.1) + # Function to reformat a single row + def reformat_row(row): + return [ + {"role": "system", "content": "You're a helpful assistant."}, + {"role": "user", "content": row['conversations'][0]}, + {"role": "assistant", "content": row['conversations'][1]} + ] + + # Apply the reformatting function to each row in the dataset + formatted_dataset = [reformat_row(row) for row in dataset_reduced] + formatted_dataset = Dataset.from_dict({"messages": formatted_dataset}) training_defaults = { - "per_device_train_batch_size": 1, - "gradient_accumulation_steps": 4, + "per_device_train_batch_size": 4, + "gradient_accumulation_steps": 1, "gradient_checkpointing": False, - "num_train_epochs": 5, + "num_train_epochs": 3, "output_dir": "./", "optim": "paged_adamw_8bit", "logging_steps": 1, @@ -529,9 +599,17 @@ def fine_tune_training( fine_tune_config["lora_config"], ) - if lora_config_default: - self.lora_config = LoraConfig(**lora_config_default) - self.model = get_peft_model(self.model, self.lora_config) + if fine_tune_config.get("continue_lora_finetuning") is True: + self.lora_config = PeftConfig.from_pretrained(self.local_model_path) + model = PeftModel.from_pretrained(model, self.local_model_path) + # unfreeze lora parameters. Assuming 'lora' is in the layer name. + for name, param in model.named_parameters(): + if "lora" in name: + param.requires_grad = True + else: + if lora_config_default: + self.lora_config = LoraConfig(**lora_config_default) + model = get_peft_model(model, self.lora_config) if output_dir is not None: training_defaults["output_dir"] = output_dir @@ -543,51 +621,38 @@ def fine_tune_training( trainer_args = transformers.TrainingArguments(**training_defaults) + trainer = SFTTrainer( - model, - formatting_func=self._formatting_prompts_func, - data_collator=collator, - train_dataset=formatted_dataset["train"], - eval_dataset=formatted_dataset["test"], + model=model, + tokenizer=tokenizer, + train_dataset=formatted_dataset, + eval_dataset=formatted_dataset, **( {"peft_config": self.lora_config} if self.lora_config is not None else {} ), args=trainer_args, - max_seq_length=2048, + max_seq_length=4096, ) logger.info( "Starting fine-tuning of the model '{model_name}' at {timestamp}", - model_name=self.model.config.name_or_path, + model_name=model.config.name_or_path, timestamp=datetime.now().strftime("%Y-%m-%d %H:%M:%S"), ) - trainer.train() + try: + trainer.train() + except Exception as e: + import traceback + logger.error(f"Error during training: {e}") + traceback.print_exc() + raise now = datetime.now() time_string = now.strftime("%Y-%m-%d_%H-%M-%S") - if output_dir is not None: - os.makedirs(output_dir, exist_ok=True) - - # Specify the filename - log_name_temp = model.config.name_or_path.split("/")[-1] - log_name = f"{log_name_temp}_{time_string}_log_history.json" - log_path = os.path.join(os.path.dirname(__file__), log_name) - - # log training history - if output_dir is not None: - with open( - os.path.join(output_dir, log_name), - "w", - encoding="utf-8", - ) as f: - json.dump(trainer.state.log_history, f) - else: - with open(log_path, "w", encoding="utf-8") as f: - json.dump(trainer.state.log_history, f) # save model model_name = ( @@ -599,4 +664,12 @@ def fine_tune_training( model_path = os.path.join(os.path.dirname(__file__), model_name) trainer.save_model(model_path) + # save token embeddings because it is resized due to the addition of new special tokens + embed_tokens_weights = model.get_input_embeddings().weight.data.clone().detach() + torch.save(embed_tokens_weights, model_path+'/embed_tokens_weights.pt') + + with open(os.path.join(model_path, "log_history.json"), "w", encoding="utf-8") as f: + json.dump(trainer.state.log_history, f) + return model + From a13b219962154103b7f55603a86d0921fc896b11 Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Wed, 17 Jul 2024 20:27:07 +0800 Subject: [PATCH 52/55] reformatted according to pre-commit --- ...rsation_with_agent_with_finetuned_model.py | 20 +- .../huggingface_model.py | 233 ++++++++++++------ 2 files changed, 167 insertions(+), 86 deletions(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py index 2a1c34d80..7e297aee9 100644 --- a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py @@ -46,13 +46,13 @@ def main() -> None: # fine-tuning method. Defaults to None. # `lora_config` and `training_args` follow # the standard lora and sfttrainer fields. - # "lora_config" shouldn't be specified if + # "lora_config" shouldn't be specified if # loading a model saved as lora model # '"continue_lora_finetuning": True' if # loading a model saved as lora model "fine_tune_config": { - "continue_lora_finetuning": False, - "lora_config": { + "continue_lora_finetuning": False, + "lora_config": { "r": 16, "lora_alpha": 32, "lora_dropout": 0.05, @@ -67,9 +67,9 @@ def main() -> None: }, # "bnb_config": { # "load_in_8bit": True, - # "bnb_4bit_use_double_quant": True, - # "bnb_4bit_quant_type": "nf4", - # "bnb_4bit_compute_dtype": "bfloat16", + # "bnb_4bit_use_double_quant": True, + # "bnb_4bit_quant_type": "nf4", + # "bnb_4bit_compute_dtype": "bfloat16", # }, }, }, @@ -84,9 +84,7 @@ def main() -> None: # Init agents with the custom model dialog_agent = FinetuneDialogAgent( name="Assistant", - sys_prompt=( - "You're a helpful assistant." - ), + sys_prompt=("You're a helpful assistant."), # Use your custom model config name here model_config_name="my_custom_model", ) @@ -118,7 +116,7 @@ def main() -> None: # `fine_tune_config` argument is optional # specify only `lora_config` and # `training_args` if used). Defaults to None. - # "lora_config" shouldn't be specified if + # "lora_config" shouldn't be specified if # loading a model saved as lora model # '"continue_lora_finetuning": True' if # loading a model saved as lora model @@ -126,7 +124,7 @@ def main() -> None: "GAIR/lima", fine_tune_config={ "continue_lora_finetuning": True, - # "lora_config": {"r": 24, "lora_alpha": 48}, + # "lora_config": {"r": 24, "lora_alpha": 48}, "training_args": {"max_steps": 300, "logging_steps": 3}, }, ) diff --git a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py index a844b22ec..c3b0e0b01 100644 --- a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py @@ -6,11 +6,10 @@ Key features include handling model and tokenizer operations, adapting to specialized datasets, and robust error management. """ -from typing import Sequence, Any, Union, List, Optional, Dict, Literal, Tuple +from typing import Sequence, Any, Union, List, Optional, Dict, Tuple import os from datetime import datetime import json -from dataclasses import dataclass import torch from transformers import ( @@ -24,7 +23,7 @@ from peft import LoraConfig from peft import get_peft_model from peft import PeftModel, PeftConfig -from trl import SFTTrainer, DataCollatorForCompletionOnlyLM +from trl import SFTTrainer from datasets import load_dataset, Dataset from loguru import logger from dotenv import load_dotenv @@ -34,7 +33,6 @@ from agentscope.utils.tools import _convert_to_str - class HuggingFaceWrapper(ModelWrapperBase): """Wrapper for a Hugging Face transformer model. @@ -84,6 +82,7 @@ def __init__( """ super().__init__(config_name=config_name) self.model = None + self.tokenizer = None self.max_length = max_length # Set max_length as an attribute self.pretrained_model_name_or_path = pretrained_model_name_or_path self.local_model_path = local_model_path @@ -111,7 +110,7 @@ def __init__( pretrained_model_name_or_path, local_model_path=local_model_path, ) - + if data_path is not None: self.model = self.fine_tune_training( self.model, @@ -147,25 +146,21 @@ def __call__( Raises: Exception: If an error occurs during text generation. """ - - if self.local_model_path is not None: - if self.tokenizer.chat_template is not None: - if self.model.get_input_embeddings().weight.size()[0] != len(self.tokenizer): - self.model, self.tokenizer = self.setup_chat_format(self.model, self.tokenizer) - loaded_embed_tokens_weights = torch.load(self.local_model_path+'/embed_tokens_weights.pt') - self.model.get_input_embeddings().weight.data.copy_(loaded_embed_tokens_weights) - del loaded_embed_tokens_weights - torch.cuda.empty_cache() - else: - if self.tokenizer.chat_template is None: - self.model, self.tokenizer = self.setup_chat_format(self.model, self.tokenizer) + if self.tokenizer is not None: + self.model, self.tokenizer = self._setup_model_and_tokenizer( + self.model, + self.tokenizer, + ) else: - if self.tokenizer.chat_template is None: - self.model, self.tokenizer = self.setup_chat_format(self.model, self.tokenizer) + logger.error("Tokenizer is not initialized") try: - - input_ids = self.tokenizer.apply_chat_template(inputs, tokenize=True, add_generation_prompt=True, return_tensors="pt") + input_ids = self.tokenizer.apply_chat_template( + inputs, + tokenize=True, + add_generation_prompt=True, + return_tensors="pt", + ) # Generate response using the model outputs = self.model.generate( input_ids.to(self.device), @@ -361,7 +356,7 @@ def load_tokenizer( f"'{pretrained_model_name_or_path}'" f" from '{local_model_path}'", ) - self.tokenizer.padding_side = 'right' + self.tokenizer.padding_side = "right" except Exception as e: # Handle exceptions during model loading, @@ -374,7 +369,7 @@ def load_tokenizer( logger.error(error_message) raise - + def setup_chat_format( self, model: PreTrainedModel, @@ -382,21 +377,34 @@ def setup_chat_format( resize_to_multiple_of: Optional[int] = None, ) -> Tuple[PreTrainedModel, PreTrainedTokenizer]: """ - Setup chat format by adding special tokens to the tokenizer, setting the correct format, and extending the embedding layer of the model based on the new special tokens. + Setup chat format by adding special tokens to the tokenizer, + setting the correct format, and extending the embedding layer + of the model based on the new special tokens. Args: model (`~transformers.PreTrainedModel`): The model to be modified. - tokenizer (`~transformers.PreTrainedTokenizer`): The tokenizer to be modified. - format (`Optional[Literal["chatml"]]`): The format to be set. Defaults to "chatml". - resize_to_multiple_of (`Optional[int]`): Number to resize the embedding layer to. Defaults to None. + tokenizer (`~transformers.PreTrainedTokenizer`): The tokenizer + to be modified. + format (`Optional[Literal["chatml"]]`): The format to be set. + Defaults to "chatml". + resize_to_multiple_of (`Optional[int]`): Number to resize + the embedding layer to. + Defaults to None. Returns: - model (`~transformers.PreTrainedModel`): The modified model. - tokenizer (`~transformers.PreTrainedTokenizer`): The modified tokenizer. + model (`~transformers.PreTrainedModel`): modified model. + tokenizer (`~transformers.PreTrainedTokenizer`): modified tokenizer. """ - # set special tokens and them - tokenizer.add_special_tokens({"additional_special_tokens": ['<|system|>', '<|user|>', '<|assistant|>']}) + tokenizer.add_special_tokens( + { + "additional_special_tokens": [ + "<|system|>", + "<|user|>", + "<|assistant|>", + ], + }, + ) # set chat format for tokenizer tokenizer.chat_template = """{% for message in messages %} {% if message['role'] == 'user' %} @@ -411,9 +419,13 @@ def setup_chat_format( {% endif %} {% endfor %}""" - # resize embedding layer to a multiple of 64, https://x.com/karpathy/status/1621578354024677377 + # resize embedding layer to a multiple of 64, + # https://x.com/karpathy/status/1621578354024677377 model.resize_token_embeddings( - len(tokenizer), pad_to_multiple_of=resize_to_multiple_of if resize_to_multiple_of is not None else None + len(tokenizer), + pad_to_multiple_of=resize_to_multiple_of + if resize_to_multiple_of is not None + else None, ) # Update the model config to use the new eos & bos tokens if getattr(model, "config", None) is not None: @@ -428,6 +440,53 @@ def setup_chat_format( return model, tokenizer + def _setup_model_and_tokenizer( + self, + model: PreTrainedModel, + tokenizer: PreTrainedTokenizer, + ) -> Tuple[PreTrainedModel, PreTrainedTokenizer]: + """ + Set up the model and tokenizer based on the + local model path and chat template. + + This method checks if a local model path exists + and if the tokenizer has a chat template. + It then sets up the chat format if necessary + and loads pre-trained token embeddings. + + Args: + model (PreTrainedModel): The pre-trained model to set up. + tokenizer (PreTrainedTokenizer): The tokenizer + associated with the model. + + Returns: + Tuple[PreTrainedModel, PreTrainedTokenizer]: + The potentially modified model and tokenizer. + + Note: + This method modifies the model and tokenizer + in-place but also returns them for convenience. + """ + if self.local_model_path is not None: + if tokenizer.chat_template is not None: + if model.get_input_embeddings().weight.size()[0] != len( + tokenizer, + ): + model, tokenizer = self.setup_chat_format(model, tokenizer) + loaded_embed_tokens_weights = torch.load( + f"{self.local_model_path}/embed_tokens_weights.pt", + ) + model.get_input_embeddings().weight.data.copy_( + loaded_embed_tokens_weights, + ) + del loaded_embed_tokens_weights + torch.cuda.empty_cache() + elif tokenizer.chat_template is None: + model, tokenizer = self.setup_chat_format(model, tokenizer) + elif tokenizer.chat_template is None: + model, tokenizer = self.setup_chat_format(model, tokenizer) + + return model, tokenizer def fine_tune( self, @@ -471,6 +530,44 @@ def fine_tune( ) raise + # Function to reformat a single row + def _reformat_row(self, row: Dict[str, List[str]]) -> List[Dict[str, str]]: + """ + Reformat a single row of conversation data + into a list of message dictionaries. + + This method takes a row from the dataset, + which contains a list of conversation + turns, and reformats it into a list of dictionaries. + Each dictionary represents + a message in the conversation, with 'role' and 'content' keys. + + Args: + row (Dict[str, List[str]]): A dictionary containing a + 'conversations' key + with a list of two strings: + the user's input + and the assistant's response. + + Returns: + List[Dict[str, str]]: A list of three dictionaries + representing the system message, + user message, and assistant message. + + Example: + Input row: {"conversations": ["User input", "Assistant response"]} + Output: [ + {"role": "system", "content": "You're a helpful assistant."}, + {"role": "user", "content": "User input"}, + {"role": "assistant", "content": "Assistant response"} + ] + """ + return [ + {"role": "system", "content": "You're a helpful assistant."}, + {"role": "user", "content": row["conversations"][0]}, + {"role": "assistant", "content": row["conversations"][1]}, + ] + def _formatting_prompts_func( self, example: Dict[str, List[List[str]]], @@ -543,39 +640,20 @@ def fine_tune_training( as part of the log/model fodler name. """ - if self.local_model_path is not None: - if tokenizer.chat_template is not None: - if model.get_input_embeddings().weight.size()[0] != len(tokenizer): - model, tokenizer = self.setup_chat_format(model, tokenizer) - loaded_embed_tokens_weights = torch.load(self.local_model_path+'/embed_tokens_weights.pt') - model.get_input_embeddings().weight.data.copy_(loaded_embed_tokens_weights) - del loaded_embed_tokens_weights - torch.cuda.empty_cache() - else: - if tokenizer.chat_template is None: - model, tokenizer = self.setup_chat_format(model, tokenizer) - else: - if tokenizer.chat_template is None: - model, tokenizer = self.setup_chat_format(model, tokenizer) + model, tokenizer = self._setup_model_and_tokenizer(model, tokenizer) dataset = load_dataset(data_path, split="train", token=token) # # filter out input sequences that are longer than certain threshold dataset_reduced = dataset.filter( lambda x: len(x["conversations"][0] + x["conversations"][1]) - <=3000, + <= 3000, ) - # Function to reformat a single row - def reformat_row(row): - return [ - {"role": "system", "content": "You're a helpful assistant."}, - {"role": "user", "content": row['conversations'][0]}, - {"role": "assistant", "content": row['conversations'][1]} - ] - # Apply the reformatting function to each row in the dataset - formatted_dataset = [reformat_row(row) for row in dataset_reduced] + formatted_dataset = [ + self._reformat_row(row) for row in dataset_reduced + ] formatted_dataset = Dataset.from_dict({"messages": formatted_dataset}) training_defaults = { @@ -600,12 +678,14 @@ def reformat_row(row): ) if fine_tune_config.get("continue_lora_finetuning") is True: - self.lora_config = PeftConfig.from_pretrained(self.local_model_path) - model = PeftModel.from_pretrained(model, self.local_model_path) - # unfreeze lora parameters. Assuming 'lora' is in the layer name. - for name, param in model.named_parameters(): - if "lora" in name: - param.requires_grad = True + self.lora_config = PeftConfig.from_pretrained( + self.local_model_path, + ) + model = PeftModel.from_pretrained(model, self.local_model_path) + # unfreeze lora parameters. Assuming 'lora' is in the layer name. + for name, param in model.named_parameters(): + if "lora" in name: + param.requires_grad = True else: if lora_config_default: self.lora_config = LoraConfig(**lora_config_default) @@ -614,14 +694,8 @@ def reformat_row(row): if output_dir is not None: training_defaults["output_dir"] = output_dir - collator = DataCollatorForCompletionOnlyLM( - response_template=" ### Answer:", - tokenizer=tokenizer, - ) - trainer_args = transformers.TrainingArguments(**training_defaults) - trainer = SFTTrainer( model=model, tokenizer=tokenizer, @@ -646,6 +720,7 @@ def reformat_row(row): trainer.train() except Exception as e: import traceback + logger.error(f"Error during training: {e}") traceback.print_exc() raise @@ -653,7 +728,6 @@ def reformat_row(row): now = datetime.now() time_string = now.strftime("%Y-%m-%d_%H-%M-%S") - # save model model_name = ( f"sft_{model.config.name_or_path.split('/')[-1]}_{time_string}" @@ -664,12 +738,21 @@ def reformat_row(row): model_path = os.path.join(os.path.dirname(__file__), model_name) trainer.save_model(model_path) - # save token embeddings because it is resized due to the addition of new special tokens - embed_tokens_weights = model.get_input_embeddings().weight.data.clone().detach() - torch.save(embed_tokens_weights, model_path+'/embed_tokens_weights.pt') + # save token embeddings because it is resized + # due to the addition of new special tokens + embed_tokens_weights = ( + model.get_input_embeddings().weight.data.clone().detach() + ) + torch.save( + embed_tokens_weights, + model_path + "/embed_tokens_weights.pt", + ) - with open(os.path.join(model_path, "log_history.json"), "w", encoding="utf-8") as f: + with open( + os.path.join(model_path, "log_history.json"), + "w", + encoding="utf-8", + ) as f: json.dump(trainer.state.log_history, f) return model - From 06d3ae147bd791a72eb03e99858a3599e56d5aac Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Wed, 17 Jul 2024 22:25:04 +0800 Subject: [PATCH 53/55] when `continue_lora_finetuning ` is `True`, check if model is already `PeftModel` before convert it to `PeftModel` --- .../README.md | 25 +++++++++---------- .../huggingface_model.py | 22 ++++++++-------- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/README.md b/examples/conversation_with_agent_with_finetuned_model/README.md index 99e3fcaa7..727e7d765 100644 --- a/examples/conversation_with_agent_with_finetuned_model/README.md +++ b/examples/conversation_with_agent_with_finetuned_model/README.md @@ -27,30 +27,29 @@ When initializing an agent, the following parameters need specification: ``` System: -Explain in simple terms how the attention mechanism of a transformer model works. +You're a helpful assistant. + +User: + +Who are you? Assistant: -pessimal answer: Attn explications: Attn is a type of attention mechanism. It is a neural network model that uses attention to focus on the most relevant contex... -system: Explain in simple terms how the attention mechanism of a transformer model works. -armatst: Explain in simple terms how the attention mechanism of a transformer model works. -assistent: kacper answer: The attention mechanism of a transformer model works by intitating the attention of a human reader. It glances at the contex... -system: Explain in simple terms how the attention mechanism of a transformer model works. -assistent: Explain in simple terms how the +I am a woman who is passionate about life, my family, my friends, my work, and my community. I am a woman who is a wife, a mother, a daughter, a sister, a friend, a teacher, a coach, a mentor, a leader, a volunteer, a writer, a reader, a traveler, a gardener, a cook, a baker, a cra ``` ### After Fine-tuning (with the default configuration in `model_configs`): ``` System: -Explain in simple terms how the attention mechanism of a transformer model works. +You're a helpful assistant. + +User: + +Who are you? Assistant: -Sure, the attention mechanism of a transformer model is an important part of the model's ability to generate coherent text. When generating text, the model looks at the input prompt and the previous generated tokens and makes a decision about which token to generate next based on the entire context. -Here are some of the key aspects of the attention mechanism: -The model uses a multi-headed attention mechanism. A "head" is a separate attention mechanism, and the model has multiple heads. -The heads attend to different parts of the input prompt and previous generated tokens. -The heads output weights used in the final output layer to +I am a language model trained by Google to answer questions. ``` (This example is trained with the default setting, with training time 872 seconds and 9.914 GB gpu memory cost. Reduce training batch size can reduce the memory required. Note that the model is loaded in 4 bits (i.e., QLoRA)). diff --git a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py index c3b0e0b01..d8bf7791d 100644 --- a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py @@ -86,6 +86,7 @@ def __init__( self.max_length = max_length # Set max_length as an attribute self.pretrained_model_name_or_path = pretrained_model_name_or_path self.local_model_path = local_model_path + self.lora_config = None script_path = os.path.abspath(__file__) script_dir = os.path.dirname(script_path) dotenv_path = os.path.join(script_dir, ".env") @@ -660,13 +661,12 @@ def fine_tune_training( "per_device_train_batch_size": 4, "gradient_accumulation_steps": 1, "gradient_checkpointing": False, - "num_train_epochs": 3, + "num_train_epochs": 1, "output_dir": "./", "optim": "paged_adamw_8bit", "logging_steps": 1, } - self.lora_config = None lora_config_default = {} if fine_tune_config is not None: @@ -678,14 +678,16 @@ def fine_tune_training( ) if fine_tune_config.get("continue_lora_finetuning") is True: - self.lora_config = PeftConfig.from_pretrained( - self.local_model_path, - ) - model = PeftModel.from_pretrained(model, self.local_model_path) - # unfreeze lora parameters. Assuming 'lora' is in the layer name. - for name, param in model.named_parameters(): - if "lora" in name: - param.requires_grad = True + if not isinstance(model, PeftModel): + self.lora_config = PeftConfig.from_pretrained( + self.local_model_path, + ) + model = PeftModel.from_pretrained(model, self.local_model_path) + # unfreeze lora parameters. Assuming + # 'lora' is in the lora layer name. + for name, param in model.named_parameters(): + if "lora" in name: + param.requires_grad = True else: if lora_config_default: self.lora_config = LoraConfig(**lora_config_default) From 50f7ae7736d235947476ca6bc3d28becda242eff Mon Sep 17 00:00:00 2001 From: zyzhang1130 <36942574+zyzhang1130@users.noreply.github.com> Date: Wed, 17 Jul 2024 22:42:24 +0800 Subject: [PATCH 54/55] update README regarding ``continue_lora_finetuning` and `lora_config` parameters --- examples/conversation_with_agent_with_finetuned_model/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/README.md b/examples/conversation_with_agent_with_finetuned_model/README.md index 727e7d765..76f741ac3 100644 --- a/examples/conversation_with_agent_with_finetuned_model/README.md +++ b/examples/conversation_with_agent_with_finetuned_model/README.md @@ -19,7 +19,7 @@ When initializing an agent, the following parameters need specification: - `local_model_path` (str): Local path to the model (defaults to loading from Hugging Face if not provided). - `data_path` (str): Path to training data (fine-tuning is skipped if not provided). - `device` (str): The device (e.g., 'cuda', 'cpu') for model operation, defaulting to 'cuda' if available. -- `fine_tune_config` (dict, Optional): A configuration dictionary for fine-tuning the model. It allows specifying hyperparameters and other training options that will be passed to the fine-tuning method. If not provided, default settings will be used. This allows for customization of the fine-tuning process to optimize model performance based on specific requirements. +- `fine_tune_config` (dict, Optional): A configuration dictionary for fine-tuning the model. It allows specifying hyperparameters and other training options that will be passed to the fine-tuning method. If not provided, default settings will be used. This allows for customization of the fine-tuning process to optimize model performance based on specific requirements. Note that if `continue_lora_finetuning` is set to `True`, `lora_config` should not be specified since the previously saved peft model's config will be used instead. If `continue_lora_finetuning` is set to `False`, `lora_config` should be specified. - `huggingface_token` (from .env file): Token required for models needing authentication from Hugging Face. ## Example Ouputs From 99cecb6a585820bade464b09ab8cd2037674e743 Mon Sep 17 00:00:00 2001 From: Ze Yu Zhang Date: Fri, 23 Aug 2024 19:43:17 +0800 Subject: [PATCH 55/55] removed # pylint: disable=useless-parent-delegation in FinetuneDialogAgent --- .../FinetuneDialogAgent.py | 2 +- ...rsation_with_agent_with_finetuned_model.py | 6 ++++- .../huggingface_model.py | 23 ++++++++++--------- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/examples/conversation_with_agent_with_finetuned_model/FinetuneDialogAgent.py b/examples/conversation_with_agent_with_finetuned_model/FinetuneDialogAgent.py index f3167fde4..e03fa2423 100644 --- a/examples/conversation_with_agent_with_finetuned_model/FinetuneDialogAgent.py +++ b/examples/conversation_with_agent_with_finetuned_model/FinetuneDialogAgent.py @@ -43,7 +43,6 @@ def __init__( Note: Refer to `class DialogAgent(AgentBase)` for more information. """ - # pylint: disable=useless-parent-delegation super().__init__( name, sys_prompt, @@ -51,6 +50,7 @@ def __init__( use_memory, memory_config, ) + self.finetune = True def load_model( self, diff --git a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py index 7e297aee9..292694905 100644 --- a/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/conversation_with_agent_with_finetuned_model.py @@ -9,7 +9,10 @@ Features include model and tokenizer loading, and fine-tuning on the lima dataset with adjustable parameters. """ - +# This import is necessary for AgentScope to properly use +# HuggingFaceWrapper even though it's not explicitly used in this file. +# To remove the pylint disable without causing issues +# HuggingFaceWrapper needs to be put under src/agentscope/agents. # pylint: disable=unused-import from huggingface_model import HuggingFaceWrapper from FinetuneDialogAgent import FinetuneDialogAgent @@ -52,6 +55,7 @@ def main() -> None: # loading a model saved as lora model "fine_tune_config": { "continue_lora_finetuning": False, + "max_seq_length": 4096, "lora_config": { "r": 16, "lora_alpha": 32, diff --git a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py index d8bf7791d..9e0731e25 100644 --- a/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py +++ b/examples/conversation_with_agent_with_finetuned_model/huggingface_model.py @@ -80,10 +80,13 @@ def __init__( fine-tuning the model. **kwargs: Additional keyword arguments. """ - super().__init__(config_name=config_name) + super().__init__( + config_name=config_name, + model_name=pretrained_model_name_or_path, + ) self.model = None self.tokenizer = None - self.max_length = max_length # Set max_length as an attribute + self.max_length = max_length self.pretrained_model_name_or_path = pretrained_model_name_or_path self.local_model_path = local_model_path self.lora_config = None @@ -358,6 +361,8 @@ def load_tokenizer( f" from '{local_model_path}'", ) self.tokenizer.padding_side = "right" + if self.tokenizer.pad_token is None: + self.tokenizer.pad_token = self.tokenizer.eos_token except Exception as e: # Handle exceptions during model loading, @@ -666,10 +671,13 @@ def fine_tune_training( "optim": "paged_adamw_8bit", "logging_steps": 1, } + max_seq_length_default = 4096 lora_config_default = {} if fine_tune_config is not None: + if fine_tune_config.get("max_seq_length") is not None: + max_seq_length_default = fine_tune_config["max_seq_length"] if fine_tune_config.get("training_args") is not None: training_defaults.update(fine_tune_config["training_args"]) if fine_tune_config.get("lora_config") is not None: @@ -709,7 +717,7 @@ def fine_tune_training( else {} ), args=trainer_args, - max_seq_length=4096, + max_seq_length=max_seq_length_default, ) logger.info( @@ -718,14 +726,7 @@ def fine_tune_training( timestamp=datetime.now().strftime("%Y-%m-%d %H:%M:%S"), ) - try: - trainer.train() - except Exception as e: - import traceback - - logger.error(f"Error during training: {e}") - traceback.print_exc() - raise + trainer.train() now = datetime.now() time_string = now.strftime("%Y-%m-%d_%H-%M-%S")