import { Hono } from "hono";
import { bearerAuth } from "hono/bearer-auth";
import { z } from "zod";
import { zValidator } from "@hono/zod-validator";
import { generateSchema } from '@anatine/zod-openapi';
type Bindings = {
TOKEN: string;
};
const app = new Hono<{ Bindings: Bindings }>();
// API 格式校验 ⬇️
const schema = z.object({
point: z.union([
z.literal("ping"),
z.literal("app.external_data_tool.query"),
z.literal("app.moderation.input"),
z.literal("app.moderation.output"),
]), // Restricts 'point' to two specific values
params: z
.object({
app_id: z.string().optional(),
tool_variable: z.string().optional(),
inputs: z.record(z.any()).optional(),
query: z.any(),
text: z.any()
})
.optional(),
});
// Generate OpenAPI schema
app.get("/", (c) => {
return c.json(generateSchema(schema));
});
app.post(
"/",
(c, next) => {
const auth = bearerAuth({ token: c.env.TOKEN });
return auth(c, next);
},
zValidator("json", schema),
async (c) => {
const { point, params } = c.req.valid("json");
if (point === "ping") {
return c.json({
result: "pong",
});
}
// ⬇️ impliment your logic here ⬇️
// point === "app.external_data_tool.query"
else if (point === "app.moderation.input"){
// 输入检查 ⬇️
const inputkeywords = ["输入过滤测试1", "输入过滤测试2", "输入过滤测试3"];
if (inputkeywords.some(keyword => params.query.includes(keyword)))
{
return c.json({
"flagged": true,
"action": "direct_output",
"preset_response": "输入存在违法内容,请换个问题再试!"
});
} else {
return c.json({
"flagged": false,
"action": "direct_output",
"preset_response": "输入无异常"
});
}
// 输入检查完毕
}
else {
// 输出检查 ⬇️
const outputkeywords = ["输出过滤测试1", "输出过滤测试2", "输出过滤测试3"];
if (outputkeywords.some(keyword => params.text.includes(keyword)))
{
return c.json({
"flagged": true,
"action": "direct_output",
"preset_response": "输出存在敏感内容,已被系统过滤,请换个问题再问!"
});
}
else {
return c.json({
"flagged": false,
"action": "direct_output",
"preset_response": "输出无异常"
});
};
}
// 输出检查完毕
}
);
export default app;