• 金蝶云苍穹-插件开发(四)GPT开发相关插件


    我只对GPT开发的相关插件进行讲解,因为我的是插件开发教程,关于GPT的一些提示词的写法,GPT任务的配置,请去金蝶云苍穹的文档和社区内学习。

    GPT自定义操作

    GPT自定义操作的代码的类要实现 IGPTAction 这个接口,这个接口下只有一个要实现的方法,invokeAction方法,GPT自定义操作的业务功能便是在这个方法内写。

    1. public class GetBooksInfo implements IGPTAction {
    2. @Override
    3. public Map invokeAction(String action, Map params) {
    4. }
    5. }

    先对invokeAction的参数列表进行讲解:

    第一个String类型的参数action指的是自定义操作的操作名称,第二个参数params指的是这个GPT操作的输入参数,要获取输入参数只要params.get("输入参数名")就可以获取到对应的参数值。

    关于返回值

    返回值类型是一个Map类型的变量,在其中的元素中,一个元素就是一个输出参数,key就是输出参数的名称,value就是对应的参数值。

    通常,如果是返回给输出参数一个数据,则使用JsonObject类型的变量来储存,只要用其put方法,将要存入的信息放进去就行。最后将这个JsonObject类型的变量用toJsonString变成json信息存到输出参数。

    如果是返回给输出参数一组数据,则使用则使用JsonObject类型的变量来储存一个数据,再使用JsonArray来存储一个个JsonObject变量,就完成了一组数据的存储,最后将这个JsonArray类型的变量用toJsonString变成json信息存到输出参数。

    注:记得JsonArray和JsonObject要import阿里的fastjson

    案例:找对应书籍的书籍类型的所有数据:

    1. /**
    2. * 用于查询书籍信息的插件
    3. */
    4. public class DemoTask implements IGPTAction {
    5. @Override
    6. public Map invokeAction(String action, Map params) {
    7. Map result = new HashMap<>();
    8. //如果操作名称相等
    9. if ("GET_Library_Books".equalsIgnoreCase(action)) {
    10. //获取书籍名称
    11. String type = params.get("type");
    12. //获取DynamicObject列表,将要获取的字段信息注入
    13. DynamicObject[] dys = BusinessDataServiceHelper.load("abq2_books_info",
    14. "number," +
    15. "abq2_textfield," +
    16. "type," +
    17. "group," +
    18. "name," +
    19. "abq2_introduction",
    20. (new QFilter("type", QCP.equals, type)).toArray());
    21. //创建一个JsonArray
    22. JSONArray jsonArray = new JSONArray();
    23. for (DynamicObject dynamicObject : dys) {
    24. //将每一个书籍的信息加入JSONArray
    25. JSONObject jsonObject = new JSONObject();
    26. jsonObject.put("number", dynamicObject.getString("number"));
    27. jsonObject.put("abq2_textfield", dynamicObject.getString("abq2_textfield"));
    28. jsonObject.put("name", dynamicObject.getString("name"));
    29. jsonObject.put("group", dynamicObject.getString("group"));
    30. jsonObject.put("abq2_introduction", dynamicObject.getString("abq2_introduction"));
    31. jsonArray.add(jsonObject);
    32. }
    33. System.out.println(jsonArray.toJSONString());
    34. //加入resultDynamicObject参数,将JsonArray加入到这个参数当中,然后返回
    35. result.put("resultDynamicObject", jsonArray.toJSONString());
    36. }
    37. return result;
    38. }
    39. }

    微服务调用

    微服务调用是将数据给GPT提示或GPT任务,GPT提示和GPT任务便会根据数据进行执行,然后可以获取到执行后的结果,即将GPT的运行隐形在代码中。

    获取相应GPT提示和GPT任务的id

    通常有时候会要获取指定的GPT任务的id和GPT提示的id,其实GPT提示和GPT任务也是基础资料,也根据相应的方式获取就行,我这有可以现成的可以复制粘贴过去用的自定义方法,可以参照一下:

    获取GPT提示:

    1. //获取GPT提示的id
    2. public long getPromptFid(String billNo) {
    3. DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle("gai_prompt",
    4. "number," +
    5. "id",
    6. (new QFilter("number", QCP.equals, billNo)).toArray());
    7. return dynamicObject.getLong("id");
    8. }

     获取GPT任务:

    1. //获取GPT任务的id
    2. public long getProcessFid(String billNo) {
    3. DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle("gai_process",
    4. "number," +
    5. "id",
    6. (new QFilter("number", QCP.equals, billNo)).toArray());
    7. return dynamicObject.getLong("id");
    8. }

    参数都是指定的GPT提示编码和GPT任务编码。

    我这里只讲三个微服务调用的方法:

    GaiPromptService的syncCall

    这个是调用GPT提示的API,我先展示源码的参数列表:

    public Map syncCall(long promptId, String input, Map varParams) {

    第一个参数是指定GPT提示的id,第二个参数是用户的输入信息(就是对话框要输入的),第三个参数是GPT提示的输入参数的集合(输入参数和这个集合中的元素要对应,不然会报错)。

    GPT提示的执行和输出信息的获取:

    1. Map result = DispatchServiceHelper.invokeBizService("ai", "gai", "GaiPromptService", "syncCall", params);
    2. JSONObject jsonObjectResult = new JSONObject(result);
    3. JSONObject jsonObjectData = jsonObjectResult.getJSONObject("data");
    4. String llmValue = jsonObjectData.getString("llmValue")

    GPT提示的执行是靠DispatchServiceHelper.invokeBizService反射执行的,最后的llmValue就是GPT提示的输出信息

    案例:日任务总结:

    1. /**
    2. * 用于智能总结日任务情况
    3. */
    4. public class EvaluateSum extends AbstractBillPlugIn {
    5. @Override
    6. public void registerListener(EventObject e) {
    7. //注册点击事件
    8. super.registerListener(e);
    9. this.addItemClickListeners("tbmain");
    10. }
    11. public void itemClick(ItemClickEvent e) {
    12. super.itemClick(e);
    13. if (e.getItemKey().equalsIgnoreCase("abq2_evaluate")) {
    14. //获取日任务信息,并且以JSON字符串的形式展现
    15. JSONObject jsonResultObject = new JSONObject();
    16. jsonResultObject.put("taskName", this.getModel().getValue("name").toString());
    17. jsonResultObject.put("createTime", this.getModel().getValue("abq2_task_create_time").toString());
    18. //获取当前页面的单据体的数据
    19. DynamicObjectCollection dynamicObjectCollection = this.getModel().getEntryEntity("abq2_task_entryentity");
    20. JSONArray jsonTaskArray = new JSONArray();
    21. for (DynamicObject dynamicObjectSingle : dynamicObjectCollection) {
    22. JSONObject jsonObjectSingle = new JSONObject();
    23. jsonObjectSingle.put("taskContent", dynamicObjectSingle.getString("abq2_task_context"));
    24. jsonObjectSingle.put("expectTime", dynamicObjectSingle.getString("abq2_expect_minute"));
    25. jsonObjectSingle.put("diff", dynamicObjectSingle.getString("abq2_diff"));
    26. jsonObjectSingle.put("finishTime", dynamicObjectSingle.getString("abq2_true_minute"));
    27. jsonObjectSingle.put("finishSituation", dynamicObjectSingle.getString("abq2_finish"));
    28. jsonTaskArray.add(jsonObjectSingle);
    29. }
    30. jsonResultObject.put("taskIntroduction", jsonTaskArray);
    31. //调用GPT开发平台微服务
    32. Map variableMap = new HashMap<>();
    33. variableMap.put("taskResult", jsonResultObject.toJSONString());
    34. Object[] params = new Object[] {
    35. //GPT提示编码
    36. getPromptFid("prompt-24052235A7AD28"),
    37. "",
    38. variableMap
    39. };
    40. Map result = DispatchServiceHelper.invokeBizService("ai", "gai", "GaiPromptService", "syncCall", params);
    41. JSONObject jsonObjectResult = new JSONObject(result);
    42. JSONObject jsonObjectData = jsonObjectResult.getJSONObject("data");
    43. //设置值
    44. this.getModel().setValue("abq2_evaluate_and_sum", jsonObjectData.getString("llmValue"));
    45. Markdown mk = this.getView().getControl("abq2_markdownap");
    46. mk.setText(jsonObjectData.getString("llmValue"));
    47. }
    48. }
    49. //获取GPT提示的Fid
    50. public long getPromptFid(String billNo) {
    51. DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle("gai_prompt",
    52. "number," +
    53. "id",
    54. (new QFilter("number", QCP.equals, billNo)).toArray());
    55. return dynamicObject.getLong("id");
    56. }
    57. @Override
    58. public void afterBindData(EventObject eventObject) {
    59. Markdown mk = this.getView().getControl("abq2_markdownap");
    60. mk.setText(this.getModel().getValue("abq2_evaluate_and_sum").toString());
    61. }
    62. }

    剩下两个是GPT任务相关的:

    GaiService的selectProcessInSideBar

    DispatchServiceHelper.invokeBizService("ai", "gai", "GaiService","selectProcessInSideBar",pkValue,pageId,"……(GPT提示信息)");

    这个是在页面中执行后就会弹出GPT对话框,并自动选择好相应的GPT任务的技能的方法。

    pkValue就是GPT任务的id,pageId就是当前页面的pageId

    示例:(这里的id的获取方式可以参照上面的获取GPT任务的id的自定义方法)

    1. /**
    2. * 基础资料插件
    3. */
    4. public class FastShowSchedule extends AbstractBasePlugIn implements Plugin {
    5. @Override
    6. public void beforeDoOperation(BeforeDoOperationEventArgs e) {
    7. super.beforeDoOperation(e);
    8. String operateKey = ((FormOperate) e.getSource()).getOperateKey();
    9. if (operateKey.equals("showai")){
    10. String pageId = this.getView().getMainView().getPageId();
    11. //GPT任务的id编码
    12. Object pkValue = Long.parseLong("1954601799130295296");
    13. DispatchServiceHelper.invokeBizService("ai", "gai", "GaiService","selectProcessInSideBar",pkValue,pageId,"请输入你的日任务内容");
    14. }
    15. }
    16. }

    GaiService的startProcessInSideBar

    DispatchServiceHelper.invokeBizService("ai", "gai", "GaiService","startProcessInSideBar",pkValue,pageId,new HashMap(),"……(用户的输入信息)");

    中间的那个map是GPT任务要的输入参数,如果没有输入参数可以给个空的集合,使用这个之后,GPT任务会自动运行,但是,弹窗不会自动打开,我也没找到能一起打开弹窗的办法,但是打开弹窗能看到GPT任务已经在对话框输出了,只能先打开对话框,再执行相应的GPT任务。

    示例:

    1. @Override
    2. public void beforeDoOperation(BeforeDoOperationEventArgs e) {
    3. super.beforeDoOperation(e);
    4. String operateKey = ((FormOperate) e.getSource()).getOperateKey();
    5. if (operateKey.equals("showai")){
    6. String pageId = this.getView().getMainView().getPageId();
    7. //GPT任务的id编码
    8. Object pkValue = Long.parseLong("1969087472054844416");
    9. DispatchServiceHelper.invokeBizService("ai", "gai", "GaiService","startProcessInSideBar",pkValue,pageId,new HashMap(),"帮我分析食堂数据");
    10. }
    11. }

  • 相关阅读:
    HTML的学习-3|HTML 标签(下)
    国产分布式数据库在证券行业的应用及实践
    如何将 JavaScript Excel XLSX 查看器添加到Web应用程序
    Java基础(程序控制结构篇)
    vue中v-for和v-if同时使用的解决办法
    c语言(看一遍就会操作,小马教一步步教你如何文件操作)
    【Paper】2022_离散时间多智能体系统编队-包围控制研究_李博凡
    java基础--JVM的学习1--jvm基础和class文件的组成
    Unity-2D像素晶格化消融
    大厂技术面试中的手撕代码应该如何准备?
  • 原文地址:https://blog.csdn.net/2302_79468488/article/details/140321455