新加坡的逆向计算爱好者 Yeo Kheng Meng 发布了一个 “doschgpt” ChatGPT 客户端,这个客户端适用于上世纪八十年代的 MS-DOS 系统。
目前这个 DOS 系统的 ChatGPT 客户端已成功在 1984 年的 IBM 5155 便携式 PC 上运行,这台机子配备 4.77Mhz 主频的 Intel 8088 CPU 和 MS-DOS 6.22 系统,带 640KB 内存、以及 CGA ISA 图形。
Yeo 老哥是个不折不扣的 “复古守旧派”,早在 2019 年他就为 Windows 3.1 开发了一个 Slack 客户端,这次更是把 1981 年的 MS-DOS 纯文本操作系统和最新的 ChatGPT 两个跨了 40 多年的东西组合到一块。
最有意思的是整个程序的开发过程, Yeo 老哥先是找到一个能开发 16 位 DOS 程序的 “Open Watcom” C/C++ 编译器 ,它本身是一个 32 位程序,这意味着它可以在 64 位 Windows 11 等现代平台上运行。
但是 64 位的 Windows 又没法执行 16 位的 DOS 程序,而每次都在 640K 内存的老电脑上跑测试也并不是很现实。于是 Yeo 开一个运行 DOS 6.22 的 Virtualbox 虚拟机,然后将虚拟机和主机桥接网络,方便传输文件进行开发和测试,等测试完成后再把二进制文件传到实际的 IBM PC 上运行。
但这时另外一个问题来了:如何在这么老的 IBM PC 上处理网络? 在这一步 ,Yeo 找到了一个 1983 年的 Packet Driver API ,然后使用开源的 MTCP 库集成到应用程序中,以与 Packet Driver 进行通信,从而为客户端启用网络功能。
而要使用 ChatGPT API,必须要有一个 Post 请求,然而 DOS 没有可以使用的辅助函数,必须用 C 语言手动构建整个 POST 请求:
#define API_CHAT_COMPLETION "POST /v1/chat/completions HTTP/1.1\r\nContent-Type: application/json\r\nAuthorization: Bearer %s\r\nHost: api.openai.com\r\nContent-Length: %d\r\nConnection: close\r\n\r\n%s"
#define API_BODY "{ \"model\": \"%s\", \"messages\": [{\"role\": \"user\", \"content\": \"%s\"}], \"temperature\": %.1f }"
这时 ChatGPT API 会返回一份 JSON 输出,需要解析其中 “Content” 键的值。很明显,这一步也没有现成的 JSON 库可用,只能手动写键值对的解析代码。
这时新的问题来了: ChatGPT API 通过 HTTPS 加密,但 DOS 系统没有本机 HTTPS, Yeo 只能编写一个 go 语言的 HTTP 到 HTTPS 代理 (有点像中间服务器),然后在现代 PC 上运行这个代理。充当一个透明中间人。它检查 HTTP 请求的主机字段,并将原始套接字字节作为 HTTPS 转发到 OpenAI 的服务器。
这一步有点像作弊,但属实是无奈之举,毕竟要在 Intel 8088 上运行现代 TLS 加密算法,属实是太难为这个传家宝系列的 CPU 了。
剩下的就是如何将对话内容读 / 写输入到控制台,这一步不再赘述,感兴趣的朋友可以在 Yeo 的博客中查看完整的开发过程。最终实现的效果:
Yeo 已经把整个 doschgpt 客户端在 Github 上开源,里面有详细的教程,感兴趣的朋友可以自己动手试试(前提是家里有 MS-DOS 系统的传家宝机器😂…)
另外,这回图拉丁老哥们有话说了,还在嫌弃机子的配置不行?处理器低于 3.0 Ghz 不能用?人家怎么就能在 4.77Mhz 的 CPU 上跑 ChatGPT ?还不是自己动手能力太差!还是那句话,东西老点差点怎么了,又不是不能用!