ChatGPT の返答を関数で受け取れるようにする

JavaScript の API をフックして chat.openai.com 上で実行したダイアログの返答を受け取る関数を定義できるようにします。

以下のスクリプトを Tampermonkey 等で chat.openai.com 以下にアクセスしたときに実行するようにします。あるいはコンソールから直接実行しても構いません。

(function() {
    if (window.__hooked) {
        return;
    }
    window.__hooked = true;
    let msg = null;
    const OrigTextDecoder = TextDecoder;
    TextDecoder = class {
        constructor() {
            this.orig = new OrigTextDecoder(...arguments);
        }

        decode() {
            const res = this.orig.decode(...arguments);
            try {
                msg = JSON.parse(res).message.content.parts[0];
            } catch (e) {
            }
            if (msg != null && res == "[DONE]") {
                if (window.ongpt) {
                    window.ongpt(msg);
                }
                msg = null;
            }
            return res;
        }
    };
})();

あとはグローバルコンテキスト上に ongpt 関数を定義すれば返答を受け取ることができます。

function ongpt(message) {
    console.log("message: " + message);
}

レンダリング結果ではなく生の文字列を処理したい時に使えます。

動かなくなったとき

そのうち仕様変更によって動かなくなる可能性が高いですが、軽微な変更であれば

msg = JSON.parse(res).message.content.parts[0];

この辺や

res == "[DONE]"

この辺を直せばまた使えるようになると思います。関数内にブレークポイントを仕込むなどして JSON の構造を見て、返答に対応する部分を msg に代入し、終了の合図が来た段階で ongpt に流してください

もはや TextDecoder が使われなくなっていた場合は諦めてください。

このエントリーをはてなブックマークに追加