class_docstr: A CritiqueClient that creates tasks for workers on Surge AI.
  
  Surge AI concepts:
  
  - A **project** contains **instructions** and **questions**, which are templates that can contain
    placeholders.
  - A **task** is created in a project and contains **fields** that are interpolated into the
    placeholders in the project's instructions and questions templates to instantiate the actual instructions
    and questions in the task.
  - A **task response** is a response to a task by a single worker and contains answers to all the questions
    in the task.
  
  Mapping of HELM concepts to Surge AI concepts:
  
  - A `CritiqueTaskTemplate` maps to a **project**.
  - A `CritiqueQuestionTemplate` maps to a **question** template in a project.
  - A `CritiqueRequest` maps to a **task**
      - `CritiqueRequest.template` indicates which **project** the task should be created in.
      - `CritiqueRequest.fields` provides the fields that are interpolated into the placeholders in the
        projects' instructions and questions templates.
  - A `CritiqueResponse` maps to a **task response**.
  - A `CritiqueRequestResult` maps to a list of **task responses** across multiple workers for a task.
code: def __init__(self, api_key: str, cache_config: CacheConfig):
      surge.api_key = api_key
      self._cache = Cache(cache_config)
  
imports: from abc import ABC, abstractmethod
  import random
  import threading
  from typing import Dict, List, Union
  from cattrs import unstructure
  import surge
  from surge import questions
  from helm.common.hierarchical_logger import hlog
  from helm.common.cache import Cache, CacheConfig
  from helm.common.critique_request import CritiqueQuestionTemplate, CritiqueRequest, CritiqueRequestResult, CritiqueTaskTemplate, CritiqueResponse, QuestionType
label_desc: Use image node_id 1 to create a new SurgeAICritiqueClient object from inherited base classes: CritiqueClient with example: obj = SurgeAICritiqueClient(api_key, cache_config)