@exercode/problem-utils 1.6.0 → 1.7.1

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.
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),r=require("node:fs"),s=require("node:path"),t=require("@ai-sdk/google"),n=require("ai"),a=require("zod"),i=require("../helpers/parseArgs.cjs"),o=require("../helpers/printTestCaseResult.cjs"),u=require("../helpers/readTestCases.cjs"),c=require("../types/decisionCode.cjs"),l=a.z.object({model:a.z.enum(["google/gemini-2.5-flash-lite"])});function p(){return(p=e.asyncToGenerator(e.regenerator().m(function a(p,d){var C,g,m,f,v,q,T,b,j,h,D,E,R,k,w,A,P,x,y,I;return e.regenerator().w(function(a){for(;;)switch(a.p=a.n){case 0:return C=i.parseArgs(process.argv),g=l.parse(C.params),a.n=1,u.readTestCases(s.join(p,"test_cases"));case 1:return m=a.v,a.n=2,r.promises.readFile(s.join(C.cwd,"prompt.txt"),"utf8");case 2:f=a.v,v=e.createForOfIteratorHelper(m),a.p=3,v.s();case 4:if((q=v.n()).done){a.n=11;break}return T=q.value,b=Date.now(),a.p=5,a.n=6,n.generateText({model:t.google(g.model.slice(7)),prompt:null!=(j=null==(h=d.buildPrompt)?void 0:h.call(d,{prompt:f,testCase:T}))?j:f.replaceAll("{input}",null!=(D=T.input)?D:"")});case 6:return E=a.v,R=E.text,k=Date.now(),P=e.objectSpread2,x={testCaseId:T.id,decisionCode:c.DecisionCode.ACCEPTED,stdin:T.input,stdout:R,timeSeconds:(k-b)/1e3},a.n=7,d.test({testCase:T,result:{output:R}});case 7:if(w=P(x,a.v),o.printTestCaseResult(w),w.decisionCode===c.DecisionCode.ACCEPTED){a.n=8;break}return a.a(3,11);case 8:a.n=10;break;case 9:return a.p=9,y=a.v,A=Date.now(),o.printTestCaseResult({testCaseId:T.id,decisionCode:c.DecisionCode.RUNTIME_ERROR,stdin:T.input,stderr:y instanceof Error?y.message:String(y),timeSeconds:(A-b)/1e3}),a.a(3,11);case 10:a.n=4;break;case 11:a.n=13;break;case 12:a.p=12,I=a.v,v.e(I);case 13:return a.p=13,v.f(),a.f(13);case 14:return a.a(2)}},a,null,[[5,9],[3,12,13,14]])}))).apply(this,arguments)}exports.llmJudgePreset=function(e,r){return p.apply(this,arguments)};
1
+ "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),r=require("node:fs"),t=require("node:path"),s=require("@ai-sdk/amazon-bedrock"),n=require("@ai-sdk/google"),a=require("@ai-sdk/openai"),o=require("@ai-sdk/xai"),i=require("ai"),u=require("zod"),c=require("../helpers/parseArgs.cjs"),d=require("../helpers/printTestCaseResult.cjs"),l=require("../helpers/readTestCases.cjs"),p=require("../types/decisionCode.cjs"),C={bedrock:s.bedrock,google:n.google,openai:a.openai,xai:o.xai},m=u.z.object({model:u.z.string().min(1)});function f(){return(f=e.asyncToGenerator(e.regenerator().m(function s(n,a){var o,u,C,f,v,b,q,k,T,w,h,j,E,D,x,R,A,y,P,z;return e.regenerator().w(function(s){for(;;)switch(s.p=s.n){case 0:return o=c.parseArgs(process.argv),u=m.parse(o.params),s.n=1,l.readTestCases(t.join(n,"test_cases"));case 1:return C=s.v,s.n=2,r.promises.readFile(t.join(o.cwd,"prompt.txt"),"utf8");case 2:f=s.v,v=e.createForOfIteratorHelper(C),s.p=3,v.s();case 4:if((b=v.n()).done){s.n=11;break}return q=b.value,k=Date.now(),s.p=5,s.n=6,i.generateText({model:g(u.model),prompt:null!=(T=null==(w=a.buildPrompt)?void 0:w.call(a,{prompt:f,testCase:q}))?T:f.replaceAll("{input}",null!=(h=q.input)?h:"")});case 6:return j=s.v,E=j.text,D=Date.now(),A=e.objectSpread2,y={testCaseId:q.id,decisionCode:p.DecisionCode.ACCEPTED,stdin:q.input,stdout:E,timeSeconds:(D-k)/1e3},s.n=7,a.test({testCase:q,result:{output:E}});case 7:if(x=A(y,s.v),d.printTestCaseResult(x),x.decisionCode===p.DecisionCode.ACCEPTED){s.n=8;break}return s.a(3,11);case 8:s.n=10;break;case 9:return s.p=9,P=s.v,R=Date.now(),d.printTestCaseResult({testCaseId:q.id,decisionCode:p.DecisionCode.RUNTIME_ERROR,stdin:q.input,stderr:P instanceof Error?P.message:String(P),timeSeconds:(R-k)/1e3}),s.a(3,11);case 10:s.n=4;break;case 11:s.n=13;break;case 12:s.p=12,z=s.v,v.e(z);case 13:return s.p=13,v.f(),s.f(13);case 14:return s.a(2)}},s,null,[[5,9],[3,12,13,14]])}))).apply(this,arguments)}function g(r){var t,s=r.split("/"),n=e.slicedToArray(s,2),a=n[0],o=n[1];if(!a||!o)throw new Error("bad model: ".concat(r));var i=null==(t=C[a])?void 0:t.call(C,o);if(!i)throw new Error("model not found: ".concat(r));return i}exports.llmJudgePreset=function(e,r){return f.apply(this,arguments)};
2
2
  //# sourceMappingURL=llm.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"llm.cjs","sources":["../../src/presets/llm.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { google } from '@ai-sdk/google';\nimport type { ModelMessage } from 'ai';\nimport { generateText } from 'ai';\nimport { z } from 'zod';\n\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { readTestCases } from '../helpers/readTestCases.js';\nimport { DecisionCode } from '../types/decisionCode.js';\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nconst PROMPT_FILENAME = 'prompt.txt';\n\nconst judgeParamsSchema = z.object({\n model: z.enum(['google/gemini-2.5-flash-lite']),\n});\n\ninterface LlmJudgePresetOptions {\n buildPrompt?: (context: {\n prompt: string;\n testCase: { id: string; input?: string; output?: string };\n }) => string | ModelMessage[];\n test: (context: {\n testCase: { id: string; input?: string; output?: string };\n result: { output: string };\n }) => Partial<TestCaseResult> | Promise<Partial<TestCaseResult>>;\n}\n\n/**\n * A preset judge function for running and testing a user prompt in LLM.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { llmJudgePreset } from '@exercode/problem-utils/presets/llm';\n * import { DecisionCode } from '@exercode/problem-utils';\n *\n * await llmJudgePreset(import.meta.dirname, {\n * test: (context) {\n * return { decisionCode: context.result.output ? DecisionCode.ACCEPTED : DecisionCode.WRONG_ANSWER };\n * }\n * });\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun judge.ts model_answers/java '{ \"model\": \"gemini-2.5-flash-lite\" }'\n * ```\n */\nexport async function llmJudgePreset(problemDir: string, options: LlmJudgePresetOptions): Promise<void> {\n const args = parseArgs(process.argv);\n const params = judgeParamsSchema.parse(args.params);\n\n const testCases = await readTestCases(path.join(problemDir, 'test_cases'));\n\n const prompt = await fs.promises.readFile(path.join(args.cwd, PROMPT_FILENAME), 'utf8');\n\n for (const testCase of testCases) {\n const startTimeMilliseconds = Date.now();\n try {\n // requires `GOOGLE_GENERATIVE_AI_API_KEY`\n const { text } = await generateText({\n model: google(params.model.slice('google/'.length)),\n prompt: options.buildPrompt?.({ prompt, testCase }) ?? prompt.replaceAll('{input}', testCase.input ?? ''),\n });\n\n const stopTimeMilliseconds = Date.now();\n\n const testCaseResult = {\n testCaseId: testCase.id,\n decisionCode: DecisionCode.ACCEPTED,\n stdin: testCase.input,\n stdout: text,\n timeSeconds: (stopTimeMilliseconds - startTimeMilliseconds) / 1000,\n ...(await options.test({ testCase, result: { output: text } })),\n };\n\n printTestCaseResult(testCaseResult);\n\n if (testCaseResult.decisionCode !== DecisionCode.ACCEPTED) break;\n } catch (error) {\n const stopTimeMilliseconds = Date.now();\n\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin: testCase.input,\n stderr: error instanceof Error ? error.message : String(error),\n timeSeconds: (stopTimeMilliseconds - startTimeMilliseconds) / 1000,\n });\n\n break;\n }\n }\n}\n"],"names":["judgeParamsSchema","z","object","model","_llmJudgePreset","_asyncToGenerator","_regenerator","m","_callee","problemDir","options","args","params","testCases","prompt","_iterator","_step","testCase","startTimeMilliseconds","_options$buildPrompt","_options$buildPrompt2","_testCase$input","_yield$generateText","text","stopTimeMilliseconds","testCaseResult","_stopTimeMilliseconds","_t","_t2","_t3","_t4","w","_context","p","n","parseArgs","process","argv","parse","readTestCases","path","join","v","fs","promises","readFile","cwd","_createForOfIteratorHelper","s","done","value","Date","now","generateText","google","slice","buildPrompt","call","replaceAll","input","_objectSpread","testCaseId","id","decisionCode","DecisionCode","ACCEPTED","stdin","stdout","timeSeconds","test","result","output","printTestCaseResult","a","RUNTIME_ERROR","stderr","Error","message","String","e","f","apply","this","arguments","_x","_x2"],"mappings":"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"}
1
+ {"version":3,"file":"llm.cjs","sources":["../../src/presets/llm.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { bedrock } from '@ai-sdk/amazon-bedrock';\nimport { google } from '@ai-sdk/google';\nimport { openai } from '@ai-sdk/openai';\nimport { xai } from '@ai-sdk/xai';\nimport type { LanguageModel, ModelMessage } from 'ai';\nimport { generateText } from 'ai';\nimport { z } from 'zod';\n\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { readTestCases } from '../helpers/readTestCases.js';\nimport { DecisionCode } from '../types/decisionCode.js';\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nconst PROMPT_FILENAME = 'prompt.txt';\n\nconst providerByName: Record<string, typeof bedrock | typeof google | typeof openai | typeof xai> = {\n // requires `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_REGION`\n bedrock,\n // requires `GOOGLE_GENERATIVE_AI_API_KEY`\n google,\n // requires `OPENAI_API_KEY`\n openai,\n // requires `XAI_API_KEY`\n xai,\n} as const;\n\nconst judgeParamsSchema = z.object({\n model: z.string().min(1),\n});\n\ninterface LlmJudgePresetOptions {\n buildPrompt?: (context: {\n prompt: string;\n testCase: { id: string; input?: string; output?: string };\n }) => string | ModelMessage[];\n test: (context: {\n testCase: { id: string; input?: string; output?: string };\n result: { output: string };\n }) => Partial<TestCaseResult> | Promise<Partial<TestCaseResult>>;\n}\n\n/**\n * A preset judge function for running and testing a user prompt in LLM.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { llmJudgePreset } from '@exercode/problem-utils/presets/llm';\n * import { DecisionCode } from '@exercode/problem-utils';\n *\n * await llmJudgePreset(import.meta.dirname, {\n * test: (context) {\n * return { decisionCode: context.result.output ? DecisionCode.ACCEPTED : DecisionCode.WRONG_ANSWER };\n * }\n * });\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun judge.ts model_answers/java '{ \"model\": \"gemini-2.5-flash-lite\" }'\n * ```\n */\nexport async function llmJudgePreset(problemDir: string, options: LlmJudgePresetOptions): Promise<void> {\n const args = parseArgs(process.argv);\n const params = judgeParamsSchema.parse(args.params);\n\n const testCases = await readTestCases(path.join(problemDir, 'test_cases'));\n\n const prompt = await fs.promises.readFile(path.join(args.cwd, PROMPT_FILENAME), 'utf8');\n\n for (const testCase of testCases) {\n const startTimeMilliseconds = Date.now();\n try {\n const { text } = await generateText({\n model: toLanguageModel(params.model),\n prompt: options.buildPrompt?.({ prompt, testCase }) ?? prompt.replaceAll('{input}', testCase.input ?? ''),\n });\n\n const stopTimeMilliseconds = Date.now();\n\n const testCaseResult = {\n testCaseId: testCase.id,\n decisionCode: DecisionCode.ACCEPTED,\n stdin: testCase.input,\n stdout: text,\n timeSeconds: (stopTimeMilliseconds - startTimeMilliseconds) / 1000,\n ...(await options.test({ testCase, result: { output: text } })),\n };\n\n printTestCaseResult(testCaseResult);\n\n if (testCaseResult.decisionCode !== DecisionCode.ACCEPTED) break;\n } catch (error) {\n const stopTimeMilliseconds = Date.now();\n\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin: testCase.input,\n stderr: error instanceof Error ? error.message : String(error),\n timeSeconds: (stopTimeMilliseconds - startTimeMilliseconds) / 1000,\n });\n\n break;\n }\n }\n}\n\nfunction toLanguageModel(model: string): LanguageModel {\n const [providerId, modelId] = model.split('/');\n if (!providerId || !modelId) throw new Error(`bad model: ${model}`);\n const languageModel = providerByName[providerId]?.(modelId);\n if (!languageModel) throw new Error(`model not found: ${model}`);\n return languageModel;\n}\n"],"names":["providerByName","bedrock","google","openai","xai","judgeParamsSchema","z","object","model","string","min","_llmJudgePreset","_asyncToGenerator","_regenerator","m","_callee","problemDir","options","args","params","testCases","prompt","_iterator","_step","testCase","startTimeMilliseconds","_options$buildPrompt","_options$buildPrompt2","_testCase$input","_yield$generateText","text","stopTimeMilliseconds","testCaseResult","_stopTimeMilliseconds","_t","_t2","_t3","_t4","w","_context","p","n","parseArgs","process","argv","parse","readTestCases","path","join","v","fs","promises","readFile","cwd","_createForOfIteratorHelper","s","done","value","Date","now","generateText","toLanguageModel","buildPrompt","call","replaceAll","input","_objectSpread","testCaseId","id","decisionCode","DecisionCode","ACCEPTED","stdin","stdout","timeSeconds","test","result","output","printTestCaseResult","a","RUNTIME_ERROR","stderr","Error","message","String","e","f","apply","this","arguments","_providerByName$provi","_model$split","split","_model$split2","_slicedToArray","providerId","modelId","concat","languageModel","_x","_x2"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{asyncToGenerator as e,regenerator as r,objectSpread2 as t,createForOfIteratorHelper as s}from"../_virtual/_rollupPluginBabelHelpers.js";import o from"node:fs";import n from"node:path";import{google as a}from"@ai-sdk/google";import{generateText as i}from"ai";import{z as p}from"zod";import{parseArgs as l}from"../helpers/parseArgs.js";import{printTestCaseResult as c}from"../helpers/printTestCaseResult.js";import{readTestCases as m}from"../helpers/readTestCases.js";import{DecisionCode as u}from"../types/decisionCode.js";var d=p.object({model:p.enum(["google/gemini-2.5-flash-lite"])});function f(e,r){return C.apply(this,arguments)}function C(){return(C=e(r().m(function e(p,f){var C,v,g,b,j,h,E,k,w,T,D,R,y,A,I,P,S,_,x,F;return r().w(function(e){for(;;)switch(e.p=e.n){case 0:return C=l(process.argv),v=d.parse(C.params),e.n=1,m(n.join(p,"test_cases"));case 1:return g=e.v,e.n=2,o.promises.readFile(n.join(C.cwd,"prompt.txt"),"utf8");case 2:b=e.v,j=s(g),e.p=3,j.s();case 4:if((h=j.n()).done){e.n=11;break}return E=h.value,k=Date.now(),e.p=5,e.n=6,i({model:a(v.model.slice(7)),prompt:null!=(w=null==(T=f.buildPrompt)?void 0:T.call(f,{prompt:b,testCase:E}))?w:b.replaceAll("{input}",null!=(D=E.input)?D:"")});case 6:return R=e.v,y=R.text,A=Date.now(),S=t,_={testCaseId:E.id,decisionCode:u.ACCEPTED,stdin:E.input,stdout:y,timeSeconds:(A-k)/1e3},e.n=7,f.test({testCase:E,result:{output:y}});case 7:if(I=S(_,e.v),c(I),I.decisionCode===u.ACCEPTED){e.n=8;break}return e.a(3,11);case 8:e.n=10;break;case 9:return e.p=9,x=e.v,P=Date.now(),c({testCaseId:E.id,decisionCode:u.RUNTIME_ERROR,stdin:E.input,stderr:x instanceof Error?x.message:String(x),timeSeconds:(P-k)/1e3}),e.a(3,11);case 10:e.n=4;break;case 11:e.n=13;break;case 12:e.p=12,F=e.v,j.e(F);case 13:return e.p=13,j.f(),e.f(13);case 14:return e.a(2)}},e,null,[[5,9],[3,12,13,14]])}))).apply(this,arguments)}export{f as llmJudgePreset};
1
+ import{asyncToGenerator as e,regenerator as r,objectSpread2 as o,createForOfIteratorHelper as t,slicedToArray as s}from"../_virtual/_rollupPluginBabelHelpers.js";import a from"node:fs";import n from"node:path";import{bedrock as i}from"@ai-sdk/amazon-bedrock";import{google as p}from"@ai-sdk/google";import{openai as c}from"@ai-sdk/openai";import{xai as d}from"@ai-sdk/xai";import{generateText as l}from"ai";import{z as m}from"zod";import{parseArgs as u}from"../helpers/parseArgs.js";import{printTestCaseResult as f}from"../helpers/printTestCaseResult.js";import{readTestCases as v}from"../helpers/readTestCases.js";import{DecisionCode as C}from"../types/decisionCode.js";var b={bedrock:i,google:p,openai:c,xai:d},g=m.object({model:m.string().min(1)});function k(e,r){return w.apply(this,arguments)}function w(){return(w=e(r().m(function e(s,i){var p,c,d,m,b,k,w,j,E,T,x,y,A,D,R,I,P,S,_,z;return r().w(function(e){for(;;)switch(e.p=e.n){case 0:return p=u(process.argv),c=g.parse(p.params),e.n=1,v(n.join(s,"test_cases"));case 1:return d=e.v,e.n=2,a.promises.readFile(n.join(p.cwd,"prompt.txt"),"utf8");case 2:m=e.v,b=t(d),e.p=3,b.s();case 4:if((k=b.n()).done){e.n=11;break}return w=k.value,j=Date.now(),e.p=5,e.n=6,l({model:h(c.model),prompt:null!=(E=null==(T=i.buildPrompt)?void 0:T.call(i,{prompt:m,testCase:w}))?E:m.replaceAll("{input}",null!=(x=w.input)?x:"")});case 6:return y=e.v,A=y.text,D=Date.now(),P=o,S={testCaseId:w.id,decisionCode:C.ACCEPTED,stdin:w.input,stdout:A,timeSeconds:(D-j)/1e3},e.n=7,i.test({testCase:w,result:{output:A}});case 7:if(R=P(S,e.v),f(R),R.decisionCode===C.ACCEPTED){e.n=8;break}return e.a(3,11);case 8:e.n=10;break;case 9:return e.p=9,_=e.v,I=Date.now(),f({testCaseId:w.id,decisionCode:C.RUNTIME_ERROR,stdin:w.input,stderr:_ instanceof Error?_.message:String(_),timeSeconds:(I-j)/1e3}),e.a(3,11);case 10:e.n=4;break;case 11:e.n=13;break;case 12:e.p=12,z=e.v,b.e(z);case 13:return e.p=13,b.f(),e.f(13);case 14:return e.a(2)}},e,null,[[5,9],[3,12,13,14]])}))).apply(this,arguments)}function h(e){var r,o=e.split("/"),t=s(o,2),a=t[0],n=t[1];if(!a||!n)throw new Error("bad model: ".concat(e));var i=null==(r=b[a])?void 0:r.call(b,n);if(!i)throw new Error("model not found: ".concat(e));return i}export{k as llmJudgePreset};
2
2
  //# sourceMappingURL=llm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"llm.js","sources":["../../src/presets/llm.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { google } from '@ai-sdk/google';\nimport type { ModelMessage } from 'ai';\nimport { generateText } from 'ai';\nimport { z } from 'zod';\n\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { readTestCases } from '../helpers/readTestCases.js';\nimport { DecisionCode } from '../types/decisionCode.js';\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nconst PROMPT_FILENAME = 'prompt.txt';\n\nconst judgeParamsSchema = z.object({\n model: z.enum(['google/gemini-2.5-flash-lite']),\n});\n\ninterface LlmJudgePresetOptions {\n buildPrompt?: (context: {\n prompt: string;\n testCase: { id: string; input?: string; output?: string };\n }) => string | ModelMessage[];\n test: (context: {\n testCase: { id: string; input?: string; output?: string };\n result: { output: string };\n }) => Partial<TestCaseResult> | Promise<Partial<TestCaseResult>>;\n}\n\n/**\n * A preset judge function for running and testing a user prompt in LLM.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { llmJudgePreset } from '@exercode/problem-utils/presets/llm';\n * import { DecisionCode } from '@exercode/problem-utils';\n *\n * await llmJudgePreset(import.meta.dirname, {\n * test: (context) {\n * return { decisionCode: context.result.output ? DecisionCode.ACCEPTED : DecisionCode.WRONG_ANSWER };\n * }\n * });\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun judge.ts model_answers/java '{ \"model\": \"gemini-2.5-flash-lite\" }'\n * ```\n */\nexport async function llmJudgePreset(problemDir: string, options: LlmJudgePresetOptions): Promise<void> {\n const args = parseArgs(process.argv);\n const params = judgeParamsSchema.parse(args.params);\n\n const testCases = await readTestCases(path.join(problemDir, 'test_cases'));\n\n const prompt = await fs.promises.readFile(path.join(args.cwd, PROMPT_FILENAME), 'utf8');\n\n for (const testCase of testCases) {\n const startTimeMilliseconds = Date.now();\n try {\n // requires `GOOGLE_GENERATIVE_AI_API_KEY`\n const { text } = await generateText({\n model: google(params.model.slice('google/'.length)),\n prompt: options.buildPrompt?.({ prompt, testCase }) ?? prompt.replaceAll('{input}', testCase.input ?? ''),\n });\n\n const stopTimeMilliseconds = Date.now();\n\n const testCaseResult = {\n testCaseId: testCase.id,\n decisionCode: DecisionCode.ACCEPTED,\n stdin: testCase.input,\n stdout: text,\n timeSeconds: (stopTimeMilliseconds - startTimeMilliseconds) / 1000,\n ...(await options.test({ testCase, result: { output: text } })),\n };\n\n printTestCaseResult(testCaseResult);\n\n if (testCaseResult.decisionCode !== DecisionCode.ACCEPTED) break;\n } catch (error) {\n const stopTimeMilliseconds = Date.now();\n\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin: testCase.input,\n stderr: error instanceof Error ? error.message : String(error),\n timeSeconds: (stopTimeMilliseconds - startTimeMilliseconds) / 1000,\n });\n\n break;\n }\n }\n}\n"],"names":["judgeParamsSchema","z","object","model","llmJudgePreset","_x","_x2","_llmJudgePreset","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","problemDir","options","args","params","testCases","prompt","_iterator","_step","testCase","startTimeMilliseconds","_options$buildPrompt","_options$buildPrompt2","_testCase$input","_yield$generateText","text","stopTimeMilliseconds","testCaseResult","_stopTimeMilliseconds","_t","_t2","_t3","_t4","w","_context","p","n","parseArgs","process","argv","parse","readTestCases","path","join","v","fs","promises","readFile","cwd","_createForOfIteratorHelper","s","done","value","Date","now","generateText","google","slice","buildPrompt","call","replaceAll","input","_objectSpread","testCaseId","id","decisionCode","DecisionCode","ACCEPTED","stdin","stdout","timeSeconds","test","result","output","printTestCaseResult","a","RUNTIME_ERROR","stderr","Error","message","String","e","f"],"mappings":"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"}
1
+ {"version":3,"file":"llm.js","sources":["../../src/presets/llm.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { bedrock } from '@ai-sdk/amazon-bedrock';\nimport { google } from '@ai-sdk/google';\nimport { openai } from '@ai-sdk/openai';\nimport { xai } from '@ai-sdk/xai';\nimport type { LanguageModel, ModelMessage } from 'ai';\nimport { generateText } from 'ai';\nimport { z } from 'zod';\n\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { readTestCases } from '../helpers/readTestCases.js';\nimport { DecisionCode } from '../types/decisionCode.js';\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nconst PROMPT_FILENAME = 'prompt.txt';\n\nconst providerByName: Record<string, typeof bedrock | typeof google | typeof openai | typeof xai> = {\n // requires `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_REGION`\n bedrock,\n // requires `GOOGLE_GENERATIVE_AI_API_KEY`\n google,\n // requires `OPENAI_API_KEY`\n openai,\n // requires `XAI_API_KEY`\n xai,\n} as const;\n\nconst judgeParamsSchema = z.object({\n model: z.string().min(1),\n});\n\ninterface LlmJudgePresetOptions {\n buildPrompt?: (context: {\n prompt: string;\n testCase: { id: string; input?: string; output?: string };\n }) => string | ModelMessage[];\n test: (context: {\n testCase: { id: string; input?: string; output?: string };\n result: { output: string };\n }) => Partial<TestCaseResult> | Promise<Partial<TestCaseResult>>;\n}\n\n/**\n * A preset judge function for running and testing a user prompt in LLM.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { llmJudgePreset } from '@exercode/problem-utils/presets/llm';\n * import { DecisionCode } from '@exercode/problem-utils';\n *\n * await llmJudgePreset(import.meta.dirname, {\n * test: (context) {\n * return { decisionCode: context.result.output ? DecisionCode.ACCEPTED : DecisionCode.WRONG_ANSWER };\n * }\n * });\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun judge.ts model_answers/java '{ \"model\": \"gemini-2.5-flash-lite\" }'\n * ```\n */\nexport async function llmJudgePreset(problemDir: string, options: LlmJudgePresetOptions): Promise<void> {\n const args = parseArgs(process.argv);\n const params = judgeParamsSchema.parse(args.params);\n\n const testCases = await readTestCases(path.join(problemDir, 'test_cases'));\n\n const prompt = await fs.promises.readFile(path.join(args.cwd, PROMPT_FILENAME), 'utf8');\n\n for (const testCase of testCases) {\n const startTimeMilliseconds = Date.now();\n try {\n const { text } = await generateText({\n model: toLanguageModel(params.model),\n prompt: options.buildPrompt?.({ prompt, testCase }) ?? prompt.replaceAll('{input}', testCase.input ?? ''),\n });\n\n const stopTimeMilliseconds = Date.now();\n\n const testCaseResult = {\n testCaseId: testCase.id,\n decisionCode: DecisionCode.ACCEPTED,\n stdin: testCase.input,\n stdout: text,\n timeSeconds: (stopTimeMilliseconds - startTimeMilliseconds) / 1000,\n ...(await options.test({ testCase, result: { output: text } })),\n };\n\n printTestCaseResult(testCaseResult);\n\n if (testCaseResult.decisionCode !== DecisionCode.ACCEPTED) break;\n } catch (error) {\n const stopTimeMilliseconds = Date.now();\n\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin: testCase.input,\n stderr: error instanceof Error ? error.message : String(error),\n timeSeconds: (stopTimeMilliseconds - startTimeMilliseconds) / 1000,\n });\n\n break;\n }\n }\n}\n\nfunction toLanguageModel(model: string): LanguageModel {\n const [providerId, modelId] = model.split('/');\n if (!providerId || !modelId) throw new Error(`bad model: ${model}`);\n const languageModel = providerByName[providerId]?.(modelId);\n if (!languageModel) throw new Error(`model not found: ${model}`);\n return languageModel;\n}\n"],"names":["providerByName","bedrock","google","openai","xai","judgeParamsSchema","z","object","model","string","min","llmJudgePreset","_x","_x2","_llmJudgePreset","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","problemDir","options","args","params","testCases","prompt","_iterator","_step","testCase","startTimeMilliseconds","_options$buildPrompt","_options$buildPrompt2","_testCase$input","_yield$generateText","text","stopTimeMilliseconds","testCaseResult","_stopTimeMilliseconds","_t","_t2","_t3","_t4","w","_context","p","n","parseArgs","process","argv","parse","readTestCases","path","join","v","fs","promises","readFile","cwd","_createForOfIteratorHelper","s","done","value","Date","now","generateText","toLanguageModel","buildPrompt","call","replaceAll","input","_objectSpread","testCaseId","id","decisionCode","DecisionCode","ACCEPTED","stdin","stdout","timeSeconds","test","result","output","printTestCaseResult","a","RUNTIME_ERROR","stderr","Error","message","String","e","f","_providerByName$provi","_model$split","split","_model$split2","_slicedToArray","providerId","modelId","concat","languageModel"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@exercode/problem-utils",
3
- "version": "1.6.0",
3
+ "version": "1.7.1",
4
4
  "description": ":100: A set of utilities for judging programs on Exercode (https://exercode.willbooster.com/).",
5
5
  "keywords": [
6
6
  "exercode",
@@ -49,18 +49,21 @@
49
49
  },
50
50
  "prettier": "@willbooster/prettier-config",
51
51
  "dependencies": {
52
- "@ai-sdk/google": "3.0.2",
53
- "ai": "6.0.7",
52
+ "@ai-sdk/amazon-bedrock": "4.0.13",
53
+ "@ai-sdk/google": "3.0.6",
54
+ "@ai-sdk/openai": "3.0.7",
55
+ "@ai-sdk/xai": "3.0.14",
56
+ "ai": "6.0.27",
54
57
  "front-matter": "4.0.2",
55
58
  "zod": "4.3.5"
56
59
  },
57
60
  "devDependencies": {
58
61
  "@tsconfig/node24": "24.0.3",
59
62
  "@types/eslint": "8.56.11",
60
- "@types/node": "24.10.4",
63
+ "@types/node": "24.10.7",
61
64
  "@willbooster/eslint-config-ts": "11.4.12",
62
65
  "@willbooster/prettier-config": "10.2.4",
63
- "build-ts": "17.0.13",
66
+ "build-ts": "17.0.14",
64
67
  "conventional-changelog-conventionalcommits": "9.1.0",
65
68
  "dotenv-cli": "11.0.0",
66
69
  "eslint": "9.39.1",
@@ -78,8 +81,8 @@
78
81
  "micromatch": "4.0.8",
79
82
  "pinst": "3.0.0",
80
83
  "prettier": "3.7.4",
81
- "prettier-plugin-java": "2.7.7",
82
- "puppeteer": "24.34.0",
84
+ "prettier-plugin-java": "2.8.1",
85
+ "puppeteer": "24.35.0",
83
86
  "semantic-release": "25.0.2",
84
87
  "sort-package-json": "3.6.0",
85
88
  "typescript": "5.9.3",