@aglyn/plugins-ai 1.0.0-beta.250 → 1.0.0-beta.253

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 (126) hide show
  1. package/package.json +17 -17
  2. package/src/lib/components/ai-brief-dialog.component.js +15 -1
  3. package/src/lib/components/ai-brief-dialog.component.js.map +1 -1
  4. package/src/lib/components/ai-job-links.js +1 -1
  5. package/src/lib/components/ai-job-links.js.map +1 -1
  6. package/src/lib/components/ai-job-plan.component.js +20 -2
  7. package/src/lib/components/ai-job-plan.component.js.map +1 -1
  8. package/src/lib/components/ai-jobs-store.d.ts +11 -0
  9. package/src/lib/components/ai-jobs-store.js +22 -0
  10. package/src/lib/components/ai-jobs-store.js.map +1 -1
  11. package/src/lib/jobs/ai-job-crm-step.js +7 -4
  12. package/src/lib/jobs/ai-job-crm-step.js.map +1 -1
  13. package/src/lib/jobs/ai-job-drafts.d.ts +24 -0
  14. package/src/lib/jobs/ai-job-drafts.js +46 -0
  15. package/src/lib/jobs/ai-job-drafts.js.map +1 -1
  16. package/src/lib/jobs/ai-job-experiment-step.js +6 -1
  17. package/src/lib/jobs/ai-job-experiment-step.js.map +1 -1
  18. package/src/lib/jobs/ai-job-form-dataset.d.ts +6 -1
  19. package/src/lib/jobs/ai-job-form-dataset.js +7 -2
  20. package/src/lib/jobs/ai-job-form-dataset.js.map +1 -1
  21. package/src/lib/jobs/ai-job-form-reuse.d.ts +78 -0
  22. package/src/lib/jobs/ai-job-form-reuse.js +136 -0
  23. package/src/lib/jobs/ai-job-form-reuse.js.map +1 -0
  24. package/src/lib/jobs/ai-job-form-step.d.ts +17 -0
  25. package/src/lib/jobs/ai-job-form-step.js +63 -11
  26. package/src/lib/jobs/ai-job-form-step.js.map +1 -1
  27. package/src/lib/jobs/ai-job-insight-step.js +6 -1
  28. package/src/lib/jobs/ai-job-insight-step.js.map +1 -1
  29. package/src/lib/jobs/ai-job-page-language.d.ts +10 -5
  30. package/src/lib/jobs/ai-job-page-language.js +10 -5
  31. package/src/lib/jobs/ai-job-page-language.js.map +1 -1
  32. package/src/lib/jobs/ai-job-plan-step.d.ts +32 -1
  33. package/src/lib/jobs/ai-job-plan-step.js +53 -2
  34. package/src/lib/jobs/ai-job-plan-step.js.map +1 -1
  35. package/src/lib/jobs/ai-job-seo-step.js +5 -3
  36. package/src/lib/jobs/ai-job-seo-step.js.map +1 -1
  37. package/src/lib/jobs/ai-job-site-content.d.ts +7 -5
  38. package/src/lib/jobs/ai-job-site-content.js +7 -5
  39. package/src/lib/jobs/ai-job-site-content.js.map +1 -1
  40. package/src/lib/jobs/ai-job-site-datasets.d.ts +1 -1
  41. package/src/lib/jobs/ai-job-site-datasets.js +2 -2
  42. package/src/lib/jobs/ai-job-site-datasets.js.map +1 -1
  43. package/src/lib/jobs/ai-job-site-step.js +2 -1
  44. package/src/lib/jobs/ai-job-site-step.js.map +1 -1
  45. package/src/lib/jobs/ai-job-text-step.js +6 -3
  46. package/src/lib/jobs/ai-job-text-step.js.map +1 -1
  47. package/src/lib/jobs/ai-layout-stock-photos.d.ts +11 -7
  48. package/src/lib/jobs/ai-layout-stock-photos.js +25 -10
  49. package/src/lib/jobs/ai-layout-stock-photos.js.map +1 -1
  50. package/src/lib/jobs/ai-stock-business-nouns.d.ts +62 -0
  51. package/src/lib/jobs/ai-stock-business-nouns.js +264 -0
  52. package/src/lib/jobs/ai-stock-business-nouns.js.map +1 -0
  53. package/src/lib/layout-language/ai-layout-language.js +5 -1
  54. package/src/lib/layout-language/ai-layout-language.js.map +1 -1
  55. package/src/lib/layout-language/ai-layout-links.js +5 -2
  56. package/src/lib/layout-language/ai-layout-links.js.map +1 -1
  57. package/src/lib/model/ai-build-plan.d.ts +7 -3
  58. package/src/lib/model/ai-build-plan.js +11 -1
  59. package/src/lib/model/ai-build-plan.js.map +1 -1
  60. package/src/lib/model/ai-credit-estimate.d.ts +39 -19
  61. package/src/lib/model/ai-credit-estimate.js +43 -19
  62. package/src/lib/model/ai-credit-estimate.js.map +1 -1
  63. package/src/lib/model/ai-job-activity.d.ts +30 -0
  64. package/src/lib/model/ai-job-activity.js +35 -0
  65. package/src/lib/model/ai-job-activity.js.map +1 -1
  66. package/src/lib/model/ai-media-credits.d.ts +5 -3
  67. package/src/lib/model/ai-media-credits.js +7 -5
  68. package/src/lib/model/ai-media-credits.js.map +1 -1
  69. package/src/lib/model/ai-site-job.js +6 -3
  70. package/src/lib/model/ai-site-job.js.map +1 -1
  71. package/src/lib/model/ai-site-start-seo.d.ts +11 -2
  72. package/src/lib/model/ai-site-start-seo.js +29 -15
  73. package/src/lib/model/ai-site-start-seo.js.map +1 -1
  74. package/src/lib/model/ai-site-store-pages.d.ts +5 -0
  75. package/src/lib/model/ai-site-store-pages.js +2 -0
  76. package/src/lib/model/ai-site-store-pages.js.map +1 -1
  77. package/src/lib/plugin-config.js +2 -2
  78. package/src/lib/plugin-config.js.map +1 -1
  79. package/src/lib/providers/anthropic-crm-wording-superseded.d.ts +29 -0
  80. package/src/lib/providers/anthropic-crm-wording-superseded.js +31 -0
  81. package/src/lib/providers/anthropic-crm-wording-superseded.js.map +1 -0
  82. package/src/lib/providers/anthropic.js +29 -7
  83. package/src/lib/providers/anthropic.js.map +1 -1
  84. package/src/lib/providers/catalog.d.ts +24 -17
  85. package/src/lib/providers/catalog.js +63 -30
  86. package/src/lib/providers/catalog.js.map +1 -1
  87. package/src/lib/providers/contract.d.ts +19 -1
  88. package/src/lib/providers/contract.js +10 -0
  89. package/src/lib/providers/contract.js.map +1 -1
  90. package/src/lib/providers/model-choice.d.ts +1 -1
  91. package/src/lib/providers/model-choice.js +39 -30
  92. package/src/lib/providers/model-choice.js.map +1 -1
  93. package/src/lib/providers/routing.d.ts +20 -1
  94. package/src/lib/providers/routing.js +71 -12
  95. package/src/lib/providers/routing.js.map +1 -1
  96. package/src/lib/runtime/ai-dev-env.d.ts +58 -1
  97. package/src/lib/runtime/ai-dev-env.js +86 -6
  98. package/src/lib/runtime/ai-dev-env.js.map +1 -1
  99. package/src/lib/runtime/ai-dev-replay.d.ts +4 -0
  100. package/src/lib/runtime/ai-dev-replay.js +4 -0
  101. package/src/lib/runtime/ai-dev-replay.js.map +1 -1
  102. package/src/lib/runtime/ai-doctrine-validators.js +13 -3
  103. package/src/lib/runtime/ai-doctrine-validators.js.map +1 -1
  104. package/src/lib/runtime/ai-doctrine.js +8 -4
  105. package/src/lib/runtime/ai-doctrine.js.map +1 -1
  106. package/src/lib/runtime/ai-eval-live.d.ts +43 -1
  107. package/src/lib/runtime/ai-eval-live.js +79 -9
  108. package/src/lib/runtime/ai-eval-live.js.map +1 -1
  109. package/src/lib/runtime/ai-live-batch.d.ts +20 -4
  110. package/src/lib/runtime/ai-live-batch.js +57 -10
  111. package/src/lib/runtime/ai-live-batch.js.map +1 -1
  112. package/src/lib/runtime/ai-palette.generated.js +4 -0
  113. package/src/lib/runtime/ai-palette.generated.js.map +1 -1
  114. package/src/lib/runtime/ai-runtime.js +21 -4
  115. package/src/lib/runtime/ai-runtime.js.map +1 -1
  116. package/src/lib/runtime/seo-fields.js +4 -3
  117. package/src/lib/runtime/seo-fields.js.map +1 -1
  118. package/src/lib/server/ai-assist.js +3 -2
  119. package/src/lib/server/ai-assist.js.map +1 -1
  120. package/src/lib/server/ai-media-image.d.ts +5 -1
  121. package/src/lib/server/ai-media-image.js +6 -2
  122. package/src/lib/server/ai-media-image.js.map +1 -1
  123. package/src/lib/server/ai-media-svg.js +4 -0
  124. package/src/lib/server/ai-media-svg.js.map +1 -1
  125. package/src/lib/usage/ai-allotment-alerts.js +2 -5
  126. package/src/lib/usage/ai-allotment-alerts.js.map +1 -1
@@ -14,7 +14,8 @@ import { _ as _extends } from "@swc/helpers/_/_extends";
14
14
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
15
  * See the License for the specific language governing permissions and
16
16
  * limitations under the License.
17
- */ import { assistCreditsFromUsd } from "../usage/assist-credits.js";
17
+ */ import { createHash } from "node:crypto";
18
+ import { assistCreditsFromUsd } from "../usage/assist-credits.js";
18
19
  import { LAYOUT_SLOT_COMPONENT_ID } from "@aglyn/aglyn/app-utils/compose-layout-nodes";
19
20
  import { stampDocumentLandmark } from "@aglyn/aglyn/app-utils/document-landmark";
20
21
  import { decodeStoredNodes } from "@aglyn/aglyn/app-utils/stored-nodes";
@@ -41,6 +42,7 @@ import { aiSiteInventoryBlock, runValidatedGeneration } from "./ai-doctrine.js";
41
42
  import { AI_EVAL_AUTOMATION_CAPABILITIES, AI_EVAL_SITE_ID, AI_EVAL_TREE_OUTPUT } from "./ai-eval.js";
42
43
  import { aiEvalMemoryFirestore, aiEvalMemoryInventory } from "./ai-eval-memory-firestore.js";
43
44
  import { aiCategoriesPrompt, aiProductCopyPrompt } from "./ai-products-generation.js";
45
+ import { aiDevEffortArm, aiLiveBatchWanted } from "./ai-dev-env.js";
44
46
  import { aiModelReadsImages } from "./ai-runtime.js";
45
47
  /**
46
48
  * THE EVAL HARNESS, LIVE (AGL-2937): recording new answers from the model.
@@ -1188,6 +1190,49 @@ const looseText = (value)=>typeof value === 'string' ? value.replace(/\s+/g, ' '
1188
1190
  }
1189
1191
  return result.value;
1190
1192
  }
1193
+ /**
1194
+ * The arm `AGLYN_AI_EFFORT` names, or null when it names none. A recording's
1195
+ * filename carries only the tag, and the recording carries the map: the
1196
+ * filename once spelled the whole list out, and a list of five kinds was
1197
+ * longer than a filename may be (ENAMETOOLONG lost the round's recordings).
1198
+ * The hash is of the parsed, sorted map, so the same efforts written in
1199
+ * another order or spacing are the same arm.
1200
+ */ export function aiEvalEffortArm(env) {
1201
+ const efforts = aiDevEffortArm(env);
1202
+ if (!Object.keys(efforts).length) return null;
1203
+ const hash = createHash('sha256').update(JSON.stringify(efforts)).digest('hex').slice(0, 8);
1204
+ return {
1205
+ tag: `effort-${hash}`,
1206
+ efforts
1207
+ };
1208
+ }
1209
+ /** A recording's file name: `<case>.<model>.json`, with the arm's tag before `.json` when one ran. */ export function aiEvalRecordingFileName(caseId, model, arm) {
1210
+ return `${caseId}.${model != null ? model : 'unknown'}${arm ? `.${arm.tag}` : ''}.json`;
1211
+ }
1212
+ /**
1213
+ * What a recording holds: the brief, the answer, and under `arm` the arm's
1214
+ * tag and every effort it named, when one ran — the candidate's own `effort`
1215
+ * is the one its step was asked at.
1216
+ */ export function aiEvalRecordingBody(caseId, candidate, arm) {
1217
+ return `${JSON.stringify(_extends({
1218
+ caseId
1219
+ }, arm ? {
1220
+ arm
1221
+ } : {}, {
1222
+ candidate
1223
+ }), null, 2)}\n`;
1224
+ }
1225
+ /**
1226
+ * One brief's score line. Everything before the colon is the pairing key —
1227
+ * `score <case> (<kind>) <model>`, then the arm's tag when one ran — so a
1228
+ * default run's line and an arm's line for the same brief sort side by side.
1229
+ */ export function aiEvalScoreLine(entry, pass, arm) {
1230
+ var _candidate_model, _ref, _ref1, _ref2, _ref3;
1231
+ var _candidate_usage;
1232
+ const { caseId, kind, candidate } = entry;
1233
+ const rubric = candidate.rubric;
1234
+ return `score ${caseId} (${kind}) ${(_candidate_model = candidate.model) != null ? _candidate_model : 'unknown'}${arm ? ` ${arm.tag}` : ''}: ` + `${pass ? 'pass' : 'fail'}, structure ${(_ref = rubric == null ? void 0 : rubric.structure) != null ? _ref : '-'}, copy ${(_ref1 = rubric == null ? void 0 : rubric.copy) != null ? _ref1 : '-'}` + `, reuse ${(_ref2 = rubric == null ? void 0 : rubric.reuse) != null ? _ref2 : '-'}, output ${(_ref3 = (_candidate_usage = candidate.usage) == null ? void 0 : _candidate_usage.outputTokens) != null ? _ref3 : '-'} tokens`;
1235
+ }
1191
1236
  /** The vendor's request id off a thrown `UpstreamServiceError`, when it carried one. */ function requestIdOfThrown(error) {
1192
1237
  const id = error == null ? void 0 : error.requestId;
1193
1238
  return typeof id === 'string' && id ? id : null;
@@ -1211,18 +1256,26 @@ function messageOfThrown(error) {
1211
1256
  *
1212
1257
  * A brief whose GRADE threw is in both halves: recorded, with its grade
1213
1258
  * marked missing, and failed, naming what the grader threw.
1259
+ *
1260
+ * ONE BATCH A ROUND (AGL-3781). In batch mode (`AGLYN_LIVE_AI_BATCH`) the
1261
+ * briefs run side by side: a batch gathers the requests that arrive within
1262
+ * its window, so briefs asked one after another went as one batch each,
1263
+ * minutes apart, while side by side every brief's answer goes in one batch,
1264
+ * each re-ask in the next and every grade in the one after. Each brief still
1265
+ * runs on its own and the report keeps the briefs' order. Outside batch mode
1266
+ * they run one after another, as a live run's rate limits want.
1214
1267
  */ export async function recordAiEvalLive(cases, options) {
1215
1268
  if (!aiEvalLiveAllowed(options.env)) throw new AiEvalLiveRefusedError();
1216
1269
  const unreadable = cases.filter((evalCase)=>evalCase.media && aiEvalRecorderFor(evalCase.kind) && !options.readFixture);
1217
1270
  if (unreadable.length) {
1218
1271
  throw new Error(`${unreadable.map((evalCase)=>evalCase.id).join(', ')} name media, and this run was given no readFixture to read them with`);
1219
1272
  }
1220
- const report = {
1221
- recorded: [],
1222
- skipped: [],
1223
- failed: []
1224
- };
1225
- for (const evalCase of cases){
1273
+ const runCase = async (evalCase)=>{
1274
+ const report = {
1275
+ recorded: [],
1276
+ skipped: [],
1277
+ failed: []
1278
+ };
1226
1279
  const recorder = aiEvalRecorderFor(evalCase.kind);
1227
1280
  if (!recorder) {
1228
1281
  report.skipped.push({
@@ -1230,7 +1283,7 @@ function messageOfThrown(error) {
1230
1283
  kind: evalCase.kind,
1231
1284
  why: aiEvalSkipReason(evalCase.kind)
1232
1285
  });
1233
- continue;
1286
+ return report;
1234
1287
  }
1235
1288
  const failure = (step, error)=>{
1236
1289
  report.failed.push({
@@ -1246,7 +1299,7 @@ function messageOfThrown(error) {
1246
1299
  answer = await recorder(evalCase, options);
1247
1300
  } catch (error) {
1248
1301
  failure('record', error);
1249
- continue;
1302
+ return report;
1250
1303
  }
1251
1304
  // A GRADER THAT THROWS DOES NOT TAKE THE ANSWER WITH IT (AGL-3143). The
1252
1305
  // brief is already paid for by here, and grading is a second request that
@@ -1273,6 +1326,23 @@ function messageOfThrown(error) {
1273
1326
  });
1274
1327
  failure('grade', error);
1275
1328
  }
1329
+ return report;
1330
+ };
1331
+ const reports = [];
1332
+ if (aiLiveBatchWanted(options.env)) {
1333
+ reports.push(...await Promise.all(cases.map(runCase)));
1334
+ } else {
1335
+ for (const evalCase of cases)reports.push(await runCase(evalCase));
1336
+ }
1337
+ const report = {
1338
+ recorded: [],
1339
+ skipped: [],
1340
+ failed: []
1341
+ };
1342
+ for (const one of reports){
1343
+ report.recorded.push(...one.recorded);
1344
+ report.skipped.push(...one.skipped);
1345
+ report.failed.push(...one.failed);
1276
1346
  }
1277
1347
  return report;
1278
1348
  }