@effect/ai 0.26.0 → 0.27.0

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 (188) hide show
  1. package/Chat/package.json +6 -0
  2. package/EmbeddingModel/package.json +6 -0
  3. package/IdGenerator/package.json +6 -0
  4. package/LanguageModel/package.json +6 -0
  5. package/Model/package.json +6 -0
  6. package/Prompt/package.json +6 -0
  7. package/Response/package.json +6 -0
  8. package/Telemetry/package.json +6 -0
  9. package/Tool/package.json +6 -0
  10. package/Toolkit/package.json +6 -0
  11. package/dist/cjs/AiError.js +575 -11
  12. package/dist/cjs/AiError.js.map +1 -1
  13. package/dist/cjs/Chat.js +302 -0
  14. package/dist/cjs/Chat.js.map +1 -0
  15. package/dist/cjs/EmbeddingModel.js +184 -0
  16. package/dist/cjs/EmbeddingModel.js.map +1 -0
  17. package/dist/cjs/IdGenerator.js +255 -0
  18. package/dist/cjs/IdGenerator.js.map +1 -0
  19. package/dist/cjs/LanguageModel.js +584 -0
  20. package/dist/cjs/LanguageModel.js.map +1 -0
  21. package/dist/cjs/McpServer.js +12 -4
  22. package/dist/cjs/McpServer.js.map +1 -1
  23. package/dist/cjs/Model.js +118 -0
  24. package/dist/cjs/Model.js.map +1 -0
  25. package/dist/cjs/Prompt.js +649 -0
  26. package/dist/cjs/Prompt.js.map +1 -0
  27. package/dist/cjs/Response.js +635 -0
  28. package/dist/cjs/Response.js.map +1 -0
  29. package/dist/cjs/Telemetry.js +176 -0
  30. package/dist/cjs/Telemetry.js.map +1 -0
  31. package/dist/cjs/Tokenizer.js +87 -8
  32. package/dist/cjs/Tokenizer.js.map +1 -1
  33. package/dist/cjs/Tool.js +556 -0
  34. package/dist/cjs/Tool.js.map +1 -0
  35. package/dist/cjs/Toolkit.js +279 -0
  36. package/dist/cjs/Toolkit.js.map +1 -0
  37. package/dist/cjs/index.js +21 -19
  38. package/dist/dts/AiError.d.ts +577 -9
  39. package/dist/dts/AiError.d.ts.map +1 -1
  40. package/dist/dts/Chat.d.ts +356 -0
  41. package/dist/dts/Chat.d.ts.map +1 -0
  42. package/dist/dts/EmbeddingModel.d.ts +153 -0
  43. package/dist/dts/EmbeddingModel.d.ts.map +1 -0
  44. package/dist/dts/IdGenerator.d.ts +272 -0
  45. package/dist/dts/IdGenerator.d.ts.map +1 -0
  46. package/dist/dts/LanguageModel.d.ts +458 -0
  47. package/dist/dts/LanguageModel.d.ts.map +1 -0
  48. package/dist/dts/McpSchema.d.ts +25 -25
  49. package/dist/dts/McpServer.d.ts +6 -4
  50. package/dist/dts/McpServer.d.ts.map +1 -1
  51. package/dist/dts/Model.d.ts +124 -0
  52. package/dist/dts/Model.d.ts.map +1 -0
  53. package/dist/dts/Prompt.d.ts +1119 -0
  54. package/dist/dts/Prompt.d.ts.map +1 -0
  55. package/dist/dts/Response.d.ts +1519 -0
  56. package/dist/dts/Response.d.ts.map +1 -0
  57. package/dist/dts/Telemetry.d.ts +520 -0
  58. package/dist/dts/Telemetry.d.ts.map +1 -0
  59. package/dist/dts/Tokenizer.d.ts +131 -13
  60. package/dist/dts/Tokenizer.d.ts.map +1 -1
  61. package/dist/dts/Tool.d.ts +876 -0
  62. package/dist/dts/Tool.d.ts.map +1 -0
  63. package/dist/dts/Toolkit.d.ts +310 -0
  64. package/dist/dts/Toolkit.d.ts.map +1 -0
  65. package/dist/dts/index.d.ts +498 -13
  66. package/dist/dts/index.d.ts.map +1 -1
  67. package/dist/esm/AiError.js +570 -10
  68. package/dist/esm/AiError.js.map +1 -1
  69. package/dist/esm/Chat.js +291 -0
  70. package/dist/esm/Chat.js.map +1 -0
  71. package/dist/esm/EmbeddingModel.js +173 -0
  72. package/dist/esm/EmbeddingModel.js.map +1 -0
  73. package/dist/esm/IdGenerator.js +245 -0
  74. package/dist/esm/IdGenerator.js.map +1 -0
  75. package/dist/esm/LanguageModel.js +572 -0
  76. package/dist/esm/LanguageModel.js.map +1 -0
  77. package/dist/esm/McpServer.js +12 -4
  78. package/dist/esm/McpServer.js.map +1 -1
  79. package/dist/esm/Model.js +108 -0
  80. package/dist/esm/Model.js.map +1 -0
  81. package/dist/esm/Prompt.js +633 -0
  82. package/dist/esm/Prompt.js.map +1 -0
  83. package/dist/esm/Response.js +619 -0
  84. package/dist/esm/Response.js.map +1 -0
  85. package/dist/esm/Telemetry.js +166 -0
  86. package/dist/esm/Telemetry.js.map +1 -0
  87. package/dist/esm/Tokenizer.js +87 -8
  88. package/dist/esm/Tokenizer.js.map +1 -1
  89. package/dist/esm/Tool.js +534 -0
  90. package/dist/esm/Tool.js.map +1 -0
  91. package/dist/esm/Toolkit.js +269 -0
  92. package/dist/esm/Toolkit.js.map +1 -0
  93. package/dist/esm/index.js +498 -13
  94. package/dist/esm/index.js.map +1 -1
  95. package/package.json +76 -68
  96. package/src/AiError.ts +739 -9
  97. package/src/Chat.ts +546 -0
  98. package/src/EmbeddingModel.ts +311 -0
  99. package/src/IdGenerator.ts +320 -0
  100. package/src/LanguageModel.ts +1074 -0
  101. package/src/McpServer.ts +337 -194
  102. package/src/Model.ts +155 -0
  103. package/src/Prompt.ts +1616 -0
  104. package/src/Response.ts +2131 -0
  105. package/src/Telemetry.ts +655 -0
  106. package/src/Tokenizer.ts +145 -24
  107. package/src/Tool.ts +1267 -0
  108. package/src/Toolkit.ts +516 -0
  109. package/src/index.ts +499 -13
  110. package/AiChat/package.json +0 -6
  111. package/AiEmbeddingModel/package.json +0 -6
  112. package/AiInput/package.json +0 -6
  113. package/AiLanguageModel/package.json +0 -6
  114. package/AiModel/package.json +0 -6
  115. package/AiResponse/package.json +0 -6
  116. package/AiTelemetry/package.json +0 -6
  117. package/AiTool/package.json +0 -6
  118. package/AiToolkit/package.json +0 -6
  119. package/dist/cjs/AiChat.js +0 -122
  120. package/dist/cjs/AiChat.js.map +0 -1
  121. package/dist/cjs/AiEmbeddingModel.js +0 -109
  122. package/dist/cjs/AiEmbeddingModel.js.map +0 -1
  123. package/dist/cjs/AiInput.js +0 -458
  124. package/dist/cjs/AiInput.js.map +0 -1
  125. package/dist/cjs/AiLanguageModel.js +0 -351
  126. package/dist/cjs/AiLanguageModel.js.map +0 -1
  127. package/dist/cjs/AiModel.js +0 -37
  128. package/dist/cjs/AiModel.js.map +0 -1
  129. package/dist/cjs/AiResponse.js +0 -681
  130. package/dist/cjs/AiResponse.js.map +0 -1
  131. package/dist/cjs/AiTelemetry.js +0 -58
  132. package/dist/cjs/AiTelemetry.js.map +0 -1
  133. package/dist/cjs/AiTool.js +0 -150
  134. package/dist/cjs/AiTool.js.map +0 -1
  135. package/dist/cjs/AiToolkit.js +0 -157
  136. package/dist/cjs/AiToolkit.js.map +0 -1
  137. package/dist/cjs/internal/common.js +0 -21
  138. package/dist/cjs/internal/common.js.map +0 -1
  139. package/dist/dts/AiChat.d.ts +0 -101
  140. package/dist/dts/AiChat.d.ts.map +0 -1
  141. package/dist/dts/AiEmbeddingModel.d.ts +0 -65
  142. package/dist/dts/AiEmbeddingModel.d.ts.map +0 -1
  143. package/dist/dts/AiInput.d.ts +0 -590
  144. package/dist/dts/AiInput.d.ts.map +0 -1
  145. package/dist/dts/AiLanguageModel.d.ts +0 -302
  146. package/dist/dts/AiLanguageModel.d.ts.map +0 -1
  147. package/dist/dts/AiModel.d.ts +0 -25
  148. package/dist/dts/AiModel.d.ts.map +0 -1
  149. package/dist/dts/AiResponse.d.ts +0 -863
  150. package/dist/dts/AiResponse.d.ts.map +0 -1
  151. package/dist/dts/AiTelemetry.d.ts +0 -242
  152. package/dist/dts/AiTelemetry.d.ts.map +0 -1
  153. package/dist/dts/AiTool.d.ts +0 -334
  154. package/dist/dts/AiTool.d.ts.map +0 -1
  155. package/dist/dts/AiToolkit.d.ts +0 -96
  156. package/dist/dts/AiToolkit.d.ts.map +0 -1
  157. package/dist/dts/internal/common.d.ts +0 -2
  158. package/dist/dts/internal/common.d.ts.map +0 -1
  159. package/dist/esm/AiChat.js +0 -111
  160. package/dist/esm/AiChat.js.map +0 -1
  161. package/dist/esm/AiEmbeddingModel.js +0 -98
  162. package/dist/esm/AiEmbeddingModel.js.map +0 -1
  163. package/dist/esm/AiInput.js +0 -433
  164. package/dist/esm/AiInput.js.map +0 -1
  165. package/dist/esm/AiLanguageModel.js +0 -340
  166. package/dist/esm/AiLanguageModel.js.map +0 -1
  167. package/dist/esm/AiModel.js +0 -29
  168. package/dist/esm/AiModel.js.map +0 -1
  169. package/dist/esm/AiResponse.js +0 -657
  170. package/dist/esm/AiResponse.js.map +0 -1
  171. package/dist/esm/AiTelemetry.js +0 -48
  172. package/dist/esm/AiTelemetry.js.map +0 -1
  173. package/dist/esm/AiTool.js +0 -134
  174. package/dist/esm/AiTool.js.map +0 -1
  175. package/dist/esm/AiToolkit.js +0 -147
  176. package/dist/esm/AiToolkit.js.map +0 -1
  177. package/dist/esm/internal/common.js +0 -14
  178. package/dist/esm/internal/common.js.map +0 -1
  179. package/src/AiChat.ts +0 -251
  180. package/src/AiEmbeddingModel.ts +0 -169
  181. package/src/AiInput.ts +0 -602
  182. package/src/AiLanguageModel.ts +0 -685
  183. package/src/AiModel.ts +0 -53
  184. package/src/AiResponse.ts +0 -986
  185. package/src/AiTelemetry.ts +0 -333
  186. package/src/AiTool.ts +0 -579
  187. package/src/AiToolkit.ts +0 -265
  188. package/src/internal/common.ts +0 -12
@@ -0,0 +1,166 @@
1
+ /**
2
+ * The `Telemetry` module provides OpenTelemetry integration for operations
3
+ * performed against a large language model provider by defining telemetry
4
+ * attributes and utilities that follow the OpenTelemetry GenAI semantic
5
+ * conventions.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import { Telemetry } from "@effect/ai"
10
+ * import { Effect } from "effect"
11
+ *
12
+ * // Add telemetry attributes to a span
13
+ * const addTelemetry = Effect.gen(function* () {
14
+ * const span = yield* Effect.currentSpan
15
+ *
16
+ * Telemetry.addGenAIAnnotations(span, {
17
+ * system: "openai",
18
+ * operation: { name: "chat" },
19
+ * request: {
20
+ * model: "gpt-4",
21
+ * temperature: 0.7,
22
+ * maxTokens: 1000
23
+ * },
24
+ * usage: {
25
+ * inputTokens: 100,
26
+ * outputTokens: 50
27
+ * }
28
+ * })
29
+ * })
30
+ * ```
31
+ *
32
+ * @since 1.0.0
33
+ */
34
+ import * as Context from "effect/Context";
35
+ import { dual } from "effect/Function";
36
+ import * as Predicate from "effect/Predicate";
37
+ import * as String from "effect/String";
38
+ /**
39
+ * Creates a function to add attributes to a span with a given prefix and key transformation.
40
+ *
41
+ * This utility function is used internally to create specialized functions for adding
42
+ * different types of telemetry attributes to OpenTelemetry spans.
43
+ *
44
+ * @example
45
+ * ```ts
46
+ * import { Telemetry } from "@effect/ai"
47
+ * import { String, Tracer } from "effect"
48
+ *
49
+ * const addCustomAttributes = Telemetry.addSpanAttributes(
50
+ * "custom.ai",
51
+ * String.camelToSnake
52
+ * )
53
+ *
54
+ * // Usage with a span
55
+ * declare const span: Tracer.Span
56
+ * addCustomAttributes(span, {
57
+ * modelName: "gpt-4",
58
+ * maxTokens: 1000
59
+ * })
60
+ * // Results in attributes: "custom.ai.model_name" and "custom.ai.max_tokens"
61
+ * ```
62
+ *
63
+ * @since 1.0.0
64
+ * @category Utilities
65
+ */
66
+ export const addSpanAttributes = (
67
+ /**
68
+ * The prefix to add to all attribute keys.
69
+ */
70
+ keyPrefix,
71
+ /**
72
+ * Function to transform attribute keys (e.g., camelCase to snake_case).
73
+ */
74
+ transformKey) => (
75
+ /**
76
+ * The OpenTelemetry span to add attributes to.
77
+ */
78
+ span,
79
+ /**
80
+ * The attributes to add to the span.
81
+ */
82
+ attributes) => {
83
+ for (const [key, value] of Object.entries(attributes)) {
84
+ if (Predicate.isNotNullable(value)) {
85
+ span.attribute(`${keyPrefix}.${transformKey(key)}`, value);
86
+ }
87
+ }
88
+ };
89
+ const addSpanBaseAttributes = /*#__PURE__*/addSpanAttributes("gen_ai", String.camelToSnake);
90
+ const addSpanOperationAttributes = /*#__PURE__*/addSpanAttributes("gen_ai.operation", String.camelToSnake);
91
+ const addSpanRequestAttributes = /*#__PURE__*/addSpanAttributes("gen_ai.request", String.camelToSnake);
92
+ const addSpanResponseAttributes = /*#__PURE__*/addSpanAttributes("gen_ai.response", String.camelToSnake);
93
+ const addSpanTokenAttributes = /*#__PURE__*/addSpanAttributes("gen_ai.token", String.camelToSnake);
94
+ const addSpanUsageAttributes = /*#__PURE__*/addSpanAttributes("gen_ai.usage", String.camelToSnake);
95
+ /**
96
+ * Applies GenAI telemetry attributes to an OpenTelemetry span.
97
+ *
98
+ * This function adds standardized GenAI attributes to a span following OpenTelemetry
99
+ * semantic conventions. It supports both curried and direct application patterns.
100
+ *
101
+ * **Note**: This function mutates the provided span in-place.
102
+ *
103
+ * @example
104
+ * ```ts
105
+ * import { Telemetry } from "@effect/ai"
106
+ * import { Effect } from "effect"
107
+ *
108
+ * const directUsage = Effect.gen(function* () {
109
+ * const span = yield* Effect.currentSpan
110
+ *
111
+ * Telemetry.addGenAIAnnotations(span, {
112
+ * system: "openai",
113
+ * request: { model: "gpt-4", temperature: 0.7 },
114
+ * usage: { inputTokens: 100, outputTokens: 50 }
115
+ * })
116
+ * })
117
+ * ```
118
+ *
119
+ * @since 1.0.0
120
+ * @category Utilities
121
+ */
122
+ export const addGenAIAnnotations = /*#__PURE__*/dual(2, (span, options) => {
123
+ addSpanBaseAttributes(span, {
124
+ system: options.system
125
+ });
126
+ if (Predicate.isNotNullable(options.operation)) addSpanOperationAttributes(span, options.operation);
127
+ if (Predicate.isNotNullable(options.request)) addSpanRequestAttributes(span, options.request);
128
+ if (Predicate.isNotNullable(options.response)) addSpanResponseAttributes(span, options.response);
129
+ if (Predicate.isNotNullable(options.token)) addSpanTokenAttributes(span, options.token);
130
+ if (Predicate.isNotNullable(options.usage)) addSpanUsageAttributes(span, options.usage);
131
+ });
132
+ /**
133
+ * Context tag for providing a span transformer to large langauge model
134
+ * operations.
135
+ *
136
+ * The CurrentSpanTransformer allows you to inject custom span transformation
137
+ * logic into AI operations, enabling application-specific telemetry and
138
+ * observability patterns.
139
+ *
140
+ * @example
141
+ * ```ts
142
+ * import { Telemetry } from "@effect/ai"
143
+ * import { Context, Effect } from "effect"
144
+ *
145
+ * // Create a custom span transformer
146
+ * const loggingTransformer: Telemetry.SpanTransformer = (options) => {
147
+ * console.log(`AI request completed: ${options.model}`)
148
+ * options.response.forEach((part, index) => {
149
+ * console.log(`Part ${index}: ${part.type}`)
150
+ * })
151
+ * }
152
+ *
153
+ * // Provide the transformer to your AI operations
154
+ * const program = myAIOperation.pipe(
155
+ * Effect.provideService(
156
+ * Telemetry.CurrentSpanTransformer,
157
+ * Telemetry.CurrentSpanTransformer.of(loggingTransformer)
158
+ * )
159
+ * )
160
+ * ```
161
+ *
162
+ * @since 1.0.0
163
+ * @category Context
164
+ */
165
+ export class CurrentSpanTransformer extends /*#__PURE__*/Context.Tag("@effect/ai/Telemetry/CurrentSpanTransformer")() {}
166
+ //# sourceMappingURL=Telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Telemetry.js","names":["Context","dual","Predicate","String","addSpanAttributes","keyPrefix","transformKey","span","attributes","key","value","Object","entries","isNotNullable","attribute","addSpanBaseAttributes","camelToSnake","addSpanOperationAttributes","addSpanRequestAttributes","addSpanResponseAttributes","addSpanTokenAttributes","addSpanUsageAttributes","addGenAIAnnotations","options","system","operation","request","response","token","usage","CurrentSpanTransformer","Tag"],"sources":["../../src/Telemetry.ts"],"sourcesContent":[null],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCA,OAAO,KAAKA,OAAO,MAAM,gBAAgB;AACzC,SAASC,IAAI,QAAQ,iBAAiB;AACtC,OAAO,KAAKC,SAAS,MAAM,kBAAkB;AAC7C,OAAO,KAAKC,MAAM,MAAM,eAAe;AAiQvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,OAAO,MAAMC,iBAAiB,GAAGA;AAC/B;;;AAGAC,SAAiB;AACjB;;;AAGAC,YAAqC,KAEvC;AACE;;;AAGAC,IAAU;AACV;;;AAGAC,UAAsB,KACd;EACR,KAAK,MAAM,CAACC,GAAG,EAAEC,KAAK,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACJ,UAAU,CAAC,EAAE;IACrD,IAAIN,SAAS,CAACW,aAAa,CAACH,KAAK,CAAC,EAAE;MAClCH,IAAI,CAACO,SAAS,CAAC,GAAGT,SAAS,IAAIC,YAAY,CAACG,GAAG,CAAC,EAAE,EAAEC,KAAK,CAAC;IAC5D;EACF;AACF,CAAC;AAED,MAAMK,qBAAqB,gBAAGX,iBAAiB,CAAC,QAAQ,EAAED,MAAM,CAACa,YAAY,CAAiB;AAC9F,MAAMC,0BAA0B,gBAAGb,iBAAiB,CAAC,kBAAkB,EAAED,MAAM,CAACa,YAAY,CAAsB;AAClH,MAAME,wBAAwB,gBAAGd,iBAAiB,CAAC,gBAAgB,EAAED,MAAM,CAACa,YAAY,CAAoB;AAC5G,MAAMG,yBAAyB,gBAAGf,iBAAiB,CAAC,iBAAiB,EAAED,MAAM,CAACa,YAAY,CAAqB;AAC/G,MAAMI,sBAAsB,gBAAGhB,iBAAiB,CAAC,cAAc,EAAED,MAAM,CAACa,YAAY,CAAkB;AACtG,MAAMK,sBAAsB,gBAAGjB,iBAAiB,CAAC,cAAc,EAAED,MAAM,CAACa,YAAY,CAAkB;AA4DtG;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,OAAO,MAAMM,mBAAmB,gBA4E5BrB,IAAI,CAyDN,CAAC,EAAE,CAACM,IAAI,EAAEgB,OAAO,KAAI;EACrBR,qBAAqB,CAACR,IAAI,EAAE;IAAEiB,MAAM,EAAED,OAAO,CAACC;EAAM,CAAE,CAAC;EACvD,IAAItB,SAAS,CAACW,aAAa,CAACU,OAAO,CAACE,SAAS,CAAC,EAAER,0BAA0B,CAACV,IAAI,EAAEgB,OAAO,CAACE,SAAS,CAAC;EACnG,IAAIvB,SAAS,CAACW,aAAa,CAACU,OAAO,CAACG,OAAO,CAAC,EAAER,wBAAwB,CAACX,IAAI,EAAEgB,OAAO,CAACG,OAAO,CAAC;EAC7F,IAAIxB,SAAS,CAACW,aAAa,CAACU,OAAO,CAACI,QAAQ,CAAC,EAAER,yBAAyB,CAACZ,IAAI,EAAEgB,OAAO,CAACI,QAAQ,CAAC;EAChG,IAAIzB,SAAS,CAACW,aAAa,CAACU,OAAO,CAACK,KAAK,CAAC,EAAER,sBAAsB,CAACb,IAAI,EAAEgB,OAAO,CAACK,KAAK,CAAC;EACvF,IAAI1B,SAAS,CAACW,aAAa,CAACU,OAAO,CAACM,KAAK,CAAC,EAAER,sBAAsB,CAACd,IAAI,EAAEgB,OAAO,CAACM,KAAK,CAAC;AACzF,CAAC,CAAC;AAsCF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCA,OAAM,MAAOC,sBAAuB,sBAAQ9B,OAAO,CAAC+B,GAAG,CAAC,6CAA6C,CAAC,EAGnG","ignoreList":[]}
@@ -1,41 +1,120 @@
1
1
  /**
2
+ * The `Tokenizer` module provides tokenization and text truncation capabilities
3
+ * for large language model text processing workflows.
4
+ *
5
+ * This module offers services for converting text into tokens and truncating
6
+ * prompts based on token limits, essential for managing context length
7
+ * constraints in large language models.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * import { Tokenizer, Prompt } from "@effect/ai"
12
+ * import { Effect } from "effect"
13
+ *
14
+ * const tokenizeText = Effect.gen(function* () {
15
+ * const tokenizer = yield* Tokenizer.Tokenizer
16
+ * const tokens = yield* tokenizer.tokenize("Hello, world!")
17
+ * console.log(`Token count: ${tokens.length}`)
18
+ * return tokens
19
+ * })
20
+ * ```
21
+ *
22
+ * @example
23
+ * ```ts
24
+ * import { Tokenizer, Prompt } from "@effect/ai"
25
+ * import { Effect } from "effect"
26
+ *
27
+ * // Truncate a prompt to fit within token limits
28
+ * const truncatePrompt = Effect.gen(function* () {
29
+ * const tokenizer = yield* Tokenizer.Tokenizer
30
+ * const longPrompt = "This is a very long prompt..."
31
+ * const truncated = yield* tokenizer.truncate(longPrompt, 100)
32
+ * return truncated
33
+ * })
34
+ * ```
35
+ *
2
36
  * @since 1.0.0
3
37
  */
4
38
  import * as Context from "effect/Context";
5
39
  import * as Effect from "effect/Effect";
6
40
  import * as Predicate from "effect/Predicate";
7
- import * as AiInput from "./AiInput.js";
41
+ import * as Prompt from "./Prompt.js";
8
42
  /**
43
+ * The `Tokenizer` service tag for dependency injection.
44
+ *
45
+ * This tag provides access to tokenization functionality throughout your
46
+ * application, enabling token counting and prompt truncation capabilities.
47
+ *
48
+ * @example
49
+ * ```ts
50
+ * import { Tokenizer } from "@effect/ai"
51
+ * import { Effect } from "effect"
52
+ *
53
+ * const useTokenizer = Effect.gen(function* () {
54
+ * const tokenizer = yield* Tokenizer.Tokenizer
55
+ * const tokens = yield* tokenizer.tokenize("Hello, world!")
56
+ * return tokens.length
57
+ * })
58
+ * ```
59
+ *
9
60
  * @since 1.0.0
10
- * @category Tags
61
+ * @category Context
11
62
  */
12
63
  export class Tokenizer extends /*#__PURE__*/Context.Tag("@effect/ai/Tokenizer")() {}
13
64
  /**
65
+ * Creates a Tokenizer service implementation from tokenization options.
66
+ *
67
+ * This function constructs a complete Tokenizer service by providing a
68
+ * tokenization function. The service handles both tokenization and
69
+ * truncation operations using the provided tokenizer.
70
+ *
71
+ * @example
72
+ * ```ts
73
+ * import { Tokenizer, Prompt } from "@effect/ai"
74
+ * import { Effect } from "effect"
75
+ *
76
+ * // Simple word-based tokenizer
77
+ * const wordTokenizer = Tokenizer.make({
78
+ * tokenize: (prompt) =>
79
+ * Effect.succeed(
80
+ * prompt.content
81
+ * .flatMap(msg =>
82
+ * typeof msg.content === "string"
83
+ * ? msg.content.split(' ')
84
+ * : msg.content.flatMap(part =>
85
+ * part.type === "text" ? part.text.split(' ') : []
86
+ * )
87
+ * )
88
+ * .map((_, index) => index)
89
+ * )
90
+ * })
91
+ * ```
92
+ *
14
93
  * @since 1.0.0
15
94
  * @category Constructors
16
95
  */
17
96
  export const make = options => Tokenizer.of({
18
97
  tokenize(input) {
19
- return options.tokenize(AiInput.make(input));
98
+ return options.tokenize(Prompt.make(input));
20
99
  },
21
100
  truncate(input, tokens) {
22
- return truncate(AiInput.make(input), options.tokenize, tokens);
101
+ return truncate(Prompt.make(input), options.tokenize, tokens);
23
102
  }
24
103
  });
25
104
  const truncate = (self, tokenize, maxTokens) => Effect.suspend(() => {
26
105
  let count = 0;
27
- let inputMessages = self.messages;
106
+ let inputMessages = self.content;
28
107
  let outputMessages = [];
29
108
  const loop = Effect.suspend(() => {
30
109
  const message = inputMessages[inputMessages.length - 1];
31
110
  if (Predicate.isUndefined(message)) {
32
- return Effect.succeed(AiInput.make(outputMessages));
111
+ return Effect.succeed(Prompt.fromMessages(outputMessages));
33
112
  }
34
113
  inputMessages = inputMessages.slice(0, inputMessages.length - 1);
35
- return Effect.flatMap(tokenize(AiInput.make(message)), tokens => {
114
+ return Effect.flatMap(tokenize(Prompt.fromMessages([message])), tokens => {
36
115
  count += tokens.length;
37
116
  if (count > maxTokens) {
38
- return Effect.succeed(AiInput.make(outputMessages));
117
+ return Effect.succeed(Prompt.fromMessages(outputMessages));
39
118
  }
40
119
  outputMessages = [message, ...outputMessages];
41
120
  return loop;
@@ -1 +1 @@
1
- {"version":3,"file":"Tokenizer.js","names":["Context","Effect","Predicate","AiInput","Tokenizer","Tag","make","options","of","tokenize","input","truncate","tokens","self","maxTokens","suspend","count","inputMessages","messages","outputMessages","loop","message","length","isUndefined","succeed","slice","flatMap"],"sources":["../../src/Tokenizer.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,OAAO,MAAM,gBAAgB;AACzC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,SAAS,MAAM,kBAAkB;AAE7C,OAAO,KAAKC,OAAO,MAAM,cAAc;AAEvC;;;;AAIA,OAAM,MAAOC,SAAU,sBAAQJ,OAAO,CAACK,GAAG,CAAC,sBAAsB,CAAC,EAG/D;AAgBH;;;;AAIA,OAAO,MAAMC,IAAI,GAAIC,OAEpB,IACCH,SAAS,CAACI,EAAE,CAAC;EACXC,QAAQA,CAACC,KAAK;IACZ,OAAOH,OAAO,CAACE,QAAQ,CAACN,OAAO,CAACG,IAAI,CAACI,KAAK,CAAC,CAAC;EAC9C,CAAC;EACDC,QAAQA,CAACD,KAAK,EAAEE,MAAM;IACpB,OAAOD,QAAQ,CAACR,OAAO,CAACG,IAAI,CAACI,KAAK,CAAC,EAAEH,OAAO,CAACE,QAAQ,EAAEG,MAAM,CAAC;EAChE;CACD,CAAC;AAEJ,MAAMD,QAAQ,GAAGA,CACfE,IAAqB,EACrBJ,QAA2E,EAC3EK,SAAiB,KAEjBb,MAAM,CAACc,OAAO,CAAC,MAAK;EAClB,IAAIC,KAAK,GAAG,CAAC;EACb,IAAIC,aAAa,GAAGJ,IAAI,CAACK,QAAQ;EACjC,IAAIC,cAAc,GAA2B,EAAE;EAC/C,MAAMC,IAAI,GAA4CnB,MAAM,CAACc,OAAO,CAAC,MAAK;IACxE,MAAMM,OAAO,GAAGJ,aAAa,CAACA,aAAa,CAACK,MAAM,GAAG,CAAC,CAAC;IACvD,IAAIpB,SAAS,CAACqB,WAAW,CAACF,OAAO,CAAC,EAAE;MAClC,OAAOpB,MAAM,CAACuB,OAAO,CAACrB,OAAO,CAACG,IAAI,CAACa,cAAc,CAAC,CAAC;IACrD;IACAF,aAAa,GAAGA,aAAa,CAACQ,KAAK,CAAC,CAAC,EAAER,aAAa,CAACK,MAAM,GAAG,CAAC,CAAC;IAChE,OAAOrB,MAAM,CAACyB,OAAO,CAACjB,QAAQ,CAACN,OAAO,CAACG,IAAI,CAACe,OAAO,CAAC,CAAC,EAAGT,MAAM,IAAI;MAChEI,KAAK,IAAIJ,MAAM,CAACU,MAAM;MACtB,IAAIN,KAAK,GAAGF,SAAS,EAAE;QACrB,OAAOb,MAAM,CAACuB,OAAO,CAACrB,OAAO,CAACG,IAAI,CAACa,cAAc,CAAC,CAAC;MACrD;MACAA,cAAc,GAAG,CAACE,OAAO,EAAE,GAAGF,cAAc,CAAC;MAC7C,OAAOC,IAAI;IACb,CAAC,CAAC;EACJ,CAAC,CAAC;EACF,OAAOA,IAAI;AACb,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"Tokenizer.js","names":["Context","Effect","Predicate","Prompt","Tokenizer","Tag","make","options","of","tokenize","input","truncate","tokens","self","maxTokens","suspend","count","inputMessages","content","outputMessages","loop","message","length","isUndefined","succeed","fromMessages","slice","flatMap"],"sources":["../../src/Tokenizer.ts"],"sourcesContent":[null],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA,OAAO,KAAKA,OAAO,MAAM,gBAAgB;AACzC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,SAAS,MAAM,kBAAkB;AAE7C,OAAO,KAAKC,MAAM,MAAM,aAAa;AAErC;;;;;;;;;;;;;;;;;;;;;AAqBA,OAAM,MAAOC,SAAU,sBAAQJ,OAAO,CAACK,GAAG,CAAC,sBAAsB,CAAC,EAG/D;AAkDH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,OAAO,MAAMC,IAAI,GAAIC,OAUpB,IACCH,SAAS,CAACI,EAAE,CAAC;EACXC,QAAQA,CAACC,KAAK;IACZ,OAAOH,OAAO,CAACE,QAAQ,CAACN,MAAM,CAACG,IAAI,CAACI,KAAK,CAAC,CAAC;EAC7C,CAAC;EACDC,QAAQA,CAACD,KAAK,EAAEE,MAAM;IACpB,OAAOD,QAAQ,CAACR,MAAM,CAACG,IAAI,CAACI,KAAK,CAAC,EAAEH,OAAO,CAACE,QAAQ,EAAEG,MAAM,CAAC;EAC/D;CACD,CAAC;AAEJ,MAAMD,QAAQ,GAAGA,CACfE,IAAmB,EACnBJ,QAAiF,EACjFK,SAAiB,KAEjBb,MAAM,CAACc,OAAO,CAAC,MAAK;EAClB,IAAIC,KAAK,GAAG,CAAC;EACb,IAAIC,aAAa,GAAGJ,IAAI,CAACK,OAAO;EAChC,IAAIC,cAAc,GAA0B,EAAE;EAC9C,MAAMC,IAAI,GAAkDnB,MAAM,CAACc,OAAO,CAAC,MAAK;IAC9E,MAAMM,OAAO,GAAGJ,aAAa,CAACA,aAAa,CAACK,MAAM,GAAG,CAAC,CAAC;IACvD,IAAIpB,SAAS,CAACqB,WAAW,CAACF,OAAO,CAAC,EAAE;MAClC,OAAOpB,MAAM,CAACuB,OAAO,CAACrB,MAAM,CAACsB,YAAY,CAACN,cAAc,CAAC,CAAC;IAC5D;IACAF,aAAa,GAAGA,aAAa,CAACS,KAAK,CAAC,CAAC,EAAET,aAAa,CAACK,MAAM,GAAG,CAAC,CAAC;IAChE,OAAOrB,MAAM,CAAC0B,OAAO,CAAClB,QAAQ,CAACN,MAAM,CAACsB,YAAY,CAAC,CAACJ,OAAO,CAAC,CAAC,CAAC,EAAGT,MAAM,IAAI;MACzEI,KAAK,IAAIJ,MAAM,CAACU,MAAM;MACtB,IAAIN,KAAK,GAAGF,SAAS,EAAE;QACrB,OAAOb,MAAM,CAACuB,OAAO,CAACrB,MAAM,CAACsB,YAAY,CAACN,cAAc,CAAC,CAAC;MAC5D;MACAA,cAAc,GAAG,CAACE,OAAO,EAAE,GAAGF,cAAc,CAAC;MAC7C,OAAOC,IAAI;IACb,CAAC,CAAC;EACJ,CAAC,CAAC;EACF,OAAOA,IAAI;AACb,CAAC,CAAC","ignoreList":[]}