{"record":{"id":"482f1254fe51beeb","repo":"tensorflow/models","slug":"must-pass-do-lower-case-if-passing-vocab-file","errorCode":null,"errorMessage":"Must pass do_lower_case if passing vocab_file.","messagePattern":"Must pass do_lower_case if passing vocab_file\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"official/nlp/tools/export_tfhub_lib.py","lineNumber":257,"sourceCode":"        encoder=encoder)\n  checkpoint.restore(model_checkpoint_path).assert_existing_objects_matched()\n\n  if copy_pooler_dense_to_encoder:\n    logging.info(\"Copy pooler's dense layer to the encoder.\")\n    pooler_checkpoint = tf.train.Checkpoint(\n        **{\"next_sentence.pooler_dense\": encoder.pooler_layer})\n    pooler_checkpoint.restore(\n        model_checkpoint_path).assert_existing_objects_matched()\n\n  # Before SavedModels for preprocessing appeared in Oct 2020, the encoders\n  # provided this information to let users do preprocessing themselves.\n  # We keep doing that for now. It helps users to upgrade incrementally.\n  # Moreover, it offers an escape hatch for advanced users who want the\n  # full vocab, not the high-level operations from the preprocessing model.\n  if vocab_file:\n    core_model.vocab_file = tf.saved_model.Asset(vocab_file)\n    if do_lower_case is None:\n      raise ValueError(\"Must pass do_lower_case if passing vocab_file.\")\n    core_model.do_lower_case = tf.Variable(do_lower_case, trainable=False)\n  elif sp_model_file:\n    # This was used by ALBERT, with implied values of do_lower_case=True\n    # and strip_diacritics=True.\n    core_model.sp_model_file = tf.saved_model.Asset(sp_model_file)\n  else:\n    raise ValueError(\"Must set vocab_file or sp_model_file\")\n  core_model.save(export_path, include_optimizer=False, save_format=\"tf\")\n\n\nclass BertPackInputsSavedModelWrapper(tf.train.Checkpoint):\n  \"\"\"Wraps a BertPackInputs layer for export to SavedModel.\n\n  The wrapper object is suitable for use with `tf.saved_model.save()` and\n  `.load()`. The wrapper object is callable with inputs and outputs like the\n  BertPackInputs layer, but differs from saving an unwrapped Keras object:\n\n    - The inputs can be a list of 1 or 2 RaggedTensors of dtype int32 and","sourceCodeStart":239,"sourceCodeEnd":275,"githubUrl":"https://github.com/tensorflow/models/blob/e006f5f0d534913e49c1f1dae87364039fa607e2/official/nlp/tools/export_tfhub_lib.py#L239-L275","documentation":"Error \"Must pass do_lower_case if passing vocab_file.\" thrown in tensorflow/models.","triggerScenarios":"Thrown at official/nlp/tools/export_tfhub_lib.py:257 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"e006f5f0d534913e49c1f1dae87364039fa607e2","analyzedAt":"2026-08-24T14:09:15.576Z","schemaVersion":2},"datasetVersion":"2026-08-24T17:17:21.512Z"}