@thanh01.pmt/curriculum-kit 1.4.51 → 1.4.53
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/dist/ai/index.cjs +148 -3
- package/dist/ai/index.cjs.map +1 -1
- package/dist/ai/index.mjs +148 -3
- package/dist/ai/index.mjs.map +1 -1
- package/dist/index.cjs +23339 -23257
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.mjs +23340 -23258
- package/dist/index.mjs.map +1 -1
- package/dist/pipeline/index.cjs +148 -1
- package/dist/pipeline/index.cjs.map +1 -1
- package/dist/pipeline/index.mjs +148 -1
- package/dist/pipeline/index.mjs.map +1 -1
- package/dist/workflow/index.cjs +152 -1
- package/dist/workflow/index.cjs.map +1 -1
- package/dist/workflow/index.mjs +152 -1
- package/dist/workflow/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/workflow/index.cjs
CHANGED
|
@@ -8,6 +8,7 @@ var deepseek = require('@ai-sdk/deepseek');
|
|
|
8
8
|
var url = require('url');
|
|
9
9
|
var ai = require('ai');
|
|
10
10
|
var zod = require('zod');
|
|
11
|
+
var jsonrepair = require('jsonrepair');
|
|
11
12
|
var workflow = require('workflow');
|
|
12
13
|
var fs3 = require('fs/promises');
|
|
13
14
|
var rest = require('@octokit/rest');
|
|
@@ -3864,6 +3865,156 @@ async function generateExtensionFlow(input) {
|
|
|
3864
3865
|
|
|
3865
3866
|
// src/ai/flows/auditCurriculumQualityFlow.ts
|
|
3866
3867
|
init_provider_factory();
|
|
3868
|
+
|
|
3869
|
+
// src/services/prefillService.ts
|
|
3870
|
+
init_streamRunner();
|
|
3871
|
+
init_provider_factory();
|
|
3872
|
+
function closeTruncatedJson(candidate) {
|
|
3873
|
+
let inStr = false;
|
|
3874
|
+
let esc = false;
|
|
3875
|
+
const stack = [];
|
|
3876
|
+
for (let i = 0; i < candidate.length; i++) {
|
|
3877
|
+
const ch = candidate[i];
|
|
3878
|
+
if (esc) {
|
|
3879
|
+
esc = false;
|
|
3880
|
+
continue;
|
|
3881
|
+
}
|
|
3882
|
+
if (inStr) {
|
|
3883
|
+
if (ch === "\\") esc = true;
|
|
3884
|
+
else if (ch === '"') inStr = false;
|
|
3885
|
+
continue;
|
|
3886
|
+
}
|
|
3887
|
+
if (ch === '"') inStr = true;
|
|
3888
|
+
else if (ch === "{" || ch === "[") stack.push(ch);
|
|
3889
|
+
else if (ch === "}" || ch === "]") stack.pop();
|
|
3890
|
+
}
|
|
3891
|
+
if (stack.length === 0 && !inStr) return null;
|
|
3892
|
+
let out = candidate;
|
|
3893
|
+
out = out.replace(/,\s*$/, "");
|
|
3894
|
+
if (inStr) {
|
|
3895
|
+
out = out.replace(/\\+$/, "");
|
|
3896
|
+
out += '"';
|
|
3897
|
+
}
|
|
3898
|
+
while (stack.length > 0) {
|
|
3899
|
+
out += stack.pop() === "{" ? "}" : "]";
|
|
3900
|
+
}
|
|
3901
|
+
return out;
|
|
3902
|
+
}
|
|
3903
|
+
function stripLlmJsonWrappers(rawText) {
|
|
3904
|
+
let cleaned = rawText.replace(/<think>[\s\S]*?<\/think>/gi, "").replace(/```json\s*/gi, "").replace(/```\s*/g, "").trim();
|
|
3905
|
+
const firstBrace = cleaned.indexOf("{");
|
|
3906
|
+
if (firstBrace > 0) {
|
|
3907
|
+
cleaned = cleaned.slice(firstBrace);
|
|
3908
|
+
}
|
|
3909
|
+
return cleaned.trim();
|
|
3910
|
+
}
|
|
3911
|
+
function safeParseJson(rawText) {
|
|
3912
|
+
if (!rawText) return null;
|
|
3913
|
+
const cleaned = stripLlmJsonWrappers(rawText);
|
|
3914
|
+
if (!cleaned) return null;
|
|
3915
|
+
try {
|
|
3916
|
+
return JSON.parse(cleaned);
|
|
3917
|
+
} catch {
|
|
3918
|
+
}
|
|
3919
|
+
const firstBrace = cleaned.indexOf("{");
|
|
3920
|
+
if (firstBrace === -1) return null;
|
|
3921
|
+
const buildCandidates = () => {
|
|
3922
|
+
const list = [];
|
|
3923
|
+
const closed = closeTruncatedJson(cleaned.slice(firstBrace));
|
|
3924
|
+
if (closed) list.push(closed);
|
|
3925
|
+
const lastBrace = cleaned.lastIndexOf("}");
|
|
3926
|
+
if (lastBrace > firstBrace) {
|
|
3927
|
+
list.push(cleaned.slice(firstBrace, lastBrace + 1));
|
|
3928
|
+
}
|
|
3929
|
+
return list;
|
|
3930
|
+
};
|
|
3931
|
+
for (const candidate of buildCandidates()) {
|
|
3932
|
+
try {
|
|
3933
|
+
return JSON.parse(candidate);
|
|
3934
|
+
} catch {
|
|
3935
|
+
}
|
|
3936
|
+
try {
|
|
3937
|
+
return JSON.parse(jsonrepair.jsonrepair(candidate));
|
|
3938
|
+
} catch {
|
|
3939
|
+
}
|
|
3940
|
+
}
|
|
3941
|
+
let depth = 0;
|
|
3942
|
+
let inStr = false;
|
|
3943
|
+
let esc = false;
|
|
3944
|
+
for (let i = firstBrace; i < cleaned.length; i++) {
|
|
3945
|
+
const ch = cleaned[i];
|
|
3946
|
+
if (esc) {
|
|
3947
|
+
esc = false;
|
|
3948
|
+
continue;
|
|
3949
|
+
}
|
|
3950
|
+
if (inStr) {
|
|
3951
|
+
if (ch === "\\") esc = true;
|
|
3952
|
+
else if (ch === '"') inStr = false;
|
|
3953
|
+
continue;
|
|
3954
|
+
}
|
|
3955
|
+
if (ch === '"') inStr = true;
|
|
3956
|
+
else if (ch === "{") depth++;
|
|
3957
|
+
else if (ch === "}") {
|
|
3958
|
+
depth--;
|
|
3959
|
+
if (depth === 0) {
|
|
3960
|
+
const candidate = cleaned.slice(firstBrace, i + 1);
|
|
3961
|
+
try {
|
|
3962
|
+
return JSON.parse(candidate);
|
|
3963
|
+
} catch {
|
|
3964
|
+
}
|
|
3965
|
+
try {
|
|
3966
|
+
return JSON.parse(jsonrepair.jsonrepair(candidate));
|
|
3967
|
+
} catch {
|
|
3968
|
+
}
|
|
3969
|
+
}
|
|
3970
|
+
}
|
|
3971
|
+
}
|
|
3972
|
+
try {
|
|
3973
|
+
return JSON.parse(jsonrepair.jsonrepair(cleaned));
|
|
3974
|
+
} catch {
|
|
3975
|
+
}
|
|
3976
|
+
return null;
|
|
3977
|
+
}
|
|
3978
|
+
|
|
3979
|
+
// src/ai/flows/auditCurriculumQualityFlow.ts
|
|
3980
|
+
var REPAIR_SUFFIX = "\n\nCRITICAL OUTPUT FORMAT FIX: your previous response could not be parsed as JSON. Output ONLY the raw JSON object \u2014 no markdown code fences, no prose before or after. Start with { and end with }.";
|
|
3981
|
+
function extractRawText(err) {
|
|
3982
|
+
const e = err;
|
|
3983
|
+
if (typeof e?.text === "string" && e.text) return e.text;
|
|
3984
|
+
const cause = e?.cause;
|
|
3985
|
+
if (typeof cause?.text === "string" && cause.text) return cause.text;
|
|
3986
|
+
const msg = typeof e?.message === "string" ? e.message : typeof cause?.message === "string" ? cause.message : "";
|
|
3987
|
+
const m = msg.match(/Text: ([\s\S]+)/);
|
|
3988
|
+
return m ? m[1] : "";
|
|
3989
|
+
}
|
|
3990
|
+
async function generateJudgeObject(opts) {
|
|
3991
|
+
let firstText = "";
|
|
3992
|
+
try {
|
|
3993
|
+
return (await ai.generateObject({ model: opts.model, schema: opts.schema, prompt: opts.prompt })).object;
|
|
3994
|
+
} catch (err) {
|
|
3995
|
+
firstText = extractRawText(err);
|
|
3996
|
+
if (firstText) {
|
|
3997
|
+
const salvaged = safeParseJson(firstText);
|
|
3998
|
+
if (salvaged) {
|
|
3999
|
+
const check = opts.schema.safeParse(salvaged);
|
|
4000
|
+
if (check.success) return check.data;
|
|
4001
|
+
}
|
|
4002
|
+
}
|
|
4003
|
+
try {
|
|
4004
|
+
return (await ai.generateObject({ model: opts.model, schema: opts.schema, prompt: opts.prompt + REPAIR_SUFFIX })).object;
|
|
4005
|
+
} catch (err2) {
|
|
4006
|
+
const secondText = extractRawText(err2);
|
|
4007
|
+
if (secondText && secondText !== firstText) {
|
|
4008
|
+
const salvaged2 = safeParseJson(secondText);
|
|
4009
|
+
if (salvaged2) {
|
|
4010
|
+
const check2 = opts.schema.safeParse(salvaged2);
|
|
4011
|
+
if (check2.success) return check2.data;
|
|
4012
|
+
}
|
|
4013
|
+
}
|
|
4014
|
+
throw err2;
|
|
4015
|
+
}
|
|
4016
|
+
}
|
|
4017
|
+
}
|
|
3867
4018
|
async function auditCurriculumQualityFlow(input) {
|
|
3868
4019
|
const model = getAIModel(input.modelOptions);
|
|
3869
4020
|
const prompt = buildJudgePrompt({
|
|
@@ -3874,7 +4025,7 @@ async function auditCurriculumQualityFlow(input) {
|
|
|
3874
4025
|
generatedContentJson: input.generatedContentJson,
|
|
3875
4026
|
standardStatements: input.standardStatements
|
|
3876
4027
|
});
|
|
3877
|
-
const
|
|
4028
|
+
const object = await generateJudgeObject({
|
|
3878
4029
|
model,
|
|
3879
4030
|
schema: CurriculumQualityReportSchema,
|
|
3880
4031
|
prompt: `${prompt}
|