ai-protocol-adapters 1.0.0-alpha.2 → 1.0.0-alpha.4
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 +7 -7
- package/dist/index.d.mts +138 -26
- package/dist/index.d.ts +138 -26
- package/dist/index.js +470 -7
- package/dist/index.mjs +470 -7
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ai-protocol-adapters
|
|
2
2
|
|
|
3
|
-
[](https://badge.fury.io/js/ai-protocol-adapters)
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
|
5
5
|
[](https://www.typescriptlang.org/)
|
|
6
6
|
|
|
@@ -19,15 +19,15 @@
|
|
|
19
19
|
## 📦 安装
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
|
-
npm install
|
|
22
|
+
npm install ai-protocol-adapters
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
```bash
|
|
26
|
-
yarn add
|
|
26
|
+
yarn add ai-protocol-adapters
|
|
27
27
|
```
|
|
28
28
|
|
|
29
29
|
```bash
|
|
30
|
-
pnpm add
|
|
30
|
+
pnpm add ai-protocol-adapters
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
## 🚀 快速开始
|
|
@@ -35,7 +35,7 @@ pnpm add @ai-protocol/adapters
|
|
|
35
35
|
### 基础使用
|
|
36
36
|
|
|
37
37
|
```typescript
|
|
38
|
-
import { StreamingProtocolAdapter } from '
|
|
38
|
+
import { StreamingProtocolAdapter } from 'ai-protocol-adapters'
|
|
39
39
|
|
|
40
40
|
// 创建适配器实例
|
|
41
41
|
const adapter = new StreamingProtocolAdapter({
|
|
@@ -103,7 +103,7 @@ const { openaiRequest } = adapter.convertAnthropicToOpenAI(glmRequest)
|
|
|
103
103
|
### 自定义日志器
|
|
104
104
|
|
|
105
105
|
```typescript
|
|
106
|
-
import { setGlobalLogger, StreamingProtocolAdapter } from '
|
|
106
|
+
import { setGlobalLogger, StreamingProtocolAdapter } from 'ai-protocol-adapters'
|
|
107
107
|
|
|
108
108
|
// 使用自定义日志器
|
|
109
109
|
setGlobalLogger({
|
package/dist/index.d.mts
CHANGED
|
@@ -2646,9 +2646,9 @@ declare const AnthropicImageSourceSchema: z.ZodObject<{
|
|
|
2646
2646
|
declare const AnthropicContentBlockBaseSchema: z.ZodObject<{
|
|
2647
2647
|
type: z.ZodEnum<["text", "image", "tool_use", "tool_result"]>;
|
|
2648
2648
|
}, "strip", z.ZodTypeAny, {
|
|
2649
|
-
type?: "text" | "
|
|
2649
|
+
type?: "text" | "tool_use" | "image" | "tool_result";
|
|
2650
2650
|
}, {
|
|
2651
|
-
type?: "text" | "
|
|
2651
|
+
type?: "text" | "tool_use" | "image" | "tool_result";
|
|
2652
2652
|
}>;
|
|
2653
2653
|
declare const AnthropicTextContentBlockSchema: z.ZodObject<{} & {
|
|
2654
2654
|
type: z.ZodLiteral<"text">;
|
|
@@ -3784,7 +3784,7 @@ declare const AnthropicResponseSchema: z.ZodObject<{
|
|
|
3784
3784
|
cache_read_input_tokens?: number;
|
|
3785
3785
|
};
|
|
3786
3786
|
stop_sequence?: string;
|
|
3787
|
-
stop_reason?: "end_turn" | "
|
|
3787
|
+
stop_reason?: "end_turn" | "tool_use" | "max_tokens" | "stop_sequence";
|
|
3788
3788
|
}, {
|
|
3789
3789
|
role?: "assistant";
|
|
3790
3790
|
content?: ({
|
|
@@ -3828,7 +3828,7 @@ declare const AnthropicResponseSchema: z.ZodObject<{
|
|
|
3828
3828
|
cache_read_input_tokens?: number;
|
|
3829
3829
|
};
|
|
3830
3830
|
stop_sequence?: string;
|
|
3831
|
-
stop_reason?: "end_turn" | "
|
|
3831
|
+
stop_reason?: "end_turn" | "tool_use" | "max_tokens" | "stop_sequence";
|
|
3832
3832
|
}>;
|
|
3833
3833
|
declare const AnthropicStreamEventBaseSchema: z.ZodObject<{
|
|
3834
3834
|
type: z.ZodString;
|
|
@@ -4160,7 +4160,7 @@ declare const AnthropicMessageStartEventSchema: z.ZodObject<{} & {
|
|
|
4160
4160
|
cache_read_input_tokens?: number;
|
|
4161
4161
|
};
|
|
4162
4162
|
stop_sequence?: string;
|
|
4163
|
-
stop_reason?: "end_turn" | "
|
|
4163
|
+
stop_reason?: "end_turn" | "tool_use" | "max_tokens" | "stop_sequence";
|
|
4164
4164
|
}, {
|
|
4165
4165
|
role?: "assistant";
|
|
4166
4166
|
content?: ({
|
|
@@ -4204,7 +4204,7 @@ declare const AnthropicMessageStartEventSchema: z.ZodObject<{} & {
|
|
|
4204
4204
|
cache_read_input_tokens?: number;
|
|
4205
4205
|
};
|
|
4206
4206
|
stop_sequence?: string;
|
|
4207
|
-
stop_reason?: "end_turn" | "
|
|
4207
|
+
stop_reason?: "end_turn" | "tool_use" | "max_tokens" | "stop_sequence";
|
|
4208
4208
|
}>;
|
|
4209
4209
|
}, "strip", z.ZodTypeAny, {
|
|
4210
4210
|
message?: {
|
|
@@ -4250,7 +4250,7 @@ declare const AnthropicMessageStartEventSchema: z.ZodObject<{} & {
|
|
|
4250
4250
|
cache_read_input_tokens?: number;
|
|
4251
4251
|
};
|
|
4252
4252
|
stop_sequence?: string;
|
|
4253
|
-
stop_reason?: "end_turn" | "
|
|
4253
|
+
stop_reason?: "end_turn" | "tool_use" | "max_tokens" | "stop_sequence";
|
|
4254
4254
|
};
|
|
4255
4255
|
type?: "message_start";
|
|
4256
4256
|
}, {
|
|
@@ -4297,7 +4297,7 @@ declare const AnthropicMessageStartEventSchema: z.ZodObject<{} & {
|
|
|
4297
4297
|
cache_read_input_tokens?: number;
|
|
4298
4298
|
};
|
|
4299
4299
|
stop_sequence?: string;
|
|
4300
|
-
stop_reason?: "end_turn" | "
|
|
4300
|
+
stop_reason?: "end_turn" | "tool_use" | "max_tokens" | "stop_sequence";
|
|
4301
4301
|
};
|
|
4302
4302
|
type?: "message_start";
|
|
4303
4303
|
}>;
|
|
@@ -4560,10 +4560,10 @@ declare const AnthropicMessageDeltaEventSchema: z.ZodObject<{} & {
|
|
|
4560
4560
|
stop_sequence: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
4561
4561
|
}, "strip", z.ZodTypeAny, {
|
|
4562
4562
|
stop_sequence?: string;
|
|
4563
|
-
stop_reason?: "end_turn" | "
|
|
4563
|
+
stop_reason?: "end_turn" | "tool_use" | "max_tokens" | "stop_sequence";
|
|
4564
4564
|
}, {
|
|
4565
4565
|
stop_sequence?: string;
|
|
4566
|
-
stop_reason?: "end_turn" | "
|
|
4566
|
+
stop_reason?: "end_turn" | "tool_use" | "max_tokens" | "stop_sequence";
|
|
4567
4567
|
}>;
|
|
4568
4568
|
usage: z.ZodObject<{
|
|
4569
4569
|
input_tokens: z.ZodOptional<z.ZodNumber>;
|
|
@@ -4585,7 +4585,7 @@ declare const AnthropicMessageDeltaEventSchema: z.ZodObject<{} & {
|
|
|
4585
4585
|
type?: "message_delta";
|
|
4586
4586
|
delta?: {
|
|
4587
4587
|
stop_sequence?: string;
|
|
4588
|
-
stop_reason?: "end_turn" | "
|
|
4588
|
+
stop_reason?: "end_turn" | "tool_use" | "max_tokens" | "stop_sequence";
|
|
4589
4589
|
};
|
|
4590
4590
|
usage?: {
|
|
4591
4591
|
input_tokens?: number;
|
|
@@ -4597,7 +4597,7 @@ declare const AnthropicMessageDeltaEventSchema: z.ZodObject<{} & {
|
|
|
4597
4597
|
type?: "message_delta";
|
|
4598
4598
|
delta?: {
|
|
4599
4599
|
stop_sequence?: string;
|
|
4600
|
-
stop_reason?: "end_turn" | "
|
|
4600
|
+
stop_reason?: "end_turn" | "tool_use" | "max_tokens" | "stop_sequence";
|
|
4601
4601
|
};
|
|
4602
4602
|
usage?: {
|
|
4603
4603
|
input_tokens?: number;
|
|
@@ -4968,7 +4968,7 @@ declare const AnthropicStreamEventSchema: z.ZodUnion<[z.ZodObject<{} & {
|
|
|
4968
4968
|
cache_read_input_tokens?: number;
|
|
4969
4969
|
};
|
|
4970
4970
|
stop_sequence?: string;
|
|
4971
|
-
stop_reason?: "end_turn" | "
|
|
4971
|
+
stop_reason?: "end_turn" | "tool_use" | "max_tokens" | "stop_sequence";
|
|
4972
4972
|
}, {
|
|
4973
4973
|
role?: "assistant";
|
|
4974
4974
|
content?: ({
|
|
@@ -5012,7 +5012,7 @@ declare const AnthropicStreamEventSchema: z.ZodUnion<[z.ZodObject<{} & {
|
|
|
5012
5012
|
cache_read_input_tokens?: number;
|
|
5013
5013
|
};
|
|
5014
5014
|
stop_sequence?: string;
|
|
5015
|
-
stop_reason?: "end_turn" | "
|
|
5015
|
+
stop_reason?: "end_turn" | "tool_use" | "max_tokens" | "stop_sequence";
|
|
5016
5016
|
}>;
|
|
5017
5017
|
}, "strip", z.ZodTypeAny, {
|
|
5018
5018
|
message?: {
|
|
@@ -5058,7 +5058,7 @@ declare const AnthropicStreamEventSchema: z.ZodUnion<[z.ZodObject<{} & {
|
|
|
5058
5058
|
cache_read_input_tokens?: number;
|
|
5059
5059
|
};
|
|
5060
5060
|
stop_sequence?: string;
|
|
5061
|
-
stop_reason?: "end_turn" | "
|
|
5061
|
+
stop_reason?: "end_turn" | "tool_use" | "max_tokens" | "stop_sequence";
|
|
5062
5062
|
};
|
|
5063
5063
|
type?: "message_start";
|
|
5064
5064
|
}, {
|
|
@@ -5105,7 +5105,7 @@ declare const AnthropicStreamEventSchema: z.ZodUnion<[z.ZodObject<{} & {
|
|
|
5105
5105
|
cache_read_input_tokens?: number;
|
|
5106
5106
|
};
|
|
5107
5107
|
stop_sequence?: string;
|
|
5108
|
-
stop_reason?: "end_turn" | "
|
|
5108
|
+
stop_reason?: "end_turn" | "tool_use" | "max_tokens" | "stop_sequence";
|
|
5109
5109
|
};
|
|
5110
5110
|
type?: "message_start";
|
|
5111
5111
|
}>, z.ZodObject<{} & {
|
|
@@ -5364,10 +5364,10 @@ declare const AnthropicStreamEventSchema: z.ZodUnion<[z.ZodObject<{} & {
|
|
|
5364
5364
|
stop_sequence: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
5365
5365
|
}, "strip", z.ZodTypeAny, {
|
|
5366
5366
|
stop_sequence?: string;
|
|
5367
|
-
stop_reason?: "end_turn" | "
|
|
5367
|
+
stop_reason?: "end_turn" | "tool_use" | "max_tokens" | "stop_sequence";
|
|
5368
5368
|
}, {
|
|
5369
5369
|
stop_sequence?: string;
|
|
5370
|
-
stop_reason?: "end_turn" | "
|
|
5370
|
+
stop_reason?: "end_turn" | "tool_use" | "max_tokens" | "stop_sequence";
|
|
5371
5371
|
}>;
|
|
5372
5372
|
usage: z.ZodObject<{
|
|
5373
5373
|
input_tokens: z.ZodOptional<z.ZodNumber>;
|
|
@@ -5389,7 +5389,7 @@ declare const AnthropicStreamEventSchema: z.ZodUnion<[z.ZodObject<{} & {
|
|
|
5389
5389
|
type?: "message_delta";
|
|
5390
5390
|
delta?: {
|
|
5391
5391
|
stop_sequence?: string;
|
|
5392
|
-
stop_reason?: "end_turn" | "
|
|
5392
|
+
stop_reason?: "end_turn" | "tool_use" | "max_tokens" | "stop_sequence";
|
|
5393
5393
|
};
|
|
5394
5394
|
usage?: {
|
|
5395
5395
|
input_tokens?: number;
|
|
@@ -5401,7 +5401,7 @@ declare const AnthropicStreamEventSchema: z.ZodUnion<[z.ZodObject<{} & {
|
|
|
5401
5401
|
type?: "message_delta";
|
|
5402
5402
|
delta?: {
|
|
5403
5403
|
stop_sequence?: string;
|
|
5404
|
-
stop_reason?: "end_turn" | "
|
|
5404
|
+
stop_reason?: "end_turn" | "tool_use" | "max_tokens" | "stop_sequence";
|
|
5405
5405
|
};
|
|
5406
5406
|
usage?: {
|
|
5407
5407
|
input_tokens?: number;
|
|
@@ -5572,7 +5572,7 @@ declare const validateAnthropicResponse: (data: unknown) => {
|
|
|
5572
5572
|
cache_read_input_tokens?: number;
|
|
5573
5573
|
};
|
|
5574
5574
|
stop_sequence?: string;
|
|
5575
|
-
stop_reason?: "end_turn" | "
|
|
5575
|
+
stop_reason?: "end_turn" | "tool_use" | "max_tokens" | "stop_sequence";
|
|
5576
5576
|
};
|
|
5577
5577
|
declare const validateAnthropicStreamEvent: (data: unknown) => {
|
|
5578
5578
|
message?: {
|
|
@@ -5618,7 +5618,7 @@ declare const validateAnthropicStreamEvent: (data: unknown) => {
|
|
|
5618
5618
|
cache_read_input_tokens?: number;
|
|
5619
5619
|
};
|
|
5620
5620
|
stop_sequence?: string;
|
|
5621
|
-
stop_reason?: "end_turn" | "
|
|
5621
|
+
stop_reason?: "end_turn" | "tool_use" | "max_tokens" | "stop_sequence";
|
|
5622
5622
|
};
|
|
5623
5623
|
type?: "message_start";
|
|
5624
5624
|
} | {
|
|
@@ -5672,7 +5672,7 @@ declare const validateAnthropicStreamEvent: (data: unknown) => {
|
|
|
5672
5672
|
type?: "message_delta";
|
|
5673
5673
|
delta?: {
|
|
5674
5674
|
stop_sequence?: string;
|
|
5675
|
-
stop_reason?: "end_turn" | "
|
|
5675
|
+
stop_reason?: "end_turn" | "tool_use" | "max_tokens" | "stop_sequence";
|
|
5676
5676
|
};
|
|
5677
5677
|
usage?: {
|
|
5678
5678
|
input_tokens?: number;
|
|
@@ -6029,6 +6029,89 @@ declare class FormatValidator {
|
|
|
6029
6029
|
};
|
|
6030
6030
|
}
|
|
6031
6031
|
|
|
6032
|
+
/**
|
|
6033
|
+
* 流式处理相关类型定义
|
|
6034
|
+
*/
|
|
6035
|
+
|
|
6036
|
+
/**
|
|
6037
|
+
* 流式转换配置选项
|
|
6038
|
+
*/
|
|
6039
|
+
interface StreamConversionOptions {
|
|
6040
|
+
/** 模型名称 */
|
|
6041
|
+
modelName?: string;
|
|
6042
|
+
/** 消息ID */
|
|
6043
|
+
messageId?: string;
|
|
6044
|
+
/** 缓冲区超时时间(毫秒) */
|
|
6045
|
+
bufferTimeout?: number;
|
|
6046
|
+
/** 是否启用错误恢复 */
|
|
6047
|
+
errorRecovery?: boolean;
|
|
6048
|
+
/** 最大重试次数 */
|
|
6049
|
+
maxRetries?: number;
|
|
6050
|
+
/** 块处理回调 */
|
|
6051
|
+
onChunkProcessed?: (chunk: string, events: string[]) => void;
|
|
6052
|
+
/** 错误回调 */
|
|
6053
|
+
onError?: (error: Error, context: StreamErrorContext) => void;
|
|
6054
|
+
/** 调试模式 */
|
|
6055
|
+
debug?: boolean;
|
|
6056
|
+
}
|
|
6057
|
+
/**
|
|
6058
|
+
* 流式错误上下文
|
|
6059
|
+
*/
|
|
6060
|
+
interface StreamErrorContext {
|
|
6061
|
+
chunk: string;
|
|
6062
|
+
state: IncrementalConversionState;
|
|
6063
|
+
attempt?: number;
|
|
6064
|
+
totalRetries?: number;
|
|
6065
|
+
}
|
|
6066
|
+
/**
|
|
6067
|
+
* 流式转换器接口
|
|
6068
|
+
*/
|
|
6069
|
+
interface IStreamConverter {
|
|
6070
|
+
/**
|
|
6071
|
+
* 获取初始事件
|
|
6072
|
+
*/
|
|
6073
|
+
getInitialEvents(): string[];
|
|
6074
|
+
/**
|
|
6075
|
+
* 处理单个数据块
|
|
6076
|
+
*/
|
|
6077
|
+
processChunk(chunk: string): string[];
|
|
6078
|
+
/**
|
|
6079
|
+
* 结束流处理
|
|
6080
|
+
*/
|
|
6081
|
+
finalize(): string[];
|
|
6082
|
+
/**
|
|
6083
|
+
* 获取当前状态
|
|
6084
|
+
*/
|
|
6085
|
+
getState(): IncrementalConversionState;
|
|
6086
|
+
/**
|
|
6087
|
+
* 重置状态
|
|
6088
|
+
*/
|
|
6089
|
+
reset(): void;
|
|
6090
|
+
/**
|
|
6091
|
+
* 获取统计信息
|
|
6092
|
+
*/
|
|
6093
|
+
getStats(): StreamStats;
|
|
6094
|
+
}
|
|
6095
|
+
/**
|
|
6096
|
+
* 流式处理统计信息
|
|
6097
|
+
*/
|
|
6098
|
+
interface StreamStats {
|
|
6099
|
+
/** 处理的块数量 */
|
|
6100
|
+
chunksProcessed: number;
|
|
6101
|
+
/** 生成的事件数量 */
|
|
6102
|
+
eventsGenerated: number;
|
|
6103
|
+
/** 错误数量 */
|
|
6104
|
+
errors: number;
|
|
6105
|
+
/** 重试次数 */
|
|
6106
|
+
retries: number;
|
|
6107
|
+
/** 处理开始时间 */
|
|
6108
|
+
startTime: number;
|
|
6109
|
+
/** 最后更新时间 */
|
|
6110
|
+
lastUpdateTime: number;
|
|
6111
|
+
/** 缓冲区大小 */
|
|
6112
|
+
bufferSize: number;
|
|
6113
|
+
}
|
|
6114
|
+
|
|
6032
6115
|
/**
|
|
6033
6116
|
* O2A SSE适配器配置
|
|
6034
6117
|
*/
|
|
@@ -6103,6 +6186,20 @@ declare class O2ASSEAdapter {
|
|
|
6103
6186
|
errors: string[];
|
|
6104
6187
|
warnings: string[];
|
|
6105
6188
|
};
|
|
6189
|
+
/**
|
|
6190
|
+
* 将 OpenAI Response 流直接转换为 Anthropic SSE 流
|
|
6191
|
+
* 这是新增的核心流式处理方法,支持实时转换
|
|
6192
|
+
*/
|
|
6193
|
+
convertResponseStream(openaiResponse: Response, options?: StreamConversionOptions): ReadableStream<string>;
|
|
6194
|
+
/**
|
|
6195
|
+
* 将 ReadableStream 转换为 Anthropic SSE 流
|
|
6196
|
+
*/
|
|
6197
|
+
convertReadableStream(openaiStream: ReadableStream<Uint8Array>, options?: StreamConversionOptions): ReadableStream<string>;
|
|
6198
|
+
/**
|
|
6199
|
+
* 创建流式转换器实例
|
|
6200
|
+
* 提供更精细的流处理控制
|
|
6201
|
+
*/
|
|
6202
|
+
createStreamConverter(options?: StreamConversionOptions): IStreamConverter;
|
|
6106
6203
|
/**
|
|
6107
6204
|
* 应用增强功能到SSE转换
|
|
6108
6205
|
* 包括输入验证、输出修复等
|
|
@@ -6135,6 +6232,21 @@ declare const O2ASSEAdapterStatic: {
|
|
|
6135
6232
|
errors: string[];
|
|
6136
6233
|
warnings: string[];
|
|
6137
6234
|
};
|
|
6235
|
+
/**
|
|
6236
|
+
* 转换 Response 流为 Anthropic SSE(静态方法)
|
|
6237
|
+
* 新增:直接处理 Response 对象的流式转换
|
|
6238
|
+
*/
|
|
6239
|
+
convertResponseStream: (openaiResponse: Response, options?: StreamConversionOptions) => ReadableStream<string>;
|
|
6240
|
+
/**
|
|
6241
|
+
* 转换 ReadableStream 为 Anthropic SSE(静态方法)
|
|
6242
|
+
* 新增:处理任意 ReadableStream<Uint8Array> 的流式转换
|
|
6243
|
+
*/
|
|
6244
|
+
convertReadableStream: (openaiStream: ReadableStream<Uint8Array>, options?: StreamConversionOptions) => ReadableStream<string>;
|
|
6245
|
+
/**
|
|
6246
|
+
* 创建流式转换器(静态方法)
|
|
6247
|
+
* 新增:提供更精细的流处理控制
|
|
6248
|
+
*/
|
|
6249
|
+
createStreamConverter: (options?: StreamConversionOptions) => IStreamConverter;
|
|
6138
6250
|
};
|
|
6139
6251
|
|
|
6140
6252
|
/**
|
|
@@ -6363,7 +6475,7 @@ declare const validateO2AConversion: (openaiData: unknown, convertedData: unknow
|
|
|
6363
6475
|
cache_read_input_tokens?: number;
|
|
6364
6476
|
};
|
|
6365
6477
|
stop_sequence?: string;
|
|
6366
|
-
stop_reason?: "end_turn" | "
|
|
6478
|
+
stop_reason?: "end_turn" | "tool_use" | "max_tokens" | "stop_sequence";
|
|
6367
6479
|
}>;
|
|
6368
6480
|
declare const validateStreamConversion: (inputChunks: unknown[], outputEvents: unknown[], direction: "openai-to-anthropic" | "anthropic-to-openai", useHealing?: boolean) => ConversionResult<unknown[]>;
|
|
6369
6481
|
|
|
@@ -6624,7 +6736,7 @@ declare const healO2AResponse: (data: unknown, maxAttempts?: number) => Promise<
|
|
|
6624
6736
|
cache_read_input_tokens?: number;
|
|
6625
6737
|
};
|
|
6626
6738
|
stop_sequence?: string;
|
|
6627
|
-
stop_reason?: "end_turn" | "
|
|
6739
|
+
stop_reason?: "end_turn" | "tool_use" | "max_tokens" | "stop_sequence";
|
|
6628
6740
|
}>>;
|
|
6629
6741
|
|
|
6630
6742
|
/**
|
|
@@ -7155,7 +7267,7 @@ interface Logger {
|
|
|
7155
7267
|
declare function getGlobalLogger(): Logger;
|
|
7156
7268
|
|
|
7157
7269
|
/**
|
|
7158
|
-
*
|
|
7270
|
+
* ai-protocol-adapters - Universal AI Protocol Converter
|
|
7159
7271
|
* OpenAI ⇄ Anthropic with full TypeScript support
|
|
7160
7272
|
*/
|
|
7161
7273
|
|