diff --git a/apps/internal-ui/src/features/agents/AgentDetailPage.tsx b/apps/internal-ui/src/features/agents/AgentDetailPage.tsx
index 8105a70..b28fa29 100644
--- a/apps/internal-ui/src/features/agents/AgentDetailPage.tsx
+++ b/apps/internal-ui/src/features/agents/AgentDetailPage.tsx
@@ -5,6 +5,7 @@ import { LANGUAGES } from "@chatballs/shared";
import { api, ApiError } from "../../api/client";
import { ChannelGlyph } from "../../shared/badges";
+import { SelectField } from "../../shared/form-controls";
import { Icon } from "../../shared/icons";
import { EmptyState, ErrorScreen, LoadingState } from "../../shared/ui";
import { BackLink, Button, CopyButton } from "../../shared/ui-controls";
@@ -509,25 +510,16 @@ function AssignmentCard({ card, groups, canManage, busy, apply }: {
? setName(event.target.value)} onBlur={() => { if (dirty) void apply({ name: name.trim() }); }} />
: {card.name}}
-
+ }
+ disabled={busy}
+ label={t("common.group")}
+ readOnly={!canManage}
+ readOnlyText={card.groupName ?? t("common.no_group")}
+ value={card.groupId === null ? "" : String(card.groupId)}
+ onChange={(next) => void apply({ groupId: next ? Number(next) : null })}
+ options={[["", t("common.no_group")], ...groups.map((group) => [String(group.id), group.name] as [string, string])]}
+ />
);
@@ -558,24 +550,16 @@ function ModelCard({ card, providers, canManage, busy, apply }: {
{t("common.model")}
{t("ai.provider_key_lives_under_settings")}
-
+
void apply({ providerIntegrationId: next ? Number(next) : null })}
+ options={[["", t("ai.not_selected")], ...providers.map((item) => [String(item.id), item.name] as [string, string])]}
+ />