尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Codex CLI接入OpenAI兼容接口:config.toml配置与排查指南
1. 为什么要把 Codex CLI 接到 OpenAI 兼容接口先看懂接入的本质这两年终端里的 AI 编程工具经历了一轮大爆发Codex CLI 是其中很有代表性的一款。它的使用方式很直接装好之后你在命令行里提出需求它能自己读仓库、改文件、执行命令、跑测试活像一个常驻在终端里的结对程序员。但很多人装完就发现了问题——默认配置指向的是官方服务端不管是为了数据隐私、成本控制还是因为团队要求模型必须部署在内网都需要想办法让它改连别的地方。于是把 Codex CLI 接到 OpenAI 兼容接口就成了绕不开的一步。先说清楚一个概念所谓“OpenAI 兼容接口”指的并不是某一个具体的服务商而是一套大家共同遵守的 HTTP 接口约定。只要一个服务能按POST /v1/chat/completions或者POST /v1/responses这套请求和响应格式对外提供能力那它就是“兼容接口”。到了 2026 年这套约定已经被开源推理框架、企业内部模型网关、商业模型路由服务普遍采用基本成了行业事实标准。这篇文章适合三类人一是已经把 Codex CLI 跑起来、但想换模型或换端点的开发者二是公司要求代码不出内网、需要把工具对接私有化部署模型的团队三是想用更便宜的模型完成日常开发任务、控制 API 成本的个人用户。我会从配置文件的逐行含义讲起再给出一套完整的实操流程最后把接入过程中最常见的报错和排查思路一次性整理清楚。1.1 Codex CLI 默认是怎么工作的Codex CLI 本质上是一个“模型无关的终端代理客户端”但安装完成后它默认只认识一条链路读取环境变量里的密钥把请求发到官方默认地址使用官方默认模型。这个默认行为在绝大多数场景下没有问题因为开箱即用是产品的基本要求。问题恰恰出在“默认”两个字上。当你需要接入其他模型提供方时Codex CLI 并不会自动感知而是完全依赖一个配置文件来决定“我是谁、我要连哪、我用哪个模型”。这个配置文件就是config.toml。换句话说Codex CLI 的接入逻辑非常透明它去哪个地址、带什么密钥、用什么模型 ID、走哪套接口格式全都由这个文件决定。理解这一点之后你就不会觉得“接入兼容接口”是什么黑魔法了。你只是需要告诉 Codex CLI别再往默认地址发请求了改成我指定的地址用我指定的模型名按我指定的鉴权方式。1.2 哪些场景真的需要改接我接触到的实际需求基本都是下面四类之一。第一类是数据隐私和合规要求。很多公司的代码是不能出内网的包括外部 API 调用过程中的代码片段都不行。这类团队通常会在机房内部署一套模型服务然后要求所有开发工具一律走内网地址。Codex CLI 作为终端工具处理的就是真实代码如果它默认连外网合规审计这一关就过不去。第二类是成本控制。官方接口按用量计费而开源模型或者团队自建的路由网关可以把成本压到很低。很多团队的做法是搭一个统一网关按任务类型把请求路由到不同价位的模型上复杂任务走强模型、简单任务走便宜模型。Codex CLI 只认一个端点那就让网关来做路由分配。第三类是模型定制。你如果基于某个开源模型做了垂直领域的微调比如针对特定框架、特定业务代码的优化那自然希望 Codex CLI 直接使用这个定制模型而不是通用模型。第四类是网络可达性。部分开发环境本身就在隔离网络里没有直接访问外部服务的条件但内部有一套完整的兼容服务。这种环境下配置兼容接口就不是可选项而是唯一路径。1.3 兼容接口的“兼容”到底指什么这里值得多说一句因为很多第一次接触的人会在这一步栽跟头。所谓兼容通常指两件事接口路径兼容以及数据格式兼容。路径层面官方接口的核心路径是/v1/chat/completions聊天补全格式和/v1/responses新版响应格式。不同的后端支持程度不一样有些只实现了其中一种。数据格式层面请求体里的model、messages、stream、tools这些字段响应里的choices、delta、usage这些结构都需要符合约定。所以你在选兼容服务时第一件事不是急着配 Codex CLI而是确认它提供的是哪种接口格式。这一点后面还会反复提到因为它直接决定了config.toml里wire_api这个关键参数怎么填。2. 前置准备先把端点、模型名和鉴权方式对齐接入兼容接口这件事百分之八十的失败都发生在动手之前——不是配置文件写错了而是你根本还没搞清楚自己的后端到底能干什么。所以我不建议你上来就改配置先把三样东西准备好再花两分钟验证一下端点后面会顺很多。2.1 准备三样东西一个已安装的 Codex CLI。安装方式各家略有不同有的走包管理器有的直接下二进制文件装完在终端里跑一下codex --version能正常输出版本号就行。顺便记住版本号后面排查问题时可能会用到。一个兼容接口端点。这个端点可以是内网部署的推理服务可以是企业统一的模型网关也可以是某个商业服务商提供的兼容入口。你需要拿到三样信息完整的服务地址通常长这样http://内网地址:端口/v1、一把 API 密钥有些本地服务不需要密钥但我们也建议配一把假的避免 Codex CLI 因为拿不到密钥而报错、以及你打算使用的模型 ID这个 ID 必须和后端实际提供的模型名严格一致。一个能设置环境变量的终端环境。Codex CLI 不从配置文件里直接读密钥而是通过环境变量获取。所以你需要知道怎么在当前用户的 shell 配置里导出变量比如~/.bashrc或~/.zshrc。2.2 用 curl 在正式动手前验证端点这一步是我强烈建议每个人都要做的。不要一上来就写config.toml先用curl打一发最小请求确认端点真的能通、模型名真的对、返回格式真的符合预期。curl http://127.0.0.1:8000/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer $YOUR_API_KEY \ -d { model: your-model-name, messages: [{role: user, content: 用一句话介绍你自己}], stream: false }如果返回的 JSON 里有choices[0].message.content字段说明这个端点至少能正常处理聊天补全请求。如果返回 404你就要检查地址路径是否正确。如果返回 401说明密钥或鉴权方式不对。如果返回 model 相关错误说明模型名填错了。这一步花不了两分钟但能帮你把后续的问题范围缩小一大半。我见过太多人配置文件改了半天最后发现是后端压根没起来或者模型名少了个前缀。2.3 分清两种接口格式chat 与 responses这是整个接入过程里最容易混淆的地方。Codex CLI 支持两种接口格式分别对应wire_api参数的两个取值。第一种是chat对应/v1/chat/completions。这是目前开源服务和大部分网关默认支持的格式历史上也最成熟。第二种是responses对应/v1/responses。这是新版结构官方默认模型走的是这种格式它对工具调用、流式输出等有更新的设计。绝大多数第三方兼容服务只实现了chat。如果你的配置里写的是wire_api responses但你的后端只支持chatCodex CLI 就会把请求发到/v1/responses这个不存在的路径上报出一堆让人摸不着头脑的 404 或 400 错误。反过来如果后端声明自己支持responses但你配成了chat同样会出问题。所以在前置准备阶段你需要确认一件事后端到底支持哪种格式。怎么确认看它的文档说明或者直接用 curl 分别打一下两个路径看哪个有响应。这个信息后面填配置的时候就是一行字的事但填错就是半小时起步的排查。3. config.toml 逐行拆解这一份配置看懂模型、地址与鉴权配置文件的定位是 Codex CLI 的“总开关”。它不负责具体功能逻辑只负责回答四个问题用哪个模型、连哪个地址、用什么密钥、走什么接口格式。把文件放在合适的位置再按字段含义逐项填好接入就完成了大半。3.1 配置文件在哪、优先级怎么算Codex CLI 启动时会按顺序查找配置文件。通常用户级配置位于你的用户主目录下的.codex目录里文件名是config.toml。如果当前项目里存在.codex/config.toml项目级配置会覆盖用户级配置。这个机制和很多开发工具的做法一致好处是你可以把用户级配置作为兜底然后针对不同项目写不同的模型和端点。如果你不确定自己的配置在哪可以执行codex init它会自动生成一个带默认值的配置文件顺便把目录结构帮你建好。我个人习惯是把用户级配置当作“默认可用”方案只在项目需要特殊模型时才单独立配置文件。需要提醒一点配置文件的语法是 TOML。TOML 对格式的宽容度没有 JSON 那么高缩进问题、引号问题、多余逗号都会导致解析失败。下面会专门提到几个容易踩的坑。3.2 完整示例可以直接抄作业的版本下面这份配置覆盖了三种最常见的后端类型内网路由网关、本地推理服务、企业统一网关。你可以根据自己的实际情况增删。# 全局默认使用的模型 ID model router-70b # 全局默认使用的模型供应商 ID必须与下方某个表名一致 model_provider router # 供应商一内部模型路由网关 [model_providers.router] name 内部网关 base_url http://10.20.30.40:8080/v1 env_key ROUTER_API_KEY wire_api chat requires_openai_auth false # 供应商二本地推理服务 [model_providers.local] name 本地推理 base_url http://127.0.0.1:8000/v1 env_key LOCAL_MODEL_KEY wire_api chat requires_openai_auth false # 供应商三企业统一网关走 HTTPS带固定请求头 [model_providers.enterprise] name 企业网关 base_url https://llm-gateway.internal.example/v1 env_key ENTERPRISE_GATEWAY_KEY wire_api responses requires_openai_auth false [model_providers.enterprise.http_headers] X-Tenant-Id ops-2026如果你只想接入一个端点那只需要保留一个[model_providers.xxx]块就够了。下面逐行说明每个字段的含义。3.3 每个键为什么要这么写先看前两行。model指定的是模型 ID这个 ID 必须和后端实际部署的模型名完全一致大小写也不例外。model_provider指定的是用哪个供应商配置它的值必须和下方某个方括号里的名字一致。这两个字段是配套的Codex CLI 拿到请求后先根据model_provider找到连接信息再带着model去请求对应后端。接着是[model_providers.xxx]表。这个xxx是供应商的内部标识你自己起名但必须和model_provider字段保持一致。表里的name是显示名Codex CLI 在交互界面里会用它来展示选项你可以写成方便自己识别的中文或英文。base_url是连接地址这里有一个高频踩坑点它只需要写到/v1这一层不要写完整的接口路径。Codex CLI 会自动根据wire_api在后面拼接/chat/completions或/responses。如果你把base_url写成http://.../v1/chat/completions实际请求就会变成http://.../v1/chat/completions/chat/completions结果必然是 404。env_key是最值得理解的字段之一。它告诉 Codex CLIAPI 密钥不在配置文件里去环境变量里找。比如env_key ROUTER_API_KEY就意味着 Codex CLI 在启动时读取名为ROUTER_API_KEY的环境变量作为密钥。这种设计很聪明因为配置文件经常会被同步到版本管理仓库里如果把密钥明文写进文件等于直接泄露。wire_api决定接口格式取值只能是chat或responses选错就会遇到地址或格式不匹配的问题。requires_openai_auth是我反复强调的一个字段。官方默认服务的鉴权流程和普通第三方服务不一样如果你接的是自己的后端这个字段务必设为false否则 Codex CLI 会尝试走官方的 OAuth 或 token 刷新流程轻则卡住重则直接报鉴权错误。最后是可选的http_headers。有些企业网关要求每个请求带上固定的头部信息比如租户 ID、部门标识、审计标签。这个时候就在供应商表下再嵌套一个表把这些键值对写进去。Codex CLI 发起请求时会自动附带这些头部。如果你还遇到上下文长度相关的报错可以在顶层补充几个调节字段。比如model_context_window用来声明模型的实际上下文窗口大小model_max_output_tokens用来限制单次输出的最大 token 数。这两个字段在后端元数据不完善的时候特别有用能避免请求体过大被后端拒绝。4. 实操接入三步让 Codex CLI 跑在自定义接口上配置看得再多不如动手跑一遍。下面这套流程我在多个环境里验证过按步骤走下来基本不会出大问题。整个流程可以压缩成三步验证端点、写配置、启动验证。4.1 第一步确认端点可用假设你现在有一个本地推理服务监听在127.0.0.1:8000你打算使用的模型叫coder-70b。先执行 curl 验证这一步前面已经给过命令这里不再重复。重点确认三件事服务在监听、模型名正确、鉴权能通过。如果这三点没问题你的起点就非常清晰。有一个我常用的技巧验证时故意把stream设为false一次拿到完整 JSON更容易看清返回结构。如果返回 200 但choices为空或者返回的字段结构和标准不一致那说明后端可能只是“形似”兼容实际数据处理有坑建议先处理后端再继续。4.2 第二步写配置并加载环境变量打开用户级配置文件或者新建一个项目级配置写入如下内容model coder-70b model_provider local [model_providers.local] name 本地推理 base_url http://127.0.0.1:8000/v1 env_key LOCAL_MODEL_KEY wire_api chat requires_openai_auth false然后在终端里导出密钥。如果你的后端不要密钥随便给一个占位值也可以关键是让 Codex CLI 能找到这个环境变量否则它会报“缺少 API Key”。export LOCAL_MODEL_KEYsk-placeholder为了下次重启还能用建议把这行export写进~/.zshrc或~/.bashrc。写完记得执行source ~/.zshrc让它立即生效。4.3 第三步启动 Codex CLI 验证工具链路配置写好后直接在项目目录里启动codex。如果配置正确它会正常进入交互模式你随便问一句“这个项目的入口文件在哪”观察它能否正常思考、调用工具、给出回答。这里要额外注意一点Codex CLI 的完整工作流依赖工具调用能力也就是它要调用“查看文件”“编辑文件”“执行命令”这些内置工具。这要求后端模型必须支持函数调用。很多模型在普通对话场景下表现不错但一进入 Codex CLI 就露馅因为后端不支持工具调用或者支持的格式有偏差。遇到这种情况后面会讲怎么排查。如果启动时报错先别急着改配置。把报错信息复制下来对照下一节的排查清单。大多数错误都能在几分钟内定位。4.4 多供应方切换的小习惯配置里写多个供应商块之后Codex CLI 会在交互界面里允许你切换。这个能力对经常在多个环境之间切换的开发者特别有用比如日常用内网网关调试本地模型时切到本地服务写外包项目时再切到另一个端点。我的习惯是给每个供应商起一个含义明确的name并且在base_url里带端口或环境后缀比如“网关生产”“网关测试”“本地调试”。这样在交互选择时不会选错。另外如果你发现某个供应商长期不用建议把它注释掉而不是删掉万一以后要切回来还能直接用。5. 常见报错排查实录从 401 到流式解析失败接入兼容接口的报错种类没有想象中多九成以上集中在鉴权、地址、模型名和接口格式这四类。我把实操中最常遇到的报错整理成了一张速查表每一类都给出了排查要点和解决办法。5.1 鉴权类问题报错现象可能原因解决办法启动即报 Missing API Key环境变量没设置或env_key名字拼错确认env_key对应的变量已 export且名字完全一致401 Unauthorized密钥错误或者后端根本不需要鉴权但你带了错误格式的密钥用 curl 单独验证密钥本地服务可先改用占位密钥卡在鉴权流程或报 token 相关错误requires_openai_auth误设为true改为false避免 Codex CLI 走官方专属鉴权流程第二行这个 401 值得展开说。有些本地推理服务默认是关闭鉴权的你随便带一个Authorization头反而可能触发校验逻辑。这种情况直接在配置里给一个占位密钥就行但占位密钥要满足后端的基本格式要求比如有的后端要求Bearer后面跟一串长度足够的字符。5.2 地址与模型名问题报错现象可能原因解决办法404 Not Foundbase_url写多了接口路径或后端根本没实现对应路径base_url只写到/v1再核对wire_api对应的路径The model xxx does not exist模型名和后端实际部署名不一致用 curl 打一发请求确认正确模型名检查大小写和前缀ECONNREFUSED 或连接超时后端没启动、端口写错、地址不通检查服务进程确认端口在本机试127.0.0.1Invalid URLbase_url缺少协议头或有特殊字符保证以http://或https://开头ECONNREFUSED 还有一个容易被忽略的场景Codex CLI 如果跑在容器里而你的推理服务跑在宿主机器上127.0.0.1指向的是容器内部而不是宿主机。这种情况需要把地址改成容器网络里宿主机对应的地址具体取决于你的容器网络配置。5.3 接口格式与流式解析问题报错现象可能原因解决办法请求发到错误路径返回 404wire_api与后端支持的格式不匹配确认后端支持chat还是responses改对应参数返回 400 或提示字段不支持请求体里的字段后端不识别常见于responses特有的字段发给chat格式后端流式输出时报 Unexpected token / JSON 解析失败后端的流式格式不规范检查后端是否按标准 SSE 格式输出查看后端口志报 tools 相关错误或工具无法调用后端模型不支持函数调用换支持工具调用的模型或让网关做兼容转换流式解析问题在本地部署场景里尤其常见。Codex CLI 依赖流式输出因为它要在模型生成的过程中实时更新界面。标准做法是每条数据以data:开头最后以data: [DONE]结束。如果后端只是简单地把 JSON 逐行打出来没有加这个前缀Codex CLI 解析到一半就会崩。这种问题的根源不在 Codex CLI而在后端实现所以排查时要回到后端去看日志和实现方式。工具调用问题也很多。Codex CLI 的编辑、查看、执行都是通过工具调用完成的如果模型本身不支持函数调用它就只能聊天不能干活。判断方法很简单先用普通对话测试模型然后用带tools字段的 curl 请求测试看后端是否正确处理了工具定义和工具结果。5.4 排查通用路径开日志、抓请求遇到上面没有覆盖的报错时我建议按三条路径逐步排查。第一条路径是开启 Codex CLI 的详细日志。不同版本的开启方式略有差异有的用--verbose参数有的在配置里加verbose true。具体以你安装版本的codex --help输出为准。详细日志会打印出实际发出的 HTTP 请求和响应状态码能帮你快速判断问题出在连接层面还是数据层面。第二条路径是看后端日志。推理服务通常有访问日志Codex CLI 的请求有没有到达后端、后端返回了什么错误一眼就能看到。如果 Codex CLI 报错但后端口志里完全没有记录说明请求根本没到后端问题大概率出在地址或网络配置上。反过来如果有记录但状态码异常问题就在后端的处理逻辑上。第三条路径是回到 curl 做最小验证。把 Codex CLI 的实际请求体原封不动地用 curl 发一遍看后端反应。这个动作看似简单却能隔离掉 Codex CLI 的干扰因素让你直面后端。很多时候你会惊讶地发现问题根本不在配置而是后端对某个字段的处理不符合预期。6. 避坑心得与几个实用小技巧接入兼容接口这件事做多了之后你会发现坑基本集中在几个固定位置。下面这些心得是我踩过多次之后总结出来的不一定写在官方文档里但很实用。第一个心得是配置文件一定要备份。config.toml会随着版本升级发生参数变化我遇到过升级之后某个字段被改名、某个行为被调整的情况。维护一份自己的配置备份升级后对比一下差异能节省大量排查时间。另外如果你有跨设备同步配置文件的需求记得不要把密钥写进文件里坚持用env_key加环境变量的方式。第二个心得是模型上下文窗口要主动声明。很多开源模型的元数据并不完整Codex CLI 可能默认按一个很大的上下文窗口来组织请求导致请求体超出模型实际承受范围后端直接报错或静默截断。提前在配置里声明model_context_window可以让 Codex CLI 在组装上下文时有所节制从源头避免一大类问题。第三个心得是保持 Codex CLI 版本更新。这类工具迭代极快老版本在解析新格式、处理新协议时经常出现莫名其妙的问题。如果你用的版本太老同时代的兼容服务已经更新了实现细节两者之间就可能产生摩擦。遇到难以解释的怪问题时先升级到新版本再试这是成本最低的排查手段。第四个心得是善用codex init重建默认配置。当你把配置改得面目全非、实在找不出问题时可以先把现有配置备份然后重新初始化一份干净的配置再逐项把自定义内容加回去。这个过程既是一种“配置回归测试”也能帮你确认是不是某行参数写错导致的连锁反应。最后分享一个小技巧接入成功后建议把 curl 验证命令保存成一个脚本放在方便取用的地方。以后每次更换后端、更换模型名、调整密钥时先跑一遍脚本确认端点正常再动 Codex CLI 的配置。接入类的故障百分之八十都是因为跳过了这个前置验证直接对着配置文件盲猜。养成先验证、后配置的习惯你能省下大量用来排查的时间。我个人在实际操作中的体会是Codex CLI 接兼容接口的难度并不高它真正考验的是你对后端服务的熟悉程度。只要把端点、模型名、接口格式、鉴权方式这四件事对齐剩下的就是配置文件的体力活。这篇文章覆盖的所有内容都基于我在真实接入过程中的踩坑记录和复盘希望能帮你少走一点弯路。
RELATED

相关推荐

基于SpringBoot的办公管理系统毕业设计:从数据库到部署全解析

基于SpringBoot的办公管理系统毕业设计:从数据库到部署全解析

做计算机毕业设计这两年,我接手过不少SpringBoot项目,但最常被问到的还是这类老题目:基于SpringBoot的办公管理系统。源码网盘里能下一堆,LW文档却普遍写得像软件说明书,功能列表一贴、截图一放就算完事,答…

📅 2026/10/9 4:42:24
Git底层原理与协作工作流全解析

Git底层原理与协作工作流全解析

1. 为什么“一文搞懂Git”从来不是靠读完一篇文章就能实现的Git不是一门课,而是一套肌肉记忆系统。我带过几十个刚转行的新人,也帮某高校实验室调试过毕业设计的协作流程,发现一个铁律:所有声称“5分钟学会Git”的教程&#xff0c…

📅 2026/10/9 4:42:24
Java字符串底层原理与高频算法实战:从常量池到KMP

Java字符串底层原理与高频算法实战:从常量池到KMP

做了这么多年Java开发,又带过不少新人,面试过一堆候选人,我有一个感受越来越强烈:很多人写业务代码手到擒来,一聊到字符串算法就开始露怯。字符串看起来不过就是一堆字符拼在一起,可真到了比较、反转、统计…

📅 2026/10/9 4:37:23
MORE NEWS

更多资讯

📰

计及氢能的综合能源优化调度:Matlab建模与实现

刚接这个课题的时候,我其实有点不以为然,觉得无非就是把氢气设备塞进综合能源系统里,再跑一个优化调度。但真正动手去做矩阵建模和Matlab代码实现,才发现里面藏着不少坑:电解槽的启停逻辑怎么线性化?储氢罐…

📰

深入解析 Pod_ContainerCreating 云盘挂载超时或冲突:基于 chaosblade 技能库的 K8s 故障演练实战指南

运维云原生SREAI Agent人工智能 【免费下载链接】chaosblade An easy to use and powerful chaos engineering experiment toolkit.(阿里巴巴开源的一款简单易用、功能强大的混沌实验注入工具) 项目地址: https://gitcode.com/gh_mirrors/ch/…

📰

FlashInfer CuTeDSL MegaMoE 内核 drop 更新工作流:src 原样落地与 shim 适配层的维护实战

大模型深度学习算子库后端高性能计算 【免费下载链接】flashinfer FlashInfer: Kernel Library for LLM Serving 项目地址: https://gitcode.com/gh_mirrors/fl/flashinfer 点击查看 免费下载 本篇技术指南讲解 FlashInfer 的 moe_ep(MoE Expert Parall…

📰

三数之和双指针解法全解析:排序+去重,从暴力到O(n²)优化

1. 题目到底在考什么:先读懂三数之和1.1 题干回顾LeetCode 15 这道题,题面非常简洁:给你一个整数数组nums,要求找出所有三元组[nums[i], nums[j], nums[k]],满足三个下标互不相同,且三个数之和等于 0。输出…

📰

用 yomiyasu 将 AI 生成的日语 Slack 维护通知改写成自然日语:以语料库样例为线索拆解推敲全流程

【免费下载链接】yomiyasu AI生成の日本語を自然な日本語へ推敲するAgent Skill / Agent Skill for Refining AI-Generated Japanese into Natural Japanese 项目地址: https://gitcode.com/gh_mirrors/yo/yomiyasu 点击查看 免费下载 本篇以 yomiyasu 仓库评测语料…

📰

超表面吸波器设计全流程:从谐振机理到2.4GHz实物实测

第一次用手端着那块几毫米厚的平板时,我有点没缓过来。面前那面贴着密密麻麻蓝色尖锥的暗室墙体,居然被这么一块不起眼的电路板给“代替”了。朋友递给我时说,这叫超表面吸波器,能在2.4GHz上把入射波吃掉九成以上。我把板子翻来覆…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬