@crvouga/mockingbird-service-edamm (中文(简体) )
本地模拟器。 真正的API合同. 部分 嘲笑鸟。 。 。 .
国家模拟器 爱德玛 API 我们的应用程序呼叫, 从内置食物和食谱回答
体格:食物数据库v2分解器(文字和刚果爱国者联盟)、营养和图像识别、营养
分析(nutrition-data, (中文(简体) ), nutrition-details), Recipe Search v2(使用过滤器和
_cont 呼叫,由URI,由id, 餐饮计划员v1 select,和购物列表 v2. 营养
记录、条码扫描、照片记录、食谱搜索、膳食计划和杂货清单,然后进入
测试没有 Edamam 键、配额或网络.
- 行动范围: 支助
- 合同
openapi.yaml由Edamam的 API Docs和我们的消费者亲笔撰写:metrics/adapters/outbound/edamam-nutrition.adapter.ts, (中文(简体) ),meal-planning/adapters/outbound/edamam-meal-planning.adapter.ts,和 Python 聊天 服务tools/nutrition/client.py。 。 。 .
安装
npm install -D @crvouga/mockingbird-service-edamam
仅限无害环境管理。 节点 22或 Bun 1.2. 无土生属地. 给它服务
npx mockingbird-edamam serve, (中文(简体) ), createServer 从 ./server (节点),或 createRuntime 与
任何获取服务器.
使用量
两个后端适配器硬码 https://api.edamam.com (封口:用于
EDAMAM_BASE_URL 编号 : EDAMAM_MEAL_BASE_URL还有Python客户端 EDAMAM_BASE_URL) (中文(简体) ). 钥匙可以是
任何数值 (EDAMAM_FOOD_APP_ID/KEY 或者说 EDAMAM_APP_ID/KEY, (中文(简体) ), EDAMAM_MEAL_APP_ID/KEY,Python语
客户端 edamam_* 设置);没有它们,我们的适配器报告 unavailable 永远不要叫出来.
npx mockingbird-edamam serve --port 8824
import { createServer } from "@crvouga/mockingbird-service-edamam/server"
// Test setup: the emulator. The application gets EDAMAM_BASE_URL = server.url.
const server = await createServer()
const baseUrl = server.url
// Application code: the Food Database request it sends to api.edamam.com.
const query = new URLSearchParams({
app_id: "a",
app_key: "k",
ingr: "2 large eggs",
"nutrition-type": "logging",
})
const response = await fetch(`${baseUrl}/api/food-database/v2/parser?${query}`)
const parsed = await response.json()
// → {text, parsed: [{food: {foodId: "food_egg", label: "Egg", nutrients: {ENERC_KCAL: 143, …}},
// quantity: 2, measure: {uri: "…#Measure_large", label: "Large", weight: 50}}], hints: […]}
await server.close()
路线
每个电话都要接 app_id 财务报告和审定财务报表 app_key 作为查询参数(餐具和购物列表)
还接受 Authorization: Basic app_id:app_key我们的适配器发送.
| 路线 | 行为 |
|---|---|
GET /api/food-database/v2/parser | ingr 分为领先数量("2","1/2","a","2"),是衡量食物("cup","大","slice","g","oz")和最相配的食物− parsed[]每个食物都分享一个字 hints[] 与 measures。过滤器 : categoryLabel (单位:千美元)food 减了饭吃, category, (中文(简体) ), health (可重复), calories (每100克), nutrients[CODE] (每100克,见下文). upc 查一包食品(不为人知的刚果爱国者联盟404). |
POST /api/food-database/v2/nutrients | {ingredients: [{quantity, measureURI, foodId}]} → calories, (中文(简体) ), totalWeight, (中文(简体) ), totalNutrients, (中文(简体) ), totalDaily, (中文(简体) ), dietLabels, (中文(简体) ), healthLabels, (中文(简体) ), ingredients[].parsed[];未知的食物或计量为422. |
POST /api/food-database/nutrients-from-image?beta=true | {image: data URL or http URL} → {parsed: {food, quantity, measure}, recipe: {label, calories, totalNutrients}},确定每个图像(或用 PUT /__admin/vision) (中文(简体) ). |
GET /api/nutrition-data?ingr= | 1个成份线;不可分解为422个. |
POST /api/nutrition-details | {ingr: [...], title?, yield?};无行为422,任何不可通解的行为555. |
GET /api/recipes/v2 | type 需要; q, (中文(简体) ), health, (中文(简体) ), diet, (中文(简体) ), mealType, (中文(简体) ), dishType, (中文(简体) ), cuisineType, (中文(简体) ), excluded (可重复), calories 财务报告和审定财务报表 nutrients[CODE] 按服务人数计算, time, (中文(简体) ), random, (中文(简体) ), imageSize每页20; _links.next.href 携带 _cont。 。 。 . |
GET /api/recipes/v2/by-uri | 不超过20岁 uri 参数; 未知的URI被跳过. |
GET /api/recipes/v2/{id} | 一种食谱(即 _links.self 目标. |
POST /api/meal-planner/v1/{app_id}/select | {size, plan: {accept, fit, exclude, sections: {Breakfast: {…}, …}}} → {status: OK | INCOMPLETE, selection: [{sections: {<name>: {assigned, _links}}}]}每个部分都有一个满足它和计划的配方 accept 上游数(health, (中文(简体) ), meal, (中文(简体) ), dish它的每个服务 fit,以及 exclude; 无法填充的部分没有 assigned 状态为 INCOMPLETE没有章节的计划是400. |
POST /api/shopping-list/v2 | {entries: [{quantity, measure?: Measure_serving, item: recipe uri}]} · 以克计的每种食物总成份(克)Measure_serving 以食谱的产量衡量; ?shopping-cart=true&beta=true 添加 _links.shopping-cart。 。 。 . |
错误:食物数据库和营养分析答案 {status: "error", error, message}· ;
食谱搜索、餐饮规划和购物清单答案 [{errorCode, message, params}]。 。 。 .
企业 (单位:千美元)DEFAULT_FOODS, (中文(简体) ), DEFAULT_RECIPES:每100克养分和计量量的18种食物
(包括一顿饭,与刚果爱国者联盟的两件包装产品) 850000000012 财务报告和审定财务报表 850000000036一个
刚果爱国者联盟 850000000029 没有营养数据)和8个食谱 从它们,所以食谱总数,
每个服务价值和购物清单与食品数据库一致.
管理员(超过标准合同)
| 路线 | 效果 |
|---|---|
GET 编号 : POST /__admin/foods | 列出食物,或添加({foodId, label, nutrients, measures: [{uri, label, weight}], upc?, brand?, category?, categoryLabel?, healthLabels?}) (中文(简体) ). |
GET 编号 : POST /__admin/recipes | 列出食谱,或增加一种({id, label, yield, ingredients: [{foodId, quantity, measure, text}], mealType?, dishType?, cuisineType?, dietLabels?, healthLabels?, cautions?, totalTime?}) (中文(简体) ). |
PUT /__admin/vision | {foodId, quantity?, measure?} 标出图像识别返回的内容; {notFound: true} 不承认什么; null 恢复默认值. |
GET/PUT /__admin/settings | {apps?: [{appId, appKey}], requireAccountUser?}。 。 。 . |
错误预设( E)POST /__admin/faults {"preset": "<name>", "count"?: n}: rate_limited (429个),
payment_required (402), (中文(简体) ), unauthorized (401个), server_error (500个), parser_schema_drift, (中文(简体) ),
recipe_quality (555), (中文(简体) ), vision_not_found, (中文(简体) ), meal_plan_incomplete, (中文(简体) ), meal_plan_timeout, (中文(简体) ),
slow (12s,过去10秒), connection_drop。 。 。 .
命名空间
x-mockingbird-namespace页:1 /__admin/ns/<name> 基准 URL 前缀( 营养适配器的工作)
和连接路径的 Python 客户端; 适餐器用
new URL(endpoint, base),将前缀删除,或者通过应用程序 id:
PUT /__admin/credentials {"credentials": {"<app_id>": "<namespace>"}}。 。 。 .
故意不模拟
- Edamam的NLP和数据库:解析器理解领先数量、已知计量和 食品名称;真实的食物和食谱内容需要记录.
- 解析器
nutrients[CODE]是一个 最好猜,不是甲骨文验证 (供应商只说 食物数据库可以"通过给定的营养量来搜索食物";查询语法, a的错误 变形范围以及任何计划限制都从未被观察到现场直播). 模拟器读取nutrients[PROCNT]=20+, (中文(简体) ),=5(最多)和=5-15(包括)像calories,反对 每100克粮食nutrients,还有生的+解码到一个空间 仍然意味着"或更多". 几个代码,一个重复代码和health编号 :calories编号 :category编号 :categoryLabel所有人必须 抓取; 无匹配200与hints: []财务报告和审定财务报表parsed: []。无价值的食物 代码不匹配 。 任何像养分代码形状的代码都被接受,但内置体 只携带ENERC_KCAL, (中文(简体) ),PROCNT, (中文(简体) ),FAT, (中文(简体) ),CHOCDF, (中文(简体) ),FIBTG财务报告和审定财务报表SUGAR,因此代码,例如NA或者说FE只匹配种子食物POST /__admin/foods载人而行者, 而不是供应商的答复)。 区域或代码不正确400 bad_request编辑upc搜索忽略 过滤器( 用于)calories。 。 。 . - 食品数据库自动完成、品牌搜索和
nutrients修饰符; Recipe 搜索用户 食谱(type=user, (中文(简体) ),field=投影和除URL以外的图像. - 餐饮计划
fit除了日间卡片检查,mark重量,筑巢 子节,以及购物卡的取出页面.
API 密码
| 导出 | 仁爱 | 说明 |
|---|---|---|
EdamamAPI | 类 | 进程模拟器 : fetch(request), (中文(简体) ), reset(), (中文(简体) ), addFood(food), (中文(简体) ), addRecipe(seed), (中文(简体) ), recipes()选项: sqlite, (中文(简体) ), now, (中文(简体) ), namespace, (中文(简体) ), foods, (中文(简体) ), recipes, (中文(简体) ), settings。 。 。 . |
createRuntime | 函数 | 全面服务合同的仿真器(保健、管理员、命名空间、证书、预设)。 选项 : foods, (中文(简体) ), recipes, (中文(简体) ), settings, (中文(简体) ), clock, (中文(简体) ), seed, (中文(简体) ), adminKey, (中文(简体) ), onLog, (中文(简体) ), sqlite。 。 。 . |
EDAMAM_PRESETS | 对象 | 每个命名的断层预设. |
EDAMAM_NAMESPACE | 字符串 | 服务名称, "edamam"。 。 。 . |
ACCOUNT_USER_HEADER | 字符串 | edamam-account-user。 。 。 . |
DEFAULT_FOODS, (中文(简体) ), DEFAULT_RECIPES | 数组 | 内生之体. |
MEASURE_URI, (中文(简体) ), RECIPE_URI, (中文(简体) ), NUTRIENTS | 数值 | Edamam的计量和配方URI前缀,以及营养素代码服务. |
buildRecipe | 函数 | 食谱中从种子和食物体中取出食谱V2形状. |
parseLine | 函数 | 成分线解析器. |
perServing | 函数 | 一个食谱的每个服务值 一个营养编码. |
appIdCredential | 函数 | 这个 app_id 请求包含( 如何绘制命名空间的证书映射) . |
foodError, (中文(简体) ), recipeErrors | 函数 | 构建每个 API 家族的错误响应 . |
document, (中文(简体) ), operationIds, (中文(简体) ), supportedOperationIds | 数值 | OpenAPI合同及其操作代号. |
createServer, (中文(简体) ), serveTarget, (中文(简体) ), DEFAULT_PORT (单位:千美元)./server(中文(简体) ) | 节点 | 服务过来 node:http; 数据 serve CLI目标(--app, (中文(简体) ), --require-account-user; 港号8824. |
部分 嘲笑鸟。 。 。 .