linkup-sdk
Version:
A Javascript Client SDK for the Linkup API
99 lines • 3.94 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.LinkupClient = void 0;
const axios_1 = __importDefault(require("axios"));
const zod_to_json_schema_1 = __importDefault(require("zod-to-json-schema"));
const errors_1 = require("./errors");
const utils_1 = require("./utils");
class LinkupClient {
USER_AGENT = 'Linkup-JS-SDK/1.0.9';
apiKey;
baseUrl;
endpoint;
constructor(config) {
this.apiKey = config.apiKey;
this.baseUrl = config.baseUrl || 'https://api.linkup.so/v1';
this.endpoint = config.endpoint || '/search';
}
async search(params) {
const headers = {
Authorization: `Bearer ${this.apiKey}`,
};
if (typeof window === 'undefined') {
headers['User-Agent'] = this.USER_AGENT;
}
return axios_1.default
.post(this.endpoint, this.sanitizeParams(params), {
baseURL: this.baseUrl,
headers,
})
.then(response => this.formatResponse(response.data, params.outputType))
.catch(e => {
throw this.refineError(e.response.data);
});
}
sanitizeParams({ query, depth, outputType, includeImages, structuredOutputSchema, includeDomains, excludeDomains, fromDate, toDate, }) {
return {
depth,
outputType,
q: query,
...(includeImages && { includeImages }),
...(includeDomains && { includeDomains }),
...(excludeDomains && { excludeDomains }),
...(fromDate && { fromDate: fromDate.toISOString() }),
...(toDate && { toDate: toDate.toISOString() }),
...(structuredOutputSchema && {
structuredOutputSchema: JSON.stringify((0, utils_1.isZodObject)(structuredOutputSchema)
? (0, zod_to_json_schema_1.default)(structuredOutputSchema)
: structuredOutputSchema),
}),
};
}
formatResponse(searchResponse, outputType) {
switch (outputType) {
case 'sourcedAnswer':
return {
answer: searchResponse.answer,
sources: searchResponse.sources,
};
case 'searchResults':
return {
results: searchResponse.results,
};
// biome-ignore lint/complexity/noUselessSwitchCase: left for exhaustiveness
case 'structured':
default:
return searchResponse;
}
}
refineError(e) {
const { statusCode, error } = e;
const { code, message } = error;
switch (statusCode) {
case 400:
if (code === 'SEARCH_QUERY_NO_RESULT') {
return new errors_1.LinkupNoResultError(message);
}
return new errors_1.LinkupInvalidRequestError((0, utils_1.concatErrorAndDetails)(e));
case 401:
case 403:
return new errors_1.LinkupAuthenticationError(message);
case 429:
switch (code) {
case 'INSUFFICIENT_FUNDS_CREDITS':
return new errors_1.LinkupInsufficientCreditError(message);
case 'TOO_MANY_REQUESTS':
return new errors_1.LinkupTooManyRequestsError(message);
default:
return new errors_1.LinkupUnknownError(`An unknown error occurred: ${error.message}`);
}
default:
return new errors_1.LinkupUnknownError(`An unknown error occurred: ${error.message}`);
}
}
}
exports.LinkupClient = LinkupClient;
//# sourceMappingURL=linkup-client.js.map