文档中心 / SDK 教程 / 定制篇

Prompt 定制与多模态

默认情况下,Cody 会把你当成通用编程助手来组织系统提示。很多场景下,你希望它变成专用助手:只做安全审查、只按某种语气回复,或者能「看见」截图里的界面再写代码。本篇用同一条叙事线:先给可运行的完整示例,再拆开讲 system_prompt()extra_system_prompt() 以及多模态 MultimodalPrompt

本系列演示模型统一为 qwen3.5-plus。请像第 01 篇那样配置环境变量(CODY_MODELCODY_MODEL_API_KEYCODY_MODEL_BASE_URL),下面示例中的 Cody().workdir("...").build() 即可不显式写模型;需要写死模型时可用 .model("qwen3.5-plus").base_url("https://coding.dashscope.aliyuncs.com/v1").api_key("sk-xxx")

先看完整例子:安全审查 + 中文回复

下面这段程序一次性做完两件事:用 system_prompt() 把「人设」换成安全审查员,用 extra_system_prompt() 要求始终用中文回答。跑通之后再读后面各节,会很容易对应上每个 API 在做什么。

import asyncio
from cody.sdk import Cody


async def main() -> None:
    # 替换默认编程助手人设,并追加「始终中文」约束
    client = (
        Cody()
        .workdir(".")
        .system_prompt("You are a security reviewer. Focus on injection and secrets.")
        .extra_system_prompt("Always reply in Chinese.")
        .build()
    )
    result = await client.run("请快速审查:这段代码有没有明显的安全问题?")
    print(result)


if __name__ == "__main__":
    asyncio.run(main())

system_prompt():替换角色

system_prompt()替换默认的通用编程助手 persona(基础系统角色),适合你把 Agent 定义成「只做一类事」的专家,例如安全审查、文档生成、测试编写等。

# system_prompt() —— 替换默认 persona
client = Cody().workdir(".").system_prompt("You are a security reviewer.").build()

一旦设置了 system_prompt(),框架不再使用内置的「通用编程助手」那段基础人设;其余与项目、工具、技能相关的内置说明仍会按框架逻辑组装(与「整段系统提示全部手写」不同)。若你只想加几条规矩而保留默认人设,请用下一节的 extra_system_prompt()

extra_system_prompt():追加约束

extra_system_prompt()所有内置 prompt 之后再追加一段文字,不会换掉默认编程助手身份。典型用法:输出语言、格式(如 Markdown 标题层级)、语气、合规话术等。

# extra_system_prompt() —— 在所有内置 prompt 后追加
client = (
    Cody()
    .workdir(".")
    .extra_system_prompt("Always reply in Chinese.")
    .build()
)

对比:system_promptextra_system_prompt

两者名字相近,但语义一个是「换身份」,一个是「加备注」。下面表格帮你一次记清。

维度 system_prompt() extra_system_prompt()
作用 替换默认基础人设(persona) 在内置系统提示末尾追加一段说明
与内置 prompt 的关系 不再使用框架提供的默认「通用编程助手」基础角色 保留完整内置系统提示,仅在其后拼接你的约束
典型场景 专用 Agent:安全审计、只写测试、只写文档等 全局偏好:语言、格式、风格、禁止事项等
可多次调用 以 Builder 最后一次设置为准(覆盖) 以 Builder 最后一次设置为准(覆盖)
能否同时使用 可以。常见组合:自定义人设 + 追加语言/格式约束(见下文)。

组合使用

生产里经常出现「我要专用身份,但还要统一加几条全项目规矩」。这时两个 API 一起用即可:先 system_prompt() 定角色,再 extra_system_prompt() 叠约束。

client = (
    Cody()
    .workdir(".")
    .system_prompt(
        "You are a security reviewer. Prioritize OWASP-style issues and false-positive hints."
    )
    .extra_system_prompt(
        "Always reply in Chinese. Use Markdown with ## for sections."
    )
    .build()
)

若你只写 extra_system_prompt(),用户感知仍是「还是那个 Cody 编程助手,但多了几条家规」;若加上 system_prompt(),对话基调会明显变成你定义的专家角色。

多模态:MultimodalPromptImageData

有时用户任务不是纯文本,而是一张设计稿或界面截图。Cody 提供 MultimodalPrompt:一段 text 加上若干 ImageData(Base64 字符串 + MIME 类型 + 可选文件名)。注意 需要模型本身支持视觉(如支持图像输入的 qwen3.5-plus 等多模态模型),否则会失败或表现异常。

单图示例

从本地读入 PNG,编码为 Base64,再交给 client.run()client.stream()

import base64

from cody.core.prompt import MultimodalPrompt, ImageData
from cody.sdk import Cody

client = Cody().workdir(".").build()

with open("screenshot.png", "rb") as f:
    b64 = base64.b64encode(f.read()).decode()

prompt = MultimodalPrompt(
    text="实现这个页面",
    images=[
        ImageData(
            data=b64,
            media_type="image/png",  # image/png | image/jpeg | image/webp | image/gif
            filename="screenshot.png",
        )
    ],
)

result = await client.run(prompt)

多图与格式

单图与多图的区别仅在于 images 列表长度:一张图时列表里一个 ImageData;多张图时按顺序放入多个 ImageData,模型会同时看到多张参考图(具体上限取决于模型与服务商)。

media_type 需与文件真实格式一致,常用取值:

# 多图:在 images 列表中放多个 ImageData
prompt = MultimodalPrompt(
    text="对比这两张图,列出 UI 差异并给出改法",
    images=[
        ImageData(data=b64_a, media_type="image/png", filename="before.png"),
        ImageData(data=b64_b, media_type="image/jpeg", filename="after.jpg"),
    ],
)

# 流式同样传入 MultimodalPrompt
async for chunk in client.stream(prompt):
    ...

ImageDatadata 为 Base64 编码的原始字节对应的字符串(不要带 data:image/png;base64, 前缀,除非你的接入层另有约定)。filename 便于日志与调试,可按需填写。

小结

本篇你掌握了:用 system_prompt() 换掉默认编程助手人设、用 extra_system_prompt() 在内置系统提示后追加约束,以及用 MultimodalPrompt + ImageData 把截图/design 喂给支持视觉的模型。下一篇我们会进入 Skills,让 Agent 按项目约定加载可复用能力,请继续阅读 07. 使用 Skills

← 上一篇 注册自定义工具