UNPKG

axiom

Version:

Axiom AI SDK provides - an API to wrap your AI calls with observability instrumentation. - offline evals

137 lines (134 loc) 4.15 kB
// src/schema.ts var SCHEMA_VERSION = "0.0.2"; var SCHEMA_BASE_URL = "https://axiom.co/ai/schemas/"; var SCHEMA_URL = `${SCHEMA_BASE_URL}${SCHEMA_VERSION}`; // src/util/errors.ts function getCircularReplacer() { const seen = /* @__PURE__ */ new WeakSet(); return (_k, v) => { if (typeof v === "object" && v !== null) { if (seen.has(v)) return "[Circular]"; seen.add(v); } return v; }; } function safeJson(x) { try { return JSON.stringify(x, getCircularReplacer()); } catch { return String(x); } } function errorToString(err) { try { if (typeof err === "string") return err; if (err instanceof Error) { return err.stack ?? err.message; } if (typeof err === "object" && err !== null) { const msg = err.message; const json = safeJson(err); return msg ? `${msg} (${json})` : json; } return String(err); } catch { return "[unserializable error]"; } } // src/util/feedback.ts function getSuffix(baseUrl, dataset) { if (baseUrl.includes("edge.axiom")) { return `/v1/ingest/${dataset}`; } return `/v1/datasets/${dataset}/ingest`; } // src/feedback.ts var withKind = (input, kind) => ({ ...input, kind }); var createFeedbackClient = (config, settings) => { const baseUrl = config.url ?? "https://api.axiom.co"; const url = `${baseUrl}${getSuffix(baseUrl, config.dataset)}`; const sendFeedback = async (links, feedback) => { const { metadata, ...feedbackFields } = feedback; const { traceId, spanId, conversationId, ...restLinks } = links; const serializedLinks = { trace_id: traceId, ...restLinks, ...spanId !== void 0 && { span_id: spanId }, ...conversationId !== void 0 && { conversation_id: conversationId } }; const payload = { schemaUrl: SCHEMA_URL, id: crypto.randomUUID(), ...feedbackFields, links: serializedLinks, event: "feedback", ...metadata !== void 0 && { metadata } }; try { const response = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${config.token}` }, body: JSON.stringify(payload) }); if (!response.ok) { const text = await response.text(); settings?.onError?.( new Error(`Failed to send feedback to Axiom: ${response.status} ${text}`), { links, feedback } ); } } catch (error) { const e = error instanceof Error ? error : new Error(errorToString(error)); if (settings?.onError) { settings.onError(e, { links, feedback }); } else { console.error(e); } } }; return { sendFeedback }; }; var thumbFeedback = ({ name, value, message, category, metadata }) => withKind({ name, value: value === "up" ? 1 : -1, message, category, metadata }, "thumb"); var thumbUpFeedback = (input) => thumbFeedback({ ...input, value: "up" }); var thumbDownFeedback = (input) => thumbFeedback({ ...input, value: "down" }); var enumFeedback = (input) => withKind(input, "text"); var numberFeedback = (input) => withKind(input, "number"); var boolFeedback = (input) => withKind(input, "boolean"); var textFeedback = (input) => withKind(input, "text"); var signalFeedback = (input) => withKind({ ...input, value: null }, "signal"); var Feedback = { /** Creates a signal feedback (no value, just indicates an event occurred). */ signal: signalFeedback, /** Creates a number feedback with a number value. */ number: numberFeedback, /** Creates a boolean feedback with a true/false value. */ bool: boolFeedback, /** Creates a text feedback with a free-form string value. */ text: textFeedback, /** Creates a text feedback from a string enum value. */ enum: enumFeedback, /** Creates a thumb feedback with 'up' or 'down' value. */ thumb: thumbFeedback, /** Creates a thumbs up (+1) feedback. */ thumbUp: thumbUpFeedback, /** Creates a thumbs down (-1) feedback. */ thumbDown: thumbDownFeedback }; export { Feedback, createFeedbackClient }; //# sourceMappingURL=feedback.js.map