@wwlocal/aibot-plugin-node 20260409.20.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 +489 -0
- package/config.example.json +169 -0
- package/dist/cjs/index.js +76 -0
- package/dist/cjs/src/adapters/anthropic-adapter.js +534 -0
- package/dist/cjs/src/adapters/base-adapter.js +176 -0
- package/dist/cjs/src/adapters/deepseek-adapter.js +328 -0
- package/dist/cjs/src/adapters/dify-adapter.js +636 -0
- package/dist/cjs/src/adapters/index.js +131 -0
- package/dist/cjs/src/adapters/openai-adapter.js +361 -0
- package/dist/cjs/src/adapters/webhook-adapter.js +260 -0
- package/dist/cjs/src/agent-forwarder.js +87 -0
- package/dist/cjs/src/ca-cert.js +162 -0
- package/dist/cjs/src/config.js +169 -0
- package/dist/cjs/src/const.js +124 -0
- package/dist/cjs/src/conversation-manager.js +147 -0
- package/dist/cjs/src/dm-policy.js +46 -0
- package/dist/cjs/src/group-policy.js +95 -0
- package/dist/cjs/src/media-handler.js +136 -0
- package/dist/cjs/src/media-loader.js +271 -0
- package/dist/cjs/src/media-storage.js +165 -0
- package/dist/cjs/src/media-uploader.js +203 -0
- package/dist/cjs/src/message-parser.js +133 -0
- package/dist/cjs/src/message-sender.js +87 -0
- package/dist/cjs/src/monitor.js +849 -0
- package/dist/cjs/src/reqid-store.js +87 -0
- package/dist/cjs/src/server.js +72 -0
- package/dist/cjs/src/service-manager.js +135 -0
- package/dist/cjs/src/state-manager.js +143 -0
- package/dist/cjs/src/template-card-parser.js +498 -0
- package/dist/cjs/src/timeout.js +41 -0
- package/dist/cjs/src/version.js +25 -0
- package/dist/esm/index.js +74 -0
- package/dist/esm/src/adapters/anthropic-adapter.js +512 -0
- package/dist/esm/src/adapters/base-adapter.js +174 -0
- package/dist/esm/src/adapters/deepseek-adapter.js +326 -0
- package/dist/esm/src/adapters/dify-adapter.js +634 -0
- package/dist/esm/src/adapters/index.js +123 -0
- package/dist/esm/src/adapters/openai-adapter.js +339 -0
- package/dist/esm/src/adapters/webhook-adapter.js +258 -0
- package/dist/esm/src/agent-forwarder.js +84 -0
- package/dist/esm/src/ca-cert.js +136 -0
- package/dist/esm/src/config.js +145 -0
- package/dist/esm/src/const.js +100 -0
- package/dist/esm/src/conversation-manager.js +144 -0
- package/dist/esm/src/dm-policy.js +44 -0
- package/dist/esm/src/group-policy.js +92 -0
- package/dist/esm/src/media-handler.js +133 -0
- package/dist/esm/src/media-loader.js +246 -0
- package/dist/esm/src/media-storage.js +143 -0
- package/dist/esm/src/media-uploader.js +198 -0
- package/dist/esm/src/message-parser.js +131 -0
- package/dist/esm/src/message-sender.js +83 -0
- package/dist/esm/src/monitor.js +841 -0
- package/dist/esm/src/reqid-store.js +85 -0
- package/dist/esm/src/server.js +69 -0
- package/dist/esm/src/service-manager.js +133 -0
- package/dist/esm/src/state-manager.js +134 -0
- package/dist/esm/src/template-card-parser.js +495 -0
- package/dist/esm/src/timeout.js +38 -0
- package/dist/esm/src/version.js +22 -0
- package/dist/esm/types/index.d.ts +14 -0
- package/dist/esm/types/src/adapters/anthropic-adapter.d.ts +93 -0
- package/dist/esm/types/src/adapters/base-adapter.d.ts +76 -0
- package/dist/esm/types/src/adapters/deepseek-adapter.d.ts +87 -0
- package/dist/esm/types/src/adapters/dify-adapter.d.ts +100 -0
- package/dist/esm/types/src/adapters/index.d.ts +60 -0
- package/dist/esm/types/src/adapters/openai-adapter.d.ts +82 -0
- package/dist/esm/types/src/adapters/types.d.ts +373 -0
- package/dist/esm/types/src/adapters/webhook-adapter.d.ts +54 -0
- package/dist/esm/types/src/agent-forwarder.d.ts +32 -0
- package/dist/esm/types/src/ca-cert.d.ts +53 -0
- package/dist/esm/types/src/config.d.ts +29 -0
- package/dist/esm/types/src/const.d.ts +74 -0
- package/dist/esm/types/src/conversation-manager.d.ts +81 -0
- package/dist/esm/types/src/dm-policy.d.ts +27 -0
- package/dist/esm/types/src/group-policy.d.ts +28 -0
- package/dist/esm/types/src/interface.d.ts +332 -0
- package/dist/esm/types/src/media-handler.d.ts +36 -0
- package/dist/esm/types/src/media-loader.d.ts +47 -0
- package/dist/esm/types/src/media-storage.d.ts +35 -0
- package/dist/esm/types/src/media-uploader.d.ts +65 -0
- package/dist/esm/types/src/message-parser.d.ts +89 -0
- package/dist/esm/types/src/message-sender.d.ts +34 -0
- package/dist/esm/types/src/monitor.d.ts +30 -0
- package/dist/esm/types/src/reqid-store.d.ts +23 -0
- package/dist/esm/types/src/server.d.ts +23 -0
- package/dist/esm/types/src/service-manager.d.ts +52 -0
- package/dist/esm/types/src/state-manager.d.ts +76 -0
- package/dist/esm/types/src/template-card-parser.d.ts +18 -0
- package/dist/esm/types/src/timeout.d.ts +20 -0
- package/dist/esm/types/src/version.d.ts +2 -0
- package/dist/index.d.ts +2 -0
- package/package.json +51 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 适配器基础抽象类
|
|
3
|
+
*
|
|
4
|
+
* 提供所有适配器共用的能力:
|
|
5
|
+
* - 超时控制
|
|
6
|
+
* - 请求头构建
|
|
7
|
+
* - SSE 流式解析工具方法
|
|
8
|
+
* - 日志工具
|
|
9
|
+
*/
|
|
10
|
+
import type { AgentEndpoint, RuntimeLogger } from "../interface.js";
|
|
11
|
+
import type { AgentAdapter, AdapterRequest, AdapterCallbacks } from "./types.js";
|
|
12
|
+
/**
|
|
13
|
+
* 适配器基础抽象类
|
|
14
|
+
*/
|
|
15
|
+
export declare abstract class BaseAdapter implements AgentAdapter {
|
|
16
|
+
abstract readonly name: string;
|
|
17
|
+
abstract readonly displayName: string;
|
|
18
|
+
/**
|
|
19
|
+
* 执行转发(子类必须实现)
|
|
20
|
+
*/
|
|
21
|
+
abstract forward(request: AdapterRequest, endpoint: AgentEndpoint, callbacks: AdapterCallbacks): Promise<string>;
|
|
22
|
+
/**
|
|
23
|
+
* 构建通用请求头
|
|
24
|
+
*/
|
|
25
|
+
protected buildHeaders(endpoint: AgentEndpoint): Record<string, string>;
|
|
26
|
+
/**
|
|
27
|
+
* 创建带超时的 AbortController
|
|
28
|
+
*
|
|
29
|
+
* @param timeoutMs 超时时间(毫秒)
|
|
30
|
+
* @param externalSignal 外部中止信号(可选)
|
|
31
|
+
* @returns { controller, timeoutId }
|
|
32
|
+
*/
|
|
33
|
+
protected createTimeoutController(timeoutMs: number, externalSignal?: AbortSignal): {
|
|
34
|
+
controller: AbortController;
|
|
35
|
+
timeoutId: NodeJS.Timeout;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* 包装 Promise 添加超时控制
|
|
39
|
+
*/
|
|
40
|
+
protected withTimeout<T>(promise: Promise<T>, timeoutMs: number, timeoutMessage?: string): Promise<T>;
|
|
41
|
+
/**
|
|
42
|
+
* 解析单行 SSE 数据
|
|
43
|
+
*
|
|
44
|
+
* @param line 原始 SSE 行
|
|
45
|
+
* @returns { event, data } 或 null(非 data 行或空行)
|
|
46
|
+
*/
|
|
47
|
+
protected parseSSELine(line: string): {
|
|
48
|
+
event?: string;
|
|
49
|
+
data?: string;
|
|
50
|
+
} | null;
|
|
51
|
+
/**
|
|
52
|
+
* 创建 SSE 流读取器
|
|
53
|
+
*
|
|
54
|
+
* 返回一个异步生成器,逐行产出 SSE 数据
|
|
55
|
+
*/
|
|
56
|
+
protected readSSEStream(reader: ReadableStreamDefaultReader<Uint8Array>, runtime?: RuntimeLogger): AsyncGenerator<{
|
|
57
|
+
event?: string;
|
|
58
|
+
data: string;
|
|
59
|
+
}, void, unknown>;
|
|
60
|
+
/**
|
|
61
|
+
* 发起 HTTP 请求并处理错误
|
|
62
|
+
*/
|
|
63
|
+
protected fetchWithErrorHandling(url: string, options: RequestInit, runtime?: RuntimeLogger): Promise<Response>;
|
|
64
|
+
/**
|
|
65
|
+
* 日志前缀
|
|
66
|
+
*/
|
|
67
|
+
protected get logPrefix(): string;
|
|
68
|
+
/**
|
|
69
|
+
* 打印日志
|
|
70
|
+
*/
|
|
71
|
+
protected log(runtime: RuntimeLogger | undefined, message: string): void;
|
|
72
|
+
/**
|
|
73
|
+
* 打印错误日志
|
|
74
|
+
*/
|
|
75
|
+
protected logError(runtime: RuntimeLogger | undefined, message: string): void;
|
|
76
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DeepSeek 适配器
|
|
3
|
+
*
|
|
4
|
+
* 适用于:DeepSeek Chat (deepseek-chat) 和 DeepSeek Reasoner (deepseek-reasoner) 模型
|
|
5
|
+
*
|
|
6
|
+
* 与 OpenAI 适配器的差异:
|
|
7
|
+
* - 响应中额外包含 reasoning_content 字段(思维链)
|
|
8
|
+
* - 支持 reasoningDisplay 配置:show/hide/collapse(默认)
|
|
9
|
+
* - Reasoner 模型自动添加 thinking 参数
|
|
10
|
+
*
|
|
11
|
+
* 推理内容折叠展示格式(collapse 模式):
|
|
12
|
+
* <think>
|
|
13
|
+
* {reasoning_content}
|
|
14
|
+
* </think>
|
|
15
|
+
*
|
|
16
|
+
* {content}
|
|
17
|
+
*/
|
|
18
|
+
import type { AgentEndpoint } from "../interface.js";
|
|
19
|
+
import { OpenAIAdapter } from "./openai-adapter.js";
|
|
20
|
+
import type { ChatMessage, ChatCompletionsRequest, StreamDelta, ChatCompletionsResponse } from "./types.js";
|
|
21
|
+
/**
|
|
22
|
+
* DeepSeek 适配器
|
|
23
|
+
*/
|
|
24
|
+
export declare class DeepSeekAdapter extends OpenAIAdapter {
|
|
25
|
+
readonly name: string;
|
|
26
|
+
readonly displayName: string;
|
|
27
|
+
private accumulatedReasoning;
|
|
28
|
+
/**
|
|
29
|
+
* 获取推理内容展示模式
|
|
30
|
+
*/
|
|
31
|
+
private getReasoningDisplayMode;
|
|
32
|
+
/**
|
|
33
|
+
* 是否为 Reasoner 模型
|
|
34
|
+
*/
|
|
35
|
+
private isReasonerModel;
|
|
36
|
+
/**
|
|
37
|
+
* 构建请求体(覆写以添加 thinking 参数)
|
|
38
|
+
*/
|
|
39
|
+
protected buildRequestBody(messages: ChatMessage[], endpoint: AgentEndpoint): ChatCompletionsRequest;
|
|
40
|
+
/**
|
|
41
|
+
* 解析流式 delta 内容(覆写以处理 reasoning_content)
|
|
42
|
+
*/
|
|
43
|
+
protected parseStreamDelta(parsed: StreamDelta): {
|
|
44
|
+
content?: string;
|
|
45
|
+
reasoningContent?: string;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* 累积内容(覆写以处理推理内容)
|
|
49
|
+
*
|
|
50
|
+
* 注意:此方法需要知道 endpoint 配置,但父类签名不包含
|
|
51
|
+
* 因此使用实例变量 accumulatedReasoning 来跨调用保持状态
|
|
52
|
+
*/
|
|
53
|
+
protected accumulateContent(accumulated: string, content?: string, reasoningContent?: string): string;
|
|
54
|
+
/**
|
|
55
|
+
* 格式化最终输出(根据 displayMode 配置)
|
|
56
|
+
*/
|
|
57
|
+
private formatOutput;
|
|
58
|
+
/**
|
|
59
|
+
* 处理流式响应(覆写以支持推理内容格式化)
|
|
60
|
+
*/
|
|
61
|
+
protected handleStreamResponse(params: {
|
|
62
|
+
response: Response;
|
|
63
|
+
deliver: any;
|
|
64
|
+
onReplyStart?: any;
|
|
65
|
+
onError?: any;
|
|
66
|
+
runtime?: any;
|
|
67
|
+
endpoint?: AgentEndpoint;
|
|
68
|
+
}): Promise<string>;
|
|
69
|
+
/**
|
|
70
|
+
* 解析非流式响应内容(覆写以处理 reasoning_content)
|
|
71
|
+
*/
|
|
72
|
+
protected parseNonStreamResponse(data: ChatCompletionsResponse): string;
|
|
73
|
+
/**
|
|
74
|
+
* 转发请求(覆写以传递 endpoint 到流式处理)
|
|
75
|
+
*/
|
|
76
|
+
forward(request: any, endpoint: AgentEndpoint, callbacks: any): Promise<string>;
|
|
77
|
+
/**
|
|
78
|
+
* 处理 DeepSeek 流式响应
|
|
79
|
+
*
|
|
80
|
+
* 注意:节流逻辑已移至 monitor 层统一控制,适配器层每个有效 delta 都直接 deliver
|
|
81
|
+
*/
|
|
82
|
+
private handleDeepSeekStreamResponse;
|
|
83
|
+
/**
|
|
84
|
+
* 处理 DeepSeek 非流式响应
|
|
85
|
+
*/
|
|
86
|
+
private handleDeepSeekNonStreamResponse;
|
|
87
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dify 适配器
|
|
3
|
+
*
|
|
4
|
+
* 适用于:Dify 平台的 Chat 应用(ChatBot / Chatflow)
|
|
5
|
+
*
|
|
6
|
+
* 与 OpenAI 的核心差异:
|
|
7
|
+
* - 接口路径:/v1/chat-messages(而非 /v1/chat/completions)
|
|
8
|
+
* - 请求格式:{ query, user, conversation_id, response_mode, inputs, files }
|
|
9
|
+
* - 流式标识:response_mode: "streaming"
|
|
10
|
+
* - SSE 事件类型:
|
|
11
|
+
* - ChatBot 模式:message(answer 字段)
|
|
12
|
+
* - Chatflow 模式:text_chunk(text 字段)+ workflow/node/iteration/loop 事件
|
|
13
|
+
* - 会话管理:conversation_id(有状态多轮对话)
|
|
14
|
+
* - 文件上传:/v1/files/upload(multipart form-data)
|
|
15
|
+
*/
|
|
16
|
+
import type { AgentEndpoint } from "../interface.js";
|
|
17
|
+
import { BaseAdapter } from "./base-adapter.js";
|
|
18
|
+
import type { AdapterRequest, AdapterCallbacks } from "./types.js";
|
|
19
|
+
/**
|
|
20
|
+
* Dify 适配器
|
|
21
|
+
*/
|
|
22
|
+
export declare class DifyAdapter extends BaseAdapter {
|
|
23
|
+
readonly name = "dify";
|
|
24
|
+
readonly displayName = "Dify";
|
|
25
|
+
private static conversationCache;
|
|
26
|
+
/**
|
|
27
|
+
* 获取 Dify 配置选项
|
|
28
|
+
*/
|
|
29
|
+
private getOptions;
|
|
30
|
+
/**
|
|
31
|
+
* 转发请求到 Dify API
|
|
32
|
+
*/
|
|
33
|
+
forward(request: AdapterRequest, endpoint: AgentEndpoint, callbacks: AdapterCallbacks): Promise<string>;
|
|
34
|
+
/**
|
|
35
|
+
* 构建 Dify 请求体
|
|
36
|
+
*/
|
|
37
|
+
private buildDifyRequest;
|
|
38
|
+
/**
|
|
39
|
+
* 处理流式响应
|
|
40
|
+
*/
|
|
41
|
+
private handleStreamResponse;
|
|
42
|
+
/**
|
|
43
|
+
* 处理非流式(blocking)响应
|
|
44
|
+
*/
|
|
45
|
+
private handleBlockingResponse;
|
|
46
|
+
/**
|
|
47
|
+
* 准备 Dify 文件参数
|
|
48
|
+
*
|
|
49
|
+
* 根据 Dify 文档,文件有两种传输方式:
|
|
50
|
+
* - remote_url:直接传 URL,Dify 自行下载(适用于远程 URL)
|
|
51
|
+
* - local_file:先通过 /v1/files/upload 上传,再传 upload_file_id(适用于本地文件)
|
|
52
|
+
*
|
|
53
|
+
* @returns DifyFile 列表(处理失败的跳过并记录日志)
|
|
54
|
+
*/
|
|
55
|
+
private prepareDifyFiles;
|
|
56
|
+
/**
|
|
57
|
+
* 上传本地文件到 Dify(/v1/files/upload)
|
|
58
|
+
*
|
|
59
|
+
* @returns 上传成功的 DifyFile,失败返回 undefined
|
|
60
|
+
*/
|
|
61
|
+
private uploadLocalFile;
|
|
62
|
+
/**
|
|
63
|
+
* 从 URL 中提取文件名
|
|
64
|
+
*/
|
|
65
|
+
private extractFilename;
|
|
66
|
+
/**
|
|
67
|
+
* 根据文件名猜测 Content-Type
|
|
68
|
+
*/
|
|
69
|
+
private guessContentType;
|
|
70
|
+
/**
|
|
71
|
+
* 从 URL 中猜测 Content-Type
|
|
72
|
+
*/
|
|
73
|
+
private guessContentTypeFromUrl;
|
|
74
|
+
/**
|
|
75
|
+
* 根据 Content-Type 推断 Dify 文件类型
|
|
76
|
+
*/
|
|
77
|
+
private inferDifyFileType;
|
|
78
|
+
/**
|
|
79
|
+
* 拼接 Dify API URL
|
|
80
|
+
*
|
|
81
|
+
* 支持多种 baseUrl 格式:
|
|
82
|
+
* - http://host/v1 → http://host/v1/chat-messages
|
|
83
|
+
* - http://host/v1/ → http://host/v1/chat-messages
|
|
84
|
+
* - http://host → http://host/v1/chat-messages
|
|
85
|
+
* - http://host/v1/chat-messages → http://host/v1/chat-messages (不变)
|
|
86
|
+
*/
|
|
87
|
+
private buildChatMessagesUrl;
|
|
88
|
+
/**
|
|
89
|
+
* 拼接 Dify API 通用路径
|
|
90
|
+
*/
|
|
91
|
+
private buildApiUrl;
|
|
92
|
+
/**
|
|
93
|
+
* 解析文件 URL(处理相对路径)
|
|
94
|
+
*
|
|
95
|
+
* Dify 返回的 message_file.url 可能是:
|
|
96
|
+
* - 完整的 HTTP URL → 直接使用
|
|
97
|
+
* - 相对路径(如 /files/xxx/preview) → 拼接 baseUrl
|
|
98
|
+
*/
|
|
99
|
+
private resolveFileUrl;
|
|
100
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 适配器注册表
|
|
3
|
+
*
|
|
4
|
+
* 管理所有智能体适配器的注册与发现
|
|
5
|
+
*/
|
|
6
|
+
import type { AgentEndpoint } from "../interface.js";
|
|
7
|
+
import type { AgentAdapter, IAdapterRegistry } from "./types.js";
|
|
8
|
+
/**
|
|
9
|
+
* 适配器注册表实现
|
|
10
|
+
*/
|
|
11
|
+
declare class AdapterRegistry implements IAdapterRegistry {
|
|
12
|
+
private adapters;
|
|
13
|
+
/**
|
|
14
|
+
* 注册适配器
|
|
15
|
+
*/
|
|
16
|
+
register(adapter: AgentAdapter): void;
|
|
17
|
+
/**
|
|
18
|
+
* 按 provider 名称获取适配器
|
|
19
|
+
*/
|
|
20
|
+
get(provider: string): AgentAdapter | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* 列出所有已注册适配器
|
|
23
|
+
*/
|
|
24
|
+
list(): AgentAdapter[];
|
|
25
|
+
/**
|
|
26
|
+
* 解析并返回适配器
|
|
27
|
+
*
|
|
28
|
+
* 解析优先级:
|
|
29
|
+
* 1. 优先使用 endpoint.provider 指定的适配器
|
|
30
|
+
* 2. 若 provider 未配置,尝试从 url 自动推断
|
|
31
|
+
* 3. 兜底使用 openai 适配器
|
|
32
|
+
*/
|
|
33
|
+
resolve(endpoint: AgentEndpoint): AgentAdapter;
|
|
34
|
+
/**
|
|
35
|
+
* 从 URL 推断 provider 类型
|
|
36
|
+
*/
|
|
37
|
+
private inferProviderFromUrl;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 全局适配器注册表
|
|
41
|
+
*/
|
|
42
|
+
export declare const adapterRegistry: AdapterRegistry;
|
|
43
|
+
export type { AgentAdapter, AdapterRequest, AdapterCallbacks, AdapterContext, IAdapterRegistry, ChatMessage, ChatContentPart, ChatCompletionsRequest, StreamDelta, ChatCompletionsResponse, ReasoningDisplayMode, DeepSeekProviderOptions, AnthropicProviderOptions, AnthropicMessage, AnthropicContentBlock, AnthropicMessagesRequest, AnthropicMessagesResponse, AnthropicSSEEventType, AnthropicSSEEvent, DifyAppType, DifyProviderOptions, DifyChatRequest, DifyFile, DifyEventType, DifySSEEvent, WebhookProviderOptions, } from "./types.js";
|
|
44
|
+
export { BaseAdapter } from "./base-adapter.js";
|
|
45
|
+
export { OpenAIAdapter } from "./openai-adapter.js";
|
|
46
|
+
export { DeepSeekAdapter } from "./deepseek-adapter.js";
|
|
47
|
+
export { AnthropicAdapter } from "./anthropic-adapter.js";
|
|
48
|
+
export { DifyAdapter } from "./dify-adapter.js";
|
|
49
|
+
export { WebhookAdapter } from "./webhook-adapter.js";
|
|
50
|
+
/**
|
|
51
|
+
* 获取已注册适配器列表(用于启动日志)
|
|
52
|
+
*/
|
|
53
|
+
export declare function getRegisteredAdapters(): Array<{
|
|
54
|
+
name: string;
|
|
55
|
+
displayName: string;
|
|
56
|
+
}>;
|
|
57
|
+
/**
|
|
58
|
+
* 根据端点配置解析适配器
|
|
59
|
+
*/
|
|
60
|
+
export declare function resolveAdapter(endpoint: AgentEndpoint): AgentAdapter;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI 适配器
|
|
3
|
+
*
|
|
4
|
+
* 适用于:OpenAI、Azure OpenAI、Ollama、vLLM、LocalAI 及任何 OpenAI Chat Completions API 兼容服务
|
|
5
|
+
*
|
|
6
|
+
* 特性:
|
|
7
|
+
* - 请求:{ messages, model, stream }
|
|
8
|
+
* - 流式响应:SSE data: {...} → 提取 choices[0].delta.content
|
|
9
|
+
* - 非流式响应:JSON → 提取 choices[0].message.content
|
|
10
|
+
* - 认证:Authorization: Bearer {apiKey}
|
|
11
|
+
*/
|
|
12
|
+
import type { AgentEndpoint } from "../interface.js";
|
|
13
|
+
import { BaseAdapter } from "./base-adapter.js";
|
|
14
|
+
import type { AdapterRequest, AdapterCallbacks, ChatMessage, ChatCompletionsRequest, StreamDelta, ChatCompletionsResponse } from "./types.js";
|
|
15
|
+
/**
|
|
16
|
+
* OpenAI 适配器
|
|
17
|
+
*/
|
|
18
|
+
export declare class OpenAIAdapter extends BaseAdapter {
|
|
19
|
+
readonly name: string;
|
|
20
|
+
readonly displayName: string;
|
|
21
|
+
/**
|
|
22
|
+
* 转发请求到 OpenAI 兼容 API
|
|
23
|
+
*/
|
|
24
|
+
forward(request: AdapterRequest, endpoint: AgentEndpoint, callbacks: AdapterCallbacks): Promise<string>;
|
|
25
|
+
/**
|
|
26
|
+
* 将企微消息构建为 OpenAI messages 数组
|
|
27
|
+
*/
|
|
28
|
+
protected buildMessages(options: {
|
|
29
|
+
text: string;
|
|
30
|
+
mediaPaths?: Array<{
|
|
31
|
+
path: string;
|
|
32
|
+
contentType?: string;
|
|
33
|
+
}>;
|
|
34
|
+
quoteContent?: string;
|
|
35
|
+
systemPrompt?: string;
|
|
36
|
+
historyMessages?: Array<{
|
|
37
|
+
role: "user" | "assistant";
|
|
38
|
+
content: string;
|
|
39
|
+
}>;
|
|
40
|
+
}): ChatMessage[];
|
|
41
|
+
/**
|
|
42
|
+
* 构建请求体
|
|
43
|
+
*/
|
|
44
|
+
protected buildRequestBody(messages: ChatMessage[], endpoint: AgentEndpoint): ChatCompletionsRequest;
|
|
45
|
+
/**
|
|
46
|
+
* 处理流式响应
|
|
47
|
+
*
|
|
48
|
+
* 注意:节流逻辑已移至 monitor 层统一控制,适配器层每个有效 delta 都直接 deliver
|
|
49
|
+
*/
|
|
50
|
+
protected handleStreamResponse(params: {
|
|
51
|
+
response: Response;
|
|
52
|
+
deliver: AdapterCallbacks["deliver"];
|
|
53
|
+
onReplyStart?: AdapterCallbacks["onReplyStart"];
|
|
54
|
+
onError?: AdapterCallbacks["onError"];
|
|
55
|
+
runtime?: AdapterRequest["runtime"];
|
|
56
|
+
}): Promise<string>;
|
|
57
|
+
/**
|
|
58
|
+
* 解析流式 delta 内容(子类可覆写)
|
|
59
|
+
*/
|
|
60
|
+
protected parseStreamDelta(parsed: StreamDelta): {
|
|
61
|
+
content?: string;
|
|
62
|
+
reasoningContent?: string;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* 累积内容(子类可覆写以自定义格式)
|
|
66
|
+
*/
|
|
67
|
+
protected accumulateContent(accumulated: string, content?: string, _reasoningContent?: string): string;
|
|
68
|
+
/**
|
|
69
|
+
* 处理非流式响应
|
|
70
|
+
*/
|
|
71
|
+
protected handleNonStreamResponse(params: {
|
|
72
|
+
response: Response;
|
|
73
|
+
deliver: AdapterCallbacks["deliver"];
|
|
74
|
+
onReplyStart?: AdapterCallbacks["onReplyStart"];
|
|
75
|
+
onError?: AdapterCallbacks["onError"];
|
|
76
|
+
runtime?: AdapterRequest["runtime"];
|
|
77
|
+
}): Promise<string>;
|
|
78
|
+
/**
|
|
79
|
+
* 解析非流式响应内容(子类可覆写)
|
|
80
|
+
*/
|
|
81
|
+
protected parseNonStreamResponse(data: ChatCompletionsResponse): string;
|
|
82
|
+
}
|