在docker中下载pengzhile/pandora,然后把代理网址设置为:api.u4vr.com
无需更多操作,上一代的pandora即可复活,只能保证寄出功能,不能保证gpt4。
关于代理源码,我可以给,有大佬愿意维护的话,其实可以还原所有功能,本人能力有限,但是公开意味着有暴毙风险,如果都愿意就公开
上班比较忙,摸鱼搞这些,统一回复一下。这个没有登录功能,或者说已失效,但是除此以外能复原所有的原有功能。其实对我来说主要是api,我有些东西是根据最初的api搭建的,老更新很麻烦,所以自己建了代理保持稳定。果然后面就变成了next,接口变了也有了限制,当然都很好也都能理解,但是比较懒的更新,所以就有了这个。其实这个的代理源码也是拿来搭建而已,也不是我写的,只是搭建,如果很多人想要公开也可以公开这个其实无所谓。至于自动登录,我自己目前解决自动登录的办法比较野鸡,但是很实用,原理如下:通过移动端的retoken每天定时更新登录token,然后定时下载,然后因为很多人也都知道,其实这个就是原来cli版本的拓展,所以这也是你如果只是更新token没有效果的原因,但是我用的是dsm7导致如果重启docker是可行的,但是总是收到docker崩溃的通知,强迫症受不了,于是简单的办法就是,定时下载新的token之后,运行一个别的端口的服务,杀死旧端口的服务,再运行旧端口的,这个过程也就几秒钟,从此就是无限登陆了,需要代码的我也可以给,包括siri运行基于该api的我在pandora的时候就弄出来了,本来说合并,但是也不了了之,总之,理性看待,反正基础功能没问题目前。
以下为通过re每日自动获取token脚本(自编写,很烂,懂的请自行优化):
<?php
include __DIR__ . '/config.php';
// 连接到 Redis 服务器
$redis = new Redis();
$redis->connect('127.0.0.1', 6379); // 服务器地址和端口
// 请求的 URL
$url = 'https://auth0.openai.com/oauth/token';
// 请求头部
$headers = array(
'Content-Type: application/json',
);
foreach ($acc_list as $uname=> $refresh_token){
wait();
echo"\n".'开始更新'.$uname.'的access_token'."\n";
// 请求数据
$data = array(
'grant_type' => 'refresh_token',
'client_id' => '随便一个客户端ID',
'refresh_token' => $refresh_token,
'redirect_uri' => 'com.openai.chat://auth0.openai.com/ios/com.openai.chat/callback',
);
// 初始化 cURL
$ch = curl_init();
// 设置 cURL 选项
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 添加以下两行来跳过SSL验证
#curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
#curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
// 执行请求并获取响应
$response = curl_exec($ch);
// 检查请求是否成功
if ($response === false) {
echo '请求失败: ' . curl_error($ch);
} else {
// 处理响应
$responseData = json_decode($response, true);
// 输出访问令牌
if (isset($responseData['access_token'])) {
// 定义保存到文件的数据
$data_to_file = array("1" => $responseData['access_token']);
$redis->set('access_token_'.$uname, $responseData['access_token']);
// 将数据保存到文件
$dir = '/你要保存的位置/token_'.$uname.'.json';
file_put_contents($dir, json_encode($data_to_file));
echo '新的Access Token已更新到 '.$dir.'文件'."\n";
} else {
echo '无法获取新的访问令牌'."\n";
}
}
}
// 关闭 cURL 资源
curl_close($ch);
以下为siri流式传输的主要代码你也可以调用别的都一样(自编写,很烂,懂的请自行优化):
<?php
// 定义一个名为PandoraAPI的类来处理所有的API请求
class PandoraAPI {
// 在这里声明所有的变量
private $baseURL; // API的基本URL地址
// 构造函数,用于初始化变量
public function __construct() {
$this->baseURL = 'https://你的项目地址/api'; // 将这个值替换为你的实际Pandora基本URL
}
// 这是一个私有函数,用于向API发送请求并接收响应
private function request($method, $endpoint, $data = [], $stream = false) {
$url = $this->baseURL . $endpoint; // 构建完整的API请求URL
$ch = curl_init(); // 初始化cURL会话
// 设置cURL选项
$options = [
CURLOPT_URL => $url, // 设置请求URL
CURLOPT_HTTPHEADER => [ // 设置HTTP头部
'Content-Type: application/json' // 设置内容类型为JSON
],
CURLOPT_RETURNTRANSFER => true // 将结果作为字符串返回而不是输出
];
// 如果请求方法为GET并且存在数据,则将数据添加到URL中
if ($method === 'GET' && !empty($data)) {
$options[CURLOPT_URL] .= '?' . http_build_query($data);
}
// 如果请求方法不是GET,设置POST选项或者自定义请求方法
elseif ($method !== 'GET') {
if ($method === 'DELETE') {
$options[CURLOPT_CUSTOMREQUEST] = 'DELETE'; // 设置请求方法为DELETE
} else {
$options[CURLOPT_POST] = true; // 设置请求方法为POST
$options[CURLOPT_POSTFIELDS] = json_encode($data); // 设置POST字段的数据
}
}
if($stream) {
$options[CURLOPT_WRITEFUNCTION] = function($ch, $data) {
$json = str_replace('data: ', '', $data);
$res_part = json_decode($json, true); // 将第二个参数设置为true,解析的结果将会是一个关联数组
if(@$res_part['message']['author']['role'] == 'assistant') {
$parts = $res_part['message']['content']['parts'][0]; // 获取parts的内容
// 创建一个 Redis 实例
$redis = new Redis();
// 连接 Redis 服务器
$redis->connect('127.0.0.1', 6379);
$redis->set('stream_new',$parts);
$redis->set('parent_message_id',$res_part['message']['id']);
$redis->set('conversation_id',$res_part['conversation_id']);
}
return strlen($data);
};
}
curl_setopt_array($ch, $options); // 设置cURL选项
$response = curl_exec($ch); // 执行cURL会话
// 如果在执行cURL会话时出现错误,抛出异常
if (curl_errno($ch)) {
throw new Exception('cURL Error: ' . curl_error($ch));
}
curl_close($ch); // 关闭cURL会话
// 将响应数据解码为PHP数组并返回
return json_decode($response, true);
}
// 获取可用模型的函数
public function getModels() {
// 调用request函数,请求方法为GET,端点为'/models'
return $this->request('GET', '/models');
}
// 获取会话列表的函数,可以设置偏移量和限制数量
public function getConversations($offset = 0, $limit = 20) {
// 调用request函数,请求方法为GET,端点为'/conversations',数据为偏移量和限制数量
return $this->request('GET', '/conversations', ['offset' => $offset, 'limit' => $limit]);
}
// 删除所有会话的函数
public function deleteConversations() {
// 调用request函数,请求方法为DELETE,端点为'/conversations'
return $this->request('DELETE', '/conversations');
}
// 在这里添加其他端点的函数...
public function talk($prompt, $model, $message_id = '', $parent_message_id = '') {
$url = '/conversation/talk';
$data = array(
'prompt' => $prompt,
'model' => $model,
'message_id' => $message_id,
'parent_message_id' => $parent_message_id,
'timezone_offset_min' => -480,
'stream' => false
);
$response = $this->request('POST', $url, $data);
return $response;
}
public function talk_one_all($prompt, $model, $message_id, $parent_message_id,$conversation_id) {
$url = '/conversation/talk';
$data = array(
'prompt' => $prompt,
'model' => $model,
'message_id' => $message_id,
'parent_message_id' => $parent_message_id,
'conversation_id' => $conversation_id,
'timezone_offset_min' => -480,
'stream' => false
);
$response = $this->request('POST', $url, $data);
return $response;
}
public function talk_one($prompt, $model, $message_id, $parent_message_id,$conversation_id) {
$url = '/conversation/talk';
$data = array(
'prompt' => $prompt,
'model' => $model,
'message_id' => $message_id,
'parent_message_id' => $parent_message_id,
'conversation_id' => $conversation_id,
'timezone_offset_min' => -480,
'stream' => true
);
$response = $this->request('POST', $url, $data,$stream = true);
return $response;
}
}
?>
以下为自动登录部分代码(自编写,很烂,懂的请自行优化):
curl -o /你要保存的地址/token.json https://每天更新保存的位置网址.json && bash /volume2/docker/AI/restart.sh
restart.sh:
#!/bin/bash
# Define the Docker container name
CONTAINER_NAME="更改为你自己的docker容器名"
# Step 1: Start Pandora process listening on 0.0.0.0:6544
docker exec -d ${CONTAINER_NAME} pandora --tokens_file /token.json -s 0.0.0.0:6544
# Step 2: Stop previous Pandora process (if exists)
docker exec ${CONTAINER_NAME} pkill -f "pandora --tokens_file /token.json -s 0.0.0.0:6543"
# Give some time for the process to start
sleep 0
# Step 3: Start new Pandora process listening on 0.0.0.0:6543
docker exec -d ${CONTAINER_NAME} pandora --tokens_file /token.json -s 0.0.0.0:6543
# Step 4: Stop previous Pandora process (if exists)
docker exec ${CONTAINER_NAME} pkill -f "pandora --tokens_file /token.json -s 0.0.0.0:6544"
说明:其中6543为你运行的端口,6544就随你便了(黑体字是因为前面有注释用的井号别弄错了,不注释掉肯定会报错)