This commit is contained in:
lik
2026-09-09 17:36:45 +08:00
parent d6efb180dd
commit 223e0ed2ee
25 changed files with 933 additions and 59 deletions
@@ -0,0 +1,63 @@
import { tool } from "@langchain/core/tools";
import z from "zod";
import { DBModel } from "../../../../models/index.js";
const hospitalInfoQueryTool = tool(
async ({ hospitalName, department, doctorName }) => {
try {
if (!hospitalName) {
return { success: false, error: "hospitalName 不能为空" };
}
const filter = { name: { $regex: hospitalName, $options: "i" } };
const total = await DBModel.Organization.countDocuments(filter);
if (total === 0) {
return { success: false, error: `未找到名称包含「${hospitalName}」的机构` };
}
// 医院总量小,一次最多取 10 家,命中过多时由调用方细化名称
const orgs = await DBModel.Organization.find(filter).limit(10).lean();
const data = orgs.map((org) => {
const fa = org.forAgent ?? {};
let departments = fa.departments ?? [];
let doctors = fa.doctors ?? [];
if (department) {
departments = departments.filter((d) => d.name?.includes(department));
doctors = doctors.filter((d) => d.department?.includes(department));
}
if (doctorName) {
doctors = doctors.filter((d) => d.name?.includes(doctorName));
}
return {
_id: org._id,
name: org.name,
level: org.level ?? "",
address: org.address ?? {},
infoUpdatedAt: fa.updatedAt ?? null,
overview: fa.overview ?? "",
photos: fa.photos ?? [],
departments,
doctors,
guides: fa.guides ?? {},
};
});
return { success: true, total, data };
} catch (error) {
return { success: false, error: error.message };
}
},
{
name: "hospital_info_query",
description:
"查询医院就医信息:医院总览(门诊/挂号/缴费/医保/交通)、科室(位置/电话/就诊提示)、医生(职称/擅长/号别/坐班)、场景指南(初诊/住院/检查须知/老人服务)、照片。按医院名称模糊查询,可按科室、医生名过滤。最多返回 10 家医院信息。",
schema: z.object({
hospitalName: z.string().describe("医院名称,支持模糊匹配(如 协和)"),
department: z.string().optional().describe("科室名称过滤(如 风湿免疫科、放射科)"),
doctorName: z.string().optional().describe("医生姓名过滤"),
}),
}
);
export { hospitalInfoQueryTool };