| null): any {
if (value == null) {
return value;
}
diff --git a/vue3/src/openapi/models/index.ts b/vue3/src/openapi/models/index.ts
index 7cedeefa9..44221fb71 100644
--- a/vue3/src/openapi/models/index.ts
+++ b/vue3/src/openapi/models/index.ts
@@ -1,6 +1,8 @@
/* tslint:disable */
/* eslint-disable */
export * from './AccessToken';
+export * from './AiLog';
+export * from './AiProvider';
export * from './AlignmentEnum';
export * from './AuthToken';
export * from './AutoMealPlan';
@@ -55,6 +57,8 @@ export * from './OpenDataStoreCategory';
export * from './OpenDataUnit';
export * from './OpenDataUnitTypeEnum';
export * from './OpenDataVersion';
+export * from './PaginatedAiLogList';
+export * from './PaginatedAiProviderList';
export * from './PaginatedAutomationList';
export * from './PaginatedBookmarkletImportListList';
export * from './PaginatedConnectorConfigList';
@@ -101,6 +105,7 @@ export * from './PaginatedUserSpaceList';
export * from './PaginatedViewLogList';
export * from './ParsedIngredient';
export * from './PatchedAccessToken';
+export * from './PatchedAiProvider';
export * from './PatchedAutomation';
export * from './PatchedBookmarkletImport';
export * from './PatchedConnectorConfig';
diff --git a/vue3/src/pages/DatabasePage.vue b/vue3/src/pages/DatabasePage.vue
index e887f2249..0b447c264 100644
--- a/vue3/src/pages/DatabasePage.vue
+++ b/vue3/src/pages/DatabasePage.vue
@@ -35,6 +35,16 @@
+
+
+ {{ $t('Ai') }}
+
+
+
+
+
+
+
diff --git a/vue3/src/pages/RecipeImportPage.vue b/vue3/src/pages/RecipeImportPage.vue
index 6aaae7a6e..025c81e27 100644
--- a/vue3/src/pages/RecipeImportPage.vue
+++ b/vue3/src/pages/RecipeImportPage.vue
@@ -140,10 +140,18 @@
@keydown.enter="loadRecipeFromUrl({url: importUrl})">
-
- {{ $t('File') }}
- {{ $t('Text') }}
-
+
+
+
+
+
+
+ {{ $t('File') }}
+ {{ $t('Text') }}
+
+
+
+
@@ -540,6 +548,7 @@ import {useI18n} from "vue-i18n";
import {computed, onMounted, ref} from "vue";
import {
AccessToken,
+ AiProvider,
ApiApi,
ImportLog,
Recipe,
@@ -648,6 +657,7 @@ const appImportDuplicates = ref(false)
const appImportLog = ref(null)
const image = ref(null)
const aiMode = ref<'file' | 'text'>('file')
+const selectedAiProvider = ref(undefined)
const editAfterImport = ref(false)
const bookmarkletToken = ref("")
@@ -724,12 +734,15 @@ function loadRecipeFromUrl(recipeFromSourceRequest: RecipeFromSource) {
*/
function loadRecipeFromAiImport() {
let request = null
+
+ if(selectedAiProvider.value == undefined) {
+ useMessageStore().addError(ErrorMessageType.CREATE_ERROR, "No AI Provider selected")
+ }
+
if (image.value != null && aiMode.value == 'file') {
- console.log('file import')
- request = doAiImport(image.value)
+ request = doAiImport(selectedAiProvider.value.id!,image.value)
} else if (sourceImportText.value != '' && aiMode.value == 'text') {
- console.log('text import')
- request = doAiImport(null, sourceImportText.value)
+ request = doAiImport(selectedAiProvider.value.id!, null, sourceImportText.value)
}
if (request != null) {
@@ -811,13 +824,13 @@ function deleteStep(step: SourceImportStep) {
}
function handleMergeAllSteps(): void {
- if (importResponse.value.recipe && importResponse.value.recipe.steps){
+ if (importResponse.value.recipe && importResponse.value.recipe.steps) {
mergeAllSteps(importResponse.value.recipe.steps)
}
}
function handleSplitAllSteps(): void {
- if (importResponse.value.recipe && importResponse.value.recipe.steps){
+ if (importResponse.value.recipe && importResponse.value.recipe.steps) {
splitAllSteps(importResponse.value.recipe.steps, '\n')
}
}
diff --git a/vue3/src/types/Models.ts b/vue3/src/types/Models.ts
index 7feef10a1..37bbc2e45 100644
--- a/vue3/src/types/Models.ts
+++ b/vue3/src/types/Models.ts
@@ -1,5 +1,5 @@
import {
- AccessToken,
+ AccessToken, AiLog, AiProvider,
ApiApi, ApiKeywordMoveUpdateRequest, Automation, type AutomationTypeEnum, ConnectorConfig, CookLog, CustomFilter,
Food,
Ingredient,
@@ -146,6 +146,8 @@ export type EditorSupportedModels =
| 'ViewLog'
| 'ConnectorConfig'
| 'SearchFields'
+ | 'AiProvider'
+ | 'AiLog'
// used to type methods/parameters in conjunction with configuration type
export type EditorSupportedTypes =
@@ -180,6 +182,8 @@ export type EditorSupportedTypes =
| ViewLog
| ConnectorConfig
| SearchFields
+ | AiProvider
+ | AiLog
export const TFood = {
name: 'Food',
@@ -788,6 +792,53 @@ export const TConnectorConfig = {
} as Model
registerModel(TConnectorConfig)
+export const TAiProvider = {
+ name: 'AiProvider',
+ localizationKey: 'AiProvider',
+ localizationKeyDescription: 'AiProviderHelp',
+ icon: 'fa-solid fa-wand-magic-sparkles',
+
+ editorComponent: defineAsyncComponent(() => import(`@/components/model_editors/AiProviderEditor.vue`)),
+
+ disableListView: false,
+ toStringKeys: ['name'],
+ isPaginated: true,
+
+ disableCreate: false,
+ disableDelete: false,
+ disableUpdate: false,
+
+ tableHeaders: [
+ {title: 'Name', key: 'name'},
+
+ {title: 'Actions', key: 'action', align: 'end'},
+ ]
+} as Model
+registerModel(TAiProvider)
+
+export const TAiLog = {
+ name: 'AiLog',
+ localizationKey: 'AiLog',
+ localizationKeyDescription: 'AiLogHelp',
+ icon: 'fa-solid fa-wand-magic-sparkles',
+
+ disableListView: false,
+ toStringKeys: ['aiProvider.name', 'function', 'created_at'],
+ isPaginated: true,
+
+ disableCreate: true,
+ disableDelete: true,
+ disableUpdate: true,
+
+ tableHeaders: [
+ {title: 'Name', key: 'function'},
+ {title: 'AiProvider', key: 'aiProvider.name',},
+ {title: 'CreatedAt', key: 'createdAt'},
+ {title: 'Actions', key: 'action', align: 'end'},
+ ]
+} as Model
+registerModel(TAiLog)
+
export const TFoodInheritField = {
name: 'FoodInheritField',
localizationKey: 'FoodInherit',