@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.
- package/package.json +17 -17
- package/src/lib/components/ai-brief-dialog.component.js +15 -1
- package/src/lib/components/ai-brief-dialog.component.js.map +1 -1
- package/src/lib/components/ai-job-links.js +1 -1
- package/src/lib/components/ai-job-links.js.map +1 -1
- package/src/lib/components/ai-job-plan.component.js +20 -2
- package/src/lib/components/ai-job-plan.component.js.map +1 -1
- package/src/lib/components/ai-jobs-store.d.ts +11 -0
- package/src/lib/components/ai-jobs-store.js +22 -0
- package/src/lib/components/ai-jobs-store.js.map +1 -1
- package/src/lib/jobs/ai-job-crm-step.js +7 -4
- package/src/lib/jobs/ai-job-crm-step.js.map +1 -1
- package/src/lib/jobs/ai-job-drafts.d.ts +24 -0
- package/src/lib/jobs/ai-job-drafts.js +46 -0
- package/src/lib/jobs/ai-job-drafts.js.map +1 -1
- package/src/lib/jobs/ai-job-experiment-step.js +6 -1
- package/src/lib/jobs/ai-job-experiment-step.js.map +1 -1
- package/src/lib/jobs/ai-job-form-dataset.d.ts +6 -1
- package/src/lib/jobs/ai-job-form-dataset.js +7 -2
- package/src/lib/jobs/ai-job-form-dataset.js.map +1 -1
- package/src/lib/jobs/ai-job-form-reuse.d.ts +78 -0
- package/src/lib/jobs/ai-job-form-reuse.js +136 -0
- package/src/lib/jobs/ai-job-form-reuse.js.map +1 -0
- package/src/lib/jobs/ai-job-form-step.d.ts +17 -0
- package/src/lib/jobs/ai-job-form-step.js +63 -11
- package/src/lib/jobs/ai-job-form-step.js.map +1 -1
- package/src/lib/jobs/ai-job-insight-step.js +6 -1
- package/src/lib/jobs/ai-job-insight-step.js.map +1 -1
- package/src/lib/jobs/ai-job-page-language.d.ts +10 -5
- package/src/lib/jobs/ai-job-page-language.js +10 -5
- package/src/lib/jobs/ai-job-page-language.js.map +1 -1
- package/src/lib/jobs/ai-job-plan-step.d.ts +32 -1
- package/src/lib/jobs/ai-job-plan-step.js +53 -2
- package/src/lib/jobs/ai-job-plan-step.js.map +1 -1
- package/src/lib/jobs/ai-job-seo-step.js +5 -3
- package/src/lib/jobs/ai-job-seo-step.js.map +1 -1
- package/src/lib/jobs/ai-job-site-content.d.ts +7 -5
- package/src/lib/jobs/ai-job-site-content.js +7 -5
- package/src/lib/jobs/ai-job-site-content.js.map +1 -1
- package/src/lib/jobs/ai-job-site-datasets.d.ts +1 -1
- package/src/lib/jobs/ai-job-site-datasets.js +2 -2
- package/src/lib/jobs/ai-job-site-datasets.js.map +1 -1
- package/src/lib/jobs/ai-job-site-step.js +2 -1
- package/src/lib/jobs/ai-job-site-step.js.map +1 -1
- package/src/lib/jobs/ai-job-text-step.js +6 -3
- package/src/lib/jobs/ai-job-text-step.js.map +1 -1
- package/src/lib/jobs/ai-layout-stock-photos.d.ts +11 -7
- package/src/lib/jobs/ai-layout-stock-photos.js +25 -10
- package/src/lib/jobs/ai-layout-stock-photos.js.map +1 -1
- package/src/lib/jobs/ai-stock-business-nouns.d.ts +62 -0
- package/src/lib/jobs/ai-stock-business-nouns.js +264 -0
- package/src/lib/jobs/ai-stock-business-nouns.js.map +1 -0
- package/src/lib/layout-language/ai-layout-language.js +5 -1
- package/src/lib/layout-language/ai-layout-language.js.map +1 -1
- package/src/lib/layout-language/ai-layout-links.js +5 -2
- package/src/lib/layout-language/ai-layout-links.js.map +1 -1
- package/src/lib/model/ai-build-plan.d.ts +7 -3
- package/src/lib/model/ai-build-plan.js +11 -1
- package/src/lib/model/ai-build-plan.js.map +1 -1
- package/src/lib/model/ai-credit-estimate.d.ts +39 -19
- package/src/lib/model/ai-credit-estimate.js +43 -19
- package/src/lib/model/ai-credit-estimate.js.map +1 -1
- package/src/lib/model/ai-job-activity.d.ts +30 -0
- package/src/lib/model/ai-job-activity.js +35 -0
- package/src/lib/model/ai-job-activity.js.map +1 -1
- package/src/lib/model/ai-media-credits.d.ts +5 -3
- package/src/lib/model/ai-media-credits.js +7 -5
- package/src/lib/model/ai-media-credits.js.map +1 -1
- package/src/lib/model/ai-site-job.js +6 -3
- package/src/lib/model/ai-site-job.js.map +1 -1
- package/src/lib/model/ai-site-start-seo.d.ts +11 -2
- package/src/lib/model/ai-site-start-seo.js +29 -15
- package/src/lib/model/ai-site-start-seo.js.map +1 -1
- package/src/lib/model/ai-site-store-pages.d.ts +5 -0
- package/src/lib/model/ai-site-store-pages.js +2 -0
- package/src/lib/model/ai-site-store-pages.js.map +1 -1
- package/src/lib/plugin-config.js +2 -2
- package/src/lib/plugin-config.js.map +1 -1
- package/src/lib/providers/anthropic-crm-wording-superseded.d.ts +29 -0
- package/src/lib/providers/anthropic-crm-wording-superseded.js +31 -0
- package/src/lib/providers/anthropic-crm-wording-superseded.js.map +1 -0
- package/src/lib/providers/anthropic.js +29 -7
- package/src/lib/providers/anthropic.js.map +1 -1
- package/src/lib/providers/catalog.d.ts +24 -17
- package/src/lib/providers/catalog.js +63 -30
- package/src/lib/providers/catalog.js.map +1 -1
- package/src/lib/providers/contract.d.ts +19 -1
- package/src/lib/providers/contract.js +10 -0
- package/src/lib/providers/contract.js.map +1 -1
- package/src/lib/providers/model-choice.d.ts +1 -1
- package/src/lib/providers/model-choice.js +39 -30
- package/src/lib/providers/model-choice.js.map +1 -1
- package/src/lib/providers/routing.d.ts +20 -1
- package/src/lib/providers/routing.js +71 -12
- package/src/lib/providers/routing.js.map +1 -1
- package/src/lib/runtime/ai-dev-env.d.ts +58 -1
- package/src/lib/runtime/ai-dev-env.js +86 -6
- package/src/lib/runtime/ai-dev-env.js.map +1 -1
- package/src/lib/runtime/ai-dev-replay.d.ts +4 -0
- package/src/lib/runtime/ai-dev-replay.js +4 -0
- package/src/lib/runtime/ai-dev-replay.js.map +1 -1
- package/src/lib/runtime/ai-doctrine-validators.js +13 -3
- package/src/lib/runtime/ai-doctrine-validators.js.map +1 -1
- package/src/lib/runtime/ai-doctrine.js +8 -4
- package/src/lib/runtime/ai-doctrine.js.map +1 -1
- package/src/lib/runtime/ai-eval-live.d.ts +43 -1
- package/src/lib/runtime/ai-eval-live.js +79 -9
- package/src/lib/runtime/ai-eval-live.js.map +1 -1
- package/src/lib/runtime/ai-live-batch.d.ts +20 -4
- package/src/lib/runtime/ai-live-batch.js +57 -10
- package/src/lib/runtime/ai-live-batch.js.map +1 -1
- package/src/lib/runtime/ai-palette.generated.js +4 -0
- package/src/lib/runtime/ai-palette.generated.js.map +1 -1
- package/src/lib/runtime/ai-runtime.js +21 -4
- package/src/lib/runtime/ai-runtime.js.map +1 -1
- package/src/lib/runtime/seo-fields.js +4 -3
- package/src/lib/runtime/seo-fields.js.map +1 -1
- package/src/lib/server/ai-assist.js +3 -2
- package/src/lib/server/ai-assist.js.map +1 -1
- package/src/lib/server/ai-media-image.d.ts +5 -1
- package/src/lib/server/ai-media-image.js +6 -2
- package/src/lib/server/ai-media-image.js.map +1 -1
- package/src/lib/server/ai-media-svg.js +4 -0
- package/src/lib/server/ai-media-svg.js.map +1 -1
- package/src/lib/usage/ai-allotment-alerts.js +2 -5
- 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 {
|
|
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
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|