@posthog/ai 8.10.2 → 8.10.3

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.
Files changed (39) hide show
  1. package/LICENSE +64 -0
  2. package/dist/adk/index.cjs +1 -1
  3. package/dist/adk/index.cjs.map +1 -1
  4. package/dist/adk/index.mjs +1 -1
  5. package/dist/adk/index.mjs.map +1 -1
  6. package/dist/anthropic/index.cjs +1 -1
  7. package/dist/anthropic/index.cjs.map +1 -1
  8. package/dist/anthropic/index.mjs +1 -1
  9. package/dist/anthropic/index.mjs.map +1 -1
  10. package/dist/gemini/index.cjs +1 -1
  11. package/dist/gemini/index.cjs.map +1 -1
  12. package/dist/gemini/index.mjs +1 -1
  13. package/dist/gemini/index.mjs.map +1 -1
  14. package/dist/index.cjs +37 -13
  15. package/dist/index.cjs.map +1 -1
  16. package/dist/index.d.ts +1 -0
  17. package/dist/index.mjs +37 -13
  18. package/dist/index.mjs.map +1 -1
  19. package/dist/langchain/index.cjs +1 -1
  20. package/dist/langchain/index.cjs.map +1 -1
  21. package/dist/langchain/index.mjs +1 -1
  22. package/dist/langchain/index.mjs.map +1 -1
  23. package/dist/langchain/middleware/index.cjs +1 -1
  24. package/dist/langchain/middleware/index.cjs.map +1 -1
  25. package/dist/langchain/middleware/index.mjs +1 -1
  26. package/dist/langchain/middleware/index.mjs.map +1 -1
  27. package/dist/openai/index.cjs +1 -1
  28. package/dist/openai/index.cjs.map +1 -1
  29. package/dist/openai/index.mjs +1 -1
  30. package/dist/openai/index.mjs.map +1 -1
  31. package/dist/openai-agents/index.cjs +1 -1
  32. package/dist/openai-agents/index.cjs.map +1 -1
  33. package/dist/openai-agents/index.mjs +1 -1
  34. package/dist/openai-agents/index.mjs.map +1 -1
  35. package/dist/vercel/index.cjs +1 -1
  36. package/dist/vercel/index.cjs.map +1 -1
  37. package/dist/vercel/index.mjs +1 -1
  38. package/dist/vercel/index.mjs.map +1 -1
  39. package/package.json +4 -4
package/dist/index.d.ts CHANGED
@@ -182,6 +182,7 @@ declare class Prompts {
182
182
  * Does NOT handle the string `fallback` option — callers handle that.
183
183
  */
184
184
  private getInternal;
185
+ private readCacheEntry;
185
186
  /**
186
187
  * Compile a prompt template with variable substitution
187
188
  *
package/dist/index.mjs CHANGED
@@ -392,7 +392,7 @@ function sanitizeValues(obj) {
392
392
  }
393
393
  //#endregion
394
394
  //#region package.json
395
- var version = "8.10.2";
395
+ var version = "8.10.3";
396
396
  //#endregion
397
397
  //#region src/serializeError.ts
398
398
  const DEFAULT_MAX_DEPTH = 3;
@@ -1083,6 +1083,8 @@ const wrapVercelLanguageModel = (model, phClient, options) => {
1083
1083
  //#region src/prompts.ts
1084
1084
  const DEFAULT_CACHE_TTL_SECONDS = 300;
1085
1085
  const DEFAULT_PROMPTS_HOST = "https://us.posthog.com";
1086
+ const DEFAULT_REFETCH_COOLDOWN_SECONDS = 60;
1087
+ const MAX_REFETCH_COOLDOWN_SECONDS = 3600;
1086
1088
  function normalizeApiKey(value) {
1087
1089
  return typeof value === "string" ? value.trim() : "";
1088
1090
  }
@@ -1098,6 +1100,21 @@ function extractConfig(value) {
1098
1100
  function cloneConfig(config) {
1099
1101
  return config === null ? null : structuredClone(config);
1100
1102
  }
1103
+ /** Reads a Retry-After header of the delta-seconds form the API sends. */
1104
+ function parseRetryAfterSeconds(value) {
1105
+ if (!value) return;
1106
+ const seconds = Number(value.trim());
1107
+ if (!Number.isFinite(seconds) || seconds <= 0) return;
1108
+ return Math.min(seconds, MAX_REFETCH_COOLDOWN_SECONDS);
1109
+ }
1110
+ /** Carries the server's own cooldown so a rate-limited client waits as long as it was told to. */
1111
+ var PromptFetchError = class extends Error {
1112
+ constructor(message, retryAfterSeconds) {
1113
+ super(message);
1114
+ this.name = "PromptFetchError";
1115
+ this.retryAfterSeconds = retryAfterSeconds;
1116
+ }
1117
+ };
1101
1118
  function isPromptApiResponse(data) {
1102
1119
  if (typeof data !== "object" || data === null) return false;
1103
1120
  const record = data;
@@ -1215,14 +1232,14 @@ var Prompts = class {
1215
1232
  const cached = this.getPromptCache(name)?.get(cacheEntryKey);
1216
1233
  const now = Date.now();
1217
1234
  if (cached) {
1218
- if (now - cached.fetchedAt < cacheTtlSeconds * 1e3) {
1219
- const { fetchedAt: _, ...cachedResult } = cached;
1220
- return {
1221
- source: "cache",
1222
- ...cachedResult,
1223
- config: cloneConfig(cached.config)
1224
- };
1225
- }
1235
+ if (now - cached.fetchedAt < cacheTtlSeconds * 1e3) return {
1236
+ source: "cache",
1237
+ ...this.readCacheEntry(cached)
1238
+ };
1239
+ if (cached.retryNotBefore !== void 0 && now < cached.retryNotBefore) return {
1240
+ source: "stale_cache",
1241
+ ...this.readCacheEntry(cached)
1242
+ };
1226
1243
  }
1227
1244
  try {
1228
1245
  const fetched = await this.fetchPromptFromApi(name, version, label);
@@ -1238,17 +1255,24 @@ var Prompts = class {
1238
1255
  };
1239
1256
  } catch (error) {
1240
1257
  if (cached) {
1241
- const { fetchedAt: _, ...cachedResult } = cached;
1258
+ const cooldownSeconds = (error instanceof PromptFetchError ? error.retryAfterSeconds : void 0) ?? DEFAULT_REFETCH_COOLDOWN_SECONDS;
1259
+ cached.retryNotBefore = Math.max(cached.retryNotBefore ?? 0, Date.now() + cooldownSeconds * 1e3);
1242
1260
  console.warn(`[PostHog Prompts] Failed to fetch prompt ${promptReference}, using stale cache:`, error);
1243
1261
  return {
1244
1262
  source: "stale_cache",
1245
- ...cachedResult,
1246
- config: cloneConfig(cached.config)
1263
+ ...this.readCacheEntry(cached)
1247
1264
  };
1248
1265
  }
1249
1266
  throw error;
1250
1267
  }
1251
1268
  }
1269
+ readCacheEntry(cached) {
1270
+ const { fetchedAt: _fetchedAt, retryNotBefore: _retryNotBefore, ...cachedResult } = cached;
1271
+ return {
1272
+ ...cachedResult,
1273
+ config: cloneConfig(cached.config)
1274
+ };
1275
+ }
1252
1276
  /**
1253
1277
  * Compile a prompt template with variable substitution
1254
1278
  *
@@ -1301,7 +1325,7 @@ var Prompts = class {
1301
1325
  if (!response.ok) {
1302
1326
  if (response.status === 404) throw new Error(`[PostHog Prompts] Prompt ${promptReference} not found`);
1303
1327
  if (response.status === 403) throw new Error(`[PostHog Prompts] Access denied for prompt ${promptReference}. Check that your personalApiKey has the correct permissions and the LLM prompts feature is enabled.`);
1304
- throw new Error(`[PostHog Prompts] Failed to fetch prompt ${promptReference}: HTTP ${response.status}`);
1328
+ throw new PromptFetchError(`[PostHog Prompts] Failed to fetch prompt ${promptReference}: HTTP ${response.status}`, response.status === 429 ? parseRetryAfterSeconds(response.headers?.get("Retry-After")) : void 0);
1305
1329
  }
1306
1330
  const data = await response.json();
1307
1331
  if (!isPromptApiResponse(data)) throw new Error(`[PostHog Prompts] Invalid response format for prompt ${promptReference}`);