MicroPython对接大模型:uopenai + 火山方舟实现文字聊天和图片理解
引言openai是 OpenAI 官方推出的 Python 客户端库它封装了 OpenAI 系列模型如 GPT、DALL-E、Whisper 等的 RESTful API 调用让开发者无需手动处理HTTP请求、鉴权和数据解析就能快速将 AI 能力集成到 Python 应用中。它的核心能力覆盖了文本生成基于 GPT 系列模型实现对话、代码生成、内容创作与智能问答图像生成与理解通过 DALL-E 生成图像或结合 GPT-4V 实现视觉问答语音处理Whisper 模型实现语音转文本以及文本转语音向量嵌入将文本转换为向量表示支撑语义搜索、推荐系统等场景模型微调与助手应用支持自定义模型训练以及构建具备上下文记忆、工具调用能力的智能助手。开发者只需几行代码就能调用 GPT、DeepSeek、豆包等模型完成文字对话、视觉理解、语音合成、图片生成等任务由于接口已成为行业标准DeepSeek、字节豆包、Moonshot、智谱等国内厂商均提供OpenAI兼容接口只需替换base_url和model即可无缝切换from openai import OpenAIclient OpenAI(api_keysk-..., base_urlhttps://api.openai.com/v1)resp client.chat.completions.create(modelgpt-4o,messages[{role: user, content: Hello!}],)print(resp.choices[0].message.content)在 PC 或服务器端openai库依赖完善的 Python 标准库、充足的内存与算力能轻松处理同步 / 异步请求、流式响应和复杂数据解析。但当我们想把 AI 能力带到嵌入式设备时这些优势反而成了 “负担”。在树莓派 Pico W、ESP32 这类资源受限的嵌入式设备上运行 MicroPython 时直接使用 PC 端的openai库几乎不可能内存极度受限Pico 2W 可用堆内存约 150 KBPC 端 openai SDK 依赖 httpx、pydantic 等重型库完全无法运行无标准 HTTPS 客户端需要基于原生 socket ssl 手动实现 TLS 握手、HTTP/1.1 请求构造和响应解析。异步模型不同MicroPython 的asyncio不支持asyncio.wait_for()超时socket必须设为非阻塞模式所有 I/O 循环需手动插入await asyncio.sleep_ms()让出 CPU。大payload发送问题非阻塞socket缓冲区有限发送base64图片等大JSON body时必须分块写入否则数据截断导致服务端解析失败。无 file 对象PC 端通过fileopen(...)上传音频文件MicroPython不支持此模式需改用文件路径字符串流式上传。uopenai是专为MicroPython设计的轻量级OpenAI兼容异步客户端依赖同样自研的aiohttps库无任何其他外部依赖。它的设计目标是在 Pico 2W 等嵌入式设备上用与 PC 端 openai SDK 几乎相同的接口调用 OpenAI 兼容的云端 LLM API# 与 PC 端几乎一致的写法from uopenai import OpenAIclient OpenAI(api_key..., base_urlhttps://ark.cn-beijing.volces.com/api/v3)resp await client.chat.completions.create(modeldeepseek-v3-2-251201,messages[{role: user, content: 你好}],)print(resp.choices[0].message.content)二、uopenai 接口说明2.1 基本介绍库的地址在uopenaiuopenai是一个专为 MicroPython 设计的轻量级 OpenAI 兼容异步客户端库。它基于aiohttps实现无其他外部依赖支持非流式和流式SSE文字对话、视觉模型图片输入、base64 图片编码特别适合内存受限的嵌入式设备如 Pico 2W与 OpenAI 兼容云端 APIDeepSeek、豆包、Moonshot 等的对接。主要功能包括文字对话非流式chat.completions.create()返回完整响应对象含id、model、usage、choices文字对话流式 SSEstreamTrue返回aiohttps.Response通过iter_lines()逐块读取视觉模型支持content为列表格式传入image_urlbase64 data URI图片编码OpenAI.encode_image(filepath)静态方法将本地图片编码为 base64 字符串请求超时create(timeout_ms30000)支持自定义超时避免服务端无响应时永久阻塞接口兼容与 PC 端openaiSDK 保持最大接口兼容base_url可替换为任意 OpenAI 兼容服务内含文件包括uopenai/├── code/│ ├── uopenai.py # 驱动核心实现│ ├── main.py # 使用示例 / 测试代码│ └── test_4kb.jpg # 视觉测试用图3516 字节128x128├── package.json # mip 包配置含 aiohttps 依赖├── README.md # 使用文档└── LICENSE # MIT 开源协议2.2软件设计核心思想与 PC 端 openai SDK 保持最大接口兼容# PC 端 openai SDKfrom openai import OpenAIclient OpenAI(api_key..., base_url...)resp client.chat.completions.create(model..., messages[...])# uopenaiMicroPythonfrom uopenai import OpenAIclient OpenAI(api_key..., base_url...)resp await client.chat.completions.create(model..., messages[...])唯一区别所有create()方法均为async需在asyncio事件循环中调用。流式 SSE 读取streamTrue时直接返回底层aiohttps.Response调用方通过iter_lines()逐行读取 SSE 数据内存峰值仅为单行大小stream_resp await client.chat.completions.create(model..., messages[...], streamTrue)async for line in stream_resp.iter_lines():if line.startswith(bdata: ) and line ! bdata: [DONE]:delta json.loads(line[6:])[choices][0][delta]print(delta.get(content, ), end)视觉模型与 base64 限制encode_image()将整个图片文件读入内存后编码适合小图片 6 KB 原图。Pico 2W 可用 RAM 约 150 KBbase64 编码后体积约为原图的 1.37 倍总 JSON payload 需控制在 12 KB 以内以确保服务端正常响应。2.3API 速查和常用参数2.4 使用注意依赖 aiohttps使用前必须先将aiohttps.pyv1.1.3上传到设备根目录mip 安装时会自动处理依赖。所有 create() 均为 async必须在asyncio事件循环中调用不支持同步调用。不支持fileopen(...)传参MicroPython 无标准file对象改用filepath字符串audio.transcriptions待实现。视觉模型图片大小限制encode_image()将整个文件读入内存建议原图 6 KBbase64 后 8 KB总 JSON payload 控制在 12 KB 以内。超出可能导致服务端拒绝或响应超时。超时设置默认timeout_ms3000030 秒。视觉模型响应较慢建议设置timeout_ms60000。thinking 模型兼容部分模型如 doubao-seed返回content: null库已自动处理为空字符串。待实现接口audio.transcriptions.create()、audio.speech.create()、images.generations.create()当前为 TODO调用后返回None。嵌入式 TTS/ASR 推荐使用 WebSocket 流式连接实现参考xfyun_tts/xfyun_asr。三、文字聊天和图片理解测试这里我们首先需要在火山引擎上创建API Key这是调用大模型的核心凭证:登录火山方舟平台后在左侧导航栏找到并进入「API Key 管理」页面这里集中管理所有大模型服务的访问密钥准备开启密钥创建流程。在弹出的「创建 API Key」窗口中所属项目默认选择default默认项目名称可自定义也可使用自动生成的时间戳命名权限保持「全部可访问项目下全部资源」确认配置后点击「创建」。创建完成后API Key 会出现在列表中点击密钥旁的复制图标即可保存完整密钥⚠️ 密钥仅创建时可完整查看需妥善保管避免泄露造成安全与资金风险。这里我们选择下面两个模型进行测试支持多模态理解的Doubao-Seed-2.0-mini模型 —— 它支持文字、图片输入能同时满足文本聊天与图片理解的需求DeepSeek-V3.2模型它平衡了推理能力与响应效率适合通用问答等纯文本交互场景。模型地址账号登录-火山引擎模型地址账号登录-火山引擎注意我们需要记住模型的base_url和model名字打开Doubao-Seed-2.0-mini模型详情页点击右侧的「API 接入」按钮这是从 “模型体验” 到 “实际开发调用” 的关键入口后续所有接入配置都将从此展开。在弹出的「快捷 API 接入」窗口中完成 API Key 选择后点击「STEP 2 快速接入测试」这一步将帮助我们验证 API Key 的有效性并获取官方提供的调用示例代码。在快速接入测试界面中切换到「OpenAI SDK 调用示例」标签。从示例中提取两个必须配置的关键参数base_urlhttps://ark.cn-beijing.volces.com/api/v3火山方舟的 OpenAI 兼容接口地址modeldoubao-seed-2-0-mini-260215当前选择的多模态模型 ID。这两个参数将直接用于 MicroPython 代码中作为连接火山方舟 API 的核心配置。接下来我们在upypi上搜索uopenai复制安装命令在终端执行mpremote mip install https://upypi.net/pkgs/uopenai/1.0.0