还原pandora的所有功能,不是什么创新只是复活

在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就随你便了(黑体字是因为前面有注释用的井号别弄错了,不注释掉肯定会报错)

81 Likes

这里能发链接,帮你编辑了链接

17 Likes

关注一下

2 Likes

复活了?:face_with_monocle:

2 Likes

pandora停服炸出一堆佬

9 Likes

站在巨人的肩膀上,你也可以成为英雄

3 Likes

docker仓库居然也还在

4 Likes

感谢分享

2 Likes

一鲸落万物生

7 Likes

哇咔咔

2 Likes

怎么使用,有详细步骤吗

3 Likes

mark一下

2 Likes

mark

2 Likes

有人试过没?

2 Likes
docker run  -e PANDORA_CLOUD=cloud \
            -e PANDORA_SERVER=0.0.0.0:8899 \
			-e CHATGPT_API_PREFIX=https://api.u4vr.com \
			-p 8899:8899 \
			--name=pandora \
            -d pengzhile/pandora

看看楼下的,我的有问题

5 Likes

PandoraNext,堂堂复活!

5 Likes

这个代理地址是你搭建的api服务器吗?

2 Likes

上一代的怎么使用有点忘了……楼主有链接么

2 Likes

厉害!可以继续战斗了

2 Likes

我来打个样,测试server模式可以,cloud模式貌似不行。老pandora文档真难找,好在github有人存档过,一并贴下来吧。

docker run -d --restart always --name pandora -e PANDORA_SERVER=0.0.0.0:3003 -e CHATGPT_API_PREFIX=https://api.u4vr.com -e PANDORA_ACCESS_TOKEN=<access token> -p 3003:3003 pengzhile/pandora

or docker-compose.yaml

version: '3'

services:
  pandora:
    image: pengzhile/pandora
    container_name: pandora
    restart: always
    ports:
      - "3003:3003"
    environment:
      - PANDORA_SERVER=0.0.0.0:3003
      - CHATGPT_API_PREFIX=https://api.u4vr.com
      - PANDORA_ACCESS_TOKEN=<access token>

https://github.com/cloud804d/mirrors-pengzhile-pandora/blob/master/doc/wiki.md

14 Likes