class_docstr: WriterHandler is a MindsDB integration with Writer API LLMs that allows users to run question answering
  on their data by providing a question.
  
  The User is able to provide data that provides context for the questions, see create() method for more details.
class_docstr_tok: ["WriterHandler","is","a","MindsDB","integration","with","Writer","API","LLMs","that","allows","users","to","run","question","answering","on","their","data","by","providing","a","question",".","The","User","is","able","to","provide","data","that","provides","context","for","the","questions",",","see","create","(",")","method","for","more","details","."]
docstr: Dispatch is running embeddings and storing in a VectorDB, unless user already has embeddings persisted
docstr_tok: ["Dispatch","is","running","embeddings","and","storing","in","a","VectorDB",",","unless","user","already","has","embeddings","persisted"]
code: def create(
      self,
      target: str,
      df: pd.DataFrame = pd.DataFrame(),
      args: Optional[Dict] = None,
  ):
      """
      Dispatch is running embeddings and storing in a VectorDB, unless user already has embeddings persisted
      """
  
      input_args = extract_llm_params(args["using"])
  
      if "evaluate_dataset" not in input_args and df is not None:
          # if user doesn't provide an evaluation dataset, use the input df from create query
          input_args["evaluate_dataset"] = df.to_dict(orient="records")
  
      args = WriterHandlerParameters(**input_args)
  
      # create folder for vector store to persist embeddings
      args.vector_store_storage_path = self.engine_storage.folder_get(
          args.vector_store_folder_name
      )
  
      if df is not None and args.run_embeddings:
          if "context_columns" not in args:
              # if no context columns provided, use all columns in df
              logger.info(
                  "No context columns provided, using all columns in df"
              )
              args.context_columns = df.columns.tolist()
  
          if "embeddings_model_name" not in args:
              logger.info(
                  f"No embeddings model provided in query, using default model: {DEFAULT_EMBEDDINGS_MODEL}"
              )
  
          ingestor = WriterIngestor(args=args, df=df)
          ingestor.embeddings_to_vectordb()
  
      else:
          logger.info(
              "Skipping embeddings and ingestion into Chroma VectorDB"
          )
  
      export_args = args.dict(exclude={"llm_params"})
      # 'callbacks' aren't json serializable, we do this to avoid errors
      export_args["llm_params"] = args.llm_params.dict(
          exclude={"callbacks"}
      )
  
      # for mindsdb cloud, store data in shared file system
      # for cloud version of mindsdb to make it be usable by all mindsdb nodes
      self.engine_storage.folder_sync(args.vector_store_folder_name)
  
      self.model_storage.json_set("args", export_args)
  
file_path: mindsdb/mindsdb/integrations/handlers/writer_handler/writer_handler.py
imports: from typing import Dict, Optional
  import pandas
  from mindsdb.integrations.handlers.writer_handler.evaluate import WriterEvaluator
  from mindsdb.integrations.handlers.writer_handler.ingest import WriterIngestor
  from mindsdb.integrations.handlers.writer_handler.rag import QuestionAnswerer
  from mindsdb.integrations.handlers.writer_handler.settings import DEFAULT_EMBEDDINGS_MODEL, EVAL_COLUMN_NAMES, WriterHandlerParameters, WriterLLMParameters
  from mindsdb.integrations.libs.base import BaseMLEngine
  from mindsdb.integrations.utilities.datasets.dataset import load_dataset, validate_dataframe
  from mindsdb.utilities import log
label_desc: Use image node_id 3 for calling the WriterHandler obj's underlying member method code with example usage: obj.create(target, df, args) without return types