@imenam/unified-llm-client 1.2.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/LICENSE +21 -0
- package/README.md +233 -0
- package/dist/adapters/anthropic/AnthropicLogAdapter.d.ts +6 -0
- package/dist/adapters/anthropic/AnthropicLogAdapter.d.ts.map +1 -0
- package/dist/adapters/anthropic/AnthropicLogAdapter.js +41 -0
- package/dist/adapters/anthropic/AnthropicOutputAdapter.d.ts +6 -0
- package/dist/adapters/anthropic/AnthropicOutputAdapter.d.ts.map +1 -0
- package/dist/adapters/anthropic/AnthropicOutputAdapter.js +41 -0
- package/dist/adapters/anthropic/AnthropicPromptAdapter.d.ts +12 -0
- package/dist/adapters/anthropic/AnthropicPromptAdapter.d.ts.map +1 -0
- package/dist/adapters/anthropic/AnthropicPromptAdapter.js +249 -0
- package/dist/adapters/anthropic/AnthropicToolAdapter.d.ts +6 -0
- package/dist/adapters/anthropic/AnthropicToolAdapter.d.ts.map +1 -0
- package/dist/adapters/anthropic/AnthropicToolAdapter.js +20 -0
- package/dist/adapters/gemini/GeminiAudioAdapter.d.ts +40 -0
- package/dist/adapters/gemini/GeminiAudioAdapter.d.ts.map +1 -0
- package/dist/adapters/gemini/GeminiAudioAdapter.js +273 -0
- package/dist/adapters/gemini/GeminiLogAdapter.d.ts +6 -0
- package/dist/adapters/gemini/GeminiLogAdapter.d.ts.map +1 -0
- package/dist/adapters/gemini/GeminiLogAdapter.js +43 -0
- package/dist/adapters/gemini/GeminiOutputAdapter.d.ts +6 -0
- package/dist/adapters/gemini/GeminiOutputAdapter.d.ts.map +1 -0
- package/dist/adapters/gemini/GeminiOutputAdapter.js +38 -0
- package/dist/adapters/gemini/GeminiPromptAdapter.d.ts +26 -0
- package/dist/adapters/gemini/GeminiPromptAdapter.d.ts.map +1 -0
- package/dist/adapters/gemini/GeminiPromptAdapter.js +334 -0
- package/dist/adapters/gemini/GeminiToolAdapter.d.ts +8 -0
- package/dist/adapters/gemini/GeminiToolAdapter.d.ts.map +1 -0
- package/dist/adapters/gemini/GeminiToolAdapter.js +42 -0
- package/dist/adapters/gemini/types.d.ts +14 -0
- package/dist/adapters/gemini/types.d.ts.map +1 -0
- package/dist/adapters/gemini/types.js +2 -0
- package/dist/adapters/openai/OpenAIOutputAdapter.d.ts +6 -0
- package/dist/adapters/openai/OpenAIOutputAdapter.d.ts.map +1 -0
- package/dist/adapters/openai/OpenAIOutputAdapter.js +18 -0
- package/dist/adapters/openai/OpenAIPromptAdapter.d.ts +13 -0
- package/dist/adapters/openai/OpenAIPromptAdapter.d.ts.map +1 -0
- package/dist/adapters/openai/OpenAIPromptAdapter.js +215 -0
- package/dist/adapters/openai/OpenAiLogAdapter.d.ts +6 -0
- package/dist/adapters/openai/OpenAiLogAdapter.d.ts.map +1 -0
- package/dist/adapters/openai/OpenAiLogAdapter.js +37 -0
- package/dist/adapters/openai/OpenAiToolAdapter.d.ts +6 -0
- package/dist/adapters/openai/OpenAiToolAdapter.d.ts.map +1 -0
- package/dist/adapters/openai/OpenAiToolAdapter.js +20 -0
- package/dist/adapters/qwen/QwenLogAdapter.d.ts +7 -0
- package/dist/adapters/qwen/QwenLogAdapter.d.ts.map +1 -0
- package/dist/adapters/qwen/QwenLogAdapter.js +49 -0
- package/dist/adapters/qwen/QwenOutputAdapter.d.ts +6 -0
- package/dist/adapters/qwen/QwenOutputAdapter.d.ts.map +1 -0
- package/dist/adapters/qwen/QwenOutputAdapter.js +9 -0
- package/dist/adapters/qwen/QwenPromptAdapter.d.ts +13 -0
- package/dist/adapters/qwen/QwenPromptAdapter.d.ts.map +1 -0
- package/dist/adapters/qwen/QwenPromptAdapter.js +313 -0
- package/dist/adapters/qwen/QwenToolAdapter.d.ts +6 -0
- package/dist/adapters/qwen/QwenToolAdapter.d.ts.map +1 -0
- package/dist/adapters/qwen/QwenToolAdapter.js +20 -0
- package/dist/common/types.d.ts +106 -0
- package/dist/common/types.d.ts.map +1 -0
- package/dist/common/types.js +2 -0
- package/dist/core/LLMAdapter.d.ts +74 -0
- package/dist/core/LLMAdapter.d.ts.map +1 -0
- package/dist/core/LLMAdapter.js +70 -0
- package/dist/core/Models.d.ts +16 -0
- package/dist/core/Models.d.ts.map +1 -0
- package/dist/core/Models.js +118 -0
- package/dist/core/UnifiedLLMClient.d.ts +68 -0
- package/dist/core/UnifiedLLMClient.d.ts.map +1 -0
- package/dist/core/UnifiedLLMClient.js +185 -0
- package/dist/examples/anthropic-example.d.ts +2 -0
- package/dist/examples/anthropic-example.d.ts.map +1 -0
- package/dist/examples/anthropic-example.js +243 -0
- package/dist/examples/audio-example.d.ts +14 -0
- package/dist/examples/audio-example.d.ts.map +1 -0
- package/dist/examples/audio-example.js +204 -0
- package/dist/examples/example-logging.d.ts +2 -0
- package/dist/examples/example-logging.d.ts.map +1 -0
- package/dist/examples/example-logging.js +53 -0
- package/dist/examples/example.d.ts +2 -0
- package/dist/examples/example.d.ts.map +1 -0
- package/dist/examples/example.js +373 -0
- package/dist/examples/qwen-vl-example.d.ts +26 -0
- package/dist/examples/qwen-vl-example.d.ts.map +1 -0
- package/dist/examples/qwen-vl-example.js +314 -0
- package/dist/examples/test-multiturn-tools.d.ts +2 -0
- package/dist/examples/test-multiturn-tools.d.ts.map +1 -0
- package/dist/examples/test-multiturn-tools.js +139 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/utils/audioUtils.d.ts +41 -0
- package/dist/utils/audioUtils.d.ts.map +1 -0
- package/dist/utils/audioUtils.js +185 -0
- package/package.json +64 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
36
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
37
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
38
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
39
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
40
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
41
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
45
|
+
var t = {};
|
|
46
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
47
|
+
t[p] = s[p];
|
|
48
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
49
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
50
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
51
|
+
t[p[i]] = s[p[i]];
|
|
52
|
+
}
|
|
53
|
+
return t;
|
|
54
|
+
};
|
|
55
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
56
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
57
|
+
};
|
|
58
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
59
|
+
exports.OpenAIPromptAdapter = void 0;
|
|
60
|
+
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
61
|
+
const fs = __importStar(require("fs"));
|
|
62
|
+
const path = __importStar(require("path"));
|
|
63
|
+
const mime = __importStar(require("mime-types"));
|
|
64
|
+
class OpenAIPromptAdapter {
|
|
65
|
+
constructor(opts) {
|
|
66
|
+
var _a, _b;
|
|
67
|
+
this.opts = opts;
|
|
68
|
+
this.messages = [];
|
|
69
|
+
this.endpoint =
|
|
70
|
+
(_b = (_a = opts.baseUrl) === null || _a === void 0 ? void 0 : _a.replace(/\/$/, "")) !== null && _b !== void 0 ? _b : "https://api.openai.com";
|
|
71
|
+
this.endpoint += "/v1/chat/completions";
|
|
72
|
+
}
|
|
73
|
+
formatMessage(message) {
|
|
74
|
+
var _a;
|
|
75
|
+
// Assistant message with tool calls → OpenAI format with serialized arguments
|
|
76
|
+
if (message.role === "assistant" && message.tool_calls && message.tool_calls.length > 0) {
|
|
77
|
+
return {
|
|
78
|
+
role: "assistant",
|
|
79
|
+
content: (_a = message.content) !== null && _a !== void 0 ? _a : null,
|
|
80
|
+
tool_calls: message.tool_calls.map(tc => {
|
|
81
|
+
var _a;
|
|
82
|
+
return ({
|
|
83
|
+
id: (_a = tc.id) !== null && _a !== void 0 ? _a : tc.name,
|
|
84
|
+
type: "function",
|
|
85
|
+
function: {
|
|
86
|
+
name: tc.name,
|
|
87
|
+
arguments: JSON.stringify(tc.arguments),
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
}),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
if (!message.attachedFile) {
|
|
94
|
+
return message;
|
|
95
|
+
}
|
|
96
|
+
const content = [];
|
|
97
|
+
// Add text content if present
|
|
98
|
+
if (message.content && typeof message.content === 'string') {
|
|
99
|
+
content.push({
|
|
100
|
+
type: "text",
|
|
101
|
+
text: message.content
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
else if (Array.isArray(message.content)) {
|
|
105
|
+
content.push(...message.content);
|
|
106
|
+
}
|
|
107
|
+
// Add attached files
|
|
108
|
+
const fileParts = this.processFiles(message.attachedFile);
|
|
109
|
+
content.push(...fileParts);
|
|
110
|
+
const { attachedFile } = message, rest = __rest(message, ["attachedFile"]);
|
|
111
|
+
return Object.assign(Object.assign({}, rest), { content: content.length > 0 ? content : message.content });
|
|
112
|
+
}
|
|
113
|
+
sendToProvider(messages_1) {
|
|
114
|
+
return __awaiter(this, arguments, void 0, function* (messages, tools = [], toolChoice = "auto", attachedFile, model) {
|
|
115
|
+
var _a;
|
|
116
|
+
// If attachedFile is provided separately, attach it to the last user message
|
|
117
|
+
if (attachedFile) {
|
|
118
|
+
const lastUserMessage = [...messages].reverse().find(m => m.role === 'user');
|
|
119
|
+
if (lastUserMessage) {
|
|
120
|
+
const fileParts = this.processFiles(attachedFile);
|
|
121
|
+
if (typeof lastUserMessage.content === 'string') {
|
|
122
|
+
lastUserMessage.content = [
|
|
123
|
+
{ type: "text", text: lastUserMessage.content },
|
|
124
|
+
...fileParts
|
|
125
|
+
];
|
|
126
|
+
}
|
|
127
|
+
else if (Array.isArray(lastUserMessage.content)) {
|
|
128
|
+
lastUserMessage.content.push(...fileParts);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const body = {
|
|
133
|
+
model: model || this.opts.model,
|
|
134
|
+
messages,
|
|
135
|
+
stream: false,
|
|
136
|
+
};
|
|
137
|
+
if (tools.length) {
|
|
138
|
+
body.tools = tools.map((fn) => ({ type: "function", function: fn }));
|
|
139
|
+
body.tool_choice =
|
|
140
|
+
toolChoice === "auto"
|
|
141
|
+
? "auto"
|
|
142
|
+
: toolChoice === "none"
|
|
143
|
+
? "none"
|
|
144
|
+
: { type: "function", function: { name: toolChoice } };
|
|
145
|
+
}
|
|
146
|
+
const response = yield this.request(body);
|
|
147
|
+
const responseMessage = response.choices[0].message;
|
|
148
|
+
const calls = (responseMessage.tool_calls || []).map((c) => {
|
|
149
|
+
var _a;
|
|
150
|
+
return ({
|
|
151
|
+
id: c.id,
|
|
152
|
+
name: c.function.name,
|
|
153
|
+
arguments: JSON.parse((_a = c.function.arguments) !== null && _a !== void 0 ? _a : "{}"),
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
return {
|
|
157
|
+
content: (_a = responseMessage.content) !== null && _a !== void 0 ? _a : null,
|
|
158
|
+
toolCalls: calls,
|
|
159
|
+
raw: response,
|
|
160
|
+
};
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
//--------------------------------------------------
|
|
164
|
+
processFiles(files) {
|
|
165
|
+
const fileList = Array.isArray(files) ? files : [files];
|
|
166
|
+
const parts = [];
|
|
167
|
+
for (const file of fileList) {
|
|
168
|
+
if (typeof file === 'string') {
|
|
169
|
+
try {
|
|
170
|
+
if (file.startsWith('http')) {
|
|
171
|
+
parts.push({
|
|
172
|
+
type: "image_url",
|
|
173
|
+
image_url: {
|
|
174
|
+
url: file
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
const filePath = path.resolve(file);
|
|
180
|
+
const fileBuffer = fs.readFileSync(filePath);
|
|
181
|
+
const base64Data = fileBuffer.toString('base64');
|
|
182
|
+
const mimeType = mime.lookup(filePath) || 'application/octet-stream';
|
|
183
|
+
parts.push({
|
|
184
|
+
type: "image_url",
|
|
185
|
+
image_url: {
|
|
186
|
+
url: `data:${mimeType};base64,${base64Data}`
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
console.warn(`Failed to process attached file ${file}:`, error);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return parts;
|
|
197
|
+
}
|
|
198
|
+
request(body) {
|
|
199
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
200
|
+
const res = yield (0, node_fetch_1.default)(this.endpoint, {
|
|
201
|
+
method: "POST",
|
|
202
|
+
headers: {
|
|
203
|
+
"Content-Type": "application/json",
|
|
204
|
+
Authorization: `Bearer ${this.opts.apiKey}`,
|
|
205
|
+
},
|
|
206
|
+
body: JSON.stringify(body),
|
|
207
|
+
});
|
|
208
|
+
if (!res.ok) {
|
|
209
|
+
throw new Error(`OpenAI API ${res.status}: ${yield res.text()}`);
|
|
210
|
+
}
|
|
211
|
+
return res.json();
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
exports.OpenAIPromptAdapter = OpenAIPromptAdapter;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { UnifiedLog } from "../../common/types";
|
|
2
|
+
import { LogAdapter, LogData } from "../../core/LLMAdapter";
|
|
3
|
+
export declare class OpenAiLogAdapter implements LogAdapter {
|
|
4
|
+
toUnifiedLog(data: LogData): UnifiedLog;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=OpenAiLogAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OpenAiLogAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/openai/OpenAiLogAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAY,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAE5D,qBAAa,gBAAiB,YAAW,UAAU;IACjD,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU;CA+BxC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OpenAiLogAdapter = void 0;
|
|
4
|
+
class OpenAiLogAdapter {
|
|
5
|
+
toUnifiedLog(data) {
|
|
6
|
+
var _a, _b, _c, _d;
|
|
7
|
+
const { model, provider, messages, response, latencyMs, metadata } = data;
|
|
8
|
+
const usage = response.usage;
|
|
9
|
+
const raw = response.raw;
|
|
10
|
+
return {
|
|
11
|
+
requestId: (raw === null || raw === void 0 ? void 0 : raw.id) || `openai-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
12
|
+
timestamp: new Date(),
|
|
13
|
+
provider: provider,
|
|
14
|
+
model: model,
|
|
15
|
+
prompt: messages,
|
|
16
|
+
output: {
|
|
17
|
+
content: response.content,
|
|
18
|
+
toolCalls: response.toolCalls,
|
|
19
|
+
finishReason: response.finishReason,
|
|
20
|
+
},
|
|
21
|
+
usage: {
|
|
22
|
+
promptTokens: (usage === null || usage === void 0 ? void 0 : usage.promptTokens) || 0,
|
|
23
|
+
completionTokens: (usage === null || usage === void 0 ? void 0 : usage.completionTokens) || 0,
|
|
24
|
+
totalTokens: (usage === null || usage === void 0 ? void 0 : usage.totalTokens) || 0,
|
|
25
|
+
promptDetails: {
|
|
26
|
+
cachedTokens: ((_b = (_a = raw === null || raw === void 0 ? void 0 : raw.usage) === null || _a === void 0 ? void 0 : _a.prompt_tokens_details) === null || _b === void 0 ? void 0 : _b.cached_tokens) || 0,
|
|
27
|
+
},
|
|
28
|
+
completionDetails: {
|
|
29
|
+
thinkingTokens: ((_d = (_c = raw === null || raw === void 0 ? void 0 : raw.usage) === null || _c === void 0 ? void 0 : _c.completion_tokens_details) === null || _d === void 0 ? void 0 : _d.reasoning_tokens) || 0,
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
latencyMs: latencyMs,
|
|
33
|
+
metadata: metadata,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.OpenAiLogAdapter = OpenAiLogAdapter;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ToolCall } from "../../common/types";
|
|
2
|
+
import { ToolAdapter } from "../../core/LLMAdapter";
|
|
3
|
+
export declare class OpenAiToolAdapter implements ToolAdapter {
|
|
4
|
+
formatToolCallResult(toolCall: ToolCall): any;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=OpenAiToolAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OpenAiToolAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/openai/OpenAiToolAdapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,qBAAa,iBAAkB,YAAW,WAAW;IACnD,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,GAAG;CAc9C"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OpenAiToolAdapter = void 0;
|
|
4
|
+
class OpenAiToolAdapter {
|
|
5
|
+
formatToolCallResult(toolCall) {
|
|
6
|
+
if (!toolCall.id || toolCall.id === "") {
|
|
7
|
+
throw new Error("Tool call ID is required to format response - toolCall: " + JSON.stringify(toolCall));
|
|
8
|
+
}
|
|
9
|
+
if (typeof toolCall.result !== 'string') {
|
|
10
|
+
toolCall.result = JSON.stringify(toolCall.result);
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
tool_call_id: toolCall.id,
|
|
14
|
+
role: "tool",
|
|
15
|
+
name: toolCall.name,
|
|
16
|
+
content: toolCall.result,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.OpenAiToolAdapter = OpenAiToolAdapter;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { UnifiedLog } from "../../common/types";
|
|
2
|
+
import { LogAdapter, LogData } from "../../core/LLMAdapter";
|
|
3
|
+
export declare class QwenLogAdapter implements LogAdapter {
|
|
4
|
+
removeImages(messages: any[]): any[];
|
|
5
|
+
toUnifiedLog(data: LogData): UnifiedLog;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=QwenLogAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QwenLogAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/qwen/QwenLogAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAY,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAE5D,qBAAa,cAAe,YAAW,UAAU;IAC/C,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE;IAapC,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU;CA+BxC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QwenLogAdapter = void 0;
|
|
4
|
+
class QwenLogAdapter {
|
|
5
|
+
removeImages(messages) {
|
|
6
|
+
const formattedMessages = messages.map((message) => {
|
|
7
|
+
message.content = message.content.map((content) => {
|
|
8
|
+
if (content.type === 'image_url') {
|
|
9
|
+
content.image_url.url = content.image_url.url.split(',')[0] + "removed";
|
|
10
|
+
}
|
|
11
|
+
return content;
|
|
12
|
+
});
|
|
13
|
+
return message;
|
|
14
|
+
});
|
|
15
|
+
return formattedMessages;
|
|
16
|
+
}
|
|
17
|
+
toUnifiedLog(data) {
|
|
18
|
+
var _a, _b, _c, _d, _e;
|
|
19
|
+
const { model, provider, messages, response, latencyMs, metadata } = data;
|
|
20
|
+
const usage = response.usage;
|
|
21
|
+
const raw = response.raw;
|
|
22
|
+
return {
|
|
23
|
+
requestId: (raw === null || raw === void 0 ? void 0 : raw.id) || (raw === null || raw === void 0 ? void 0 : raw.request_id) || `qwen-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
24
|
+
timestamp: new Date(),
|
|
25
|
+
provider: provider,
|
|
26
|
+
model: model,
|
|
27
|
+
prompt: this.removeImages(messages),
|
|
28
|
+
output: {
|
|
29
|
+
content: response.content,
|
|
30
|
+
toolCalls: response.toolCalls,
|
|
31
|
+
finishReason: response.finishReason,
|
|
32
|
+
},
|
|
33
|
+
usage: {
|
|
34
|
+
promptTokens: (usage === null || usage === void 0 ? void 0 : usage.promptTokens) || ((_a = raw === null || raw === void 0 ? void 0 : raw.usage) === null || _a === void 0 ? void 0 : _a.prompt_tokens) || 0,
|
|
35
|
+
completionTokens: (usage === null || usage === void 0 ? void 0 : usage.completionTokens) || ((_b = raw === null || raw === void 0 ? void 0 : raw.usage) === null || _b === void 0 ? void 0 : _b.completion_tokens) || 0,
|
|
36
|
+
totalTokens: (usage === null || usage === void 0 ? void 0 : usage.totalTokens) || ((_c = raw === null || raw === void 0 ? void 0 : raw.usage) === null || _c === void 0 ? void 0 : _c.total_tokens) || 0,
|
|
37
|
+
promptDetails: {
|
|
38
|
+
textTokens: (_d = raw === null || raw === void 0 ? void 0 : raw.usage) === null || _d === void 0 ? void 0 : _d.prompt_tokens,
|
|
39
|
+
},
|
|
40
|
+
completionDetails: {
|
|
41
|
+
textTokens: (_e = raw === null || raw === void 0 ? void 0 : raw.usage) === null || _e === void 0 ? void 0 : _e.completion_tokens,
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
latencyMs: latencyMs,
|
|
45
|
+
metadata: metadata,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.QwenLogAdapter = QwenLogAdapter;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ChatResponse } from "../../common/types";
|
|
2
|
+
import { OutputAdapter } from "../../core/LLMAdapter";
|
|
3
|
+
export declare class QwenOutputAdapter implements OutputAdapter {
|
|
4
|
+
parse(providerResponse: any): ChatResponse;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=QwenOutputAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QwenOutputAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/qwen/QwenOutputAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,qBAAa,iBAAkB,YAAW,aAAa;IAC9C,KAAK,CAAC,gBAAgB,EAAE,GAAG,GAAG,YAAY;CAGlD"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { PromptAdapterOptions, PromptAdapter, ChatStreamOptions } from "../../core/LLMAdapter";
|
|
2
|
+
import { ChatMessage, ToolDefinition, ChatResponse } from "../../common/types";
|
|
3
|
+
export declare class QwenPromptAdapter implements PromptAdapter {
|
|
4
|
+
private readonly opts;
|
|
5
|
+
private readonly endpoint;
|
|
6
|
+
private messages;
|
|
7
|
+
constructor(opts: PromptAdapterOptions);
|
|
8
|
+
formatMessage(message: ChatMessage): any;
|
|
9
|
+
sendToProvider(messages: any, tools?: ToolDefinition[], toolChoice?: "auto" | "none" | string, attachedFile?: string | string[], model?: string): Promise<ChatResponse>;
|
|
10
|
+
streamFromProvider?({ messages, tools, toolChoice, model, onChunk, onFinalResponse, }: ChatStreamOptions): Promise<ChatResponse>;
|
|
11
|
+
private request;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=QwenPromptAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QwenPromptAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/qwen/QwenPromptAdapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,iBAAiB,EAAqB,MAAM,uBAAuB,CAAC;AAClH,OAAO,EAAE,WAAW,EAAY,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIzF,qBAAa,iBAAkB,YAAW,aAAa;IAIzC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAa;gBAEA,IAAI,EAAE,oBAAoB;IAMhD,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,GAAG;IA8EzC,cAAc,CAClB,QAAQ,EAAE,GAAG,EACb,KAAK,GAAE,cAAc,EAAO,EAC5B,UAAU,GAAE,MAAM,GAAG,MAAM,GAAG,MAAe,EAC7C,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,EAChC,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,YAAY,CAAC;IAiClB,kBAAkB,CAAC,CAAC,EACxB,QAAQ,EACR,KAAK,EACL,UAAU,EACV,KAAK,EACL,OAAO,EACP,eAAe,GAChB,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;YA0I9B,OAAO;CAetB"}
|