Add backend support for hidden agents (not yet enabled)

This commit is contained in:
sabaimran
2025-01-17 16:46:37 -08:00
parent 2fa212061d
commit 5aadba20a6
7 changed files with 62 additions and 8 deletions

View File

@@ -714,9 +714,12 @@ class AgentAdapters:
public_query = Q(privacy_level=Agent.PrivacyLevel.PUBLIC)
# TODO Update this to allow any public agent that's officially approved once that experience is launched
public_query &= Q(managed_by_admin=True)
user_query = Q(creator=user)
user_query &= Q(is_hidden=False)
if user:
return (
Agent.objects.filter(public_query | Q(creator=user))
Agent.objects.filter(public_query | user_query)
.distinct()
.order_by("created_at")
.prefetch_related("creator", "chat_model", "fileobject_set")
@@ -808,6 +811,7 @@ class AgentAdapters:
input_tools: List[str],
output_modes: List[str],
slug: Optional[str] = None,
is_hidden: Optional[bool] = False,
):
chat_model_option = await ChatModel.objects.filter(name=chat_model).afirst()
@@ -823,6 +827,7 @@ class AgentAdapters:
"chat_model": chat_model_option,
"input_tools": input_tools,
"output_modes": output_modes,
"is_hidden": is_hidden,
}
)

View File

@@ -0,0 +1,27 @@
# Generated by Django 5.0.10 on 2025-01-16 23:59
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("database", "0080_speechtotextmodeloptions_ai_model_api"),
]
operations = [
migrations.AddField(
model_name="agent",
name="is_hidden",
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name="chatmodel",
name="description",
field=models.TextField(blank=True, default=None, null=True),
),
migrations.AddField(
model_name="chatmodel",
name="strengths",
field=models.TextField(blank=True, default=None, null=True),
),
]

View File

@@ -209,6 +209,8 @@ class ChatModel(DbBaseModel):
model_type = models.CharField(max_length=200, choices=ModelType.choices, default=ModelType.OFFLINE)
vision_enabled = models.BooleanField(default=False)
ai_model_api = models.ForeignKey(AiModelApi, on_delete=models.CASCADE, default=None, null=True, blank=True)
description = models.TextField(default=None, null=True, blank=True)
strengths = models.TextField(default=None, null=True, blank=True)
def __str__(self):
return self.name
@@ -286,6 +288,7 @@ class Agent(DbBaseModel):
TEXT = "text"
IMAGE = "image"
AUTOMATION = "automation"
DIAGRAM = "diagram"
creator = models.ForeignKey(
KhojUser, on_delete=models.CASCADE, default=None, null=True, blank=True
@@ -304,6 +307,7 @@ class Agent(DbBaseModel):
style_color = models.CharField(max_length=200, choices=StyleColorTypes.choices, default=StyleColorTypes.BLUE)
style_icon = models.CharField(max_length=200, choices=StyleIconTypes.choices, default=StyleIconTypes.LIGHTBULB)
privacy_level = models.CharField(max_length=30, choices=PrivacyLevel.choices, default=PrivacyLevel.PRIVATE)
is_hidden = models.BooleanField(default=False)
def save(self, *args, **kwargs):
is_new = self._state.adding

View File

@@ -38,6 +38,7 @@ class ModifyAgentBody(BaseModel):
input_tools: Optional[List[str]] = []
output_modes: Optional[List[str]] = []
slug: Optional[str] = None
is_hidden: Optional[bool] = False
@api_agents.get("", response_class=Response)
@@ -214,6 +215,7 @@ async def create_agent(
body.input_tools,
body.output_modes,
body.slug,
body.is_hidden,
)
agents_packet = {
@@ -229,6 +231,7 @@ async def create_agent(
"files": body.files,
"input_tools": agent.input_tools,
"output_modes": agent.output_modes,
"is_hidden": agent.is_hidden,
}
return Response(content=json.dumps(agents_packet), media_type="application/json", status_code=200)

View File

@@ -474,6 +474,7 @@ async def create_chat_session(
request: Request,
common: CommonQueryParams,
agent_slug: Optional[str] = None,
# Add parameters here to create a custom hidden agent on the fly
):
user = request.user.object
@@ -865,7 +866,7 @@ async def chat(
# and not triggered via slash command
and not used_slash_summarize
# but we can't actually summarize
and len(file_filters) != 1
and len(file_filters) == 0
):
conversation_commands.remove(ConversationCommand.Summarize)
elif ConversationCommand.Summarize in conversation_commands:

View File

@@ -20,13 +20,20 @@ def get_chat_model_options(
request: Request,
client: Optional[str] = None,
):
conversation_options = ConversationAdapters.get_conversation_processor_options().all()
chat_models = ConversationAdapters.get_conversation_processor_options().all()
all_conversation_options = list()
for conversation_option in conversation_options:
all_conversation_options.append({"chat_model": conversation_option.name, "id": conversation_option.id})
chat_model_options = list()
for chat_model in chat_models:
chat_model_options.append(
{
"name": chat_model.name,
"id": chat_model.id,
"strengths": chat_model.strengths,
"description": chat_model.description,
}
)
return Response(content=json.dumps(all_conversation_options), media_type="application/json", status_code=200)
return Response(content=json.dumps(chat_model_options), media_type="application/json", status_code=200)
@api_model.get("/chat")

View File

@@ -2231,7 +2231,14 @@ def get_user_config(user: KhojUser, request: Request, is_detailed: bool = False)
chat_models = ConversationAdapters.get_conversation_processor_options().all()
chat_model_options = list()
for chat_model in chat_models:
chat_model_options.append({"name": chat_model.name, "id": chat_model.id})
chat_model_options.append(
{
"name": chat_model.name,
"id": chat_model.id,
"strengths": chat_model.strengths,
"description": chat_model.description,
}
)
selected_paint_model_config = ConversationAdapters.get_user_text_to_image_model_config(user)
paint_model_options = ConversationAdapters.get_text_to_image_model_options().all()