JUNOHUB-test/src/lib/ai/storefrontGroq.ts

78 lines
2.0 KiB
TypeScript

import { logger } from "@/lib/logger"
import { runL1Orchestrator } from "@/lib/ai/orchestrator/runL1"
import { activeAiProvider } from "@/lib/ai/chatCompletion"
type HistoryMessage = {
senderType: "CUSTOMER" | "AI"
content: string
}
export async function generateStorefrontReply(params: {
storeId: string
storeName: string
query: string
visitorId: string
history: HistoryMessage[]
aiModulesJson: unknown
sharedFieldAnswersJson?: unknown
categoryMetadetailsEnabled?: boolean
widgetVerifiedEmail: string | null
widgetSessionExpiresAt: Date | null
boundShopifyOrderId: string | null
}) {
const startedAt = Date.now()
const {
storeId,
storeName,
query,
visitorId,
history,
aiModulesJson,
sharedFieldAnswersJson,
categoryMetadetailsEnabled,
widgetVerifiedEmail,
widgetSessionExpiresAt,
boundShopifyOrderId,
} = params
const result = await runL1Orchestrator({
channel: "widget",
storeId,
storeName,
message: query,
history,
aiModulesJson,
sharedFieldAnswersJson,
categoryMetadetailsEnabled,
widgetVerifiedEmail,
widgetSessionExpiresAt,
boundShopifyOrderId,
})
logger.info("[STOREFRONT_AI_REPLY]", {
storeId,
visitorId,
provider: activeAiProvider(),
queryLength: query.length,
kbHits: result.meta.kbHits,
productHits: result.meta.productHits,
latencyMs: Date.now() - startedAt,
module: result.meta.module,
pillar: result.meta.pillar,
})
return {
content: result.text,
actions: result.actions ?? [],
pendingCartProduct: result.pendingCartProduct ?? null,
meta: {
kbHits: result.meta.kbHits,
productHits: result.meta.productHits,
fallbackUsed: false,
module: result.meta.module,
pillar: result.meta.pillar,
usedTools: result.meta.usedTools,
},
}
}