@aigne/core 0.4.209 → 0.4.210

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.
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FETCH_TIMEOUT = void 0;
4
+ exports.FETCH_TIMEOUT = Number(process.env.FETCH_TIMEOUT) || 30000;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchOpenApi = void 0;
4
+ const ufo_1 = require("ufo");
5
+ const constants_1 = require("./constants");
6
+ const fetch_1 = require("./fetch");
7
+ const fetchOpenApi = async (request) => {
8
+ const cookie = request.cookies
9
+ ? Object.entries(request.cookies)
10
+ .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
11
+ .join('; ')
12
+ .trim()
13
+ : undefined;
14
+ const controller = new AbortController();
15
+ const abortTimer = setTimeout(() => controller.abort(), constants_1.FETCH_TIMEOUT);
16
+ const response = await fetch((0, ufo_1.withQuery)(request.url, request.query ?? {}), {
17
+ method: request.method,
18
+ headers: {
19
+ 'Content-Type': 'application/json',
20
+ ...request.headers,
21
+ ...(cookie && { cookie }),
22
+ },
23
+ body: request.method.toLowerCase() !== 'get' && request.body ? JSON.stringify(request.body) : undefined,
24
+ credentials: request.cookies ? 'include' : 'same-origin',
25
+ signal: controller.signal,
26
+ }).finally(() => clearTimeout(abortTimer));
27
+ await (0, fetch_1.checkFetchResponse)(response);
28
+ return response.json();
29
+ };
30
+ exports.fetchOpenApi = fetchOpenApi;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkFetchResponse = checkFetchResponse;
4
+ async function checkFetchResponse(result) {
5
+ if (!result.ok) {
6
+ let message;
7
+ try {
8
+ const json = await result.json();
9
+ const msg = json.error?.message || json.message;
10
+ if (msg && typeof msg === 'string') {
11
+ message = msg;
12
+ }
13
+ }
14
+ catch {
15
+ // ignore
16
+ }
17
+ throw new Error(message || `Failed to fetch url ${result.url} with status ${result.status}`);
18
+ }
19
+ return result;
20
+ }
@@ -14,10 +14,13 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./fetch"), exports);
18
+ __exportStar(require("./fetch-open-api"), exports);
17
19
  __exportStar(require("./is-non-nullable"), exports);
18
20
  __exportStar(require("./mustache-utils"), exports);
19
21
  __exportStar(require("./nullable"), exports);
20
22
  __exportStar(require("./omit"), exports);
23
+ __exportStar(require("./open-api-parameter"), exports);
21
24
  __exportStar(require("./ordered-map"), exports);
22
25
  __exportStar(require("./stream-utils"), exports);
23
26
  __exportStar(require("./union"), exports);
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.formatOpenAPIRequest = formatOpenAPIRequest;
7
+ const lodash_1 = require("lodash");
8
+ const logger_1 = __importDefault(require("../logger"));
9
+ const ordered_map_1 = require("./ordered-map");
10
+ async function formatOpenAPIRequest(api, inputs, input) {
11
+ const { url, method, ...inputParams } = processParameters(api, inputs, input);
12
+ logger_1.default.debug('inputParams', inputParams);
13
+ const authParams = await getAuthParams(api.auth);
14
+ logger_1.default.debug('authParams', authParams);
15
+ return {
16
+ url,
17
+ method,
18
+ ...(0, lodash_1.omitBy)({
19
+ ...inputParams,
20
+ query: { ...inputParams.query, ...authParams.query },
21
+ cookies: { ...inputParams.cookies, ...authParams.cookies },
22
+ headers: { ...inputParams.headers, ...authParams.headers },
23
+ }, (i) => (0, lodash_1.isEmpty)(i)),
24
+ };
25
+ }
26
+ async function getAuthParams(auth) {
27
+ if (!auth)
28
+ return {};
29
+ if (auth.type === 'custom') {
30
+ return await auth.getValue();
31
+ }
32
+ const { type, key, token } = auth;
33
+ switch (auth.in) {
34
+ case 'query':
35
+ return { query: { [key || 'token']: token } };
36
+ case 'cookie':
37
+ return { cookies: { [key || 'token']: token } };
38
+ default: {
39
+ const prefix = type === 'bearer' ? 'Bearer ' : type === 'basic' ? 'Basic ' : '';
40
+ return { headers: { [key || 'Authorization']: `${prefix}${token}` } };
41
+ }
42
+ }
43
+ }
44
+ function processParameters(api, inputs, input) {
45
+ const result = {
46
+ url: api.url,
47
+ method: api.method,
48
+ headers: {},
49
+ query: {},
50
+ cookies: {},
51
+ body: {},
52
+ };
53
+ Object.entries(input).forEach(([key, value]) => {
54
+ const schema = ordered_map_1.OrderedRecord.find(inputs, (x) => x.name === key);
55
+ if (!schema)
56
+ return;
57
+ switch (schema.in) {
58
+ case 'query':
59
+ result.query[key] = value;
60
+ break;
61
+ case 'header':
62
+ result.headers[key] = value;
63
+ break;
64
+ case 'cookie':
65
+ result.cookies[key] = value;
66
+ break;
67
+ case 'body':
68
+ result.body[key] = value;
69
+ break;
70
+ case 'path':
71
+ result.url = result.url.replace(`{${key}}`, String(value));
72
+ break;
73
+ default:
74
+ // 没有指定 in 的情况
75
+ if (result.method.toLowerCase() === 'get') {
76
+ result.query[key] = value;
77
+ }
78
+ else {
79
+ result.body[key] = value;
80
+ }
81
+ }
82
+ });
83
+ return result;
84
+ }
@@ -1,5 +1,5 @@
1
1
  import { nanoid } from 'nanoid';
2
- import { OrderedRecord } from '../utils';
2
+ import { OrderedRecord } from '../utils/ordered-map';
3
3
  export function schemaToDataType(dataType) {
4
4
  return OrderedRecord.fromArray(Object.entries(dataType).map(([name, schema]) => {
5
5
  const base = {
@@ -0,0 +1 @@
1
+ export {};
package/lib/esm/index.js CHANGED
@@ -2,6 +2,8 @@ export * from './utils';
2
2
  export * from './constants';
3
3
  export * from './definitions/data-type';
4
4
  export * from './definitions/data-type-schema';
5
+ export * from './definitions/open-api';
6
+ export * from './definitions/memory';
5
7
  export * from './context';
6
8
  export * from './runnable';
7
9
  export * from './agent';
@@ -12,4 +14,5 @@ export * from './function-agent';
12
14
  export * from './function-runner';
13
15
  export * from './llm-decision-agent';
14
16
  export * from './local-function-agent';
17
+ export * from './open-api-agent';
15
18
  export * from './memorable';
@@ -0,0 +1,59 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { nanoid } from 'nanoid';
14
+ import { inject, injectable } from 'tsyringe';
15
+ import { Agent } from './agent';
16
+ import { TYPES } from './constants';
17
+ import { schemaToDataType } from './definitions/data-type-schema';
18
+ import { fetchOpenApi } from './utils/fetch-open-api';
19
+ import { formatOpenAPIRequest } from './utils/open-api-parameter';
20
+ let OpenAPIAgent = class OpenAPIAgent extends Agent {
21
+ definition;
22
+ static create = create;
23
+ constructor(definition, context) {
24
+ super(definition, context);
25
+ this.definition = definition;
26
+ }
27
+ async process(input) {
28
+ const { url, method = 'get', auth, inputs } = this.definition;
29
+ if (!url)
30
+ throw new Error('API url is required');
31
+ const request = await formatOpenAPIRequest({ url, method, auth }, inputs, input);
32
+ return this.fetch(request);
33
+ }
34
+ fetch(request) {
35
+ return fetchOpenApi(request);
36
+ }
37
+ };
38
+ OpenAPIAgent = __decorate([
39
+ injectable(),
40
+ __param(0, inject(TYPES.definition)),
41
+ __param(1, inject(TYPES.context)),
42
+ __metadata("design:paramtypes", [Object, Object])
43
+ ], OpenAPIAgent);
44
+ export { OpenAPIAgent };
45
+ function create({ context, ...options }) {
46
+ const agentId = options.id || options.name || nanoid();
47
+ const inputs = schemaToDataType(options.inputs);
48
+ const outputs = schemaToDataType(options.outputs);
49
+ return new OpenAPIAgent({
50
+ id: agentId,
51
+ name: options.name,
52
+ type: 'open_api_agent',
53
+ inputs,
54
+ outputs,
55
+ url: options.url,
56
+ method: options.method,
57
+ auth: options.auth,
58
+ }, context);
59
+ }