{"record":{"id":"4cb100e0045db9e9","repo":"microsoft/autogen","slug":"search-fields-must-contain-at-least-one-field-name","errorCode":null,"errorMessage":"search_fields must contain at least one field name for hybrid search","messagePattern":"search_fields must contain at least one field name for hybrid search","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/packages/autogen-ext/src/autogen_ext/tools/azure/_ai_search.py","lineNumber":646,"sourceCode":"        try:\n            _ = AzureAISearchConfig(**config_dict)\n        except Exception as e:\n            raise ValueError(f\"Invalid configuration: {str(e)}\") from e\n\n        if search_type == \"vector\":\n            vector_fields = config_dict.get(\"vector_fields\")\n            if not vector_fields or len(vector_fields) == 0:\n                raise ValueError(\"vector_fields must contain at least one field name for vector search\")\n\n        elif search_type == \"hybrid\":\n            vector_fields = config_dict.get(\"vector_fields\")\n            search_fields = config_dict.get(\"search_fields\")\n\n            if not vector_fields or len(vector_fields) == 0:\n                raise ValueError(\"vector_fields must contain at least one field name for hybrid search\")\n\n            if not search_fields or len(search_fields) == 0:\n                raise ValueError(\"search_fields must contain at least one field name for hybrid search\")\n\n    @classmethod\n    @abstractmethod\n    def _from_config(cls, config: AzureAISearchConfig) -> \"BaseAzureAISearchTool\":\n        \"\"\"Create a tool instance from a configuration object.\n\n        This is an abstract method that must be implemented by subclasses.\n        \"\"\"\n        if cls is BaseAzureAISearchTool:\n            raise NotImplementedError(\n                \"BaseAzureAISearchTool is an abstract base class and cannot be instantiated directly. \"\n                \"Use a concrete implementation like AzureAISearchTool.\"\n            )\n        raise NotImplementedError(\"Subclasses must implement _from_config\")\n\n    @abstractmethod\n    async def _get_embedding(self, query: str) -> List[float]:\n        \"\"\"Generate embedding vector for the query text.\"\"\"","sourceCodeStart":628,"sourceCodeEnd":664,"githubUrl":"https://github.com/microsoft/autogen/blob/027ecf0a379bcc1d09956d46d12d44a3ad9cee14/python/packages/autogen-ext/src/autogen_ext/tools/azure/_ai_search.py#L628-L664","documentation":"The hybrid factory additionally requires search_fields — the text fields the full-text half of the hybrid query runs against. An empty or missing list fails validation before any config object is built.","triggerScenarios":"Calling the hybrid search factory with search_fields omitted, None, or [] while only providing vector_fields.","commonSituations":"Treating hybrid as 'vector plus semantic ranking' and assuming text fields are implicit; index uses different text field names (body vs content vs text) than the example code.","solutions":["Pass search_fields=['content'] (or the index's searchable text fields).","Confirm the named fields exist and are marked searchable in the index definition.","Keep vector_fields and search_fields together whenever configuring hybrid search."],"exampleFix":"# before\nsearch_fields=[]  # or omitted\n# after\nsearch_fields=['content', 'title']","handlingStrategy":"validation","validationCode":"def search_fields_ready(search_fields) -> bool:\n    return isinstance(search_fields, (list, tuple)) and len(search_fields) > 0","typeGuard":"def has_search_fields(search_fields) -> bool:\n    return isinstance(search_fields, (list, tuple)) and len(search_fields) > 0","tryCatchPattern":null,"preventionTips":["Always set search_fields when configuring hybrid search; do not assume text fields are implicit.","Cross-check field names with the index's searchable attributes.","Cover this rule in config validation tests."],"tags":["azure","azure-ai-search","hybrid-search","configuration","validation"],"backgroundTag":null,"analyzedSha":"027ecf0a379bcc1d09956d46d12d44a3ad9cee14","analyzedAt":"2026-08-15T03:38:00.719Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}