14 · 多模态与人工交互¶
完成后:你会发送界面截图,并在 Agent 需要选择或高风险确认时从流中提交响应。
1. 构造图片 Prompt¶
import asyncio
import base64
from cody import AsyncCodyClient
from cody.core.prompt import ImageData, MultimodalPrompt
async def main() -> None:
image_b64 = base64.b64encode(open("screenshot.png", "rb").read()).decode()
prompt = MultimodalPrompt(
text="检查截图中的响应式布局问题,并修复当前项目",
images=[
ImageData(
data=image_b64,
media_type="image/png",
filename="screenshot.png",
)
],
)
async with AsyncCodyClient(workdir="/tmp/cody-tutorial") as client:
result = await client.run(prompt)
print(result.output)
asyncio.run(main())
Cody 能承载图片 payload,不代表所选模型端点一定有视觉能力。先确认端点支持对应 MIME 类型和图像输入。
2. 打开异步人工交互¶
from cody.sdk import Cody
client = (
Cody()
.workdir("/tmp/cody-tutorial")
.interaction(enabled=True, timeout=60)
.build()
)
3. 在流中响应¶
from cody.core.errors import InteractionTimeoutError
try:
async for chunk in client.stream("重构认证模块;删除旧文件前必须确认"):
if chunk.type == "interaction_request":
print(f"[{chunk.interaction_kind}] {chunk.content}")
print("options:", chunk.options)
await client.submit_interaction(
request_id=chunk.request_id,
action="approve",
content="批准本次变更",
)
elif chunk.type == "text_delta":
print(chunk.content, end="", flush=True)
except InteractionTimeoutError:
print("等待用户输入超时")
交互类型包括 question、confirm 和 feedback。同步客户端无法并发等待交互;需要 Human-in-the-Loop 时使用 AsyncCodyClient 或 durable Runtime Approval。
SDK Interaction 与 Runtime Approval¶
- SDK Interaction:适合当前进程内的实时 UI,超时会结束本次调用。
- Runtime Approval:持久化为 waiting,释放 worker,可跨进程、跨界面审批后恢复。
涉及长时间等待、服务重启或跨团队审批时,使用 Runtime Approval。