{"record":{"id":"381cde5dea9aa60e","repo":"pathwaycom/pathway","slug":"metadata-column-name-r-has-unsupported-type-dty","errorCode":null,"errorMessage":"metadata column {name!r} has unsupported type {dtype}; Pinecone metadata supports int, float, bool, str, and list[str].","messagePattern":"metadata column (.+?) has unsupported type (.+?); Pinecone metadata supports int, float, bool, str, and list\\[str\\]\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/pathway/io/pinecone/__init__.py","lineNumber":121,"sourceCode":"\n    Pinecone metadata supports ``int``, ``float``, ``bool``, ``str``, and\n    ``list[str]``; ``None`` is allowed (it is dropped). Mirrors the runtime\n    ``PineconeError::UnsupportedMetadataType`` guard.\n    \"\"\"\n    inner = dtype.wrapped if isinstance(dtype, dt.Optional) else dtype\n    if _is_statically_unknown(inner):\n        return\n    if inner in (dt.INT, dt.FLOAT, dt.BOOL, dt.STR):\n        return\n    if isinstance(inner, dt.List) and (\n        inner.wrapped == dt.STR or _is_statically_unknown(inner.wrapped)\n    ):\n        return\n    if isinstance(inner, dt.Tuple) and all(\n        arg == dt.STR or _is_statically_unknown(arg) for arg in inner.args\n    ):\n        return\n    raise ValueError(\n        f\"metadata column {name!r} has unsupported type {dtype}; Pinecone \"\n        \"metadata supports int, float, bool, str, and list[str].\"\n    )\n\n\n@check_arg_types\n@trace_user_frame\ndef write(\n    table: Table,\n    index_name: str,\n    *,\n    primary_key: ColumnReference | None = None,\n    vector: ColumnReference,\n    api_key: str | None = None,\n    host: str | None = None,\n    namespace: str = \"\",\n    metadata_columns: Iterable[ColumnReference] | None = None,\n    batch_size: int = 100,","sourceCodeStart":103,"sourceCodeEnd":139,"githubUrl":"https://github.com/pathwaycom/pathway/blob/fa2f74a4649b7c5908690cf60137263d8d80de5f/python/pathway/io/pinecone/__init__.py#L103-L139","documentation":"Pinecone metadata only supports int, float, bool, str, list[str], and tuples of str (None is dropped). pw.io.pinecone.write checks each metadata column's dtype at call time and raises this ValueError for unsupported types (dicts, nested lists, datetimes, etc.), mirroring the runtime PineconeError::UnsupportedMetadataType guard. The Optional wrapper is unwrapped first, and statically-unknown inner types are allowed through.","triggerScenarios":"Including a metadata column with dtype dict[str, str], list[int], datetime, bytes, or nested structures in the metadata_columns argument of pw.io.pinecone.write.","commonSituations":"Passing raw JSON/payload columns as metadata; dict-typed columns from JSON ingestion; timestamp columns expecting Pinecone to accept them (it only accepts str — serialize first).","solutions":["Serialize unsupported columns before the sink: dates via .dt.strftime()/to_string, dicts/objects via json.dumps into a str column.","Cast list[int] metadata to list[str] if the numbers are labels, or move it out of metadata_columns.","Only list columns whose dtype is one of int, float, bool, str, or list[str] in metadata_columns."],"exampleFix":"# before\npw.io.pinecone.write(docs, \"idx\", primary_key=docs.id, vector=docs.vec,\n                    metadata_columns=[docs.payload, docs.created_at])\n# payload: dict, created_at: datetime -> rejected\n\n# after\ndocs = docs.with_columns(\n    payload_str=docs.payload.apply(lambda d: json.dumps(d), return_type=str),\n    created_at_str=docs.created_at.dt.strftime(\"%Y-%m-%dT%H:%M:%S\"),\n)\npw.io.pinecone.write(docs, \"idx\", primary_key=docs.id, vector=docs.vec,\n                    metadata_columns=[docs.payload_str, docs.created_at_str])","handlingStrategy":"type-guard","validationCode":"import pathway as pw\n\nALLOWED = (pw.dt.INT, pw.dt.FLOAT, pw.dt.BOOL, pw.dt.STR)\n\ndef unsupported_metadata_columns(schema) -> list[str]:\n    bad = []\n    for name in schema.column_names():\n        d = schema[name].dtype\n        if isinstance(d, pw.dt.Optional):\n            d = d.wrapped\n        ok = d in ALLOWED or (isinstance(d, pw.dt.List) and d.wrapped == pw.dt.STR)\n        if not ok:\n            bad.append(name)\n    return bad\n\nassert not unsupported_metadata_columns(docs.schema), \"serialize these columns before metadata_columns\"","typeGuard":"import pathway as pw\n\ndef is_pinecone_metadata_dtype(dtype: pw.dt.DType) -> bool:\n    if isinstance(dtype, pw.dt.Optional):\n        dtype = dtype.wrapped\n    if dtype in (pw.dt.INT, pw.dt.FLOAT, pw.dt.BOOL, pw.dt.STR):\n        return True\n    return isinstance(dtype, pw.dt.List) and dtype.wrapped == pw.dt.STR","tryCatchPattern":"try:\n    pw.io.pinecone.write(docs, \"idx\", primary_key=docs.id, vector=docs.vec,\n                        metadata_columns=[docs.payload, docs.ts])\nexcept ValueError as e:\n    if \"metadata\" in str(e) and \"unsupported type\" in str(e):\n        docs = docs.with_columns(\n            payload=docs.payload.apply(json.dumps, return_type=str),\n            ts=docs.ts.dt.strftime(\"%Y-%m-%dT%H:%M:%S\"),\n        )\n        pw.io.pinecone.write(docs, \"idx\", primary_key=docs.id, vector=docs.vec,\n                            metadata_columns=[docs.payload, docs.ts])\n    else:\n        raise","preventionTips":["Keep metadata flat: only scalars (int/float/bool/str) and list[str] survive Pinecone.","Serialize dates to ISO strings and dicts/objects to JSON strings before the sink.","Explicitly list metadata columns instead of passing everything; filter at the sink boundary."],"tags":["pinecone","metadata","dtype","vector-db","pathway"],"backgroundTag":null,"analyzedSha":"fa2f74a4649b7c5908690cf60137263d8d80de5f","analyzedAt":"2026-08-15T01:48:17.006Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}