WinGPT 使用标准 Windows API 用 C 语言编写。我使用 Open Watcom v2作为编译器,这非常方便,因为它甚至支持从 Windows 11 交叉编译到 16 位 Windows。
WinGPT使用 TLS 1.3 本机 连接到 OpenAI API 服务器,因此不需要现代计算机上的代理来终止 TLS。要了解我是如何做到这一点以及一些挑战的,请查看16 位 Windows 上的现代 TLS。(正如您将在该页面上看到的,这不是一个安全的实现)。
构建用户界面
之前我已经习惯使用 Delphi构建像Windle这样的 Windows 应用程序,但如果只使用内置的 Windows API,Windows 3.1 的 UI 构建功能会显得多么原始,我对此感到惊讶。
我直接用 C 语言构建了大部分 UI,这意味着每个 UI 组件都必须在代码中手动构建。手动调整大小逻辑可确保调整窗口大小时每个组件保持其正确的大小。
尤其令我惊讶的是,可供任何 Windows 3.1 程序使用的标准控件集极其有限。您拥有一些您期望的控件(按钮、复选框、单选按钮、编辑框),但您可能需要的任何其他控件(包括在操作系统本身中使用的控件)不可用。
当我试图弄清楚如何向 WinGPT 添加状态栏时,我遇到了这个问题。状态栏出现在整个 Windows 3.1 中,包括文件管理器和控制面板中。不幸的是,直到Windows 95,微软才将它们与进度条、工具栏和树视图等其他有用的控件一起广泛提供给其他应用程序开发人员。[2]
顺便说一句,我问 ChatGPT 如何在我的程序中使用状态栏。它回复了一个仅适用于更高版本的 Windows 的头文件,当我要求它澄清时,它给出了一个非常诱人(但我很确定非常不存在)的 UI 库的名称。幸运的是,Philip J. Erdelsky 仍然拥有1997 年的状态栏实现 ,它在公共领域非常友好,我能够使用它!我修改了该代码,以便更准确地逐像素地表示 Microsoft 程序中的状态栏。
构建 WinGPT 的另一个有趣的部分是在 Borland 的图像编辑器中设计图标,它实际上只是 Microsoft Paint 的克隆,恰好制作了 ICO 文件。Windows 3.1 中的程序图标为 32×32,并显示在程序管理器和任务切换器中。我还设计了一个 16×16 版本,可以在更高版本的 Windows 上显示。
局限性
Windows 3.1 机器上的内存非常有限,因此我尝试减少 WinGPT 所需的内存量,特别是在发送和接收来自 OpenAI API 的查询和响应时。现代 API 的 JSON 响应并未针对大小进行特别优化,OpenAI 的 API 也不例外。我要求模型简短,以尽量减少响应。我还选择不在 API 调用中发送前几轮的文本,尽管这意味着机器人将无法使用先前的对话上下文。
尝试WinGPT
WinGPT 根据 GNU 通用公共许可证 (GPL) v2 获得许可。
WinGPT 可在 Windows 3.1 之后的任何 16 位或 32 位版本的 Windows 上运行。它需要 Winsock 的实现(在 Windows 3.11 for Workgroups 和普通 Windows 2000 上使用 Microsoft TCP/IP-32 3.11b 进行测试)。它不能在 64 位版本的 Windows 上运行(但可以在 Wine 上运行——试一试!)
您还需要一个 OpenAI API 密钥才能与 OpenAI 对话。打开 WinGPT 后,转到“文件”|“ 选项…输入您的密钥。