utilitas 1998.2.61 → 1998.2.63

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/lib/alan.mjs CHANGED
@@ -49,30 +49,32 @@ const [
49
49
  OPENAI, GEMINI, CHATGPT, OPENAI_EMBEDDING, GEMINI_EMEDDING, OPENAI_TRAINING,
50
50
  OLLAMA, CLAUDE, GPT_4O_MINI, GPT_4O, GPT_O1, GPT_O3_MINI, GEMINI_20_FLASH,
51
51
  GEMINI_20_FLASH_THINKING, GEMINI_20_PRO, NOVA, EMBEDDING_001, DEEPSEEK_R1,
52
- DEEPSEEK_R1_70B, MD_CODE, CHATGPT_REASONING, TEXT_EMBEDDING_3_SMALL,
53
- TEXT_EMBEDDING_3_LARGE, CLOUD_37_SONNET, AUDIO, WAV, CHATGPT_MINI,
54
- ATTACHMENTS, CHAT, OPENAI_VOICE, MEDIUM, LOW, HIGH, GPT_REASONING_EFFORT,
55
- THINK, THINK_STR, THINK_END, AZURE, TOOLS_STR, TOOLS_END, TOOLS, TEXT,
56
- THINKING, OK, FUNC, GPT_45, REDACTED_THINKING, GEMMA_3_27B, AZURE_OPENAI,
57
- ANTHROPIC, VERTEX_ANTHROPIC, GEMMA327B, size8k, ais, MAX_TOOL_RECURSION,
58
- LOG, name, user, system, assistant, MODEL, JSON_OBJECT, TOOL, silent,
59
- NOT_INIT, INVALID_FILE, tokenSafeRatio, GPT_QUERY_LIMIT, minsOfDay,
52
+ DEEPSEEK_R1_70B, DEEPSEEK_R1_32B, MD_CODE, CHATGPT_REASONING,
53
+ TEXT_EMBEDDING_3_SMALL, TEXT_EMBEDDING_3_LARGE, CLOUD_37_SONNET, AUDIO, WAV,
54
+ CHATGPT_MINI, ATTACHMENTS, CHAT, OPENAI_VOICE, MEDIUM, LOW, HIGH,
55
+ GPT_REASONING_EFFORT, THINK, THINK_STR, THINK_END, AZURE, TOOLS_STR,
56
+ TOOLS_END, TOOLS, TEXT, THINKING, OK, FUNC, GPT_45, REDACTED_THINKING,
57
+ GEMMA_3_27B, AZURE_OPENAI, ANTHROPIC, VERTEX_ANTHROPIC, GEMMA327B, size8k,
58
+ ais, MAX_TOOL_RECURSION, LOG, name, user, system, assistant, MODEL,
59
+ JSON_OBJECT, TOOL, silent, NOT_INIT, INVALID_FILE, tokenSafeRatio,
60
+ GPT_QUERY_LIMIT, minsOfDay, CONTENT_IS_REQUIRED,
60
61
  ] = [
61
62
  'OPENAI', 'GEMINI', 'CHATGPT', 'OPENAI_EMBEDDING', 'GEMINI_EMEDDING',
62
63
  'OPENAI_TRAINING', 'OLLAMA', 'CLAUDE', 'gpt-4o-mini', 'gpt-4o', 'o1',
63
64
  'o3-mini', 'gemini-2.0-flash', 'gemini-2.0-flash-thinking-exp',
64
65
  'gemini-2.0-pro-exp', 'nova', 'embedding-001', 'deepseek-r1',
65
- 'deepseek-r1:70b', '```', 'CHATGPT_REASONING', 'text-embedding-3-small',
66
- 'text-embedding-3-large', 'claude-3-7-sonnet@20250219', 'audio', 'wav',
67
- 'CHATGPT_MINI', '[ATTACHMENTS]', 'CHAT', 'OPENAI_VOICE', 'medium',
68
- 'low', 'high', 'medium', 'think', '<think>', '</think>', 'AZURE',
69
- '<tools>', '</tools>', 'tools', 'text', 'thinking', 'OK', 'function',
66
+ 'deepseek-r1:70b', 'deepseek-r1:32b', '```', 'CHATGPT_REASONING',
67
+ 'text-embedding-3-small', 'text-embedding-3-large',
68
+ 'claude-3-7-sonnet@20250219', 'audio', 'wav', 'CHATGPT_MINI',
69
+ '[ATTACHMENTS]', 'CHAT', 'OPENAI_VOICE', 'medium', 'low', 'high',
70
+ 'medium', 'think', '<think>', '</think>', 'AZURE', '<tools>',
71
+ '</tools>', 'tools', 'text', 'thinking', 'OK', 'function',
70
72
  'gpt-4.5-preview', 'redacted_thinking', 'gemma-3-27b-it',
71
73
  'AZURE OPENAI', 'ANTHROPIC', 'VERTEX ANTHROPIC', 'gemma3:27b',
72
74
  7680 * 4320, {}, 10, { log: true }, 'Alan', 'user', 'system',
73
75
  'assistant', 'model', 'json_object', 'tool', true,
74
76
  'AI engine has not been initialized.', 'Invalid file data.', 1.1, 100,
75
- 60 * 24,
77
+ 60 * 24, 'Content is required.',
76
78
  ];
77
79
 
78
80
  const [
@@ -108,7 +110,6 @@ const unifyEngine = options => unifyType(options?.engine, 'AI engine');
108
110
  const trimTailing = text => text.replace(/[\.\s]*$/, '');
109
111
  const renderText = (t, o) => _renderText(t, { extraCodeBlock: 0, ...o || {} });
110
112
  const log = (cnt, opt) => _log(cnt, import.meta.url, { time: 1, ...opt || {} });
111
- const CONTENT_IS_REQUIRED = 'Content is required.';
112
113
  const assertContent = content => assert(content.length, CONTENT_IS_REQUIRED);
113
114
  const countToolCalls = r => r?.split('\n').filter(x => x === TOOLS_STR).length;
114
115
  const assertApiKey = (p, o) => assert(o?.apiKey, `${p} api key is required.`);
@@ -369,6 +370,7 @@ const MODELS = {
369
370
  };
370
371
 
371
372
  MODELS[DEEPSEEK_R1_70B] = MODELS[DEEPSEEK_R1];
373
+ MODELS[DEEPSEEK_R1_32B] = MODELS[DEEPSEEK_R1];
372
374
  MODELS[GEMMA327B] = MODELS[GEMMA_3_27B];
373
375
 
374
376
  for (const n in MODELS) {
@@ -566,13 +568,21 @@ const init = async (options = {}) => {
566
568
  break;
567
569
  case OLLAMA:
568
570
  // https://github.com/ollama/ollama/blob/main/docs/openai.md
571
+ const baseURL = 'http://localhost:11434/v1/';
569
572
  ais[id] = {
570
573
  id, provider, model, client: await OpenAI({
571
- baseURL: 'http://localhost:11434/v1/', apiKey: 'ollama',
572
- ...options
574
+ baseURL, apiKey: 'ollama', ...options
573
575
  }),
574
576
  prompt: async (cnt, opts) => await promptOpenAI(id, cnt, opts),
575
577
  };
578
+ const phLog = m => log(`Ollama preheat: ${m?.message || m}`);
579
+ ignoreErrFunc(async () => {
580
+ phLog(await (await fetch(`${baseURL}completions`, {
581
+ method: 'POST', body: JSON.stringify({
582
+ model: model.name, prompt: '', keep_alive: -1
583
+ })
584
+ })).text());
585
+ }, { log: phLog });
576
586
  break;
577
587
  default:
578
588
  throwError(`Invalid AI provider: ${options.provider || 'null'}.`);
@@ -690,10 +700,9 @@ const buildGeminiHistory = (text, options) => buildGeminiMessage(
690
700
  text, { ...options || {}, history: true }
691
701
  );
692
702
 
693
- const [getOpenAIClient, getGeminiClient, getClaudeClient]
694
- = [OPENAI, GEMINI, CLAUDE].map(
695
- x => async options => await init({ ...provider(x), ...options })
696
- );
703
+ const [getOpenAIClient, getGeminiClient] = [OPENAI, GEMINI].map(
704
+ x => async options => await init({ ...provider(x), ...options })
705
+ );
697
706
 
698
707
  const listOpenAIModels = async (options) => {
699
708
  const { client } = await getOpenAIClient(options);
@@ -1000,6 +1009,7 @@ const promptOpenAI = async (aiId, content, options = {}) => {
1000
1009
  const resp = await client.chat.completions.create({
1001
1010
  model: azure ? undefined : options.model, ...history,
1002
1011
  ...options.jsonMode ? { response_format: { type: JSON_OBJECT } } : {},
1012
+ ...provider === OLLAMA ? { keep_alive: -1 } : {},
1003
1013
  modalities, audio: options.audio || (
1004
1014
  modalities?.find?.(x => x === AUDIO)
1005
1015
  && { voice: DEFAULT_MODELS[OPENAI_VOICE], format: 'pcm16' }
@@ -1272,8 +1282,9 @@ const createGeminiEmbedding = async (input, options) => {
1272
1282
  };
1273
1283
 
1274
1284
  const buildGptTrainingCase = (prompt, response, options) => messages([
1275
- ...options?.systemPrompt ? [buildGptMessage(options.systemPrompt, { role: system })] : [],
1276
- buildGptMessage(prompt),
1285
+ ...options?.systemPrompt ? [
1286
+ buildGptMessage(options.systemPrompt, { role: system })
1287
+ ] : [], buildGptMessage(prompt),
1277
1288
  buildGptMessage(response, { role: assistant }),
1278
1289
  ]);
1279
1290
 
@@ -1560,7 +1571,7 @@ const PREFERRED_ENGINES = [
1560
1571
  export default init;
1561
1572
  export {
1562
1573
  ATTACHMENT_TOKEN_COST, CLOUD_37_SONNET, CODE_INTERPRETER, DEEPSEEK_R1,
1563
- DEEPSEEK_R1_70B, DEFAULT_MODELS,
1574
+ DEEPSEEK_R1_32B, DEEPSEEK_R1_70B, DEFAULT_MODELS,
1564
1575
  EMBEDDING_001,
1565
1576
  FUNCTION, GEMINI_20_FLASH, GEMINI_20_FLASH_THINKING, GPT_45, GPT_4O, GPT_4O_MINI, GPT_O1, GPT_O3_MINI, INSTRUCTIONS, MODELS,
1566
1577
  OPENAI_VOICE, RETRIEVAL,
package/lib/manifest.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  const manifest = {
2
2
  "name": "utilitas",
3
3
  "description": "Just another common utility for JavaScript.",
4
- "version": "1998.2.61",
4
+ "version": "1998.2.63",
5
5
  "private": false,
6
6
  "homepage": "https://github.com/Leask/utilitas",
7
7
  "main": "index.mjs",
package/lib/utilitas.mjs CHANGED
@@ -650,8 +650,10 @@ const checkInterval = (itv, sed) =>
650
650
 
651
651
  const ignoreErrFunc = async (func, options) => {
652
652
  const run = async () => {
653
- try { return await func(...options?.args || []) }
654
- catch (err) { options?.log && console.error(err); }
653
+ try { return await func(...options?.args || []) } catch (err) {
654
+ if (Function.isFunction(options?.log)) { options.log(err); }
655
+ else if (options?.log) { console.error(err); }
656
+ }
655
657
  };
656
658
  if (options?.await) { await timeout(options.await); return await run(); }
657
659
  else if (options?.wait) { return setTimeout(run, options.wait); }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "utilitas",
3
3
  "description": "Just another common utility for JavaScript.",
4
- "version": "1998.2.61",
4
+ "version": "1998.2.63",
5
5
  "private": false,
6
6
  "homepage": "https://github.com/Leask/utilitas",
7
7
  "main": "index.mjs",