coaiajs 0.3.0 → 0.3.2

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 (179) hide show
  1. package/KINSHIP.md +1 -1
  2. package/README.md +191 -75
  3. package/dist/mcp/config.d.ts.map +1 -0
  4. package/dist/mcp/config.js +0 -2
  5. package/dist/mcp/config.js.map +1 -0
  6. package/dist/mcp/prompts.d.ts.map +1 -0
  7. package/dist/mcp/prompts.js.map +1 -0
  8. package/dist/mcp/resources.d.ts.map +1 -0
  9. package/dist/mcp/resources.js.map +1 -0
  10. package/dist/mcp/server.d.ts.map +1 -0
  11. package/dist/mcp/server.js +1 -1
  12. package/dist/mcp/server.js.map +1 -0
  13. package/dist/mcp/tools/coaiapy-tools.d.ts.map +1 -0
  14. package/dist/mcp/tools/coaiapy-tools.js.map +1 -0
  15. package/dist/mcp/tools/index.d.ts.map +1 -0
  16. package/dist/mcp/tools/index.js.map +1 -0
  17. package/dist/src/audio.d.ts.map +1 -0
  18. package/dist/src/audio.js.map +1 -0
  19. package/dist/src/cli-helpers.d.ts.map +1 -0
  20. package/dist/src/cli-helpers.js.map +1 -0
  21. package/dist/src/cli.d.ts.map +1 -0
  22. package/dist/src/cli.js +1 -0
  23. package/dist/src/cli.js.map +1 -0
  24. package/dist/src/config.d.ts.map +1 -0
  25. package/dist/src/config.js.map +1 -0
  26. package/dist/src/environment.d.ts.map +1 -0
  27. package/dist/src/environment.js.map +1 -0
  28. package/dist/src/github.d.ts.map +1 -0
  29. package/dist/src/github.js.map +1 -0
  30. package/dist/src/index.d.ts +1 -0
  31. package/dist/src/index.d.ts.map +1 -0
  32. package/dist/src/index.js +1 -0
  33. package/dist/src/index.js.map +1 -0
  34. package/dist/src/langfuse/client.d.ts.map +1 -0
  35. package/dist/src/langfuse/client.js.map +1 -0
  36. package/dist/src/langfuse/comments.d.ts.map +1 -0
  37. package/dist/src/langfuse/comments.js.map +1 -0
  38. package/dist/src/langfuse/datasets.d.ts.map +1 -0
  39. package/dist/src/langfuse/datasets.js.map +1 -0
  40. package/dist/src/langfuse/index.d.ts +1 -0
  41. package/dist/src/langfuse/index.d.ts.map +1 -0
  42. package/dist/src/langfuse/index.js.map +1 -0
  43. package/dist/src/langfuse/media.d.ts.map +1 -0
  44. package/dist/src/langfuse/media.js.map +1 -0
  45. package/dist/src/langfuse/observations.d.ts.map +1 -0
  46. package/dist/src/langfuse/observations.js.map +1 -0
  47. package/dist/src/langfuse/prompts.d.ts +5 -1
  48. package/dist/src/langfuse/prompts.d.ts.map +1 -0
  49. package/dist/src/langfuse/prompts.js +16 -3
  50. package/dist/src/langfuse/prompts.js.map +1 -0
  51. package/dist/src/langfuse/scores.d.ts.map +1 -0
  52. package/dist/src/langfuse/scores.js.map +1 -0
  53. package/dist/src/langfuse/traces.d.ts.map +1 -0
  54. package/dist/src/langfuse/traces.js.map +1 -0
  55. package/dist/src/llm.d.ts.map +1 -0
  56. package/dist/src/llm.js.map +1 -0
  57. package/dist/src/narrative/graph-manager.d.ts.map +1 -0
  58. package/dist/src/narrative/graph-manager.js.map +1 -0
  59. package/dist/src/narrative/index.d.ts.map +1 -0
  60. package/dist/src/narrative/index.js.map +1 -0
  61. package/dist/src/narrative/markdown-export.d.ts.map +1 -0
  62. package/dist/src/narrative/markdown-export.js.map +1 -0
  63. package/dist/src/narrative/tool-definitions.d.ts.map +1 -0
  64. package/dist/src/narrative/tool-definitions.js.map +1 -0
  65. package/dist/src/narrative/tool-handlers.d.ts.map +1 -0
  66. package/dist/src/narrative/tool-handlers.js.map +1 -0
  67. package/dist/src/narrative/types.d.ts.map +1 -0
  68. package/dist/src/narrative/types.js.map +1 -0
  69. package/dist/src/narrative/validation.d.ts.map +1 -0
  70. package/dist/src/narrative/validation.js.map +1 -0
  71. package/dist/src/pde/index.d.ts.map +1 -0
  72. package/dist/src/pde/index.js.map +1 -0
  73. package/dist/src/pde/mcp-handlers.d.ts.map +1 -0
  74. package/dist/src/pde/mcp-handlers.js.map +1 -0
  75. package/dist/src/pde/mcp-tools.d.ts.map +1 -0
  76. package/dist/src/pde/mcp-tools.js.map +1 -0
  77. package/dist/src/pde/session-manager.d.ts.map +1 -0
  78. package/dist/src/pde/session-manager.js.map +1 -0
  79. package/dist/src/pde/stc-mapper.d.ts.map +1 -0
  80. package/dist/src/pde/stc-mapper.js.map +1 -0
  81. package/dist/src/pipeline/index.d.ts.map +1 -0
  82. package/dist/src/pipeline/index.js.map +1 -0
  83. package/dist/src/pipeline/template-engine.d.ts.map +1 -0
  84. package/dist/src/pipeline/template-engine.js.map +1 -0
  85. package/dist/src/planning/index.d.ts.map +1 -0
  86. package/dist/src/planning/index.js.map +1 -0
  87. package/dist/src/planning/mcp-handlers.d.ts.map +1 -0
  88. package/dist/src/planning/mcp-handlers.js.map +1 -0
  89. package/dist/src/planning/mcp-tools.d.ts.map +1 -0
  90. package/dist/src/planning/mcp-tools.js.map +1 -0
  91. package/dist/src/planning/plan-parser.d.ts.map +1 -0
  92. package/dist/src/planning/plan-parser.js.map +1 -0
  93. package/dist/src/redis.d.ts.map +1 -0
  94. package/dist/src/redis.js.map +1 -0
  95. package/dist/src/types.d.ts.map +1 -0
  96. package/dist/src/types.js.map +1 -0
  97. package/dist/src/version.d.ts.map +1 -0
  98. package/dist/src/version.js.map +1 -0
  99. package/llms-full.txt +361 -0
  100. package/llms.txt +43 -0
  101. package/package.json +79 -12
  102. package/.claude/settings.local.json +0 -17
  103. package/.claude-plugin/marketplace.json +0 -26
  104. package/articles/academic/NOTES.md +0 -1
  105. package/articles/academic/README.md +0 -1
  106. package/articles/academic/creative-orientation-vs-problem-solving.md +0 -177
  107. package/articles/academic/jsonl-knowledge-graphs-agent-memory.md +0 -142
  108. package/articles/academic/langfuse-observability-llm-pipelines.md +0 -144
  109. package/articles/academic/medicine-wheel-software-architecture.md +0 -163
  110. package/articles/academic/mmot-autonomous-agents.md +0 -156
  111. package/articles/academic/model-context-protocol-interagent.md +0 -161
  112. package/articles/academic/pde-prompt-decomposition.md +0 -186
  113. package/articles/academic/structural-tension-in-ai-agents.md +0 -134
  114. package/articles/reviews/mcp-protocol-design-review.md +0 -170
  115. package/articles/reviews/observability-ai-systems-review.md +0 -176
  116. package/articles/reviews/prompt-engineering-decomposition-review.md +0 -184
  117. package/articles/surveys/agent-orchestration-survey.md +0 -186
  118. package/articles/surveys/knowledge-graph-storage-survey.md +0 -204
  119. package/articles/surveys/structural-tension-methodology-survey.md +0 -154
  120. package/articles/technical/aws-sdk-v3-polly.md +0 -270
  121. package/articles/technical/commander-cli-framework.md +0 -262
  122. package/articles/technical/dotenv-config-patterns.md +0 -360
  123. package/articles/technical/ioredis-vs-redis.md +0 -142
  124. package/articles/technical/langfuse-js-sdk-vs-rest.md +0 -191
  125. package/articles/technical/mcp-sdk-typescript.md +0 -291
  126. package/articles/technical/octokit-github-api.md +0 -293
  127. package/articles/technical/openai-sdk-modern.md +0 -231
  128. package/articles/technical/yaml-parsing-node.md +0 -266
  129. package/articles/technical/zod-runtime-validation.md +0 -212
  130. package/coaiajs-langfuse-claude-plugin/.claude-plugin/marketplace.json +0 -16
  131. package/coaiajs-langfuse-claude-plugin/.claude-plugin/plugin.json +0 -10
  132. package/coaiajs-langfuse-claude-plugin/.mcp.json +0 -8
  133. package/coaiajs-langfuse-claude-plugin/README.md +0 -60
  134. package/mcp/config.ts +0 -225
  135. package/mcp/prompts.ts +0 -131
  136. package/mcp/resources.ts +0 -84
  137. package/mcp/server.ts +0 -519
  138. package/mcp/tools/coaiapy-tools.ts +0 -366
  139. package/mcp/tools/index.ts +0 -4
  140. package/src/audio.ts +0 -76
  141. package/src/cli-helpers.ts +0 -86
  142. package/src/cli.ts +0 -1261
  143. package/src/config.ts +0 -207
  144. package/src/environment.ts +0 -171
  145. package/src/github.ts +0 -143
  146. package/src/index.ts +0 -82
  147. package/src/langfuse/client.ts +0 -105
  148. package/src/langfuse/comments.ts +0 -52
  149. package/src/langfuse/datasets.ts +0 -178
  150. package/src/langfuse/index.ts +0 -37
  151. package/src/langfuse/media.ts +0 -193
  152. package/src/langfuse/observations.ts +0 -155
  153. package/src/langfuse/prompts.ts +0 -157
  154. package/src/langfuse/scores.ts +0 -456
  155. package/src/langfuse/traces.ts +0 -353
  156. package/src/llm.ts +0 -106
  157. package/src/narrative/graph-manager.ts +0 -1358
  158. package/src/narrative/index.ts +0 -188
  159. package/src/narrative/markdown-export.ts +0 -535
  160. package/src/narrative/tool-definitions.ts +0 -635
  161. package/src/narrative/tool-handlers.ts +0 -528
  162. package/src/narrative/types.ts +0 -9
  163. package/src/narrative/validation.ts +0 -179
  164. package/src/pde/index.ts +0 -34
  165. package/src/pde/mcp-handlers.ts +0 -359
  166. package/src/pde/mcp-tools.ts +0 -201
  167. package/src/pde/session-manager.ts +0 -248
  168. package/src/pde/stc-mapper.ts +0 -298
  169. package/src/pipeline/index.ts +0 -7
  170. package/src/pipeline/template-engine.ts +0 -398
  171. package/src/planning/index.ts +0 -32
  172. package/src/planning/mcp-handlers.ts +0 -369
  173. package/src/planning/mcp-tools.ts +0 -155
  174. package/src/planning/plan-parser.ts +0 -587
  175. package/src/redis.ts +0 -111
  176. package/src/types.ts +0 -281
  177. package/src/version.ts +0 -39
  178. package/test/config.test.mjs +0 -93
  179. package/tsconfig.json +0 -26
@@ -1,353 +0,0 @@
1
- // coaiajs/src/langfuse/traces.ts — Trace operations
2
- // Port of cofuse.py trace functions
3
-
4
- import { v4 as uuidv4 } from 'uuid';
5
- import { getClient, nowISO } from './client.js';
6
- import type { IngestionEvent } from './client.js';
7
-
8
- export interface TraceFilters {
9
- sessionId?: string;
10
- userId?: string;
11
- name?: string;
12
- tags?: string[];
13
- fromTimestamp?: string;
14
- toTimestamp?: string;
15
- orderBy?: string;
16
- version?: string;
17
- release?: string;
18
- environment?: string[];
19
- page?: number;
20
- limit?: number;
21
- }
22
-
23
- export async function addTrace(params: {
24
- traceId?: string;
25
- userId?: string;
26
- sessionId?: string;
27
- name?: string;
28
- inputData?: unknown;
29
- outputData?: unknown;
30
- metadata?: unknown;
31
- }): Promise<string> {
32
- const client = getClient();
33
- const now = nowISO();
34
- const traceId = params.traceId ?? uuidv4();
35
-
36
- const body: Record<string, unknown> = {
37
- id: traceId,
38
- timestamp: now,
39
- };
40
-
41
- if (params.sessionId) body.sessionId = params.sessionId;
42
- if (params.name) body.name = params.name;
43
- if (params.inputData) body.input = params.inputData;
44
- if (params.outputData) body.output = params.outputData;
45
- if (params.userId) body.userId = params.userId;
46
- if (params.metadata) body.metadata = params.metadata;
47
-
48
- const event: IngestionEvent = {
49
- id: `${traceId}-event`,
50
- timestamp: now,
51
- type: 'trace-create',
52
- body,
53
- };
54
-
55
- await client.ingest([event]);
56
-
57
- return JSON.stringify({
58
- success: true,
59
- traceId,
60
- message: `Trace ${traceId} created`,
61
- }, null, 2);
62
- }
63
-
64
- export async function patchTraceOutput(
65
- traceIdOrParams: string | { traceId?: string; output?: string; outputData?: unknown },
66
- outputData?: unknown,
67
- ): Promise<string> {
68
- const traceId = typeof traceIdOrParams === 'string' ? traceIdOrParams : traceIdOrParams.traceId;
69
- if (!traceId) throw new Error('traceId is required');
70
- const output = typeof traceIdOrParams === 'string'
71
- ? outputData
72
- : parseJsonOption(traceIdOrParams.outputData ?? traceIdOrParams.output);
73
-
74
- const client = getClient();
75
- const now = nowISO();
76
-
77
- const body: Record<string, unknown> = {
78
- id: traceId,
79
- timestamp: now,
80
- output,
81
- };
82
-
83
- const eventId = `${traceId}-patch-${uuidv4().slice(0, 8)}`;
84
- const event: IngestionEvent = {
85
- id: eventId,
86
- timestamp: now,
87
- type: 'trace-create',
88
- body,
89
- };
90
-
91
- await client.ingest([event]);
92
-
93
- return JSON.stringify({
94
- success: true,
95
- traceId,
96
- message: `Trace output patched for ${traceId}`,
97
- }, null, 2);
98
- }
99
-
100
- function parseJsonOption(value: unknown): unknown {
101
- if (typeof value !== 'string') return value;
102
- try {
103
- return JSON.parse(value) as unknown;
104
- } catch {
105
- return value;
106
- }
107
- }
108
-
109
- export async function createTrace(params: {
110
- traceId?: string;
111
- id?: string;
112
- userId?: string;
113
- sessionId?: string;
114
- name?: string;
115
- input?: string;
116
- inputData?: unknown;
117
- output?: string;
118
- outputData?: unknown;
119
- metadata?: string | unknown;
120
- }): Promise<string> {
121
- return addTrace({
122
- traceId: params.traceId ?? params.id,
123
- userId: params.userId,
124
- sessionId: params.sessionId,
125
- name: params.name,
126
- inputData: parseJsonOption(params.inputData ?? params.input),
127
- outputData: parseJsonOption(params.outputData ?? params.output),
128
- metadata: parseJsonOption(params.metadata),
129
- });
130
- }
131
-
132
- export async function listTraces(filters: TraceFilters): Promise<string> {
133
- const client = getClient();
134
- const params = new URLSearchParams();
135
-
136
- if (filters.sessionId) params.set('sessionId', filters.sessionId);
137
- if (filters.userId) params.set('userId', filters.userId);
138
- if (filters.name) params.set('name', filters.name);
139
- if (filters.fromTimestamp) params.set('fromTimestamp', filters.fromTimestamp);
140
- if (filters.toTimestamp) params.set('toTimestamp', filters.toTimestamp);
141
- if (filters.orderBy) params.set('orderBy', filters.orderBy);
142
- if (filters.version) params.set('version', filters.version);
143
- if (filters.release) params.set('release', filters.release);
144
- if (filters.tags) {
145
- for (const tag of filters.tags) params.append('tags', tag);
146
- }
147
- if (filters.environment) {
148
- for (const env of filters.environment) params.append('environment', env);
149
- }
150
-
151
- const page = filters.page ?? 1;
152
- const limit = filters.limit ?? 50;
153
- params.set('page', String(page));
154
- params.set('limit', String(limit));
155
-
156
- const qs = params.toString();
157
- const path = `/api/public/traces${qs ? `?${qs}` : ''}`;
158
- const result = await client.request<unknown>('GET', path);
159
- return JSON.stringify(result, null, 2);
160
- }
161
-
162
- export async function getTrace(traceId: string): Promise<string> {
163
- const client = getClient();
164
-
165
- const trace = await client.request<Record<string, unknown>>('GET', `/api/public/traces/${traceId}`);
166
-
167
- // Fetch observations for this trace
168
- try {
169
- const obsResult = await client.request<Record<string, unknown>>(
170
- 'GET',
171
- `/api/public/observations?traceId=${traceId}`,
172
- );
173
- if (obsResult && typeof obsResult === 'object' && 'data' in obsResult) {
174
- trace.observations = obsResult.data;
175
- } else {
176
- trace.observations = obsResult;
177
- }
178
- } catch {
179
- trace.observations = [];
180
- }
181
-
182
- return JSON.stringify(trace, null, 2);
183
- }
184
-
185
- export async function traceView(traceId: string): Promise<string> {
186
- const raw = await getTrace(traceId);
187
- return formatTraceTree(raw);
188
- }
189
-
190
- export async function sessionView(sessionId: string): Promise<string> {
191
- const raw = await listTraces({ sessionId, limit: 20, orderBy: 'timestamp.desc' });
192
- return formatTracesMarkdown(raw);
193
- }
194
-
195
- // ─── Formatters ─────────────────────────────────────────────────────
196
-
197
- export function formatTracesTable(json: unknown): string {
198
- try {
199
- const data = typeof json === 'string' ? JSON.parse(json) : json;
200
- const traces: Record<string, unknown>[] = Array.isArray(data)
201
- ? data
202
- : (data as Record<string, unknown>).data as Record<string, unknown>[] ?? [];
203
-
204
- if (!traces.length) return 'No traces found.';
205
-
206
- const headers = ['ID', 'Name', 'Session', 'User', 'Time'];
207
- const rows = traces.map((t) => [
208
- trunc(String(t.id ?? 'N/A'), 20),
209
- trunc(String(t.name ?? 'Unnamed'), 20),
210
- trunc(String(t.sessionId ?? 'N/A'), 15),
211
- trunc(String(t.userId ?? 'N/A'), 12),
212
- trunc(String(t.timestamp ?? 'N/A').slice(0, 19), 19),
213
- ]);
214
-
215
- return formatTable(headers, rows) + `\nTotal traces: ${traces.length}`;
216
- } catch (e) {
217
- return `Error formatting traces: ${e}`;
218
- }
219
- }
220
-
221
- const TYPE_GLYPHS: Record<string, string> = {
222
- SPAN: '🔗',
223
- GENERATION: '🤖',
224
- EVENT: '⚡',
225
- SCORE: '📊',
226
- TRACE: '🛤️',
227
- DEFAULT: '📦',
228
- };
229
-
230
- export function formatTraceTree(json: unknown): string {
231
- try {
232
- const trace = (typeof json === 'string' ? JSON.parse(json) : json) as Record<string, unknown>;
233
- if ('error' in trace) return `Error: ${trace.error}`;
234
-
235
- const BRANCH = '├── ';
236
- const LAST = '└── ';
237
- const VERT = '│ ';
238
- const SPACE = ' ';
239
-
240
- const lines: string[] = [];
241
- const name = String(trace.name ?? 'Unnamed');
242
- const id = String(trace.id ?? 'N/A');
243
- const userId = String(trace.userId ?? 'N/A');
244
- const sessionId = String(trace.sessionId ?? 'N/A');
245
- const ts = String(trace.timestamp ?? 'N/A').slice(0, 19);
246
-
247
- lines.push(`🔗 Trace: ${name}`);
248
- lines.push(`${BRANCH}🆔 ID: ${id}`);
249
- lines.push(`${BRANCH}👤 User: ${userId}`);
250
- lines.push(`${BRANCH}🔗 Session: ${sessionId}`);
251
- lines.push(`${BRANCH}⏰ Time: ${ts}`);
252
-
253
- const metadata = trace.metadata as Record<string, unknown> | undefined;
254
- if (metadata && typeof metadata === 'object' && Object.keys(metadata).length) {
255
- lines.push(`${BRANCH}📋 Metadata:`);
256
- const entries = Object.entries(metadata);
257
- entries.forEach(([k, v], i) => {
258
- const pre = i === entries.length - 1 ? LAST : BRANCH;
259
- lines.push(`${VERT}${pre}${k}: ${v}`);
260
- });
261
- }
262
-
263
- const observations = (trace.observations ?? []) as Record<string, unknown>[];
264
- if (!observations.length) {
265
- lines.push(`${LAST}📝 No observations`);
266
- return lines.join('\n');
267
- }
268
-
269
- lines.push(`${LAST}📝 Observations (${observations.length}):`);
270
-
271
- const roots = observations.filter((o) => !o.parentObservationId);
272
-
273
- function addTree(list: Record<string, unknown>[], prefix: string) {
274
- list.forEach((obs, i) => {
275
- const isLast = i === list.length - 1;
276
- const obsName = String(obs.name ?? `Obs ${String(obs.id ?? '').slice(0, 8)}`);
277
- const obsType = String(obs.type ?? 'UNKNOWN').toUpperCase();
278
- const obsTime = String(obs.startTime ?? 'N/A').slice(0, 19);
279
- const glyph = TYPE_GLYPHS[obsType] ?? TYPE_GLYPHS.DEFAULT;
280
-
281
- const sym = isLast ? LAST : BRANCH;
282
- const np = prefix + (isLast ? SPACE : VERT);
283
-
284
- lines.push(`${prefix}${sym}${glyph} [${obsType}] ${obsName} (${obs.id})`);
285
- lines.push(`${np}${BRANCH}⏰ ${obsTime}`);
286
-
287
- if (obs.input) {
288
- const txt = trunc(String(obs.input).replace(/\n/g, ' '), 90);
289
- lines.push(`${np}${BRANCH}📥 Input: ${txt}`);
290
- }
291
- if (obs.output) {
292
- const txt = trunc(String(obs.output).replace(/\n/g, ' '), 90);
293
- lines.push(`${np}${LAST}📤 Output: ${txt}`);
294
- }
295
-
296
- const children = observations.filter((c) => c.parentObservationId === obs.id);
297
- if (children.length) {
298
- lines.push(`${np}${LAST}🌿 Children (${children.length}):`);
299
- addTree(children, np + SPACE);
300
- }
301
- });
302
- }
303
-
304
- addTree(roots, SPACE);
305
- return lines.join('\n');
306
- } catch (e) {
307
- return `Error formatting trace tree: ${e}`;
308
- }
309
- }
310
-
311
- export function formatTracesMarkdown(json: unknown): string {
312
- try {
313
- const data = typeof json === 'string' ? JSON.parse(json) : json;
314
- const traces: Record<string, unknown>[] = Array.isArray(data)
315
- ? data
316
- : (data as Record<string, unknown>).data as Record<string, unknown>[] ?? [];
317
-
318
- if (!traces.length) return '_No traces found._';
319
-
320
- const header = '| ID | Name | Session | User | Timestamp |';
321
- const sep = '|----|------|---------|------|-----------|';
322
- const rows = traces.map((t) => {
323
- const id = trunc(String(t.id ?? ''), 20);
324
- const name = trunc(String(t.name ?? 'Unnamed'), 30);
325
- const session = trunc(String(t.sessionId ?? ''), 24);
326
- const user = trunc(String(t.userId ?? ''), 16);
327
- const ts = String(t.timestamp ?? '').slice(0, 19);
328
- return `| ${id} | ${name} | ${session} | ${user} | ${ts} |`;
329
- });
330
-
331
- return [header, sep, ...rows, '', `_Total: ${traces.length} trace(s)_`].join('\n');
332
- } catch (e) {
333
- return `Error formatting traces: ${e}`;
334
- }
335
- }
336
-
337
- // ─── Helpers ────────────────────────────────────────────────────────
338
-
339
- function trunc(s: string, len: number): string {
340
- return s.length > len ? s.slice(0, len - 3) + '...' : s;
341
- }
342
-
343
- function formatTable(headers: string[], rows: string[][]): string {
344
- const widths = headers.map((h, i) =>
345
- Math.max(h.length, ...rows.map((r) => (r[i] ?? '').length)),
346
- );
347
- const sep = '+' + widths.map((w) => '-'.repeat(w + 2)).join('+') + '+';
348
- const hdr = '| ' + headers.map((h, i) => h.padEnd(widths[i])).join(' | ') + ' |';
349
- const body = rows.map(
350
- (r) => '| ' + r.map((c, i) => (c ?? '').padEnd(widths[i])).join(' | ') + ' |',
351
- );
352
- return [sep, hdr, sep, ...body, sep].join('\n');
353
- }
package/src/llm.ts DELETED
@@ -1,106 +0,0 @@
1
- // coaiajs/src/llm.ts — LLM module
2
- // Parity with coaiapy's OpenAI functions
3
-
4
- import OpenAI from 'openai';
5
- import { readFileSync } from 'node:fs';
6
- import { getConfig } from './config.js';
7
-
8
- let _client: OpenAI | null = null;
9
-
10
- function getClient(): OpenAI {
11
- if (!_client) {
12
- const cfg = getConfig();
13
- _client = new OpenAI({
14
- apiKey: cfg.openai?.apiKey ?? process.env['OPENAI_API_KEY'],
15
- });
16
- }
17
- return _client;
18
- }
19
-
20
- /** Reset client (testing). */
21
- export function resetClient(): void {
22
- _client = null;
23
- }
24
-
25
- /**
26
- * Send a chat completion request.
27
- * Minimal wrapper matching coaiapy's `llm()` function.
28
- */
29
- export async function llm(
30
- user: string,
31
- system?: string,
32
- temperature?: number,
33
- ): Promise<string> {
34
- const client = getClient();
35
- const cfg = getConfig();
36
- const model = cfg.openai?.model ?? 'gpt-4o';
37
-
38
- const messages: OpenAI.ChatCompletionMessageParam[] = [];
39
- if (system) {
40
- messages.push({ role: 'system', content: system });
41
- }
42
- messages.push({ role: 'user', content: user });
43
-
44
- const response = await client.chat.completions.create({
45
- model,
46
- messages,
47
- temperature: temperature ?? 0.7,
48
- });
49
-
50
- return response.choices[0]?.message?.content ?? '';
51
- }
52
-
53
- /**
54
- * Transcribe audio using Whisper API.
55
- * Parity with coaiapy's transcription functions.
56
- */
57
- export async function transcribeAudio(filePath: string): Promise<string> {
58
- const client = getClient();
59
-
60
- const file = new File(
61
- [readFileSync(filePath)],
62
- filePath.split('/').pop() ?? 'audio.wav',
63
- { type: 'audio/wav' },
64
- );
65
-
66
- const response = await client.audio.transcriptions.create({
67
- model: 'whisper-1',
68
- file,
69
- });
70
-
71
- return response.text;
72
- }
73
-
74
- /**
75
- * Generate an image using DALL-E.
76
- * Returns the URL of the generated image.
77
- */
78
- export async function generateImage(
79
- prompt: string,
80
- size?: string,
81
- ): Promise<string> {
82
- const client = getClient();
83
-
84
- const validSize = (size ?? '1024x1024') as '256x256' | '512x512' | '1024x1024' | '1792x1024' | '1024x1792';
85
-
86
- const response = await client.images.generate({
87
- model: 'dall-e-3',
88
- prompt,
89
- n: 1,
90
- size: validSize,
91
- });
92
-
93
- return response.data?.[0]?.url ?? '';
94
- }
95
-
96
- /**
97
- * Abstract process: config-driven LLM call with a named process.
98
- * Looks up system prompt by processName in config or uses a default.
99
- */
100
- export async function abstractProcess(
101
- processName: string,
102
- input: string,
103
- ): Promise<string> {
104
- const systemPrompt = `You are executing the "${processName}" process. Follow the process instructions precisely and produce the expected output format.`;
105
- return llm(input, systemPrompt);
106
- }