OmiFriendMultiOn Amazon 加购插件实战指南让对话中提到的书籍自动加入亚马逊购物车【免费下载链接】FriendAI that sees your screen, listens to your conversations and tells you what to do项目地址: https://gitcode.com/GitHub_Trending/fr/FriendOmiFriend的 MultiOn 插件是一款将对话即行动落地的实验性集成当你在佩戴 Omi 设备进行日常对话时提及某本书插件会自动识别书名并通过 MultiOn 的云端浏览器代理把这本书优先纸质/实体版本加入你的 Amazon 购物车。本文以 插件说明文档 为核心骨架结合仓库内真实实现源码与部署模板完整讲解从账号授权、USER ID 绑定到触发加购的每一个环节读完你既能独立完成插件配置也能从源码层面理解其转写识别 → 结构化抽取 → 浏览器自动化的完整链路。一、插件功能概述MultiOn 插件解决的是一个很典型的被动场景自动化问题Omi 设备在聆听对话时记录下大量上下文其中常常包含那本书挺不错我想买这类意愿但用户往往事后忘记去下单。该插件把这一系列动作串起来对话转写文本transcript中一旦出现明确提到的书名插件自动检测并抽取抽取结果通过 MultiOn 云端浏览器对amazon.com执行加购操作默认偏好 paperback 或任意实体版本用户在 Amazon 结算前仍可自行查看、修改购物车再完成购买保留最终决策权。从项目结构看该插件位于独立的插件仓库目录 plugins其路由实现在 _multion/router.py并通过 plugins/main.py 中app.include_router(multion_router.router)挂载到 FastAPI 应用配套的 4 个设置页面模板存放在 plugins/templates 下分别是桌面端授权页、回调展示页、手机端 UID 输入页与完成页。二、完整设置步骤含每一步背后的实现原理原文档给出 4 个设置步骤这里逐一步骤还原其实际发生的事并对应到源码实现。第 1 步在桌面端打开授权入口在桌面浏览器打开插件授权页面https://based-hardware--plugins-api.modal.run/multion这一步对应的后端路由是GET /multion见 _multion/router.py它会读取环境变量MULTION_ORG_ID并渲染 setup_multion_desktop.html。该页面中有一个Connect with Multion按钮点击后 JavaScript 会拼接出 MultiOn 平台的 OAuth 授权地址const orgId {{ org_id }}; const redirectUri encodeURIComponent(window.location.href /callback); const multionAuthUrl https://platform.multion.ai/authorize?org_id${orgId}redirect_uri${redirectUri}; window.location.href multionAuthUrl;即向platform.multion.ai/authorize发起授权请求并携带org_id与redirect_uri两个关键参数——redirect_uri会指向本服务的/multion/callback路径。第 2 步完成授权并复制 USER ID在 MultiOn 授权页完成登录授权后浏览器会带着user_id参数跳回回调地址。后端路由GET /multion/callback负责接收该参数见 _multion/router.pyrouter.get(/multion/callback, response_classHTMLResponse, tags[multion]) async def oauth_callback(request: Request): user_id request.query_params.get(user_id) if user_id: return templates.TemplateResponse(setup_multion_userid.html, {request: request, user_id: user_id}) return User ID not found in redirect.此时页面 setup_multion_userid.html 会直接把授权方返回的user_id明文展示出来你只需把它复制下来备用。USER ID 是 MultiOn 侧为本次授权生成的用户标识后续插件调用 MultiOn API 时用它定位账号务必妥善保管。第 3 步在手机端绑定 USER ID打开手机端绑定链接https://based-hardware--plugins-api.modal.run/multion/uid_input并粘贴第 2 步复制的 USER ID 提交。这个链接对应GET /multion/uid_input见 _multion/router.py它要求 URL 中必须携带uid参数Omi 设备的用户标识否则返回 400。随后渲染的 setup_multion_phone.html 是一个 POST 表单form action/multion/submit_uid methodpost input typehidden nameuid value{{ uid }} input typetext nameuser_id placeholderEnter your User ID required button typesubmitConnect with Multion/button /form第 4 步确认绑定完成表单提交后进入POST /multion/submit_uid路由见 _multion/router.py它会把uid与user_id的映射写入 Redisdb.store_multion_user_id(uid, user_id) is_setup_completed db.get_multion_user_id(uid) is not None对应 plugins/db.py 的实现def store_multion_user_id(uid: str, user_id: str): r.set(fmultion_user_id:{uid}, user_id) def get_multion_user_id(uid: str) - str: result r.get(fmultion_user_id:{uid})写入成功后页面跳转到 setup_multion_complete.html根据is_setup_completed判断显示 Setup Complete认证完成或 Setup Incomplete需要重试。至此授权闭环完成返回 Omi 应用即可正常使用。三、工作原理与源码级解析3.1 触发链路总览整个插件的运行时调用链可分为三段每一段都有明确的源码落点触发Omi 后端在某次对话结束后向插件服务端POST /multion?uid...推送Conversation负载抽取插件用 Groq 大模型对对话转写做结构化输出抽出书单执行插件调用 MultiOn API由云端浏览器代用户完成亚马逊加购。3.2 插件主入口校验 UID 并抽取书籍插件主路由POST /multion见 _multion/router.py首先用uid去 Redis 反查已绑定的user_idrouter.post(/multion, response_modelEndpointResponse, tags[multion]) async def multion_endpoint(conversation: Conversation, uid: str Query(...)): user_id db.get_multion_user_id(uid) if not user_id: raise HTTPException(status_code400, detailInvalid UID or USERID not found.)若未绑定直接拒绝请求。这里的Conversation与EndpointResponse均来自插件 SDK 的 models.pyConversation携带transcript_segments等字段并通过get_transcript()输出纯文本转写见 models.pyEndpointResponse.message则作为给用户的通知文案。3.3 书名抽取结构化输出的 LLM 调用retrieve_books_to_buy()见 _multion/router.py是本插件的识别大脑。它使用 LangChain 的ChatGroq并以with_structured_output(BooksToBuy)强制模型按 Pydantic 结构返回class BooksToBuy(BaseModel): books: List[str] Field(descriptionThe list of titles of the books mentioned, default[], min_length0) def retrieve_books_to_buy(transcript: str) - List[str]: chat ChatGroq(temperature0, modelllama3-groq-8b-8192-tool-use-preview).with_structured_output(BooksToBuy) response: BooksToBuy chat.invoke( f The following is the transcript of a conversation: {transcript} Your task is to identify the titles of the books mentioned in the conversation, if any. Make sure to find clear mentions of book titles, and not just random conversations. Make sure to only include the titles of the books, and not any other information. ) return response.books几个值得注意的设计要点温度设为 0保证抽取行为稳定可复现避免同一段对话在不同时刻抽出不同书单提示词刻意收紧边界只找明确的书名提及而不是随便的闲聊not just random conversations只输出书名不要其他信息目的就是抑制误报空列表兜底如果模型没抽到任何书名主路由会直接返回No books were suggested or mentioned.不会触发后续的 MultiOn 调用。3.4 调用 MultiOn 执行加购call_multion()见 _multion/router.py是执行核心向 MultiOn 的浏览代理 API 发送指令async def call_multion(books: List[str], user_id: str): headers {X_MULTION_API_KEY: MULTION_API_KEY, Content-Type: application/json} data { url: https://amazon.com, cmd: fAdd to my cart the following books (in paperback version, or any physical version): {books}. Only add the books, do not add anything else. and then say success., user_id: user_id, local: False, use_proxy: True, include_screenshot: True, } async with httpx.AsyncClient(timeout120) as client: response await client.post(https://api.multion.ai/v1/web/browse, headersheaders, jsondata)请求载荷的关键字段含义如下字段取值作用说明urlhttps://amazon.com目标站点当前固定为亚马逊首页cmd自然语言指令指示 MultiOn 把列出的书以 paperback 或任意实体版本加入购物车且只加书不加任何别的东西user_id授权得到的 MultiOn USER ID定位用户账号实现以用户身份操作localFalse使用 MultiOn 云端托管浏览器执行而非本地浏览器use_proxyTrue通过代理访问目标站点规避地域/IP 限制include_screenshotTrue让 MultiOn 在执行过程中返回截图便于追溯验证API Key 通过环境变量注入MULTION_API_KEY os.getenv(MULTION_API_KEY, 123)即部署时在服务端设置MULTION_API_KEY环境变量即可源码中默认值123仅用于本地调试兜底生产环境必须显式配置。3.5 失败重试机制如果 MultiOn 返回的状态不是DONE插件不会直接放弃而是携带返回的session_id调用retry_multion()见 _multion/router.pyasync def retry_multion(session_id: str): data { session_id: session_id, cmd: Try again, url: https://amazon.com, local: False, use_proxy: True, include_screenshot: True, }它复用同一会话、重新下达 Try again 指令。同时主路由对整个流程设置了 120 秒超时保护asyncio.wait_for(..., timeout120)超时则返回 Timeout error occurred.避免云端浏览器卡死拖垮插件服务。HTTP 状态异常如 4xx/5xx、网络请求失败、未知异常均被分别捕获并打印日志最终统一以EndpointResponse.message返回给调用方。四、运行环境与部署配置4.1 依赖与挂载插件依赖项在 plugins/requirements.txt 中声明核心包括fastapi、httpx、langchain-groq、pydantic以及 Redis 客户端UID 映射存储在 Redis。路由在 plugins/main.py 处挂载app.include_router(multion_router.router)4.2 环境变量清单环境变量作用说明MULTION_API_KEYMultiOn API 密钥随请求头X_MULTION_API_KEY发送生产环境必须配置真实密钥MULTION_ORG_IDMultiOn 组织 ID用于拼接 OAuth 授权地址platform.multion.ai/authorize?org_id...MULTION_USER_ID映射存储于 Rediskey 为multion_user_id:{uid}由POST /multion/submit_uid写入POST /multion读取4.3 关键路由一览方法路径作用GET/multion渲染桌面端授权入口页GET/multion/callback接收 MultiOn OAuth 回调展示 USER IDGET/multion/uid_input渲染手机端 UID 输入页需携带uidPOST/multion/submit_uid绑定 uid 与 user_id 到 RedisGET/multion/check_setup_completion轮询查询绑定是否完成?uid...POST/multion插件主入口接收会话、抽书、触发加购需携带uid五、故障排查指南原文档给出的排查建议结合源码可以进一步细化书没有加入购物车优先确认 MultiOn 账号是否已正确授权且具备必要权限。可在 Omi 应用设置里先断开再重新连接该插件重新走一遍桌面授权 → 复制 USER ID → 手机端绑定的完整流程也可通过GET /multion/check_setup_completion?uid...接口核对 Redis 中该uid是否已成功绑定user_id。提示 No books were suggested or mentioned.说明 LLM 未从本次转写中抽出明确书名。这是预期的保守行为——插件刻意只识别清晰的书籍提及日常闲聊或表述含糊的内容不会触发加购。提示 Timeout error occurred.MultiOn 云端浏览器在 120 秒内未完成任务属于执行超时可稍后重试也可能是MULTION_API_KEY配置有误导致请求失败请检查服务端环境变量。任何持续报错查看服务端日志中call_multion、retry_multion打印的异常类型HTTP error / Request error / Unexpected error可帮助区分是 MultiOn 侧问题还是网络链路问题。六、使用限制与注意事项本插件是实验性功能官方说明明确提示它可能无法按预期工作This is an experimental feature. It may not work as expected.因此建议先在低风险场景试用。当前实现固定面向Amazon 美国站amazon.com且加购指令偏好 paperback 或任意实体版本购物车内容最终由你在 Amazon 结算页自行确认、修改插件不代付、不代下单。权限模型上插件只负责把书加进购物车不会替你完成购买决策任何资金操作都保留在你的 Amazon 账号内完成。绑定关系multion_user_id:{uid}与授权标识USER ID均存储在服务端 Redis 中换设备或重置授权后需要重新绑定。七、相关参考资源插件使用说明原文plugins/instructions/multion-amazon/README.md插件路由核心实现plugins/_multion/router.pyUID 存储实现plugins/db.py授权与绑定页面模板setup_multion_desktop.html、setup_multion_phone.html、setup_multion_complete.html插件入口挂载与依赖plugins/main.py、plugins/requirements.txt插件 SDK 会话模型plugins/omi-plugin-sdk/src/omi_plugin_sdk/models.py【免费下载链接】FriendAI that sees your screen, listens to your conversations and tells you what to do项目地址: https://gitcode.com/GitHub_Trending/fr/Friend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考