conversationalist 0.0.3 → 0.0.4
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/README.md +103 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3763 -46
- package/dist/index.js.map +48 -4
- package/dist/utilities.d.ts +75 -1
- package/dist/utilities.d.ts.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -218,6 +218,108 @@ const boundTruncate = history.bind(truncateToTokenLimit);
|
|
|
218
218
|
boundTruncate(4000); // Uses tiktokenEstimator automatically
|
|
219
219
|
```
|
|
220
220
|
|
|
221
|
+
### Markdown Conversion
|
|
222
|
+
|
|
223
|
+
Convert conversations to human-readable Markdown format, or parse Markdown back into a conversation object.
|
|
224
|
+
|
|
225
|
+
#### Basic Usage (Clean Markdown)
|
|
226
|
+
|
|
227
|
+
By default, `toMarkdown` produces clean, readable Markdown without metadata:
|
|
228
|
+
|
|
229
|
+
```ts
|
|
230
|
+
import {
|
|
231
|
+
toMarkdown,
|
|
232
|
+
fromMarkdown,
|
|
233
|
+
createConversation,
|
|
234
|
+
appendMessages,
|
|
235
|
+
} from 'conversationalist';
|
|
236
|
+
|
|
237
|
+
let conversation = createConversation({ id: 'conv-1' });
|
|
238
|
+
conversation = appendMessages(
|
|
239
|
+
conversation,
|
|
240
|
+
{ role: 'user', content: 'What is 2 + 2?' },
|
|
241
|
+
{ role: 'assistant', content: 'The answer is 4.' },
|
|
242
|
+
);
|
|
243
|
+
|
|
244
|
+
const markdown = toMarkdown(conversation);
|
|
245
|
+
// Output:
|
|
246
|
+
// ### User
|
|
247
|
+
//
|
|
248
|
+
// What is 2 + 2?
|
|
249
|
+
//
|
|
250
|
+
// ### Assistant
|
|
251
|
+
//
|
|
252
|
+
// The answer is 4.
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
When parsing simple Markdown without metadata, `fromMarkdown` generates new IDs and uses sensible defaults:
|
|
256
|
+
|
|
257
|
+
```ts
|
|
258
|
+
const parsed = fromMarkdown(markdown);
|
|
259
|
+
// parsed.id is a new generated ID
|
|
260
|
+
// parsed.status is 'active'
|
|
261
|
+
// Message IDs are generated, positions are assigned sequentially
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
#### Lossless Round-Trip (with Metadata)
|
|
265
|
+
|
|
266
|
+
For archiving or backup scenarios where you need to preserve all data, use `{ includeMetadata: true }`:
|
|
267
|
+
|
|
268
|
+
```ts
|
|
269
|
+
const markdown = toMarkdown(conversation, { includeMetadata: true });
|
|
270
|
+
// Output includes YAML frontmatter with all metadata keyed by message ID:
|
|
271
|
+
// ---
|
|
272
|
+
// id: conv-1
|
|
273
|
+
// status: active
|
|
274
|
+
// metadata: {}
|
|
275
|
+
// tags: []
|
|
276
|
+
// createdAt: '2024-01-15T10:00:00.000Z'
|
|
277
|
+
// updatedAt: '2024-01-15T10:01:00.000Z'
|
|
278
|
+
// messages:
|
|
279
|
+
// msg-1:
|
|
280
|
+
// position: 0
|
|
281
|
+
// createdAt: '2024-01-15T10:00:00.000Z'
|
|
282
|
+
// metadata: {}
|
|
283
|
+
// hidden: false
|
|
284
|
+
// msg-2:
|
|
285
|
+
// position: 1
|
|
286
|
+
// createdAt: '2024-01-15T10:01:00.000Z'
|
|
287
|
+
// metadata: {}
|
|
288
|
+
// hidden: false
|
|
289
|
+
// ---
|
|
290
|
+
// ### User (msg-1)
|
|
291
|
+
//
|
|
292
|
+
// What is 2 + 2?
|
|
293
|
+
//
|
|
294
|
+
// ### Assistant (msg-2)
|
|
295
|
+
//
|
|
296
|
+
// The answer is 4.
|
|
297
|
+
|
|
298
|
+
// Parse back with all metadata preserved
|
|
299
|
+
const restored = fromMarkdown(markdown);
|
|
300
|
+
// restored.id === 'conv-1'
|
|
301
|
+
// restored.messages[0].id === 'msg-1'
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
#### Multi-Modal Content
|
|
305
|
+
|
|
306
|
+
Both functions handle multi-modal content. Images render as Markdown images, and with metadata enabled, additional properties like `mimeType` are preserved in the YAML frontmatter:
|
|
307
|
+
|
|
308
|
+
```ts
|
|
309
|
+
conversation = appendMessages(conversation, {
|
|
310
|
+
role: 'user',
|
|
311
|
+
content: [
|
|
312
|
+
{ type: 'text', text: 'Describe this:' },
|
|
313
|
+
{ type: 'image', url: 'https://example.com/photo.png', mimeType: 'image/png' },
|
|
314
|
+
],
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
const md = toMarkdown(conversation);
|
|
318
|
+
// Describe this:
|
|
319
|
+
//
|
|
320
|
+
// 
|
|
321
|
+
```
|
|
322
|
+
|
|
221
323
|
## Plugins
|
|
222
324
|
|
|
223
325
|
**Conversationalist** supports a plugin system that allows you to transform messages as they are appended to a conversation. Plugins are functions that take a `MessageInput` and return a modified `MessageInput`.
|
|
@@ -688,6 +790,7 @@ Svelte 5's runes pair perfectly with **Conversationalist**. You can use the `Con
|
|
|
688
790
|
| **Modification** | `redactMessageAtPosition`, `replaceSystemMessage`, `collapseSystemMessages` |
|
|
689
791
|
| **Context** | `truncateToTokenLimit`, `getRecentMessages`, `estimateConversationTokens` |
|
|
690
792
|
| **Querying** | `getConversationMessages`, `getMessageByIdentifier`, `computeConversationStatistics` |
|
|
793
|
+
| **Conversion** | `toMarkdown`, `fromMarkdown`, `toChatMessages`, `pairToolCallsWithResults` |
|
|
691
794
|
| **History** | `ConversationHistory`, `bindToConversationHistory` |
|
|
692
795
|
|
|
693
796
|
## Deterministic Environments (Testing)
|
package/dist/index.d.ts
CHANGED
|
@@ -9,8 +9,8 @@ export { withEnvironment } from './environment';
|
|
|
9
9
|
export { createMessage } from './utilities';
|
|
10
10
|
export type { ConversationalistErrorCode } from './errors';
|
|
11
11
|
export { ConversationalistError, createDuplicateIdError, createInvalidInputError, createInvalidPositionError, createInvalidToolReferenceError, createLockedError, createNotFoundError, createSerializationError, createValidationError, } from './errors';
|
|
12
|
-
export type { ToolCallPair } from './utilities';
|
|
13
|
-
export { normalizeContent, pairToolCallsWithResults, toMultiModalArray, } from './utilities';
|
|
12
|
+
export type { ToMarkdownOptions, ToolCallPair } from './utilities';
|
|
13
|
+
export { fromMarkdown, MarkdownParseError, normalizeContent, pairToolCallsWithResults, toMarkdown, toMultiModalArray, } from './utilities';
|
|
14
14
|
export type { ConversationDraft } from './with-conversation';
|
|
15
15
|
export { pipeConversation, withConversation } from './with-conversation';
|
|
16
16
|
export { bindToConversationHistory, ConversationHistory } from './history';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACnE,YAAY,EACV,OAAO,IAAI,eAAe,EAC1B,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAG/B,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,OAAO,EACP,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,EACV,QAAQ,EACR,UAAU,GACX,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,GACjB,MAAM,WAAW,CAAC;AAGnB,YAAY,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,6BAA6B,EAC7B,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,0BAA0B,EAC1B,qBAAqB,EACrB,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,YAAY,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,0BAA0B,EAC1B,+BAA+B,EAC/B,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAGlB,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACnE,YAAY,EACV,OAAO,IAAI,eAAe,EAC1B,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAG/B,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,OAAO,EACP,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,EACV,QAAQ,EACR,UAAU,GACX,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,GACjB,MAAM,WAAW,CAAC;AAGnB,YAAY,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,6BAA6B,EAC7B,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,0BAA0B,EAC1B,qBAAqB,EACrB,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,YAAY,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,0BAA0B,EAC1B,+BAA+B,EAC/B,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAGlB,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,wBAAwB,EACxB,UAAU,EACV,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAGrB,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGzE,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC3E,YAAY,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAGxE,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,WAAW,CAAC"}
|