返回 AiToEarn
buildPrompt.ts
根目录 / project / aitoearn-web / src / store / agent / utils / buildPrompt.ts
1 /**
2 * 构建 Prompt 工具
3 * 将用户输入的文本和媒体文件转换为 Claude Prompt 格式
4 */
5
6 import type { IPromptContentItem, IUploadedMedia } from '../agent.types'
7
8 /**
9 * 构建 Claude Prompt 格式
10 * @param text 用户输入的文本
11 * @param medias 媒体文件列表
12 * @returns Claude Prompt 格式的数组
13 */
14 export function buildClaudePrompt(
15 text: string,
16 medias: IUploadedMedia[] = [],
17 ): IPromptContentItem[] {
18 const prompt: IPromptContentItem[] = []
19
20 // 过滤有效的媒体文件(已上传完成的)
21 const validMedias = medias.filter(m => m.url && m.progress === undefined)
22
23 // 添加媒体内容项
24 validMedias.forEach((media) => {
25 const item: IPromptContentItem = {
26 type: media.type,
27 source: {
28 type: 'url',
29 url: media.url,
30 },
31 }
32
33 // 如果有缓存控制,添加到项中
34 if (media.cache_control) {
35 item.cache_control = media.cache_control
36 }
37
38 prompt.push(item)
39 })
40
41 // 添加文本内容项(放在最后)
42 if (text.trim()) {
43 prompt.push({
44 type: 'text',
45 text: text.trim(),
46 })
47 }
48
49 return prompt
50 }
51
52 /**
53 * 将 Claude Prompt 格式转换为 API 所需格式
54 * @param text 用户输入的文本
55 * @param medias 媒体文件列表
56 * @returns JSON 数组格式,如果没有媒体则返回纯文本
57 */
58 export function buildPromptForAPI(
59 text: string,
60 medias: IUploadedMedia[] = [],
61 ): string | IPromptContentItem[] {
62 // 过滤有效的媒体文件
63 const validMedias = medias.filter(m => m.url && m.progress === undefined)
64
65 // 如果没有媒体文件,直接返回文本
66 if (validMedias.length === 0) {
67 return text.trim()
68 }
69
70 // 否则返回 Claude Prompt 格式数组
71 return buildClaudePrompt(text, medias)
72 }
73
73 lines TYPESCRIPT