code: def check_expr_validity_for_cache(expr: FunctionExpression):
      valid = expr.name in CACHEABLE_FUNCTIONS and not expr.has_cache()
      if len(expr.children) == 1:
          # Normal function that only takes one parameter.
          valid &= isinstance(expr.children[0], TupleValueExpression)
      elif len(expr.children) == 2:
          # LLM-based function that takes two parameters.
          valid &= isinstance(
              expr.children[0], ConstantValueExpression
          ) and isinstance(expr.children[1], TupleValueExpression)
      return valid
  
imports: import typing
  from typing import List, Tuple
  from evadb.catalog.catalog_utils import get_table_primary_columns
  from evadb.catalog.models.column_catalog import ColumnCatalogEntry
  from evadb.catalog.models.function_io_catalog import FunctionIOCatalogEntry
  from evadb.catalog.models.function_metadata_catalog import FunctionMetadataCatalogEntry
  from evadb.constants import CACHEABLE_FUNCTIONS, DEFAULT_FUNCTION_EXPRESSION_COST
  from evadb.expression.abstract_expression import AbstractExpression, ExpressionType
  from evadb.expression.constant_value_expression import ConstantValueExpression
  from evadb.expression.expression_utils import conjunction_list_to_expression_tree, contains_single_column, get_columns_in_predicate, is_simple_predicate, to_conjunction_list
  from evadb.expression.function_expression import FunctionExpression, FunctionExpressionCache
  from evadb.expression.tuple_value_expression import TupleValueExpression
  from evadb.parser.alias import Alias
  from evadb.parser.create_statement import ColumnDefinition
  from evadb.utils.kv_cache import DiskKVCache
label_desc: Use image node_id 12 for calling a global function with example usage: check_expr_validity_for_cache(expr) and returns: valid