@mate-academy/llm-gateway 8.9.0 → 8.11.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.
Files changed (70) hide show
  1. package/README.md +64 -3
  2. package/dist/LLMService.constants.d.ts +178 -268
  3. package/dist/LLMService.typedefs.d.ts +70 -1
  4. package/dist/LLMService.typedefs.js +14 -1
  5. package/dist/LLMService.typedefs.js.map +1 -1
  6. package/dist/client/agentRun.typedefs.d.ts +7 -3
  7. package/dist/client/agentRunner.d.ts +2 -2
  8. package/dist/client/agentRunner.js +1 -1
  9. package/dist/client/agentRunner.js.map +1 -1
  10. package/dist/client/llmClient.typedefs.d.ts +14 -1
  11. package/dist/client/llmClient.typedefs.js.map +1 -1
  12. package/dist/client/plainMessages.d.ts +10 -2
  13. package/dist/client/plainMessages.js +25 -0
  14. package/dist/client/plainMessages.js.map +1 -1
  15. package/dist/providers/GoogleGenerativeAI/GoogleGenerativeAI.entity.d.ts +11 -1
  16. package/dist/providers/GoogleGenerativeAI/GoogleGenerativeAI.entity.js +66 -0
  17. package/dist/providers/GoogleGenerativeAI/GoogleGenerativeAI.entity.js.map +1 -1
  18. package/dist/providers/GoogleGenerativeAI/services/GoogleGenerativeAIAssistance.service.js +1 -1
  19. package/dist/providers/GoogleGenerativeAI/services/GoogleGenerativeAIAssistance.service.js.map +1 -1
  20. package/dist/providers/LLMAPI/LLMAPI.constants.d.ts +464 -336
  21. package/dist/providers/LLMAPI/LLMAPI.constants.js +121 -152
  22. package/dist/providers/LLMAPI/LLMAPI.constants.js.map +1 -1
  23. package/dist/providers/LLMAPI/LLMAPI.entity.d.ts +24 -1
  24. package/dist/providers/LLMAPI/LLMAPI.entity.js +128 -0
  25. package/dist/providers/LLMAPI/LLMAPI.entity.js.map +1 -1
  26. package/dist/providers/LLMAPI/LLMAPI.typedefs.js +1 -1
  27. package/dist/providers/LLMAPI/LLMAPI.typedefs.js.map +1 -1
  28. package/dist/providers/LLMAPI/LLMAPI.voices.d.ts +14 -0
  29. package/dist/providers/LLMAPI/LLMAPI.voices.js +30 -7
  30. package/dist/providers/LLMAPI/LLMAPI.voices.js.map +1 -1
  31. package/dist/providers/LLMAPI/services/LLMAPIAssistance.service.d.ts +0 -11
  32. package/dist/providers/LLMAPI/services/LLMAPIAssistance.service.js +8 -51
  33. package/dist/providers/LLMAPI/services/LLMAPIAssistance.service.js.map +1 -1
  34. package/dist/providers/LLMAPI/services/LLMAPISpeechToText.service.d.ts +2 -2
  35. package/dist/providers/LLMAPI/services/LLMAPISpeechToText.service.js +4 -3
  36. package/dist/providers/LLMAPI/services/LLMAPISpeechToText.service.js.map +1 -1
  37. package/dist/providers/LLMAPI/utilities/geminiToolHistory.d.ts +17 -0
  38. package/dist/providers/LLMAPI/utilities/geminiToolHistory.js +41 -0
  39. package/dist/providers/LLMAPI/utilities/geminiToolHistory.js.map +1 -0
  40. package/dist/providers/LLMAPI/utilities/index.d.ts +1 -0
  41. package/dist/providers/LLMAPI/utilities/index.js +6 -1
  42. package/dist/providers/LLMAPI/utilities/index.js.map +1 -1
  43. package/dist/providers/OpenAI/services/OpenAIAssistance.service.d.ts +1 -0
  44. package/dist/providers/OpenAI/services/OpenAIAssistance.service.js +6 -49
  45. package/dist/providers/OpenAI/services/OpenAIAssistance.service.js.map +1 -1
  46. package/dist/providers/OpenAI/services/OpenAISpeechToText.service.d.ts +1 -1
  47. package/dist/providers/OpenAI/services/OpenAISpeechToText.service.js +1 -1
  48. package/dist/providers/OpenAI/services/OpenAISpeechToText.service.js.map +1 -1
  49. package/dist/providers/OpenAI/services/buildResponsesHistoryInput.d.ts +20 -0
  50. package/dist/providers/OpenAI/services/buildResponsesHistoryInput.js +107 -0
  51. package/dist/providers/OpenAI/services/buildResponsesHistoryInput.js.map +1 -0
  52. package/dist/providers/OpenAICompatible/OpenAICompatibleSpeechToText.service.d.ts +1 -1
  53. package/dist/providers/OpenAICompatible/OpenAICompatibleSpeechToText.service.js +1 -1
  54. package/dist/providers/OpenAICompatible/OpenAICompatibleSpeechToText.service.js.map +1 -1
  55. package/dist/utilities/audio.d.ts +1 -0
  56. package/dist/utilities/audio.js +12 -0
  57. package/dist/utilities/audio.js.map +1 -0
  58. package/dist/utilities/history/LLMHistoryEntries.d.ts +34 -0
  59. package/dist/utilities/history/LLMHistoryEntries.js +113 -0
  60. package/dist/utilities/history/LLMHistoryEntries.js.map +1 -0
  61. package/dist/utilities/history/history.constants.d.ts +7 -0
  62. package/dist/utilities/history/history.constants.js +12 -0
  63. package/dist/utilities/history/history.constants.js.map +1 -0
  64. package/dist/utilities/history/index.d.ts +2 -0
  65. package/dist/utilities/history/index.js +19 -0
  66. package/dist/utilities/history/index.js.map +1 -0
  67. package/dist/utilities/index.d.ts +1 -0
  68. package/dist/utilities/index.js +1 -0
  69. package/dist/utilities/index.js.map +1 -1
  70. package/package.json +1 -1
@@ -51,7 +51,7 @@ class OpenAICompatibleSpeechToTextService extends services_1.LLMSpeechToTextServ
51
51
  signal: abortSignal,
52
52
  });
53
53
  abortSignal?.throwIfAborted();
54
- const usage = this.extractUsage(response, fileSize);
54
+ const usage = await this.extractUsage(response, pathToAudio);
55
55
  await this.writeSuccessMetrics({
56
56
  method,
57
57
  model,
@@ -1 +1 @@
1
- {"version":3,"file":"OpenAICompatibleSpeechToText.service.js","sourceRoot":"","sources":["../../../src/providers/OpenAICompatible/OpenAICompatibleSpeechToText.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"OpenAICompatibleSpeechToText.service.js","sourceRoot":"","sources":["../../../src/providers/OpenAICompatible/OpenAICompatibleSpeechToText.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const getAudioDuration: (pathToAudio: string) => Promise<number>;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getAudioDuration = void 0;
4
+ const load_esm_1 = require("load-esm");
5
+ const musicMetadataModule = (0, load_esm_1.loadEsm)('music-metadata');
6
+ const getAudioDuration = async (pathToAudio) => {
7
+ const { parseFile } = await musicMetadataModule;
8
+ const metadata = await parseFile(pathToAudio);
9
+ return metadata.format.duration ?? 0;
10
+ };
11
+ exports.getAudioDuration = getAudioDuration;
12
+ //# sourceMappingURL=audio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio.js","sourceRoot":"","sources":["../../src/utilities/audio.ts"],"names":[],"mappings":";;;AAAA,uCAAmC;AAEnC,MAAM,mBAAmB,GAAG,IAAA,kBAAO,EACjC,gBAAgB,CACjB,CAAC;AAEK,MAAM,gBAAgB,GAAG,KAAK,EAAE,WAAmB,EAAmB,EAAE;IAC7E,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,mBAAmB,CAAC;IAChD,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,CAAC;IAE9C,OAAO,QAAQ,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;AACvC,CAAC,CAAC;AALW,QAAA,gBAAgB,oBAK3B"}
@@ -0,0 +1,34 @@
1
+ import { type LLMHistoryContextEntry, type LLMHistoryEntry, type LLMHistoryToolCallEntry, type LLMHistoryToolResultEntry, type LLMAssistanceMessage, type LLMToolResult } from '../../LLMService.typedefs';
2
+ /**
3
+ * The history invariants every provider mapping relies on, established once
4
+ * here instead of in each provider: a tool call is answered exactly once, a
5
+ * result answers a call that was actually made, and an assistant round that
6
+ * called nothing is not a tool round at all.
7
+ */
8
+ export declare class LLMHistoryEntries {
9
+ static isToolCall(entry: LLMHistoryEntry): entry is LLMHistoryToolCallEntry;
10
+ static isToolResult(entry: LLMHistoryEntry): entry is LLMHistoryToolResultEntry;
11
+ static isContext(entry: LLMHistoryEntry): entry is LLMHistoryContextEntry;
12
+ static isMessage(entry: LLMHistoryEntry): entry is LLMAssistanceMessage;
13
+ /**
14
+ * Repairs a restored history into one every provider accepts: an empty tool
15
+ * round is dropped, a result answering no preceding call is dropped, a
16
+ * second result for an already-answered call is dropped, and a call left
17
+ * unanswered gets `LLM_UNANSWERED_TOOL_CALL_RESULT` as a real tool result.
18
+ * Order is preserved; a synthesized result lands directly after the round
19
+ * that needed it.
20
+ */
21
+ static normalize(entries: LLMHistoryEntry[]): LLMHistoryEntry[];
22
+ /**
23
+ * Indexes the repaired history by call id, so a provider mapping emits each
24
+ * call together with its result instead of walking the array twice.
25
+ */
26
+ static indexResultsByCallId(entries: LLMHistoryEntry[]): Map<string, LLMToolResult>;
27
+ /**
28
+ * A result answers a call only when it comes after it: a result standing
29
+ * before the call it names is as unusable to a provider as one naming no
30
+ * call at all, so the call still counts as unanswered.
31
+ */
32
+ private static collectAnsweredCallIds;
33
+ private static buildUnansweredResult;
34
+ }
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LLMHistoryEntries = void 0;
4
+ const LLMService_typedefs_1 = require("../../LLMService.typedefs");
5
+ const history_constants_1 = require("../../utilities/history/history.constants");
6
+ /**
7
+ * The history invariants every provider mapping relies on, established once
8
+ * here instead of in each provider: a tool call is answered exactly once, a
9
+ * result answers a call that was actually made, and an assistant round that
10
+ * called nothing is not a tool round at all.
11
+ */
12
+ class LLMHistoryEntries {
13
+ static isToolCall(entry) {
14
+ return entry.type === LLMService_typedefs_1.LLMHistoryEntryTypes.ToolCall;
15
+ }
16
+ static isToolResult(entry) {
17
+ return entry.type === LLMService_typedefs_1.LLMHistoryEntryTypes.ToolResult;
18
+ }
19
+ static isContext(entry) {
20
+ return entry.type === LLMService_typedefs_1.LLMHistoryEntryTypes.Context;
21
+ }
22
+ static isMessage(entry) {
23
+ return !LLMHistoryEntries.isToolCall(entry)
24
+ && !LLMHistoryEntries.isToolResult(entry)
25
+ && !LLMHistoryEntries.isContext(entry);
26
+ }
27
+ /**
28
+ * Repairs a restored history into one every provider accepts: an empty tool
29
+ * round is dropped, a result answering no preceding call is dropped, a
30
+ * second result for an already-answered call is dropped, and a call left
31
+ * unanswered gets `LLM_UNANSWERED_TOOL_CALL_RESULT` as a real tool result.
32
+ * Order is preserved; a synthesized result lands directly after the round
33
+ * that needed it.
34
+ */
35
+ static normalize(entries) {
36
+ const answeredCallIds = LLMHistoryEntries.collectAnsweredCallIds(entries);
37
+ const calledIds = new Set();
38
+ const emittedResultIds = new Set();
39
+ return entries.flatMap((entry) => {
40
+ if (LLMHistoryEntries.isToolCall(entry)) {
41
+ if (entry.calls.length === 0) {
42
+ return [];
43
+ }
44
+ entry.calls.forEach((call) => calledIds.add(call.id));
45
+ const unanswered = entry.calls.filter((call) => !answeredCallIds.has(call.id));
46
+ unanswered.forEach((call) => emittedResultIds.add(call.id));
47
+ return [
48
+ entry,
49
+ ...unanswered.map((call) => LLMHistoryEntries.buildUnansweredResult(call.id)),
50
+ ];
51
+ }
52
+ if (!LLMHistoryEntries.isToolResult(entry)) {
53
+ return [entry];
54
+ }
55
+ if (!calledIds.has(entry.toolCallId)
56
+ || emittedResultIds.has(entry.toolCallId)) {
57
+ return [];
58
+ }
59
+ emittedResultIds.add(entry.toolCallId);
60
+ return [entry];
61
+ });
62
+ }
63
+ /**
64
+ * Indexes the repaired history by call id, so a provider mapping emits each
65
+ * call together with its result instead of walking the array twice.
66
+ */
67
+ static indexResultsByCallId(entries) {
68
+ const pairs = entries
69
+ .filter(LLMHistoryEntries.isToolResult)
70
+ .map((entry) => [
71
+ entry.toolCallId,
72
+ entry.result,
73
+ ]);
74
+ return new Map(pairs);
75
+ }
76
+ /**
77
+ * A result answers a call only when it comes after it: a result standing
78
+ * before the call it names is as unusable to a provider as one naming no
79
+ * call at all, so the call still counts as unanswered.
80
+ */
81
+ static collectAnsweredCallIds(entries) {
82
+ const callIndexById = new Map();
83
+ entries.forEach((entry, index) => {
84
+ if (!LLMHistoryEntries.isToolCall(entry)) {
85
+ return;
86
+ }
87
+ entry.calls.forEach((call) => {
88
+ if (!callIndexById.has(call.id)) {
89
+ callIndexById.set(call.id, index);
90
+ }
91
+ });
92
+ });
93
+ const answeredIds = entries.flatMap((entry, index) => {
94
+ if (!LLMHistoryEntries.isToolResult(entry)) {
95
+ return [];
96
+ }
97
+ const callIndex = callIndexById.get(entry.toolCallId);
98
+ return callIndex !== undefined && callIndex < index
99
+ ? [entry.toolCallId]
100
+ : [];
101
+ });
102
+ return new Set(answeredIds);
103
+ }
104
+ static buildUnansweredResult(toolCallId) {
105
+ return {
106
+ type: LLMService_typedefs_1.LLMHistoryEntryTypes.ToolResult,
107
+ toolCallId,
108
+ result: history_constants_1.LLM_UNANSWERED_TOOL_CALL_RESULT,
109
+ };
110
+ }
111
+ }
112
+ exports.LLMHistoryEntries = LLMHistoryEntries;
113
+ //# sourceMappingURL=LLMHistoryEntries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LLMHistoryEntries.js","sourceRoot":"","sources":["../../../src/utilities/history/LLMHistoryEntries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * The result a tool call is replayed with when the restored history holds no
3
+ * result for it. Every provider rejects an assistant tool call that no result
4
+ * answers, so the pairing is repaired natively — as a real tool result — rather
5
+ * than left to the caller to fake in prose.
6
+ */
7
+ export declare const LLM_UNANSWERED_TOOL_CALL_RESULT: string;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LLM_UNANSWERED_TOOL_CALL_RESULT = void 0;
4
+ /**
5
+ * The result a tool call is replayed with when the restored history holds no
6
+ * result for it. Every provider rejects an assistant tool call that no result
7
+ * answers, so the pairing is repaired natively — as a real tool result — rather
8
+ * than left to the caller to fake in prose.
9
+ */
10
+ exports.LLM_UNANSWERED_TOOL_CALL_RESULT = 'No result was recorded for this tool call: the run ended before it'
11
+ + ' completed.';
12
+ //# sourceMappingURL=history.constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.constants.js","sourceRoot":"","sources":["../../../src/utilities/history/history.constants.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACU,QAAA,+BAA+B,GAC1C,oEAAoE;MAClE,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './history.constants';
2
+ export * from './LLMHistoryEntries';
@@ -0,0 +1,19 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./history.constants"), exports);
18
+ __exportStar(require("./LLMHistoryEntries"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utilities/history/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAoC;AACpC,sDAAoC"}
@@ -1,4 +1,5 @@
1
1
  export * from './functional.utils';
2
+ export * from './history';
2
3
  export * from './llmTracing';
3
4
  export * from './promptBuilder';
4
5
  export * from './calculateCosts';
@@ -15,6 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./functional.utils"), exports);
18
+ __exportStar(require("./history"), exports);
18
19
  __exportStar(require("./llmTracing"), exports);
19
20
  __exportStar(require("./promptBuilder"), exports);
20
21
  __exportStar(require("./calculateCosts"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utilities/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,+CAA6B;AAC7B,kDAAgC;AAChC,mDAAiC;AACjC,2CAAyB;AACzB,6CAA2B;AAC3B,2CAAyB;AACzB,mDAAiC;AACjC,0CAAwB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utilities/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,4CAA0B;AAC1B,+CAA6B;AAC7B,kDAAgC;AAChC,mDAAiC;AACjC,2CAAyB;AACzB,6CAA2B;AAC3B,2CAAyB;AACzB,mDAAiC;AACjC,0CAAwB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mate-academy/llm-gateway",
3
- "version": "8.9.0",
3
+ "version": "8.11.0",
4
4
  "description": "A gateway package for LLM services.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",