lemon-model 1.1.1 → 1.2.1
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 +79 -0
- package/dist/esm/cores/index.js +11 -0
- package/dist/esm/cores/index.js.map +1 -0
- package/dist/esm/cores/transformer.js +91 -0
- package/dist/esm/cores/transformer.js.map +1 -0
- package/dist/esm/genai/dump-test.js +196 -0
- package/dist/esm/genai/dump-test.js.map +1 -0
- package/dist/esm/genai/index.js +15 -0
- package/dist/esm/genai/index.js.map +1 -0
- package/dist/esm/genai/mocks.js +121 -0
- package/dist/esm/genai/mocks.js.map +1 -0
- package/dist/esm/genai/proxy.js +161 -0
- package/dist/esm/genai/proxy.js.map +1 -0
- package/dist/esm/genai/testing.js +12 -0
- package/dist/esm/genai/testing.js.map +1 -0
- package/dist/esm/genai/transport.js +131 -0
- package/dist/esm/genai/transport.js.map +1 -0
- package/dist/esm/genai/types.js +9 -0
- package/dist/esm/genai/types.js.map +1 -0
- package/dist/esm/index.js +15 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/socket/index.js +13 -0
- package/dist/esm/socket/index.js.map +1 -0
- package/dist/esm/socket/socket.js +833 -0
- package/dist/esm/socket/socket.js.map +1 -0
- package/dist/esm/socket/testing.js +12 -0
- package/dist/esm/socket/testing.js.map +1 -0
- package/dist/esm/socket/transport.js +603 -0
- package/dist/esm/socket/transport.js.map +1 -0
- package/dist/esm/socket/types.js +8 -0
- package/dist/esm/socket/types.js.map +1 -0
- package/dist/esm/socket/websocket.js +267 -0
- package/dist/esm/socket/websocket.js.map +1 -0
- package/dist/esm/types/core-storage.js +30 -0
- package/dist/esm/types/core-storage.js.map +1 -0
- package/dist/esm/types/core-types.js +17 -0
- package/dist/esm/types/core-types.js.map +1 -0
- package/dist/esm/types/index.js +13 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/genai/dump-test.d.ts +82 -0
- package/dist/genai/dump-test.js +200 -0
- package/dist/genai/dump-test.js.map +1 -0
- package/dist/genai/index.d.ts +11 -0
- package/dist/genai/index.js +31 -0
- package/dist/genai/index.js.map +1 -0
- package/dist/genai/mocks.d.ts +44 -0
- package/dist/genai/mocks.js +127 -0
- package/dist/genai/mocks.js.map +1 -0
- package/dist/genai/proxy.d.ts +65 -0
- package/dist/genai/proxy.js +165 -0
- package/dist/genai/proxy.js.map +1 -0
- package/dist/genai/testing.d.ts +11 -0
- package/dist/genai/testing.js +28 -0
- package/dist/genai/testing.js.map +1 -0
- package/dist/genai/transport.d.ts +37 -0
- package/dist/genai/transport.js +136 -0
- package/dist/genai/transport.js.map +1 -0
- package/dist/genai/types.d.ts +71 -0
- package/dist/genai/types.js +10 -0
- package/dist/genai/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/proxy/index.d.ts +12 -0
- package/dist/proxy/index.js +29 -0
- package/dist/proxy/index.js.map +1 -0
- package/dist/proxy/proxy.d.ts +75 -0
- package/dist/proxy/proxy.js +198 -0
- package/dist/proxy/proxy.js.map +1 -0
- package/dist/proxy/transport.d.ts +123 -0
- package/dist/proxy/transport.js +401 -0
- package/dist/proxy/transport.js.map +1 -0
- package/dist/proxy/types.d.ts +89 -0
- package/dist/proxy/types.js +12 -0
- package/dist/proxy/types.js.map +1 -0
- package/dist/socket/index.d.ts +9 -0
- package/dist/socket/index.js +29 -0
- package/dist/socket/index.js.map +1 -0
- package/dist/socket/socket.d.ts +191 -0
- package/dist/socket/socket.js +844 -0
- package/dist/socket/socket.js.map +1 -0
- package/dist/socket/testing.d.ts +11 -0
- package/dist/socket/testing.js +28 -0
- package/dist/socket/testing.js.map +1 -0
- package/dist/socket/transport.d.ts +200 -0
- package/dist/socket/transport.js +612 -0
- package/dist/socket/transport.js.map +1 -0
- package/dist/socket/types.d.ts +177 -0
- package/dist/socket/types.js +9 -0
- package/dist/socket/types.js.map +1 -0
- package/dist/socket/websocket.d.ts +89 -0
- package/dist/socket/websocket.js +273 -0
- package/dist/socket/websocket.js.map +1 -0
- package/package.json +26 -2
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `genai/index.ts`
|
|
3
|
+
* - shared GenAI proxy adapter (Gemini-compatible surface over HTTP + JSONTransport) for F/B usage.
|
|
4
|
+
*
|
|
5
|
+
* @origin eureka-agents-api / src/lib/proxy/index.ts
|
|
6
|
+
* @copyright (C) 2026 LemonCloud Co Ltd. - All Rights Reserved.
|
|
7
|
+
*/
|
|
8
|
+
export * from './types';
|
|
9
|
+
export * from './proxy';
|
|
10
|
+
export * from './transport';
|
|
11
|
+
export * from './dump-test';
|
|
@@ -0,0 +1,31 @@
|
|
|
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
|
+
/**
|
|
18
|
+
* `genai/index.ts`
|
|
19
|
+
* - shared GenAI proxy adapter (Gemini-compatible surface over HTTP + JSONTransport) for F/B usage.
|
|
20
|
+
*
|
|
21
|
+
* @origin eureka-agents-api / src/lib/proxy/index.ts
|
|
22
|
+
* @copyright (C) 2026 LemonCloud Co Ltd. - All Rights Reserved.
|
|
23
|
+
*/
|
|
24
|
+
__exportStar(require("./types"), exports);
|
|
25
|
+
__exportStar(require("./proxy"), exports);
|
|
26
|
+
__exportStar(require("./transport"), exports);
|
|
27
|
+
__exportStar(require("./dump-test"), exports);
|
|
28
|
+
//! NOTE: test helpers (`./mocks`) are intentionally NOT re-exported here.
|
|
29
|
+
//! Import them via the isolated `lemon-model/genai/testing` entry so
|
|
30
|
+
//! production (esp. frontend) bundles do not pull in test-only helpers.
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/genai/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;;;;GAMG;AACH,0CAAwB;AACxB,0CAAwB;AACxB,8CAA4B;AAC5B,8CAA4B;AAE5B,0EAA0E;AAC1E,qEAAqE;AACrE,wEAAwE"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `genai/mocks.ts`
|
|
3
|
+
* - Test helpers for exercising `HttpAbstractGenAI` without a live agents API.
|
|
4
|
+
* - `createAgentGenerateFetcher()` routes fetch calls into a controller-like object, and
|
|
5
|
+
* `MockAgentGenerateController` emulates the `/agents/!/generate` `/dump` + transport contract
|
|
6
|
+
* that `eureka-agents-api`'s `AgentAPIController.doPostGenerate()` provides.
|
|
7
|
+
*
|
|
8
|
+
* @origin eureka-agents-api / src/lib/proxy/mocks.ts (+ `/dump` contract distilled from `AgentAPIController` for F/B-neutral tests)
|
|
9
|
+
* @copyright (C) 2026 LemonCloud Co Ltd. - All Rights Reserved.
|
|
10
|
+
*/
|
|
11
|
+
/** minimal controller shape required by `createAgentGenerateFetcher()` */
|
|
12
|
+
export interface AgentGenerateControllerLike {
|
|
13
|
+
doPostGenerate(id: string, param: unknown, body: unknown, ctx: unknown): Promise<unknown>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Create a `fetch` implementation that routes `/agents/:id/generate` calls
|
|
17
|
+
* directly into a controller instance.
|
|
18
|
+
*/
|
|
19
|
+
export declare const createAgentGenerateFetcher: (api: AgentGenerateControllerLike, ctx: unknown) => typeof fetch;
|
|
20
|
+
/** ack subset returned by a transport sender (see `ApiGatewayTransportSendResult` upstream) */
|
|
21
|
+
export interface MockGenerateTransportResult {
|
|
22
|
+
result?: boolean;
|
|
23
|
+
packets?: number;
|
|
24
|
+
[key: string]: unknown;
|
|
25
|
+
}
|
|
26
|
+
/** hook used by `MockAgentGenerateController` to deliver the final payload over a transport */
|
|
27
|
+
export declare type MockGenerateTransportSender = (transportId: string, payload: Record<string, any>) => Promise<MockGenerateTransportResult>;
|
|
28
|
+
/** options for `MockAgentGenerateController` */
|
|
29
|
+
export interface MockAgentGenerateControllerOptions {
|
|
30
|
+
/** sender invoked when the generate request carries a `transportId` query parameter */
|
|
31
|
+
sendTransport?: MockGenerateTransportSender;
|
|
32
|
+
}
|
|
33
|
+
/** build the `/dump` echo payload from an agents generate request body */
|
|
34
|
+
export declare const asDumpedGenerateRequest: (body: any) => Record<string, any>;
|
|
35
|
+
/**
|
|
36
|
+
* In-memory stand-in for `AgentAPIController.doPostGenerate()` covering the `/dump` contract:
|
|
37
|
+
* - without `transportId`, it answers the dumped request as `output.content` JSON.
|
|
38
|
+
* - with `transportId`, it delivers the payload via `sendTransport()` and answers a transport ack.
|
|
39
|
+
*/
|
|
40
|
+
export declare class MockAgentGenerateController implements AgentGenerateControllerLike {
|
|
41
|
+
private readonly options;
|
|
42
|
+
constructor(options?: MockAgentGenerateControllerOptions);
|
|
43
|
+
doPostGenerate(id: string, param: any, body: any, _ctx: unknown): Promise<unknown>;
|
|
44
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `genai/mocks.ts`
|
|
4
|
+
* - Test helpers for exercising `HttpAbstractGenAI` without a live agents API.
|
|
5
|
+
* - `createAgentGenerateFetcher()` routes fetch calls into a controller-like object, and
|
|
6
|
+
* `MockAgentGenerateController` emulates the `/agents/!/generate` `/dump` + transport contract
|
|
7
|
+
* that `eureka-agents-api`'s `AgentAPIController.doPostGenerate()` provides.
|
|
8
|
+
*
|
|
9
|
+
* @origin eureka-agents-api / src/lib/proxy/mocks.ts (+ `/dump` contract distilled from `AgentAPIController` for F/B-neutral tests)
|
|
10
|
+
* @copyright (C) 2026 LemonCloud Co Ltd. - All Rights Reserved.
|
|
11
|
+
*/
|
|
12
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
13
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
14
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
15
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
16
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
17
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
18
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.MockAgentGenerateController = exports.asDumpedGenerateRequest = exports.createAgentGenerateFetcher = void 0;
|
|
23
|
+
/**
|
|
24
|
+
* Create a `fetch` implementation that routes `/agents/:id/generate` calls
|
|
25
|
+
* directly into a controller instance.
|
|
26
|
+
*/
|
|
27
|
+
const createAgentGenerateFetcher = (api, ctx) => ((url, init) => __awaiter(void 0, void 0, void 0, function* () {
|
|
28
|
+
const href = typeof url === 'string' || url instanceof URL ? `${url}` : url.url;
|
|
29
|
+
const parsed = new URL(href, 'http://localhost');
|
|
30
|
+
const matched = parsed.pathname.match(/^\/agents\/(.+)\/generate$/);
|
|
31
|
+
if (!matched) {
|
|
32
|
+
return {
|
|
33
|
+
ok: false,
|
|
34
|
+
status: 404,
|
|
35
|
+
statusText: 'Not Found',
|
|
36
|
+
text: () => __awaiter(void 0, void 0, void 0, function* () { return `unsupported endpoint: ${parsed.pathname}`; }),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
const body = (init === null || init === void 0 ? void 0 : init.body) ? JSON.parse(`${init.body}`) : {};
|
|
40
|
+
try {
|
|
41
|
+
const data = yield api.doPostGenerate(decodeURIComponent(matched[1]), Object.fromEntries(parsed.searchParams.entries()), body, ctx);
|
|
42
|
+
return {
|
|
43
|
+
ok: true,
|
|
44
|
+
status: 200,
|
|
45
|
+
statusText: 'OK',
|
|
46
|
+
json: () => __awaiter(void 0, void 0, void 0, function* () { return data; }),
|
|
47
|
+
text: () => __awaiter(void 0, void 0, void 0, function* () { return JSON.stringify(data); }),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
const text = e instanceof Error ? e.message : `${e}`;
|
|
52
|
+
return {
|
|
53
|
+
ok: false,
|
|
54
|
+
status: 500,
|
|
55
|
+
statusText: 'Internal Server Error',
|
|
56
|
+
text: () => __awaiter(void 0, void 0, void 0, function* () { return text; }),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}));
|
|
60
|
+
exports.createAgentGenerateFetcher = createAgentGenerateFetcher;
|
|
61
|
+
const onlyDefined = (data) => Object.fromEntries(Object.entries(data).filter(([, value]) => value !== undefined));
|
|
62
|
+
/** truncate inlineData payloads to 36 chars like the upstream `/dump` echo */
|
|
63
|
+
const truncateInlineData = (contents) => {
|
|
64
|
+
if (!contents || typeof contents !== 'object')
|
|
65
|
+
return contents;
|
|
66
|
+
if (Array.isArray(contents))
|
|
67
|
+
return contents.map(truncateInlineData);
|
|
68
|
+
const parts = Array.isArray(contents.parts)
|
|
69
|
+
? contents.parts.map((part) => {
|
|
70
|
+
var _a;
|
|
71
|
+
return ((_a = part === null || part === void 0 ? void 0 : part.inlineData) === null || _a === void 0 ? void 0 : _a.data)
|
|
72
|
+
? Object.assign(Object.assign({}, part), { inlineData: Object.assign(Object.assign({}, part.inlineData), { data: `${part.inlineData.data}`.substring(0, 36) }) }) : part;
|
|
73
|
+
})
|
|
74
|
+
: undefined;
|
|
75
|
+
return parts ? Object.assign(Object.assign({}, contents), { parts }) : contents;
|
|
76
|
+
};
|
|
77
|
+
/** build the `/dump` echo payload from an agents generate request body */
|
|
78
|
+
const asDumpedGenerateRequest = (body) => {
|
|
79
|
+
var _a;
|
|
80
|
+
const prompt = body === null || body === void 0 ? void 0 : body.prompt;
|
|
81
|
+
const contents = typeof prompt === 'string' ? prompt : truncateInlineData(prompt === null || prompt === void 0 ? void 0 : prompt.content);
|
|
82
|
+
const config0 = onlyDefined(Object.assign(Object.assign({}, ((_a = body === null || body === void 0 ? void 0 : body.config) !== null && _a !== void 0 ? _a : {})), { systemInstruction: body === null || body === void 0 ? void 0 : body.system }));
|
|
83
|
+
const config = Object.keys(config0).length > 0 ? config0 : undefined;
|
|
84
|
+
const $param = onlyDefined({
|
|
85
|
+
model: body === null || body === void 0 ? void 0 : body.model,
|
|
86
|
+
isImage: (body === null || body === void 0 ? void 0 : body.image) === true ? true : undefined,
|
|
87
|
+
config: body === null || body === void 0 ? void 0 : body.config,
|
|
88
|
+
});
|
|
89
|
+
return onlyDefined({ model: body === null || body === void 0 ? void 0 : body.model, contents, config, $param });
|
|
90
|
+
};
|
|
91
|
+
exports.asDumpedGenerateRequest = asDumpedGenerateRequest;
|
|
92
|
+
/**
|
|
93
|
+
* In-memory stand-in for `AgentAPIController.doPostGenerate()` covering the `/dump` contract:
|
|
94
|
+
* - without `transportId`, it answers the dumped request as `output.content` JSON.
|
|
95
|
+
* - with `transportId`, it delivers the payload via `sendTransport()` and answers a transport ack.
|
|
96
|
+
*/
|
|
97
|
+
class MockAgentGenerateController {
|
|
98
|
+
constructor(options = {}) {
|
|
99
|
+
this.options = options;
|
|
100
|
+
}
|
|
101
|
+
doPostGenerate(id, param, body, _ctx) {
|
|
102
|
+
var _a, _b;
|
|
103
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
104
|
+
if (!id)
|
|
105
|
+
throw new Error(`@id (string) is required - mocks.doPostGenerate`);
|
|
106
|
+
const model = body === null || body === void 0 ? void 0 : body.model;
|
|
107
|
+
const dumped = (0, exports.asDumpedGenerateRequest)(body);
|
|
108
|
+
const $final = { output: { content: JSON.stringify(dumped) }, model };
|
|
109
|
+
const transportId = typeof (param === null || param === void 0 ? void 0 : param.transportId) === 'string' ? param.transportId : '';
|
|
110
|
+
if (!transportId)
|
|
111
|
+
return $final;
|
|
112
|
+
const sender = this.options.sendTransport;
|
|
113
|
+
if (!sender)
|
|
114
|
+
throw new Error(`.sendTransport is required when transportId is set - MockAgentGenerateController`);
|
|
115
|
+
const transport = yield sender(transportId, $final);
|
|
116
|
+
return onlyDefined({
|
|
117
|
+
transport: true,
|
|
118
|
+
transportId,
|
|
119
|
+
sent: (_a = transport.result) !== null && _a !== void 0 ? _a : true,
|
|
120
|
+
packets: (_b = transport.packets) !== null && _b !== void 0 ? _b : 1,
|
|
121
|
+
model,
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
exports.MockAgentGenerateController = MockAgentGenerateController;
|
|
127
|
+
//# sourceMappingURL=mocks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mocks.js","sourceRoot":"","sources":["../../src/genai/mocks.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;;;;;;;;;;AAOH;;;GAGG;AACI,MAAM,0BAA0B,GAAG,CAAC,GAAgC,EAAE,GAAY,EAAgB,EAAE,CACvG,CAAC,CAAO,GAA2B,EAAE,IAAkB,EAAE,EAAE;IACvD,MAAM,IAAI,GAAG,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IAChF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACpE,IAAI,CAAC,OAAO,EAAE;QACV,OAAO;YACH,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,WAAW;YACvB,IAAI,EAAE,GAAS,EAAE,kDAAC,OAAA,yBAAyB,MAAM,CAAC,QAAQ,EAAE,CAAA,GAAA;SACnD,CAAC;KACjB;IAED,MAAM,IAAI,GAAG,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,EAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1D,IAAI;QACA,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,cAAc,CACjC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAC9B,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,EACjD,IAAI,EACJ,GAAG,CACN,CAAC;QACF,OAAO;YACH,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,IAAI;YAChB,IAAI,EAAE,GAAS,EAAE,kDAAC,OAAA,IAAI,CAAA,GAAA;YACtB,IAAI,EAAE,GAAS,EAAE,kDAAC,OAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA,GAAA;SAC7B,CAAC;KACjB;IAAC,OAAO,CAAC,EAAE;QACR,MAAM,IAAI,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QACrD,OAAO;YACH,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,uBAAuB;YACnC,IAAI,EAAE,GAAS,EAAE,kDAAC,OAAA,IAAI,CAAA,GAAA;SACb,CAAC;KACjB;AACL,CAAC,CAAA,CAAiB,CAAC;AAtCV,QAAA,0BAA0B,8BAsChB;AAqBvB,MAAM,WAAW,GAAG,CAAoC,IAAO,EAAK,EAAE,CAClE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAM,CAAC;AAE7F,8EAA8E;AAC9E,MAAM,kBAAkB,GAAG,CAAC,QAAa,EAAO,EAAE;IAC9C,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC/D,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QACvC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE;;YAC7B,OAAA,CAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,0CAAE,IAAI;gBAClB,CAAC,iCAAM,IAAI,KAAE,UAAU,kCAAO,IAAI,CAAC,UAAU,KAAE,IAAI,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,OAC/F,CAAC,CAAC,IAAI,CAAA;SAAA,CACb;QACH,CAAC,CAAC,SAAS,CAAC;IAChB,OAAO,KAAK,CAAC,CAAC,iCAAM,QAAQ,KAAE,KAAK,IAAG,CAAC,CAAC,QAAQ,CAAC;AACrD,CAAC,CAAC;AAEF,0EAA0E;AACnE,MAAM,uBAAuB,GAAG,CAAC,IAAS,EAAuB,EAAE;;IACtE,MAAM,MAAM,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,CAAC;IAC5B,MAAM,QAAQ,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,CAAC,CAAC;IAC3F,MAAM,OAAO,GAAG,WAAW,iCAAM,CAAC,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,mCAAI,EAAE,CAAC,KAAE,iBAAiB,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,IAAG,CAAC;IAC1F,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,MAAM,MAAM,GAAG,WAAW,CAAC;QACvB,KAAK,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK;QAClB,OAAO,EAAE,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,MAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;QAChD,MAAM,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM;KACvB,CAAC,CAAC;IACH,OAAO,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AACzE,CAAC,CAAC;AAXW,QAAA,uBAAuB,2BAWlC;AAEF;;;;GAIG;AACH,MAAa,2BAA2B;IACpC,YAAoC,UAA8C,EAAE;QAAhD,YAAO,GAAP,OAAO,CAAyC;IAAG,CAAC;IAE3E,cAAc,CAAC,EAAU,EAAE,KAAU,EAAE,IAAS,EAAE,IAAa;;;YACxE,IAAI,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;YAC5E,MAAM,KAAK,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,CAAC;YAC1B,MAAM,MAAM,GAAG,IAAA,+BAAuB,EAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;YAEtE,MAAM,WAAW,GAAG,OAAO,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,WAAW,CAAA,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;YACpF,IAAI,CAAC,WAAW;gBAAE,OAAO,MAAM,CAAC;YAEhC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;YAC1C,IAAI,CAAC,MAAM;gBACP,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAC;YACxG,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACpD,OAAO,WAAW,CAAC;gBACf,SAAS,EAAE,IAAI;gBACf,WAAW;gBACX,IAAI,EAAE,MAAA,SAAS,CAAC,MAAM,mCAAI,IAAI;gBAC9B,OAAO,EAAE,MAAA,SAAS,CAAC,OAAO,mCAAI,CAAC;gBAC/B,KAAK;aACR,CAAC,CAAC;;KACN;CACJ;AAxBD,kEAwBC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `genai/proxy.ts`
|
|
3
|
+
* - HTTP-backed Gemini-compatible `AbstractGenAI` adapter.
|
|
4
|
+
* - works in server and browser runtimes by relying only on the standard `fetch` API.
|
|
5
|
+
*
|
|
6
|
+
* @origin eureka-agents-api / src/lib/proxy/proxy.ts
|
|
7
|
+
* @copyright (C) 2026 LemonCloud Co Ltd. - All Rights Reserved.
|
|
8
|
+
*/
|
|
9
|
+
import { ProxyGenAI, ProxyGenAIConfig, ProxyGenAIContents, ProxyGenAIGenerateContentParams, ProxyGenAIGenerateContentResponse, ProxyTransportReceiver } from './types';
|
|
10
|
+
/** options for wiring `HttpAbstractGenAI` to an agents generate endpoint */
|
|
11
|
+
export interface HttpAbstractGenAIOptions {
|
|
12
|
+
/** extra HTTP request headers */
|
|
13
|
+
headers?: Record<string, string>;
|
|
14
|
+
/** fetch override for tests, browsers, or custom runtimes */
|
|
15
|
+
fetch?: typeof fetch;
|
|
16
|
+
/** optional WebSocket/API Gateway transport connection id */
|
|
17
|
+
transportId?: string;
|
|
18
|
+
/** receiver used when the final response is delivered through JSONTransport */
|
|
19
|
+
transport?: ProxyTransportReceiver;
|
|
20
|
+
}
|
|
21
|
+
interface AgentGenerateBody {
|
|
22
|
+
model: string;
|
|
23
|
+
prompt?: string | {
|
|
24
|
+
type?: string;
|
|
25
|
+
content: ProxyGenAIContents;
|
|
26
|
+
};
|
|
27
|
+
system?: string;
|
|
28
|
+
image?: boolean;
|
|
29
|
+
config?: ProxyGenAIConfig;
|
|
30
|
+
}
|
|
31
|
+
export declare const $gemini: {
|
|
32
|
+
/**
|
|
33
|
+
* Convert common agents `GenAIResponse` shapes back into Gemini-like
|
|
34
|
+
* `models.generateContent()` response shape.
|
|
35
|
+
*/
|
|
36
|
+
asGenerateContentResponse(data: any): ProxyGenAIGenerateContentResponse;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* HTTP-backed Gemini-compatible `AbstractGenAI` adapter.
|
|
40
|
+
*
|
|
41
|
+
* It works in server and browser runtimes by relying only on the standard `fetch` API.
|
|
42
|
+
* When `transportId` is configured, HTTP is used only to trigger generation and the
|
|
43
|
+
* final response is collected from the configured transport receiver.
|
|
44
|
+
*/
|
|
45
|
+
export declare class HttpAbstractGenAI implements ProxyGenAI {
|
|
46
|
+
protected readonly endpoint: string;
|
|
47
|
+
/** captured raw generateContent params, useful in specs and diagnostics */
|
|
48
|
+
calls: ProxyGenAIGenerateContentParams[];
|
|
49
|
+
protected readonly fetcher: typeof fetch;
|
|
50
|
+
protected readonly headers: Record<string, string>;
|
|
51
|
+
protected readonly transportId?: string;
|
|
52
|
+
protected readonly transport?: ProxyTransportReceiver;
|
|
53
|
+
constructor(endpoint: string, options?: HttpAbstractGenAIOptions);
|
|
54
|
+
readonly models: {
|
|
55
|
+
generateContent: (params: ProxyGenAIGenerateContentParams) => Promise<ProxyGenAIGenerateContentResponse>;
|
|
56
|
+
};
|
|
57
|
+
protected waitTransport(task: () => Promise<unknown>): Promise<object>;
|
|
58
|
+
protected asEndpoint(): string;
|
|
59
|
+
protected asAgentGenerateBody(params: ProxyGenAIGenerateContentParams): AgentGenerateBody;
|
|
60
|
+
protected withoutSystemInstruction(config?: ProxyGenAIConfig): ProxyGenAIConfig | undefined;
|
|
61
|
+
protected asPrompt(contents: ProxyGenAIContents): AgentGenerateBody['prompt'];
|
|
62
|
+
protected isImageRequest(params: ProxyGenAIGenerateContentParams): boolean | undefined;
|
|
63
|
+
private hasInlineData;
|
|
64
|
+
}
|
|
65
|
+
export {};
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
12
|
+
var t = {};
|
|
13
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
14
|
+
t[p] = s[p];
|
|
15
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
16
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
17
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
18
|
+
t[p[i]] = s[p[i]];
|
|
19
|
+
}
|
|
20
|
+
return t;
|
|
21
|
+
};
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.HttpAbstractGenAI = exports.$gemini = void 0;
|
|
24
|
+
const asDataUrl = (data) => {
|
|
25
|
+
const matched = data.match(/^data:(.*?);base64,(.*)$/);
|
|
26
|
+
return matched ? { mimeType: matched[1] || 'image/png', data: matched[2] || '' } : undefined;
|
|
27
|
+
};
|
|
28
|
+
const onlyDefined = (data) => Object.fromEntries(Object.entries(data).filter(([, value]) => value !== undefined));
|
|
29
|
+
const callFetch = (fetcher, input, init) => fetcher.call(globalThis, input, init);
|
|
30
|
+
exports.$gemini = {
|
|
31
|
+
/**
|
|
32
|
+
* Convert common agents `GenAIResponse` shapes back into Gemini-like
|
|
33
|
+
* `models.generateContent()` response shape.
|
|
34
|
+
*/
|
|
35
|
+
asGenerateContentResponse(data) {
|
|
36
|
+
var _a, _b;
|
|
37
|
+
const content = (_a = data === null || data === void 0 ? void 0 : data.output) === null || _a === void 0 ? void 0 : _a.content;
|
|
38
|
+
const dataUrl = content && typeof content === 'object' ? content === null || content === void 0 ? void 0 : content.data : undefined;
|
|
39
|
+
const matched = typeof dataUrl === 'string' ? asDataUrl(dataUrl) : undefined;
|
|
40
|
+
const text = typeof content === 'string' ? content : typeof dataUrl === 'string' && !matched ? dataUrl : '';
|
|
41
|
+
const candidate = (_b = data === null || data === void 0 ? void 0 : data.candidate) !== null && _b !== void 0 ? _b : (matched
|
|
42
|
+
? {
|
|
43
|
+
content: {
|
|
44
|
+
parts: [
|
|
45
|
+
{
|
|
46
|
+
inlineData: {
|
|
47
|
+
mimeType: matched.mimeType,
|
|
48
|
+
data: matched.data,
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
}
|
|
54
|
+
: text
|
|
55
|
+
? {
|
|
56
|
+
content: {
|
|
57
|
+
parts: [{ text }],
|
|
58
|
+
},
|
|
59
|
+
}
|
|
60
|
+
: undefined);
|
|
61
|
+
return onlyDefined({
|
|
62
|
+
text,
|
|
63
|
+
candidates: candidate ? [candidate] : undefined,
|
|
64
|
+
usageMetadata: (data === null || data === void 0 ? void 0 : data.usage)
|
|
65
|
+
? onlyDefined({
|
|
66
|
+
promptTokenCount: data.usage.promptToken,
|
|
67
|
+
thoughtsTokenCount: data.usage.completionToken,
|
|
68
|
+
totalTokenCount: data.usage.totalToken,
|
|
69
|
+
})
|
|
70
|
+
: undefined,
|
|
71
|
+
});
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* HTTP-backed Gemini-compatible `AbstractGenAI` adapter.
|
|
76
|
+
*
|
|
77
|
+
* It works in server and browser runtimes by relying only on the standard `fetch` API.
|
|
78
|
+
* When `transportId` is configured, HTTP is used only to trigger generation and the
|
|
79
|
+
* final response is collected from the configured transport receiver.
|
|
80
|
+
*/
|
|
81
|
+
class HttpAbstractGenAI {
|
|
82
|
+
constructor(endpoint, options = {}) {
|
|
83
|
+
var _a, _b;
|
|
84
|
+
this.endpoint = endpoint;
|
|
85
|
+
/** captured raw generateContent params, useful in specs and diagnostics */
|
|
86
|
+
this.calls = [];
|
|
87
|
+
this.models = {
|
|
88
|
+
generateContent: (params) => __awaiter(this, void 0, void 0, function* () {
|
|
89
|
+
this.calls.push(params);
|
|
90
|
+
const task = () => __awaiter(this, void 0, void 0, function* () {
|
|
91
|
+
const response = yield callFetch(this.fetcher, this.asEndpoint(), {
|
|
92
|
+
method: 'POST',
|
|
93
|
+
headers: Object.assign({ 'content-type': 'application/json' }, this.headers),
|
|
94
|
+
body: JSON.stringify(this.asAgentGenerateBody(params)),
|
|
95
|
+
});
|
|
96
|
+
if (!response.ok) {
|
|
97
|
+
const text = yield response.text().catch(() => '');
|
|
98
|
+
throw new Error(`HTTP ${response.status} ${response.statusText}`.trim() + (text ? ` - ${text}` : ''));
|
|
99
|
+
}
|
|
100
|
+
return response.json();
|
|
101
|
+
});
|
|
102
|
+
const data = this.transportId ? yield this.waitTransport(task) : yield task();
|
|
103
|
+
return exports.$gemini.asGenerateContentResponse(data);
|
|
104
|
+
}),
|
|
105
|
+
};
|
|
106
|
+
//! NOTE: property access (not bare `fetch`) so runtimes w/o global fetch fail at call time, not construction.
|
|
107
|
+
this.fetcher = (_a = options.fetch) !== null && _a !== void 0 ? _a : globalThis.fetch;
|
|
108
|
+
this.headers = (_b = options.headers) !== null && _b !== void 0 ? _b : {};
|
|
109
|
+
this.transportId = options.transportId;
|
|
110
|
+
this.transport = options.transport;
|
|
111
|
+
}
|
|
112
|
+
waitTransport(task) {
|
|
113
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
114
|
+
if (!this.transport)
|
|
115
|
+
throw new Error(`@transport is required when transportId is set - HttpAbstractGenAI`);
|
|
116
|
+
return this.transport.wait(this.transportId, task);
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
asEndpoint() {
|
|
120
|
+
if (!this.transportId)
|
|
121
|
+
return this.endpoint;
|
|
122
|
+
const url = new URL(this.endpoint, 'http://localhost');
|
|
123
|
+
url.searchParams.set('transportId', this.transportId);
|
|
124
|
+
if (/^https?:\/\//.test(this.endpoint))
|
|
125
|
+
return url.toString();
|
|
126
|
+
return `${url.pathname}${url.search}${url.hash}`;
|
|
127
|
+
}
|
|
128
|
+
asAgentGenerateBody(params) {
|
|
129
|
+
var _a;
|
|
130
|
+
const config = this.withoutSystemInstruction(params.config);
|
|
131
|
+
const system = (_a = params.config) === null || _a === void 0 ? void 0 : _a.systemInstruction;
|
|
132
|
+
return {
|
|
133
|
+
model: params.model,
|
|
134
|
+
prompt: this.asPrompt(params.contents),
|
|
135
|
+
system,
|
|
136
|
+
image: this.isImageRequest(params),
|
|
137
|
+
config,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
withoutSystemInstruction(config) {
|
|
141
|
+
if (!config)
|
|
142
|
+
return undefined;
|
|
143
|
+
const { systemInstruction } = config, rest = __rest(config, ["systemInstruction"]);
|
|
144
|
+
return Object.keys(rest).length > 0 ? rest : undefined;
|
|
145
|
+
}
|
|
146
|
+
asPrompt(contents) {
|
|
147
|
+
if (typeof contents === 'string')
|
|
148
|
+
return contents;
|
|
149
|
+
return { type: 'user', content: contents };
|
|
150
|
+
}
|
|
151
|
+
isImageRequest(params) {
|
|
152
|
+
var _a, _b;
|
|
153
|
+
const modalities = (_b = (_a = params.config) === null || _a === void 0 ? void 0 : _a.responseModalities) !== null && _b !== void 0 ? _b : [];
|
|
154
|
+
const hasImageModality = modalities.some(modality => `${modality}`.toUpperCase() === 'IMAGE');
|
|
155
|
+
const hasInlineImage = this.hasInlineData(params.contents);
|
|
156
|
+
const imageModel = params.model.includes('image') || params.model.includes('imagen');
|
|
157
|
+
return hasImageModality || hasInlineImage || imageModel ? true : undefined;
|
|
158
|
+
}
|
|
159
|
+
hasInlineData(contents) {
|
|
160
|
+
const list = Array.isArray(contents) ? contents : [contents];
|
|
161
|
+
return list.some(content => { var _a; return typeof content !== 'string' && ((_a = content.parts) === null || _a === void 0 ? void 0 : _a.some(part => !!part.inlineData)); });
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
exports.HttpAbstractGenAI = HttpAbstractGenAI;
|
|
165
|
+
//# sourceMappingURL=proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/genai/proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `genai/testing.ts`
|
|
3
|
+
* - isolated entry for GenAI proxy test helpers (fetch routing + `/dump` contract mocks).
|
|
4
|
+
* - kept OUT of the package root barrel so production bundles do not include test helpers.
|
|
5
|
+
*
|
|
6
|
+
* Usage (tests / dev only):
|
|
7
|
+
* import { createAgentGenerateFetcher, MockAgentGenerateController } from 'lemon-model/genai/testing';
|
|
8
|
+
*
|
|
9
|
+
* @copyright (C) 2026 LemonCloud Co Ltd. - All Rights Reserved.
|
|
10
|
+
*/
|
|
11
|
+
export * from './mocks';
|
|
@@ -0,0 +1,28 @@
|
|
|
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
|
+
/**
|
|
18
|
+
* `genai/testing.ts`
|
|
19
|
+
* - isolated entry for GenAI proxy test helpers (fetch routing + `/dump` contract mocks).
|
|
20
|
+
* - kept OUT of the package root barrel so production bundles do not include test helpers.
|
|
21
|
+
*
|
|
22
|
+
* Usage (tests / dev only):
|
|
23
|
+
* import { createAgentGenerateFetcher, MockAgentGenerateController } from 'lemon-model/genai/testing';
|
|
24
|
+
*
|
|
25
|
+
* @copyright (C) 2026 LemonCloud Co Ltd. - All Rights Reserved.
|
|
26
|
+
*/
|
|
27
|
+
__exportStar(require("./mocks"), exports);
|
|
28
|
+
//# sourceMappingURL=testing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/genai/testing.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;;;;;;;GASG;AACH,0CAAwB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `genai/transport.ts`
|
|
3
|
+
* - JSONTransport-backed receiver for collecting GenAI generate results over `NetworkSupportable`.
|
|
4
|
+
* - the generic WebSocket → `NetworkSupportable` bridge lives in the shared socket core (`../socket/websocket`).
|
|
5
|
+
*
|
|
6
|
+
* @origin eureka-agents-api / src/lib/proxy/transport.ts (receiver parts; the WebSocket bridge was extracted into `../socket/websocket`)
|
|
7
|
+
* @copyright (C) 2026 LemonCloud Co Ltd. - All Rights Reserved.
|
|
8
|
+
*/
|
|
9
|
+
import { JSONTransportOptions } from '../socket/transport';
|
|
10
|
+
import { NetworkSupportable } from '../socket/types';
|
|
11
|
+
import { ProxyTransportReceiver } from './types';
|
|
12
|
+
/** options for receiving a single JSONTransport response */
|
|
13
|
+
export interface ProxyTransportReceiverOptions<T extends object = object> {
|
|
14
|
+
timeoutMs?: number;
|
|
15
|
+
jsonTransport?: JSONTransportOptions;
|
|
16
|
+
validate?: (data: T) => boolean;
|
|
17
|
+
}
|
|
18
|
+
/** JSONTransport-backed receiver used by `HttpAbstractGenAI` transport mode */
|
|
19
|
+
export declare class JSONProxyTransportReceiver<T extends object = object> implements ProxyTransportReceiver<T> {
|
|
20
|
+
private readonly network;
|
|
21
|
+
private readonly options;
|
|
22
|
+
private readonly transport;
|
|
23
|
+
private pending?;
|
|
24
|
+
constructor(network: NetworkSupportable, options?: ProxyTransportReceiverOptions<T>);
|
|
25
|
+
/**
|
|
26
|
+
* Run an HTTP trigger task and resolve with the next complete JSONTransport payload.
|
|
27
|
+
*
|
|
28
|
+
* Only one pending wait is supported per receiver instance.
|
|
29
|
+
*/
|
|
30
|
+
wait(transportId: string, task: () => Promise<unknown>): Promise<T>;
|
|
31
|
+
/** detach listeners and reject an in-flight wait */
|
|
32
|
+
detach(): void;
|
|
33
|
+
private resolve;
|
|
34
|
+
private reject;
|
|
35
|
+
}
|
|
36
|
+
/** create a receiver that filters raw network packets down to JSONTransport frames */
|
|
37
|
+
export declare const createProxyTransportReceiver: <T extends object = object>(network: NetworkSupportable, options?: ProxyTransportReceiverOptions<T>) => JSONProxyTransportReceiver<T>;
|