@redaksjon/protokoll-engine 0.1.3 → 0.1.4-dev.20260216151443.e1454c9

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 (163) hide show
  1. package/dist/agentic/executor.d.ts.map +1 -1
  2. package/dist/agentic/types.d.ts +4 -1
  3. package/dist/agentic/types.d.ts.map +1 -1
  4. package/dist/index.d.ts +2 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +8 -5
  7. package/dist/index.js.map +1 -1
  8. package/dist/index10.js +4 -3
  9. package/dist/index10.js.map +1 -1
  10. package/dist/index11.js +2 -2
  11. package/dist/index12.js +3 -124
  12. package/dist/index12.js.map +1 -1
  13. package/dist/index13.js +101 -100
  14. package/dist/index13.js.map +1 -1
  15. package/dist/index14.js +109 -281
  16. package/dist/index14.js.map +1 -1
  17. package/dist/index15.js +285 -89
  18. package/dist/index15.js.map +1 -1
  19. package/dist/index16.js +97 -104
  20. package/dist/index16.js.map +1 -1
  21. package/dist/index17.js +18 -179
  22. package/dist/index17.js.map +1 -1
  23. package/dist/index18.js +102 -48
  24. package/dist/index18.js.map +1 -1
  25. package/dist/index19.js +182 -16
  26. package/dist/index19.js.map +1 -1
  27. package/dist/index2.js +3 -3
  28. package/dist/index20.js +48 -100
  29. package/dist/index20.js.map +1 -1
  30. package/dist/index21.js +16 -23
  31. package/dist/index21.js.map +1 -1
  32. package/dist/index22.js +98 -42
  33. package/dist/index22.js.map +1 -1
  34. package/dist/index23.js +19 -112
  35. package/dist/index23.js.map +1 -1
  36. package/dist/index24.js +42 -323
  37. package/dist/index24.js.map +1 -1
  38. package/dist/index25.js +114 -52
  39. package/dist/index25.js.map +1 -1
  40. package/dist/index26.js +339 -37
  41. package/dist/index26.js.map +1 -1
  42. package/dist/index27.js +51 -121
  43. package/dist/index27.js.map +1 -1
  44. package/dist/index28.js +36 -155
  45. package/dist/index28.js.map +1 -1
  46. package/dist/index29.js +114 -150
  47. package/dist/index29.js.map +1 -1
  48. package/dist/index3.js +2 -2
  49. package/dist/index30.js +171 -161
  50. package/dist/index30.js.map +1 -1
  51. package/dist/index31.js +141 -401
  52. package/dist/index31.js.map +1 -1
  53. package/dist/index32.js +158 -146
  54. package/dist/index32.js.map +1 -1
  55. package/dist/index33.js +425 -130
  56. package/dist/index33.js.map +1 -1
  57. package/dist/index34.js +145 -40
  58. package/dist/index34.js.map +1 -1
  59. package/dist/index35.js +159 -83
  60. package/dist/index35.js.map +1 -1
  61. package/dist/index36.js +46 -439
  62. package/dist/index36.js.map +1 -1
  63. package/dist/index37.js +91 -419
  64. package/dist/index37.js.map +1 -1
  65. package/dist/index38.js +447 -66
  66. package/dist/index38.js.map +1 -1
  67. package/dist/index39.js +424 -115
  68. package/dist/index39.js.map +1 -1
  69. package/dist/index4.js +2 -2
  70. package/dist/index40.js +78 -290
  71. package/dist/index40.js.map +1 -1
  72. package/dist/index41.js +112 -44
  73. package/dist/index41.js.map +1 -1
  74. package/dist/index42.js +115 -44
  75. package/dist/index42.js.map +1 -1
  76. package/dist/index43.js +295 -35
  77. package/dist/index43.js.map +1 -1
  78. package/dist/index44.js +270 -218
  79. package/dist/index44.js.map +1 -1
  80. package/dist/index45.js +131 -150
  81. package/dist/index45.js.map +1 -1
  82. package/dist/index46.js +117 -73
  83. package/dist/index46.js.map +1 -1
  84. package/dist/index47.js +45 -74
  85. package/dist/index47.js.map +1 -1
  86. package/dist/index48.js +48 -5
  87. package/dist/index48.js.map +1 -1
  88. package/dist/index49.js +33 -145
  89. package/dist/index49.js.map +1 -1
  90. package/dist/index5.js +3 -3
  91. package/dist/index50.js +216 -203
  92. package/dist/index50.js.map +1 -1
  93. package/dist/index51.js +153 -39
  94. package/dist/index51.js.map +1 -1
  95. package/dist/index52.js +74 -38
  96. package/dist/index52.js.map +1 -1
  97. package/dist/index53.js +74 -33
  98. package/dist/index53.js.map +1 -1
  99. package/dist/index54.js +149 -6
  100. package/dist/index54.js.map +1 -1
  101. package/dist/index55.js +224 -6
  102. package/dist/index55.js.map +1 -1
  103. package/dist/index56.js +42 -143
  104. package/dist/index56.js.map +1 -1
  105. package/dist/index57.js +43 -15
  106. package/dist/index57.js.map +1 -1
  107. package/dist/index58.js +35 -2
  108. package/dist/index58.js.map +1 -1
  109. package/dist/index59.js +5 -14
  110. package/dist/index59.js.map +1 -1
  111. package/dist/index6.js +4 -4
  112. package/dist/index6.js.map +1 -1
  113. package/dist/index60.js +6 -2
  114. package/dist/index60.js.map +1 -1
  115. package/dist/index61.js +6 -4
  116. package/dist/index61.js.map +1 -1
  117. package/dist/index62.js +151 -0
  118. package/dist/index62.js.map +1 -0
  119. package/dist/index63.js +17 -0
  120. package/dist/index63.js.map +1 -0
  121. package/dist/index64.js +4 -0
  122. package/dist/index64.js.map +1 -0
  123. package/dist/index65.js +17 -0
  124. package/dist/index65.js.map +1 -0
  125. package/dist/index66.js +4 -0
  126. package/dist/index66.js.map +1 -0
  127. package/dist/index67.js +6 -0
  128. package/dist/index67.js.map +1 -0
  129. package/dist/index7.js +2 -2
  130. package/dist/index8.js +1 -1
  131. package/dist/index9.js +4 -4
  132. package/dist/phases/simple-replace.d.ts +2 -1
  133. package/dist/phases/simple-replace.d.ts.map +1 -1
  134. package/dist/pipeline/orchestrator.d.ts.map +1 -1
  135. package/dist/pipeline/types.d.ts +3 -0
  136. package/dist/pipeline/types.d.ts.map +1 -1
  137. package/dist/routing/classifier.d.ts +2 -1
  138. package/dist/routing/classifier.d.ts.map +1 -1
  139. package/dist/routing/index.d.ts +2 -1
  140. package/dist/routing/index.d.ts.map +1 -1
  141. package/dist/routing/types.d.ts +1 -1
  142. package/dist/routing/types.d.ts.map +1 -1
  143. package/dist/transcript/index.d.ts +1 -0
  144. package/dist/transcript/index.d.ts.map +1 -1
  145. package/dist/transcript/operations.d.ts +14 -1
  146. package/dist/transcript/operations.d.ts.map +1 -1
  147. package/dist/transcript/upload-utils.d.ts +80 -0
  148. package/dist/transcript/upload-utils.d.ts.map +1 -0
  149. package/dist/util/enhancement-logger.d.ts +19 -0
  150. package/dist/util/enhancement-logger.d.ts.map +1 -0
  151. package/dist/util/metadata.d.ts +1 -0
  152. package/dist/util/metadata.d.ts.map +1 -1
  153. package/dist/weighting/builder.d.ts +126 -0
  154. package/dist/weighting/builder.d.ts.map +1 -0
  155. package/dist/weighting/index.d.ts +12 -0
  156. package/dist/weighting/index.d.ts.map +1 -0
  157. package/dist/weighting/prepositioning.d.ts +55 -0
  158. package/dist/weighting/prepositioning.d.ts.map +1 -0
  159. package/dist/weighting/provider.d.ts +78 -0
  160. package/dist/weighting/provider.d.ts.map +1 -0
  161. package/dist/weighting/types.d.ts +119 -0
  162. package/dist/weighting/types.d.ts.map +1 -0
  163. package/package.json +2 -2
package/dist/index18.js CHANGED
@@ -1,53 +1,107 @@
1
- import { IterationStrategyFactory } from '@kjerneverk/riotprompt';
1
+ import os__default from 'node:os';
2
2
 
3
- const createStrategy = (config) => {
4
- const maxIterations = config.maxIterations ?? getDefaultIterations(config.type);
5
- switch (config.type) {
6
- case "simple":
7
- return IterationStrategyFactory.simple({
8
- maxIterations,
9
- allowTools: false
10
- });
11
- case "investigate-then-respond":
12
- return IterationStrategyFactory.investigateThenRespond({
13
- maxInvestigationSteps: Math.floor(maxIterations * 0.8),
14
- requireMinimumTools: config.requireMinimumTools ?? 2,
15
- finalSynthesis: true
16
- });
17
- case "multi-pass":
18
- return IterationStrategyFactory.multiPassRefinement({
19
- passes: 3,
20
- critiqueBetweenPasses: true
21
- });
22
- case "adaptive":
23
- return IterationStrategyFactory.adaptive({});
24
- default:
25
- return IterationStrategyFactory.simple({ maxIterations });
26
- }
3
+ const PROGRAM_NAME = "protokoll";
4
+ const DEFAULT_CHARACTER_ENCODING = "utf-8";
5
+ const DEFAULT_BINARY_TO_TEXT_ENCODING = "base64";
6
+ const DEFAULT_DIFF = true;
7
+ const DEFAULT_LOG = false;
8
+ const DEFAULT_TIMEZONE = "Etc/UTC";
9
+ const DATE_FORMAT_MONTH_DAY = "M-D";
10
+ const DATE_FORMAT_YEAR = "YYYY";
11
+ const DATE_FORMAT_YEAR_MONTH = "YYYY-M";
12
+ const DATE_FORMAT_YEAR_MONTH_DAY = "YYYY-M-D";
13
+ const DATE_FORMAT_YEAR_MONTH_DAY_SLASH = "YYYY/M/D";
14
+ const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES = "YYYY-M-D-HHmm";
15
+ const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS = "YYYY-M-D-HHmmss";
16
+ const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS = "YYYY-M-D-HHmmss.SSS";
17
+ const DATE_FORMAT_MONTH = "M";
18
+ const DATE_FORMAT_DAY = "D";
19
+ const DATE_FORMAT_HOURS = "HHmm";
20
+ const DATE_FORMAT_MINUTES = "mm";
21
+ const DATE_FORMAT_SECONDS = "ss";
22
+ const DATE_FORMAT_MILLISECONDS = "SSS";
23
+ const DEFAULT_VERBOSE = false;
24
+ const DEFAULT_DRY_RUN = false;
25
+ const DEFAULT_DEBUG = false;
26
+ const DEFAULT_CONTENT_TYPES = ["diff"];
27
+ const DEFAULT_RECURSIVE = false;
28
+ const DEFAULT_INPUT_DIRECTORY = "./";
29
+ const DEFAULT_OUTPUT_DIRECTORY = "./";
30
+ const DEFAULT_AUDIO_EXTENSIONS = ["mp3", "mp4", "mpeg", "mpga", "m4a", "wav", "webm", "qta"];
31
+ const ALLOWED_CONTENT_TYPES = ["log", "diff"];
32
+ const ALLOWED_AUDIO_EXTENSIONS = ["mp3", "mp4", "mpeg", "mpga", "m4a", "wav", "webm", "qta"];
33
+ const DEFAULT_OUTPUT_STRUCTURE = "month";
34
+ const DEFAULT_OUTPUT_FILENAME_OPTIONS = ["date", "time", "subject"];
35
+ const ALLOWED_OUTPUT_STRUCTURES = ["none", "year", "month", "day"];
36
+ const ALLOWED_OUTPUT_FILENAME_OPTIONS = ["date", "time", "subject"];
37
+ const DEFAULT_CONFIG_DIR = `./.${PROGRAM_NAME}`;
38
+ const DEFAULT_PROCESSED_DIR = "./processed";
39
+ const DEFAULT_CONTEXT_DIR_NAME = ".protokoll";
40
+ const DEFAULT_CONTEXT_NAMESPACE = "redaksjon";
41
+ const DEFAULT_CONTEXT_CONFIG_FILE_NAME = "config.yaml";
42
+ const DEFAULT_MAX_DISCOVERY_LEVELS = 10;
43
+ const CONTEXT_SUBDIRECTORIES = {
44
+ people: "people",
45
+ projects: "projects",
46
+ companies: "companies",
47
+ terms: "terms"
27
48
  };
28
- const getDefaultIterations = (type) => {
29
- switch (type) {
30
- case "simple":
31
- return 1;
32
- case "investigate-then-respond":
33
- return 15;
34
- case "multi-pass":
35
- return 6;
36
- case "adaptive":
37
- return 20;
38
- default:
39
- return 10;
40
- }
41
- };
42
- const getRecommendedStrategy = (transcriptLength, hasUnknownNames, complexity) => {
43
- if (transcriptLength < 500 && !hasUnknownNames && complexity === "low") {
44
- return "simple";
45
- }
46
- if (hasUnknownNames || complexity === "high") {
47
- return "investigate-then-respond";
48
- }
49
- return "adaptive";
49
+ const DEFAULT_PERSONAS_DIR = `/personas`;
50
+ const DEFAULT_PERSONA_TRANSCRIBER_FILE = `${DEFAULT_PERSONAS_DIR}/transcriber.md`;
51
+ const DEFAULT_INSTRUCTIONS_DIR = `/instructions`;
52
+ const DEFAULT_INSTRUCTIONS_TRANSCRIBE_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/transcribe.md`;
53
+ const DEFAULT_TRANSCRIPTION_MODEL = "whisper-1";
54
+ const DEFAULT_MODEL = "gpt-5.2";
55
+ const DEFAULT_REASONING_LEVEL = "medium";
56
+ const DEFAULT_PHONETIC_MODEL = "gpt-5-nano";
57
+ const DEFAULT_ANALYSIS_MODEL = "gpt-5-mini";
58
+ const DEFAULT_SMART_ASSISTANCE = true;
59
+ const DEFAULT_SOUNDS_LIKE_ON_ADD = true;
60
+ const DEFAULT_TRIGGER_PHRASES_ON_ADD = true;
61
+ const DEFAULT_PROMPT_FOR_SOURCE = true;
62
+ const DEFAULT_TERMS_ENABLED = true;
63
+ const DEFAULT_TERM_SOUNDS_LIKE_ON_ADD = true;
64
+ const DEFAULT_TERM_DESCRIPTION_ON_ADD = true;
65
+ const DEFAULT_TERM_TOPICS_ON_ADD = true;
66
+ const DEFAULT_TERM_PROJECT_SUGGESTIONS = true;
67
+ const MAX_CONTENT_LENGTH = 15e3;
68
+ const MAX_TERM_CONTEXT_LENGTH = 1e4;
69
+ const ASSIST_TIMEOUT_MS = 3e4;
70
+ const TERM_ASSIST_TIMEOUT_MS = 2e4;
71
+ const DEFAULT_OVERRIDES = false;
72
+ const DEFAULT_MAX_AUDIO_SIZE = 26214400;
73
+ const DEFAULT_TEMP_DIRECTORY = os__default.tmpdir();
74
+ const DEFAULT_INTERACTIVE = true;
75
+ const DEFAULT_SELF_REFLECTION = true;
76
+ const DEFAULT_SILENT = false;
77
+ const DEFAULT_INTERMEDIATE_DIRECTORY = "./output/protokoll";
78
+ const DEFAULT_KEEP_INTERMEDIATES = true;
79
+ const OUTPUT_FILE_TYPES = [
80
+ "transcript",
81
+ "context",
82
+ "request",
83
+ "response",
84
+ "reflection",
85
+ "session"
86
+ ];
87
+ const PROTOKOLL_DEFAULTS = {
88
+ dryRun: DEFAULT_DRY_RUN,
89
+ verbose: DEFAULT_VERBOSE,
90
+ debug: DEFAULT_DEBUG,
91
+ diff: DEFAULT_DIFF,
92
+ log: DEFAULT_LOG,
93
+ transcriptionModel: DEFAULT_TRANSCRIPTION_MODEL,
94
+ model: DEFAULT_MODEL,
95
+ reasoningLevel: DEFAULT_REASONING_LEVEL,
96
+ contentTypes: DEFAULT_CONTENT_TYPES,
97
+ overrides: DEFAULT_OVERRIDES,
98
+ maxAudioSize: DEFAULT_MAX_AUDIO_SIZE,
99
+ tempDirectory: DEFAULT_TEMP_DIRECTORY || os__default.tmpdir(),
100
+ configDirectory: DEFAULT_CONFIG_DIR,
101
+ interactive: DEFAULT_INTERACTIVE,
102
+ selfReflection: DEFAULT_SELF_REFLECTION,
103
+ silent: DEFAULT_SILENT
50
104
  };
51
105
 
52
- export { createStrategy, getRecommendedStrategy };
106
+ export { ALLOWED_AUDIO_EXTENSIONS, ALLOWED_CONTENT_TYPES, ALLOWED_OUTPUT_FILENAME_OPTIONS, ALLOWED_OUTPUT_STRUCTURES, ASSIST_TIMEOUT_MS, CONTEXT_SUBDIRECTORIES, DATE_FORMAT_DAY, DATE_FORMAT_HOURS, DATE_FORMAT_MILLISECONDS, DATE_FORMAT_MINUTES, DATE_FORMAT_MONTH, DATE_FORMAT_MONTH_DAY, DATE_FORMAT_SECONDS, DATE_FORMAT_YEAR, DATE_FORMAT_YEAR_MONTH, DATE_FORMAT_YEAR_MONTH_DAY, DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES, DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS, DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS, DATE_FORMAT_YEAR_MONTH_DAY_SLASH, DEFAULT_ANALYSIS_MODEL, DEFAULT_AUDIO_EXTENSIONS, DEFAULT_BINARY_TO_TEXT_ENCODING, DEFAULT_CHARACTER_ENCODING, DEFAULT_CONFIG_DIR, DEFAULT_CONTENT_TYPES, DEFAULT_CONTEXT_CONFIG_FILE_NAME, DEFAULT_CONTEXT_DIR_NAME, DEFAULT_CONTEXT_NAMESPACE, DEFAULT_DEBUG, DEFAULT_DIFF, DEFAULT_DRY_RUN, DEFAULT_INPUT_DIRECTORY, DEFAULT_INSTRUCTIONS_DIR, DEFAULT_INSTRUCTIONS_TRANSCRIBE_FILE, DEFAULT_INTERACTIVE, DEFAULT_INTERMEDIATE_DIRECTORY, DEFAULT_KEEP_INTERMEDIATES, DEFAULT_LOG, DEFAULT_MAX_AUDIO_SIZE, DEFAULT_MAX_DISCOVERY_LEVELS, DEFAULT_MODEL, DEFAULT_OUTPUT_DIRECTORY, DEFAULT_OUTPUT_FILENAME_OPTIONS, DEFAULT_OUTPUT_STRUCTURE, DEFAULT_OVERRIDES, DEFAULT_PERSONAS_DIR, DEFAULT_PERSONA_TRANSCRIBER_FILE, DEFAULT_PHONETIC_MODEL, DEFAULT_PROCESSED_DIR, DEFAULT_PROMPT_FOR_SOURCE, DEFAULT_REASONING_LEVEL, DEFAULT_RECURSIVE, DEFAULT_SELF_REFLECTION, DEFAULT_SILENT, DEFAULT_SMART_ASSISTANCE, DEFAULT_SOUNDS_LIKE_ON_ADD, DEFAULT_TEMP_DIRECTORY, DEFAULT_TERMS_ENABLED, DEFAULT_TERM_DESCRIPTION_ON_ADD, DEFAULT_TERM_PROJECT_SUGGESTIONS, DEFAULT_TERM_SOUNDS_LIKE_ON_ADD, DEFAULT_TERM_TOPICS_ON_ADD, DEFAULT_TIMEZONE, DEFAULT_TRANSCRIPTION_MODEL, DEFAULT_TRIGGER_PHRASES_ON_ADD, DEFAULT_VERBOSE, MAX_CONTENT_LENGTH, MAX_TERM_CONTEXT_LENGTH, OUTPUT_FILE_TYPES, PROGRAM_NAME, PROTOKOLL_DEFAULTS, TERM_ASSIST_TIMEOUT_MS };
53
107
  //# sourceMappingURL=index18.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index18.js","sources":["../src/reasoning/strategy.ts"],"sourcesContent":["/**\n * Reasoning Strategy\n * \n * Strategy factory for different transcription processing approaches.\n * Uses riotprompt's IterationStrategyFactory for complex workflows.\n */\n\nimport { IterationStrategy, IterationStrategyFactory } from '@kjerneverk/riotprompt';\nimport { ReasoningLevel } from './types';\n\nexport type TranscriptionStrategy = \n | 'simple' // Basic completion\n | 'investigate-then-respond' // Use tools to gather info, then respond\n | 'multi-pass' // Multiple refinement passes\n | 'adaptive'; // Changes based on complexity\n\nexport interface StrategyConfig {\n type: TranscriptionStrategy;\n maxIterations?: number;\n requireMinimumTools?: number;\n reasoningLevel?: ReasoningLevel;\n}\n\nexport const createStrategy = (config: StrategyConfig): IterationStrategy => {\n const maxIterations = config.maxIterations ?? getDefaultIterations(config.type);\n \n switch (config.type) {\n case 'simple':\n return IterationStrategyFactory.simple({\n maxIterations,\n allowTools: false,\n });\n \n case 'investigate-then-respond':\n return IterationStrategyFactory.investigateThenRespond({\n maxInvestigationSteps: Math.floor(maxIterations * 0.8),\n requireMinimumTools: config.requireMinimumTools ?? 2,\n finalSynthesis: true,\n });\n \n case 'multi-pass':\n return IterationStrategyFactory.multiPassRefinement({\n passes: 3,\n critiqueBetweenPasses: true,\n });\n \n case 'adaptive':\n return IterationStrategyFactory.adaptive({});\n \n default:\n return IterationStrategyFactory.simple({ maxIterations });\n }\n};\n\nconst getDefaultIterations = (type: TranscriptionStrategy): number => {\n switch (type) {\n case 'simple': return 1;\n case 'investigate-then-respond': return 15;\n case 'multi-pass': return 6;\n case 'adaptive': return 20;\n default: return 10;\n }\n};\n\nexport const getRecommendedStrategy = (\n transcriptLength: number,\n hasUnknownNames: boolean,\n complexity: 'low' | 'medium' | 'high'\n): TranscriptionStrategy => {\n // Short, simple transcripts\n if (transcriptLength < 500 && !hasUnknownNames && complexity === 'low') {\n return 'simple';\n }\n \n // Complex or with unknowns - need investigation\n if (hasUnknownNames || complexity === 'high') {\n return 'investigate-then-respond';\n }\n \n // Medium complexity - adaptive is good\n return 'adaptive';\n};\n\n"],"names":[],"mappings":";;AAuBO,MAAM,cAAA,GAAiB,CAAC,MAAA,KAA8C;AACzE,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,aAAA,IAAiB,oBAAA,CAAqB,OAAO,IAAI,CAAA;AAE9E,EAAA,QAAQ,OAAO,IAAA;AAAM,IACjB,KAAK,QAAA;AACD,MAAA,OAAO,yBAAyB,MAAA,CAAO;AAAA,QACnC,aAAA;AAAA,QACA,UAAA,EAAY;AAAA,OACf,CAAA;AAAA,IAEL,KAAK,0BAAA;AACD,MAAA,OAAO,yBAAyB,sBAAA,CAAuB;AAAA,QACnD,qBAAA,EAAuB,IAAA,CAAK,KAAA,CAAM,aAAA,GAAgB,GAAG,CAAA;AAAA,QACrD,mBAAA,EAAqB,OAAO,mBAAA,IAAuB,CAAA;AAAA,QACnD,cAAA,EAAgB;AAAA,OACnB,CAAA;AAAA,IAEL,KAAK,YAAA;AACD,MAAA,OAAO,yBAAyB,mBAAA,CAAoB;AAAA,QAChD,MAAA,EAAQ,CAAA;AAAA,QACR,qBAAA,EAAuB;AAAA,OAC1B,CAAA;AAAA,IAEL,KAAK,UAAA;AACD,MAAA,OAAO,wBAAA,CAAyB,QAAA,CAAS,EAAE,CAAA;AAAA,IAE/C;AACI,MAAA,OAAO,wBAAA,CAAyB,MAAA,CAAO,EAAE,aAAA,EAAe,CAAA;AAAA;AAEpE;AAEA,MAAM,oBAAA,GAAuB,CAAC,IAAA,KAAwC;AAClE,EAAA,QAAQ,IAAA;AAAM,IACV,KAAK,QAAA;AAAU,MAAA,OAAO,CAAA;AAAA,IACtB,KAAK,0BAAA;AAA4B,MAAA,OAAO,EAAA;AAAA,IACxC,KAAK,YAAA;AAAc,MAAA,OAAO,CAAA;AAAA,IAC1B,KAAK,UAAA;AAAY,MAAA,OAAO,EAAA;AAAA,IACxB;AAAS,MAAA,OAAO,EAAA;AAAA;AAExB,CAAA;AAEO,MAAM,sBAAA,GAAyB,CAClC,gBAAA,EACA,eAAA,EACA,UAAA,KACwB;AAExB,EAAA,IAAI,gBAAA,GAAmB,GAAA,IAAO,CAAC,eAAA,IAAmB,eAAe,KAAA,EAAO;AACpE,IAAA,OAAO,QAAA;AAAA,EACX;AAGA,EAAA,IAAI,eAAA,IAAmB,eAAe,MAAA,EAAQ;AAC1C,IAAA,OAAO,0BAAA;AAAA,EACX;AAGA,EAAA,OAAO,UAAA;AACX;;;;"}
1
+ {"version":3,"file":"index18.js","sources":["../src/constants.ts"],"sourcesContent":["import os from 'node:os';\nimport { FilenameOption } from '@utilarium/dreadcabinet';\nimport { FilesystemStructure } from '@utilarium/dreadcabinet';\n\nexport const VERSION = '__VERSION__ (__GIT_BRANCH__/__GIT_COMMIT__ __GIT_TAGS__ __GIT_COMMIT_DATE__) __SYSTEM_INFO__';\nexport const PROGRAM_NAME = 'protokoll';\nexport const DEFAULT_CHARACTER_ENCODING = 'utf-8';\nexport const DEFAULT_BINARY_TO_TEXT_ENCODING = 'base64';\nexport const DEFAULT_DIFF = true;\nexport const DEFAULT_LOG = false;\nexport const DEFAULT_TIMEZONE = 'Etc/UTC';\nexport const DATE_FORMAT_MONTH_DAY = 'M-D';\nexport const DATE_FORMAT_YEAR = 'YYYY';\nexport const DATE_FORMAT_YEAR_MONTH = 'YYYY-M';\nexport const DATE_FORMAT_YEAR_MONTH_DAY = 'YYYY-M-D';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_SLASH = 'YYYY/M/D';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES = 'YYYY-M-D-HHmm';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS = 'YYYY-M-D-HHmmss';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS = 'YYYY-M-D-HHmmss.SSS';\nexport const DATE_FORMAT_MONTH = 'M';\nexport const DATE_FORMAT_DAY = 'D';\nexport const DATE_FORMAT_HOURS = 'HHmm';\nexport const DATE_FORMAT_MINUTES = 'mm';\nexport const DATE_FORMAT_SECONDS = 'ss';\nexport const DATE_FORMAT_MILLISECONDS = 'SSS';\nexport const DEFAULT_VERBOSE = false;\nexport const DEFAULT_DRY_RUN = false;\nexport const DEFAULT_DEBUG = false;\nexport const DEFAULT_CONTENT_TYPES = ['diff'];\nexport const DEFAULT_RECURSIVE = false;\nexport const DEFAULT_INPUT_DIRECTORY = './';\nexport const DEFAULT_OUTPUT_DIRECTORY = './';\n\nexport const DEFAULT_AUDIO_EXTENSIONS = ['mp3', 'mp4', 'mpeg', 'mpga', 'm4a', 'wav', 'webm', 'qta'];\n\nexport const ALLOWED_CONTENT_TYPES = ['log', 'diff'];\nexport const ALLOWED_AUDIO_EXTENSIONS = ['mp3', 'mp4', 'mpeg', 'mpga', 'm4a', 'wav', 'webm', 'qta'];\n\nexport const DEFAULT_OUTPUT_STRUCTURE = 'month' as FilesystemStructure;\nexport const DEFAULT_OUTPUT_FILENAME_OPTIONS = ['date', 'time', 'subject'] as FilenameOption[];\n\nexport const ALLOWED_OUTPUT_STRUCTURES = ['none', 'year', 'month', 'day'] as FilesystemStructure[];\nexport const ALLOWED_OUTPUT_FILENAME_OPTIONS = ['date', 'time', 'subject'] as FilenameOption[];\n\nexport const DEFAULT_CONFIG_DIR = `./.${PROGRAM_NAME}`;\nexport const DEFAULT_PROCESSED_DIR = './processed';\n\n// Context System Constants\nexport const DEFAULT_CONTEXT_DIR_NAME = '.protokoll';\nexport const DEFAULT_CONTEXT_NAMESPACE = 'redaksjon';\nexport const DEFAULT_CONTEXT_CONFIG_FILE_NAME = 'config.yaml';\nexport const DEFAULT_MAX_DISCOVERY_LEVELS = 10;\n\nexport const CONTEXT_SUBDIRECTORIES = {\n people: 'people',\n projects: 'projects',\n companies: 'companies',\n terms: 'terms',\n} as const;\n\nexport const DEFAULT_PERSONAS_DIR = `/personas`;\n\nexport const DEFAULT_PERSONA_TRANSCRIBER_FILE = `${DEFAULT_PERSONAS_DIR}/transcriber.md`;\n\nexport const DEFAULT_INSTRUCTIONS_DIR = `/instructions`;\n\nexport const DEFAULT_INSTRUCTIONS_TRANSCRIBE_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/transcribe.md`;\n\n// Note: We no longer maintain a static allowlist of models\n// This allows for dynamic model discovery and future model additions\n// Users can specify any model supported by their OpenAI API\n\nexport const DEFAULT_TRANSCRIPTION_MODEL = 'whisper-1';\nexport const DEFAULT_MODEL = 'gpt-5.2';\nexport const DEFAULT_REASONING_LEVEL = 'medium';\n\n// Smart Assistance Constants\nexport const DEFAULT_PHONETIC_MODEL = 'gpt-5-nano';\nexport const DEFAULT_ANALYSIS_MODEL = 'gpt-5-mini';\nexport const DEFAULT_SMART_ASSISTANCE = true;\n\n// Project-specific smart assistance\nexport const DEFAULT_SOUNDS_LIKE_ON_ADD = true; // Generate phonetic variants\nexport const DEFAULT_TRIGGER_PHRASES_ON_ADD = true; // Generate content-matching phrases\nexport const DEFAULT_PROMPT_FOR_SOURCE = true;\n\n// Term-specific smart assistance\nexport const DEFAULT_TERMS_ENABLED = true;\nexport const DEFAULT_TERM_SOUNDS_LIKE_ON_ADD = true;\nexport const DEFAULT_TERM_DESCRIPTION_ON_ADD = true;\nexport const DEFAULT_TERM_TOPICS_ON_ADD = true;\nexport const DEFAULT_TERM_PROJECT_SUGGESTIONS = true;\n\n// Content limits\nexport const MAX_CONTENT_LENGTH = 15000; // Max characters to send to LLM\nexport const MAX_TERM_CONTEXT_LENGTH = 10000; // Max characters for term context\nexport const ASSIST_TIMEOUT_MS = 30000; // 30 second timeout for LLM calls\nexport const TERM_ASSIST_TIMEOUT_MS = 20000; // 20 second timeout for term LLM calls\n\nexport const DEFAULT_OVERRIDES = false;\nexport const DEFAULT_MAX_AUDIO_SIZE = 26214400; // 25MB in bytes\nexport const DEFAULT_TEMP_DIRECTORY = os.tmpdir(); // Use OS default temp directory\nexport const DEFAULT_INTERACTIVE = true; // Interactive prompts enabled by default\nexport const DEFAULT_SELF_REFLECTION = true;\nexport const DEFAULT_SILENT = false; // Sound notifications enabled by default\n\n// Output Management Constants\nexport const DEFAULT_INTERMEDIATE_DIRECTORY = './output/protokoll';\nexport const DEFAULT_KEEP_INTERMEDIATES = true;\nexport const OUTPUT_FILE_TYPES = [\n 'transcript',\n 'context',\n 'request',\n 'response',\n 'reflection',\n 'session',\n] as const;\n\n// Define Protokoll-specific defaults\nexport const PROTOKOLL_DEFAULTS = {\n dryRun: DEFAULT_DRY_RUN,\n verbose: DEFAULT_VERBOSE,\n debug: DEFAULT_DEBUG,\n diff: DEFAULT_DIFF,\n log: DEFAULT_LOG,\n transcriptionModel: DEFAULT_TRANSCRIPTION_MODEL,\n model: DEFAULT_MODEL,\n reasoningLevel: DEFAULT_REASONING_LEVEL,\n contentTypes: DEFAULT_CONTENT_TYPES,\n overrides: DEFAULT_OVERRIDES,\n maxAudioSize: DEFAULT_MAX_AUDIO_SIZE,\n tempDirectory: DEFAULT_TEMP_DIRECTORY || os.tmpdir(),\n configDirectory: DEFAULT_CONFIG_DIR,\n interactive: DEFAULT_INTERACTIVE,\n selfReflection: DEFAULT_SELF_REFLECTION,\n silent: DEFAULT_SILENT,\n};\n"],"names":["os"],"mappings":"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"}
package/dist/index19.js CHANGED
@@ -1,19 +1,185 @@
1
- const REASONING_MODELS = {
2
- "claude-3-5-sonnet": { maxTokens: 4096, supportsTools: true },
3
- "claude-3-opus": { maxTokens: 4096, supportsTools: true },
4
- "claude-4": { maxTokens: 8192, supportsTools: true },
5
- "gpt-4o": { maxTokens: 4096, supportsTools: true },
6
- "gpt-4o-mini": { maxTokens: 4096, supportsTools: true },
7
- "gpt-5": { maxTokens: 8192, supportsTools: true },
8
- "gpt-5-nano": { maxTokens: 2048, supportsTools: true },
9
- "gpt-5-mini": { maxTokens: 4096, supportsTools: true },
10
- "gpt-5.1": { maxTokens: 16384, supportsTools: true, reasoningLevel: true },
11
- "gpt-5.2": { maxTokens: 32768, supportsTools: true, reasoningLevel: true },
12
- "o1": { maxTokens: 65536, supportsTools: false, reasoningLevel: true },
13
- "o1-mini": { maxTokens: 65536, supportsTools: false, reasoningLevel: true },
14
- "o3": { maxTokens: 1e5, supportsTools: true, reasoningLevel: true },
15
- "o3-mini": { maxTokens: 65536, supportsTools: true, reasoningLevel: true }
1
+ import OpenAI from 'openai';
2
+ import { getLogger } from './index47.js';
3
+
4
+ const create = (config) => {
5
+ const logger = getLogger();
6
+ let client = null;
7
+ const getClient = () => {
8
+ if (!client) {
9
+ client = new OpenAI({ apiKey: config.apiKey });
10
+ }
11
+ return client;
12
+ };
13
+ const getModelFamily = (model) => {
14
+ if (model.startsWith("gpt") || model.startsWith("o1") || model.startsWith("o3")) return "openai";
15
+ if (model.startsWith("claude")) return "anthropic";
16
+ if (model.startsWith("gemini")) return "gemini";
17
+ return "unknown";
18
+ };
19
+ const isReasoningModel = (model) => {
20
+ const reasoningModels = [
21
+ "gpt-4o",
22
+ "gpt-4-turbo",
23
+ "gpt-5",
24
+ "gpt-5-mini",
25
+ "gpt-5.1",
26
+ "gpt-5.2",
27
+ "o1",
28
+ "o1-mini",
29
+ "o1-preview",
30
+ "o3",
31
+ "o3-mini",
32
+ "claude-3-5-sonnet",
33
+ "claude-3-opus",
34
+ "claude-4"
35
+ ];
36
+ return reasoningModels.some((rm) => model.includes(rm));
37
+ };
38
+ const supportsReasoningLevel = (model) => {
39
+ const models = ["gpt-5.1", "gpt-5.2", "o1", "o1-mini", "o3", "o3-mini"];
40
+ return models.some((m) => model.includes(m));
41
+ };
42
+ const complete = async (request) => {
43
+ const startTime = Date.now();
44
+ logger.debug("Reasoning request starting", { model: config.model });
45
+ try {
46
+ const messages = [];
47
+ if (request.systemPrompt) {
48
+ messages.push({ role: "system", content: request.systemPrompt });
49
+ }
50
+ messages.push({ role: "user", content: request.prompt });
51
+ const tools = request.tools?.map((tool) => ({
52
+ type: "function",
53
+ function: {
54
+ name: tool.name,
55
+ description: tool.description,
56
+ parameters: tool.parameters
57
+ }
58
+ }));
59
+ const requestOptions = {
60
+ model: config.model,
61
+ messages,
62
+ tools: tools && tools.length > 0 ? tools : void 0,
63
+ tool_choice: tools && tools.length > 0 ? "auto" : void 0
64
+ };
65
+ if (supportsReasoningLevel(config.model)) {
66
+ const reasoningLevel = config.reasoningLevel || "medium";
67
+ requestOptions.reasoning_effort = reasoningLevel;
68
+ logger.debug("Using reasoning_effort: %s for model %s", reasoningLevel, config.model);
69
+ }
70
+ const response = await getClient().chat.completions.create(
71
+ requestOptions
72
+ );
73
+ const duration = Date.now() - startTime;
74
+ logger.debug("Reasoning model responded in %dms", duration);
75
+ const choice = response.choices[0];
76
+ const message = choice.message;
77
+ const usage = response.usage ? {
78
+ promptTokens: response.usage.prompt_tokens,
79
+ completionTokens: response.usage.completion_tokens,
80
+ totalTokens: response.usage.total_tokens
81
+ } : void 0;
82
+ const toolCalls = message.tool_calls?.map((tc) => {
83
+ const fn = "function" in tc ? tc.function : null;
84
+ if (!fn) {
85
+ return { id: tc.id, name: "unknown", arguments: {} };
86
+ }
87
+ return {
88
+ id: tc.id,
89
+ name: fn.name,
90
+ arguments: JSON.parse(fn.arguments)
91
+ };
92
+ });
93
+ if (toolCalls && toolCalls.length > 0) {
94
+ logger.debug("Model requested %d tool calls: %s", toolCalls.length, toolCalls.map((t) => t.name).join(", "));
95
+ }
96
+ return {
97
+ content: message.content || "",
98
+ model: config.model,
99
+ duration,
100
+ usage,
101
+ toolCalls,
102
+ finishReason: choice.finish_reason
103
+ };
104
+ } catch (error) {
105
+ logger.error("Reasoning request failed", { error });
106
+ throw error;
107
+ }
108
+ };
109
+ const completeWithTools = async (request) => {
110
+ logger.debug("Tool call request starting", { model: config.model, messageCount: request.messages.length });
111
+ try {
112
+ const messages = request.messages.map((msg) => {
113
+ if (msg.role === "tool") {
114
+ return {
115
+ role: "tool",
116
+ content: msg.content,
117
+ tool_call_id: msg.tool_call_id || ""
118
+ };
119
+ }
120
+ if (msg.role === "assistant" && msg.tool_calls) {
121
+ return {
122
+ role: "assistant",
123
+ content: msg.content || null,
124
+ tool_calls: msg.tool_calls.map((tc) => ({
125
+ id: tc.id,
126
+ type: "function",
127
+ function: tc.function
128
+ }))
129
+ };
130
+ }
131
+ return {
132
+ role: msg.role,
133
+ content: msg.content
134
+ };
135
+ });
136
+ const requestOptions = {
137
+ model: config.model,
138
+ messages,
139
+ tools: request.tools,
140
+ tool_choice: request.tools && request.tools.length > 0 ? "auto" : void 0
141
+ };
142
+ if (supportsReasoningLevel(config.model)) {
143
+ requestOptions.reasoning_effort = config.reasoningLevel || "medium";
144
+ }
145
+ const response = await getClient().chat.completions.create(
146
+ requestOptions
147
+ );
148
+ const choice = response.choices[0];
149
+ const message = choice.message;
150
+ const toolCalls = message.tool_calls?.map((tc) => {
151
+ const fn = "function" in tc ? tc.function : null;
152
+ if (!fn) {
153
+ return { id: tc.id, function: { name: "unknown", arguments: "{}" } };
154
+ }
155
+ return {
156
+ id: tc.id,
157
+ function: {
158
+ name: fn.name,
159
+ arguments: fn.arguments
160
+ }
161
+ };
162
+ });
163
+ if (toolCalls && toolCalls.length > 0) {
164
+ logger.debug("Model requested %d tool calls: %s", toolCalls.length, toolCalls.map((t) => t.function.name).join(", "));
165
+ }
166
+ return {
167
+ content: message.content || "",
168
+ tool_calls: toolCalls,
169
+ finish_reason: choice.finish_reason
170
+ };
171
+ } catch (error) {
172
+ logger.error("Tool call request failed", { error });
173
+ throw error;
174
+ }
175
+ };
176
+ return {
177
+ complete,
178
+ completeWithTools,
179
+ isReasoningModel,
180
+ getModelFamily
181
+ };
16
182
  };
17
183
 
18
- export { REASONING_MODELS };
184
+ export { create };
19
185
  //# sourceMappingURL=index19.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index19.js","sources":["../src/reasoning/types.ts"],"sourcesContent":["/**\n * Reasoning System Types\n *\n * Configuration and types for reasoning model integration.\n * Uses riotprompt for prompt building and execution.\n */\n\n// Model families with reasoning capabilities\nexport type ReasoningModel =\n | 'claude-3-5-sonnet'\n | 'claude-3-opus'\n | 'claude-4'\n | 'gpt-4o'\n | 'gpt-4o-mini'\n | 'gpt-4-turbo'\n | 'gpt-5'\n | 'gpt-5-nano'\n | 'gpt-5-mini'\n | 'gpt-5.1'\n | 'gpt-5.2'\n | 'o1'\n | 'o1-mini'\n | 'o3'\n | 'o3-mini'\n | string; // Allow any model string\n\nexport type ReasoningLevel = 'none' | 'low' | 'medium' | 'high';\n\nexport interface ReasoningConfig {\n model: ReasoningModel;\n reasoningLevel?: ReasoningLevel; // For models that support it (o1, etc.)\n maxTokens?: number;\n temperature?: number;\n apiKey?: string; // Override default\n provider?: 'openai' | 'anthropic' | 'gemini' | 'auto';\n}\n\nexport interface ReasoningRequest {\n prompt: string;\n systemPrompt?: string;\n context?: string[];\n maxIterations?: number;\n tools?: ToolDefinition[];\n}\n\nexport interface ToolCall {\n id: string;\n name: string;\n arguments: Record<string, unknown>;\n}\n\nexport interface ToolDefinition {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n}\n\nexport interface ReasoningResponse {\n content: string;\n model: string;\n usage?: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n toolCalls?: ToolCall[];\n finishReason?: string;\n duration?: number;\n}\n\nexport interface ReasoningMetrics {\n iterations: number;\n toolCallsExecuted: number;\n totalDuration: number;\n tokensUsed: number;\n}\n\n// Model-specific settings\nexport interface ModelSettings {\n maxTokens: number;\n supportsTools: boolean;\n reasoningLevel?: boolean;\n}\n\nexport const REASONING_MODELS: Record<string, ModelSettings> = {\n 'claude-3-5-sonnet': { maxTokens: 4096, supportsTools: true },\n 'claude-3-opus': { maxTokens: 4096, supportsTools: true },\n 'claude-4': { maxTokens: 8192, supportsTools: true },\n 'gpt-4o': { maxTokens: 4096, supportsTools: true },\n 'gpt-4o-mini': { maxTokens: 4096, supportsTools: true },\n 'gpt-5': { maxTokens: 8192, supportsTools: true },\n 'gpt-5-nano': { maxTokens: 2048, supportsTools: true },\n 'gpt-5-mini': { maxTokens: 4096, supportsTools: true },\n 'gpt-5.1': { maxTokens: 16384, supportsTools: true, reasoningLevel: true },\n 'gpt-5.2': { maxTokens: 32768, supportsTools: true, reasoningLevel: true },\n 'o1': { maxTokens: 65536, supportsTools: false, reasoningLevel: true },\n 'o1-mini': { maxTokens: 65536, supportsTools: false, reasoningLevel: true },\n 'o3': { maxTokens: 100000, supportsTools: true, reasoningLevel: true },\n 'o3-mini': { maxTokens: 65536, supportsTools: true, reasoningLevel: true },\n};\n\n"],"names":[],"mappings":"AAoFO,MAAM,gBAAA,GAAkD;AAAA,EAC3D,mBAAA,EAAqB,EAAE,SAAA,EAAW,IAAA,EAAM,eAAe,IAAA,EAAK;AAAA,EAC5D,eAAA,EAAiB,EAAE,SAAA,EAAW,IAAA,EAAM,eAAe,IAAA,EAAK;AAAA,EACxD,UAAA,EAAY,EAAE,SAAA,EAAW,IAAA,EAAM,eAAe,IAAA,EAAK;AAAA,EACnD,QAAA,EAAU,EAAE,SAAA,EAAW,IAAA,EAAM,eAAe,IAAA,EAAK;AAAA,EACjD,aAAA,EAAe,EAAE,SAAA,EAAW,IAAA,EAAM,eAAe,IAAA,EAAK;AAAA,EACtD,OAAA,EAAS,EAAE,SAAA,EAAW,IAAA,EAAM,eAAe,IAAA,EAAK;AAAA,EAChD,YAAA,EAAc,EAAE,SAAA,EAAW,IAAA,EAAM,eAAe,IAAA,EAAK;AAAA,EACrD,YAAA,EAAc,EAAE,SAAA,EAAW,IAAA,EAAM,eAAe,IAAA,EAAK;AAAA,EACrD,WAAW,EAAE,SAAA,EAAW,OAAO,aAAA,EAAe,IAAA,EAAM,gBAAgB,IAAA,EAAK;AAAA,EACzE,WAAW,EAAE,SAAA,EAAW,OAAO,aAAA,EAAe,IAAA,EAAM,gBAAgB,IAAA,EAAK;AAAA,EACzE,MAAM,EAAE,SAAA,EAAW,OAAO,aAAA,EAAe,KAAA,EAAO,gBAAgB,IAAA,EAAK;AAAA,EACrE,WAAW,EAAE,SAAA,EAAW,OAAO,aAAA,EAAe,KAAA,EAAO,gBAAgB,IAAA,EAAK;AAAA,EAC1E,MAAM,EAAE,SAAA,EAAW,KAAQ,aAAA,EAAe,IAAA,EAAM,gBAAgB,IAAA,EAAK;AAAA,EACrE,WAAW,EAAE,SAAA,EAAW,OAAO,aAAA,EAAe,IAAA,EAAM,gBAAgB,IAAA;AACxE;;;;"}
1
+ {"version":3,"file":"index19.js","sources":["../src/reasoning/client.ts"],"sourcesContent":["/**\n * Reasoning Client\n * \n * Wrapper for reasoning model calls with tool/function calling support.\n * Uses OpenAI's native function calling for agentic workflows.\n */\n\nimport OpenAI from 'openai';\nimport { ReasoningConfig, ReasoningRequest, ReasoningResponse, ToolCall } from './types';\nimport * as Logging from '../logging';\n\nexport interface ToolCallRequest {\n messages: Array<{\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string;\n tool_call_id?: string;\n tool_calls?: Array<{ id: string; function: { name: string; arguments: string } }>;\n }>;\n tools?: Array<{\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n }>;\n}\n\nexport interface ToolCallResponse {\n content: string;\n tool_calls?: Array<{\n id: string;\n function: {\n name: string;\n arguments: string;\n };\n }>;\n finish_reason?: string;\n}\n\nexport interface ClientInstance {\n complete(request: ReasoningRequest): Promise<ReasoningResponse>;\n completeWithTools(request: ToolCallRequest): Promise<ToolCallResponse>;\n isReasoningModel(model: string): boolean;\n getModelFamily(model: string): 'openai' | 'anthropic' | 'gemini' | 'unknown';\n}\n\nexport const create = (config: ReasoningConfig): ClientInstance => {\n const logger = Logging.getLogger();\n \n // Lazy-initialize OpenAI client (only when actually needed)\n let client: OpenAI | null = null;\n const getClient = (): OpenAI => {\n if (!client) {\n client = new OpenAI({ apiKey: config.apiKey });\n }\n return client;\n };\n \n const getModelFamily = (model: string): 'openai' | 'anthropic' | 'gemini' | 'unknown' => {\n if (model.startsWith('gpt') || model.startsWith('o1') || model.startsWith('o3')) return 'openai';\n if (model.startsWith('claude')) return 'anthropic';\n if (model.startsWith('gemini')) return 'gemini';\n return 'unknown';\n };\n \n const isReasoningModel = (model: string): boolean => {\n // Models known for strong reasoning\n const reasoningModels = [\n 'gpt-4o', 'gpt-4-turbo', 'gpt-5', 'gpt-5-mini', 'gpt-5.1', 'gpt-5.2',\n 'o1', 'o1-mini', 'o1-preview', 'o3', 'o3-mini',\n 'claude-3-5-sonnet', 'claude-3-opus', 'claude-4',\n ];\n return reasoningModels.some(rm => model.includes(rm));\n };\n \n const supportsReasoningLevel = (model: string): boolean => {\n // Models that support reasoning_effort parameter\n const models = ['gpt-5.1', 'gpt-5.2', 'o1', 'o1-mini', 'o3', 'o3-mini'];\n return models.some(m => model.includes(m));\n };\n \n const complete = async (request: ReasoningRequest): Promise<ReasoningResponse> => {\n const startTime = Date.now();\n logger.debug('Reasoning request starting', { model: config.model });\n \n try {\n // Build messages for OpenAI\n const messages: Array<OpenAI.Chat.ChatCompletionMessageParam> = [];\n \n if (request.systemPrompt) {\n messages.push({ role: 'system', content: request.systemPrompt });\n }\n \n // Add the main prompt\n messages.push({ role: 'user', content: request.prompt });\n \n // Build tools if provided\n const tools: OpenAI.Chat.ChatCompletionTool[] | undefined = request.tools?.map(tool => ({\n type: 'function' as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n }));\n \n // Build request options\n const requestOptions: Record<string, unknown> = {\n model: config.model,\n messages,\n tools: tools && tools.length > 0 ? tools : undefined,\n tool_choice: tools && tools.length > 0 ? 'auto' : undefined,\n };\n \n // Add reasoning_effort for models that support it (default to 'medium')\n if (supportsReasoningLevel(config.model)) {\n const reasoningLevel = config.reasoningLevel || 'medium';\n requestOptions.reasoning_effort = reasoningLevel;\n logger.debug('Using reasoning_effort: %s for model %s', reasoningLevel, config.model);\n }\n \n const response = await getClient().chat.completions.create(\n requestOptions as unknown as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming\n );\n \n const duration = Date.now() - startTime;\n logger.debug('Reasoning model responded in %dms', duration);\n \n const choice = response.choices[0];\n const message = choice.message;\n \n // Extract token usage\n const usage = response.usage ? {\n promptTokens: response.usage.prompt_tokens,\n completionTokens: response.usage.completion_tokens,\n totalTokens: response.usage.total_tokens,\n } : undefined;\n \n // Extract tool calls if any\n const toolCalls: ToolCall[] | undefined = message.tool_calls?.map(tc => {\n // Handle both standard and custom tool call formats\n const fn = 'function' in tc ? tc.function : null;\n if (!fn) {\n return { id: tc.id, name: 'unknown', arguments: {} };\n }\n return {\n id: tc.id,\n name: fn.name,\n arguments: JSON.parse(fn.arguments),\n };\n });\n \n if (toolCalls && toolCalls.length > 0) {\n logger.debug('Model requested %d tool calls: %s', toolCalls.length, toolCalls.map(t => t.name).join(', '));\n }\n \n return {\n content: message.content || '',\n model: config.model,\n duration,\n usage,\n toolCalls,\n finishReason: choice.finish_reason,\n };\n } catch (error) {\n logger.error('Reasoning request failed', { error });\n throw error;\n }\n };\n \n const completeWithTools = async (request: ToolCallRequest): Promise<ToolCallResponse> => {\n logger.debug('Tool call request starting', { model: config.model, messageCount: request.messages.length });\n \n try {\n // Convert messages to OpenAI format\n const messages: Array<OpenAI.Chat.ChatCompletionMessageParam> = request.messages.map(msg => {\n if (msg.role === 'tool') {\n return {\n role: 'tool' as const,\n content: msg.content,\n tool_call_id: msg.tool_call_id || '',\n };\n }\n if (msg.role === 'assistant' && msg.tool_calls) {\n return {\n role: 'assistant' as const,\n content: msg.content || null,\n tool_calls: msg.tool_calls.map(tc => ({\n id: tc.id,\n type: 'function' as const,\n function: tc.function,\n })),\n };\n }\n return {\n role: msg.role as 'system' | 'user' | 'assistant',\n content: msg.content,\n };\n });\n \n // Build request options\n const requestOptions: Record<string, unknown> = {\n model: config.model,\n messages,\n tools: request.tools,\n tool_choice: request.tools && request.tools.length > 0 ? 'auto' : undefined,\n };\n \n // Add reasoning_effort for models that support it\n if (supportsReasoningLevel(config.model)) {\n requestOptions.reasoning_effort = config.reasoningLevel || 'medium';\n }\n \n const response = await getClient().chat.completions.create(\n requestOptions as unknown as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming\n );\n \n const choice = response.choices[0];\n const message = choice.message;\n \n // Extract tool calls if any\n const toolCalls = message.tool_calls?.map(tc => {\n // Handle both standard and custom tool call formats\n const fn = 'function' in tc ? tc.function : null;\n if (!fn) {\n return { id: tc.id, function: { name: 'unknown', arguments: '{}' } };\n }\n return {\n id: tc.id,\n function: {\n name: fn.name,\n arguments: fn.arguments,\n },\n };\n });\n \n if (toolCalls && toolCalls.length > 0) {\n logger.debug('Model requested %d tool calls: %s', toolCalls.length, toolCalls.map(t => t.function.name).join(', '));\n }\n \n return {\n content: message.content || '',\n tool_calls: toolCalls,\n finish_reason: choice.finish_reason,\n };\n } catch (error) {\n logger.error('Tool call request failed', { error });\n throw error;\n }\n };\n \n return {\n complete,\n completeWithTools,\n isReasoningModel,\n getModelFamily,\n };\n};\n"],"names":["Logging.getLogger"],"mappings":"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"}
package/dist/index2.js CHANGED
@@ -1,6 +1,6 @@
1
- import { create as create$1 } from './index17.js';
2
- import { getRecommendedStrategy, createStrategy } from './index18.js';
3
- export { REASONING_MODELS } from './index19.js';
1
+ import { create as create$1 } from './index19.js';
2
+ import { getRecommendedStrategy, createStrategy } from './index20.js';
3
+ export { REASONING_MODELS } from './index21.js';
4
4
 
5
5
  const create = (config) => {
6
6
  const client = create$1(config);
package/dist/index20.js CHANGED
@@ -1,105 +1,53 @@
1
- import { create as create$1 } from './index12.js';
2
- import { create as create$2 } from './index13.js';
3
- import { MODEL_CAPABILITIES } from './index21.js';
4
- import { getLogger } from './index41.js';
5
- import * as path from 'node:path';
6
- import * as os from 'node:os';
1
+ import { IterationStrategyFactory } from '@kjerneverk/riotprompt';
7
2
 
8
- const create = (openai) => {
9
- const logger = getLogger();
10
- const storage$1 = create$1({ log: logger.debug });
11
- const media$1 = create$2(logger);
12
- const supportsStreaming = (model) => {
13
- return MODEL_CAPABILITIES[model]?.supportsStreaming ?? false;
14
- };
15
- const supportsDiarization = (model) => {
16
- return MODEL_CAPABILITIES[model]?.supportsDiarization ?? false;
17
- };
18
- const transcribe = async (request) => {
19
- const { audioFile, config } = request;
20
- logger.debug("Starting transcription", { model: config.model, file: audioFile });
21
- const MAX_AUDIO_SIZE = 26214400;
22
- const tempDir = path.join(os.tmpdir(), "protokoll-conversions");
23
- const originalFileSize = await media$1.getFileSize(audioFile);
24
- const originalFileSizeMB = (originalFileSize / (1024 * 1024)).toFixed(1);
25
- logger.debug(`Original audio file size: ${originalFileSize} bytes (${originalFileSizeMB} MB)`);
26
- const needsConversion = originalFileSize > MAX_AUDIO_SIZE * 0.95;
27
- const convertedAudioFile = needsConversion ? await media$1.convertToSupportedFormat(audioFile, tempDir, true) : await media$1.convertToSupportedFormat(audioFile, tempDir);
28
- logger.debug(`Using audio file for transcription: ${convertedAudioFile}`);
29
- const fileSize = await media$1.getFileSize(convertedAudioFile);
30
- const fileSizeMB = (fileSize / (1024 * 1024)).toFixed(1);
31
- logger.debug(`Audio file size: ${fileSize} bytes (${fileSizeMB} MB), max size: ${MAX_AUDIO_SIZE} bytes`);
32
- let transcriptionText;
33
- let totalDuration = 0;
34
- if (fileSize > MAX_AUDIO_SIZE) {
35
- logger.info(`Audio file exceeds maximum size (${fileSize} > ${MAX_AUDIO_SIZE} bytes), splitting into chunks`);
36
- const splitTempDir = path.join(tempDir, `split_audio_${Date.now()}`);
37
- await storage$1.createDirectory(splitTempDir);
38
- try {
39
- const audioChunks = await media$1.splitAudioFile(convertedAudioFile, splitTempDir, MAX_AUDIO_SIZE);
40
- logger.info(`Split audio file into ${audioChunks.length} chunks`);
41
- const transcriptions = [];
42
- for (let i = 0; i < audioChunks.length; i++) {
43
- const chunkPath = audioChunks[i];
44
- logger.info(`Transcribing chunk ${i + 1}/${audioChunks.length}: ${chunkPath}`);
45
- const chunkStream = await storage$1.readStream(chunkPath);
46
- const chunkStartTime = Date.now();
47
- const chunkResponse = await openai.audio.transcriptions.create({
48
- model: config.model,
49
- file: chunkStream,
50
- response_format: config.response_format ?? "json",
51
- ...config.language && { language: config.language },
52
- ...config.temperature !== void 0 && { temperature: config.temperature },
53
- ...config.prompt && { prompt: config.prompt }
54
- });
55
- const chunkDuration = Date.now() - chunkStartTime;
56
- totalDuration += chunkDuration;
57
- transcriptions.push(chunkResponse.text);
58
- }
59
- transcriptionText = transcriptions.join(" ");
60
- for (const chunk of audioChunks) {
61
- try {
62
- await storage$1.deleteFile(chunk);
63
- } catch (error) {
64
- logger.warn(`Failed to delete temporary chunk ${chunk}: ${error}`);
65
- }
66
- }
67
- try {
68
- await storage$1.deleteDirectory(splitTempDir);
69
- } catch (error) {
70
- logger.warn(`Failed to delete temporary split directory ${splitTempDir}: ${error}`);
71
- }
72
- } catch (error) {
73
- logger.error(`Error processing split audio files: ${error}`);
74
- throw new Error(`Failed to process split audio files: ${error}`);
75
- }
76
- } else {
77
- const audioStream = await storage$1.readStream(convertedAudioFile);
78
- const startTime = Date.now();
79
- const response = await openai.audio.transcriptions.create({
80
- model: config.model,
81
- file: audioStream,
82
- response_format: config.response_format ?? "json",
83
- ...config.language && { language: config.language },
84
- ...config.temperature !== void 0 && { temperature: config.temperature },
85
- ...config.prompt && { prompt: config.prompt }
3
+ const createStrategy = (config) => {
4
+ const maxIterations = config.maxIterations ?? getDefaultIterations(config.type);
5
+ switch (config.type) {
6
+ case "simple":
7
+ return IterationStrategyFactory.simple({
8
+ maxIterations,
9
+ allowTools: false
86
10
  });
87
- totalDuration = Date.now() - startTime;
88
- transcriptionText = response.text;
89
- }
90
- logger.debug("Transcription complete", { duration: totalDuration, model: config.model });
91
- return {
92
- text: transcriptionText,
93
- model: config.model,
94
- duration: totalDuration
95
- };
96
- };
97
- return {
98
- transcribe,
99
- supportsStreaming,
100
- supportsDiarization
101
- };
11
+ case "investigate-then-respond":
12
+ return IterationStrategyFactory.investigateThenRespond({
13
+ maxInvestigationSteps: Math.floor(maxIterations * 0.8),
14
+ requireMinimumTools: config.requireMinimumTools ?? 2,
15
+ finalSynthesis: true
16
+ });
17
+ case "multi-pass":
18
+ return IterationStrategyFactory.multiPassRefinement({
19
+ passes: 3,
20
+ critiqueBetweenPasses: true
21
+ });
22
+ case "adaptive":
23
+ return IterationStrategyFactory.adaptive({});
24
+ default:
25
+ return IterationStrategyFactory.simple({ maxIterations });
26
+ }
27
+ };
28
+ const getDefaultIterations = (type) => {
29
+ switch (type) {
30
+ case "simple":
31
+ return 1;
32
+ case "investigate-then-respond":
33
+ return 15;
34
+ case "multi-pass":
35
+ return 6;
36
+ case "adaptive":
37
+ return 20;
38
+ default:
39
+ return 10;
40
+ }
41
+ };
42
+ const getRecommendedStrategy = (transcriptLength, hasUnknownNames, complexity) => {
43
+ if (transcriptLength < 500 && !hasUnknownNames && complexity === "low") {
44
+ return "simple";
45
+ }
46
+ if (hasUnknownNames || complexity === "high") {
47
+ return "investigate-then-respond";
48
+ }
49
+ return "adaptive";
102
50
  };
103
51
 
104
- export { create };
52
+ export { createStrategy, getRecommendedStrategy };
105
53
  //# sourceMappingURL=index20.js.map