diff --git a/src/actions/ai.ts b/src/actions/ai.ts index 78ebc038..3bf08c2e 100644 --- a/src/actions/ai.ts +++ b/src/actions/ai.ts @@ -46,9 +46,6 @@ import { } from '../types.js'; import { - AI_DIALOG_TYPE_CARD_SUMMARY, - AI_DIALOG_TYPE_MISSING_CONCEPTS, - AI_DIALOG_TYPE_SUGGEST_TITLE, TEXT_FIELD_TITLE } from '../type_constants.js'; @@ -323,7 +320,7 @@ export const titleForEditingCardWithAI = (count = 5) : ThunkSomeAction => async const model = DEFAULT_MODEL; - dispatch(aiRequestStarted(AI_DIALOG_TYPE_SUGGEST_TITLE, model)); + dispatch(aiRequestStarted('title', model)); let prompt = 'The following is a short essay: ' + CARD_SEPARATOR + body + CARD_SEPARATOR; prompt += 'Here are examples of good titles of other essays:' + CARD_SEPARATOR + selectGoodTitles(state).join('\n') + CARD_SEPARATOR; @@ -348,7 +345,7 @@ export const summarizeCardsWithAI = () : ThunkSomeAction => async (dispatch, get const uid = selectUid(state); const cards = selectActiveCollectionCards(state); const model = DEFAULT_LONG_MODEL; - dispatch(aiRequestStarted(AI_DIALOG_TYPE_CARD_SUMMARY, model)); + dispatch(aiRequestStarted('summary', model)); const [prompt, ids] = await cardsAISummaryPrompt(cards, model); dispatch({ @@ -389,7 +386,7 @@ export const missingConceptsWithAI = () : ThunkSomeAction => async (dispatch, ge const uid = selectUid(state); const cards = selectActiveCollectionCards(state); const model = DEFAULT_HIGH_FIDELITY_MODEL; - dispatch(aiRequestStarted(AI_DIALOG_TYPE_MISSING_CONCEPTS, model)); + dispatch(aiRequestStarted('concepts', model)); const reversedConcepts = selectConcepts(state); const conceptStrings = distilledConceptStrings(reversedConcepts); @@ -412,17 +409,17 @@ export const missingConceptsWithAI = () : ThunkSomeAction => async (dispatch, ge }; export const AI_DIALOG_TYPE_CONFIGURATION : {[key in AIDialogType] : AIDialogTypeConfiguration} = { - [AI_DIALOG_TYPE_CARD_SUMMARY]: { + 'summary': { title: 'Summarize Cards', resultType: 'text-block', }, - [AI_DIALOG_TYPE_SUGGEST_TITLE]: { + 'title': { title: 'Suggest Title', resultType: 'multi-line', commitAction: commitTitleSuggestion, rerunAction: titleForEditingCardWithAI }, - [AI_DIALOG_TYPE_MISSING_CONCEPTS]: { + 'concepts': { title: 'Missing Concepts', resultType: 'tag-list' } diff --git a/src/reducers/ai.ts b/src/reducers/ai.ts index 8017e6cc..02beeed0 100644 --- a/src/reducers/ai.ts +++ b/src/reducers/ai.ts @@ -12,10 +12,6 @@ import { AIState } from '../types.js'; -import { - AI_DIALOG_TYPE_CARD_SUMMARY -} from '../type_constants.js'; - import { DEFAULT_MODEL } from '../actions/ai.js'; @@ -23,7 +19,7 @@ import { const INITIAL_STATE : AIState = { open: false, active: false, - kind: AI_DIALOG_TYPE_CARD_SUMMARY, + kind: 'summary', selectedIndex: -1, model: DEFAULT_MODEL, result: [], diff --git a/src/selectors.ts b/src/selectors.ts index 989818de..f1bfaf9f 100644 --- a/src/selectors.ts +++ b/src/selectors.ts @@ -46,10 +46,6 @@ import { MAX_SORT_ORDER_VALUE } from './card_fields.js'; -import { - AI_DIALOG_TYPE_CARD_SUMMARY -} from './type_constants.js'; - import { references, unionReferences, @@ -189,7 +185,7 @@ export const selectMultiEditReferencesDiff = (state : State) => state.multiedit export const selectAIDialogOpen = (state : State) => state.ai ? state.ai.open : false; export const selectAIActive = (state : State) => state.ai ? state.ai.active : false; -export const selectAIDialogKind = (state : State) : AIDialogType => state.ai ? state.ai.kind : AI_DIALOG_TYPE_CARD_SUMMARY; +export const selectAIDialogKind = (state : State) : AIDialogType => state.ai ? state.ai.kind : 'summary'; export const selectAIResult = (state : State) => state.ai ? state.ai.result : []; export const selectAIResultIndex = (state : State) => state.ai ? state.ai.selectedIndex : -1; export const selectAIError = (state : State) => state.ai ? state.ai.error : ''; diff --git a/src/type_constants.ts b/src/type_constants.ts index dae113ea..85cd6c97 100644 --- a/src/type_constants.ts +++ b/src/type_constants.ts @@ -151,16 +151,6 @@ export const TAB_CONFIG_TYPES = { [TAB_CONFIG_RANDOM]: true }; -export const AI_DIALOG_TYPE_CARD_SUMMARY = 'summary'; -export const AI_DIALOG_TYPE_SUGGEST_TITLE = 'title'; -export const AI_DIALOG_TYPE_MISSING_CONCEPTS = 'concepts'; - -export const AI_DIALOG_TYPES = { - [AI_DIALOG_TYPE_CARD_SUMMARY]: true, - [AI_DIALOG_TYPE_SUGGEST_TITLE]: true, - [AI_DIALOG_TYPE_MISSING_CONCEPTS]: true -}; - export const CARDS_COLLECTION = 'cards'; export const CARD_UPDATES_COLLECTION = 'updates'; export const SECTION_UPDATES_COLLECTION = 'updates'; diff --git a/src/types.ts b/src/types.ts index 083cf074..f70fb8d3 100644 --- a/src/types.ts +++ b/src/types.ts @@ -13,7 +13,6 @@ import { TEXT_FIELD_TYPES_EDITABLE, EDITOR_TAB_TYPES, EDITOR_CONTENT_TAB_TYPES, - AI_DIALOG_TYPES, FIND_CARD_TO_LINK, FIND_CARD_TO_PERMISSION, FIND_CARD_TO_REFERENCE, @@ -1240,7 +1239,13 @@ export type MultiEditState = { export type AIModelName = 'gpt-3.5-turbo' | 'gpt-3.5-turbo-16k' | 'gpt-4' | 'gpt-4-32k'; -export type AIDialogType = keyof(typeof AI_DIALOG_TYPES); +const aiDialogType = z.enum([ + 'summary', + 'title', + 'concepts' +]); + +export type AIDialogType = z.infer; export type AIState = { open: boolean;