apply-skill.ts 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. import type { Tool } from "../types"
  2. import { getAllDeAiSkills } from "@/lib/novel/de-ai-skill-library"
  3. import type { DeAiSkillConfig } from "@/lib/novel/de-ai-skill-library"
  4. import type { UserSkill } from "@/lib/novel/skill-library"
  5. export function createApplySkillTool(
  6. getConfig: () => DeAiSkillConfig | null,
  7. getUserSkills?: () => UserSkill[] | null,
  8. ): Tool {
  9. return {
  10. name: "apply_skill",
  11. description: "应用写作 Skill。参数 skillName 为技能名称,或 skillId 为技能 ID。返回 Skill 的 prompt 模板内容,AI 可据此调整写作流程或输出风格。",
  12. category: "action",
  13. parameters: {
  14. skillName: { type: "string", description: "Skill 名称,例如「三翻四抖」或「去AI味」" },
  15. skillId: { type: "string", description: "Skill ID,可选,与 skillName 二选一" },
  16. },
  17. execute: async (params) => {
  18. const name = params.skillName as string | undefined
  19. const id = params.skillId as string | undefined
  20. const userSkill = getUserSkills?.()?.find((skill) => matchesSkill(skill, id, name))
  21. if (userSkill) {
  22. return `Skill「${userSkill.name}」的写作模板:\n\n${userSkill.content}`
  23. }
  24. const config = getConfig()
  25. if (!config) return "错误:技能库配置未加载"
  26. const skill = getAllDeAiSkills(config).find((item) => matchesSkill(item, id, name))
  27. if (!skill) return `错误:未找到 Skill「${name || id}」`
  28. return `Skill「${skill.name}」的写作模板:\n\n${skill.content}`
  29. },
  30. }
  31. }
  32. function matchesSkill(skill: { id: string; name: string }, id?: string, name?: string): boolean {
  33. return Boolean((id && skill.id === id) || (name && skill.name.includes(name)))
  34. }