调用工具

用同一种请求格式调用任意 Direct API 工具,读取其结果和计费信息,并借助 Idempotency-Key 安全地重试付费调用。

每项能力都是一个工具,调用方式都相同:POST /v1/direct/tools/{tool_name}。工具目录 列出了所有工具。

请求

请求头必填值
Authorization是Bearer <key>
Content-Type是application/json
Idempotency-Key付费调用建议使用参见 幂等性
{
  "input": { },
  "webhook_id": "01929a10-0c3d-7f44-8a21-0b1c2d3e4f50",
  "metadata": { "order_id": "4411", "customer": "acme" }
}
字段类型必填含义
inputobject是工具的参数,按其 input_schema 校验。对于不接受参数的工具,发送 {}。每个会创建内容的工具(生成任务、导入、上传、时间线)都需要 project_id,可从 list_projects 获取。
webhook_idstring 或 null否一个已注册的 webhook 端点,当此调用启动的每个生成任务达到最终状态时会通知它。仅对 returns_generation: true 的工具有意义;在其他工具上会被拒绝。
metadataobject 或 null否最多 20 个字符串键(不超过 40 个字符),值为字符串(不超过 500 个字符)。保存在此调用启动的每个生成任务上,并在每次读取和每个 webhook 中原样返回。Morphic 从不解读其内容。

一个带幂等键的完整调用:

curl -s https://mcp.morphic.com/v1/direct/tools/generate_image \
  -H "Authorization: Bearer $MORPHIC_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: order-4411-hero-image" \
  -d '{"input": {"prompt": "A red vintage bicycle against a pastel wall", "project_id": "01928f4e-5b7c-7d2a-9e11-3c4b5a6d7e8f"}, "metadata": {"order_id": "4411"}}'

在 Morphic 服务器上渲染视频的工具(video_compose、video_* 变换工具和 burn_subtitles)暂不接受 webhook_id 或 metadata。设置其中任何一个时,它们会返回 422 tool_refused;请改为轮询它们的生成任务。

响应

每个成功响应都使用相同的外层结构。工具自身的输出位于 result 中,格式由其 output_schema 描述。

{
  "request_id": "0192a7b3-91d0-7c55-b1aa-6e5f4c3b2a10",
  "tool": "generate_image",
  "result": {
    "generation_id": "0192a7b3-a1c4-7e02-8f9d-1a2b3c4d5e6f",
    "generation_ids": ["0192a7b3-a1c4-7e02-8f9d-1a2b3c4d5e6f"],
    "status": "queued",
    "project_id": "01928f4e-5b7c-7d2a-9e11-3c4b5a6d7e8f",
    "project_name": "Spring campaign",
    "file_id": "01928f4e-6c8d-7a10-b2c3-d4e5f6a7b8c9",
    "model_id": "mdl_3hv8tq1nzc6e",
    "estimated_credits": 8,
    "credits_settle_on_output_duration": false
  },
  "billing": {
    "credits_charged": 8,
    "credits_are_final": false,
    "credits_settle_on_output_duration": false,
    "generation_ids": ["0192a7b3-a1c4-7e02-8f9d-1a2b3c4d5e6f"]
  }
}
状态何时返回
202 Accepted工具启动了一个或多个生成任务(returns_generation: true);通过 轮询 或 webhook 跟踪它们
200 OK工具在调用内完成(列表、目录、报价、分析),或是幂等重放

计费块

每个成功响应都包含 billing,免费调用也不例外。

调用类型billing.credits_chargedcredits_are_final
免费调用:列表、目录、报价、状态读取0true
启动生成任务的调用(202)启动时为每个已启动的生成任务扣除的积分之和false
在请求内完成的付费调用(analyze_video、analyze_audio、filmlab_edit)其扣除的积分true
被拒绝的调用(4xx)没有 billing 块;不扣除任何积分

该块报告的是调用返回时扣除的积分。退款和结算会在之后发生,并显示在生成任务上,而不会出现在原始响应中。响应还带有 Morphic-Credits-Charged: <integer>,便于在你的网关处记录日志。积分与用量 说明了生成任务如何扣费、结算和退款。

工具拒绝

当输入格式正确但无法运行时(你的套餐不包含的模型、模型不提供的宽高比、类型错误的素材),调用会返回 422 tool_refused。消息会指出字段、值以及可以使用的值。没有启动任何任务,也没有扣除任何积分。

{
  "description": "aspect_ratio: \"21:9\" is not offered by model mdl_3hv8tq1nzc6e. Offered: 1:1, 4:3, 3:4, 16:9, 9:16. Models offering 21:9 for text_to_image: mdl_9wd4mf2kqs7b.",
  "code": "tool_refused",
  "data": { "request_id": "0192a7b3-…", "tool": "generate_image" },
  "error": { "error_code": "TOOL_REFUSED", "message": "aspect_ratio: \"21:9\" is not offered by model mdl_3hv8tq1nzc6e. …" }
}

部分启动

variations 大于 1 的调用会为每个变体启动一个生成任务。如果较早的变体已启动后,后面的某个变体被拒绝:

  • 响应仍然是 202,result.partial_failure 会说明发生了什么。
  • result.generation_ids 只列出已启动的任务,billing 也只计算已启动的任务。
  • 只重试缺失的变体。

幂等性

网络故障可能发生在请求已发出、但响应尚未到达之时。要安全地重试付费调用,请发送 Idempotency-Key 请求头。使用你自己的作业 ID 或订单 ID。

Idempotency-Key: order-4411-hero-image
  • 带有某个键的第一个请求正常运行。
  • 24 小时内使用相同的键、工具和请求体进行重试,不会再次运行。它会返回 200 和原始响应体,包括原始的 generation_ids 和 billing,并且不会再扣除任何积分。其 Morphic-Credits-Charged 响应头为 0。
  • 相同的键搭配不同的工具或请求体,会返回 409 idempotency_conflict。
  • 原始请求仍在运行时重试,会返回 409 idempotency_in_progress。
  • 如果付费调用的原始请求失败(5xx),或在可能已经运行之后始终没有响应,对它的重试会返回 409 idempotency_outcome_unknown。它在同一个键下永远不会再次运行:请先检查其结果,然后使用新键。
  • 键的作用域限于发送它的 API 密钥,最长 200 个字符。

免费调用同样接受此请求头,但很少需要。

在 5xx 之后重试付费调用

返回 500、503 或 504 的付费调用,可能在失败前已经启动了工作并扣除了积分。

  1. 用 list_generations,或按时间筛选的 GET /v1/direct/usage,检查该调用做了什么。
  2. 只为尚未启动的工作发送新的 Idempotency-Key。

如果完全没有收到响应(连接中断),请使用相同的键重试:你会得到已保存的响应,或者在它仍在运行时得到 409 idempotency_in_progress。


如果您遇到任何问题或有任何疑问,欢迎随时联系我们。我们很乐意提供帮助。请发送邮件至 support@morphic.com.

本页内容