@arizeai/phoenix-client
Version:
A client for the Phoenix API
120 lines • 5.37 kB
JavaScript
;
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