@turingflow/agent-kit 0.0.0-stage → 0.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 +546 -2
- package/dist/agent.d.ts +27 -0
- package/dist/agent.js +31 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.js +105 -0
- package/dist/handlers.d.ts +92 -0
- package/dist/handlers.js +211 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +10 -0
- package/dist/sdk.d.ts +106 -0
- package/dist/sdk.js +309 -0
- package/dist/server/agent.d.ts +27 -0
- package/dist/server/agent.js +31 -0
- package/dist/server/artifact-hooks.d.ts +6 -0
- package/dist/server/artifact-hooks.js +37 -0
- package/dist/server/artifact-tool-tracker.d.ts +24 -0
- package/dist/server/artifact-tool-tracker.js +347 -0
- package/dist/server/artifacts.d.ts +227 -0
- package/dist/server/artifacts.js +1061 -0
- package/dist/server/auth/config.d.ts +34 -0
- package/dist/server/auth/config.js +82 -0
- package/dist/server/auth/db.d.ts +159 -0
- package/dist/server/auth/db.js +680 -0
- package/dist/server/auth/handlers.d.ts +27 -0
- package/dist/server/auth/handlers.js +297 -0
- package/dist/server/auth/index.d.ts +15 -0
- package/dist/server/auth/index.js +14 -0
- package/dist/server/auth/login-options.d.ts +14 -0
- package/dist/server/auth/login-options.js +50 -0
- package/dist/server/auth/providers/dingtalk.d.ts +16 -0
- package/dist/server/auth/providers/dingtalk.js +177 -0
- package/dist/server/auth/providers/feishu.d.ts +15 -0
- package/dist/server/auth/providers/feishu.js +100 -0
- package/dist/server/auth/providers/index.d.ts +13 -0
- package/dist/server/auth/providers/index.js +24 -0
- package/dist/server/auth/session.d.ts +48 -0
- package/dist/server/auth/session.js +108 -0
- package/dist/server/auth/types.d.ts +118 -0
- package/dist/server/auth/types.js +7 -0
- package/dist/server/browser-agent-mcp.d.ts +67 -0
- package/dist/server/browser-agent-mcp.js +608 -0
- package/dist/server/cli.d.ts +6 -0
- package/dist/server/cli.js +112 -0
- package/dist/server/debug-log.d.ts +25 -0
- package/dist/server/debug-log.js +86 -0
- package/dist/server/handlers.d.ts +141 -0
- package/dist/server/handlers.js +523 -0
- package/dist/server/index.d.ts +30 -0
- package/dist/server/index.js +28 -0
- package/dist/server/kit-api.d.ts +23 -0
- package/dist/server/kit-api.js +153 -0
- package/dist/server/model-sources.d.ts +32 -0
- package/dist/server/model-sources.js +58 -0
- package/dist/server/oa.d.ts +87 -0
- package/dist/server/oa.js +397 -0
- package/dist/server/providers/openrouter.d.ts +51 -0
- package/dist/server/providers/openrouter.js +283 -0
- package/dist/server/render-markdown.d.ts +2 -0
- package/dist/server/render-markdown.js +50 -0
- package/dist/server/sdk.d.ts +259 -0
- package/dist/server/sdk.js +1991 -0
- package/dist/server/session-access.d.ts +5 -0
- package/dist/server/session-access.js +68 -0
- package/dist/server/session-fork.d.ts +10 -0
- package/dist/server/session-fork.js +142 -0
- package/dist/server/session-store.d.ts +56 -0
- package/dist/server/session-store.js +148 -0
- package/dist/server/sessions.d.ts +24 -0
- package/dist/server/sessions.js +541 -0
- package/dist/server/share.d.ts +15 -0
- package/dist/server/share.js +433 -0
- package/dist/server/tool-activity.d.ts +2 -0
- package/dist/server/tool-activity.js +26 -0
- package/dist/server/transcription/xiaomi-mimo.d.ts +8 -0
- package/dist/server/transcription/xiaomi-mimo.js +86 -0
- package/dist/server/upload.d.ts +13 -0
- package/dist/server/upload.js +81 -0
- package/dist/server/user-files.d.ts +28 -0
- package/dist/server/user-files.js +311 -0
- package/dist/server/voice.d.ts +25 -0
- package/dist/server/voice.js +61 -0
- package/dist/server/web-fetch.d.ts +71 -0
- package/dist/server/web-fetch.js +330 -0
- package/dist/styles.css +3354 -0
- package/dist/transcription/xiaomi-mimo.d.ts +8 -0
- package/dist/transcription/xiaomi-mimo.js +86 -0
- package/dist/ui/index.d.ts +352 -0
- package/dist/ui/index.js +7730 -0
- package/dist/upload.d.ts +13 -0
- package/dist/upload.js +81 -0
- package/dist/voice.d.ts +25 -0
- package/dist/voice.js +61 -0
- package/package.json +74 -4
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-kit · CLI(订阅对话演示/冒烟)
|
|
3
|
+
* CodeBuddy 订阅的 login / logout 已移出 SDK,由宿主应用实现
|
|
4
|
+
* (参考 apps/web/scripts/codebuddy-auth.mjs + npm run login / logout)。
|
|
5
|
+
*/
|
|
6
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
7
|
+
import { createInterface } from "node:readline/promises";
|
|
8
|
+
import path from "node:path";
|
|
9
|
+
import { runSdkQuery } from "./sdk.js";
|
|
10
|
+
const DEMO_SESSION = [
|
|
11
|
+
"你好",
|
|
12
|
+
"你是谁",
|
|
13
|
+
"帮我写一个 hello.py",
|
|
14
|
+
"运行一下 hello.py",
|
|
15
|
+
"再见",
|
|
16
|
+
];
|
|
17
|
+
function loadDotEnv() {
|
|
18
|
+
// 级联加载(仅设置尚未存在的变量,进程 env 优先级最高):
|
|
19
|
+
// 1) AGENT_ENV_FILE 显式指定的宿主 env 文件;
|
|
20
|
+
// 2) <cwd>/.env —— 宿主应用根目录(npm 安装场景);
|
|
21
|
+
// 3) 源码仓库约定 apps/web/.env(仅 monorepo 开发,路径存在才命中);
|
|
22
|
+
// 4) kit 本地 .env(gitignore,仅临时联调)。
|
|
23
|
+
const candidates = [
|
|
24
|
+
process.env.AGENT_ENV_FILE?.trim() ? path.resolve(process.env.AGENT_ENV_FILE.trim()) : "",
|
|
25
|
+
path.resolve(process.cwd(), ".env"),
|
|
26
|
+
path.resolve(import.meta.dirname, "../../../../apps/web/.env"),
|
|
27
|
+
path.join(import.meta.dirname, "..", ".env"),
|
|
28
|
+
].filter(Boolean);
|
|
29
|
+
for (const envPath of candidates) {
|
|
30
|
+
if (!existsSync(envPath))
|
|
31
|
+
continue;
|
|
32
|
+
for (const line of readFileSync(envPath, "utf-8").split("\n")) {
|
|
33
|
+
const trimmed = line.trim();
|
|
34
|
+
if (!trimmed || trimmed.startsWith("#"))
|
|
35
|
+
continue;
|
|
36
|
+
const eq = trimmed.indexOf("=");
|
|
37
|
+
if (eq < 0)
|
|
38
|
+
continue;
|
|
39
|
+
const key = trimmed.slice(0, eq).trim();
|
|
40
|
+
const value = trimmed.slice(eq + 1).trim();
|
|
41
|
+
if (!(key in process.env))
|
|
42
|
+
process.env[key] = value;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async function runDemo() {
|
|
47
|
+
console.log("agent-kit 预设会话(CodeBuddy 订阅对话)");
|
|
48
|
+
for (const msg of DEMO_SESSION) {
|
|
49
|
+
console.log(`\nYou> ${msg}`);
|
|
50
|
+
try {
|
|
51
|
+
console.log(`Agent> ${await runSdkQuery(msg)}`);
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
console.error(`对话失败:${err instanceof Error ? err.message : err}`);
|
|
55
|
+
console.error("提示:请先在宿主应用中执行登录命令(如 web 的 npm run login)。");
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async function runInteractive() {
|
|
61
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
62
|
+
console.log("agent-kit 订阅对话已启动(hy3),exit 退出。");
|
|
63
|
+
try {
|
|
64
|
+
while (true) {
|
|
65
|
+
let msg;
|
|
66
|
+
try {
|
|
67
|
+
msg = (await rl.question("\nYou> ")).trim();
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
if (!msg)
|
|
73
|
+
continue;
|
|
74
|
+
if (["exit", "quit", "退出", "再见"].includes(msg.toLowerCase())) {
|
|
75
|
+
console.log("再见!");
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
console.log(`Agent> ${await runSdkQuery(msg)}`);
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
console.error(`对话失败:${err instanceof Error ? err.message : err}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
rl.close();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function printUsage() {
|
|
91
|
+
console.log(`agent-kit CLI — 用法:
|
|
92
|
+
npm run demo 预设订阅对话冒烟
|
|
93
|
+
无参数 交互式订阅对话
|
|
94
|
+
(CodeBuddy 订阅登录/登出见宿主应用:web 的 npm run login / npm run logout)`);
|
|
95
|
+
}
|
|
96
|
+
async function main() {
|
|
97
|
+
loadDotEnv();
|
|
98
|
+
const args = process.argv.slice(2);
|
|
99
|
+
if (args.includes("--demo") || args.includes("demo")) {
|
|
100
|
+
await runDemo();
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (args.includes("-h") || args.includes("--help") || args.includes("help")) {
|
|
104
|
+
printUsage();
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
await runInteractive();
|
|
108
|
+
}
|
|
109
|
+
main().catch((err) => {
|
|
110
|
+
console.error(`出错:${err instanceof Error ? err.message : err}`);
|
|
111
|
+
process.exitCode = 1;
|
|
112
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-kit · 按会话落盘的调试日志(服务端)
|
|
3
|
+
*
|
|
4
|
+
* 用途:对话链路出问题时,拿"最近一个会话"的日志文件即可还原完整时间线:
|
|
5
|
+
* HTTP 请求 → Session 复用/创建 → CLI 消息流(模型/文本/思考/工具/结果)→ SSE 下发 → steer/interrupt。
|
|
6
|
+
*
|
|
7
|
+
* 设计:
|
|
8
|
+
* - 每个 sessionId 一个文件:<logDir>/<sid>.log,每行一条 JSON(时间戳/级别/事件/明细);
|
|
9
|
+
* - 级别:debug < info < warn < error,env AGENT_KIT_LOG_LEVEL 控制(默认 debug,最详细);
|
|
10
|
+
* - 目录:env AGENT_KIT_LOG_DIR 覆盖,默认 <进程 cwd>/logs/sessions(web 下即 apps/web/logs/sessions);
|
|
11
|
+
* - 写入 fire-and-forget,按文件串行(promise 链)防交错;日志失败绝不影响对话主链路;
|
|
12
|
+
* - 流式输出(text/thinking delta、SSE 帧)不逐块记日志,只保留关键锚点:
|
|
13
|
+
* turn.start / turn.send / turn.done / turn.error / cli.system / cli.model /
|
|
14
|
+
* cli.tool_use / cli.tool_result / cli.stream.end / cli.result;
|
|
15
|
+
* - 明细里的长文本统一 clip 截断,保证文件可读且不爆炸。
|
|
16
|
+
*/
|
|
17
|
+
export declare function logDir(): string;
|
|
18
|
+
/**
|
|
19
|
+
* 写一条会话日志。
|
|
20
|
+
* @param sid 会话 ID(无会话的请求传空,落到 _server.log)
|
|
21
|
+
* @param event 事件名,点分层级,如 "turn.start"、"cli.tool_use"、"steer.response"
|
|
22
|
+
* @param detail 明细(值中的长字符串自动截断)
|
|
23
|
+
* @param level 日志级别,默认 debug
|
|
24
|
+
*/
|
|
25
|
+
export declare function slog(sid: string | null | undefined, event: string, detail?: Record<string, unknown>, level?: "debug" | "info" | "warn" | "error"): void;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-kit · 按会话落盘的调试日志(服务端)
|
|
3
|
+
*
|
|
4
|
+
* 用途:对话链路出问题时,拿"最近一个会话"的日志文件即可还原完整时间线:
|
|
5
|
+
* HTTP 请求 → Session 复用/创建 → CLI 消息流(模型/文本/思考/工具/结果)→ SSE 下发 → steer/interrupt。
|
|
6
|
+
*
|
|
7
|
+
* 设计:
|
|
8
|
+
* - 每个 sessionId 一个文件:<logDir>/<sid>.log,每行一条 JSON(时间戳/级别/事件/明细);
|
|
9
|
+
* - 级别:debug < info < warn < error,env AGENT_KIT_LOG_LEVEL 控制(默认 debug,最详细);
|
|
10
|
+
* - 目录:env AGENT_KIT_LOG_DIR 覆盖,默认 <进程 cwd>/logs/sessions(web 下即 apps/web/logs/sessions);
|
|
11
|
+
* - 写入 fire-and-forget,按文件串行(promise 链)防交错;日志失败绝不影响对话主链路;
|
|
12
|
+
* - 流式输出(text/thinking delta、SSE 帧)不逐块记日志,只保留关键锚点:
|
|
13
|
+
* turn.start / turn.send / turn.done / turn.error / cli.system / cli.model /
|
|
14
|
+
* cli.tool_use / cli.tool_result / cli.stream.end / cli.result;
|
|
15
|
+
* - 明细里的长文本统一 clip 截断,保证文件可读且不爆炸。
|
|
16
|
+
*/
|
|
17
|
+
import fs from "node:fs";
|
|
18
|
+
import path from "node:path";
|
|
19
|
+
const LEVELS = { debug: 10, info: 20, warn: 30, error: 40 };
|
|
20
|
+
let levelCache = null;
|
|
21
|
+
function levelThreshold() {
|
|
22
|
+
if (levelCache == null) {
|
|
23
|
+
const raw = String(process.env.AGENT_KIT_LOG_LEVEL || "debug").trim().toLowerCase();
|
|
24
|
+
levelCache = LEVELS[raw] ?? LEVELS.debug;
|
|
25
|
+
}
|
|
26
|
+
return levelCache;
|
|
27
|
+
}
|
|
28
|
+
export function logDir() {
|
|
29
|
+
return process.env.AGENT_KIT_LOG_DIR?.trim()
|
|
30
|
+
? path.resolve(process.env.AGENT_KIT_LOG_DIR.trim())
|
|
31
|
+
: path.resolve(process.cwd(), "logs", "sessions");
|
|
32
|
+
}
|
|
33
|
+
/** 长文本截断:日志可读性优先,超长部分标注省略长度 */
|
|
34
|
+
function clip(v, max = 2000) {
|
|
35
|
+
if (typeof v !== "string")
|
|
36
|
+
return v;
|
|
37
|
+
if (v.length <= max)
|
|
38
|
+
return v;
|
|
39
|
+
return `${v.slice(0, max)}…[+${v.length - max} chars]`;
|
|
40
|
+
}
|
|
41
|
+
// 每个日志文件一条写入队列,串行追加避免并发交错
|
|
42
|
+
const writeQueues = new Map();
|
|
43
|
+
let dirReady = null;
|
|
44
|
+
/** 首次写入前确保日志目录存在(slog 之前因目录缺失而全部静默失败,导致问题无法从日志排查) */
|
|
45
|
+
function ensureDir() {
|
|
46
|
+
if (!dirReady) {
|
|
47
|
+
dirReady = fs.promises
|
|
48
|
+
.mkdir(logDir(), { recursive: true })
|
|
49
|
+
.then(() => undefined)
|
|
50
|
+
.catch(() => undefined);
|
|
51
|
+
}
|
|
52
|
+
return dirReady ?? Promise.resolve();
|
|
53
|
+
}
|
|
54
|
+
function appendLine(file, line) {
|
|
55
|
+
const prev = writeQueues.get(file) ?? ensureDir();
|
|
56
|
+
const next = prev
|
|
57
|
+
.then(() => fs.promises.appendFile(file, line, "utf8"))
|
|
58
|
+
.catch(() => { });
|
|
59
|
+
writeQueues.set(file, next);
|
|
60
|
+
// 队列防无限增长:写完且仍是当前尾项时清掉
|
|
61
|
+
void next.then(() => {
|
|
62
|
+
if (writeQueues.get(file) === next)
|
|
63
|
+
writeQueues.delete(file);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* 写一条会话日志。
|
|
68
|
+
* @param sid 会话 ID(无会话的请求传空,落到 _server.log)
|
|
69
|
+
* @param event 事件名,点分层级,如 "turn.start"、"cli.tool_use"、"steer.response"
|
|
70
|
+
* @param detail 明细(值中的长字符串自动截断)
|
|
71
|
+
* @param level 日志级别,默认 debug
|
|
72
|
+
*/
|
|
73
|
+
export function slog(sid, event, detail = {}, level = "debug") {
|
|
74
|
+
try {
|
|
75
|
+
if (LEVELS[level] < levelThreshold())
|
|
76
|
+
return;
|
|
77
|
+
const safeSid = String(sid || "_server").replace(/[^\w.-]/g, "_").slice(0, 120) || "_server";
|
|
78
|
+
const file = path.join(logDir(), `${safeSid}.log`);
|
|
79
|
+
const record = { t: new Date().toISOString(), lvl: level, ev: event, ...detail };
|
|
80
|
+
// detail 里的长字符串统一截断
|
|
81
|
+
for (const k of Object.keys(record))
|
|
82
|
+
record[k] = clip(record[k]);
|
|
83
|
+
appendLine(file, `${JSON.stringify(record)}\n`);
|
|
84
|
+
}
|
|
85
|
+
catch { /* ignore */ }
|
|
86
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-kit · 服务端端点工厂(Next.js App Router)
|
|
3
|
+
*
|
|
4
|
+
* 第三方 Next.js 工程引入后,即可获得与 web 完全一致的四个端点能力,
|
|
5
|
+
* 无需重新实现上传 / 语音令牌 / ASR 转写等通用逻辑:
|
|
6
|
+
*
|
|
7
|
+
* // app/api/chat/route.js
|
|
8
|
+
* import { createChatHandler } from "agent-kit";
|
|
9
|
+
* export const runtime = "nodejs";
|
|
10
|
+
* export const { POST } = createChatHandler();
|
|
11
|
+
*
|
|
12
|
+
* // app/api/upload/route.js
|
|
13
|
+
* import { createUploadHandler } from "agent-kit";
|
|
14
|
+
* export const { POST } = createUploadHandler();
|
|
15
|
+
*
|
|
16
|
+
* // app/api/voice/token/route.js
|
|
17
|
+
* import { createVoiceTokenHandler } from "agent-kit";
|
|
18
|
+
* export const { POST } = createVoiceTokenHandler({ userResolver: async (req) => currentUser });
|
|
19
|
+
*
|
|
20
|
+
* // app/api/voice/transcribe/route.js
|
|
21
|
+
* import { createVoiceTranscribeHandler } from "agent-kit";
|
|
22
|
+
* export const { POST } = createVoiceTranscribeHandler();
|
|
23
|
+
*
|
|
24
|
+
* 前端 ChatWindow 的默认端点路径(/api/chat、/api/upload、/api/voice/*)与之对应,零改动接入。
|
|
25
|
+
*/
|
|
26
|
+
import { type SdkConfig } from "./sdk.js";
|
|
27
|
+
import { type UploadOptions } from "./upload.js";
|
|
28
|
+
import { type VoiceUser } from "./voice.js";
|
|
29
|
+
export interface VoiceHandlerOptions {
|
|
30
|
+
/** 令牌 TTL(秒),默认 600 */
|
|
31
|
+
ttlSeconds?: number;
|
|
32
|
+
/** 从请求解析当前用户(写入令牌 sub/name);默认固定测试用户 */
|
|
33
|
+
userResolver?: (request: Request) => VoiceUser | null | Promise<VoiceUser | null>;
|
|
34
|
+
}
|
|
35
|
+
export interface AgentKitHandlersOptions {
|
|
36
|
+
/** 透传给 createAgentStream 的 SDK 配置 */
|
|
37
|
+
chat?: SdkConfig;
|
|
38
|
+
/** 附件上传配置 */
|
|
39
|
+
upload?: UploadOptions;
|
|
40
|
+
/** 语音输入配置 */
|
|
41
|
+
voice?: VoiceHandlerOptions;
|
|
42
|
+
}
|
|
43
|
+
/** POST /api/chat:消息数组 → agent-kit 订阅对话流 → SSE 事件流(text/thinking/done/error) */
|
|
44
|
+
export declare function createChatHandler(config?: SdkConfig): {
|
|
45
|
+
POST: (request: Request) => Promise<Response>;
|
|
46
|
+
};
|
|
47
|
+
/** POST /api/chat/answer:前端提交 AskUserQuestion 答案。
|
|
48
|
+
* body: { sessionId, answers: { "0": "选项label", "1": "..." } }
|
|
49
|
+
* 解开挂起在 canUseTool 里的 Promise,让 CLI 把答案作为 tool_result 喂回模型,模型在同一轮继续。 */
|
|
50
|
+
export declare function createChatAnswerHandler(): {
|
|
51
|
+
POST: (request: Request) => Promise<Response>;
|
|
52
|
+
};
|
|
53
|
+
/** POST /api/chat/steer:运行中插入消息(steer)。
|
|
54
|
+
* body: { sessionId, text }
|
|
55
|
+
* 走 Session 常驻会话的 CLI steer 通道(stream-json control_request,CLI >= 2.140.0):
|
|
56
|
+
* 消息进入 SteerInputBuffer,在「下一次模型请求前」注入当前轮,不打断正在执行的工具。
|
|
57
|
+
* 返回 { ok, reason }:ok=true 已插入;ok=false 时 reason 说明(no_session/no_transport/
|
|
58
|
+
* no_session_id/idle/stale/error)。idle 表示当前轮已结束(消息应按正常轮次发送)。 */
|
|
59
|
+
export declare function createChatSteerHandler(): {
|
|
60
|
+
POST: (request: Request) => Promise<Response>;
|
|
61
|
+
};
|
|
62
|
+
export declare function createVoiceTokenHandler(options?: VoiceHandlerOptions): {
|
|
63
|
+
POST: (request: Request) => Promise<Response>;
|
|
64
|
+
};
|
|
65
|
+
/** POST /api/chat/browser-answer:control_browser 人工接管(图形验证码等)答案回传。
|
|
66
|
+
* body: { sessionId: browser 会话 id(browser_ask 事件 data.id), text, chatSessionId }
|
|
67
|
+
* 先校验会话归属(只能给自己的会话回答案),再把文本注入 BrowserAgentService 的等待者。
|
|
68
|
+
* browser 会话 id 为随机短时令牌、不可枚举,且本端点只做「注入文本」单一动作,无数据读取面。 */
|
|
69
|
+
export declare function createBrowserAnswerHandler(): {
|
|
70
|
+
POST: (request: Request) => Promise<Response>;
|
|
71
|
+
};
|
|
72
|
+
/** POST /api/voice/transcribe:校验令牌 → ASR 转写 → { text } */
|
|
73
|
+
export declare function createVoiceTranscribeHandler(options?: VoiceHandlerOptions): {
|
|
74
|
+
POST: (request: Request) => Promise<Response>;
|
|
75
|
+
};
|
|
76
|
+
/** 一键获得全部端点:{ chat, chatAnswer, chatSteer, upload, voiceToken, voiceTranscribe, artifact } */
|
|
77
|
+
export declare function agentKitHandlers(options?: AgentKitHandlersOptions): {
|
|
78
|
+
chat: {
|
|
79
|
+
POST: (request: Request) => Promise<Response>;
|
|
80
|
+
};
|
|
81
|
+
chatAnswer: {
|
|
82
|
+
POST: (request: Request) => Promise<Response>;
|
|
83
|
+
};
|
|
84
|
+
chatSteer: {
|
|
85
|
+
POST: (request: Request) => Promise<Response>;
|
|
86
|
+
};
|
|
87
|
+
browserAnswer: {
|
|
88
|
+
POST: (request: Request) => Promise<Response>;
|
|
89
|
+
};
|
|
90
|
+
upload: {
|
|
91
|
+
POST: (request: Request) => Promise<Response>;
|
|
92
|
+
};
|
|
93
|
+
voiceToken: {
|
|
94
|
+
POST: (request: Request) => Promise<Response>;
|
|
95
|
+
};
|
|
96
|
+
voiceTranscribe: {
|
|
97
|
+
POST: (request: Request) => Promise<Response>;
|
|
98
|
+
};
|
|
99
|
+
artifact: {
|
|
100
|
+
GET: (request: Request) => Promise<Response>;
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* GET /api/artifact?session=<sessionId>:产物端点,三种形态:
|
|
105
|
+
* 1. 不带 file 参数但带 list=1 → 返回该会话全部产物 JSON({ artifacts: [{id,name,type,size}] }),
|
|
106
|
+
* 供「查看所有产物 (N)」按钮与右侧产物列表面板使用(递归含子目录)。
|
|
107
|
+
* 2. ?session=&file=<id> → 按会话隔离返回产物文件内容(预览:iframe / img / 文本)。
|
|
108
|
+
* 3. 在上述基础上带 download=1 → Content-Disposition: attachment,浏览器直接下载。
|
|
109
|
+
* 服务端二次校验文件必须落在 <sessionId> 目录内(readArtifact 防穿越),
|
|
110
|
+
* HTML 以 CSP sandbox 返回,前端再以 sandbox iframe 渲染,杜绝脚本执行与跨域访问。
|
|
111
|
+
*/
|
|
112
|
+
export declare function createArtifactHandler(): {
|
|
113
|
+
GET: (request: Request) => Promise<Response>;
|
|
114
|
+
};
|
|
115
|
+
interface RouteContext {
|
|
116
|
+
params?: {
|
|
117
|
+
agent?: string[];
|
|
118
|
+
} | Promise<{
|
|
119
|
+
agent?: string[];
|
|
120
|
+
}>;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Catch-all 单路由:一个文件承载对话 / 上传 / 语音 / 产物端点。
|
|
124
|
+
* 第三方 Next.js 工程只需建一个文件(其余 /api 路径仍可自由使用,Next 静态路由优先):
|
|
125
|
+
*
|
|
126
|
+
* // app/api/[...agent]/route.js
|
|
127
|
+
* import { createAgentApiRoute } from "agent-kit";
|
|
128
|
+
* export const runtime = "nodejs";
|
|
129
|
+
* export const POST = createAgentApiRoute({ chat: { continueSession: false } });
|
|
130
|
+
*
|
|
131
|
+
* 内部按路径段分发:/api/chat、/api/upload、/api/voice/token、/api/voice/transcribe;
|
|
132
|
+
* 未知路径返回 404。
|
|
133
|
+
*
|
|
134
|
+
* 注意:若要把会话 / 分享 / 认证等全部端点也一起挂载(应用端零新增路由文件),
|
|
135
|
+
* 改用 createAgentKitApi(同包导出),它是本函数 + 其余端点工厂的统一封装。
|
|
136
|
+
*/
|
|
137
|
+
export declare function createAgentApiRoute(options?: AgentKitHandlersOptions): {
|
|
138
|
+
POST: (request: Request, context?: RouteContext) => Promise<Response>;
|
|
139
|
+
GET: (request: Request, context?: RouteContext) => Promise<Response>;
|
|
140
|
+
};
|
|
141
|
+
export {};
|