class_docstr: Blueprint for model chat without images.
  
  This blueprint subclasses BaseModelChatBlueprint to provide logic for keeping track
  of how many more conversations are needed per model; this logic is not shared with
  other model-chat blueprints.
class_docstr_tok: ["Blueprint","for","model","chat","without","images",".","This","blueprint","subclasses","BaseModelChatBlueprint","to","provide","logic","for","keeping","track","of","how","many","more","conversations","are","needed","per","model",";","this","logic","is","not","shared","with","other","model-chat","blueprints","."]
docstr: Ensure that arguments are properly configured to launch this task.
docstr_tok: ["Ensure","that","arguments","are","properly","configured","to","launch","this","task","."]
code: def assert_task_args(
      cls, args: "DictConfig", shared_state: "SharedTaskState"
  ) -> None:
      """
      Ensure that arguments are properly configured to launch this task.
      """
  
      if (
          not isinstance(shared_state.conversations_needed, dict)
          or len(shared_state.conversations_needed) == 0
      ):
          assert (
              args.blueprint.get("conversations_needed_string", None)
              is not None
          ), (
              "Must provide a string of needed conversations per model if not providing "
              "a conversations needed dict"
          )
          try:
              conversations_needed = {}
              parts = args.blueprint.conversations_needed_string.split(
                  ","
              )
              for part in parts:
                  model_name, num_string = part.split(":")
                  conversations_needed[model_name] = int(num_string)
          except Exception as e:
              raise Exception(
                  "Could not create conversations needed dict from given string. "
                  f"Error was {e}.\n"
                  "Be sure the format is like modelA:50,modelB:20"
              )
      else:
          conversations_needed = shared_state.conversations_needed
      args.blueprint.num_conversations = sum(
          conversations_needed.values()
      )
      super().assert_task_args(args=args, shared_state=shared_state)
  
      if args.blueprint.get(
          "annotations_config_path", ""
      ) != "" and args.blueprint.get("onboarding_qualification", None):
          # We are going to do annotations, so check for the presence of an onboarding
          # data file that will be used to onboard users into knowing how to do the
          # annotations properly
          assert (
              args.blueprint.get("onboard_task_data_path", None)
              is not None
          ), "Must provide an onboarding data file"
          full_path = os.path.expanduser(
              args.blueprint.onboard_task_data_path
          )
          assert os.path.exists(
              full_path
          ), f"Target onboarding data path {full_path} doesn't exist"
  
imports: import json
  import os
  import pickle
  import random
  from abc import ABC, abstractmethod
  from dataclasses import dataclass, field
  from threading import Semaphore, Condition
  from typing import Any, Dict, List, Optional, TYPE_CHECKING
  import numpy
  import torch
  import yaml
  from mephisto.operations.registry import register_mephisto_abstraction
  from mephisto.abstractions.blueprint import SharedTaskState
  from mephisto.abstractions.blueprints.parlai_chat.parlai_chat_blueprint import ParlAIChatBlueprint, SharedParlAITaskState, ParlAIChatBlueprintArgs
  from omegaconf import DictConfig, MISSING
  from parlai.crowdsourcing.tasks.model_chat.bot_agent import TurkLikeAgent
  from parlai.crowdsourcing.tasks.model_chat.utils import ImageStack, get_context_generator
  from parlai.tasks.blended_skill_talk.agents import ContextGenerator
label_desc: Use image node_id 1 for calling the ModelChatBlueprint obj's underlying member method code with example usage: obj.assert_task_args(cls, args, shared_state) without return types