@tacoreai/web-sdk 1.0.11 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +404 -0
- package/amd-config.json +11 -0
- package/database/core/apps/AppsAuthManager.js +336 -0
- package/database/core/apps/AppsClient.AI.js +229 -0
- package/database/core/apps/AppsClient.AppServer.js +92 -0
- package/database/core/apps/AppsClient.Crawler.js +71 -0
- package/database/core/apps/AppsClient.Data.js +187 -0
- package/database/core/apps/AppsClient.Debug.js +41 -0
- package/database/core/apps/AppsClient.Deploy.js +66 -0
- package/database/core/apps/AppsClient.Ecommerce.js +151 -0
- package/database/core/apps/AppsClient.KV.js +72 -0
- package/database/core/apps/AppsClient.KnowledgeBase.js +130 -0
- package/database/core/apps/AppsClient.Message.js +27 -0
- package/database/core/apps/AppsClient.Realtime.js +46 -0
- package/database/core/apps/AppsClient.Storage.js +275 -0
- package/database/core/apps/AppsClient.TextIn.js +341 -0
- package/database/core/apps/AppsClient.Tools.js +36 -0
- package/database/core/apps/AppsClient.Users.js +49 -0
- package/database/core/apps/AppsClient.VoiceVideo.js +106 -0
- package/database/core/apps/AppsClient.Volcengine.js +169 -0
- package/database/core/apps/AppsClient.js +215 -0
- package/database/core/apps/AppsPublicClient.js +107 -0
- package/database/core/apps/BaseAppsClient.js +215 -0
- package/index.js +9 -0
- package/package.json +10 -23
- package/utils/errorLogger.js +28 -0
- package/utils/index.js +114 -0
- package/dist/index.umd.js +0 -1
package/README.md
ADDED
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
# @tacoreai/web-sdk
|
|
2
|
+
|
|
3
|
+
Tacore Web SDK for AI generated applications. This SDK provides tools to interact with Tacore's backend services for applications, including authentication, data, AI, and file storage.
|
|
4
|
+
|
|
5
|
+
## Version
|
|
6
|
+
1.0.15
|
|
7
|
+
|
|
8
|
+
## Installation
|
|
9
|
+
|
|
10
|
+
npm install @tacoreai/web-sdk
|
|
11
|
+
|
|
12
|
+
## Usage
|
|
13
|
+
|
|
14
|
+
### AppsAuthManager
|
|
15
|
+
示例略(保持原有章节)
|
|
16
|
+
|
|
17
|
+
### AppsClient (Data & AI)
|
|
18
|
+
示例略(保持原有章节)
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 文件存储 API(CloudBase 通道)
|
|
23
|
+
|
|
24
|
+
先确保已通过 AppsAuthManager 登录,并使用 AppsClient 初始化时提供 appId。以下接口均作用于 /apps 路由,需携带 Authorization。
|
|
25
|
+
|
|
26
|
+
1) 上传文件(<=20MB)
|
|
27
|
+
|
|
28
|
+
import { AppsClient } from '@tacoreai/web-sdk'
|
|
29
|
+
const client = new AppsClient('YOUR_APP_ID')
|
|
30
|
+
|
|
31
|
+
const input = document.querySelector('#fileInput')
|
|
32
|
+
const file = input.files[0]
|
|
33
|
+
const result = await client.uploadFile(file, { expires: 3600 })
|
|
34
|
+
// result.data => { fileID, url, path, mimeType, size, expiresIn }
|
|
35
|
+
|
|
36
|
+
2) 获取临时下载 URL
|
|
37
|
+
|
|
38
|
+
const { data } = await client.getFileUrl('<fileID>', 1800)
|
|
39
|
+
// data.url 为可直接访问的签名地址(有效期30分钟)
|
|
40
|
+
|
|
41
|
+
3) 批量删除文件
|
|
42
|
+
|
|
43
|
+
await client.deleteFiles(['<fileID1>', '<fileID2>'])
|
|
44
|
+
|
|
45
|
+
4) 下载文件为 Blob(用于预览或保存)
|
|
46
|
+
|
|
47
|
+
const blob = await client.downloadFile('<fileID>')
|
|
48
|
+
// 例如:保存为本地文件
|
|
49
|
+
const a = document.createElement('a')
|
|
50
|
+
a.href = URL.createObjectURL(blob)
|
|
51
|
+
a.download = 'download.bin'
|
|
52
|
+
a.click()
|
|
53
|
+
URL.revokeObjectURL(a.href)
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## [新增] 文件上传与分析
|
|
58
|
+
|
|
59
|
+
此接口用于上传文件(如 PDF、图片)以供 AI 进行深度分析或作为图片编辑的输入。
|
|
60
|
+
|
|
61
|
+
### `uploadFileForAnalysis(file)`
|
|
62
|
+
- **功能**: 将文件上传至 Google 的专用存储,并返回一个可供 AI 模型引用的 `fileUri`。
|
|
63
|
+
- **参数**:
|
|
64
|
+
- `file` (File): 从文件输入框获取的 File 对象。
|
|
65
|
+
- **返回值**: `Promise<{fileUri: string, mimeType: string, ...}>`
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## 图片生成 (Apps 路由)
|
|
70
|
+
|
|
71
|
+
请确保已通过 AppsAuthManager 登录,并使用 AppsClient 发起请求(会自动附带 Authorization)。
|
|
72
|
+
|
|
73
|
+
### `generateImage(options)`
|
|
74
|
+
- **功能**: 调用文生图服务。默认使用 Google Imagen,可按需切换。
|
|
75
|
+
- **返回**: `Promise<Object>` (后端响应对象,包含 `data.uri` 或 `data.images`)
|
|
76
|
+
|
|
77
|
+
#### 1. 调用 Google Imagen (默认)
|
|
78
|
+
|
|
79
|
+
import { AppsClient } from '@tacoreai/web-sdk'
|
|
80
|
+
const client = new AppsClient('YOUR_APP_ID')
|
|
81
|
+
|
|
82
|
+
const result = await client.generateImage({
|
|
83
|
+
prompt: '一只在云端奔跑的小狗,卡通风格'
|
|
84
|
+
});
|
|
85
|
+
// 获取图片 URI
|
|
86
|
+
const imageUri = result.data.uri;
|
|
87
|
+
|
|
88
|
+
#### 2. 调用豆包 4.0 模型
|
|
89
|
+
通过 `provider` 参数切换服务商。
|
|
90
|
+
|
|
91
|
+
const result = await client.generateImage({
|
|
92
|
+
provider: 'volcengine', // 指定使用火山引擎
|
|
93
|
+
prompt: '一只在云端奔跑的小狗,中国水墨画风格',
|
|
94
|
+
// 可选,指定豆包模型版本,默认为 doubao-seedream-4-5-251128
|
|
95
|
+
// model: 'doubao-seedream-4-5-251128',
|
|
96
|
+
});
|
|
97
|
+
const imageUri = result.data.uri;
|
|
98
|
+
|
|
99
|
+
注意:
|
|
100
|
+
- 计费:Apps 路由会根据 appId 自动解析组织并扣费。
|
|
101
|
+
- 错误码:402(余额不足)、404(组织不存在)、500/503(外部服务异常)等。
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## [更新] 图片编辑 (Google Image Edit) - Apps 路由
|
|
106
|
+
|
|
107
|
+
图片编辑支持更复杂的工作流:单图编辑、双图融合(如“把衣服穿到模特身上”)、掩膜修复/扩展(Inpainting/Outpainting)。
|
|
108
|
+
|
|
109
|
+
- **接口**: /agent/generate-google-image-edit
|
|
110
|
+
- **方法**: `AppsClient.editImage(options)`
|
|
111
|
+
- **返回**: `Promise<Object>` (后端响应对象,包含 `data.uri` 或 `data.images`)
|
|
112
|
+
|
|
113
|
+
### 核心流程
|
|
114
|
+
1. **上传图片**: 所有源图片(包括底图、叠加图、掩膜图)都**必须**先通过 `uploadFileForAnalysis(file)` 上传,获取 `fileUri` 和 `mimeType`。
|
|
115
|
+
2. **调用编辑**: 使用获取到的 `fileUri` 和 `mimeType`,通过 `editImage` 方法并采用**简化的 `prompt + inputs` 模式**进行调用。
|
|
116
|
+
|
|
117
|
+
### 前置要求
|
|
118
|
+
- **必须先登录** (AppsAuthManager)
|
|
119
|
+
- `uploadFileForAnalysis`
|
|
120
|
+
|
|
121
|
+
### 1. 简化调用 (prompt + inputs 模式,推荐)
|
|
122
|
+
SDK 会自动将 `prompt` 和 `inputs` 数组组合成标准的多模态 `messages`。
|
|
123
|
+
|
|
124
|
+
import { AppsClient } from '@tacoreai/web-sdk'
|
|
125
|
+
const client = new AppsClient('YOUR_APP_ID')
|
|
126
|
+
|
|
127
|
+
// 1. 上传源文件
|
|
128
|
+
const baseFile = await client.uploadFileForAnalysis(file);
|
|
129
|
+
|
|
130
|
+
// 2. 调用编辑接口
|
|
131
|
+
const result = await client.editImage({
|
|
132
|
+
prompt: '仅移除图中叠加的文字,保持其他区域不变,输出高清。',
|
|
133
|
+
inputs: [
|
|
134
|
+
{ type: 'uploaded_file', fileUri: baseFile.fileUri, mimeType: baseFile.mimeType }
|
|
135
|
+
]
|
|
136
|
+
});
|
|
137
|
+
// 获取图片 URI (兼容不同后端返回结构)
|
|
138
|
+
const editedBase64 = result.data.uri || (result.data.images && result.data.images[0]?.uri);
|
|
139
|
+
// editedBase64 即可直接作为 <img src={editedBase64} />
|
|
140
|
+
|
|
141
|
+
### 2. 典型场景范式
|
|
142
|
+
|
|
143
|
+
- **场景 A:单图编辑(去字/去水印/局部替换)**
|
|
144
|
+
|
|
145
|
+
const base = await client.uploadFileForAnalysis(file);
|
|
146
|
+
const result = await client.editImage({
|
|
147
|
+
prompt: '移除叠加文字,其他区域完全保持不变。',
|
|
148
|
+
inputs: [
|
|
149
|
+
{ type: 'uploaded_file', fileUri: base.fileUri, mimeType: base.mimeType }
|
|
150
|
+
]
|
|
151
|
+
});
|
|
152
|
+
const base64 = result.data.uri || result.data.images?.[0]?.uri;
|
|
153
|
+
|
|
154
|
+
- **场景 B:双图融合(将服装穿到模特身上)**
|
|
155
|
+
|
|
156
|
+
const garment = await client.uploadFileForAnalysis(garmentFile);
|
|
157
|
+
const modelPhoto = await client.uploadFileForAnalysis(modelFile);
|
|
158
|
+
|
|
159
|
+
const result = await client.editImage({
|
|
160
|
+
prompt: '将服装自然替换到模特身上,保持姿态与光照;去除服装图背景;保持背景不变;不改变面部和发型。',
|
|
161
|
+
inputs: [
|
|
162
|
+
// 建议顺序:底图(模特)放前,叠加/融合图(服装)放后
|
|
163
|
+
{ type: 'uploaded_file', fileUri: modelPhoto.fileUri, mimeType: modelPhoto.mimeType },
|
|
164
|
+
{ type: 'uploaded_file', fileUri: garment.fileUri, mimeType: garment.mimeType }
|
|
165
|
+
]
|
|
166
|
+
});
|
|
167
|
+
const base64 = result.data.uri || result.data.images?.[0]?.uri;
|
|
168
|
+
|
|
169
|
+
- **场景 C:掩膜修复/扩展(Inpainting / Outpainting)**
|
|
170
|
+
|
|
171
|
+
const base = await client.uploadFileForAnalysis(baseFile);
|
|
172
|
+
const mask = await client.uploadFileForAnalysis(maskFile); // 掩膜语义按后端约定
|
|
173
|
+
|
|
174
|
+
const result = await client.editImage({
|
|
175
|
+
prompt: '在掩膜区域进行修复,移除水印并保持纹理一致;不要改变未掩膜区域。',
|
|
176
|
+
inputs: [
|
|
177
|
+
// 建议顺序:底图 -> 掩膜
|
|
178
|
+
{ type: 'uploaded_file', fileUri: base.fileUri, mimeType: base.mimeType },
|
|
179
|
+
{ type: 'uploaded_file', fileUri: mask.fileUri, mimeType: mask.mimeType }
|
|
180
|
+
]
|
|
181
|
+
});
|
|
182
|
+
const base64 = result.data.uri || result.data.images?.[0]?.uri;
|
|
183
|
+
|
|
184
|
+
### 3. 高级模式 (messages 透传)
|
|
185
|
+
用于完全控制请求结构,不推荐常规使用。
|
|
186
|
+
|
|
187
|
+
const base = await client.uploadFileForAnalysis(file)
|
|
188
|
+
|
|
189
|
+
const result = await client.editImage({
|
|
190
|
+
model: 'gemini-2.5-flash-image-preview',
|
|
191
|
+
messages: [
|
|
192
|
+
{
|
|
193
|
+
role: 'user',
|
|
194
|
+
content: [
|
|
195
|
+
{ type: 'text', text: '移除图中叠加的文字...' },
|
|
196
|
+
{ type: 'uploaded_file', uploaded_file: { fileUri: base.fileUri, mimeType: base.mimeType } }
|
|
197
|
+
]
|
|
198
|
+
}
|
|
199
|
+
]
|
|
200
|
+
})
|
|
201
|
+
const base64 = result.data.uri || result.data.images?.[0]?.uri;
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## [新增] Sora 视频生成
|
|
206
|
+
|
|
207
|
+
通过 AppsClient 调用 Sora 视频生成服务。计费将自动关联到应用所属的组织。
|
|
208
|
+
|
|
209
|
+
### 定价
|
|
210
|
+
- **sora-2**: 300 积分/次
|
|
211
|
+
- **sora-2-pro**: 1500 积分/次
|
|
212
|
+
|
|
213
|
+
### `createVideoJob(options)`
|
|
214
|
+
- **功能**: 创建一个异步的视频生成任务。
|
|
215
|
+
- **参数**:
|
|
216
|
+
- `options` (object):
|
|
217
|
+
- `prompt` (string, 必填): 视频描述提示词。
|
|
218
|
+
- `model` (string, 必填): 模型名称, 'sora-2' 或 'sora-2-pro'。
|
|
219
|
+
- `size` (string, 可选): 视频尺寸, 默认为 '1920x1080'。
|
|
220
|
+
- `seconds` (number, 可选): 视频时长, 默认为 6。
|
|
221
|
+
- **返回值**: `Promise<object>` - 包含任务初始状态的文档。
|
|
222
|
+
|
|
223
|
+
### `remixVideoJob(jobId, options)`
|
|
224
|
+
- **功能**: 基于一个已完成的视频,创建一个新的 Remix 任务。
|
|
225
|
+
- **参数**:
|
|
226
|
+
- `jobId` (string, 必填): 原始视频任务的 `wyID`。
|
|
227
|
+
- `options` (object):
|
|
228
|
+
- `prompt` (string, 必填): 用于修改视频的提示词。
|
|
229
|
+
- **返回值**: `Promise<object>` - 包含新的 Remix 任务初始状态的文档。
|
|
230
|
+
|
|
231
|
+
### `getVideoJob(jobId)`
|
|
232
|
+
- **功能**: 查询指定视频任务的状态。
|
|
233
|
+
- **参数**:
|
|
234
|
+
- `jobId` (string, 必填): `createVideoJob` 或 `remixVideoJob` 返回的任务 `wyID`。
|
|
235
|
+
- **返回值**: `Promise<object>` - 包含任务最新状态的文档。当 `status` 为 'completed' 时,`resultUrl` 字段将包含视频的下载链接。
|
|
236
|
+
|
|
237
|
+
### `listVideoJobs(options)`
|
|
238
|
+
- **功能**: 获取视频任务列表。
|
|
239
|
+
- **参数**:
|
|
240
|
+
- `options` (object):
|
|
241
|
+
- `page` (number, 可选): 页码, 默认 1。
|
|
242
|
+
- `pageSize` (number, 可选): 每页数量, 默认 10。
|
|
243
|
+
- **返回值**: `Promise<object>` - 包含任务列表和分页信息的对象。
|
|
244
|
+
|
|
245
|
+
### 工作流示例
|
|
246
|
+
|
|
247
|
+
const client = new AppsClient('YOUR_APP_ID');
|
|
248
|
+
|
|
249
|
+
async function generateAndPollVideo() {
|
|
250
|
+
try {
|
|
251
|
+
// 1. 提交任务
|
|
252
|
+
const jobResult = await client.createVideoJob({
|
|
253
|
+
prompt: 'A stylish woman walks down a Tokyo street filled with warm glowing neon and animated city signage.',
|
|
254
|
+
model: 'sora-2'
|
|
255
|
+
});
|
|
256
|
+
const jobId = jobResult.data.wyID;
|
|
257
|
+
console.log('视频任务已创建, ID:', jobId);
|
|
258
|
+
|
|
259
|
+
// 2. 轮询状态
|
|
260
|
+
const pollStatus = setInterval(async () => {
|
|
261
|
+
const updatedJob = await client.getVideoJob(jobId);
|
|
262
|
+
console.log('当前状态:', updatedJob.data.status, '进度:', updatedJob.data.progress);
|
|
263
|
+
|
|
264
|
+
if (updatedJob.data.status === 'completed') {
|
|
265
|
+
console.log('视频生成成功! URL:', updatedJob.data.resultUrl);
|
|
266
|
+
clearInterval(pollStatus);
|
|
267
|
+
} else if (updatedJob.data.status === 'failed') {
|
|
268
|
+
console.error('视频生成失败:', updatedJob.data.error);
|
|
269
|
+
clearInterval(pollStatus);
|
|
270
|
+
}
|
|
271
|
+
}, 5000); // 每5秒查询一次
|
|
272
|
+
|
|
273
|
+
} catch (error) {
|
|
274
|
+
console.error('操作失败:', error.message);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## 网页爬虫服务 - Apps 路由
|
|
281
|
+
|
|
282
|
+
请确保已通过 AppsAuthManager 登录,并使用 AppsClient 发起请求(会自动附带 Authorization)。
|
|
283
|
+
|
|
284
|
+
### 1) 单个URL爬取
|
|
285
|
+
|
|
286
|
+
import { AppsClient } from '@tacoreai/web-sdk'
|
|
287
|
+
const client = new AppsClient('YOUR_APP_ID')
|
|
288
|
+
|
|
289
|
+
try {
|
|
290
|
+
const result = await client.scrapeUrl({
|
|
291
|
+
url: 'https://example.com/article',
|
|
292
|
+
projectId: 'project_123' // 可选,项目ID
|
|
293
|
+
})
|
|
294
|
+
|
|
295
|
+
console.log('爬取成功:', result)
|
|
296
|
+
// result.data 包含:
|
|
297
|
+
// - url: 原始URL
|
|
298
|
+
// - markdown: 转换后的Markdown内容
|
|
299
|
+
// - contentLength: HTML内容长度
|
|
300
|
+
// - markdownLength: Markdown内容长度
|
|
301
|
+
// - creditsCost: 消耗的积分(固定50积分)
|
|
302
|
+
} catch (error) {
|
|
303
|
+
console.error('爬取失败:', error.message)
|
|
304
|
+
// 常见错误:
|
|
305
|
+
// - 402: 积分余额不足
|
|
306
|
+
// - 400: URL格式无效或网页访问失败
|
|
307
|
+
// - 404: 组织不存在
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
### 2) 批量URL爬取
|
|
311
|
+
|
|
312
|
+
import { AppsClient } from '@tacoreai/web-sdk'
|
|
313
|
+
const client = new AppsClient('YOUR_APP_ID')
|
|
314
|
+
|
|
315
|
+
try {
|
|
316
|
+
const result = await client.scrapeMultipleUrls({
|
|
317
|
+
urls: [
|
|
318
|
+
'https://example.com/article1',
|
|
319
|
+
'https://example.com/article2',
|
|
320
|
+
'https://example.com/article3'
|
|
321
|
+
],
|
|
322
|
+
projectId: 'project_123', // 可选,项目ID
|
|
323
|
+
maxConcurrent: 3 // 可选,最大并发数,默认3,最大5
|
|
324
|
+
})
|
|
325
|
+
|
|
326
|
+
console.log('批量爬取完成:', result)
|
|
327
|
+
// result.data 包含:
|
|
328
|
+
// - totalUrls: 总URL数量
|
|
329
|
+
// - successfulUrls: 成功爬取的URL数量
|
|
330
|
+
// - failedUrls: 失败的URL数量
|
|
331
|
+
// - results: 详细结果数组
|
|
332
|
+
// - creditsCost: 总消耗积分(只为成功的URL计费)
|
|
333
|
+
|
|
334
|
+
// 处理每个URL的结果
|
|
335
|
+
result.data.results.forEach((item, index) => {
|
|
336
|
+
if (item.success) {
|
|
337
|
+
console.log(`URL ${index + 1} 成功:`, item.data.markdown)
|
|
338
|
+
} else {
|
|
339
|
+
console.log(`URL ${index + 1} 失败:`, item.error)
|
|
340
|
+
}
|
|
341
|
+
})
|
|
342
|
+
} catch (error) {
|
|
343
|
+
console.error('批量爬取失败:', error.message)
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
### 爬虫服务特性
|
|
347
|
+
|
|
348
|
+
- **智能转换**: 自动将HTML内容转换为干净的Markdown格式
|
|
349
|
+
- **内容限制**: 单个页面最大5MB内容限制
|
|
350
|
+
- **并发控制**: 批量爬取支持并发控制,最大并发数为5
|
|
351
|
+
- **数量限制**: 批量爬取最多支持10个URL
|
|
352
|
+
- **计费模式**: 每个成功爬取的URL消耗50积分,失败的URL不计费
|
|
353
|
+
- **错误处理**: 详细的错误信息和状态码,便于调试和处理
|
|
354
|
+
|
|
355
|
+
### 错误码说明
|
|
356
|
+
|
|
357
|
+
- **400**: 参数错误或URL格式无效
|
|
358
|
+
- **402**: 积分余额不足
|
|
359
|
+
- **404**: 组织不存在
|
|
360
|
+
- **500**: 服务器内部错误
|
|
361
|
+
|
|
362
|
+
### 注意事项
|
|
363
|
+
|
|
364
|
+
- 爬虫服务会自动根据 appId 解析组织并进行计费
|
|
365
|
+
- 支持爬取大部分公开网页,但可能受目标网站的反爬虫策略影响
|
|
366
|
+
- 转换后的Markdown内容会自动移除脚本、样式、图片等非文本元素
|
|
367
|
+
- 建议在爬取前先检查积分余额,避免因余额不足导致爬取失败
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
## 平台态图片能力(需平台鉴权与 x-org-id)
|
|
372
|
+
|
|
373
|
+
若在"平台态(/plat)"调用接口,请在请求头中携带:
|
|
374
|
+
- Authorization: Bearer <platform_token>
|
|
375
|
+
- x-org-id: <组织ID>
|
|
376
|
+
|
|
377
|
+
1) 文生图 /plat/agent/text2image
|
|
378
|
+
|
|
379
|
+
POST /plat/agent/text2image
|
|
380
|
+
Headers: Authorization + x-org-id
|
|
381
|
+
Body:
|
|
382
|
+
{
|
|
383
|
+
"organizationId": "<可不传,若传与 x-org-id 一致>",
|
|
384
|
+
"userId": "<平台用户ID>",
|
|
385
|
+
"prompt": "卡通风格的星空小屋",
|
|
386
|
+
"...其它可选项"
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
---
|
|
390
|
+
|
|
391
|
+
## 给 Web Agent 的提示片段
|
|
392
|
+
|
|
393
|
+
你是生成 App 前端代码的 Web Agent。项目已集成 @tacoreai/web-sdk,提供文件、图片和爬虫 API,请遵循:
|
|
394
|
+
- 文件接口:仅通过 AppsClient 调用,不直接使用 fetch。
|
|
395
|
+
- 图片接口:Apps 路由优先,使用 AppsClient.generateImage() 与 AppsClient.editImage()。
|
|
396
|
+
- 爬虫接口:使用 AppsClient.scrapeUrl() 或 AppsClient.scrapeMultipleUrls()。
|
|
397
|
+
- 爬虫服务必填:url(单个)或 urls(批量)。每个成功URL消耗50积分。
|
|
398
|
+
- 计费:Apps 路由按 appId 归属组织进行计费;平台路由需带 x-org-id,并传 userId。
|
|
399
|
+
- 常用方法:
|
|
400
|
+
• 文生图:generateImage({ prompt, ... })
|
|
401
|
+
• 图像编辑:editImage({ messages }) 或 editImage({ prompt, inputs, ... })
|
|
402
|
+
• 单个爬虫:scrapeUrl({ url, projectId? })
|
|
403
|
+
• 批量爬虫:scrapeMultipleUrls({ urls, projectId?, maxConcurrent? })
|
|
404
|
+
- 错误处理:注意处理 401 未登录、402 余额不足、404 组织不存在、500/503 外部服务异常等。
|