feat:新增ai分析,新增储值账户,优化通知规则

This commit is contained in:
2026-03-12 14:03:01 +08:00
parent 6a00875246
commit 6ca962a187
22 changed files with 1294 additions and 237 deletions

View File

@@ -1,9 +1,13 @@
import { buildTransactionEnrichmentMessages } from '../../lib/aiPrompt.js'
import {
buildFinanceChatMessages,
buildTransactionEnrichmentMessages,
} from '../../lib/aiPrompt.js'
import { useSettingsStore } from '../../stores/settings.js'
import {
applyAiEnrichment,
fetchRecentTransactionsForAi,
markTransactionAiFailed,
markTransactionAiRunning,
} from '../transactionService.js'
import { DeepSeekProvider } from './deepseekProvider.js'
@@ -24,11 +28,13 @@ const createProvider = (settingsStore) => {
})
}
export const isAiReady = (settingsStore = useSettingsStore()) =>
!!settingsStore.aiAutoCategoryEnabled && !!settingsStore.aiApiKey
export const hasAiAccess = (settingsStore = useSettingsStore()) => !!settingsStore.aiApiKey
export const maybeEnrichTransactionWithAi = async (transaction) => {
if (!transaction?.id) return transaction
export const isAiReady = (settingsStore = useSettingsStore()) =>
!!settingsStore.aiAutoCategoryEnabled && hasAiAccess(settingsStore)
export const maybeEnrichTransactionWithAi = async (transaction, options = {}) => {
if (!transaction?.id || transaction.entryType === 'transfer') return transaction
const settingsStore = useSettingsStore()
if (!isAiReady(settingsStore)) {
@@ -36,11 +42,16 @@ export const maybeEnrichTransactionWithAi = async (transaction) => {
}
try {
const running = await markTransactionAiRunning(transaction.id, settingsStore.aiModel)
if (running) {
options.onProgress?.(running)
}
const provider = createProvider(settingsStore)
const similarTransactions = await fetchRecentTransactionsForAi(6, transaction.id)
const messages = buildTransactionEnrichmentMessages({
transaction,
similarTransactions,
similarTransactions: similarTransactions.filter((item) => item.entryType !== 'transfer'),
})
const result = await provider.enrichTransaction({ messages })
const threshold = clampThreshold(settingsStore.aiAutoApplyThreshold)
@@ -61,3 +72,19 @@ export const maybeEnrichTransactionWithAi = async (transaction) => {
return failed || transaction
}
}
export const askFinanceAssistant = async ({ question, transactions = [], conversation = [] }) => {
const settingsStore = useSettingsStore()
if (!hasAiAccess(settingsStore)) {
throw new Error('请先在设置页填写 DeepSeek API Key')
}
const provider = createProvider(settingsStore)
const messages = buildFinanceChatMessages({
question,
transactions,
conversation,
})
return provider.chat({ messages })
}