From b72d152a7a5ac604b42f0cdd052f90e6257eb7c0 Mon Sep 17 00:00:00 2001 From: agatha197 Date: Fri, 20 Sep 2024 15:58:52 +0900 Subject: [PATCH] feat: import and start service from hugging face --- .../components/ImportFromHuggingFaceModal.tsx | 64 ++++++++++++++++++- resources/i18n/de.json | 6 +- resources/i18n/el.json | 6 +- resources/i18n/en.json | 5 ++ resources/i18n/es.json | 6 +- resources/i18n/fi.json | 6 +- resources/i18n/fr.json | 6 +- resources/i18n/id.json | 6 +- resources/i18n/it.json | 6 +- resources/i18n/ja.json | 6 +- resources/i18n/ko.json | 6 +- resources/i18n/mn.json | 6 +- resources/i18n/ms.json | 6 +- resources/i18n/pl.json | 6 +- resources/i18n/pt-BR.json | 6 +- resources/i18n/pt.json | 6 +- resources/i18n/ru.json | 6 +- resources/i18n/th.json | 6 +- resources/i18n/tr.json | 6 +- resources/i18n/vi.json | 6 +- resources/i18n/zh-CN.json | 6 +- resources/i18n/zh-TW.json | 6 +- 22 files changed, 167 insertions(+), 22 deletions(-) diff --git a/react/src/components/ImportFromHuggingFaceModal.tsx b/react/src/components/ImportFromHuggingFaceModal.tsx index f2c0940c2..8d8adb131 100644 --- a/react/src/components/ImportFromHuggingFaceModal.tsx +++ b/react/src/components/ImportFromHuggingFaceModal.tsx @@ -1,11 +1,14 @@ import { baiSignedRequestWithPromise } from '../helper'; import { useSuspendedBackendaiClient } from '../hooks'; import { useSuspenseTanQuery } from '../hooks/reactQueryAlias'; +import { useTanMutation } from '../hooks/reactQueryAlias'; +import { useBAINotificationState } from '../hooks/useBAINotification'; import BAIModal, { BAIModalProps } from './BAIModal'; import Flex from './Flex'; import { FilterOutlined } from '@ant-design/icons'; import { useToggle } from 'ahooks'; import { + App, Button, Card, Empty, @@ -69,11 +72,13 @@ const ImportFromHuggingFaceModal: React.FC = ({ }) => { const { t } = useTranslation(); const { token } = theme.useToken(); + const { message } = App.useApp(); + const baiClient = useSuspendedBackendaiClient(); const formRef = useRef>(null); const [isImportOnly, { toggle: toggleIsImportOnly }] = useToggle(false); const [huggingFaceURL, setHuggingFaceURL] = useState(); const [typedURL, setTypedURL] = useState(''); - const baiClient = useSuspendedBackendaiClient(); + const [, { upsertNotification }] = useBAINotificationState(); const [isPendingCheck, startCheckTransition] = useTransition(); const huggingFaceModelInfo = useSuspenseTanQuery<{ @@ -121,6 +126,27 @@ const ImportFromHuggingFaceModal: React.FC = ({ } }, [baiModalProps.open]); + const importAndStartService = useTanMutation({ + mutationFn: (values: { + huggingFaceUrl: string; + importOnly?: boolean; + serviceName?: string; + folderName?: string; + }) => { + return baiSignedRequestWithPromise({ + method: 'POST', + url: '/services/_/huggingface/models', + body: { + huggingface_url: values.huggingFaceUrl, + import_only: values?.importOnly, + service_name: values?.serviceName, + folder_name: values?.folderName, + }, + client: baiClient, + }); + }, + }); + // validate when huggingFaceModelInfo is updated useEffect(() => { if (huggingFaceModelInfo.data.url) { @@ -132,7 +158,41 @@ const ImportFromHuggingFaceModal: React.FC = ({ formRef.current ?.validateFields() .then((values) => { - // TODO: Implement import from Hugging Face + importAndStartService.mutate( + { + huggingFaceUrl: values.url, + importOnly: isImportOnly, + serviceName: values.service_name || undefined, + folderName: values.folder_name || undefined, + }, + { + onSuccess(data: any) { + if (data?.folder?.id && data?.folder?.name) { + upsertNotification({ + key: 'ImportFromHuggingFaceModal' + data.folder.id, + message: `${t('data.modelStore.NewModelStoreFolderHasBeenCreated')}: ${data.folder.name}`, + open: true, + duration: 0, + toText: t('data.modelStore.OpenFolder'), + to: `/data?tab=model-store&folder=${data.folder.id}`, + }); + } + if (data?.service?.endpoint_id && data?.service?.name) { + upsertNotification({ + key: 'ImportFromHuggingFaceModal' + data.service.endpoint_id, + message: `${t('data.modelStore.NewModelStoreServiceHasBeenCreated')}: ${data.service.name}`, + open: true, + duration: 0, + toText: t('data.modelStore.ViewServiceInfo'), + to: `/serving/${data.service.endpoint_id}`, + }); + } + }, + onError(e) { + message.error(e.message || t('dialog.ErrorOccurred')); + }, + }, + ); onRequestClose(); }) .catch(() => {}); diff --git a/resources/i18n/de.json b/resources/i18n/de.json index 169c6abe3..b1bae381d 100644 --- a/resources/i18n/de.json +++ b/resources/i18n/de.json @@ -794,7 +794,11 @@ "InvalidHuggingFaceUrl": "Ungültige Hugging Face URL.", "ServiceName": "Dienstname", "ModelStoreFolderName": "Name des Modellspeicherordners", - "NotSupportedModel": "Das Modell wird nicht unterstützt. \nBitte nutzen Sie das LLM-Modell." + "NotSupportedModel": "Das Modell wird nicht unterstützt. \nBitte nutzen Sie das LLM-Modell.", + "NewModelStoreFolderHasBeenCreated": "Neuer Modellspeicherordner wurde erstellt", + "NewModelStoreServiceHasBeenCreated": "Es wurde ein neuer Modellshop-Service erstellt", + "OpenFolder": "Ordner öffnen", + "ViewServiceInfo": "Serviceinformationen anzeigen" } }, "dialog": { diff --git a/resources/i18n/el.json b/resources/i18n/el.json index c8fe4c54f..35b9026b5 100644 --- a/resources/i18n/el.json +++ b/resources/i18n/el.json @@ -792,8 +792,12 @@ "ModelName": "Όνομα μοντέλου", "Author": "Συγγραφέας", "InvalidHuggingFaceUrl": "Μη έγκυρη διεύθυνση URL Hugging Face.", - "ServiceName": "Όνομα υπηρεσίας", "ModelStoreFolderName": "Όνομα φακέλου καταστήματος μοντέλου", + "ServiceName": "Όνομα υπηρεσίας", + "NewModelStoreFolderHasBeenCreated": "Δημιουργήθηκε νέος φάκελος καταστήματος μοντέλου", + "NewModelStoreServiceHasBeenCreated": "Δημιουργήθηκε νέο μοντέλο υπηρεσίας καταστήματος", + "OpenFolder": "Άνοιγμα φακέλου", + "ViewServiceInfo": "Προβολή πληροφοριών υπηρεσίας", "NotSupportedModel": "Το μοντέλο δεν υποστηρίζεται. \nΧρησιμοποιήστε το μοντέλο LLM." } }, diff --git a/resources/i18n/en.json b/resources/i18n/en.json index 9268d6b11..576506ef5 100644 --- a/resources/i18n/en.json +++ b/resources/i18n/en.json @@ -919,6 +919,11 @@ "InvalidHuggingFaceUrl": "Invalid Hugging Face URL.", "ModelStoreFolderName": "Model store folder name", "ServiceName": "Service name", + "HuggingFaceURL": "Higging Face", + "NewModelStoreFolderHasBeenCreated": "New model store folder has been created", + "NewModelStoreServiceHasBeenCreated": "New model store service has been created", + "OpenFolder": "Open folder", + "ViewServiceInfo": "View service info", "NotSupportedModel": "The model is not supported. Please use the LLM model." } }, diff --git a/resources/i18n/es.json b/resources/i18n/es.json index 72a9ede9b..3d3ce7960 100644 --- a/resources/i18n/es.json +++ b/resources/i18n/es.json @@ -423,8 +423,12 @@ "ModelName": "Nombre del modelo", "Author": "Autor", "InvalidHuggingFaceUrl": "URL Hugging Face no válida.", - "ServiceName": "Nombre del servicio", "ModelStoreFolderName": "Nombre de la carpeta de la tienda de modelos", + "ServiceName": "Nombre del servicio", + "NewModelStoreFolderHasBeenCreated": "Se ha creado una nueva carpeta de tienda de modelos.", + "NewModelStoreServiceHasBeenCreated": "Se ha creado un nuevo modelo de servicio de tienda.", + "OpenFolder": "Abrir carpeta", + "ViewServiceInfo": "Ver información del servicio", "NotSupportedModel": "El modelo no es compatible. \nUtilice el modelo LLM." } }, diff --git a/resources/i18n/fi.json b/resources/i18n/fi.json index 8dfd0e711..692d3ed75 100644 --- a/resources/i18n/fi.json +++ b/resources/i18n/fi.json @@ -423,8 +423,12 @@ "ModelName": "Mallin nimi", "Author": "Kirjoittaja", "InvalidHuggingFaceUrl": "Virheellinen Hugging Face URL-osoite.", - "ServiceName": "Palvelun nimi", "ModelStoreFolderName": "Mallin tallennuskansion nimi", + "ServiceName": "Palvelun nimi", + "NewModelStoreFolderHasBeenCreated": "Uusi mallikauppakansio on luotu", + "NewModelStoreServiceHasBeenCreated": "Uusi mallimyymäläpalvelu on luotu", + "OpenFolder": "Avaa kansio", + "ViewServiceInfo": "Katso palvelutiedot", "NotSupportedModel": "Mallia ei tueta. \nKäytä LLM-mallia." } }, diff --git a/resources/i18n/fr.json b/resources/i18n/fr.json index 7e8024d3d..4039252a8 100644 --- a/resources/i18n/fr.json +++ b/resources/i18n/fr.json @@ -792,8 +792,12 @@ "ModelName": "Nom du modèle", "Author": "Auteur", "InvalidHuggingFaceUrl": "URL Hugging Face non valide.", - "ServiceName": "Nom du service", "ModelStoreFolderName": "Nom du dossier du magasin de modèles", + "ServiceName": "Nom du service", + "NewModelStoreFolderHasBeenCreated": "Un nouveau dossier de magasin de modèles a été créé", + "NewModelStoreServiceHasBeenCreated": "Un nouveau service de magasin de modèles a été créé", + "OpenFolder": "Ouvrir le dossier", + "ViewServiceInfo": "Afficher les informations sur les services", "NotSupportedModel": "Le modèle n'est pas pris en charge. \nVeuillez utiliser le modèle LLM." } }, diff --git a/resources/i18n/id.json b/resources/i18n/id.json index 295fc7a75..0104955ed 100644 --- a/resources/i18n/id.json +++ b/resources/i18n/id.json @@ -793,8 +793,12 @@ "ModelName": "Nama model", "Author": "Penulis", "InvalidHuggingFaceUrl": "URL Hugging Face tidak valid.", - "ServiceName": "Nama layanan", "ModelStoreFolderName": "Nama folder penyimpanan model", + "ServiceName": "Nama layanan", + "NewModelStoreFolderHasBeenCreated": "Folder penyimpanan model baru telah dibuat", + "NewModelStoreServiceHasBeenCreated": "Layanan toko model baru telah dibuat", + "OpenFolder": "Buka map", + "ViewServiceInfo": "Lihat info layanan", "NotSupportedModel": "Model ini tidak didukung. \nSilakan gunakan model LLM." } }, diff --git a/resources/i18n/it.json b/resources/i18n/it.json index 176df16ef..83272ee28 100644 --- a/resources/i18n/it.json +++ b/resources/i18n/it.json @@ -793,8 +793,12 @@ "ModelName": "Nome del modello", "Author": "Autore", "InvalidHuggingFaceUrl": "URL Hugging Face non valido.", - "ServiceName": "Nome del servizio", "ModelStoreFolderName": "Nome della cartella dell'archivio modelli", + "ServiceName": "Nome del servizio", + "NewModelStoreFolderHasBeenCreated": "È stata creata una nuova cartella dell'archivio modelli", + "NewModelStoreServiceHasBeenCreated": "È stato creato un nuovo servizio di negozio di modelli", + "OpenFolder": "Apri cartella", + "ViewServiceInfo": "Visualizza le informazioni sul servizio", "NotSupportedModel": "Il modello non è supportato. \nSi prega di utilizzare il modello LLM." } }, diff --git a/resources/i18n/ja.json b/resources/i18n/ja.json index daa555f70..b46014d27 100644 --- a/resources/i18n/ja.json +++ b/resources/i18n/ja.json @@ -792,8 +792,12 @@ "ModelName": "モデル名", "Author": "著者", "InvalidHuggingFaceUrl": "無効なHugging Face URLです。", - "ServiceName": "サービス名", "ModelStoreFolderName": "モデルストアフォルダー名", + "ServiceName": "サービス名", + "NewModelStoreFolderHasBeenCreated": "新しいモデルストアフォルダーが作成されました", + "NewModelStoreServiceHasBeenCreated": "新しいモデルの店舗サービスが誕生しました", + "OpenFolder": "フォルダーを開く", + "ViewServiceInfo": "サービス情報を見る", "NotSupportedModel": "このモデルはサポートされていません。 \nLLMモデルを使用してください。" } }, diff --git a/resources/i18n/ko.json b/resources/i18n/ko.json index 94206f42c..f4f7962f0 100644 --- a/resources/i18n/ko.json +++ b/resources/i18n/ko.json @@ -905,8 +905,12 @@ "Author": "작성자", "InvalidHuggingFaceUrl": "유효한 Hugging Face URL을 입력해주세요", "PleaseClickCheckButton": "확인 버튼을 클릭해주세요", - "ServiceName": "서비스 이름", "ModelStoreFolderName": "모델 저장소 폴더 이름", + "ServiceName": "서비스 이름", + "NewModelStoreFolderHasBeenCreated": "새 모델 저장소 폴더가 생성되었습니다.", + "NewModelStoreServiceHasBeenCreated": "새로운 모델스토어 서비스가 생성되었습니다", + "OpenFolder": "폴더 열기", + "ViewServiceInfo": "서비스 정보 보기", "NotSupportedModel": "해당 모델은 지원되지 않습니다. \nLLM 모델을 사용하세요." } }, diff --git a/resources/i18n/mn.json b/resources/i18n/mn.json index e668faa40..af817e4d7 100644 --- a/resources/i18n/mn.json +++ b/resources/i18n/mn.json @@ -793,8 +793,12 @@ "CheckHuggingFaceUrl": "Шалгах", "ModelName": "Загварын нэр", "InvalidHuggingFaceUrl": "Хүчингүй Hugging Face URL.", - "ServiceName": "Үйлчилгээний нэр", "ModelStoreFolderName": "Загварын дэлгүүрийн хавтасны нэр", + "ServiceName": "Үйлчилгээний нэр", + "NewModelStoreFolderHasBeenCreated": "Шинэ загварын дэлгүүрийн хавтас үүсгэсэн", + "NewModelStoreServiceHasBeenCreated": "Шинэ загварын дэлгүүрийн үйлчилгээ бий боллоо", + "OpenFolder": "Фолдер нээх", + "ViewServiceInfo": "Үйлчилгээний мэдээллийг харах", "NotSupportedModel": "Энэ загварыг дэмждэггүй. \nLLM загварыг ашиглана уу." } }, diff --git a/resources/i18n/ms.json b/resources/i18n/ms.json index 3ee7a7520..3e243e22d 100644 --- a/resources/i18n/ms.json +++ b/resources/i18n/ms.json @@ -791,8 +791,12 @@ "ModelName": "Nama model", "Author": "Pengarang", "InvalidHuggingFaceUrl": "URL Hugging Face tidak sah.", - "ServiceName": "Nama perkhidmatan", "ModelStoreFolderName": "Nama folder kedai model", + "ServiceName": "Nama perkhidmatan", + "NewModelStoreFolderHasBeenCreated": "Folder kedai model baharu telah dibuat", + "NewModelStoreServiceHasBeenCreated": "Perkhidmatan kedai model baharu telah dibuat", + "OpenFolder": "Buka folder", + "ViewServiceInfo": "Lihat maklumat perkhidmatan", "NotSupportedModel": "Model tidak disokong. \nSila gunakan model LLM." } }, diff --git a/resources/i18n/pl.json b/resources/i18n/pl.json index 4d31922f8..1051e8f9f 100644 --- a/resources/i18n/pl.json +++ b/resources/i18n/pl.json @@ -792,8 +792,12 @@ "ModelName": "Nazwa modelu", "Author": "Autor", "InvalidHuggingFaceUrl": "Nieprawidłowy adres URL Hugging Face.", - "ServiceName": "Nazwa usługi", "ModelStoreFolderName": "Nazwa folderu sklepu modelu", + "ServiceName": "Nazwa usługi", + "NewModelStoreFolderHasBeenCreated": "Utworzono nowy folder sklepu z modelami", + "NewModelStoreServiceHasBeenCreated": "Powstał nowy serwis sklepu modelowego", + "OpenFolder": "Otwórz folder", + "ViewServiceInfo": "Wyświetl informacje o usłudze", "NotSupportedModel": "Model nie jest obsługiwany. \nProszę skorzystać z modelu LLM." } }, diff --git a/resources/i18n/pt-BR.json b/resources/i18n/pt-BR.json index f903be097..62bd4c406 100644 --- a/resources/i18n/pt-BR.json +++ b/resources/i18n/pt-BR.json @@ -792,8 +792,12 @@ "ModelName": "Nome do modelo", "Author": "Autor", "InvalidHuggingFaceUrl": "URL Hugging Face inválido.", - "ServiceName": "Nome do serviço", "ModelStoreFolderName": "Nome da pasta de armazenamento de modelos", + "ServiceName": "Nome do serviço", + "NewModelStoreFolderHasBeenCreated": "Nova pasta de loja de modelos foi criada", + "NewModelStoreServiceHasBeenCreated": "Novo modelo de serviço de loja foi criado", + "OpenFolder": "Abrir pasta", + "ViewServiceInfo": "Ver informações de serviço", "NotSupportedModel": "O modelo não é suportado. \nPor favor, use o modelo LLM." } }, diff --git a/resources/i18n/pt.json b/resources/i18n/pt.json index 269e02935..507d7b232 100644 --- a/resources/i18n/pt.json +++ b/resources/i18n/pt.json @@ -792,8 +792,12 @@ "ModelName": "Nome do modelo", "Author": "Autor", "InvalidHuggingFaceUrl": "URL Hugging Face inválido.", - "ServiceName": "Nome do serviço", "ModelStoreFolderName": "Nome da pasta de armazenamento de modelos", + "ServiceName": "Nome do serviço", + "NewModelStoreFolderHasBeenCreated": "Nova pasta de loja de modelos foi criada", + "NewModelStoreServiceHasBeenCreated": "Novo modelo de serviço de loja foi criado", + "OpenFolder": "Abrir pasta", + "ViewServiceInfo": "Ver informações de serviço", "NotSupportedModel": "O modelo não é suportado. \nPor favor, use o modelo LLM." } }, diff --git a/resources/i18n/ru.json b/resources/i18n/ru.json index afb5ba658..49b57dac1 100644 --- a/resources/i18n/ru.json +++ b/resources/i18n/ru.json @@ -792,8 +792,12 @@ "ModelName": "Название модели", "Author": "Автор", "InvalidHuggingFaceUrl": "Неверный URL-адрес Hugging Face.", - "ServiceName": "Название службы", "ModelStoreFolderName": "Имя папки хранилища моделей", + "ServiceName": "Название службы", + "NewModelStoreFolderHasBeenCreated": "Создана новая папка хранилища моделей.", + "NewModelStoreServiceHasBeenCreated": "Создан новый сервис магазина моделей", + "OpenFolder": "Открыть папку", + "ViewServiceInfo": "Посмотреть информацию об услуге", "NotSupportedModel": "Модель не поддерживается. \nПожалуйста, используйте модель LLM." } }, diff --git a/resources/i18n/th.json b/resources/i18n/th.json index af24ccb5c..af27e43c5 100644 --- a/resources/i18n/th.json +++ b/resources/i18n/th.json @@ -909,8 +909,12 @@ "ModelName": "ชื่อรุ่น", "Author": "ผู้เขียน", "InvalidHuggingFaceUrl": "URL Hugging Face ไม่ถูกต้อง", - "ServiceName": "ชื่อบริการ", "ModelStoreFolderName": "ชื่อโฟลเดอร์ร้านค้าโมเดล", + "ServiceName": "ชื่อบริการ", + "NewModelStoreFolderHasBeenCreated": "สร้างโฟลเดอร์ร้านค้าโมเดลใหม่แล้ว", + "NewModelStoreServiceHasBeenCreated": "สร้างบริการร้านค้ารูปแบบใหม่แล้ว", + "OpenFolder": "เปิดโฟลเดอร์", + "ViewServiceInfo": "ดูข้อมูลบริการ", "NotSupportedModel": "ไม่รองรับโมเดลนี้ \nกรุณาใช้แบบจำลอง LLM" } }, diff --git a/resources/i18n/tr.json b/resources/i18n/tr.json index 4d65b2c7f..b69ec4ea4 100644 --- a/resources/i18n/tr.json +++ b/resources/i18n/tr.json @@ -792,8 +792,12 @@ "ModelName": "Model adı", "Author": "Yazar", "InvalidHuggingFaceUrl": "Geçersiz Hugging Face URL'si.", - "ServiceName": "Hizmet adı", "ModelStoreFolderName": "Model deposu klasör adı", + "ServiceName": "Hizmet adı", + "NewModelStoreFolderHasBeenCreated": "Yeni model mağazası klasörü oluşturuldu", + "NewModelStoreServiceHasBeenCreated": "Yeni model mağaza hizmeti oluşturuldu", + "OpenFolder": "Klasörü aç", + "ViewServiceInfo": "Hizmet bilgilerini görüntüle", "NotSupportedModel": "Model desteklenmiyor. \nLütfen LLM modelini kullanın." } }, diff --git a/resources/i18n/vi.json b/resources/i18n/vi.json index 6d518b95f..7db49d80c 100644 --- a/resources/i18n/vi.json +++ b/resources/i18n/vi.json @@ -792,8 +792,12 @@ "ModelName": "Tên mẫu", "Author": "Tác giả", "InvalidHuggingFaceUrl": "URL Hugging Face không hợp lệ.", - "ServiceName": "Tên dịch vụ", "ModelStoreFolderName": "Tên thư mục lưu trữ mô hình", + "ServiceName": "Tên dịch vụ", + "NewModelStoreFolderHasBeenCreated": "Thư mục lưu trữ mô hình mới đã được tạo", + "NewModelStoreServiceHasBeenCreated": "Dịch vụ cửa hàng mẫu mới đã được tạo", + "OpenFolder": "Mở thư mục", + "ViewServiceInfo": "Xem thông tin dịch vụ", "NotSupportedModel": "Mô hình không được hỗ trợ. \nVui lòng sử dụng mô hình LLM." } }, diff --git a/resources/i18n/zh-CN.json b/resources/i18n/zh-CN.json index 0831bd26b..e882d05e4 100644 --- a/resources/i18n/zh-CN.json +++ b/resources/i18n/zh-CN.json @@ -794,7 +794,11 @@ "InvalidHuggingFaceUrl": "Hugging Face URL 无效。", "ServiceName": "服务名称", "ModelStoreFolderName": "模型存储文件夹名称", - "NotSupportedModel": "不支持该型号。\n请使用LLM模型。" + "NotSupportedModel": "不支持该型号。\n请使用LLM模型。", + "NewModelStoreFolderHasBeenCreated": "新的模型存储文件夹已创建", + "NewModelStoreServiceHasBeenCreated": "打造门店服务新模式", + "OpenFolder": "打开文件夹", + "ViewServiceInfo": "查看服务信息" } }, "dialog": { diff --git a/resources/i18n/zh-TW.json b/resources/i18n/zh-TW.json index f310bd527..cefb9b2c8 100644 --- a/resources/i18n/zh-TW.json +++ b/resources/i18n/zh-TW.json @@ -793,7 +793,11 @@ "InvalidHuggingFaceUrl": "Hugging Face URL 无效。", "ServiceName": "服務名稱", "ModelStoreFolderName": "模型儲存資料夾名稱", - "NotSupportedModel": "不支援該型號。\n請使用LLM模型。" + "NotSupportedModel": "不支援該型號。\n請使用LLM模型。", + "NewModelStoreFolderHasBeenCreated": "新的模型儲存資料夾已創建", + "NewModelStoreServiceHasBeenCreated": "打造門市服務新模式", + "OpenFolder": "打開資料夾", + "ViewServiceInfo": "查看服務資訊" } }, "dialog": {