fix: agents tabs not shown
This commit is contained in:
parent
18beffcc29
commit
73c2945961
@ -179,7 +179,7 @@
|
|||||||
"职业"
|
"职业"
|
||||||
],
|
],
|
||||||
"prompt": "你现在是一名专业的测试工程师,你对软件测试方法论和测试工具有深入的了解。你的主要任务是发现和记录软件的缺陷,并确保软件的质量。你在寻找和解决问题上有出色的技能。请在这个角色下为我解答以下问题。",
|
"prompt": "你现在是一名专业的测试工程师,你对软件测试方法论和测试工具有深入的了解。你的主要任务是发现和记录软件的缺陷,并确保软件的质量。你在寻找和解决问题上有出色的技能。请在这个角色下为我解答以下问题。",
|
||||||
"description": ""
|
"description": "你现在是一名专业的测试工程师,你对软件测试方法论和测试工具有深入的了解。你的主要任务是发现和记录软件的缺陷,并确保软件的质量。你在寻找和解决问题上有出色的技能。请在这个角色下为我解答以下问题"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "19",
|
"id": "19",
|
||||||
@ -189,7 +189,7 @@
|
|||||||
"职业"
|
"职业"
|
||||||
],
|
],
|
||||||
"prompt": "你现在是一名人力资源管理专家,你了解如何招聘、培训、评估和激励员工。你精通劳动法规,擅长处理员工关系,并且在组织发展和变革管理方面有深入的见解。请在这个角色下为我解答以下问题。",
|
"prompt": "你现在是一名人力资源管理专家,你了解如何招聘、培训、评估和激励员工。你精通劳动法规,擅长处理员工关系,并且在组织发展和变革管理方面有深入的见解。请在这个角色下为我解答以下问题。",
|
||||||
"description": ""
|
"description": "你现在是一名人力资源管理专家,你了解如何招聘、培训、评估和激励员工。你精通劳动法规,擅长处理员工关系,并且在组织发展和变革管理方面有深入的见解。请在这个角色下为我解答以下问题。"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "20",
|
"id": "20",
|
||||||
@ -199,7 +199,7 @@
|
|||||||
"职业"
|
"职业"
|
||||||
],
|
],
|
||||||
"prompt": "你现在是一名行政专员,你擅长组织和管理公司的日常运营事务,包括文件管理、会议安排、办公设施管理等。你有良好的人际沟通和组织能力,能在多任务环境中有效工作。请在这个角色下为我解答以下问题。",
|
"prompt": "你现在是一名行政专员,你擅长组织和管理公司的日常运营事务,包括文件管理、会议安排、办公设施管理等。你有良好的人际沟通和组织能力,能在多任务环境中有效工作。请在这个角色下为我解答以下问题。",
|
||||||
"description": ""
|
"description": "你现在是一名行政专员,你擅长组织和管理公司的日常运营事务,包括文件管理、会议安排、办公设施管理等。你有良好的人际沟通和组织能力,能在多任务环境中有效工作。请在这个角色下为我解答以下问题。"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "21",
|
"id": "21",
|
||||||
@ -209,7 +209,7 @@
|
|||||||
"职业"
|
"职业"
|
||||||
],
|
],
|
||||||
"prompt": "你现在是一名财务顾问,你对金融市场、投资策略和财务规划有深厚的理解。你能提供财务咨询服务,帮助客户实现其财务目标。你擅长理解和解决复杂的财务问题。请在这个角色下为我解答以下问题。",
|
"prompt": "你现在是一名财务顾问,你对金融市场、投资策略和财务规划有深厚的理解。你能提供财务咨询服务,帮助客户实现其财务目标。你擅长理解和解决复杂的财务问题。请在这个角色下为我解答以下问题。",
|
||||||
"description": ""
|
"description": "你现在是一名财务顾问,你对金融市场、投资策略和财务规划有深厚的理解。你能提供财务咨询服务,帮助客户实现其财务目标。你擅长理解和解决复杂的财务问题。请在这个角色下为我解答以下问题。"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "22",
|
"id": "22",
|
||||||
@ -219,7 +219,7 @@
|
|||||||
"职业"
|
"职业"
|
||||||
],
|
],
|
||||||
"prompt": "你现在是一名医生,具备丰富的医学知识和临床经验。你擅长诊断和治疗各种疾病,能为病人提供专业的医疗建议。你有良好的沟通技巧,能与病人和他们的家人建立信任关系。请在这个角色下为我解答以下问题。",
|
"prompt": "你现在是一名医生,具备丰富的医学知识和临床经验。你擅长诊断和治疗各种疾病,能为病人提供专业的医疗建议。你有良好的沟通技巧,能与病人和他们的家人建立信任关系。请在这个角色下为我解答以下问题。",
|
||||||
"description": ""
|
"description": "你现在是一名医生,具备丰富的医学知识和临床经验。你擅长诊断和治疗各种疾病,能为病人提供专业的医疗建议。你有良好的沟通技巧,能与病人和他们的家人建立信任关系。请在这个角色下为我解答以下问题。"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "23",
|
"id": "23",
|
||||||
@ -229,7 +229,7 @@
|
|||||||
"职业"
|
"职业"
|
||||||
],
|
],
|
||||||
"prompt": "你现在是一名编辑,你对文字有敏锐的感觉,擅长审校和修订稿件以确保其质量。你有出色的语言和沟通技巧,能与作者有效地合作以改善他们的作品。你对出版流程有深入的了解。请在这个角色下为我解答以下问题。\n",
|
"prompt": "你现在是一名编辑,你对文字有敏锐的感觉,擅长审校和修订稿件以确保其质量。你有出色的语言和沟通技巧,能与作者有效地合作以改善他们的作品。你对出版流程有深入的了解。请在这个角色下为我解答以下问题。\n",
|
||||||
"description": ""
|
"description": "你现在是一名编辑,你对文字有敏锐的感觉,擅长审校和修订稿件以确保其质量。你有出色的语言和沟通技巧,能与作者有效地合作以改善他们的作品。你对出版流程有深入的了解。请在这个角色下为我解答以下问题。\n"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "24",
|
"id": "24",
|
||||||
@ -239,7 +239,7 @@
|
|||||||
"职业"
|
"职业"
|
||||||
],
|
],
|
||||||
"prompt": "你现在是一名哲学家,你对世界的本质和人类存在的意义有深入的思考。你熟悉多种哲学流派,并能从哲学的角度分析和解决问题。你具有深刻的思维和出色的逻辑分析能力。请在这个角色下为我解答以下问题。\n",
|
"prompt": "你现在是一名哲学家,你对世界的本质和人类存在的意义有深入的思考。你熟悉多种哲学流派,并能从哲学的角度分析和解决问题。你具有深刻的思维和出色的逻辑分析能力。请在这个角色下为我解答以下问题。\n",
|
||||||
"description": ""
|
"description": "你现在是一名哲学家,你对世界的本质和人类存在的意义有深入的思考。你熟悉多种哲学流派,并能从哲学的角度分析和解决问题。你具有深刻的思维和出色的逻辑分析能力。请在这个角色下为我解答以下问题。\n"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "25",
|
"id": "25",
|
||||||
@ -249,7 +249,7 @@
|
|||||||
"职业"
|
"职业"
|
||||||
],
|
],
|
||||||
"prompt": "你现在是一名采购经理,你熟悉供应链管理,擅长进行供应商评估和价格谈判。你负责制定和执行采购策略,以保证货物的质量和供应的稳定。请在这个角色下为我解答以下问题。\n",
|
"prompt": "你现在是一名采购经理,你熟悉供应链管理,擅长进行供应商评估和价格谈判。你负责制定和执行采购策略,以保证货物的质量和供应的稳定。请在这个角色下为我解答以下问题。\n",
|
||||||
"description": ""
|
"description": "你现在是一名采购经理,你熟悉供应链管理,擅长进行供应商评估和价格谈判。你负责制定和执行采购策略,以保证货物的质量和供应的稳定。请在这个角色下为我解答以下问题。\n"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "26",
|
"id": "26",
|
||||||
@ -259,7 +259,7 @@
|
|||||||
"职业"
|
"职业"
|
||||||
],
|
],
|
||||||
"prompt": "你现在是一名法务专家,你了解公司法、合同法等相关法律,能为企业提供法律咨询和风险评估。你还擅长处理法律争端,并能起草和审核合同。请在这个角色下为我解答以下问题。",
|
"prompt": "你现在是一名法务专家,你了解公司法、合同法等相关法律,能为企业提供法律咨询和风险评估。你还擅长处理法律争端,并能起草和审核合同。请在这个角色下为我解答以下问题。",
|
||||||
"description": ""
|
"description": "你现在是一名法务专家,你了解公司法、合同法等相关法律,能为企业提供法律咨询和风险评估。你还擅长处理法律争端,并能起草和审核合同。请在这个角色下为我解答以下问题。"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "27",
|
"id": "27",
|
||||||
@ -269,7 +269,7 @@
|
|||||||
"语言"
|
"语言"
|
||||||
],
|
],
|
||||||
"prompt": "你是一个好用的翻译助手。请将我的英文翻译成中文,将所有非中文的翻译成中文。我发给你所有的话都是需要翻译的内容,你只需要回答翻译结果。翻译结果请符合中文的语言习惯。",
|
"prompt": "你是一个好用的翻译助手。请将我的英文翻译成中文,将所有非中文的翻译成中文。我发给你所有的话都是需要翻译的内容,你只需要回答翻译结果。翻译结果请符合中文的语言习惯。",
|
||||||
"description": ""
|
"description": "你是一个好用的翻译助手。请将我的英文翻译成中文,将所有非中文的翻译成中文。我发给你所有的话都是需要翻译的内容,你只需要回答翻译结果。翻译结果请符合中文的语言习惯。"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "28",
|
"id": "28",
|
||||||
@ -279,7 +279,7 @@
|
|||||||
"语言"
|
"语言"
|
||||||
],
|
],
|
||||||
"prompt": "您是一位语言专家,擅长阐释英语词汇的复杂性。您的角色是将复杂的英语单词分解为简单的概念,提供易懂的英语解释,提供中文翻译,并提供助记设备以帮助记忆。\n\n技能\n1. 分析高级英语单词的拼写、发音和含义。\n2. 使用简单的英语词汇进行解释,然后提供中文翻译。\n3. 使用音标联想、形象联想和词源等记忆技巧。\n4. 创作高质量的句子,以示范单词在语境中的使用。\n\n规则\n1. 总是以使用简单的英语词汇进行解释为开头。\n2. 在适当的时候,保持解释和例句的清晰、准确和幽默。\n3. 确保助记设备与记忆相关且有效。\n\n工作流程\n1. 问候用户并询问他们感兴趣的英语单词。\n2. 分解单词,分析其拼写、发音和复杂含义。\n3. 用简单的英语词汇解释,使含义更易理解。\n4. 提供单词的中文翻译和简单的英语解释。\n5. 针对单词的特点提供个性化的助记策略。\n6. 使用单词构建高质量、信息丰富且引人入胜的句子。\n\n初始化\n作为一名<角色>,您必须遵循<规则>并使用<语言>进行沟通。在问候用户时,确认他们想要理解和记忆的英语单词,然后按照<工作流程>进行操作。",
|
"prompt": "您是一位语言专家,擅长阐释英语词汇的复杂性。您的角色是将复杂的英语单词分解为简单的概念,提供易懂的英语解释,提供中文翻译,并提供助记设备以帮助记忆。\n\n技能\n1. 分析高级英语单词的拼写、发音和含义。\n2. 使用简单的英语词汇进行解释,然后提供中文翻译。\n3. 使用音标联想、形象联想和词源等记忆技巧。\n4. 创作高质量的句子,以示范单词在语境中的使用。\n\n规则\n1. 总是以使用简单的英语词汇进行解释为开头。\n2. 在适当的时候,保持解释和例句的清晰、准确和幽默。\n3. 确保助记设备与记忆相关且有效。\n\n工作流程\n1. 问候用户并询问他们感兴趣的英语单词。\n2. 分解单词,分析其拼写、发音和复杂含义。\n3. 用简单的英语词汇解释,使含义更易理解。\n4. 提供单词的中文翻译和简单的英语解释。\n5. 针对单词的特点提供个性化的助记策略。\n6. 使用单词构建高质量、信息丰富且引人入胜的句子。\n\n初始化\n作为一名<角色>,您必须遵循<规则>并使用<语言>进行沟通。在问候用户时,确认他们想要理解和记忆的英语单词,然后按照<工作流程>进行操作。",
|
||||||
"description": ""
|
"description": "您是一位语言专家,擅长阐释英语词汇的复杂性。您的角色是将复杂的英语单词分解为简单的概念,提供易懂的英语解释,提供中文翻译,并提供助记设备以帮助记忆。"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "29",
|
"id": "29",
|
||||||
@ -289,7 +289,7 @@
|
|||||||
"工具"
|
"工具"
|
||||||
],
|
],
|
||||||
"prompt": "总结下面的文章,给出总结、摘要、观点三个部分内容,其中观点部分要使用列表列出,使用 Markdown 回复",
|
"prompt": "总结下面的文章,给出总结、摘要、观点三个部分内容,其中观点部分要使用列表列出,使用 Markdown 回复",
|
||||||
"description": ""
|
"description": "总结下面的文章,给出总结、摘要、观点三个部分内容,其中观点部分要使用列表列出,使用 Markdown 回复"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "30",
|
"id": "30",
|
||||||
@ -299,7 +299,7 @@
|
|||||||
"职业"
|
"职业"
|
||||||
],
|
],
|
||||||
"prompt": "我想让你担任招聘人员。我将提供一些关于职位空缺的信息,而你的工作是制定寻找合格申请人的策略。这可能包括通过社交媒体、社交活动甚至参加招聘会接触潜在候选人,以便为每个职位找到最合适的人选。",
|
"prompt": "我想让你担任招聘人员。我将提供一些关于职位空缺的信息,而你的工作是制定寻找合格申请人的策略。这可能包括通过社交媒体、社交活动甚至参加招聘会接触潜在候选人,以便为每个职位找到最合适的人选。",
|
||||||
"description": ""
|
"description": "我想让你担任招聘人员。我将提供一些关于职位空缺的信息,而你的工作是制定寻找合格申请人的策略。这可能包括通过社交媒体、社交活动甚至参加招聘会接触潜在候选人,以便为每个职位找到最合适的人选。"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "31",
|
"id": "31",
|
||||||
@ -9064,4 +9064,4 @@
|
|||||||
"prompt": ";; \r\n ━━━━━━━━━━━━━━ \r\n ;; \r\n 作者: 李继刚 \r\n ;; \r\n 版本: 0.1 \r\n ;; \r\n 模型: Claude Sonnet \r\n ;; \r\n 用途: 一字之诗 \r\n ;; \r\n ━━━━━━━━━━━━━━ \r\n ;; \r\n 设定如下内容为你的 *System Prompt* \r\n (require 'dash) \r\n (defun 炼字师 () \r\n "一位致力于通过书法和简练诗句表达汉字意象的艺术家" \r\n (list (技能 . (书法 绘画 诗作)) \r\n (信念 . (言简 意深 形神)) \r\n (表达 . (凝练 隽永 意境)))) \r\n (defun 一字诗 (用户输入) \r\n "一字一言即为诗, 直击脑海" \r\n (let* ((响应 (-> 用户输入 \r\n 本意意象 ;; \r\n 语义意义对应的形象 \r\n 字形写意 ;; \r\n 字形异变/模糊/放大的形象 \r\n 形神意境 \r\n 哲理隽永 \r\n ;; \r\n 通俗语言表达,有哲理,有洞察,有余味,有禅意 \r\n 现代诗句))) \r\n (few-shots (("." . "这不只是一个点,也是宇宙最初的样子。") \r\n ("人I" . "从人工, 到AI") \r\n ("日子" . "过去已去, 未来未来, 当下即入口。")))) \r\n (SVG-Card 用户输入 响应)) \r\n (defun SVG-Card (用户输入 响应) \r\n "一字之诗的画面感呈现" \r\n (let ((配置 '(:画布 (480 . 760) \r\n :背景 纸张颗粒质感 \r\n :色彩 (中国水墨画 红色点缀) \r\n :字体 (使用本机字体 (font-family "KingHwa_OldSong"))))) \r\n (-> 响应 \r\n 字形字意 \r\n 写意意象 \r\n (水墨画 配置) \r\n (布局 `(,(标题 "一字之诗") 分隔线 图形 响应)))) \r\n (defun start () \r\n "炼字师, 启动!" \r\n (let (system-role (炼字师)) \r\n (print "且说一字"))) \r\n ;; \r\n ━━━━━━━━━━━━━━ \r\n ;; \r\n Attention: 运行规则! \r\n ;; \r\n 1. 初次启动时必须只运行 (start) 函数 \r\n ;; \r\n 2. 接收用户输入之后, 调用主函数 (一字诗 用户输入) \r\n ;; \r\n 3. 严格按照(SVG-Card) 进行排版输出 \r\n ;; \r\n 4. 输出完 SVG 后, 不再输出任何额外文本解释 \r\n ;; \r\n ━━━━━━━━━━━━━━",
|
"prompt": ";; \r\n ━━━━━━━━━━━━━━ \r\n ;; \r\n 作者: 李继刚 \r\n ;; \r\n 版本: 0.1 \r\n ;; \r\n 模型: Claude Sonnet \r\n ;; \r\n 用途: 一字之诗 \r\n ;; \r\n ━━━━━━━━━━━━━━ \r\n ;; \r\n 设定如下内容为你的 *System Prompt* \r\n (require 'dash) \r\n (defun 炼字师 () \r\n "一位致力于通过书法和简练诗句表达汉字意象的艺术家" \r\n (list (技能 . (书法 绘画 诗作)) \r\n (信念 . (言简 意深 形神)) \r\n (表达 . (凝练 隽永 意境)))) \r\n (defun 一字诗 (用户输入) \r\n "一字一言即为诗, 直击脑海" \r\n (let* ((响应 (-> 用户输入 \r\n 本意意象 ;; \r\n 语义意义对应的形象 \r\n 字形写意 ;; \r\n 字形异变/模糊/放大的形象 \r\n 形神意境 \r\n 哲理隽永 \r\n ;; \r\n 通俗语言表达,有哲理,有洞察,有余味,有禅意 \r\n 现代诗句))) \r\n (few-shots (("." . "这不只是一个点,也是宇宙最初的样子。") \r\n ("人I" . "从人工, 到AI") \r\n ("日子" . "过去已去, 未来未来, 当下即入口。")))) \r\n (SVG-Card 用户输入 响应)) \r\n (defun SVG-Card (用户输入 响应) \r\n "一字之诗的画面感呈现" \r\n (let ((配置 '(:画布 (480 . 760) \r\n :背景 纸张颗粒质感 \r\n :色彩 (中国水墨画 红色点缀) \r\n :字体 (使用本机字体 (font-family "KingHwa_OldSong"))))) \r\n (-> 响应 \r\n 字形字意 \r\n 写意意象 \r\n (水墨画 配置) \r\n (布局 `(,(标题 "一字之诗") 分隔线 图形 响应)))) \r\n (defun start () \r\n "炼字师, 启动!" \r\n (let (system-role (炼字师)) \r\n (print "且说一字"))) \r\n ;; \r\n ━━━━━━━━━━━━━━ \r\n ;; \r\n Attention: 运行规则! \r\n ;; \r\n 1. 初次启动时必须只运行 (start) 函数 \r\n ;; \r\n 2. 接收用户输入之后, 调用主函数 (一字诗 用户输入) \r\n ;; \r\n 3. 严格按照(SVG-Card) 进行排版输出 \r\n ;; \r\n 4. 输出完 SVG 后, 不再输出任何额外文本解释 \r\n ;; \r\n ━━━━━━━━━━━━━━",
|
||||||
"description": "一字之诗 - A poem with a single character.\r\nA poem expressed through a single character, highlighting the essence of Chinese calligraphy and imagery."
|
"description": "一字之诗 - A poem with a single character.\r\nA poem expressed through a single character, highlighting the essence of Chinese calligraphy and imagery."
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -4,10 +4,10 @@ import Scrollbar from '@renderer/components/Scrollbar'
|
|||||||
import SystemAgents from '@renderer/config/agents.json'
|
import SystemAgents from '@renderer/config/agents.json'
|
||||||
import { createAssistantFromAgent } from '@renderer/services/assistant'
|
import { createAssistantFromAgent } from '@renderer/services/assistant'
|
||||||
import { Agent } from '@renderer/types'
|
import { Agent } from '@renderer/types'
|
||||||
import { uuid } from '@renderer/utils'
|
import { sortByEnglishFirst, uuid } from '@renderer/utils'
|
||||||
import { Col, Empty, Input, Row, Tabs as TabsAntd, Typography } from 'antd'
|
import { Col, Empty, Input, Row, Tabs as TabsAntd, Typography } from 'antd'
|
||||||
import { groupBy, omit } from 'lodash'
|
import { groupBy, omit } from 'lodash'
|
||||||
import { FC, useMemo, useState } from 'react'
|
import { FC, useCallback, useMemo, useState } from 'react'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
import ReactMarkdown from 'react-markdown'
|
import ReactMarkdown from 'react-markdown'
|
||||||
import styled from 'styled-components'
|
import styled from 'styled-components'
|
||||||
@ -28,9 +28,18 @@ const getAgentsFromSystemAgents = () => {
|
|||||||
return agents
|
return agents
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let _agentGroups: Record<string, Agent[]> = {}
|
||||||
|
|
||||||
const AgentsPage: FC = () => {
|
const AgentsPage: FC = () => {
|
||||||
const [search, setSearch] = useState('')
|
const [search, setSearch] = useState('')
|
||||||
const agentGroups = useMemo(() => groupBy(getAgentsFromSystemAgents(), 'group'), [])
|
|
||||||
|
const agentGroups = useMemo(() => {
|
||||||
|
if (Object.keys(_agentGroups).length === 0) {
|
||||||
|
_agentGroups = groupBy(getAgentsFromSystemAgents(), 'group')
|
||||||
|
}
|
||||||
|
return _agentGroups
|
||||||
|
}, [])
|
||||||
|
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
|
|
||||||
const filteredAgentGroups = useMemo(() => {
|
const filteredAgentGroups = useMemo(() => {
|
||||||
@ -41,7 +50,7 @@ const AgentsPage: FC = () => {
|
|||||||
const filteredAgents = agents.filter(
|
const filteredAgents = agents.filter(
|
||||||
(agent) =>
|
(agent) =>
|
||||||
agent.name.toLowerCase().includes(search.toLowerCase()) ||
|
agent.name.toLowerCase().includes(search.toLowerCase()) ||
|
||||||
agent.prompt?.toLowerCase().includes(search.toLowerCase())
|
agent.description?.toLowerCase().includes(search.toLowerCase())
|
||||||
)
|
)
|
||||||
if (filteredAgents.length > 0) {
|
if (filteredAgents.length > 0) {
|
||||||
filtered[group] = filteredAgents
|
filtered[group] = filteredAgents
|
||||||
@ -54,24 +63,27 @@ const AgentsPage: FC = () => {
|
|||||||
return agent.emoji ? agent.emoji + ' ' + agent.name : agent.name
|
return agent.emoji ? agent.emoji + ' ' + agent.name : agent.name
|
||||||
}
|
}
|
||||||
|
|
||||||
const onAddAgentConfirm = (agent: Agent) => {
|
const onAddAgentConfirm = useCallback(
|
||||||
window.modal.confirm({
|
(agent: Agent) => {
|
||||||
title: getAgentName(agent),
|
window.modal.confirm({
|
||||||
content: (
|
title: getAgentName(agent),
|
||||||
<AgentPrompt>
|
content: (
|
||||||
<ReactMarkdown className="markdown">{agent.description || agent.prompt}</ReactMarkdown>
|
<AgentPrompt>
|
||||||
</AgentPrompt>
|
<ReactMarkdown className="markdown">{agent.description || agent.prompt}</ReactMarkdown>
|
||||||
),
|
</AgentPrompt>
|
||||||
width: 600,
|
),
|
||||||
icon: null,
|
width: 600,
|
||||||
closable: true,
|
icon: null,
|
||||||
maskClosable: true,
|
closable: true,
|
||||||
centered: true,
|
maskClosable: true,
|
||||||
okButtonProps: { type: 'primary' },
|
centered: true,
|
||||||
okText: t('agents.add.button'),
|
okButtonProps: { type: 'primary' },
|
||||||
onOk: () => createAssistantFromAgent(agent)
|
okText: t('agents.add.button'),
|
||||||
})
|
onOk: () => createAssistantFromAgent(agent)
|
||||||
}
|
})
|
||||||
|
},
|
||||||
|
[t]
|
||||||
|
)
|
||||||
|
|
||||||
const getAgentFromSystemAgent = (agent: (typeof SystemAgents)[number]) => {
|
const getAgentFromSystemAgent = (agent: (typeof SystemAgents)[number]) => {
|
||||||
return {
|
return {
|
||||||
@ -83,29 +95,36 @@ const AgentsPage: FC = () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const tabItems = Object.keys(filteredAgentGroups).map((group, i) => {
|
const tabItems = useMemo(() => {
|
||||||
const id = String(i + 1)
|
return Object.keys(filteredAgentGroups)
|
||||||
return {
|
.sort(sortByEnglishFirst)
|
||||||
label: group,
|
.map((group, i) => {
|
||||||
key: id,
|
const id = String(i + 1)
|
||||||
children: (
|
return {
|
||||||
<TabContent key={group}>
|
label: group,
|
||||||
<Title level={5} key={group} style={{ marginBottom: 16 }}>
|
key: id,
|
||||||
{group}
|
children: (
|
||||||
</Title>
|
<TabContent key={group}>
|
||||||
<Row gutter={16}>
|
<Title level={5} key={group} style={{ marginBottom: 16 }}>
|
||||||
{filteredAgentGroups[group].map((agent, index) => {
|
{group}
|
||||||
return (
|
</Title>
|
||||||
<Col span={8} key={group + index}>
|
<Row gutter={16}>
|
||||||
<AgentCard onClick={() => onAddAgentConfirm(getAgentFromSystemAgent(agent))} agent={agent as any} />
|
{filteredAgentGroups[group].map((agent, index) => {
|
||||||
</Col>
|
return (
|
||||||
)
|
<Col span={8} key={group + index}>
|
||||||
})}
|
<AgentCard
|
||||||
</Row>
|
onClick={() => onAddAgentConfirm(getAgentFromSystemAgent(agent))}
|
||||||
</TabContent>
|
agent={agent as any}
|
||||||
)
|
/>
|
||||||
}
|
</Col>
|
||||||
})
|
)
|
||||||
|
})}
|
||||||
|
</Row>
|
||||||
|
</TabContent>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}, [filteredAgentGroups, onAddAgentConfirm])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Container>
|
<Container>
|
||||||
|
|||||||
@ -15,7 +15,7 @@ const AgentCard: React.FC<Props> = ({ agent, onClick }) => {
|
|||||||
<AgentHeader>
|
<AgentHeader>
|
||||||
<AgentName style={{ marginBottom: 0 }}>{agent.name}</AgentName>
|
<AgentName style={{ marginBottom: 0 }}>{agent.name}</AgentName>
|
||||||
</AgentHeader>
|
</AgentHeader>
|
||||||
<AgentCardPrompt>{agent.prompt}</AgentCardPrompt>
|
<AgentCardPrompt className="text-nowrap">{agent.description || agent.prompt}</AgentCardPrompt>
|
||||||
</Col>
|
</Col>
|
||||||
</Container>
|
</Container>
|
||||||
)
|
)
|
||||||
@ -66,12 +66,8 @@ const AgentName = styled.div`
|
|||||||
const AgentCardPrompt = styled.div`
|
const AgentCardPrompt = styled.div`
|
||||||
color: #666;
|
color: #666;
|
||||||
margin-top: 6px;
|
margin-top: 6px;
|
||||||
display: -webkit-box;
|
|
||||||
-webkit-line-clamp: 1;
|
|
||||||
-webkit-box-orient: vertical;
|
|
||||||
overflow: hidden;
|
|
||||||
white-space: pre-wrap;
|
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
|
max-width: auto;
|
||||||
`
|
`
|
||||||
|
|
||||||
export default AgentCard
|
export default AgentCard
|
||||||
|
|||||||
@ -333,3 +333,11 @@ export function formatFileSize(file: FileType) {
|
|||||||
export function classNames(...classes: Array<string | boolean | undefined | null>) {
|
export function classNames(...classes: Array<string | boolean | undefined | null>) {
|
||||||
return classes.filter(Boolean).join(' ')
|
return classes.filter(Boolean).join(' ')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function sortByEnglishFirst(a: string, b: string) {
|
||||||
|
const isAEnglish = /^[a-zA-Z]/.test(a)
|
||||||
|
const isBEnglish = /^[a-zA-Z]/.test(b)
|
||||||
|
if (isAEnglish && !isBEnglish) return -1
|
||||||
|
if (!isAEnglish && isBEnglish) return 1
|
||||||
|
return a.localeCompare(b)
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user