promptopskit 0.4.2 → 0.5.0

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 (82) hide show
  1. package/README.md +98 -57
  2. package/SKILL.md +360 -6
  3. package/dist/chunk-6BOUQVSX.js +130 -0
  4. package/dist/chunk-6BOUQVSX.js.map +1 -0
  5. package/dist/{chunk-7MRMN3SW.js → chunk-6VLKZCNS.js} +6 -4
  6. package/dist/chunk-6VLKZCNS.js.map +1 -0
  7. package/dist/{chunk-HWEVRBKZ.js → chunk-AGTGIZMR.js} +6 -2
  8. package/dist/chunk-AGTGIZMR.js.map +1 -0
  9. package/dist/{chunk-XL76NHZR.js → chunk-D75HKF64.js} +6 -4
  10. package/dist/chunk-D75HKF64.js.map +1 -0
  11. package/dist/{chunk-5AAYDOPU.js → chunk-IN4KT5EU.js} +4 -3
  12. package/dist/chunk-IN4KT5EU.js.map +1 -0
  13. package/dist/{chunk-JKBWC5WJ.js → chunk-K6ZU3CGV.js} +22 -5
  14. package/dist/chunk-K6ZU3CGV.js.map +1 -0
  15. package/dist/{chunk-YI4LILPY.js → chunk-KN7H4JRK.js} +61 -4
  16. package/dist/chunk-KN7H4JRK.js.map +1 -0
  17. package/dist/{chunk-Z4IPWEUU.js → chunk-LNGHGGJN.js} +6 -4
  18. package/dist/chunk-LNGHGGJN.js.map +1 -0
  19. package/dist/{chunk-MI3M6KDD.js → chunk-QK3WKE3K.js} +6 -4
  20. package/dist/chunk-QK3WKE3K.js.map +1 -0
  21. package/dist/cli/index.js +27 -5
  22. package/dist/cli/index.js.map +1 -1
  23. package/dist/index.cjs +233 -21
  24. package/dist/index.cjs.map +1 -1
  25. package/dist/index.d.cts +9 -9
  26. package/dist/index.d.ts +9 -9
  27. package/dist/index.js +32 -10
  28. package/dist/index.js.map +1 -1
  29. package/dist/providers/anthropic.cjs +82 -8
  30. package/dist/providers/anthropic.cjs.map +1 -1
  31. package/dist/providers/anthropic.d.cts +2 -2
  32. package/dist/providers/anthropic.d.ts +2 -2
  33. package/dist/providers/anthropic.js +3 -3
  34. package/dist/providers/gemini.cjs +82 -8
  35. package/dist/providers/gemini.cjs.map +1 -1
  36. package/dist/providers/gemini.d.cts +2 -2
  37. package/dist/providers/gemini.d.ts +2 -2
  38. package/dist/providers/gemini.js +3 -3
  39. package/dist/providers/llmasaservice.cjs +1467 -0
  40. package/dist/providers/llmasaservice.cjs.map +1 -0
  41. package/dist/providers/llmasaservice.d.cts +28 -0
  42. package/dist/providers/llmasaservice.d.ts +28 -0
  43. package/dist/providers/llmasaservice.js +20 -0
  44. package/dist/providers/llmasaservice.js.map +1 -0
  45. package/dist/providers/openai-responses.cjs +82 -8
  46. package/dist/providers/openai-responses.cjs.map +1 -1
  47. package/dist/providers/openai-responses.d.cts +2 -2
  48. package/dist/providers/openai-responses.d.ts +2 -2
  49. package/dist/providers/openai-responses.js +3 -3
  50. package/dist/providers/openai.cjs +82 -8
  51. package/dist/providers/openai.cjs.map +1 -1
  52. package/dist/providers/openai.d.cts +2 -2
  53. package/dist/providers/openai.d.ts +2 -2
  54. package/dist/providers/openai.js +3 -3
  55. package/dist/providers/openrouter.cjs +83 -8
  56. package/dist/providers/openrouter.cjs.map +1 -1
  57. package/dist/providers/openrouter.d.cts +2 -2
  58. package/dist/providers/openrouter.d.ts +2 -2
  59. package/dist/providers/openrouter.js +4 -4
  60. package/dist/{schema-B9A1zLRk.d.cts → schema-D-RI4w-k.d.cts} +695 -183
  61. package/dist/{schema-B9A1zLRk.d.ts → schema-D-RI4w-k.d.ts} +695 -183
  62. package/dist/testing.cjs +21 -4
  63. package/dist/testing.cjs.map +1 -1
  64. package/dist/testing.d.cts +1 -1
  65. package/dist/testing.d.ts +1 -1
  66. package/dist/testing.js +1 -1
  67. package/dist/{types-DjGAwJxC.d.ts → types-B3dxBGu6.d.ts} +18 -6
  68. package/dist/{types-DpbzzZO2.d.cts → types-DbTAjlTN.d.cts} +18 -6
  69. package/dist/usagetap/index.cjs +6 -1
  70. package/dist/usagetap/index.cjs.map +1 -1
  71. package/dist/usagetap/index.d.cts +4 -3
  72. package/dist/usagetap/index.d.ts +4 -3
  73. package/dist/usagetap/index.js +3 -1
  74. package/package.json +11 -1
  75. package/dist/chunk-5AAYDOPU.js.map +0 -1
  76. package/dist/chunk-7MRMN3SW.js.map +0 -1
  77. package/dist/chunk-HWEVRBKZ.js.map +0 -1
  78. package/dist/chunk-JKBWC5WJ.js.map +0 -1
  79. package/dist/chunk-MI3M6KDD.js.map +0 -1
  80. package/dist/chunk-XL76NHZR.js.map +0 -1
  81. package/dist/chunk-YI4LILPY.js.map +0 -1
  82. package/dist/chunk-Z4IPWEUU.js.map +0 -1
package/dist/index.cjs CHANGED
@@ -30,6 +30,10 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/index.ts
31
31
  var src_exports = {};
32
32
  __export(src_exports, {
33
+ LLMASASERVICE_BASE_URL: () => LLMASASERVICE_BASE_URL,
34
+ LLMASASERVICE_DEFAULT_MODEL: () => LLMASASERVICE_DEFAULT_MODEL,
35
+ LLMASASERVICE_RESPONSE_HEADER_NAMES: () => LLMASASERVICE_RESPONSE_HEADER_NAMES,
36
+ LLMASASERVICE_SDK_PLACEHOLDER_API_KEY: () => LLMASASERVICE_SDK_PLACEHOLDER_API_KEY,
33
37
  PromptAssetOverridesSchema: () => PromptAssetOverridesSchema,
34
38
  PromptAssetSchema: () => PromptAssetSchema,
35
39
  PromptOpsKit: () => PromptOpsKit,
@@ -37,6 +41,7 @@ __export(src_exports, {
37
41
  applyOverrides: () => applyOverrides,
38
42
  applyUsageTapEntitlements: () => applyUsageTapEntitlements,
39
43
  beginUsageTapCall: () => beginUsageTapCall,
44
+ createLLMAsAServiceOpenAIConfig: () => createLLMAsAServiceOpenAIConfig,
40
45
  createPromptOpsKit: () => createPromptOpsKit,
41
46
  createUsageTapClient: () => createUsageTapClient,
42
47
  defaultUsageTapErrorMapper: () => defaultUsageTapErrorMapper,
@@ -49,6 +54,7 @@ __export(src_exports, {
49
54
  geminiAdapter: () => geminiAdapter,
50
55
  getAdapter: () => getAdapter,
51
56
  interpolate: () => interpolate,
57
+ llmasaserviceAdapter: () => llmasaserviceAdapter,
52
58
  loadPromptFile: () => loadPromptFile,
53
59
  openaiAdapter: () => openaiAdapter,
54
60
  openaiResponsesAdapter: () => openaiResponsesAdapter,
@@ -58,6 +64,7 @@ __export(src_exports, {
58
64
  resolveIncludes: () => resolveIncludes,
59
65
  runAnthropicWithUsageTap: () => runAnthropicWithUsageTap,
60
66
  runGeminiWithUsageTap: () => runGeminiWithUsageTap,
67
+ runLLMAsAServiceWithUsageTap: () => runLLMAsAServiceWithUsageTap,
61
68
  runOpenAIWithUsageTap: () => runOpenAIWithUsageTap,
62
69
  runOpenRouterWithUsageTap: () => runOpenRouterWithUsageTap,
63
70
  validateAsset: () => validateAsset,
@@ -165,7 +172,8 @@ function mergeOverride(base, override) {
165
172
  anthropic: mergeRecordBlock(result.raw?.anthropic, override.raw.anthropic),
166
173
  gemini: mergeRecordBlock(result.raw?.gemini, override.raw.gemini),
167
174
  google: mergeRecordBlock(result.raw?.google, override.raw.google),
168
- openrouter: mergeRecordBlock(result.raw?.openrouter, override.raw.openrouter)
175
+ openrouter: mergeRecordBlock(result.raw?.openrouter, override.raw.openrouter),
176
+ llmasaservice: mergeRecordBlock(result.raw?.llmasaservice, override.raw.llmasaservice)
169
177
  };
170
178
  }
171
179
  if (override.provider_options !== void 0) {
@@ -183,6 +191,10 @@ function mergeOverride(base, override) {
183
191
  openrouter: {
184
192
  ...result.provider_options?.openrouter,
185
193
  ...override.provider_options.openrouter
194
+ },
195
+ llmasaservice: {
196
+ ...result.provider_options?.llmasaservice,
197
+ ...override.provider_options.llmasaservice
186
198
  }
187
199
  };
188
200
  }
@@ -318,10 +330,26 @@ var OpenRouterProviderOptionsSchema = import_zod.z.object({
318
330
  plugins: import_zod.z.array(import_zod.z.record(import_zod.z.unknown())).optional(),
319
331
  models: import_zod.z.array(import_zod.z.string()).optional()
320
332
  });
333
+ var LLMAsAServiceCustomerSchema = import_zod.z.object({
334
+ customer_id: import_zod.z.string(),
335
+ customer_name: import_zod.z.string().optional(),
336
+ customer_user_id: import_zod.z.string().optional(),
337
+ customer_user_name: import_zod.z.string().optional(),
338
+ customer_user_email: import_zod.z.string().optional()
339
+ });
340
+ var LLMAsAServiceProviderOptionsSchema = import_zod.z.object({
341
+ base_url: import_zod.z.string().url().optional(),
342
+ project_id: import_zod.z.string().optional(),
343
+ customer: LLMAsAServiceCustomerSchema.optional(),
344
+ conversationId: import_zod.z.string().optional(),
345
+ conversationTitle: import_zod.z.string().optional(),
346
+ projectId: import_zod.z.string().optional()
347
+ });
321
348
  var ProviderOptionsSchema = import_zod.z.object({
322
349
  anthropic: AnthropicProviderOptionsSchema.optional(),
323
350
  gemini: GeminiProviderOptionsSchema.optional(),
324
- openrouter: OpenRouterProviderOptionsSchema.optional()
351
+ openrouter: OpenRouterProviderOptionsSchema.optional(),
352
+ llmasaservice: LLMAsAServiceProviderOptionsSchema.optional()
325
353
  });
326
354
  var RawProviderBodySchema = import_zod.z.object({
327
355
  openai: import_zod.z.record(import_zod.z.unknown()).optional(),
@@ -330,7 +358,8 @@ var RawProviderBodySchema = import_zod.z.object({
330
358
  anthropic: import_zod.z.record(import_zod.z.unknown()).optional(),
331
359
  gemini: import_zod.z.record(import_zod.z.unknown()).optional(),
332
360
  google: import_zod.z.record(import_zod.z.unknown()).optional(),
333
- openrouter: import_zod.z.record(import_zod.z.unknown()).optional()
361
+ openrouter: import_zod.z.record(import_zod.z.unknown()).optional(),
362
+ llmasaservice: import_zod.z.record(import_zod.z.unknown()).optional()
334
363
  });
335
364
  var OpenAICacheSchema = import_zod.z.object({
336
365
  prompt_cache_key: import_zod.z.string().min(1).optional(),
@@ -417,7 +446,7 @@ var SectionsSchema = import_zod.z.object({
417
446
  notes: import_zod.z.string().optional()
418
447
  });
419
448
  var PromptDefaultsSchema = import_zod.z.object({
420
- provider: import_zod.z.enum(["openai", "openai-responses", "anthropic", "google", "gemini", "openrouter", "any"]).optional(),
449
+ provider: import_zod.z.enum(["openai", "openai-responses", "anthropic", "google", "gemini", "openrouter", "llmasaservice", "any"]).optional(),
421
450
  model: import_zod.z.string().optional(),
422
451
  cache: CacheSchema.optional(),
423
452
  metadata: MetadataSchema.optional(),
@@ -429,7 +458,7 @@ var PromptAssetSchema = import_zod.z.object({
429
458
  id: import_zod.z.string(),
430
459
  schema_version: import_zod.z.number().int().positive().default(1),
431
460
  description: import_zod.z.string().optional(),
432
- provider: import_zod.z.enum(["openai", "openai-responses", "anthropic", "google", "gemini", "openrouter", "any"]).optional(),
461
+ provider: import_zod.z.enum(["openai", "openai-responses", "anthropic", "google", "gemini", "openrouter", "llmasaservice", "any"]).optional(),
433
462
  model: import_zod.z.string().optional(),
434
463
  fallback_models: import_zod.z.array(import_zod.z.string()).optional(),
435
464
  reasoning: ReasoningSchema.optional(),
@@ -1174,6 +1203,56 @@ function collectContextSizeWarnings(asset, variables = {}) {
1174
1203
  return warnings;
1175
1204
  }
1176
1205
 
1206
+ // src/history.ts
1207
+ function defaultCompactHistory(info) {
1208
+ const content = info.overflow.map((message) => `${message.role}: ${message.content}`).join("\n\n");
1209
+ return {
1210
+ role: "user",
1211
+ content: `Earlier conversation compacted to preserve history:
1212
+
1213
+ ${content}`
1214
+ };
1215
+ }
1216
+ function normalizeCompactionResult(result) {
1217
+ if (typeof result === "string") {
1218
+ return {
1219
+ role: "user",
1220
+ content: result
1221
+ };
1222
+ }
1223
+ return result;
1224
+ }
1225
+ function compactHistoryForPrompt(asset, runtime) {
1226
+ const history = runtime.history;
1227
+ const maxItems = asset.context?.history?.max_items;
1228
+ if (!history || maxItems === void 0 || history.length <= maxItems) {
1229
+ return history;
1230
+ }
1231
+ if (maxItems === 1) {
1232
+ const info2 = {
1233
+ promptId: asset.id,
1234
+ maxItems,
1235
+ overflow: history,
1236
+ preserved: [],
1237
+ history
1238
+ };
1239
+ const compacted2 = runtime.onHistoryCompaction ? normalizeCompactionResult(runtime.onHistoryCompaction(info2)) : defaultCompactHistory(info2);
1240
+ return [compacted2];
1241
+ }
1242
+ const preservedCount = maxItems - 1;
1243
+ const overflow = history.slice(0, history.length - preservedCount);
1244
+ const preserved = history.slice(-preservedCount);
1245
+ const info = {
1246
+ promptId: asset.id,
1247
+ maxItems,
1248
+ overflow,
1249
+ preserved,
1250
+ history
1251
+ };
1252
+ const compacted = runtime.onHistoryCompaction ? normalizeCompactionResult(runtime.onHistoryCompaction(info)) : defaultCompactHistory(info);
1253
+ return [compacted, ...preserved];
1254
+ }
1255
+
1177
1256
  // src/providers/prompt-input.ts
1178
1257
  function isPromptLookup(input) {
1179
1258
  return "path" in input && typeof input.path === "string";
@@ -1209,7 +1288,8 @@ function withPromptInputSupport(adapter) {
1209
1288
  }
1210
1289
  return adapter.render(resolved, {
1211
1290
  ...runtime,
1212
- variables: sanitization.variables
1291
+ variables: sanitization.variables,
1292
+ history: compactHistoryForPrompt(resolved, runtime)
1213
1293
  });
1214
1294
  };
1215
1295
  return {
@@ -1262,8 +1342,9 @@ var openaiAdapter = withPromptInputSupport({
1262
1342
  if (sections.system_instructions) {
1263
1343
  messages.push({ role: "system", content: sections.system_instructions });
1264
1344
  }
1265
- if (runtime.history) {
1266
- for (const msg of runtime.history) {
1345
+ const history = compactHistoryForPrompt(resolvedAsset, runtime);
1346
+ if (history) {
1347
+ for (const msg of history) {
1267
1348
  messages.push({ role: msg.role, content: msg.content });
1268
1349
  }
1269
1350
  }
@@ -1360,8 +1441,9 @@ var openaiResponsesAdapter = withPromptInputSupport({
1360
1441
  });
1361
1442
  const responseOptions = runtime.openaiResponses;
1362
1443
  const input = [];
1363
- if (runtime.history) {
1364
- for (const msg of runtime.history) {
1444
+ const history = compactHistoryForPrompt(resolvedAsset, runtime);
1445
+ if (history) {
1446
+ for (const msg of history) {
1365
1447
  input.push({ role: msg.role, content: msg.content });
1366
1448
  }
1367
1449
  }
@@ -1474,8 +1556,9 @@ var anthropicAdapter = withPromptInputSupport({
1474
1556
  ...anthropicCacheConfig.ttl ? { ttl: anthropicCacheConfig.ttl } : {}
1475
1557
  } : void 0;
1476
1558
  const cacheMode = anthropicCacheConfig?.mode ?? "automatic";
1477
- if (runtime.history) {
1478
- for (const msg of runtime.history) {
1559
+ const history = compactHistoryForPrompt(resolvedAsset, runtime);
1560
+ if (history) {
1561
+ for (const msg of history) {
1479
1562
  messages.push({ role: msg.role, content: msg.content });
1480
1563
  }
1481
1564
  }
@@ -1600,8 +1683,9 @@ var geminiAdapter = withPromptInputSupport({
1600
1683
  strict: runtime.strict
1601
1684
  });
1602
1685
  const contents = [];
1603
- if (runtime.history) {
1604
- for (const msg of runtime.history) {
1686
+ const history = compactHistoryForPrompt(resolvedAsset, runtime);
1687
+ if (history) {
1688
+ for (const msg of history) {
1605
1689
  contents.push({
1606
1690
  role: msg.role === "assistant" ? "model" : "user",
1607
1691
  parts: [{ text: msg.content }]
@@ -1703,6 +1787,7 @@ var openrouterAdapter = withPromptInputSupport({
1703
1787
  {
1704
1788
  variables: runtime.variables,
1705
1789
  history: runtime.history,
1790
+ onHistoryCompaction: runtime.onHistoryCompaction,
1706
1791
  toolRegistry: runtime.toolRegistry,
1707
1792
  strict: runtime.strict
1708
1793
  }
@@ -1724,6 +1809,118 @@ var openrouterAdapter = withPromptInputSupport({
1724
1809
  }
1725
1810
  });
1726
1811
 
1812
+ // src/providers/llmasaservice.ts
1813
+ var LLMASASERVICE_BASE_URL = "https://gateway.llmasaservice.io";
1814
+ var LLMASASERVICE_SDK_PLACEHOLDER_API_KEY = "not-used-by-llm-gateway";
1815
+ var LLMASASERVICE_DEFAULT_MODEL = "group:standard";
1816
+ var LLMASASERVICE_RESPONSE_HEADER_NAMES = [
1817
+ "x-request-id",
1818
+ "x-llm-model-id",
1819
+ "x-llm-model-group"
1820
+ ];
1821
+ function createLLMAsAServiceOpenAIConfig(options = {}) {
1822
+ return {
1823
+ baseURL: options.baseURL ?? LLMASASERVICE_BASE_URL,
1824
+ apiKey: LLMASASERVICE_SDK_PLACEHOLDER_API_KEY,
1825
+ defaultHeaders: {
1826
+ "x-project-id": options.projectId ?? ""
1827
+ }
1828
+ };
1829
+ }
1830
+ function isGPT5ModelSelector(model) {
1831
+ if (!model) return false;
1832
+ return model.split(/[|,]/).map((candidate) => candidate.trim()).some((candidate) => candidate.startsWith("gpt-5") || candidate.startsWith("openai:gpt-5"));
1833
+ }
1834
+ function defaultModel() {
1835
+ return LLMASASERVICE_DEFAULT_MODEL;
1836
+ }
1837
+ function isRecord(value) {
1838
+ return typeof value === "object" && value !== null && !Array.isArray(value);
1839
+ }
1840
+ function rawCustomerId(asset) {
1841
+ const customer = isRecord(asset.raw?.llmasaservice?.customer) ? asset.raw.llmasaservice.customer : void 0;
1842
+ return customer?.customer_id;
1843
+ }
1844
+ function isGatewayRenderValidation(runtime) {
1845
+ return runtime?.runtime !== void 0;
1846
+ }
1847
+ var llmasaserviceAdapter = withPromptInputSupport({
1848
+ name: "llmasaservice",
1849
+ validate(asset, runtime) {
1850
+ const resolvedAsset = resolveAssetForProvider(asset, runtime);
1851
+ const validation = openaiAdapter.validate(
1852
+ {
1853
+ ...resolvedAsset,
1854
+ model: resolvedAsset.model ?? defaultModel()
1855
+ },
1856
+ runtime
1857
+ );
1858
+ const warnings = validation.warnings.filter(
1859
+ (warning) => warning !== "OpenAI adapter requires a model to be specified."
1860
+ );
1861
+ const errors = [...validation.errors];
1862
+ const gatewayOptions = resolvedAsset.provider_options?.llmasaservice;
1863
+ const missingProjectId = !gatewayOptions?.project_id;
1864
+ const missingCustomerId = !gatewayOptions?.customer?.customer_id && typeof rawCustomerId(resolvedAsset) !== "string";
1865
+ const validateRenderMetadata = isGatewayRenderValidation(runtime);
1866
+ if (missingProjectId && validateRenderMetadata) {
1867
+ errors.push(
1868
+ "LLMAsAService adapter requires provider_options.llmasaservice.project_id for x-project-id routing."
1869
+ );
1870
+ }
1871
+ if (missingCustomerId && validateRenderMetadata) {
1872
+ errors.push(
1873
+ "LLMAsAService adapter requires customer.customer_id in provider_options.llmasaservice.customer or raw.llmasaservice.customer."
1874
+ );
1875
+ }
1876
+ if ((missingProjectId || missingCustomerId) && !validateRenderMetadata) {
1877
+ warnings.push(
1878
+ "LLMAsAService project_id and customer.customer_id must be supplied before rendering, usually through runtime provider_options."
1879
+ );
1880
+ }
1881
+ return {
1882
+ valid: errors.length === 0,
1883
+ errors,
1884
+ warnings
1885
+ };
1886
+ },
1887
+ render(asset, runtime) {
1888
+ const resolvedAsset = resolveAssetForProvider(asset, runtime);
1889
+ const options = resolvedAsset.provider_options?.llmasaservice;
1890
+ const model = resolvedAsset.model ?? defaultModel();
1891
+ const result = openaiAdapter.render(
1892
+ { ...resolvedAsset, model, raw: void 0 },
1893
+ {
1894
+ variables: runtime.variables,
1895
+ history: runtime.history,
1896
+ onHistoryCompaction: runtime.onHistoryCompaction,
1897
+ toolRegistry: runtime.toolRegistry,
1898
+ strict: runtime.strict
1899
+ }
1900
+ );
1901
+ let body = { ...result.body };
1902
+ if (isGPT5ModelSelector(model) && body.max_tokens !== void 0 && body.max_completion_tokens === void 0) {
1903
+ body.max_completion_tokens = body.max_tokens;
1904
+ delete body.max_tokens;
1905
+ }
1906
+ if (options?.customer !== void 0) body.customer = options.customer;
1907
+ if (options?.conversationId !== void 0) body.conversationId = options.conversationId;
1908
+ if (options?.conversationTitle !== void 0) body.conversationTitle = options.conversationTitle;
1909
+ if (options?.projectId !== void 0) body.projectId = options.projectId;
1910
+ body = applyRawProviderBody(body, resolvedAsset, "llmasaservice");
1911
+ const projectId = options?.project_id ?? "";
1912
+ return {
1913
+ body,
1914
+ provider: "llmasaservice",
1915
+ model,
1916
+ baseURL: options?.base_url ?? LLMASASERVICE_BASE_URL,
1917
+ headers: {
1918
+ "x-project-id": projectId
1919
+ }
1920
+ };
1921
+ }
1922
+ });
1923
+
1727
1924
  // src/providers/index.ts
1728
1925
  var adapters = {
1729
1926
  openai: openaiAdapter,
@@ -1731,7 +1928,8 @@ var adapters = {
1731
1928
  anthropic: anthropicAdapter,
1732
1929
  google: geminiAdapter,
1733
1930
  gemini: geminiAdapter,
1734
- openrouter: openrouterAdapter
1931
+ openrouter: openrouterAdapter,
1932
+ llmasaservice: llmasaserviceAdapter
1735
1933
  };
1736
1934
  function getAdapter(provider) {
1737
1935
  const adapter = adapters[provider];
@@ -1967,7 +2165,7 @@ function validateAsset(asset, frontMatterKeys, filePath) {
1967
2165
  });
1968
2166
  }
1969
2167
  for (const [envName, overrides] of Object.entries(asset.environments ?? {})) {
1970
- if (asset.cache && (!isRecord(overrides) || !overrides.cache)) {
2168
+ if (asset.cache && (!isRecord2(overrides) || !overrides.cache)) {
1971
2169
  warnings.push({
1972
2170
  code: "POK045",
1973
2171
  message: `Environment "${envName}" does not override cache while prompt-level cache is defined.`,
@@ -1977,7 +2175,7 @@ function validateAsset(asset, frontMatterKeys, filePath) {
1977
2175
  }
1978
2176
  }
1979
2177
  for (const [tierName, overrides] of Object.entries(asset.tiers ?? {})) {
1980
- if (asset.cache && (!isRecord(overrides) || !overrides.cache)) {
2178
+ if (asset.cache && (!isRecord2(overrides) || !overrides.cache)) {
1981
2179
  warnings.push({
1982
2180
  code: "POK045",
1983
2181
  message: `Tier "${tierName}" does not override cache while prompt-level cache is defined.`,
@@ -1987,7 +2185,7 @@ function validateAsset(asset, frontMatterKeys, filePath) {
1987
2185
  }
1988
2186
  }
1989
2187
  for (const tool of asset.tools ?? []) {
1990
- if (isRecord(tool)) {
2188
+ if (isRecord2(tool)) {
1991
2189
  if (!tool.description) {
1992
2190
  warnings.push({
1993
2191
  code: "POK047",
@@ -2042,7 +2240,7 @@ function findClosestMatch(input, candidates) {
2042
2240
  }
2043
2241
  return best;
2044
2242
  }
2045
- function isRecord(value) {
2243
+ function isRecord2(value) {
2046
2244
  return typeof value === "object" && value !== null && !Array.isArray(value);
2047
2245
  }
2048
2246
 
@@ -2321,7 +2519,7 @@ function applyUsageTapEntitlements(request, begin, options = {}) {
2321
2519
  if (!isObject2(nextRequest.body)) {
2322
2520
  return nextRequest;
2323
2521
  }
2324
- if (nextRequest.provider === "openai" || nextRequest.provider === "openrouter") {
2522
+ if (nextRequest.provider === "openai" || nextRequest.provider === "openrouter" || nextRequest.provider === "llmasaservice") {
2325
2523
  capOpenAIReasoning(nextRequest.body, allowed);
2326
2524
  if (isRecordArray(nextRequest.body.tools)) {
2327
2525
  nextRequest.body.tools = filterOpenAITools(nextRequest.body.tools, allowed, options);
@@ -2410,6 +2608,9 @@ function runOpenAIWithUsageTap(client, options) {
2410
2608
  function runOpenRouterWithUsageTap(client, options) {
2411
2609
  return runProviderWithUsageTap(client, options, extractOpenAIUsage);
2412
2610
  }
2611
+ function runLLMAsAServiceWithUsageTap(client, options) {
2612
+ return runProviderWithUsageTap(client, options, extractOpenAIUsage);
2613
+ }
2413
2614
  function runAnthropicWithUsageTap(client, options) {
2414
2615
  return runProviderWithUsageTap(client, options, extractAnthropicUsage);
2415
2616
  }
@@ -2513,7 +2714,11 @@ var PromptOpsKit = class {
2513
2714
  }
2514
2715
  const request = adapter.render(resolved, {
2515
2716
  variables: sanitization.variables,
2516
- history: options.history,
2717
+ history: compactHistoryForPrompt(resolved, {
2718
+ history: options.history,
2719
+ onHistoryCompaction: options.onHistoryCompaction
2720
+ }),
2721
+ onHistoryCompaction: options.onHistoryCompaction,
2517
2722
  toolRegistry: options.toolRegistry,
2518
2723
  strict: options.strict,
2519
2724
  openaiResponses: options.openaiResponses
@@ -2578,6 +2783,10 @@ async function renderPrompt(options) {
2578
2783
  }
2579
2784
  // Annotate the CommonJS export names for ESM import in node:
2580
2785
  0 && (module.exports = {
2786
+ LLMASASERVICE_BASE_URL,
2787
+ LLMASASERVICE_DEFAULT_MODEL,
2788
+ LLMASASERVICE_RESPONSE_HEADER_NAMES,
2789
+ LLMASASERVICE_SDK_PLACEHOLDER_API_KEY,
2581
2790
  PromptAssetOverridesSchema,
2582
2791
  PromptAssetSchema,
2583
2792
  PromptOpsKit,
@@ -2585,6 +2794,7 @@ async function renderPrompt(options) {
2585
2794
  applyOverrides,
2586
2795
  applyUsageTapEntitlements,
2587
2796
  beginUsageTapCall,
2797
+ createLLMAsAServiceOpenAIConfig,
2588
2798
  createPromptOpsKit,
2589
2799
  createUsageTapClient,
2590
2800
  defaultUsageTapErrorMapper,
@@ -2597,6 +2807,7 @@ async function renderPrompt(options) {
2597
2807
  geminiAdapter,
2598
2808
  getAdapter,
2599
2809
  interpolate,
2810
+ llmasaserviceAdapter,
2600
2811
  loadPromptFile,
2601
2812
  openaiAdapter,
2602
2813
  openaiResponsesAdapter,
@@ -2606,6 +2817,7 @@ async function renderPrompt(options) {
2606
2817
  resolveIncludes,
2607
2818
  runAnthropicWithUsageTap,
2608
2819
  runGeminiWithUsageTap,
2820
+ runLLMAsAServiceWithUsageTap,
2609
2821
  runOpenAIWithUsageTap,
2610
2822
  runOpenRouterWithUsageTap,
2611
2823
  validateAsset,