fff77dac3f
Add liuyao/bazi/combined flows with shared calc and AI infrastructure, 64-gua learn routes, and update Ubuntu PM2 deployment docs for port 3130. Co-authored-by: Cursor <cursoragent@cursor.com>
67 lines
1.4 KiB
TypeScript
67 lines
1.4 KiB
TypeScript
"use server";
|
|
|
|
import { streamAIResponse } from "@/lib/ai/stream";
|
|
import {
|
|
formatLiuyaoTimingForPrompt,
|
|
getTimingInfoWithLongitude,
|
|
} from "@/lib/calc/timing";
|
|
import {
|
|
extractChangeDetails,
|
|
extractZhangMingRen,
|
|
readGuaMarkdown,
|
|
} from "@/lib/content/zhouyi";
|
|
import { LIUYAO_SYSTEM_PROMPT } from "@/lib/prompts";
|
|
|
|
export interface LiuyaoInput {
|
|
question: string;
|
|
calcDate: string;
|
|
calcTime: string;
|
|
locationName: string;
|
|
longitude: number;
|
|
guaMark: string;
|
|
guaTitle: string;
|
|
guaResult: string;
|
|
guaChange: string;
|
|
}
|
|
|
|
export async function getLiuyaoAnswer(input: LiuyaoInput) {
|
|
const { timing, trueSolarTime } = getTimingInfoWithLongitude(
|
|
input.calcDate,
|
|
input.calcTime,
|
|
input.longitude,
|
|
);
|
|
const timingText = formatLiuyaoTimingForPrompt(
|
|
timing,
|
|
trueSolarTime,
|
|
input.locationName,
|
|
input.longitude,
|
|
);
|
|
|
|
let guaDetailText = "";
|
|
try {
|
|
const guaDetail = await readGuaMarkdown(input.guaMark);
|
|
const explain = extractZhangMingRen(guaDetail) ?? "";
|
|
const changeList = extractChangeDetails(
|
|
guaDetail,
|
|
input.guaChange,
|
|
input.guaTitle,
|
|
);
|
|
guaDetailText = [explain, changeList.join("\n")].filter(Boolean).join("\n");
|
|
} catch {
|
|
guaDetailText = "";
|
|
}
|
|
|
|
return streamAIResponse(
|
|
LIUYAO_SYSTEM_PROMPT,
|
|
`${timingText}
|
|
|
|
【卦象】
|
|
${input.guaTitle} ${input.guaResult} ${input.guaChange}
|
|
|
|
【问事】
|
|
${input.question}
|
|
|
|
${guaDetailText}`,
|
|
);
|
|
}
|