ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Codex 接入 Notion:把 AI 结果写回知识库的 TaoToken 配置骨架

Codex 接入 Notion:把 AI 结果写回知识库的 TaoToken 配置骨架 1. 为什么要把 Codex 的结果写回 NotionCodex 这类编码助手最让人头疼的地方不是它写不出东西而是写出来的东西留不住。你在终端里让它生成一段重试逻辑、一份接口设计草稿、一段排查结论聊完窗口一关第二天想找那句“为什么这里要用指数退避”就得重新问一遍。团队里其他人更惨他们根本不知道你昨天让 AI 产出过什么。Notion 作为知识库的好处在于结构化的数据库页面每条记录有标题、标签、状态、正文可以搜索、可以评论、可以挂到项目主页下面。把 Codex 的输出自动写进 Notion 数据库等于给 AI 产出加了一个归档层。你不需要手动复制粘贴也不需要记得“刚才那段代码放哪了”。这篇面向的是已经在用 Codex、并且手上有 Notion 工作区的开发者。目标很具体用 TaoToken 作为统一的模型调用通道把 Codex 的返回结果通过 Notion API 写回指定数据库跑通一次完整链路并且把配置骨架留下来复用。整条链路涉及三个东西——模型通道、Notion 集成、写回脚本。我会先讲通道怎么配再给可复制的 config.toml 和 settings.json最后用一个真实请求验证从生成到写入的全过程。如果你之前接过 OpenAI 风格的接口会发现 TaoToken 的接入方式基本一致只是 base_url 和 key 换一下。Notion 那边则需要创建一个内部集成拿到 token 和数据库 ID。两部分拼起来就是一个能长期跑的写回管道。2. TaoToken 前置统一 Key 与 API 通道TaoToken 在这里扮演的角色是模型调用的统一入口。你不需要在脚本里分别维护多个厂商的 key也不用担心某个模型的 endpoint 变了要改代码。它提供 OpenAI 兼容的 API 形态Codex 相关的模型请求走同一个 base_url 和同一个 key。先到官网注册并进入控制台在 API Keys 页面创建一个 key。这个 key 就是后面 config.toml 和 settings.json 里要填的凭证。创建时建议给它起一个能认出用途的名字比如 codex-notion-writer方便以后轮换或吊销。拿到 key 之后记下两个地址API 根地址是 https://taotoken.net/api模型对话入口在控制台的对话页。如果你只是先验证模型能不能通可以直接在模型对话里发一条消息如果要跑脚本就用 API 根地址拼上 /v1/chat/completions 这类标准路径。有一点要注意TaoToken 是合规的 API 聚合通道不是让你去改网络环境的东西。你本地能正常访问 https 就行不需要额外配置任何网络层的东西。key 的权限范围在控制台里可以管理建议只给需要的模型权限不要一把梭全开。对于长期要跑写回任务的场景可以考虑 Coding Plan 这类套餐避免每次调用都按量计费带来的成本波动。如果你的写回是定时批量的套餐会更稳。接入文档里有完整的参数说明和示例遇到字段不确定的时候优先查文档。3. 可复制配置config.toml 与 settings.json 骨架下面给两份配置骨架。config.toml 用于 Codex 这类 CLI 工具的模型通道配置settings.json 用于脚本侧的运行参数。两份都留了占位符你替换成自己的值即可。3.1 config.toml模型通道配置# Codex 模型通道配置 # 将 base_url 指向 TaoToken 的 API 根地址 model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api/v1 env_key TAOTOKEN_API_KEY [models] default gpt-4.1-codex fallback gpt-4o [request] timeout_seconds 60 max_retries 3 temperature 0.3这里的关键是 base_url 指向 https://taotoken.net/api/v1env_key 指定从环境变量读取 key而不是把 key 写死在文件里。default 模型填你实际要用的 Codex 模型名fallback 是主模型不可用时的备选。temperature 设 0.3 是为了让技术结论更稳定不要让它自由发挥。3.2 settings.json写回脚本参数{ taotoken: { base_url: https://taotoken.net/api/v1, api_key_env: TAOTOKEN_API_KEY, model: gpt-4.1-codex }, notion: { token_env: NOTION_TOKEN, database_id: 你的数据库ID, title_property: 标题, content_property: 内容, notion_version: 2022-06-28 }, writer: { max_title_chars: 100, max_block_chars: 2000, max_blocks_per_request: 100, retry_times: 3 } }settings.json 把模型侧和 Notion 侧分开配置。token 和 key 都通过环境变量读取避免明文进仓库。database_id 从 Notion 数据库链接里提取通常是 32 位十六进制字符串。title_property 和 content_property 必须和你 Notion 数据库里的字段名完全一致大小写也要对上否则写入会报 400。3.3 环境变量设置export TAOTOKEN_API_KEY你的TaoToken密钥 export NOTION_TOKENsecret_你的Notion集成TokenWindows 下用 set 或系统环境变量面板设置。设置完可以用 echo 检查一下是否生效。不要把这两个值提交到 git建议在项目根目录加 .gitignore 排除 .env 文件。4. 验证请求从 Codex 生成到 Notion 写入配置就绪后跑一次完整链路。下面这段 Python 脚本读取上面的 settings.json调用 TaoToken 的模型接口再把结果写进 Notion 数据库。import os import json import requests with open(settings.json, r, encodingutf-8) as f: cfg json.load(f) TAOTOKEN_KEY os.environ[cfg[taotoken][api_key_env]] NOTION_TOKEN os.environ[cfg[notion][token_env]] def ask_codex(prompt: str) - str: url f{cfg[taotoken][base_url]}/chat/completions headers { Authorization: fBearer {TAOTOKEN_KEY}, Content-Type: application/json } payload { model: cfg[taotoken][model], messages: [ {role: system, content: 你是资深工程师输出简洁可用的技术结论。}, {role: user, content: prompt} ], temperature: 0.3 } resp requests.post(url, headersheaders, datajson.dumps(payload), timeout60) resp.raise_for_status() return resp.json()[choices][0][message][content] def write_to_notion(title: str, content: str) - dict: url https://api.notion.com/v1/pages headers { Authorization: fBearer {NOTION_TOKEN}, Content-Type: application/json, Notion-Version: cfg[notion][notion_version] } payload { parent: {database_id: cfg[notion][database_id]}, properties: { cfg[notion][title_property]: { title: [{text: {content: title[:cfg[writer][max_title_chars]]}}] }, cfg[notion][content_property]: { rich_text: [{text: {content: content[:cfg[writer][max_block_chars]]}}] } } } resp requests.post(url, headersheaders, datajson.dumps(payload), timeout60) resp.raise_for_status() return resp.json() if __name__ __main__: prompt 写一个 Python 装饰器统计函数执行时间并打印日志附使用示例。 result ask_codex(prompt) print(Codex 返回\n, result[:300], ...\n) page write_to_notion(Codex 生成执行时间装饰器, result) print(写入成功页面 URL, page[url])运行前确认三件事环境变量已设置、settings.json 里的 database_id 和字段名正确、Notion 集成已经被邀请到目标数据库所在页面。第三点最容易漏集成没被邀请的话API 会返回 404 而不是 403容易误判成数据库 ID 错了。跑通后你会看到终端打印出 Codex 的返回片段以及一个 Notion 页面 URL。点开 URL应该能看到标题和正文都已经写入。这一步成功说明模型通道和写回通道都通了。5. 本篇常见错排查5.1 401 Unauthorized模型侧报 401通常是 TAOTOKEN_API_KEY 没读到或者值不对。先确认环境变量在当前 shell 里生效再确认 key 没有多余空格。如果是在 IDE 里跑注意 IDE 可能没继承你终端的环境变量需要在运行配置里单独设置。Notion 侧报 401检查 NOTION_TOKEN 是否以 secret_ 开头以及集成是否还在有效状态。token 泄露后可以在 Notion 集成设置里重置。5.2 400 Bad Request属性不匹配这是最常见的一类错误。Notion 数据库的每个字段都有固定类型title 字段必须用 title 结构rich_text 字段必须用 rich_text 结构。如果你把内容写进了 select 字段或者字段名拼错就会 400。排查方法是打开数据库点字段名看它的类型再对照 settings.json 里的配置。另一个 400 来源是单次请求块数超过 100或者单个 rich_text 超过 2000 字符。上面的脚本已经做了截断但如果你自己扩展了逻辑记得保留这两个上限。5.3 404 Not Found集成没被邀请Notion API 对没有权限的页面返回 404 而不是 403这是设计如此。解决办法是在目标数据库页面右上角点分享搜索你的集成名字并邀请它。邀请后重新跑脚本即可。5.4 429 Too Many Requests模型侧和 Notion 侧都有速率限制。脚本里已经设了 timeout但没有自动重试。生产环境建议加一个带退避的重试装饰器或者用 tenacity 这类库。重试时注意不要重复写入可以在写入前先查一下是否已存在同标题页面。5.5 内容被截断Codex 返回的长内容如果超过 2000 字符会被截断。要完整保存需要把内容拆成多个块用 children 参数分批写入或者创建子页面。拆分逻辑可以按行或按段落切每块控制在 2000 字符以内。6. 把写回流程固定下来链路跑通之后下一步是让它变成日常习惯。我自己的做法是在项目根目录放一个 writeback.py把 prompt 作为参数传进去跑完自动写入 Notion 并打印页面链接。这样每次让 Codex 产出值得留档的内容顺手就跑一次写回。如果你要长期跑这类任务建议把模型调用统一走 TaoToken 的通道key 和 base_url 只维护一份换模型时改配置就行。接入文档里有更完整的参数说明遇到字段不确定的时候优先查文档。需要验证模型是否正常可以直接在模型对话里发一条测试消息。长期做编码和 Agent 类任务的可以看看 Coding Plan 的套餐成本会更可控。最后留一个实用技巧在 Notion 数据库里加一个“来源”字段写入时固定填“Codex”再加一个“日期”字段自动记录写入时间。这样以后搜索时能快速筛出所有 AI 产出的条目也方便做定期回顾。写回不是终点让这些内容在需要的时候能被找到才是知识库真正的价值。
返回列表