UNPKG

@arizeai/phoenix-client

Version:
120 lines 5.37 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.createClient = exports.getMergedOptions = exports.PHOENIX_SERVER_VERSION_HEADER = void 0; const openapi_fetch_1 = __importDefault(require("openapi-fetch")); const config_1 = require("./config"); const semverUtils_1 = require("./utils/semverUtils"); /** * The HTTP response header that carries the Phoenix server version string. */ exports.PHOENIX_SERVER_VERSION_HEADER = "x-phoenix-server-version"; /** * Merge all configuration options according to priority: * defaults < environment < explicit options * * Headers are simply replaced, not merged. * * You can call this function before instantiating the client if you need to retain access * to the options that were passed in to the client. */ const getMergedOptions = ({ options = {}, getEnvironmentOptions = config_1.defaultGetEnvironmentOptions, } = {}) => { const defaultOptions = (0, config_1.makeDefaultClientOptions)(); const environmentOptions = getEnvironmentOptions(); return Object.assign(Object.assign(Object.assign({}, defaultOptions), environmentOptions), options); }; exports.getMergedOptions = getMergedOptions; /** * Middleware to take non-successful API calls throw instead of being swallowed */ const middleware = { onResponse({ response }) { if (!response.ok) { // Will produce error messages like "https://example.org/api/v1/example: 404 Not Found". throw new Error(`${response.url}: ${response.status} ${response.statusText}`); } }, }; /** * Create a Phoenix client. * * The client is strongly typed and uses generated openapi types. * * @example * ```ts * import { createClient } from "@arize/phoenix-client"; * * const client = createClient(); * * const response = await client.GET("/v1/traces"); * // ^ path string is strongly typed, and completion works with autocomplete * // path parameters, query parameters, and request body are also strongly typed based on the openapi spec, * // the path, and the method. * ``` * * @param config - The configuration to use for the client. * @param config.options - The options to use for [openapi-fetch.createOpenApiClient](https://github.com/openapi-ts/openapi-typescript/tree/main/packages/openapi-fetch). * @param config.getEnvironmentOptions - The function to use to get the environment options. By default, a function that * returns `process.env` is used. * @returns The Phoenix client as a strongly typed [openapi-fetch](https://github.com/openapi-ts/openapi-typescript/tree/main/packages/openapi-fetch) client. */ const createClient = (config = {}) => { const mergedOptions = (0, exports.getMergedOptions)(config); const openApiClient = (0, openapi_fetch_1.default)(mergedOptions); // Lazily populated by versionMiddleware from the x-phoenix-server-version // response header on the first successful API call. Read via getServerVersion(). let serverVersion; const versionMiddleware = { onResponse({ response }) { if (serverVersion === undefined) { const header = response.headers.get(exports.PHOENIX_SERVER_VERSION_HEADER); if (header) { serverVersion = (0, semverUtils_1.parseSemanticVersion)(header); } } }, }; openApiClient.use(versionMiddleware); openApiClient.use(middleware); return Object.assign(Object.assign({}, openApiClient), { config: mergedOptions, /** * Get the Phoenix server version, returning a cached value if available. * * The version is first populated from the `x-phoenix-server-version` * response header on any API call. If no version has been seen yet, * this method fetches `GET /arize_phoenix_version` to populate the cache. * * @throws {Error} If the server version cannot be determined (e.g. the * server is unreachable or returned an unparseable version string). */ getServerVersion: async () => { var _a; if (serverVersion != null) return serverVersion; try { const baseUrl = (_a = mergedOptions.baseUrl) !== null && _a !== void 0 ? _a : ""; const headers = mergedOptions.headers ? Object.assign({}, mergedOptions.headers) : {}; const resp = await fetch(`${baseUrl}/arize_phoenix_version`, { headers, }); if (resp.ok) { const text = await resp.text(); const parsed = (0, semverUtils_1.parseSemanticVersion)(text); if (parsed) { serverVersion = parsed; return serverVersion; } } } catch (_b) { // fall through to throw below } throw new Error("Phoenix server version could not be determined. " + "Please ensure you are connecting to a supported Phoenix server."); } }); }; exports.createClient = createClient; //# sourceMappingURL=client.js.map