{"record":{"id":"923e828d5cec0994","repo":"khoj-ai/khoj","slug":"a-public-agent-with-the-name-instance-name-alrea","errorCode":null,"errorMessage":"A public Agent with the name {instance.name} already exists.","messagePattern":"A public Agent with the name (.+?) already exists\\.","errorType":"validation","errorClass":"ValidationError","httpStatus":null,"severity":"error","filePath":"src/khoj/database/models/__init__.py","lineNumber":370,"sourceCode":"    class Operation(models.TextChoices):\n        INDEX_CONTENT = \"index_content\"\n        SCHEDULED_JOB = \"scheduled_job\"\n        SCHEDULE_LEADER = \"schedule_leader\"\n        APPLY_MIGRATIONS = \"apply_migrations\"\n\n    # We need to make sure that some operations are thread-safe. To do so, add locks for potentially shared operations.\n    # For example, we need to make sure that only one process is updating the embeddings at a time.\n    name = models.CharField(max_length=200, choices=Operation.choices, unique=True)\n    started_at = models.DateTimeField(auto_now_add=True)\n    max_duration_in_seconds = models.IntegerField(default=60 * 60 * 12)  # 12 hours\n\n\n@receiver(pre_save, sender=Agent)\ndef verify_agent(sender, instance, **kwargs):\n    # check if this is a new instance\n    if instance._state.adding:\n        if Agent.objects.filter(name=instance.name, privacy_level=Agent.PrivacyLevel.PUBLIC).exists():\n            raise ValidationError(f\"A public Agent with the name {instance.name} already exists.\")\n        if Agent.objects.filter(name=instance.name, creator=instance.creator).exists():\n            raise ValidationError(f\"A private Agent with the name {instance.name} already exists.\")\n\n\nclass NotionConfig(DbBaseModel):\n    token = models.CharField(max_length=200)\n    user = models.ForeignKey(KhojUser, on_delete=models.CASCADE)\n\n\nclass GithubConfig(DbBaseModel):\n    pat_token = models.CharField(max_length=200)\n    user = models.ForeignKey(KhojUser, on_delete=models.CASCADE)\n\n\nclass GithubRepoConfig(DbBaseModel):\n    name = models.CharField(max_length=200)\n    owner = models.CharField(max_length=200)\n    branch = models.CharField(max_length=200)","sourceCodeStart":352,"sourceCodeEnd":388,"githubUrl":"https://github.com/khoj-ai/khoj/blob/ae229ca894c0b80ad84664afcfdde523b5e87057/src/khoj/database/models/__init__.py#L352-L388","documentation":"Django pre_save signal on the Agent model rejecting creation of a new Agent whose name collides with an existing PUBLIC agent. Enforces globally unique public agent names.","triggerScenarios":"Agent.objects.create(name='x', privacy_level=PUBLIC) or saving a new Agent (via admin, DRF serializer, or ORM) when a public Agent named 'x' already exists.","commonSituations":"Seeding scripts run twice; users trying to shadow popular public agents; concurrent creation of same-named public agents.","solutions":["Choose a different, unique name for the new agent.","If the intent was to update the existing public agent, fetch and modify it instead of creating a new instance.","Make seeding idempotent with get_or_create / existence checks before create."],"exampleFix":"# before\nAgent.objects.create(name=\"Research\", privacy_level=Agent.PrivacyLevel.PUBLIC, creator=user)\n\n# after\nif Agent.objects.filter(name=\"Research\", privacy_level=Agent.PrivacyLevel.PUBLIC).exists():\n    agent = Agent.objects.get(name=\"Research\", privacy_level=Agent.PrivacyLevel.PUBLIC)\nelse:\n    agent = Agent.objects.create(name=\"Research\", privacy_level=Agent.PrivacyLevel.PUBLIC, creator=user)","handlingStrategy":"validation","validationCode":"from khoj.database.models import Agent\nname = \"Research\"\nif Agent.objects.filter(name=name, privacy_level=Agent.PrivacyLevel.PUBLIC).exists():\n    agent = Agent.objects.get(name=name, privacy_level=Agent.PrivacyLevel.PUBLIC)\nelse:\n    agent = Agent.objects.create(name=name, privacy_level=Agent.PrivacyLevel.PUBLIC, creator=user)","typeGuard":null,"tryCatchPattern":"from django.core.exceptions import ValidationError\ntry:\n    agent.save()\nexcept ValidationError as e:\n    if \"public Agent\" in str(e):\n        # pick a new name or fetch existing\n        agent = Agent.objects.get(name=agent.name, privacy_level=Agent.PrivacyLevel.PUBLIC)\n    else:\n        raise","preventionTips":["Check name availability (or use get_or_create) before creating agents.","Make seed scripts idempotent.","Disable duplicate form submissions in the UI."],"tags":["khoj","django","agent","uniqueness","pre-save-signal"],"backgroundTag":"duplicate-unique-constraint-violation","analyzedSha":"ae229ca894c0b80ad84664afcfdde523b5e87057","analyzedAt":"2026-08-27T03:32:41.843Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}