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>
85 lines
2.1 KiB
TypeScript
85 lines
2.1 KiB
TypeScript
"use server";
|
|
|
|
import { streamAIResponse } from "@/lib/ai/stream";
|
|
import {
|
|
calculateBazi,
|
|
formatBaziForPrompt,
|
|
type BaziInput,
|
|
} from "@/lib/calc/bazi";
|
|
import {
|
|
formatTimingForPrompt,
|
|
getTimingInfoWithLongitude,
|
|
} from "@/lib/calc/timing";
|
|
import { COMBINED_SYSTEM_PROMPT } from "@/lib/prompts";
|
|
import {
|
|
extractChangeDetails,
|
|
extractZhangMingRen,
|
|
readGuaMarkdown,
|
|
} from "@/lib/content/zhouyi";
|
|
|
|
export interface CombinedInput {
|
|
birth: BaziInput;
|
|
birthPlaceName: string;
|
|
currentPlaceName: string;
|
|
currentLongitude: number;
|
|
calcDate: string;
|
|
calcTime: string;
|
|
question: string;
|
|
hexagram?: {
|
|
guaMark: string;
|
|
guaTitle: string;
|
|
guaResult: string;
|
|
guaChange: string;
|
|
};
|
|
}
|
|
|
|
export async function getCombinedAnswer(input: CombinedInput) {
|
|
const chart = calculateBazi(input.birth);
|
|
const chartText = formatBaziForPrompt(chart);
|
|
const { timing, trueSolarTime } = getTimingInfoWithLongitude(
|
|
input.calcDate,
|
|
input.calcTime,
|
|
input.currentLongitude,
|
|
);
|
|
const timingText = [
|
|
formatTimingForPrompt(timing, input.currentPlaceName, input.currentLongitude),
|
|
`真太阳时:${trueSolarTime}`,
|
|
].join("\n");
|
|
|
|
let hexagramText = "";
|
|
if (input.hexagram) {
|
|
const { guaMark, guaTitle, guaResult, guaChange } = input.hexagram;
|
|
try {
|
|
const guaDetail = await readGuaMarkdown(guaMark);
|
|
const explain = extractZhangMingRen(guaDetail) ?? "";
|
|
const changeList = extractChangeDetails(guaDetail, guaChange, guaTitle);
|
|
hexagramText = [
|
|
"",
|
|
"【卦象 · 可选六爻】",
|
|
`${guaTitle} ${guaResult} ${guaChange}`,
|
|
explain,
|
|
changeList.join("\n"),
|
|
].join("\n");
|
|
} catch {
|
|
hexagramText = [
|
|
"",
|
|
"【卦象 · 可选六爻】",
|
|
`${input.hexagram.guaTitle} ${input.hexagram.guaResult} ${input.hexagram.guaChange}`,
|
|
].join("\n");
|
|
}
|
|
}
|
|
|
|
return streamAIResponse(
|
|
COMBINED_SYSTEM_PROMPT,
|
|
`【人和 · 八字排盘】
|
|
出生地:${input.birthPlaceName}
|
|
${chartText}
|
|
|
|
${timingText}
|
|
${hexagramText}
|
|
|
|
【问事】
|
|
${input.question}`,
|
|
);
|
|
}
|