promptopskit 0.4.0 → 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-F6UJ73Y6.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-L2V7LDKD.js → chunk-D75HKF64.js} +6 -4
  10. package/dist/chunk-D75HKF64.js.map +1 -0
  11. package/dist/{chunk-UPTCSWK3.js → chunk-IN4KT5EU.js} +4 -3
  12. package/dist/chunk-IN4KT5EU.js.map +1 -0
  13. package/dist/{chunk-JBLUPKY4.js → chunk-K6ZU3CGV.js} +54 -6
  14. package/dist/chunk-K6ZU3CGV.js.map +1 -0
  15. package/dist/{chunk-XNNDGDPI.js → chunk-KN7H4JRK.js} +61 -4
  16. package/dist/chunk-KN7H4JRK.js.map +1 -0
  17. package/dist/{chunk-HLNVKKMS.js → chunk-LNGHGGJN.js} +6 -4
  18. package/dist/chunk-LNGHGGJN.js.map +1 -0
  19. package/dist/{chunk-RY5DVTLV.js → chunk-QK3WKE3K.js} +6 -4
  20. package/dist/chunk-QK3WKE3K.js.map +1 -0
  21. package/dist/cli/index.js +114 -55
  22. package/dist/cli/index.js.map +1 -1
  23. package/dist/index.cjs +265 -22
  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 +114 -9
  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 +114 -9
  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 +114 -9
  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 +114 -9
  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 +115 -9
  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-F6UJ73Y6.js.map +0 -1
  76. package/dist/chunk-HLNVKKMS.js.map +0 -1
  77. package/dist/chunk-HWEVRBKZ.js.map +0 -1
  78. package/dist/chunk-JBLUPKY4.js.map +0 -1
  79. package/dist/chunk-L2V7LDKD.js.map +0 -1
  80. package/dist/chunk-RY5DVTLV.js.map +0 -1
  81. package/dist/chunk-UPTCSWK3.js.map +0 -1
  82. package/dist/chunk-XNNDGDPI.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(),
@@ -685,6 +714,7 @@ function mergeDefaults(base, local) {
685
714
  return {
686
715
  provider: local.provider ?? base.provider,
687
716
  model: local.model ?? base.model,
717
+ cache: mergeCache(base.cache, local.cache),
688
718
  metadata: {
689
719
  ...base.metadata ?? {},
690
720
  ...local.metadata ?? {}
@@ -696,10 +726,12 @@ function mergeDefaults(base, local) {
696
726
  };
697
727
  }
698
728
  function applyDefaults(asset, defaults) {
729
+ const cache = mergeCache(defaults.cache, asset.cache);
699
730
  const hasDefaultMetadata = defaults.metadata && Object.keys(defaults.metadata).length > 0;
700
731
  const hasDefaultSystem = !!defaults.sections?.system_instructions;
701
732
  const hasDefaultScalars = defaults.provider !== void 0 || defaults.model !== void 0;
702
- if (!hasDefaultMetadata && !hasDefaultSystem && !hasDefaultScalars) {
733
+ const hasDefaultCache = cache !== void 0;
734
+ if (!hasDefaultMetadata && !hasDefaultSystem && !hasDefaultScalars && !hasDefaultCache) {
703
735
  return asset;
704
736
  }
705
737
  const mergedMetadata = {
@@ -713,10 +745,38 @@ function applyDefaults(asset, defaults) {
713
745
  ...asset,
714
746
  provider: asset.provider ?? defaults.provider,
715
747
  model: asset.model ?? defaults.model,
748
+ cache,
716
749
  metadata,
717
750
  sections
718
751
  };
719
752
  }
753
+ function mergeCache(base, local) {
754
+ const merged = {
755
+ ...base ?? {},
756
+ ...local ?? {},
757
+ openai: {
758
+ ...base?.openai ?? {},
759
+ ...local?.openai ?? {}
760
+ },
761
+ anthropic: {
762
+ ...base?.anthropic ?? {},
763
+ ...local?.anthropic ?? {}
764
+ },
765
+ gemini: {
766
+ ...base?.gemini ?? {},
767
+ ...local?.gemini ?? {}
768
+ },
769
+ google: {
770
+ ...base?.google ?? {},
771
+ ...local?.google ?? {}
772
+ }
773
+ };
774
+ if (merged.openai && Object.keys(merged.openai).length === 0) delete merged.openai;
775
+ if (merged.anthropic && Object.keys(merged.anthropic).length === 0) delete merged.anthropic;
776
+ if (merged.gemini && Object.keys(merged.gemini).length === 0) delete merged.gemini;
777
+ if (merged.google && Object.keys(merged.google).length === 0) delete merged.google;
778
+ return Object.keys(merged).length > 0 ? merged : void 0;
779
+ }
720
780
 
721
781
  // src/composition/resolve-includes.ts
722
782
  async function resolveIncludes(asset, basePath, visited = /* @__PURE__ */ new Set()) {
@@ -1143,6 +1203,56 @@ function collectContextSizeWarnings(asset, variables = {}) {
1143
1203
  return warnings;
1144
1204
  }
1145
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
+
1146
1256
  // src/providers/prompt-input.ts
1147
1257
  function isPromptLookup(input) {
1148
1258
  return "path" in input && typeof input.path === "string";
@@ -1178,7 +1288,8 @@ function withPromptInputSupport(adapter) {
1178
1288
  }
1179
1289
  return adapter.render(resolved, {
1180
1290
  ...runtime,
1181
- variables: sanitization.variables
1291
+ variables: sanitization.variables,
1292
+ history: compactHistoryForPrompt(resolved, runtime)
1182
1293
  });
1183
1294
  };
1184
1295
  return {
@@ -1231,8 +1342,9 @@ var openaiAdapter = withPromptInputSupport({
1231
1342
  if (sections.system_instructions) {
1232
1343
  messages.push({ role: "system", content: sections.system_instructions });
1233
1344
  }
1234
- if (runtime.history) {
1235
- for (const msg of runtime.history) {
1345
+ const history = compactHistoryForPrompt(resolvedAsset, runtime);
1346
+ if (history) {
1347
+ for (const msg of history) {
1236
1348
  messages.push({ role: msg.role, content: msg.content });
1237
1349
  }
1238
1350
  }
@@ -1329,8 +1441,9 @@ var openaiResponsesAdapter = withPromptInputSupport({
1329
1441
  });
1330
1442
  const responseOptions = runtime.openaiResponses;
1331
1443
  const input = [];
1332
- if (runtime.history) {
1333
- for (const msg of runtime.history) {
1444
+ const history = compactHistoryForPrompt(resolvedAsset, runtime);
1445
+ if (history) {
1446
+ for (const msg of history) {
1334
1447
  input.push({ role: msg.role, content: msg.content });
1335
1448
  }
1336
1449
  }
@@ -1443,8 +1556,9 @@ var anthropicAdapter = withPromptInputSupport({
1443
1556
  ...anthropicCacheConfig.ttl ? { ttl: anthropicCacheConfig.ttl } : {}
1444
1557
  } : void 0;
1445
1558
  const cacheMode = anthropicCacheConfig?.mode ?? "automatic";
1446
- if (runtime.history) {
1447
- for (const msg of runtime.history) {
1559
+ const history = compactHistoryForPrompt(resolvedAsset, runtime);
1560
+ if (history) {
1561
+ for (const msg of history) {
1448
1562
  messages.push({ role: msg.role, content: msg.content });
1449
1563
  }
1450
1564
  }
@@ -1569,8 +1683,9 @@ var geminiAdapter = withPromptInputSupport({
1569
1683
  strict: runtime.strict
1570
1684
  });
1571
1685
  const contents = [];
1572
- if (runtime.history) {
1573
- for (const msg of runtime.history) {
1686
+ const history = compactHistoryForPrompt(resolvedAsset, runtime);
1687
+ if (history) {
1688
+ for (const msg of history) {
1574
1689
  contents.push({
1575
1690
  role: msg.role === "assistant" ? "model" : "user",
1576
1691
  parts: [{ text: msg.content }]
@@ -1672,6 +1787,7 @@ var openrouterAdapter = withPromptInputSupport({
1672
1787
  {
1673
1788
  variables: runtime.variables,
1674
1789
  history: runtime.history,
1790
+ onHistoryCompaction: runtime.onHistoryCompaction,
1675
1791
  toolRegistry: runtime.toolRegistry,
1676
1792
  strict: runtime.strict
1677
1793
  }
@@ -1693,6 +1809,118 @@ var openrouterAdapter = withPromptInputSupport({
1693
1809
  }
1694
1810
  });
1695
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
+
1696
1924
  // src/providers/index.ts
1697
1925
  var adapters = {
1698
1926
  openai: openaiAdapter,
@@ -1700,7 +1928,8 @@ var adapters = {
1700
1928
  anthropic: anthropicAdapter,
1701
1929
  google: geminiAdapter,
1702
1930
  gemini: geminiAdapter,
1703
- openrouter: openrouterAdapter
1931
+ openrouter: openrouterAdapter,
1932
+ llmasaservice: llmasaserviceAdapter
1704
1933
  };
1705
1934
  function getAdapter(provider) {
1706
1935
  const adapter = adapters[provider];
@@ -1936,7 +2165,7 @@ function validateAsset(asset, frontMatterKeys, filePath) {
1936
2165
  });
1937
2166
  }
1938
2167
  for (const [envName, overrides] of Object.entries(asset.environments ?? {})) {
1939
- if (asset.cache && (!isRecord(overrides) || !overrides.cache)) {
2168
+ if (asset.cache && (!isRecord2(overrides) || !overrides.cache)) {
1940
2169
  warnings.push({
1941
2170
  code: "POK045",
1942
2171
  message: `Environment "${envName}" does not override cache while prompt-level cache is defined.`,
@@ -1946,7 +2175,7 @@ function validateAsset(asset, frontMatterKeys, filePath) {
1946
2175
  }
1947
2176
  }
1948
2177
  for (const [tierName, overrides] of Object.entries(asset.tiers ?? {})) {
1949
- if (asset.cache && (!isRecord(overrides) || !overrides.cache)) {
2178
+ if (asset.cache && (!isRecord2(overrides) || !overrides.cache)) {
1950
2179
  warnings.push({
1951
2180
  code: "POK045",
1952
2181
  message: `Tier "${tierName}" does not override cache while prompt-level cache is defined.`,
@@ -1956,7 +2185,7 @@ function validateAsset(asset, frontMatterKeys, filePath) {
1956
2185
  }
1957
2186
  }
1958
2187
  for (const tool of asset.tools ?? []) {
1959
- if (isRecord(tool)) {
2188
+ if (isRecord2(tool)) {
1960
2189
  if (!tool.description) {
1961
2190
  warnings.push({
1962
2191
  code: "POK047",
@@ -2011,7 +2240,7 @@ function findClosestMatch(input, candidates) {
2011
2240
  }
2012
2241
  return best;
2013
2242
  }
2014
- function isRecord(value) {
2243
+ function isRecord2(value) {
2015
2244
  return typeof value === "object" && value !== null && !Array.isArray(value);
2016
2245
  }
2017
2246
 
@@ -2290,7 +2519,7 @@ function applyUsageTapEntitlements(request, begin, options = {}) {
2290
2519
  if (!isObject2(nextRequest.body)) {
2291
2520
  return nextRequest;
2292
2521
  }
2293
- if (nextRequest.provider === "openai" || nextRequest.provider === "openrouter") {
2522
+ if (nextRequest.provider === "openai" || nextRequest.provider === "openrouter" || nextRequest.provider === "llmasaservice") {
2294
2523
  capOpenAIReasoning(nextRequest.body, allowed);
2295
2524
  if (isRecordArray(nextRequest.body.tools)) {
2296
2525
  nextRequest.body.tools = filterOpenAITools(nextRequest.body.tools, allowed, options);
@@ -2379,6 +2608,9 @@ function runOpenAIWithUsageTap(client, options) {
2379
2608
  function runOpenRouterWithUsageTap(client, options) {
2380
2609
  return runProviderWithUsageTap(client, options, extractOpenAIUsage);
2381
2610
  }
2611
+ function runLLMAsAServiceWithUsageTap(client, options) {
2612
+ return runProviderWithUsageTap(client, options, extractOpenAIUsage);
2613
+ }
2382
2614
  function runAnthropicWithUsageTap(client, options) {
2383
2615
  return runProviderWithUsageTap(client, options, extractAnthropicUsage);
2384
2616
  }
@@ -2482,7 +2714,11 @@ var PromptOpsKit = class {
2482
2714
  }
2483
2715
  const request = adapter.render(resolved, {
2484
2716
  variables: sanitization.variables,
2485
- history: options.history,
2717
+ history: compactHistoryForPrompt(resolved, {
2718
+ history: options.history,
2719
+ onHistoryCompaction: options.onHistoryCompaction
2720
+ }),
2721
+ onHistoryCompaction: options.onHistoryCompaction,
2486
2722
  toolRegistry: options.toolRegistry,
2487
2723
  strict: options.strict,
2488
2724
  openaiResponses: options.openaiResponses
@@ -2547,6 +2783,10 @@ async function renderPrompt(options) {
2547
2783
  }
2548
2784
  // Annotate the CommonJS export names for ESM import in node:
2549
2785
  0 && (module.exports = {
2786
+ LLMASASERVICE_BASE_URL,
2787
+ LLMASASERVICE_DEFAULT_MODEL,
2788
+ LLMASASERVICE_RESPONSE_HEADER_NAMES,
2789
+ LLMASASERVICE_SDK_PLACEHOLDER_API_KEY,
2550
2790
  PromptAssetOverridesSchema,
2551
2791
  PromptAssetSchema,
2552
2792
  PromptOpsKit,
@@ -2554,6 +2794,7 @@ async function renderPrompt(options) {
2554
2794
  applyOverrides,
2555
2795
  applyUsageTapEntitlements,
2556
2796
  beginUsageTapCall,
2797
+ createLLMAsAServiceOpenAIConfig,
2557
2798
  createPromptOpsKit,
2558
2799
  createUsageTapClient,
2559
2800
  defaultUsageTapErrorMapper,
@@ -2566,6 +2807,7 @@ async function renderPrompt(options) {
2566
2807
  geminiAdapter,
2567
2808
  getAdapter,
2568
2809
  interpolate,
2810
+ llmasaserviceAdapter,
2569
2811
  loadPromptFile,
2570
2812
  openaiAdapter,
2571
2813
  openaiResponsesAdapter,
@@ -2575,6 +2817,7 @@ async function renderPrompt(options) {
2575
2817
  resolveIncludes,
2576
2818
  runAnthropicWithUsageTap,
2577
2819
  runGeminiWithUsageTap,
2820
+ runLLMAsAServiceWithUsageTap,
2578
2821
  runOpenAIWithUsageTap,
2579
2822
  runOpenRouterWithUsageTap,
2580
2823
  validateAsset,