question.ts 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import z from "zod"
  2. import { Effect } from "effect"
  3. import { Tool } from "./tool"
  4. import { Question } from "../question"
  5. import DESCRIPTION from "./question.txt"
  6. const parameters = z.object({
  7. questions: z.array(Question.Info.omit({ custom: true })).describe("Questions to ask"),
  8. })
  9. type Metadata = {
  10. answers: Question.Answer[]
  11. }
  12. export const QuestionTool = Tool.defineEffect<typeof parameters, Metadata, Question.Service>(
  13. "question",
  14. Effect.gen(function* () {
  15. const question = yield* Question.Service
  16. return {
  17. description: DESCRIPTION,
  18. parameters,
  19. execute: (params: z.infer<typeof parameters>, ctx: Tool.Context<Metadata>) =>
  20. Effect.gen(function* () {
  21. const answers = yield* question.ask({
  22. sessionID: ctx.sessionID,
  23. questions: params.questions,
  24. tool: ctx.callID ? { messageID: ctx.messageID, callID: ctx.callID } : undefined,
  25. })
  26. const formatted = params.questions
  27. .map((q, i) => `"${q.question}"="${answers[i]?.length ? answers[i].join(", ") : "Unanswered"}"`)
  28. .join(", ")
  29. return {
  30. title: `Asked ${params.questions.length} question${params.questions.length > 1 ? "s" : ""}`,
  31. output: `User has answered your questions: ${formatted}. You can now continue with the user's answers in mind.`,
  32. metadata: {
  33. answers,
  34. },
  35. }
  36. }).pipe(Effect.runPromise),
  37. }
  38. }),
  39. )