分享: 在org-mode中使用chatGPT,通过在org中嵌入其它脚本语言实现

看效果图

在org中嵌入php可参考我的 另一贴子 ,php&elisp之外的语言我也还不知道如何实现这种用法。

上面的key被我隐去了,请求的地址不是openai的,是国内代理,据说一些AI工具的api和openai api是兼容的,把请求地址和key改下应该也能用。

所有参数、代码都是写在一个org文件里的,上面的截图可以看到elisp的,我用了不是异步的url-insert-file-contents, 点击提交按钮会卡住emacs,如果网络不好,要卡半天,另外连续对话也没有实现,只能作为openapi的交互式学习笔记。

内容较多,上面截图中的php代码折叠了,单独发出

$arr=org_to_arr(ob_get_clean());
if(!isset($_GET["con"]) || $_GET["con"]==""){
 echo "内容为空";
}else{
  #die(print_r($arr)); #!
  $json=json_decode(http_post_json(
    $arr[":地址:"],
    "Authorization: Bearer ".$arr[":密钥:"],
    array(
      "model"=>$arr[":模型:"],"messages"=>array(
        array("role"=>"user","content"=>$_GET["con"])
      ))
  ),true);
  echo $json["choices"][0]["message"]["content"];
  $json["choices"][0]["message"]["content"]="clean";
  echo "\n回答以外的其它信息:". json_encode($json);
}

function http_post_json(string $url,string $header,array $data,$time=99){
  $postdata = json_encode($data,JSON_UNESCAPED_UNICODE);
  $option=array(
    "http" => array(
      "method"=>"POST",
      "header"=>"Content-type:application/json\n".$header,
      "content"=>$postdata,
      "timeout"=>$time
    ));
  return file_get_contents($url,0,stream_context_create($option));
}
function org_to_arr(string $str){
  foreach(explode("\n",$str) as $v){
    if(substr($v,0,1)=="*"){ break; }#出现*直接退出
    $v=trim($v);
    $n=substr($v,0,1);
    if($v!=="" && $n!=="#"){
      $n=explode(" ",$v,2);
      if(isset($arr[$n[0]])){
        #die("chong he :".$v." ".$n[0]);
      }elseif(isset($n[1])){
        $arr[$n[0]]=trim(explode(";;",$n[1],2)[0]);
      }
    }
  }
  return $arr;
}

不知道有没有也折腾过在org-mode里用chatGPT的坛友

1 个赞

补充安全提醒:写的时候不会考虑那么多,但现在来看上面的代码,发现没有任何安全性可言,api key明文传输,不知转了多少中间服务商,这些服务商只要想都可以拦截或窃取到这个api key。 本文并没有多少实际参考价值