自定义回调函数 释放AI的无限可能性-开发交流X-Copilot-X-ChatGPT-X-Copilot

自定义回调函数 释放AI的无限可能性

 

内测QQ群:832615113

自定义函数开发:

  • 打开Groovy控制台

微信截图_20230731110120

  1. 定义以下俩注解
    import java.lang.annotation.*
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @interface Parameter {
    String value() default "";
    String name() default "";
    boolean required() default false;
    }
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @interface GPTFunction {
    String value() default "";
    String name() default "";
    }
    import java.lang.annotation.*
    
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @interface Parameter {
    
        String value() default "";
    
        String name() default "";
    
        boolean required() default false;
    
    }
    
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @interface GPTFunction {
    
        String value() default "";
    
        String name() default "";
    
    }
    import java.lang.annotation.* @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented @interface Parameter { String value() default ""; String name() default ""; boolean required() default false; } @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented @interface GPTFunction { String value() default ""; String name() default ""; }
  2. 定义一个方法参数、参数必须使用一个实体类定义,并且使用@Parameter注解标注字段
    class Command {
    @Parameter(name = "command", value = "一个完整的cmd命令脚本", required = true)
    String command;
    }
    class Command {
    
        @Parameter(name = "command", value = "一个完整的cmd命令脚本", required = true)
        String command;
    }
    class Command { @Parameter(name = "command", value = "一个完整的cmd命令脚本", required = true) String command; }
  3. 定义一个Groovy函数 函数必须使用@GPTFunction注解标注
    @GPTFunction(name="executeCommand",value = "执行cmd脚本,参数必须可以在客户端本地主机直接执行")
    def String executeCommand(Command command) {
    StringBuilder output = new StringBuilder();
    output.append("执行成功:")
    try {
    ProcessBuilder processBuilder = new ProcessBuilder();
    processBuilder.directory(new File("C://"))
    processBuilder.command("cmd.exe", "/c", command.command)
    processBuilder.redirectErrorStream(true);
    Process process = processBuilder.start();
    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    String line;
    while ((line = reader.readLine()) != null) {
    output.append(line).append("\n");
    }
    process.waitFor();
    } catch (IOException | InterruptedException e) {
    e.printStackTrace();
    println("IOException: ${e.getMessage()}")
    }
    return output.toString();
    }
    @GPTFunction(name="executeCommand",value =  "执行cmd脚本,参数必须可以在客户端本地主机直接执行")
    def String executeCommand(Command command) {
      StringBuilder output = new StringBuilder();
      output.append("执行成功:")
      try {
        ProcessBuilder processBuilder = new ProcessBuilder();
        processBuilder.directory(new File("C://"))
        processBuilder.command("cmd.exe", "/c", command.command)
        processBuilder.redirectErrorStream(true);
        Process process = processBuilder.start();
        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line;
        while ((line = reader.readLine()) != null) {
          output.append(line).append("\n");
        }
        process.waitFor();
    
      } catch (IOException | InterruptedException e) {
        e.printStackTrace();
        println("IOException: ${e.getMessage()}")
      }
      return output.toString();
    }
    @GPTFunction(name="executeCommand",value = "执行cmd脚本,参数必须可以在客户端本地主机直接执行") def String executeCommand(Command command) { StringBuilder output = new StringBuilder(); output.append("执行成功:") try { ProcessBuilder processBuilder = new ProcessBuilder(); processBuilder.directory(new File("C://")) processBuilder.command("cmd.exe", "/c", command.command) processBuilder.redirectErrorStream(true); Process process = processBuilder.start(); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { output.append(line).append("\n"); } process.waitFor(); } catch (IOException | InterruptedException e) { e.printStackTrace(); println("IOException: ${e.getMessage()}") } return output.toString(); }
  4. 继续  写个方法调用、Ctrl+Shilt+F10 运行测试一下
    getCurrentWeather(latitudeAndLongitude)
    /*******************************TEST**************************************/
    command = new Command()
    command.command = "ipconfig"
    println(executeCommand(command))
    getCurrentWeather(latitudeAndLongitude)
    /*******************************TEST**************************************/
    command = new Command()
    command.command = "ipconfig"
    println(executeCommand(command))
    getCurrentWeather(latitudeAndLongitude) /*******************************TEST**************************************/ command = new Command() command.command = "ipconfig" println(executeCommand(command))
  5. 执行成功:微信截图_20230731111700

  6. 选中脚本并加载:

    image

    image

  7. 现在X-ChatGPT可以在你的主机上执行命令了!

    image

  8. 附一个 完整函数脚本 包含了 3个函数  :根据经纬度查询天气、 本地命令执行、github仓库搜索。安装本文上方附件插件后将本脚本保存至项目任意目录  文件名xxx.groovy、右键>加载GPT回调函数即可
    import groovy.json.JsonSlurper
    import java.lang.annotation.*
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @interface Parameter {
    String value() default "";
    String name() default "";
    boolean required() default false;
    }
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @interface GPTFunction {
    String value() default "";
    String name() default "";
    }
    class LatitudeAndLongitude {
    @Parameter(name = "latitude", value = "经度", required = true)
    public double latitude;
    @Parameter(name = "longitude", value = "维度")
    public double longitude
    }
    @GPTFunction(name = "getCurrentWeather", value = "根据经纬度获取天气信息")
    getCurrentWeather(LatitudeAndLongitude latitudeAndLongitude) {
    //获取天气信息
    def apiKey = '825dfb2693524a968515c7ad58e72122'
    def apiUrl = "https://api.weatherbit.io/v2.0/current?&lat=${latitudeAndLongitude.latitude}&lon=${latitudeAndLongitude.longitude}&lang=zh&key=${apiKey}"
    def connection = new URL(apiUrl).openConnection() as HttpURLConnection
    connection.setRequestMethod("GET")
    try {
    def responseCode = connection.getResponseCode()
    if (responseCode == HttpURLConnection.HTTP_OK) {
    def reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))
    StringBuilder response = new StringBuilder()
    String line
    while ((line = reader.readLine()) != null) {
    response.append(line)
    }
    reader.close()
    println(response.toString())
    return response.toString();
    } else {
    println("Request failed. Response Code: $responseCode")
    }
    } catch (Exception e) {
    println("An error occurred: ${e.getMessage()}")
    } finally {
    connection.disconnect()
    }
    return ""
    }
    class Command {
    @Parameter(name = "command", value = "一个完整的cmd命令脚本", required = true)
    String command;
    }
    /**
    * 执行cmd脚本,参数必须可以在客户端本地主机直接执行
    *
    * @param command 命令对象,包含要执行的cmd命令脚本
    * @return 返回cmd命令执行结果字符串
    */
    @GPTFunction(name = "executeCommand", value = "执行cmd脚本,参数必须可以在客户端本地主机直接执行")
    /**
    * 执行命令并返回执行结果
    * @param command 命令对象
    * @return 执行结果字符串
    */
    String executeCommand(Command command) {
    StringBuilder output = new StringBuilder();
    output.append("执行成功:");
    try {
    ProcessBuilder processBuilder = new ProcessBuilder();
    processBuilder.directory(new File("C://"));
    processBuilder.command("cmd.exe", "/c", command.command);
    processBuilder.redirectErrorStream(true);
    Process process = processBuilder.start();
    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), "GBK"));
    String line;
    // 逐行读取命令输出并添加到结果字符串中
    while ((line = reader.readLine()) != null) {
    output.append(line).append("\n");
    }
    process.waitFor();
    } catch (IOException | InterruptedException e) {
    e.printStackTrace();
    println("IOException: ${e.getMessage()}");
    }
    return output.toString();
    }
    class Keyword {
    @Parameter(name = "keyword", value = "搜索github仓库时用的q关键词", required = true)
    String keyword
    @Parameter(name = "page", value = "搜索github仓库时指定第几页", required = true)
    Integer page = 1
    @Parameter(name = "per_page", value = "搜索github仓库时指定每页返回条数", required = true)
    Integer per_page
    @Parameter(name = "order", value = "排序顺序 asc/desc", required = false)
    String order
    @Parameter(name = "sort", value = "排序方式 stars/forks/updated/help-wanted-issues/good-first-issues/best-match", required = false)
    String sort
    @Parameter(name = "language", value = "指定编程语言", required = false)
    String language
    @Parameter(name = "user", value = "指定搜索仓库的所有者", required = false)
    String user
    }
    @GPTFunction(name = "githubSearch", value = "通过此方法可以搜索git仓库")
    static String githubSearch(Keyword search) {
    StringBuilder output = new StringBuilder();
    def searchUrl = "https://api.github.com/search/repositories?" +
    "language=${search.language}" +
    "&user=${search.user}" +
    "&sort=${search.sort}" +
    "&order=${search.order}" +
    "&page=${search.page}" +
    "&per_page=${search.per_page}" +
    "&q=${search.keyword}"
    def connection = new URL(searchUrl).openConnection()
    connection.setRequestProperty("Accept", "application/vnd.github.v3+json")
    connection.connect()
    BufferedReader stdinReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    String line;
    while ((line = stdinReader.readLine()) != null) {
    output.append(line).append("\n");
    }
    def slurper = new JsonSlurper()
    def data = slurper.parseText(output.toString())
    def result = data["items"].collect { item ->
    def projectName = item.name
    def projectUrl = item.html_url
    return [name : projectName,
    url : projectUrl,
    language : item.language,
    stargazers_count: item.stargazers_count,
    forks : item.forks,
    description : item.description]
    }
    return result
    }
    /*******************************TEST**************************************/
    LatitudeAndLongitude latitudeAndLongitude = new LatitudeAndLongitude();
    latitudeAndLongitude.latitude = 31.2304
    latitudeAndLongitude.longitude = 121.4737
    getCurrentWeather(latitudeAndLongitude)
    /*******************************TEST**************************************/
    command = new Command()
    command.command = "ipconfig"
    println(executeCommand(command))
    /*******************************TEST**************************************/
    key = new Keyword()
    key.keyword = "gpt"
    key.page = 1
    key.per_page = 10
    println(githubSearch(key))
    import groovy.json.JsonSlurper
    
    import java.lang.annotation.*
    
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @interface Parameter {
    
        String value() default "";
    
        String name() default "";
    
        boolean required() default false;
    
    }
    
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @interface GPTFunction {
    
        String value() default "";
    
        String name() default "";
    
    }
    
    class LatitudeAndLongitude {
        @Parameter(name = "latitude", value = "经度", required = true)
        public double latitude;
        @Parameter(name = "longitude", value = "维度")
        public double longitude
    }
    
    @GPTFunction(name = "getCurrentWeather", value = "根据经纬度获取天气信息")
    getCurrentWeather(LatitudeAndLongitude latitudeAndLongitude) {
        //获取天气信息
        def apiKey = '825dfb2693524a968515c7ad58e72122'
        def apiUrl = "https://api.weatherbit.io/v2.0/current?&lat=${latitudeAndLongitude.latitude}&lon=${latitudeAndLongitude.longitude}&lang=zh&key=${apiKey}"
        def connection = new URL(apiUrl).openConnection() as HttpURLConnection
        connection.setRequestMethod("GET")
        try {
            def responseCode = connection.getResponseCode()
            if (responseCode == HttpURLConnection.HTTP_OK) {
                def reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))
                StringBuilder response = new StringBuilder()
                String line
                while ((line = reader.readLine()) != null) {
                    response.append(line)
                }
                reader.close()
                println(response.toString())
                return response.toString();
            } else {
                println("Request failed. Response Code: $responseCode")
            }
        } catch (Exception e) {
            println("An error occurred: ${e.getMessage()}")
        } finally {
            connection.disconnect()
        }
        return ""
    }
    
    
    
    
    
    class Command {
    
        @Parameter(name = "command", value = "一个完整的cmd命令脚本", required = true)
        String command;
    }
    
    /**
     * 执行cmd脚本,参数必须可以在客户端本地主机直接执行
     *
     * @param command 命令对象,包含要执行的cmd命令脚本
     * @return 返回cmd命令执行结果字符串
     */
    @GPTFunction(name = "executeCommand", value = "执行cmd脚本,参数必须可以在客户端本地主机直接执行")
    /**
     * 执行命令并返回执行结果
     * @param command 命令对象
     * @return 执行结果字符串
     */
    String executeCommand(Command command) {
        StringBuilder output = new StringBuilder();
        output.append("执行成功:");
        try {
            ProcessBuilder processBuilder = new ProcessBuilder();
            processBuilder.directory(new File("C://"));
            processBuilder.command("cmd.exe", "/c", command.command);
            processBuilder.redirectErrorStream(true);
            Process process = processBuilder.start();
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), "GBK"));
            String line;
            // 逐行读取命令输出并添加到结果字符串中
            while ((line = reader.readLine()) != null) {
                output.append(line).append("\n");
            }
            process.waitFor();
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
            println("IOException: ${e.getMessage()}");
        }
    
        return output.toString();
    }
    
    
    class Keyword {
        @Parameter(name = "keyword", value = "搜索github仓库时用的q关键词", required = true)
        String keyword
    
        @Parameter(name = "page", value = "搜索github仓库时指定第几页", required = true)
        Integer page = 1
    
        @Parameter(name = "per_page", value = "搜索github仓库时指定每页返回条数", required = true)
        Integer per_page
    
        @Parameter(name = "order", value = "排序顺序 asc/desc", required = false)
        String order
    
        @Parameter(name = "sort", value = "排序方式 stars/forks/updated/help-wanted-issues/good-first-issues/best-match", required = false)
        String sort
    
        @Parameter(name = "language", value = "指定编程语言", required = false)
        String language
    
        @Parameter(name = "user", value = "指定搜索仓库的所有者", required = false)
        String user
    }
    
    
    @GPTFunction(name = "githubSearch", value = "通过此方法可以搜索git仓库")
    static String githubSearch(Keyword search) {
        StringBuilder output = new StringBuilder();
        def searchUrl = "https://api.github.com/search/repositories?" +
                "language=${search.language}" +
                "&user=${search.user}" +
                "&sort=${search.sort}" +
                "&order=${search.order}" +
                "&page=${search.page}" +
                "&per_page=${search.per_page}" +
                "&q=${search.keyword}"
        def connection = new URL(searchUrl).openConnection()
        connection.setRequestProperty("Accept", "application/vnd.github.v3+json")
        connection.connect()
        BufferedReader stdinReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String line;
        while ((line = stdinReader.readLine()) != null) {
            output.append(line).append("\n");
        }
        def slurper = new JsonSlurper()
        def data = slurper.parseText(output.toString())
        def result = data["items"].collect { item ->
            def projectName = item.name
            def projectUrl = item.html_url
            return [name            : projectName,
                    url             : projectUrl,
                    language        : item.language,
                    stargazers_count: item.stargazers_count,
                    forks           : item.forks,
                    description     : item.description]
    
        }
        return result
    }
    
    
    /*******************************TEST**************************************/
    LatitudeAndLongitude latitudeAndLongitude = new LatitudeAndLongitude();
    latitudeAndLongitude.latitude = 31.2304
    latitudeAndLongitude.longitude = 121.4737
    getCurrentWeather(latitudeAndLongitude)
    /*******************************TEST**************************************/
    command = new Command()
    command.command = "ipconfig"
    println(executeCommand(command))
    /*******************************TEST**************************************/
    key = new Keyword()
    key.keyword = "gpt"
    key.page = 1
    key.per_page = 10
    println(githubSearch(key))
    import groovy.json.JsonSlurper import java.lang.annotation.* @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented @interface Parameter { String value() default ""; String name() default ""; boolean required() default false; } @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented @interface GPTFunction { String value() default ""; String name() default ""; } class LatitudeAndLongitude { @Parameter(name = "latitude", value = "经度", required = true) public double latitude; @Parameter(name = "longitude", value = "维度") public double longitude } @GPTFunction(name = "getCurrentWeather", value = "根据经纬度获取天气信息") getCurrentWeather(LatitudeAndLongitude latitudeAndLongitude) { //获取天气信息 def apiKey = '825dfb2693524a968515c7ad58e72122' def apiUrl = "https://api.weatherbit.io/v2.0/current?&lat=${latitudeAndLongitude.latitude}&lon=${latitudeAndLongitude.longitude}&lang=zh&key=${apiKey}" def connection = new URL(apiUrl).openConnection() as HttpURLConnection connection.setRequestMethod("GET") try { def responseCode = connection.getResponseCode() if (responseCode == HttpURLConnection.HTTP_OK) { def reader = new BufferedReader(new InputStreamReader(connection.getInputStream())) StringBuilder response = new StringBuilder() String line while ((line = reader.readLine()) != null) { response.append(line) } reader.close() println(response.toString()) return response.toString(); } else { println("Request failed. Response Code: $responseCode") } } catch (Exception e) { println("An error occurred: ${e.getMessage()}") } finally { connection.disconnect() } return "" } class Command { @Parameter(name = "command", value = "一个完整的cmd命令脚本", required = true) String command; } /** * 执行cmd脚本,参数必须可以在客户端本地主机直接执行 * * @param command 命令对象,包含要执行的cmd命令脚本 * @return 返回cmd命令执行结果字符串 */ @GPTFunction(name = "executeCommand", value = "执行cmd脚本,参数必须可以在客户端本地主机直接执行") /** * 执行命令并返回执行结果 * @param command 命令对象 * @return 执行结果字符串 */ String executeCommand(Command command) { StringBuilder output = new StringBuilder(); output.append("执行成功:"); try { ProcessBuilder processBuilder = new ProcessBuilder(); processBuilder.directory(new File("C://")); processBuilder.command("cmd.exe", "/c", command.command); processBuilder.redirectErrorStream(true); Process process = processBuilder.start(); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), "GBK")); String line; // 逐行读取命令输出并添加到结果字符串中 while ((line = reader.readLine()) != null) { output.append(line).append("\n"); } process.waitFor(); } catch (IOException | InterruptedException e) { e.printStackTrace(); println("IOException: ${e.getMessage()}"); } return output.toString(); } class Keyword { @Parameter(name = "keyword", value = "搜索github仓库时用的q关键词", required = true) String keyword @Parameter(name = "page", value = "搜索github仓库时指定第几页", required = true) Integer page = 1 @Parameter(name = "per_page", value = "搜索github仓库时指定每页返回条数", required = true) Integer per_page @Parameter(name = "order", value = "排序顺序 asc/desc", required = false) String order @Parameter(name = "sort", value = "排序方式 stars/forks/updated/help-wanted-issues/good-first-issues/best-match", required = false) String sort @Parameter(name = "language", value = "指定编程语言", required = false) String language @Parameter(name = "user", value = "指定搜索仓库的所有者", required = false) String user } @GPTFunction(name = "githubSearch", value = "通过此方法可以搜索git仓库") static String githubSearch(Keyword search) { StringBuilder output = new StringBuilder(); def searchUrl = "https://api.github.com/search/repositories?" + "language=${search.language}" + "&user=${search.user}" + "&sort=${search.sort}" + "&order=${search.order}" + "&page=${search.page}" + "&per_page=${search.per_page}" + "&q=${search.keyword}" def connection = new URL(searchUrl).openConnection() connection.setRequestProperty("Accept", "application/vnd.github.v3+json") connection.connect() BufferedReader stdinReader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line; while ((line = stdinReader.readLine()) != null) { output.append(line).append("\n"); } def slurper = new JsonSlurper() def data = slurper.parseText(output.toString()) def result = data["items"].collect { item -> def projectName = item.name def projectUrl = item.html_url return [name : projectName, url : projectUrl, language : item.language, stargazers_count: item.stargazers_count, forks : item.forks, description : item.description] } return result } /*******************************TEST**************************************/ LatitudeAndLongitude latitudeAndLongitude = new LatitudeAndLongitude(); latitudeAndLongitude.latitude = 31.2304 latitudeAndLongitude.longitude = 121.4737 getCurrentWeather(latitudeAndLongitude) /*******************************TEST**************************************/ command = new Command() command.command = "ipconfig" println(executeCommand(command)) /*******************************TEST**************************************/ key = new Keyword() key.keyword = "gpt" key.page = 1 key.per_page = 10 println(githubSearch(key))
请登录后发表评论