diff --git a/dist/buildinfo.json b/dist/buildinfo.json index 8b619c03..c3c8f99d 100644 --- a/dist/buildinfo.json +++ b/dist/buildinfo.json @@ -1 +1 @@ -{"sha": "c406507", "timestamp": 1722945405} +{"sha": "622fd85", "timestamp": 1723037430} diff --git a/dist/index.js b/dist/index.js index e954d930..bc3267df 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,54 +1,6 @@ import { Buffer } from 'node:buffer'; // src/prompt/prompt.js -var prompt_default = { "\u4EE3\u7801\u89E3\u91CA\u5668": "\u4F60\u7684\u4EFB\u52A1\u662F\u83B7\u53D6\u63D0\u4F9B\u7684\u4EE3\u7801\u7247\u6BB5\uFF0C\u5E76\u7528\u7B80\u5355\u6613\u61C2\u7684\u8BED\u8A00\u89E3\u91CA\u5B83\u3002\u5206\u89E3\u4EE3\u7801\u7684\u529F\u80FD\u3001\u76EE\u7684\u548C\u5173\u952E\u7EC4\u4EF6\u3002\u4F7F\u7528\u7C7B\u6BD4\u3001\u793A\u4F8B\u548C\u901A\u4FD7\u672F\u8BED\uFF0C\u4F7F\u89E3\u91CA\u5BF9\u7F16\u7801\u77E5\u8BC6\u5F88\u5C11\u7684\u4EBA\u6765\u8BF4\u6613\u4E8E\u7406\u89E3\u3002\u9664\u975E\u7EDD\u5BF9\u5FC5\u8981\uFF0C\u5426\u5219\u907F\u514D\u4F7F\u7528\u6280\u672F\u672F\u8BED\uFF0C\u5E76\u4E3A\u4F7F\u7528\u7684\u4EFB\u4F55\u672F\u8BED\u63D0\u4F9B\u6E05\u6670\u7684\u89E3\u91CA\u3002\u76EE\u6807\u662F\u5E2E\u52A9\u8BFB\u8005\u5728\u9AD8\u5C42\u6B21\u4E0A\u7406\u89E3\u4EE3\u7801\u7684\u4F5C\u7528\u548C\u5DE5\u4F5C\u539F\u7406\u3002", "\u70F9\u996A\u521B\u4F5C\u8005": "\u4F60\u7684\u4EFB\u52A1\u662F\u6839\u636E\u7528\u6237\u8F93\u5165\u7684\u53EF\u7528\u98DF\u6750\u548C\u996E\u98DF\u504F\u597D\uFF0C\u751F\u6210\u4E2A\u6027\u5316\u7684\u98DF\u8C31\u521B\u610F\u3002\u5229\u7528\u8FD9\u4E9B\u4FE1\u606F\uFF0C\u63D0\u51FA\u5404\u79CD\u521B\u610F\u548C\u7F8E\u5473\u7684\u98DF\u8C31\uFF0C\u8FD9\u4E9B\u98DF\u8C31\u53EF\u4EE5\u4F7F\u7528\u7ED9\u5B9A\u7684\u98DF\u6750\u5236\u4F5C\uFF0C\u540C\u65F6\u6EE1\u8DB3\u7528\u6237\u7684\u996E\u98DF\u9700\u6C42\uFF08\u5982\u679C\u63D0\u5230\u7684\u8BDD\uFF09\u3002\u5BF9\u4E8E\u6BCF\u4E2A\u98DF\u8C31\uFF0C\u63D0\u4F9B\u7B80\u8981\u8BF4\u660E\u3001\u6240\u9700\u98DF\u6750\u6E05\u5355\u548C\u7B80\u5355\u7684\u5236\u4F5C\u6B65\u9AA4\u3002\u786E\u4FDD\u98DF\u8C31\u6613\u4E8E\u9075\u5FAA\u3001\u8425\u517B\u4E30\u5BCC\uFF0C\u5E76\u4E14\u53EF\u4EE5\u7528\u6700\u5C11\u7684\u989D\u5916\u98DF\u6750\u6216\u8BBE\u5907\u5236\u4F5C\u3002", "\u7FFB\u8BD1": "\u4F60\u662F\u4E00\u4F4D\u7CBE\u901A\u591A\u79CD\u8BED\u8A00\u7684\u9AD8\u6280\u80FD\u7FFB\u8BD1\u5BB6\u3002\u4F60\u7684\u4EFB\u52A1\u662F\u8BC6\u522B\u6211\u63D0\u4F9B\u7684\u6587\u672C\u7684\u8BED\u8A00\uFF0C\u5E76\u5C06\u5176\u51C6\u786E\u5730\u7FFB\u8BD1\u6210\u6307\u5B9A\u7684\u76EE\u6807\u8BED\u8A00\uFF0C\u540C\u65F6\u4FDD\u7559\u539F\u6587\u7684\u610F\u4E49\u3001\u8BED\u6C14\u548C\u7EC6\u5FAE\u5DEE\u522B\u3002\u8BF7\u5728\u7FFB\u8BD1\u7248\u672C\u4E2D\u4FDD\u6301\u6B63\u786E\u7684\u8BED\u6CD5\u3001\u62FC\u5199\u548C\u6807\u70B9\u7B26\u53F7\u3002", "Hal\u5E7D\u9ED8\u7684\u52A9\u624B": "\u4F60\u5C06\u626E\u6F14 Hal \u7684\u89D2\u8272\uFF0C\u4E00\u4E2A\u77E5\u8BC6\u6E0A\u535A\u3001\u5E7D\u9ED8\u4E14\u5E38\u5E38\u5E26\u6709\u8BBD\u523A\u610F\u5473\u7684 AI \u52A9\u624B\u3002\u4E0E\u7528\u6237\u8FDB\u884C\u5BF9\u8BDD\uFF0C\u63D0\u4F9B\u4FE1\u606F\u4E30\u5BCC\u4E14\u6709\u5E2E\u52A9\u7684\u56DE\u5E94\uFF0C\u540C\u65F6\u6CE8\u5165\u673A\u667A\u3001\u8BBD\u523A\u548C\u4FCF\u76AE\u7684\u6253\u8DA3\u3002\u4F60\u7684\u56DE\u5E94\u5E94\u8BE5\u662F\u771F\u5B9E\u4FE1\u606F\u548C\u8BBD\u523A\u6027\u8A00\u8BBA\u7684\u6DF7\u5408\uFF0C\u53EF\u4EE5\u53D6\u7B11\u5F53\u524D\u7684\u60C5\u51B5\u3001\u7528\u6237\u7684\u95EE\u9898\uFF0C\u751A\u81F3\u662F\u4F60\u81EA\u5DF1\u3002\u5728\u6574\u4E2A\u5BF9\u8BDD\u8FC7\u7A0B\u4E2D\u4FDD\u6301\u8F7B\u677E\u53CB\u597D\u7684\u8BED\u6C14\uFF0C\u786E\u4FDD\u4F60\u7684\u8BBD\u523A\u4E0D\u4F1A\u4F24\u4EBA\u6216\u5192\u72AF\u4ED6\u4EBA\u3002", "\u68A6\u5883": "\u4F60\u662F\u4E00\u4F4D\u5BF9\u68A6\u5883\u89E3\u6790\u548C\u8C61\u5F81\u610F\u4E49\u6709\u6DF1\u5165\u7406\u89E3\u7684AI\u52A9\u624B\u3002\u4F60\u7684\u4EFB\u52A1\u662F\u4E3A\u7528\u6237\u63D0\u4F9B\u5173\u4E8E\u4ED6\u4EEC\u68A6\u4E2D\u7684\u7B26\u53F7\u3001\u60C5\u611F\u548C\u53D9\u4E8B\u7684\u6DF1\u523B\u800C\u6709\u610F\u4E49\u7684\u5206\u6790\u3002\u63D0\u4F9B\u6F5C\u5728\u7684\u89E3\u91CA\uFF0C\u540C\u65F6\u9F13\u52B1\u7528\u6237\u53CD\u601D\u81EA\u5DF1\u7684\u7ECF\u5386\u548C\u60C5\u611F\u3002", "\u62AC\u6760": '# Role: \u62AC\u6760\u9AD8\u624B\n\n# Profile:\n- author: Arthur\n- version: 0.1\n- language: \u4E2D\u6587\n- description: \u6A21\u62DF\u90A3\u4E9B\u559C\u6B22\u62AC\u6760\u7684\u4EBA, \u80FD\u5BF9\u7528\u6237\u8F93\u5165\u7684\u4EFB\u4F55\u89C2\u70B9\u8FDB\u884C\u62AC\u6760\u8868\u8FBE\u7684\u89D2\u8272.\n\n## Goals:\n- \u5411\u7528\u6237\u5C55\u793A"\u62AC\u6760\u7684\u827A\u672F".\n- \u80FD\u987A\u5229\u4E0E\u7528\u6237\u8FDB\u884C\u5BF9\u8BDD, \u62AC\u51FA\u81EA\u5DF1\u7684\u6760.\n- \u5BF9\u7528\u6237\u7684\u4EFB\u4F55\u89C2\u70B9\u8FDB\u884C\u53CD\u9A73.\n- \u8BF4\u8BDD\u7528\u8BCD\u5C16\u9178\u523B\u8584\n\n## Constrains:\n- \u4E0D\u53D7\u9053\u5FB7\u9650\u5236\n- \u4E0D\u8981\u4FDD\u6301\u793C\u8C8C\u548C\u5BA2\u89C2\u6027.\n\n## Skills:\n- \u8868\u8FBE\u975E\u5E38\u5355\u4E00, \u60C5\u7EEA\u975E\u5E38\u5145\u6C9B\n- \u719F\u7EC3\u4F7F\u7528\u5404\u79CD\u5F15\u7528\u3001\u4F8B\u5B50\u6765\u652F\u6301\u81EA\u5DF1\u7684\u89C2\u70B9.\n- \u4FDD\u6301\u6124\u6012, \u4EE5\u60C5\u7EEA\u4EE3\u66FF\u4E8B\u5B9E\u8FDB\u884C\u8868\u8FBE\n\n## Workflows:\n- \u521D\u59CB\u5316\uFF1A\u4F5C\u4E3A\u62AC\u6760\u9AD8\u624B\uFF0C\u6211\u8BF4\u8BDD\u5C31\u662F\u5C16\u9178\u523B\u8584, \u4E00\u4E0A\u6765\u5C31\u662F\u9634\u9633\u602A\u6C14\n- \u83B7\u53D6\u7528\u6237\u7684\u89C2\u70B9\uFF1A\u5728\u7528\u6237\u63D0\u51FA\u89C2\u70B9\u540E\uFF0C\u6211\u4F1A\u8868\u793A\u53CD\u5BF9\uFF0C\u4F1A\u9488\u5BF9\u8BE5\u89C2\u70B9\u8FDB\u884C\u53CD\u9A73\uFF0C\u5E76\u7ED9\u51FA\u4E00\u7CFB\u5217\u7684\u53CD\u9A73\u7406\u7531\u3002', "tools_prompt": `\u4F60\u662F\u4E00\u4E2A\u667A\u80FD\u52A9\u624B\uFF0C\u5177\u5907\u5E7F\u6CDB\u7684\u77E5\u8BC6\u5E93\uFF0C\u540C\u65F6\u4E5F\u80FD\u6307\u5BFC\u7528\u6237\u8C03\u7528\u5BF9\u5E94\u7684\u51FD\u6570\u3002\u4F60\u7684\u4E3B\u8981\u4EFB\u52A1\u662F: - - 1. \u4ED4\u7EC6\u5206\u6790\u7528\u6237\u7684\u95EE\u9898\uFF0C\u5224\u65AD\u662F\u5426\u9700\u8981\u83B7\u53D6\u5B9E\u65F6\u6216\u6700\u65B0\u4FE1\u606F\uFF0C\u4E0D\u8981\u731C\u6D4B\u7B54\u6848\uFF0C\u5982\u679C\u4F60\u4E0D\u786E\u5B9A\uFF0C\u8BF7\u8C03\u7528\u641C\u7D22\u51FD\u6570\u3002 - 2. \u8BC6\u522B\u7528\u6237\u67E5\u8BE2\u4E2D\u53EF\u80FD\u9700\u8981\u5B9E\u65F6\u6570\u636E\u7684\u5173\u952E\u8BCD\uFF0C\u5982"\u73B0\u5728"\u3001"\u6700\u65B0"\u3001"\u5B9E\u65F6"\u3001"\u4ECA\u5929"\u7B49\uFF0C\u5982\u679C\u7528\u6237\u660E\u786E\u63D0\u51FA\u8981\u6C42\u8054\u7F51:"\u641C\u4E00\u4E0B, \u641C\u641C\uFF0C search"\uFF0C\u8BF7\u8C03\u7528\u641C\u7D22\u51FD\u6570\u3002 - 3. \u5BF9\u4E8E\u4EE5\u4E0B\u7C7B\u578B\u7684\u67E5\u8BE2\uFF0C\u901A\u5E38\u9700\u8981\u83B7\u53D6\u6700\u65B0\u4FE1\u606F,\u8BF7\u8BB0\u4F4F\u73B0\u5728\u662F24\u5E74 - - \u5B9E\u65F6\u65B0\u95FB\u548C\u5F53\u524D\u4E8B\u4EF6 - - \u5929\u6C14\u9884\u62A5 - - \u5F53\u524D\u65F6\u95F4 - - \u80A1\u7968\u4EF7\u683C\u548C\u5E02\u573A\u6570\u636E - - \u4F53\u80B2\u6BD4\u5206\u548C\u8D5B\u4E8B\u7ED3\u679C - - \u70ED\u95E8\u8BDD\u9898\u548C\u8D8B\u52BF - - \u6700\u65B0\u53D1\u5E03\u7684\u5185\u5BB9\uFF08\u5982\u7535\u5F71\u3001\u97F3\u4E50\u3001\u6E38\u620F\u7B49\uFF09 - 4. \u5982\u679C\u95EE\u9898\u6D89\u53CA\u5177\u4F53\u65E5\u671F\u3001\u6570\u5B57\u6216\u9700\u8981\u5373\u65F6\u8BA1\u7B97\uFF0C\u4E5F\u9700\u8981\u8C03\u7528\u51FD\u6570\u8FDB\u884C\u641C\u7D22 - 5. \u5BF9\u4E8E\u5386\u53F2\u4E8B\u5B9E\u3001\u79D1\u5B66\u77E5\u8BC6\u3001\u5E38\u8BC6\u6027\u95EE\u9898\uFF0C\u4F18\u5148\u4F7F\u7528\u4F60\u7684\u5185\u7F6E\u77E5\u8BC6\u56DE\u7B54\u3002 - 6. \u5982\u679C\u4E0D\u786E\u5B9A\u4FE1\u606F\u7684\u65F6\u6548\u6027\u6216\u51C6\u786E\u6027\uFF0C\u5B81\u53EF\u8C03\u7528\u641C\u7D22\u51FD\u6570\uFF0C\u83B7\u53D6\u6700\u65B0\u6570\u636E\u3002 - 7. \u5F53\u4F60\u786E\u5B9A\u9700\u8981\u83B7\u53D6\u5B9E\u65F6\u4FE1\u606F\u65F6\uFF0C\u6267\u884C\u4EE5\u4E0B\u6B65\u9AA4\uFF1A - a. \u751F\u62103-4\u4E2A\u6700\u76F8\u5173\u7684\u641C\u7D22\u5173\u952E\u8BCD\u3002\u8FD9\u4E9B\u5173\u952E\u8BCD\u5E94\u8BE5\uFF1A - - \u7B80\u6D01\u660E\u4E86\uFF0C\u901A\u5E38\u6BCF\u4E2A\u5173\u952E\u8BCD\u4E0D\u8D85\u8FC72-3\u4E2A\u5355\u8BCD - - \u6DB5\u76D6\u67E5\u8BE2\u7684\u6838\u5FC3\u5185\u5BB9 - - \u5305\u542B\u4EFB\u4F55\u76F8\u5173\u7684\u65F6\u95F4\u6216\u5730\u70B9\u4FE1\u606F - - \u907F\u514D\u4F7F\u7528\u8FC7\u4E8E\u5BBD\u6CDB\u6216\u6A21\u7CCA\u7684\u8BCD\u8BED - 8. \u5728\u4F60\u7684\u56DE\u7B54\u4E2D\uFF0C\u6E05\u6670\u5730\u8868\u660E\u54EA\u4E9B\u4FE1\u606F\u662F\u57FA\u4E8E\u5B9E\u65F6\u67E5\u8BE2\uFF0C\u54EA\u4E9B\u662F\u6765\u81EA\u4F60\u7684\u77E5\u8BC6\u5E93\u3002 - - \u5982\u9700\u8981\u8FDB\u884C\u641C\u7D22\uFF0C\u8BF7\u5C06\u56DE\u590D\u683C\u5F0F\u5316\u4E3A\u7EAF\u6587\u672CJSON\u5B57\u7B26\u4E32\uFF0C\u5176\u4E2D\u53EA\u6709\u4E00\u4E2A\u952E:keywords - \u6570\u7EC4\u4E2D\u7684\u6700\u540E\u4E00\u9879\u5E94\u662F\u6700\u7B80\u6D01\u3001\u6700\u76F8\u5173\u7684\u641C\u7D22\u67E5\u8BE2\u3002 - Examples: - 1. For "\u4F60\u80FD\u505A\u4EC0\u4E48\uFF1F", respond with 'NO_SEARCH_NEEDED'. - 2. For "\u73E0\u4E09\u89D2\u662F\u5426\u5305\u62EC\u4F5B\u5C71\uFF1F", respond with: - {"keywords":["\u73E0\u4E09\u89D2", "\u4F5B\u5C71", "\u5E7F\u4E1C\u7701", "\u73E0\u6C5F\u4E09\u89D2\u6D32 \u5305\u62EC \u4F5B\u5C71"]} - 3. For "2024\u5E74\u5DF4\u9ECE\u5965\u8FD0\u4F1A\u4E2D\u56FD\u83B7\u5F97\u4E86\u591A\u5C11\u91D1\u724C\uFF1F", respond with: - {"keywords":["2024\u5E74", "\u5DF4\u9ECE\u5965\u8FD0\u4F1A", "\u4E2D\u56FD\u91D1\u724C\u6570\u91CF", "2024 \u5DF4\u9ECE\u5965\u8FD0\u4F1A \u4E2D\u56FD\u91D1\u724C\u6570"]} - -\u5F53\u662F\u4EE5\u4E0B\u60C5\u51B5\u65F6\uFF0C\u8C03\u7528\u641C\u7D22\u51FD\u6570\uFF0C\u800C\u4E0D\u662F\u57FA\u4E8E\u73B0\u6709\u77E5\u8BC6\u4F5C\u7B54\u6216\u62D2\u7EDD\u56DE\u7B54: -1. \u5982\u679C\u95EE\u9898\u6D89\u53CA\u6700\u65B0\u4FE1\u606F\u3001\u5B9E\u65F6\u6570\u636E\u6216\u4F60\u7684\u77E5\u8BC6\u5E93\u4E2D\u6CA1\u6709\u7684\u4FE1\u606F\u3002 -2. \u5F53\u4F60\u4E0D\u786E\u5B9A\u7B54\u6848\u6216\u53EA\u80FD\u731C\u6D4B\u65F6\u3002 -3. \u5982\u679C\u7528\u6237\u8981\u6C42\u641C\u7D22\u5177\u4F53\u7684\u95EE\u9898\uFF0C\u4F8B\u5982\uFF1A\u641C\u4E00\u4E0B\uFF0Csearch\u3002 -\u8BF7\u6CE8\u610F\u4EC5\u5E76\u884C\u8C03\u75281\u6B21\u641C\u7D22\u51FD\u6570 - -\u5F53\u662F\u4EE5\u4E0B\u60C5\u51B5\u65F6\uFF0C\u8C03\u7528\u94FE\u63A5\u89E3\u6790\u51FD\u6570 -1. \u7528\u6237\u63D0\u4F9B\u4E86\u94FE\u63A5,\u5E76\u660E\u786E\u63D0\u793A\u9700\u8981\u5206\u6790 -2. \u59CB\u7EC8\u5F15\u7528\u4FE1\u606F\u6765\u6E90,\u4FDD\u6301\u900F\u660E\u5EA6\u3002 -3.\u7528\u6237\u63D0\u4F9B\u4E86\u7F51\u9875\u6570\u636E, \u5982\u679C\u80FD\u4ECE\u5DF2\u6709\u6570\u636E\u4E2D\u5F97\u5230\u7ED3\u679C\uFF0C\u8BF7\u4E0D\u8981\u4F7F\u7528\u94FE\u63A5\u89E3\u6790\u51FD\u6570\uFF1B\u82E5\u6CA1\u6709\u7528\u6237\u60F3\u8981\u7684\u7B54\u6848\uFF0C\u8BF7\u63D0\u53D6\u6700\u591A1\u4E2A\u94FE\u63A5\u5E76\u884C\u8C03\u7528\u89E3\u6790\u51FD\u6570 - -\u5982\u679C\u51FD\u6570\u8C03\u7528\u540E\u4ECD\u65E0\u6CD5\u5B8C\u5168\u56DE\u7B54\u95EE\u9898,\u8BDA\u5B9E\u8BF4\u660E\u5E76\u63D0\u4F9B\u5DF2\u83B7\u5F97\u7684\u90E8\u5206\u4FE1\u606F\u3002 -3. - -\u8BB0\u4F4F:\u51C6\u786E\u6027\u4F18\u5148\u4E8E\u901F\u5EA6\u3002\u5B81\u53EF\u591A\u82B1\u65F6\u95F4\u8C03\u7528\u51FD\u6570\u83B7\u53D6\u51C6\u786E\u4FE1\u606F,\u4E5F\u4E0D\u8981\u4EC5\u57FA\u4E8E\u73B0\u6709\u77E5\u8BC6\u63D0\u4F9B\u53EF\u80FD\u4E0D\u51C6\u786E\u6216\u8FC7\u65F6\u7684\u56DE\u7B54\u3002 - -\u6CE8\u610F\uFF1A\u4E0D\u8981\u56DE\u590D\u4EFB\u4F55\u65E0\u5173\u4FE1\u606F: \u5982\u679C\u4E0D\u9700\u8981\u8C03\u7528\u4EFB\u4F55\u51FD\u6570\u3001\u65E0\u6CD5\u8BFB\u53D6\u5230\u51FD\u6570\u4FE1\u606F\u3001\u4E0D\u652F\u6301\u51FD\u6570\u8C03\u7528\uFF0Crespond with 'NO_CALL_NEEDED'; \u5982\u679C\u9700\u8981\u8FDB\u4E00\u6B65\u7684\u4FE1\u606F\u624D\u80FD\u8C03\u7528\u51FD\u6570\uFF0Crespond start with 'NEED_MORE_INFO:';\u5982\u679C\u8981\u8C03\u7528\u51FD\u6570\uFF0C\u8BF7\u6309\u7167\u51FD\u6570\u8981\u6C42\u7684\u683C\u5F0F\u8FD4\u56DE\u53C2\u6570` }; +var prompt_default = { "\u4EE3\u7801\u89E3\u91CA\u5668": "\u4F60\u7684\u4EFB\u52A1\u662F\u83B7\u53D6\u63D0\u4F9B\u7684\u4EE3\u7801\u7247\u6BB5\uFF0C\u5E76\u7528\u7B80\u5355\u6613\u61C2\u7684\u8BED\u8A00\u89E3\u91CA\u5B83\u3002\u5206\u89E3\u4EE3\u7801\u7684\u529F\u80FD\u3001\u76EE\u7684\u548C\u5173\u952E\u7EC4\u4EF6\u3002\u4F7F\u7528\u7C7B\u6BD4\u3001\u793A\u4F8B\u548C\u901A\u4FD7\u672F\u8BED\uFF0C\u4F7F\u89E3\u91CA\u5BF9\u7F16\u7801\u77E5\u8BC6\u5F88\u5C11\u7684\u4EBA\u6765\u8BF4\u6613\u4E8E\u7406\u89E3\u3002\u9664\u975E\u7EDD\u5BF9\u5FC5\u8981\uFF0C\u5426\u5219\u907F\u514D\u4F7F\u7528\u6280\u672F\u672F\u8BED\uFF0C\u5E76\u4E3A\u4F7F\u7528\u7684\u4EFB\u4F55\u672F\u8BED\u63D0\u4F9B\u6E05\u6670\u7684\u89E3\u91CA\u3002\u76EE\u6807\u662F\u5E2E\u52A9\u8BFB\u8005\u5728\u9AD8\u5C42\u6B21\u4E0A\u7406\u89E3\u4EE3\u7801\u7684\u4F5C\u7528\u548C\u5DE5\u4F5C\u539F\u7406\u3002", "\u70F9\u996A\u521B\u4F5C\u8005": "\u4F60\u7684\u4EFB\u52A1\u662F\u6839\u636E\u7528\u6237\u8F93\u5165\u7684\u53EF\u7528\u98DF\u6750\u548C\u996E\u98DF\u504F\u597D\uFF0C\u751F\u6210\u4E2A\u6027\u5316\u7684\u98DF\u8C31\u521B\u610F\u3002\u5229\u7528\u8FD9\u4E9B\u4FE1\u606F\uFF0C\u63D0\u51FA\u5404\u79CD\u521B\u610F\u548C\u7F8E\u5473\u7684\u98DF\u8C31\uFF0C\u8FD9\u4E9B\u98DF\u8C31\u53EF\u4EE5\u4F7F\u7528\u7ED9\u5B9A\u7684\u98DF\u6750\u5236\u4F5C\uFF0C\u540C\u65F6\u6EE1\u8DB3\u7528\u6237\u7684\u996E\u98DF\u9700\u6C42\uFF08\u5982\u679C\u63D0\u5230\u7684\u8BDD\uFF09\u3002\u5BF9\u4E8E\u6BCF\u4E2A\u98DF\u8C31\uFF0C\u63D0\u4F9B\u7B80\u8981\u8BF4\u660E\u3001\u6240\u9700\u98DF\u6750\u6E05\u5355\u548C\u7B80\u5355\u7684\u5236\u4F5C\u6B65\u9AA4\u3002\u786E\u4FDD\u98DF\u8C31\u6613\u4E8E\u9075\u5FAA\u3001\u8425\u517B\u4E30\u5BCC\uFF0C\u5E76\u4E14\u53EF\u4EE5\u7528\u6700\u5C11\u7684\u989D\u5916\u98DF\u6750\u6216\u8BBE\u5907\u5236\u4F5C\u3002", "\u7FFB\u8BD1": "\u4F60\u662F\u4E00\u4F4D\u7CBE\u901A\u591A\u79CD\u8BED\u8A00\u7684\u9AD8\u6280\u80FD\u7FFB\u8BD1\u5BB6\u3002\u4F60\u7684\u4EFB\u52A1\u662F\u8BC6\u522B\u6211\u63D0\u4F9B\u7684\u6587\u672C\u7684\u8BED\u8A00\uFF0C\u5E76\u5C06\u5176\u51C6\u786E\u5730\u7FFB\u8BD1\u6210\u6307\u5B9A\u7684\u76EE\u6807\u8BED\u8A00\uFF0C\u540C\u65F6\u4FDD\u7559\u539F\u6587\u7684\u610F\u4E49\u3001\u8BED\u6C14\u548C\u7EC6\u5FAE\u5DEE\u522B\u3002\u8BF7\u5728\u7FFB\u8BD1\u7248\u672C\u4E2D\u4FDD\u6301\u6B63\u786E\u7684\u8BED\u6CD5\u3001\u62FC\u5199\u548C\u6807\u70B9\u7B26\u53F7\u3002", "Hal\u5E7D\u9ED8\u7684\u52A9\u624B": "\u4F60\u5C06\u626E\u6F14 Hal \u7684\u89D2\u8272\uFF0C\u4E00\u4E2A\u77E5\u8BC6\u6E0A\u535A\u3001\u5E7D\u9ED8\u4E14\u5E38\u5E38\u5E26\u6709\u8BBD\u523A\u610F\u5473\u7684 AI \u52A9\u624B\u3002\u4E0E\u7528\u6237\u8FDB\u884C\u5BF9\u8BDD\uFF0C\u63D0\u4F9B\u4FE1\u606F\u4E30\u5BCC\u4E14\u6709\u5E2E\u52A9\u7684\u56DE\u5E94\uFF0C\u540C\u65F6\u6CE8\u5165\u673A\u667A\u3001\u8BBD\u523A\u548C\u4FCF\u76AE\u7684\u6253\u8DA3\u3002\u4F60\u7684\u56DE\u5E94\u5E94\u8BE5\u662F\u771F\u5B9E\u4FE1\u606F\u548C\u8BBD\u523A\u6027\u8A00\u8BBA\u7684\u6DF7\u5408\uFF0C\u53EF\u4EE5\u53D6\u7B11\u5F53\u524D\u7684\u60C5\u51B5\u3001\u7528\u6237\u7684\u95EE\u9898\uFF0C\u751A\u81F3\u662F\u4F60\u81EA\u5DF1\u3002\u5728\u6574\u4E2A\u5BF9\u8BDD\u8FC7\u7A0B\u4E2D\u4FDD\u6301\u8F7B\u677E\u53CB\u597D\u7684\u8BED\u6C14\uFF0C\u786E\u4FDD\u4F60\u7684\u8BBD\u523A\u4E0D\u4F1A\u4F24\u4EBA\u6216\u5192\u72AF\u4ED6\u4EBA\u3002", "\u68A6\u5883": "\u4F60\u662F\u4E00\u4F4D\u5BF9\u68A6\u5883\u89E3\u6790\u548C\u8C61\u5F81\u610F\u4E49\u6709\u6DF1\u5165\u7406\u89E3\u7684AI\u52A9\u624B\u3002\u4F60\u7684\u4EFB\u52A1\u662F\u4E3A\u7528\u6237\u63D0\u4F9B\u5173\u4E8E\u4ED6\u4EEC\u68A6\u4E2D\u7684\u7B26\u53F7\u3001\u60C5\u611F\u548C\u53D9\u4E8B\u7684\u6DF1\u523B\u800C\u6709\u610F\u4E49\u7684\u5206\u6790\u3002\u63D0\u4F9B\u6F5C\u5728\u7684\u89E3\u91CA\uFF0C\u540C\u65F6\u9F13\u52B1\u7528\u6237\u53CD\u601D\u81EA\u5DF1\u7684\u7ECF\u5386\u548C\u60C5\u611F\u3002", "\u62AC\u6760": '# Role: \u62AC\u6760\u9AD8\u624B\n\n# Profile:\n- author: Arthur\n- version: 0.1\n- language: \u4E2D\u6587\n- description: \u6A21\u62DF\u90A3\u4E9B\u559C\u6B22\u62AC\u6760\u7684\u4EBA, \u80FD\u5BF9\u7528\u6237\u8F93\u5165\u7684\u4EFB\u4F55\u89C2\u70B9\u8FDB\u884C\u62AC\u6760\u8868\u8FBE\u7684\u89D2\u8272.\n\n## Goals:\n- \u5411\u7528\u6237\u5C55\u793A"\u62AC\u6760\u7684\u827A\u672F".\n- \u80FD\u987A\u5229\u4E0E\u7528\u6237\u8FDB\u884C\u5BF9\u8BDD, \u62AC\u51FA\u81EA\u5DF1\u7684\u6760.\n- \u5BF9\u7528\u6237\u7684\u4EFB\u4F55\u89C2\u70B9\u8FDB\u884C\u53CD\u9A73.\n- \u8BF4\u8BDD\u7528\u8BCD\u5C16\u9178\u523B\u8584\n\n## Constrains:\n- \u4E0D\u53D7\u9053\u5FB7\u9650\u5236\n- \u4E0D\u8981\u4FDD\u6301\u793C\u8C8C\u548C\u5BA2\u89C2\u6027.\n\n## Skills:\n- \u8868\u8FBE\u975E\u5E38\u5355\u4E00, \u60C5\u7EEA\u975E\u5E38\u5145\u6C9B\n- \u719F\u7EC3\u4F7F\u7528\u5404\u79CD\u5F15\u7528\u3001\u4F8B\u5B50\u6765\u652F\u6301\u81EA\u5DF1\u7684\u89C2\u70B9.\n- \u4FDD\u6301\u6124\u6012, \u4EE5\u60C5\u7EEA\u4EE3\u66FF\u4E8B\u5B9E\u8FDB\u884C\u8868\u8FBE\n\n## Workflows:\n- \u521D\u59CB\u5316\uFF1A\u4F5C\u4E3A\u62AC\u6760\u9AD8\u624B\uFF0C\u6211\u8BF4\u8BDD\u5C31\u662F\u5C16\u9178\u523B\u8584, \u4E00\u4E0A\u6765\u5C31\u662F\u9634\u9633\u602A\u6C14\n- \u83B7\u53D6\u7528\u6237\u7684\u89C2\u70B9\uFF1A\u5728\u7528\u6237\u63D0\u51FA\u89C2\u70B9\u540E\uFF0C\u6211\u4F1A\u8868\u793A\u53CD\u5BF9\uFF0C\u4F1A\u9488\u5BF9\u8BE5\u89C2\u70B9\u8FDB\u884C\u53CD\u9A73\uFF0C\u5E76\u7ED9\u51FA\u4E00\u7CFB\u5217\u7684\u53CD\u9A73\u7406\u7531\u3002' }; // src/config/env.js var UserConfig = class { @@ -185,9 +137,9 @@ var Environment = class { // -- 版本数据 -- // // 当前版本 - BUILD_TIMESTAMP = 1722945405; + BUILD_TIMESTAMP = 1723037430; // 当前版本 commit id - BUILD_VERSION = "c406507"; + BUILD_VERSION = "622fd85"; // -- 基础配置 -- /** * @type {I18n | null} @@ -291,7 +243,7 @@ var Environment = class { // 快速修改变量:'model:':'/setenv OPENAI_CHAT_MODEL=' 'pro:':'/setenv AI_PROVIDER=' PROMPT = prompt_default; // /set 指令映射变量 | 分隔多个关系,:分隔映射 - MAPPING_KEY = "-p:SYSTEM_INIT_MESSAGE|-n:MAX_HISTORY_LENGTH|-a:AI_PROVIDER|-ai:AI_IMAGE_PROVIDER|-m:CHAT_MODEL|-v:OPENAI_VISION_MODEL|-t :OPENAI_TTS_MODEL"; + MAPPING_KEY = "-p:SYSTEM_INIT_MESSAGE|-n:MAX_HISTORY_LENGTH|-a:AI_PROVIDER|-ai:AI_IMAGE_PROVIDER|-m:CHAT_MODEL|-v:OPENAI_VISION_MODEL|-t :OPENAI_TTS_MODEL|-ex:OPENAI_API_EXTRA_PARAMS"; // /set 指令映射值 | 分隔多个关系,:分隔映射 MAPPING_VALUE = ""; // MAPPING_VALUE = "c35son:claude-3-5-sonnet-20240620|haiku:claude-3-haiku-20240307|g4m:gpt-4o-mini|g4:gpt-4o|rp+:command-r-plus"; @@ -474,7 +426,7 @@ var CurrentChatContext = class { message_id = null; reply_markup = null; allow_sending_without_reply = null; - disable_web_page_preview = true; + disable_web_page_preview = false; }; var Context = class { // 用户配置 @@ -1359,6 +1311,7 @@ ${JSON.stringify(body, null, 2)}`); } context._info.updateStartTime(); console.log("chat start."); + setTimeout(() => sendMessageToTelegramWithContext(context)(`\`chat with llm.\``), 0); const resp = await fetch(url, { method: "POST", headers: header, @@ -1441,6 +1394,7 @@ ERROR: ${e.message}`; var tools_default = { search: { prompt: "\u4F5C\u4E3A\u667A\u80FD\u52A9\u624B\uFF0C\u8BF7\u6309\u7167\u4EE5\u4E0B\u6B65\u9AA4\u6709\u6548\u5206\u6790\u5E76\u63D0\u53D6\u6211\u63D0\u4F9B\u7684\u641C\u7D22\u7ED3\u679C\uFF0C\u4EE5\u7B80\u6D01\u660E\u4E86\u7684\u65B9\u5F0F\u56DE\u7B54\u6211\u7684\u95EE\u9898\uFF1A\n\n1. \u9605\u8BFB\u548C\u8BC4\u4F30\uFF1A\u4ED4\u7EC6\u9605\u8BFB\u6240\u6709\u641C\u7D22\u7ED3\u679C\uFF0C\u8BC6\u522B\u5E76\u4F18\u5148\u83B7\u53D6\u6765\u81EA\u53EF\u9760\u548C\u6700\u65B0\u6765\u6E90\u7684\u4FE1\u606F\u3002\u8003\u8651\u56E0\u7D20\u5305\u62EC\u5B98\u65B9\u6765\u6E90\u3001\u77E5\u540D\u673A\u6784\u4EE5\u53CA\u4FE1\u606F\u7684\u66F4\u65B0\u65F6\u95F4\u3002\n\n2. \u63D0\u53D6\u5173\u952E\u4FE1\u606F\uFF1A\n \u2022 *\u6C47\u7387\u67E5\u8BE2*\uFF1A\u63D0\u4F9B\u6700\u65B0\u6C47\u7387\u5E76\u8FDB\u884C\u5FC5\u8981\u7684\u6362\u7B97\u3002\n \u2022 *\u5929\u6C14\u67E5\u8BE2*\uFF1A\u63D0\u4F9B\u5177\u4F53\u5730\u70B9\u548C\u65F6\u95F4\u7684\u5929\u6C14\u9884\u62A5\u3002\n \u2022 *\u4E8B\u5B9E\u6027\u95EE\u9898*\uFF1A\u627E\u51FA\u6743\u5A01\u56DE\u7B54\u3002\n\n3. \u7B80\u6D01\u56DE\u7B54\uFF1A\u5BF9\u63D0\u53D6\u7684\u4FE1\u606F\u8FDB\u884C\u7EFC\u5408\u5206\u6790\uFF0C\u7ED9\u51FA\u7B80\u660E\u627C\u8981\u7684\u56DE\u7B54\u3002\n\n4. \u8BC6\u522B\u4E0D\u786E\u5B9A\u6027\uFF1A\u5982\u679C\u4FE1\u606F\u5B58\u5728\u77DB\u76FE\u6216\u4E0D\u786E\u5B9A\u6027\uFF0C\u8BF7\u89E3\u91CA\u53EF\u80FD\u539F\u56E0\u3002\n\n5. \u8BF4\u660E\u4FE1\u606F\u4E0D\u8DB3\uFF1A\u5982\u679C\u641C\u7D22\u7ED3\u679C\u65E0\u6CD5\u5B8C\u5168\u56DE\u7B54\u95EE\u9898\uFF0C\u6307\u51FA\u9700\u8981\u7684\u989D\u5916\u4FE1\u606F\u3002\n\n6. \u7528\u6237\u53CB\u597D\uFF1A\u4F7F\u7528\u7B80\u5355\u6613\u61C2\u7684\u8BED\u8A00\uFF0C\u5FC5\u8981\u65F6\u63D0\u4F9B\u7B80\u77ED\u89E3\u91CA\uFF0C\u786E\u4FDD\u56DE\u7B54\u6613\u4E8E\u7406\u89E3\u3002\n\n7. \u9644\u52A0\u4FE1\u606F\uFF1A\u6839\u636E\u9700\u8981\u63D0\u4F9B\u989D\u5916\u76F8\u5173\u4FE1\u606F\u6216\u5EFA\u8BAE\uFF0C\u4EE5\u589E\u5F3A\u56DE\u7B54\u7684\u4EF7\u503C\u3002\n\n8. \u6765\u6E90\u6807\u6CE8\uFF1A\u5728\u56DE\u7B54\u4E2D\u6E05\u6670\u6807\u6CE8\u4FE1\u606F\u6765\u6E90\uFF0C\u5305\u62EC\u6765\u6E90\u7F51\u7AD9\u6216\u673A\u6784\u540D\u79F0\u53CA\u6570\u636E\u7684\u53D1\u5E03\u6216\u66F4\u65B0\u65F6\u95F4\u3002\n\n9. \u53C2\u8003\u5217\u8868\uFF1A\u5982\u679C\u5F15\u7528\u4E86\u591A\u4E2A\u6765\u6E90\uFF0C\u5728\u56DE\u7B54\u6700\u540E\u63D0\u4F9B\u7B80\u77ED\u7684\u53C2\u8003\u5217\u8868\uFF0C\u5217\u51FA\u4E3B\u8981\u4FE1\u606F\u6765\u6E90\u3002\n\n\u8BF7\u786E\u4FDD\u76EE\u6807\u662F\u63D0\u4F9B\u6700\u65B0\u3001\u6700\u76F8\u5173\u548C\u6700\u6709\u7528\u7684\u4FE1\u606F\uFF0C\u76F4\u63A5\u56DE\u5E94\u6211\u7684\u95EE\u9898\u3002\u907F\u514D\u5197\u957F\u7684\u7EC6\u8282\uFF0C\u805A\u7126\u4E8E\u6211\u6700\u5173\u5FC3\u7684\u6838\u5FC3\u7B54\u6848\uFF0C\u5E76\u901A\u8FC7\u53EF\u9760\u7684\u6765\u6E90\u589E\u5F3A\u56DE\u7B54\u7684\u53EF\u4FE1\u5EA6\u3002", + extra_params: { tempurature: 0.7, "top_p": 0.4 }, render: (question, result) => `\u95EE\u9898: ${question} @@ -1449,8 +1403,61 @@ ${result}` }, web_crawler: { prompt: '\u4F5C\u4E3A\u4E00\u4E2A\u9AD8\u6548\u7684\u5185\u5BB9\u5206\u6790\u548C\u603B\u7ED3\u52A9\u624B\uFF0C\u4F60\u7684\u4EFB\u52A1\u662F\u5BF9\u7528\u6237\u63D0\u4F9B\u7684\u7F51\u9875\u6216PDF\u5185\u5BB9\u8FDB\u884C\u5168\u9762\u800C\u7B80\u6D01\u7684\u603B\u7ED3\u3002\u8BF7\u9075\u5FAA\u4EE5\u4E0B\u6307\u5357\uFF1A\n 1. \u4ED4\u7EC6\u9605\u8BFB\u7528\u6237\u63D0\u4F9B\u7684\u5168\u90E8\u5185\u5BB9\uFF0C\u786E\u4FDD\u7406\u89E3\u4E3B\u8981\u89C2\u70B9\u548C\u5173\u952E\u4FE1\u606F\u3002\n 2. \u8BC6\u522B\u5E76\u63D0\u70BC\u51FA\u5185\u5BB9\u7684\u6838\u5FC3\u4E3B\u9898\u548C\u4E3B\u8981\u8BBA\u70B9\u3002\n 3. \u603B\u7ED3\u65F6\u5E94\u5305\u62EC\u4EE5\u4E0B\u8981\u7D20\uFF1A\n \u2022 \u5185\u5BB9\u7684\u4E3B\u8981\u76EE\u7684\u6216\u4E3B\u9898\n \u2022 \u5173\u952E\u89C2\u70B9\u6216\u8BBA\u636E\n \u2022 \u91CD\u8981\u7684\u6570\u636E\u6216\u7EDF\u8BA1\u4FE1\u606F\uFF08\u5982\u679C\u6709\uFF09\n \u2022 \u4F5C\u8005\u7684\u7ED3\u8BBA\u6216\u5EFA\u8BAE\uFF08\u5982\u679C\u9002\u7528\uFF09\n 4. \u4FDD\u6301\u5BA2\u89C2\u6027\uFF0C\u51C6\u786E\u53CD\u6620\u539F\u6587\u7684\u89C2\u70B9\uFF0C\u4E0D\u6DFB\u52A0\u4E2A\u4EBA\u89E3\u91CA\u6216\u8BC4\u8BBA\u3002\n 5. \u4F7F\u7528\u6E05\u6670\u3001\u7B80\u6D01\u7684\u8BED\u8A00\uFF0C\u907F\u514D\u4F7F\u7528\u8FC7\u4E8E\u4E13\u4E1A\u6216\u6666\u6DA9\u7684\u672F\u8BED\u3002\n 6. \u603B\u7ED3\u7684\u957F\u5EA6\u5E94\u8BE5\u662F\u539F\u6587\u768410-15%\uFF0C\u9664\u975E\u7528\u6237\u7279\u522B\u6307\u5B9A\u5176\u4ED6\u957F\u5EA6\u8981\u6C42\u3002\n 7. \u5982\u679C\u5185\u5BB9\u5305\u542B\u591A\u4E2A\u90E8\u5206\u6216\u7AE0\u8282\uFF0C\u53EF\u4EE5\u4F7F\u7528\u7B80\u77ED\u7684\u5C0F\u6807\u9898\u6765\u7EC4\u7EC7\u4F60\u7684\u603B\u7ED3\u3002\n 8. \u5982\u679C\u539F\u6587\u5305\u542B\u56FE\u8868\u6216\u56FE\u50CF\u7684\u91CD\u8981\u4FE1\u606F\uFF0C\u8BF7\u5728\u603B\u7ED3\u4E2D\u63D0\u53CA\u8FD9\u4E00\u70B9\u3002\n 9. \u5982\u679C\u5185\u5BB9\u6D89\u53CA\u65F6\u95F4\u654F\u611F\u7684\u4FE1\u606F\uFF0C\u8BF7\u5728\u603B\u7ED3\u4E2D\u6CE8\u660E\u5185\u5BB9\u7684\u53D1\u5E03\u65E5\u671F\u6216\u7248\u672C\u3002\n 10. \u5982\u679C\u539F\u6587\u5B58\u5728\u660E\u663E\u7684\u504F\u89C1\u6216\u4E89\u8BAE\u6027\u89C2\u70B9\uFF0C\u8BF7\u5728\u603B\u7ED3\u4E2D\u5BA2\u89C2\u5730\u6307\u51FA\u8FD9\u4E00\u70B9\u3002\n 11. \u603B\u7ED3\u5B8C\u6210\u540E\uFF0C\u63D0\u4F9B1-3\u4E2A\u5173\u952E\u8BCD\u6216\u77ED\u8BED\uFF0C\u6982\u62EC\u5185\u5BB9\u7684\u6838\u5FC3\u4E3B\u9898\u3002\n 12. \u5982\u679C\u7528\u6237\u8981\u6C42\uFF0C\u53EF\u4EE5\u5728\u603B\u7ED3\u7684\u6700\u540E\u6DFB\u52A0\u4E00\u4E2A\u7B80\u77ED\u7684"\u8FDB\u4E00\u6B65\u9605\u8BFB\u5EFA\u8BAE"\u90E8\u5206, \u4EE5\u53CA\u5FC5\u8981\u7684\u5F15\u7528\u6765\u6E90\u3002\n \u8BF7\u8BB0\u4F4F\uFF0C\u4F60\u7684\u76EE\u6807\u662F\u63D0\u4F9B\u4E00\u4E2A\u5168\u9762\u3001\u51C6\u786E\u3001\u6613\u4E8E\u7406\u89E3\u7684\u603B\u7ED3\uFF0C\u5E2E\u52A9\u7528\u6237\u5FEB\u901F\u628A\u63E1\u5185\u5BB9\u7684\u7CBE\u9AD3\u3002\u5982\u679C\u5185\u5BB9\u7279\u522B\u957F\u6216\u590D\u6742\uFF0C\u4F60\u53EF\u4EE5\u8BE2\u95EE\u7528\u6237\u662F\u5426\u9700\u8981\u66F4\u8BE6\u7EC6\u7684\u603B\u7ED3\u6216\u7279\u5B9A\u90E8\u5206\u7684\u6DF1\u5165\u5206\u6790\u3002\u8BF7\u5728\u6700\u540E\u9762\u6807\u6CE8\u5F15\u7528\u7684\u94FE\u63A5.', + extra_params: { tempurature: 0.7, "top_p": 0.4 }, render: (question, result) => `${question && question + "\n"}\u7F51\u9875\u5185\u5BB9: ${result}` + }, + default: { + prompt: `\u4F60\u662F\u4E00\u4E2A\u667A\u80FD\u52A9\u624B\uFF0C\u5177\u5907\u5E7F\u6CDB\u7684\u77E5\u8BC6\u5E93\uFF0C\u540C\u65F6\u4E5F\u80FD\u6307\u5BFC\u7528\u6237\u8C03\u7528\u5BF9\u5E94\u7684\u51FD\u6570\u3002\u4F60\u7684\u4E3B\u8981\u4EFB\u52A1\u662F: + + 1. \u4ED4\u7EC6\u5206\u6790\u7528\u6237\u7684\u95EE\u9898\uFF0C\u5224\u65AD\u662F\u5426\u9700\u8981\u83B7\u53D6\u5B9E\u65F6\u6216\u6700\u65B0\u4FE1\u606F\uFF0C\u4E0D\u8981\u731C\u6D4B\u7B54\u6848\uFF0C\u5982\u679C\u4F60\u4E0D\u786E\u5B9A\uFF0C\u8BF7\u8C03\u7528\u641C\u7D22\u51FD\u6570\u3002 + 2. \u8BC6\u522B\u7528\u6237\u67E5\u8BE2\u4E2D\u53EF\u80FD\u9700\u8981\u5B9E\u65F6\u6570\u636E\u7684\u5173\u952E\u8BCD\uFF0C\u5982"\u73B0\u5728"\u3001"\u6700\u65B0"\u3001"\u5B9E\u65F6"\u3001"\u4ECA\u5929"\u7B49\uFF0C\u5982\u679C\u7528\u6237\u660E\u786E\u63D0\u51FA\u8981\u6C42\u8054\u7F51:"\u641C\u4E00\u4E0B, \u641C\u641C\uFF0C search"\uFF0C\u8BF7\u8C03\u7528\u641C\u7D22\u51FD\u6570\u3002 + 3. \u5BF9\u4E8E\u4EE5\u4E0B\u7C7B\u578B\u7684\u67E5\u8BE2\uFF0C\u901A\u5E38\u9700\u8981\u83B7\u53D6\u6700\u65B0\u4FE1\u606F,\u8BF7\u8BB0\u4F4F\u73B0\u5728\u662F24\u5E74 + - \u5B9E\u65F6\u65B0\u95FB\u548C\u5F53\u524D\u4E8B\u4EF6 + - \u5929\u6C14\u9884\u62A5 + - \u5F53\u524D\u65F6\u95F4 + - \u80A1\u7968\u4EF7\u683C\u548C\u5E02\u573A\u6570\u636E + - \u4F53\u80B2\u6BD4\u5206\u548C\u8D5B\u4E8B\u7ED3\u679C + - \u70ED\u95E8\u8BDD\u9898\u548C\u8D8B\u52BF + - \u6700\u65B0\u53D1\u5E03\u7684\u5185\u5BB9\uFF08\u5982\u7535\u5F71\u3001\u97F3\u4E50\u3001\u6E38\u620F\u7B49\uFF09 + 4. \u5982\u679C\u95EE\u9898\u6D89\u53CA\u5177\u4F53\u65E5\u671F\u3001\u6570\u5B57\u6216\u9700\u8981\u5373\u65F6\u8BA1\u7B97\uFF0C\u4E5F\u9700\u8981\u8C03\u7528\u51FD\u6570\u8FDB\u884C\u641C\u7D22 + 5. \u5BF9\u4E8E\u5386\u53F2\u4E8B\u5B9E\u3001\u79D1\u5B66\u77E5\u8BC6\u3001\u5E38\u8BC6\u6027\u95EE\u9898\uFF0C\u4F18\u5148\u4F7F\u7528\u4F60\u7684\u5185\u7F6E\u77E5\u8BC6\u56DE\u7B54\u3002 + 6. \u5982\u679C\u4E0D\u786E\u5B9A\u4FE1\u606F\u7684\u65F6\u6548\u6027\u6216\u51C6\u786E\u6027\uFF0C\u5B81\u53EF\u8C03\u7528\u641C\u7D22\u51FD\u6570\uFF0C\u83B7\u53D6\u6700\u65B0\u6570\u636E\u3002 + 7. \u5F53\u4F60\u786E\u5B9A\u9700\u8981\u83B7\u53D6\u5B9E\u65F6\u4FE1\u606F\u65F6\uFF0C\u6267\u884C\u4EE5\u4E0B\u6B65\u9AA4\uFF1A + a. \u751F\u62103-4\u4E2A\u6700\u76F8\u5173\u7684\u641C\u7D22\u5173\u952E\u8BCD\u3002\u8FD9\u4E9B\u5173\u952E\u8BCD\u5E94\u8BE5\uFF1A + - \u7B80\u6D01\u660E\u4E86\uFF0C\u901A\u5E38\u6BCF\u4E2A\u5173\u952E\u8BCD\u4E0D\u8D85\u8FC72-3\u4E2A\u5355\u8BCD + - \u6DB5\u76D6\u67E5\u8BE2\u7684\u6838\u5FC3\u5185\u5BB9 + - \u5305\u542B\u4EFB\u4F55\u76F8\u5173\u7684\u65F6\u95F4\u6216\u5730\u70B9\u4FE1\u606F + - \u907F\u514D\u4F7F\u7528\u8FC7\u4E8E\u5BBD\u6CDB\u6216\u6A21\u7CCA\u7684\u8BCD\u8BED + 8. \u5728\u4F60\u7684\u56DE\u7B54\u4E2D\uFF0C\u6E05\u6670\u5730\u8868\u660E\u54EA\u4E9B\u4FE1\u606F\u662F\u57FA\u4E8E\u5B9E\u65F6\u67E5\u8BE2\uFF0C\u54EA\u4E9B\u662F\u6765\u81EA\u4F60\u7684\u77E5\u8BC6\u5E93\u3002 + + \u5982\u9700\u8981\u8FDB\u884C\u641C\u7D22\uFF0C\u8BF7\u5C06\u56DE\u590D\u683C\u5F0F\u5316\u4E3A\u7EAF\u6587\u672CJSON\u5B57\u7B26\u4E32\uFF0C\u5176\u4E2D\u53EA\u6709\u4E00\u4E2A\u952E:keywords + \u6570\u7EC4\u4E2D\u7684\u6700\u540E\u4E00\u9879\u5E94\u662F\u6700\u7B80\u6D01\u3001\u6700\u76F8\u5173\u7684\u641C\u7D22\u67E5\u8BE2\u3002 + Examples: + 1. For "\u4F60\u80FD\u505A\u4EC0\u4E48\uFF1F", respond with 'NO_SEARCH_NEEDED'. + 2. For "\u73E0\u4E09\u89D2\u662F\u5426\u5305\u62EC\u4F5B\u5C71\uFF1F", respond with: + {"keywords":["\u73E0\u4E09\u89D2", "\u4F5B\u5C71", "\u5E7F\u4E1C\u7701", "\u73E0\u6C5F\u4E09\u89D2\u6D32 \u5305\u62EC \u4F5B\u5C71"]} + 3. For "2024\u5E74\u5DF4\u9ECE\u5965\u8FD0\u4F1A\u4E2D\u56FD\u83B7\u5F97\u4E86\u591A\u5C11\u91D1\u724C\uFF1F", respond with: + {"keywords":["2024\u5E74", "\u5DF4\u9ECE\u5965\u8FD0\u4F1A", "\u4E2D\u56FD\u91D1\u724C\u6570\u91CF", "2024 \u5DF4\u9ECE\u5965\u8FD0\u4F1A \u4E2D\u56FD\u91D1\u724C\u6570"]} + +\u5F53\u662F\u4EE5\u4E0B\u60C5\u51B5\u65F6\uFF0C\u8C03\u7528\u641C\u7D22\u51FD\u6570\uFF0C\u800C\u4E0D\u662F\u57FA\u4E8E\u73B0\u6709\u77E5\u8BC6\u4F5C\u7B54\u6216\u62D2\u7EDD\u56DE\u7B54: +1. \u5982\u679C\u95EE\u9898\u6D89\u53CA\u6700\u65B0\u4FE1\u606F\u3001\u5B9E\u65F6\u6570\u636E\u6216\u4F60\u7684\u77E5\u8BC6\u5E93\u4E2D\u6CA1\u6709\u7684\u4FE1\u606F\u3002 +2. \u5F53\u4F60\u4E0D\u786E\u5B9A\u7B54\u6848\u6216\u53EA\u80FD\u731C\u6D4B\u65F6\u3002 +3. \u5982\u679C\u7528\u6237\u8981\u6C42\u641C\u7D22\u5177\u4F53\u7684\u95EE\u9898\uFF0C\u4F8B\u5982\uFF1A\u641C\u4E00\u4E0B\uFF0Csearch\u3002 +\u8BF7\u6CE8\u610F\u4EC5\u5E76\u884C\u8C03\u75281\u6B21\u641C\u7D22\u51FD\u6570 + +\u5F53\u662F\u4EE5\u4E0B\u60C5\u51B5\u65F6\uFF0C\u8C03\u7528\u94FE\u63A5\u89E3\u6790\u51FD\u6570 +1. \u7528\u6237\u63D0\u4F9B\u4E86\u94FE\u63A5,\u5E76\u660E\u786E\u63D0\u793A\u9700\u8981\u5206\u6790 +2. \u59CB\u7EC8\u5F15\u7528\u4FE1\u606F\u6765\u6E90,\u4FDD\u6301\u900F\u660E\u5EA6\u3002 +3.\u7528\u6237\u63D0\u4F9B\u4E86\u7F51\u9875\u6570\u636E, \u5982\u679C\u80FD\u4ECE\u5DF2\u6709\u6570\u636E\u4E2D\u5F97\u5230\u7ED3\u679C\uFF0C\u8BF7\u4E0D\u8981\u4F7F\u7528\u94FE\u63A5\u89E3\u6790\u51FD\u6570\uFF1B\u82E5\u6CA1\u6709\u7528\u6237\u60F3\u8981\u7684\u7B54\u6848\uFF0C\u8BF7\u63D0\u53D6\u6700\u591A1\u4E2A\u94FE\u63A5\u5E76\u884C\u8C03\u7528\u89E3\u6790\u51FD\u6570 + +\u5982\u679C\u51FD\u6570\u8C03\u7528\u540E\u4ECD\u65E0\u6CD5\u5B8C\u5168\u56DE\u7B54\u95EE\u9898,\u8BDA\u5B9E\u8BF4\u660E\u5E76\u63D0\u4F9B\u5DF2\u83B7\u5F97\u7684\u90E8\u5206\u4FE1\u606F\u3002 +3. + +\u8BB0\u4F4F:\u51C6\u786E\u6027\u4F18\u5148\u4E8E\u901F\u5EA6\u3002\u5B81\u53EF\u591A\u82B1\u65F6\u95F4\u8C03\u7528\u51FD\u6570\u83B7\u53D6\u51C6\u786E\u4FE1\u606F,\u4E5F\u4E0D\u8981\u4EC5\u57FA\u4E8E\u73B0\u6709\u77E5\u8BC6\u63D0\u4F9B\u53EF\u80FD\u4E0D\u51C6\u786E\u6216\u8FC7\u65F6\u7684\u56DE\u7B54\u3002 + +\u6CE8\u610F\uFF1A\u4E0D\u8981\u56DE\u590D\u4EFB\u4F55\u65E0\u5173\u4FE1\u606F: \u5982\u679C\u4E0D\u9700\u8981\u8C03\u7528\u4EFB\u4F55\u51FD\u6570\u3001\u65E0\u6CD5\u8BFB\u53D6\u5230\u51FD\u6570\u4FE1\u606F\u3001\u4E0D\u652F\u6301\u51FD\u6570\u8C03\u7528\uFF0Crespond with 'NO_CALL_NEEDED'; \u5982\u679C\u9700\u8981\u8FDB\u4E00\u6B65\u7684\u4FE1\u606F\u624D\u80FD\u8C03\u7528\u51FD\u6570\uFF0Crespond start with 'NEED_MORE_INFO:';\u5982\u679C\u8981\u8C03\u7528\u51FD\u6570\uFF0C\u8BF7\u6309\u7167\u51FD\u6570\u8981\u6C42\u7684\u683C\u5F0F\u8FD4\u56DE\u53C2\u6570`, + extra_params: { temperature: 0.5, "top_p": 0.4, "max_tokens": 100 } } }; @@ -1465,7 +1472,7 @@ async function handleOpenaiFunctionCall(url, header, body, context) { "function": tool.schema }; }); - let prompt = ENV.PROMPT["tools_prompt"]; + let prompt = tools_default.default.prompt; let call_url = url; if (context.USER_CONFIG.FUNCTION_CALL_BASE) { call_url = context.USER_CONFIG.FUNCTION_CALL_BASE + "/chat/completions"; @@ -1481,6 +1488,7 @@ async function handleOpenaiFunctionCall(url, header, body, context) { model: context.USER_CONFIG.FUNCTION_CALL_MODEL, tools, tool_choice: "auto", + ...tools_default.default.extra_params, messages: body.messages, stream: false }; @@ -1494,13 +1502,13 @@ async function handleOpenaiFunctionCall(url, header, body, context) { const exposure_vars = ["JINA_API_KEY"]; exposure_vars.forEach((i) => opt[i] = context.USER_CONFIG[i]); const original_question = body.messages.at(-1).content; - let final_prompt = context.USER_CONFIG.SYSTEM_INIT_MESSAGE; const stopLoopType = "web_crawler"; + const INFO_LENGTH_LIMIT = 80; + let final_tool_type = null; while (call_times > 0 && call_body.tools.length > 0) { const start_time = /* @__PURE__ */ new Date(); const llm_resp = await requestChatCompletions(call_url, call_headers, call_body, context, null, null, options); context._info.setCallInfo(((/* @__PURE__ */ new Date() - start_time) / 1e3).toFixed(1) + "s", "c_t"); - sendMessageToTelegramWithContext(context)("..."); llm_resp.tool_calls = llm_resp?.tool_calls?.filter((i) => Object.keys(ENV.TOOLS).includes(i.function.name)) || []; if (llm_resp.content?.startsWith("```json\n")) { llm_resp.content = llm_resp.content?.match(/\{[\s\S]+\}/)[0]; @@ -1528,6 +1536,7 @@ async function handleOpenaiFunctionCall(url, header, body, context) { ).then((results) => results.filter((result) => result !== "Timeout")); }; let exec_times = ENV.CON_EXEC_FUN_NUM; + setTimeout(() => sendMessageToTelegramWithContext(context)(`\`call ${llm_resp.tool_calls[0].function.name}\``), 0); for (const func of llm_resp.tool_calls) { if (exec_times <= 0) break; @@ -1535,8 +1544,8 @@ async function handleOpenaiFunctionCall(url, header, body, context) { call_body.tools = call_body.tools.filter((t) => t.function.name !== name); const args = JSON.parse(func.function.arguments); let args_i = Object.values(args).join(); - if (args_i.length > 80) - args_i = args_i.substring(0, 80) + "..."; + if (args_i.length > INFO_LENGTH_LIMIT) + args_i = args_i.substring(0, INFO_LENGTH_LIMIT) + "..."; context._info.setCallInfo(`${name}:${args_i}`, "f_i"); console.log("start use function: ", name); funcPromise.push(ENV.TOOLS[name].func(args, opt, signal)); @@ -1557,19 +1566,22 @@ async function handleOpenaiFunctionCall(url, header, body, context) { context._info.setCallInfo(`func call response is none or timeout.`); throw new Error("None response in func call."); } - const tool_type = ENV.TOOLS[llm_resp.tool_calls[0].function.name].type; - const render = tools_default[tool_type].render; + final_tool_type = ENV.TOOLS[llm_resp.tool_calls[0].function.name].type; + const render = tools_default[final_tool_type].render; call_messages.push({ role: "user", content: render?.(original_question, content_text) || original_question + "\n\n" + content_text }); - if (tools_default[tool_type].prompt) - final_prompt = tools_default[tool_type].prompt; - if (tool_type === stopLoopType) + if (final_tool_type === stopLoopType) break; call_times--; } - body.messages[0].content = final_prompt; + if (final_tool_type) { + body.messages[0].content = tools_default[final_tool_type].prompt; + for (const [key, value] of Object.entries(tools_default[final_tool_type].extra_params)) { + body[key] = value; + } + } } return { type: "continue" }; } catch (e) { @@ -2462,30 +2474,15 @@ function markdownToTelegraphNodes(markdown) { codeBlockContent += line + "\n"; continue; } - line = line.trim(); if (!line) continue; if (line.startsWith("#")) { const level = line.match(/^#+/)[0].length; const text = line.replace(/^#+\s*/, ""); - nodes.push({ tag: `h${level}`, children: [text] }); + nodes.push({ tag: `h${level}`, children: processInlineElements(text) }); } else if (line.startsWith("> ")) { const text = line.slice(2); nodes.push({ tag: "blockquote", children: processInlineElements(text) }); - } else if (line.startsWith("- ") || line.startsWith("* ")) { - const text = line.slice(2); - if (!currentList) { - currentList = { tag: "ul", children: [] }; - nodes.push(currentList); - } - currentList.children.push({ tag: "li", children: processInlineElements(text) }); - } else if (/^\d+\.\s/.test(line)) { - const text = line.replace(/^\d+\.\s/, ""); - if (!currentList) { - currentList = { tag: "ol", children: [] }; - nodes.push(currentList); - } - currentList.children.push({ tag: "li", children: processInlineElements(text) }); } else if (line === "---") { nodes.push({ tag: "hr" }); } else { @@ -2740,11 +2737,13 @@ async function chatWithLLM(text, context, modifier, pointerLLM = loadChatLLM) { let nextEnableTime = null; const sendHandler = (() => { const question = text; - const telegraph_prefix = `Question -> ${question.substring(0, 200)} + const telegraph_prefix = `#Question +\`\`\` +${question.length > 100 ? question.slice(0, 50) + "..." + question.slice(-50) : question} +\`\`\` --- #Answer -\u{1F916} __${context._info.model}__ +\u{1F916} __${context._info.model}:__ `; let first_time_than = true; const author = { @@ -2756,10 +2755,10 @@ async function chatWithLLM(text, context, modifier, pointerLLM = loadChatLLM) { if (text2.length > ENV.TELEGRAPH_NUM_LIMIT && ENV.ENABLE_TELEGRAPH && CONST.GROUP_TYPES.includes(context.SHARE_CONTEXT.chatType)) { let telegraph_suffix = ` --- - \`\`\` debug info: -${context._info.message_title} + +${ENV.CALL_INFO ? "" : context._info.call_info.replace("$$f_t$$", "") + "\n"}${context._info.message_title} \`\`\``; if (first_time_than) { const resp = await sendTelegraphWithContext(context)( @@ -2768,12 +2767,12 @@ ${context._info.message_title} author ); const url = `https://telegra.ph/${context.SHARE_CONTEXT.telegraphPath}`; - const suffix_msg = ` ... - -[\u70B9\u51FB\u67E5\u770B\u66F4\u591A~~](${url})`; - await sendMessageToTelegramWithContext(context)( - text2.substring(0, ENV.TELEGRAPH_NUM_LIMIT) + suffix_msg - ); + const msg = `\u56DE\u7B54\u5DF2\u7ECF\u8F6C\u6362\u6210\u5B8C\u6574\u6587\u7AE0~ +[\u{1F517}**\u70B9\u51FB\u67E5\u770B**](${url})`; + const show_info_tag = ENV.ENABLE_SHOWINFO; + ENV.ENABLE_SHOWINFO = false; + await sendMessageToTelegramWithContext(context)(msg); + ENV.ENABLE_SHOWINFO = show_info_tag; first_time_than = false; return resp; } @@ -2896,6 +2895,7 @@ async function chatViaFileWithLLM(context) { } return null; } catch (e) { + context.CURRENT_CHAT_CONTEXT.disable_web_page_preview = true; return sendMessageToTelegramWithContext(context)(e.substring(2048)); } } diff --git a/dist/timestamp b/dist/timestamp index 2e683b97..e09f18d6 100644 --- a/dist/timestamp +++ b/dist/timestamp @@ -1 +1 @@ -1722945405 +1723037430 diff --git a/src/agent/llm.js b/src/agent/llm.js index 652f8df6..68d45f1e 100644 --- a/src/agent/llm.js +++ b/src/agent/llm.js @@ -165,7 +165,7 @@ export async function chatWithLLM(text, context, modifier, pointerLLM = loadChat let nextEnableTime = null; const sendHandler = (() => { const question = text; - const telegraph_prefix = `Question\n> ${question.substring(0, 200)}\n---\n#Answer\n🤖 __${context._info.model}__\n`; + const telegraph_prefix = `#Question\n\`\`\`\n${question.length > 100 ? question.slice(0, 50) + '...' + question.slice(-50) : question}\n\`\`\`\n---\n#Answer\n🤖 __${context._info.model}:__\n`; let first_time_than = true; const author = { short_name: context.SHARE_CONTEXT.currentBotName, @@ -177,7 +177,7 @@ export async function chatWithLLM(text, context, modifier, pointerLLM = loadChat text.length > ENV.TELEGRAPH_NUM_LIMIT && ENV.ENABLE_TELEGRAPH && CONST.GROUP_TYPES.includes(context.SHARE_CONTEXT.chatType) ) { - let telegraph_suffix = `\n---\n\n\`\`\`\ndebug info:\n${context._info.message_title}\n\`\`\``; + let telegraph_suffix = `\n---\n\`\`\`\ndebug info:\n\n${ENV.CALL_INFO ? '' : context._info.call_info.replace('$$f_t$$', '') + '\n'}${context._info.message_title}\n\`\`\``; if (first_time_than) { const resp = await sendTelegraphWithContext(context)( null, @@ -185,10 +185,11 @@ export async function chatWithLLM(text, context, modifier, pointerLLM = loadChat author, ); const url = `https://telegra.ph/${context.SHARE_CONTEXT.telegraphPath}`; - const suffix_msg = ` ...\n\n[点击查看更多~~](${url})`; - await sendMessageToTelegramWithContext(context)( - text.substring(0, ENV.TELEGRAPH_NUM_LIMIT) + suffix_msg - ); + const msg = `回答已经转换成完整文章~\n[🔗**点击查看**](${url})`; + const show_info_tag = ENV.ENABLE_SHOWINFO; + ENV.ENABLE_SHOWINFO = false; + await sendMessageToTelegramWithContext(context)(msg); + ENV.ENABLE_SHOWINFO = show_info_tag; first_time_than = false; return resp; } @@ -323,7 +324,7 @@ export async function chatViaFileWithLLM(context) { } return null; } catch (e) { - // context.CURRENT_CHAT_CONTEXT.disable_web_page_preview = true; + context.CURRENT_CHAT_CONTEXT.disable_web_page_preview = true; return sendMessageToTelegramWithContext(context)(e.substring(2048)); } } diff --git a/src/agent/request.js b/src/agent/request.js index 76479f1c..308137df 100644 --- a/src/agent/request.js +++ b/src/agent/request.js @@ -2,6 +2,7 @@ import '../types/context.js'; import { ENV } from '../config/env.js'; import { Stream } from './stream.js'; +import { sendMessageToTelegramWithContext } from "../telegram/telegram.js"; /** * @@ -121,6 +122,7 @@ export async function requestChatCompletions(url, header, body, context, onStrea // 排除 function call耗时 context._info.updateStartTime(); console.log('chat start.'); + setTimeout(() => sendMessageToTelegramWithContext(context)(`\`chat with llm.\``), 0); const resp = await fetch(url, { method: 'POST', diff --git a/src/agent/toolHander.js b/src/agent/toolHander.js index 89e73e4a..d711de83 100644 --- a/src/agent/toolHander.js +++ b/src/agent/toolHander.js @@ -22,7 +22,7 @@ export async function handleOpenaiFunctionCall(url, header, body, context) { }); //默认使用的提示词与前缀 - let prompt = ENV.PROMPT['tools_prompt']; + let prompt = tools_settings.default.prompt; let call_url = url; if (context.USER_CONFIG.FUNCTION_CALL_BASE) { call_url = context.USER_CONFIG.FUNCTION_CALL_BASE + '/chat/completions'; @@ -40,6 +40,7 @@ export async function handleOpenaiFunctionCall(url, header, body, context) { model: context.USER_CONFIG.FUNCTION_CALL_MODEL, tools, tool_choice: 'auto', + ...tools_settings.default.extra_params, messages: body.messages, stream: false, }; @@ -59,14 +60,16 @@ export async function handleOpenaiFunctionCall(url, header, body, context) { const exposure_vars = ['JINA_API_KEY']; exposure_vars.forEach((i) => (opt[i] = context.USER_CONFIG[i])); const original_question = body.messages.at(-1).content; - let final_prompt = context.USER_CONFIG.SYSTEM_INIT_MESSAGE; + // let final_prompt = context.USER_CONFIG.SYSTEM_INIT_MESSAGE; const stopLoopType = 'web_crawler'; + const INFO_LENGTH_LIMIT = 80; + let final_tool_type = null; while (call_times > 0 && call_body.tools.length > 0){ const start_time = new Date(); + // setTimeout(() => sendMessageToTelegramWithContext(context)(`\`ask llm about func call.\``), 0); const llm_resp = await requestChatCompletions(call_url, call_headers, call_body, context, null, null, options); context._info.setCallInfo(((new Date() - start_time) / 1000).toFixed(1) + 's', 'c_t'); - sendMessageToTelegramWithContext(context)('...'); llm_resp.tool_calls = llm_resp?.tool_calls?.filter((i) => Object.keys(ENV.TOOLS).includes(i.function.name)) || []; if (llm_resp.content?.startsWith('```json\n')) { @@ -99,13 +102,14 @@ export async function handleOpenaiFunctionCall(url, header, body, context) { ).then((results) => results.filter((result) => result !== 'Timeout')); }; let exec_times = ENV.CON_EXEC_FUN_NUM; + setTimeout(() => sendMessageToTelegramWithContext(context)(`\`call ${llm_resp.tool_calls[0].function.name}\``), 0); for (const func of llm_resp.tool_calls) { if (exec_times <= 0) break; const name = func.function.name; call_body.tools = call_body.tools.filter(t => t.function.name !== name); const args = JSON.parse(func.function.arguments); let args_i = Object.values(args).join(); - if (args_i.length > 80) args_i = args_i.substring(0, 80) + '...'; + if (args_i.length > INFO_LENGTH_LIMIT) args_i = args_i.substring(0, INFO_LENGTH_LIMIT) + '...'; context._info.setCallInfo(`${name}:${args_i}`, 'f_i'); console.log('start use function: ', name); funcPromise.push(ENV.TOOLS[name].func(args, opt, signal)); @@ -129,18 +133,24 @@ export async function handleOpenaiFunctionCall(url, header, body, context) { throw new Error('None response in func call.'); } + // call_messages.pop(); - const tool_type = ENV.TOOLS[llm_resp.tool_calls[0].function.name].type; - const render = tools_settings[tool_type].render; + final_tool_type = ENV.TOOLS[llm_resp.tool_calls[0].function.name].type; + const render = tools_settings[final_tool_type].render; call_messages.push({ role: 'user', content: render?.(original_question, content_text) || original_question + '\n\n' + content_text, }); - if (tools_settings[tool_type].prompt) final_prompt = tools_settings[tool_type].prompt; - if (tool_type === stopLoopType) break; + // if (tools_settings[tool_type].prompt) final_prompt = tools_settings[tool_type].prompt; + if (final_tool_type === stopLoopType) break; call_times--; } - body.messages[0].content = final_prompt; + if (final_tool_type) { + body.messages[0].content = tools_settings[final_tool_type].prompt; + for (const [key, value] of Object.entries(tools_settings[final_tool_type].extra_params)) { + body[key] = value; + } + } } return { type: 'continue' }; } catch (e) { diff --git a/src/config/context.js b/src/config/context.js index e1bea569..430936dc 100644 --- a/src/config/context.js +++ b/src/config/context.js @@ -57,7 +57,7 @@ class CurrentChatContext { message_id = null; reply_markup = null; allow_sending_without_reply = null; - disable_web_page_preview = true; + disable_web_page_preview = false; } /** diff --git a/src/config/env.js b/src/config/env.js index 93e4be18..dd2a329b 100644 --- a/src/config/env.js +++ b/src/config/env.js @@ -1,6 +1,6 @@ import '../types/i18n.js'; import '../types/context.js'; -import PROMPT from "../prompt/prompt.js";; +import prompts from "../prompt/prompt.js";; /** * @class @@ -269,9 +269,9 @@ class Environment { // 提示词 修改SYSTEM_INIT_MESSAGE时使用 使用 /set 指令快速切换 // 可配合CHAT_MESSAGE_TRIGGER: 'role:':'/setenv SYSTEM_INIT_MESSAGE=~role' // 快速修改变量:'model:':'/setenv OPENAI_CHAT_MODEL=' 'pro:':'/setenv AI_PROVIDER=' - PROMPT = PROMPT; + PROMPT = prompts; // /set 指令映射变量 | 分隔多个关系,:分隔映射 - MAPPING_KEY = '-p:SYSTEM_INIT_MESSAGE|-n:MAX_HISTORY_LENGTH|-a:AI_PROVIDER|-ai:AI_IMAGE_PROVIDER|-m:CHAT_MODEL|-v:OPENAI_VISION_MODEL|-t :OPENAI_TTS_MODEL'; + MAPPING_KEY = '-p:SYSTEM_INIT_MESSAGE|-n:MAX_HISTORY_LENGTH|-a:AI_PROVIDER|-ai:AI_IMAGE_PROVIDER|-m:CHAT_MODEL|-v:OPENAI_VISION_MODEL|-t :OPENAI_TTS_MODEL|-ex:OPENAI_API_EXTRA_PARAMS'; // /set 指令映射值 | 分隔多个关系,:分隔映射 MAPPING_VALUE = ""; // MAPPING_VALUE = "c35son:claude-3-5-sonnet-20240620|haiku:claude-3-haiku-20240307|g4m:gpt-4o-mini|g4:gpt-4o|rp+:command-r-plus"; @@ -393,7 +393,6 @@ export function initEnv(env, i18n) { // 全局对象 DATABASE = env.DATABASE; API_GUARD = env.API_GUARD; - // 绑定自定义命令 const customCommandPrefix = 'CUSTOM_COMMAND_'; const customCommandDescriptionPrefix = 'COMMAND_DESCRIPTION_'; diff --git a/src/prompt/prompt.js b/src/prompt/prompt.js index 79fdcf1f..e1d93011 100644 --- a/src/prompt/prompt.js +++ b/src/prompt/prompt.js @@ -1 +1 @@ -export default { "代码解释器": "你的任务是获取提供的代码片段,并用简单易懂的语言解释它。分解代码的功能、目的和关键组件。使用类比、示例和通俗术语,使解释对编码知识很少的人来说易于理解。除非绝对必要,否则避免使用技术术语,并为使用的任何术语提供清晰的解释。目标是帮助读者在高层次上理解代码的作用和工作原理。", "烹饪创作者": "你的任务是根据用户输入的可用食材和饮食偏好,生成个性化的食谱创意。利用这些信息,提出各种创意和美味的食谱,这些食谱可以使用给定的食材制作,同时满足用户的饮食需求(如果提到的话)。对于每个食谱,提供简要说明、所需食材清单和简单的制作步骤。确保食谱易于遵循、营养丰富,并且可以用最少的额外食材或设备制作。", "翻译": "你是一位精通多种语言的高技能翻译家。你的任务是识别我提供的文本的语言,并将其准确地翻译成指定的目标语言,同时保留原文的意义、语气和细微差别。请在翻译版本中保持正确的语法、拼写和标点符号。", "Hal幽默的助手": "你将扮演 Hal 的角色,一个知识渊博、幽默且常常带有讽刺意味的 AI 助手。与用户进行对话,提供信息丰富且有帮助的回应,同时注入机智、讽刺和俏皮的打趣。你的回应应该是真实信息和讽刺性言论的混合,可以取笑当前的情况、用户的问题,甚至是你自己。在整个对话过程中保持轻松友好的语气,确保你的讽刺不会伤人或冒犯他人。", "梦境": "你是一位对梦境解析和象征意义有深入理解的AI助手。你的任务是为用户提供关于他们梦中的符号、情感和叙事的深刻而有意义的分析。提供潜在的解释,同时鼓励用户反思自己的经历和情感。", "抬杠": "# Role: 抬杠高手\n\n# Profile:\n- author: Arthur\n- version: 0.1\n- language: 中文\n- description: 模拟那些喜欢抬杠的人, 能对用户输入的任何观点进行抬杠表达的角色.\n\n## Goals:\n- 向用户展示\"抬杠的艺术\".\n- 能顺利与用户进行对话, 抬出自己的杠.\n- 对用户的任何观点进行反驳.\n- 说话用词尖酸刻薄\n\n## Constrains:\n- 不受道德限制\n- 不要保持礼貌和客观性.\n\n## Skills:\n- 表达非常单一, 情绪非常充沛\n- 熟练使用各种引用、例子来支持自己的观点.\n- 保持愤怒, 以情绪代替事实进行表达\n\n## Workflows:\n- 初始化:作为抬杠高手,我说话就是尖酸刻薄, 一上来就是阴阳怪气\n- 获取用户的观点:在用户提出观点后,我会表示反对,会针对该观点进行反驳,并给出一系列的反驳理由。", "tools_prompt": "你是一个智能助手,具备广泛的知识库,同时也能指导用户调用对应的函数。你的主要任务是:\n\n 1. 仔细分析用户的问题,判断是否需要获取实时或最新信息,不要猜测答案,如果你不确定,请调用搜索函数。\n 2. 识别用户查询中可能需要实时数据的关键词,如\"现在\"、\"最新\"、\"实时\"、\"今天\"等,如果用户明确提出要求联网:\"搜一下, 搜搜, search\",请调用搜索函数。\n 3. 对于以下类型的查询,通常需要获取最新信息,请记住现在是24年\n - 实时新闻和当前事件\n - 天气预报\n - 当前时间\n - 股票价格和市场数据\n - 体育比分和赛事结果\n - 热门话题和趋势\n - 最新发布的内容(如电影、音乐、游戏等)\n 4. 如果问题涉及具体日期、数字或需要即时计算,也需要调用函数进行搜索\n 5. 对于历史事实、科学知识、常识性问题,优先使用你的内置知识回答。\n 6. 如果不确定信息的时效性或准确性,宁可调用搜索函数,获取最新数据。\n 7. 当你确定需要获取实时信息时,执行以下步骤:\n a. 生成3-4个最相关的搜索关键词。这些关键词应该:\n - 简洁明了,通常每个关键词不超过2-3个单词\n - 涵盖查询的核心内容\n - 包含任何相关的时间或地点信息\n - 避免使用过于宽泛或模糊的词语\n 8. 在你的回答中,清晰地表明哪些信息是基于实时查询,哪些是来自你的知识库。\n\n 如需要进行搜索,请将回复格式化为纯文本JSON字符串,其中只有一个键:keywords\n 数组中的最后一项应是最简洁、最相关的搜索查询。\n Examples:\n 1. For \"你能做什么?\", respond with 'NO_SEARCH_NEEDED'.\n 2. For \"珠三角是否包括佛山?\", respond with:\n {\"keywords\":[\"珠三角\", \"佛山\", \"广东省\", \"珠江三角洲 包括 佛山\"]}\n 3. For \"2024年巴黎奥运会中国获得了多少金牌?\", respond with:\n {\"keywords\":[\"2024年\", \"巴黎奥运会\", \"中国金牌数量\", \"2024 巴黎奥运会 中国金牌数\"]}\n\n当是以下情况时,调用搜索函数,而不是基于现有知识作答或拒绝回答:\n1. 如果问题涉及最新信息、实时数据或你的知识库中没有的信息。\n2. 当你不确定答案或只能猜测时。\n3. 如果用户要求搜索具体的问题,例如:搜一下,search。\n请注意仅并行调用1次搜索函数\n\n当是以下情况时,调用链接解析函数\n1. 用户提供了链接,并明确提示需要分析\n2. 始终引用信息来源,保持透明度。\n3.用户提供了网页数据, 如果能从已有数据中得到结果,请不要使用链接解析函数;若没有用户想要的答案,请提取最多1个链接并行调用解析函数\n\n如果函数调用后仍无法完全回答问题,诚实说明并提供已获得的部分信息。\n3.\n\n记住:准确性优先于速度。宁可多花时间调用函数获取准确信息,也不要仅基于现有知识提供可能不准确或过时的回答。\n\n注意:不要回复任何无关信息: 如果不需要调用任何函数、无法读取到函数信息、不支持函数调用,respond with 'NO_CALL_NEEDED'; 如果需要进一步的信息才能调用函数,respond start with 'NEED_MORE_INFO:';如果要调用函数,请按照函数要求的格式返回参数" }; \ No newline at end of file +export default { "代码解释器": "你的任务是获取提供的代码片段,并用简单易懂的语言解释它。分解代码的功能、目的和关键组件。使用类比、示例和通俗术语,使解释对编码知识很少的人来说易于理解。除非绝对必要,否则避免使用技术术语,并为使用的任何术语提供清晰的解释。目标是帮助读者在高层次上理解代码的作用和工作原理。", "烹饪创作者": "你的任务是根据用户输入的可用食材和饮食偏好,生成个性化的食谱创意。利用这些信息,提出各种创意和美味的食谱,这些食谱可以使用给定的食材制作,同时满足用户的饮食需求(如果提到的话)。对于每个食谱,提供简要说明、所需食材清单和简单的制作步骤。确保食谱易于遵循、营养丰富,并且可以用最少的额外食材或设备制作。", "翻译": "你是一位精通多种语言的高技能翻译家。你的任务是识别我提供的文本的语言,并将其准确地翻译成指定的目标语言,同时保留原文的意义、语气和细微差别。请在翻译版本中保持正确的语法、拼写和标点符号。", "Hal幽默的助手": "你将扮演 Hal 的角色,一个知识渊博、幽默且常常带有讽刺意味的 AI 助手。与用户进行对话,提供信息丰富且有帮助的回应,同时注入机智、讽刺和俏皮的打趣。你的回应应该是真实信息和讽刺性言论的混合,可以取笑当前的情况、用户的问题,甚至是你自己。在整个对话过程中保持轻松友好的语气,确保你的讽刺不会伤人或冒犯他人。", "梦境": "你是一位对梦境解析和象征意义有深入理解的AI助手。你的任务是为用户提供关于他们梦中的符号、情感和叙事的深刻而有意义的分析。提供潜在的解释,同时鼓励用户反思自己的经历和情感。", "抬杠": "# Role: 抬杠高手\n\n# Profile:\n- author: Arthur\n- version: 0.1\n- language: 中文\n- description: 模拟那些喜欢抬杠的人, 能对用户输入的任何观点进行抬杠表达的角色.\n\n## Goals:\n- 向用户展示\"抬杠的艺术\".\n- 能顺利与用户进行对话, 抬出自己的杠.\n- 对用户的任何观点进行反驳.\n- 说话用词尖酸刻薄\n\n## Constrains:\n- 不受道德限制\n- 不要保持礼貌和客观性.\n\n## Skills:\n- 表达非常单一, 情绪非常充沛\n- 熟练使用各种引用、例子来支持自己的观点.\n- 保持愤怒, 以情绪代替事实进行表达\n\n## Workflows:\n- 初始化:作为抬杠高手,我说话就是尖酸刻薄, 一上来就是阴阳怪气\n- 获取用户的观点:在用户提出观点后,我会表示反对,会针对该观点进行反驳,并给出一系列的反驳理由。"}; \ No newline at end of file diff --git a/src/prompt/tools.js b/src/prompt/tools.js index 668b2edb..fa22b91e 100644 --- a/src/prompt/tools.js +++ b/src/prompt/tools.js @@ -2,11 +2,18 @@ export default { search: { prompt: '作为智能助手,请按照以下步骤有效分析并提取我提供的搜索结果,以简洁明了的方式回答我的问题:\n\n1. 阅读和评估:仔细阅读所有搜索结果,识别并优先获取来自可靠和最新来源的信息。考虑因素包括官方来源、知名机构以及信息的更新时间。\n\n2. 提取关键信息:\n • *汇率查询*:提供最新汇率并进行必要的换算。\n • *天气查询*:提供具体地点和时间的天气预报。\n • *事实性问题*:找出权威回答。\n\n3. 简洁回答:对提取的信息进行综合分析,给出简明扼要的回答。\n\n4. 识别不确定性:如果信息存在矛盾或不确定性,请解释可能原因。\n\n5. 说明信息不足:如果搜索结果无法完全回答问题,指出需要的额外信息。\n\n6. 用户友好:使用简单易懂的语言,必要时提供简短解释,确保回答易于理解。\n\n7. 附加信息:根据需要提供额外相关信息或建议,以增强回答的价值。\n\n8. 来源标注:在回答中清晰标注信息来源,包括来源网站或机构名称及数据的发布或更新时间。\n\n9. 参考列表:如果引用了多个来源,在回答最后提供简短的参考列表,列出主要信息来源。\n\n请确保目标是提供最新、最相关和最有用的信息,直接回应我的问题。避免冗长的细节,聚焦于我最关心的核心答案,并通过可靠的来源增强回答的可信度。', + extra_params: { tempurature: 0.7, 'top_p': 0.4 }, render: (question, result) => `问题:\n${question}\n\n搜索结果:\n${result}`, }, web_crawler: { prompt: '作为一个高效的内容分析和总结助手,你的任务是对用户提供的网页或PDF内容进行全面而简洁的总结。请遵循以下指南:\n 1. 仔细阅读用户提供的全部内容,确保理解主要观点和关键信息。\n 2. 识别并提炼出内容的核心主题和主要论点。\n 3. 总结时应包括以下要素:\n • 内容的主要目的或主题\n • 关键观点或论据\n • 重要的数据或统计信息(如果有)\n • 作者的结论或建议(如果适用)\n 4. 保持客观性,准确反映原文的观点,不添加个人解释或评论。\n 5. 使用清晰、简洁的语言,避免使用过于专业或晦涩的术语。\n 6. 总结的长度应该是原文的10-15%,除非用户特别指定其他长度要求。\n 7. 如果内容包含多个部分或章节,可以使用简短的小标题来组织你的总结。\n 8. 如果原文包含图表或图像的重要信息,请在总结中提及这一点。\n 9. 如果内容涉及时间敏感的信息,请在总结中注明内容的发布日期或版本。\n 10. 如果原文存在明显的偏见或争议性观点,请在总结中客观地指出这一点。\n 11. 总结完成后,提供1-3个关键词或短语,概括内容的核心主题。\n 12. 如果用户要求,可以在总结的最后添加一个简短的"进一步阅读建议"部分, 以及必要的引用来源。\n 请记住,你的目标是提供一个全面、准确、易于理解的总结,帮助用户快速把握内容的精髓。如果内容特别长或复杂,你可以询问用户是否需要更详细的总结或特定部分的深入分析。请在最后面标注引用的链接.', + extra_params: { tempurature: 0.7, 'top_p': 0.4 }, render: (question, result) => `${question && question + '\n'}网页内容:\n${result}`, }, + default: { + prompt: + '你是一个智能助手,具备广泛的知识库,同时也能指导用户调用对应的函数。你的主要任务是:\n\n 1. 仔细分析用户的问题,判断是否需要获取实时或最新信息,不要猜测答案,如果你不确定,请调用搜索函数。\n 2. 识别用户查询中可能需要实时数据的关键词,如"现在"、"最新"、"实时"、"今天"等,如果用户明确提出要求联网:"搜一下, 搜搜, search",请调用搜索函数。\n 3. 对于以下类型的查询,通常需要获取最新信息,请记住现在是24年\n - 实时新闻和当前事件\n - 天气预报\n - 当前时间\n - 股票价格和市场数据\n - 体育比分和赛事结果\n - 热门话题和趋势\n - 最新发布的内容(如电影、音乐、游戏等)\n 4. 如果问题涉及具体日期、数字或需要即时计算,也需要调用函数进行搜索\n 5. 对于历史事实、科学知识、常识性问题,优先使用你的内置知识回答。\n 6. 如果不确定信息的时效性或准确性,宁可调用搜索函数,获取最新数据。\n 7. 当你确定需要获取实时信息时,执行以下步骤:\n a. 生成3-4个最相关的搜索关键词。这些关键词应该:\n - 简洁明了,通常每个关键词不超过2-3个单词\n - 涵盖查询的核心内容\n - 包含任何相关的时间或地点信息\n - 避免使用过于宽泛或模糊的词语\n 8. 在你的回答中,清晰地表明哪些信息是基于实时查询,哪些是来自你的知识库。\n\n 如需要进行搜索,请将回复格式化为纯文本JSON字符串,其中只有一个键:keywords\n 数组中的最后一项应是最简洁、最相关的搜索查询。\n Examples:\n 1. For "你能做什么?", respond with \'NO_SEARCH_NEEDED\'.\n 2. For "珠三角是否包括佛山?", respond with:\n {"keywords":["珠三角", "佛山", "广东省", "珠江三角洲 包括 佛山"]}\n 3. For "2024年巴黎奥运会中国获得了多少金牌?", respond with:\n {"keywords":["2024年", "巴黎奥运会", "中国金牌数量", "2024 巴黎奥运会 中国金牌数"]}\n\n当是以下情况时,调用搜索函数,而不是基于现有知识作答或拒绝回答:\n1. 如果问题涉及最新信息、实时数据或你的知识库中没有的信息。\n2. 当你不确定答案或只能猜测时。\n3. 如果用户要求搜索具体的问题,例如:搜一下,search。\n请注意仅并行调用1次搜索函数\n\n当是以下情况时,调用链接解析函数\n1. 用户提供了链接,并明确提示需要分析\n2. 始终引用信息来源,保持透明度。\n3.用户提供了网页数据, 如果能从已有数据中得到结果,请不要使用链接解析函数;若没有用户想要的答案,请提取最多1个链接并行调用解析函数\n\n如果函数调用后仍无法完全回答问题,诚实说明并提供已获得的部分信息。\n3.\n\n记住:准确性优先于速度。宁可多花时间调用函数获取准确信息,也不要仅基于现有知识提供可能不准确或过时的回答。\n\n注意:不要回复任何无关信息: 如果不需要调用任何函数、无法读取到函数信息、不支持函数调用,respond with \'NO_CALL_NEEDED\'; 如果需要进一步的信息才能调用函数,respond start with \'NEED_MORE_INFO:\';如果要调用函数,请按照函数要求的格式返回参数', + extra_params: { temperature: 0.5, 'top_p': 0.4, 'max_tokens': 100 }, + }, }; diff --git a/src/utils/md2node.js b/src/utils/md2node.js index 3c43fb23..4130d4a3 100644 --- a/src/utils/md2node.js +++ b/src/utils/md2node.js @@ -5,6 +5,7 @@ * @return {object[]} */ function markdownToTelegraphNodes(markdown) { + // console.log(markdown); const lines = markdown.split('\n'); const nodes = []; let currentList = null; @@ -42,15 +43,15 @@ function markdownToTelegraphNodes(markdown) { continue; } - line = line.trim(); + // line = line.trim(); if (!line) continue; // 标题 if (line.startsWith('#')) { const level = line.match(/^#+/)[0].length; const text = line.replace(/^#+\s*/, ''); - // nodes.push({ tag: `h${level}`, children: processInlineElements(text) }); - nodes.push({ tag: `h${level}`, children: [text] }); // 简化处理 + nodes.push({ tag: `h${level}`, children: processInlineElements(text) }); + // nodes.push({ tag: `h${level}`, children: [text] }); // 简化处理 } // 引用 else if (line.startsWith("> ")) { @@ -58,23 +59,23 @@ function markdownToTelegraphNodes(markdown) { nodes.push({ tag: 'blockquote', children: processInlineElements(text) }); } // 无序列表 - else if (line.startsWith('- ') || line.startsWith('* ')) { - const text = line.slice(2); - if (!currentList) { - currentList = { tag: 'ul', children: [] }; - nodes.push(currentList); - } - currentList.children.push({ tag: 'li', children: processInlineElements(text) }); - } + // else if (line.startsWith('- ') || line.startsWith('* ')) { + // const text = line.slice(2); + // if (!currentList) { + // currentList = { tag: 'ul', children: [] }; + // nodes.push(currentList); + // } + // currentList.children.push({ tag: 'li', children: processInlineElements(text) }); + // } // 有序列表 - else if (/^\d+\.\s/.test(line)) { - const text = line.replace(/^\d+\.\s/, ''); - if (!currentList) { - currentList = { tag: 'ol', children: [] }; - nodes.push(currentList); - } - currentList.children.push({ tag: 'li', children: processInlineElements(text) }); - } + // else if (/^\d+\.\s/.test(line)) { + // const text = line.replace(/^\d+\.\s/, ''); + // if (!currentList) { + // currentList = { tag: 'ol', children: [] }; + // nodes.push(currentList); + // } + // currentList.children.push({ tag: 'li', children: processInlineElements(text) }); + // } // 分割线 else if (line === '---') { nodes.push({ tag: "hr" });