{"record":{"id":"ace1bb83387bf6a7","repo":"infiniflow/ragflow","slug":"datasets-use-different-embedding-models-kb-embd","errorCode":null,"errorMessage":"Datasets use different embedding models: {[kb.embd_id for kb in kbs]}","messagePattern":"Datasets use different embedding models: (.+?)","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"api/db/services/dialog_service.py","lineNumber":359,"sourceCode":"                yield {\"answer\": \"\", \"reference\": {}, \"audio_binary\": None, \"prompt\": \"\", \"created_at\": time.time(), \"final\": False, **flags}\n                continue\n            yield {\"answer\": value, \"reference\": {}, \"audio_binary\": tts(tts_mdl, value), \"prompt\": \"\", \"created_at\": time.time(), \"final\": False}\n    else:\n        if model_config[\"model_type\"] == \"chat\":\n            answer = await chat_mdl.async_chat(system_prompt, msg, dialog.llm_setting)\n        else:\n            answer = await chat_mdl.async_chat(system_prompt, msg, dialog.llm_setting, images=image_files)\n        user_content = msg[-1].get(\"content\", \"[content not available]\")\n        logging.debug(\"User: {}|Assistant: {}\".format(user_content, answer))\n        yield {\"answer\": answer, \"reference\": {}, \"audio_binary\": tts(tts_mdl, answer), \"prompt\": \"\", \"created_at\": time.time()}\n\n\ndef get_models(dialog, trace_context=None, langfuse_session_id=None):\n    embd_mdl, chat_mdl, rerank_mdl, tts_mdl = None, None, None, None\n    kbs = KnowledgebaseService.get_by_ids(dialog.kb_ids)\n    err = validate_dataset_embedding_models(kbs)\n    if err:\n        raise Exception(err)\n\n    if kbs and kbs[0].embd_id:\n        embd_owner_tenant_id = kbs[0].tenant_id\n        embd_model_config = resolve_model_config(embd_owner_tenant_id, LLMType.EMBEDDING, kbs[0].embd_id)\n        embd_mdl = LLMBundle(embd_owner_tenant_id, embd_model_config, trace_context=trace_context, langfuse_session_id=langfuse_session_id)\n        if not embd_mdl:\n            raise LookupError(\"Embedding model(%s) not found\" % kbs[0].embd_id)\n\n    if dialog.llm_id:\n        if dialog.tenant_llm_id:\n            try:\n                chat_model_config = get_model_config_by_id(dialog.tenant_id, LLMType.CHAT, dialog.tenant_llm_id)\n            except LookupError:\n                chat_model_config = resolve_model_config(dialog.tenant_id, LLMType.CHAT, dialog.llm_id)\n        else:\n            chat_model_config = resolve_model_config(dialog.tenant_id, LLMType.CHAT, dialog.llm_id)\n    else:\n        chat_model_config = get_tenant_default_model_by_type(dialog.tenant_id, LLMType.CHAT)","sourceCodeStart":341,"sourceCodeEnd":377,"githubUrl":"https://github.com/infiniflow/ragflow/blob/554fb1133ac3861732235ad9c377eb5e0a770665/api/db/services/dialog_service.py#L341-L377","documentation":"Raised (as generic Exception) from get_models when all datasets in a dialog have embedding models but they are not the same model after normalization (tenant_model references and legacy model@instance@provider composites are resolved to base names before comparing). Cross-dataset retrieval requires one shared embedding space, so mismatched models abort model resolution.","triggerScenarios":"Chat/ask request against a dialog whose kb_ids contain datasets created with different embd_id values (e.g. one BAAI/bge-large-zh, one maidapark/gte), including cases where composite refs point at different base models.","commonSituations":"Adding a dataset created later under a different default embedding model to an old dialog; tenant switched embedding providers and only some datasets were rebuilt; combining shared and private datasets with different models.","solutions":["Re-embed the outlier dataset(s) with the embedding model used by the others, then re-add them to the dialog.","Split the dialog so each dialog only groups datasets sharing one embedding model.","Check the message's listed embd_id values in the error to identify exactly which datasets disagree."],"exampleFix":"# before\ndialog.kb_ids = [kb_bge.id, kb_gte.id]  # different embd_id\n# after: rebuild kb_gte with kb_bge's embedding model\nkb_gte.embd_id = kb_bge.embd_id; kb_gte.save(); # then re-parse/re-embed its documents","handlingStrategy":"validation","validationCode":"embd_refs = {(kb.embd_id, getattr(kb, 'tenant_embd_id', None)) for kb in kbs}\n# rely on the same validator the server uses:\nerr = validate_dataset_embedding_models(kbs)\nif err:\n    raise ValueError(err)  # shows exactly which embd_ids disagree","typeGuard":null,"tryCatchPattern":"try:\n    chat(dialog, msg)\nexcept Exception as e:\n    if 'different embedding models' in str(e):\n        highlight_mismatched_datasets(dialog.kb_ids)  # parse embd list from message\n    else:\n        raise","preventionTips":["Standardize one embedding model per tenant before creating datasets.","Surface each dataset's embedding model in the dialog-editing UI so mismatches are visible."],"tags":["validation","embedding-model","dialog","knowledge-base"],"backgroundTag":null,"analyzedSha":"554fb1133ac3861732235ad9c377eb5e0a770665","analyzedAt":"2026-08-15T09:20:16.380Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}