A chill Bluesky bot, with responses powered by Gemini.
1import type { FunctionCall, GenerateContentConfig } from "@google/genai";
2import * as create_blog_post from "./create_blog_post";
3import * as create_post from "./create_post";
4import * as mute_thread from "./mute_thread";
5import type { infer as z_infer } from "zod";
6
7const validation_mappings = {
8 "create_post": create_post.validator,
9 "create_blog_post": create_blog_post.validator,
10 "mute_thread": mute_thread.validator,
11} as const;
12
13export const declarations = [
14 {
15 functionDeclarations: [
16 create_post.definition,
17 create_blog_post.definition,
18 mute_thread.definition,
19 ],
20 },
21];
22
23type ToolName = keyof typeof validation_mappings;
24export async function handler(call: FunctionCall & { name: ToolName }) {
25 const parsedArgs = validation_mappings[call.name].parse(call.args);
26
27 switch (call.name) {
28 case "create_post":
29 return await create_post.handler(
30 parsedArgs as z_infer<typeof create_post.validator>,
31 );
32 case "create_blog_post":
33 return await create_blog_post.handler(
34 parsedArgs as z_infer<typeof create_blog_post.validator>,
35 );
36 case "mute_thread":
37 return await mute_thread.handler(
38 parsedArgs as z_infer<typeof mute_thread.validator>,
39 );
40 }
41}