@effect/ai 0.33.1 → 0.34.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 (44) hide show
  1. package/dist/cjs/AiError.js +8 -3
  2. package/dist/cjs/AiError.js.map +1 -1
  3. package/dist/cjs/Chat.js +2 -2
  4. package/dist/cjs/EmbeddingModel.js +9 -2
  5. package/dist/cjs/EmbeddingModel.js.map +1 -1
  6. package/dist/cjs/LanguageModel.js +2 -2
  7. package/dist/cjs/Prompt.js +10 -3
  8. package/dist/cjs/Prompt.js.map +1 -1
  9. package/dist/cjs/Telemetry.js +4 -2
  10. package/dist/cjs/Telemetry.js.map +1 -1
  11. package/dist/cjs/Tool.js +0 -9
  12. package/dist/cjs/Tool.js.map +1 -1
  13. package/dist/dts/AiError.d.ts +4 -3
  14. package/dist/dts/AiError.d.ts.map +1 -1
  15. package/dist/dts/Chat.d.ts +2 -2
  16. package/dist/dts/EmbeddingModel.d.ts +9 -2
  17. package/dist/dts/EmbeddingModel.d.ts.map +1 -1
  18. package/dist/dts/LanguageModel.d.ts +2 -2
  19. package/dist/dts/McpSchema.d.ts +1 -1
  20. package/dist/dts/Prompt.d.ts +14 -3
  21. package/dist/dts/Prompt.d.ts.map +1 -1
  22. package/dist/dts/Telemetry.d.ts +4 -2
  23. package/dist/dts/Telemetry.d.ts.map +1 -1
  24. package/dist/dts/Tool.d.ts.map +1 -1
  25. package/dist/esm/AiError.js +8 -3
  26. package/dist/esm/AiError.js.map +1 -1
  27. package/dist/esm/Chat.js +2 -2
  28. package/dist/esm/EmbeddingModel.js +9 -2
  29. package/dist/esm/EmbeddingModel.js.map +1 -1
  30. package/dist/esm/LanguageModel.js +2 -2
  31. package/dist/esm/Prompt.js +10 -3
  32. package/dist/esm/Prompt.js.map +1 -1
  33. package/dist/esm/Telemetry.js +4 -2
  34. package/dist/esm/Telemetry.js.map +1 -1
  35. package/dist/esm/Tool.js +0 -9
  36. package/dist/esm/Tool.js.map +1 -1
  37. package/package.json +5 -5
  38. package/src/AiError.ts +6 -5
  39. package/src/Chat.ts +2 -2
  40. package/src/EmbeddingModel.ts +9 -2
  41. package/src/LanguageModel.ts +2 -2
  42. package/src/Prompt.ts +24 -6
  43. package/src/Telemetry.ts +4 -2
  44. package/src/Tool.ts +0 -9
package/src/Chat.ts CHANGED
@@ -78,10 +78,10 @@ import type * as Tool from "./Tool.js"
78
78
  * @example
79
79
  * ```ts
80
80
  * import { Chat } from "@effect/ai"
81
- * import { Effect } from "effect"
81
+ * import * as Effect from "effect/Effect"
82
82
  *
83
83
  * const useChat = Effect.gen(function* () {
84
- * const chat = yield* Chat
84
+ * const chat = yield* Chat.Chat
85
85
  * const response = yield* chat.generateText({
86
86
  * prompt: "Explain quantum computing in simple terms"
87
87
  * })
@@ -69,10 +69,17 @@ import * as AiError from "./AiError.js"
69
69
  * @example
70
70
  * ```ts
71
71
  * import { EmbeddingModel } from "@effect/ai"
72
- * import { Effect } from "effect"
72
+ * import * as Effect from "effect/Effect"
73
+ *
74
+ * const cosineSimilarity = (a: ReadonlyArray<number>, b: ReadonlyArray<number>): number => {
75
+ * const dot = a.reduce((sum, ai, i) => sum + ai * (b[i] ?? 0), 0)
76
+ * const normA = Math.sqrt(a.reduce((sum, ai) => sum + ai * ai, 0))
77
+ * const normB = Math.sqrt(b.reduce((sum, bi) => sum + bi * bi, 0))
78
+ * return normA === 0 || normB === 0 ? 0 : dot / (normA * normB)
79
+ * }
73
80
  *
74
81
  * const useEmbeddings = Effect.gen(function* () {
75
- * const embedder = yield* EmbeddingModel
82
+ * const embedder = yield* EmbeddingModel.EmbeddingModel
76
83
  *
77
84
  * const documentVector = yield* embedder.embed("This is a sample document")
78
85
  * const queryVector = yield* embedder.embed("sample query")
@@ -83,10 +83,10 @@ import * as Toolkit from "./Toolkit.js"
83
83
  * @example
84
84
  * ```ts
85
85
  * import { LanguageModel } from "@effect/ai"
86
- * import { Effect } from "effect"
86
+ * import * as Effect from "effect/Effect"
87
87
  *
88
88
  * const useLanguageModel = Effect.gen(function* () {
89
- * const model = yield* LanguageModel
89
+ * const model = yield* LanguageModel.LanguageModel
90
90
  * const response = yield* model.generateText({
91
91
  * prompt: "What is machine learning?"
92
92
  * })
package/src/Prompt.ts CHANGED
@@ -611,7 +611,8 @@ export const toolCallPart = (params: PartConstructorParams<ToolCallPart>): ToolC
611
611
  * temperature: 22,
612
612
  * condition: "sunny",
613
613
  * humidity: 65
614
- * }
614
+ * },
615
+ * providerExecuted: false
615
616
  * })
616
617
  * ```
617
618
  *
@@ -635,6 +636,10 @@ export interface ToolResultPart extends BasePart<"tool-result", ToolResultPartOp
635
636
  * The result returned by the tool execution.
636
637
  */
637
638
  readonly result: unknown
639
+ /**
640
+ * Whether the tool was executed by the provider (true) or framework (false).
641
+ */
642
+ readonly providerExecuted: boolean
638
643
  }
639
644
 
640
645
  /**
@@ -660,6 +665,10 @@ export interface ToolResultPartEncoded extends BasePartEncoded<"tool-result", To
660
665
  * The result returned by the tool execution.
661
666
  */
662
667
  readonly result: unknown
668
+ /**
669
+ * Whether the tool was executed by the provider (true) or framework (false).
670
+ */
671
+ readonly providerExecuted: boolean
663
672
  }
664
673
 
665
674
  /**
@@ -683,6 +692,7 @@ export const ToolResultPart: Schema.Schema<ToolResultPart, ToolResultPartEncoded
683
692
  name: Schema.String,
684
693
  isFailure: Schema.Boolean,
685
694
  result: Schema.Unknown,
695
+ providerExecuted: Schema.Boolean,
686
696
  options: Schema.optionalWith(ProviderOptions, { default: constEmptyObject })
687
697
  }).pipe(
688
698
  Schema.attachPropertySignature(PartTypeId, PartTypeId),
@@ -1036,7 +1046,8 @@ export const userMessage = (params: MessageConstructorParams<UserMessage>): User
1036
1046
  * result: {
1037
1047
  * temperature: 72,
1038
1048
  * condition: "sunny"
1039
- * }
1049
+ * },
1050
+ * providerExecuted: false
1040
1051
  * }),
1041
1052
  * Prompt.makePart("text", {
1042
1053
  * text: "The weather in San Francisco is currently 72°F and sunny."
@@ -1150,7 +1161,8 @@ export const assistantMessage = (params: MessageConstructorParams<AssistantMessa
1150
1161
  * { title: "TypeScript Handbook", url: "https://..." },
1151
1162
  * { title: "Effective TypeScript", url: "https://..." }
1152
1163
  * ]
1153
- * }
1164
+ * },
1165
+ * providerExecuted: false
1154
1166
  * })
1155
1167
  * ]
1156
1168
  * })
@@ -1624,12 +1636,18 @@ export const fromResponseParts = (parts: ReadonlyArray<Response.AnyPart>): Promp
1624
1636
 
1625
1637
  // Tool Result Parts
1626
1638
  case "tool-result": {
1627
- toolParts.push(makePart("tool-result", {
1639
+ const toolPart = makePart("tool-result", {
1628
1640
  id: part.id,
1629
1641
  name: part.providerName ?? part.name,
1630
1642
  isFailure: part.isFailure,
1631
- result: part.encodedResult
1632
- }))
1643
+ result: part.encodedResult,
1644
+ providerExecuted: part.providerExecuted ?? false
1645
+ })
1646
+ if (part.providerExecuted) {
1647
+ assistantParts.push(toolPart)
1648
+ } else {
1649
+ toolParts.push(toolPart)
1650
+ }
1633
1651
  }
1634
1652
  }
1635
1653
  }
package/src/Telemetry.ts CHANGED
@@ -627,11 +627,13 @@ export interface SpanTransformer {
627
627
  * @example
628
628
  * ```ts
629
629
  * import { Telemetry } from "@effect/ai"
630
- * import { Context, Effect } from "effect"
630
+ * import * as Effect from "effect/Effect"
631
+ *
632
+ * declare const myAIOperation: Effect.Effect<void>
631
633
  *
632
634
  * // Create a custom span transformer
633
635
  * const loggingTransformer: Telemetry.SpanTransformer = (options) => {
634
- * console.log(`AI request completed: ${options.model}`)
636
+ * console.log(`AI request completed: ${options.response.length} part(s)`)
635
637
  * options.response.forEach((part, index) => {
636
638
  * console.log(`Part ${index}: ${part.type}`)
637
639
  * })
package/src/Tool.ts CHANGED
@@ -1297,15 +1297,6 @@ export const getJsonSchema = <
1297
1297
  export const getJsonSchemaFromSchemaAst = (
1298
1298
  ast: AST.AST
1299
1299
  ): JsonSchema.JsonSchema7 => {
1300
- const props = AST.getPropertySignatures(ast)
1301
- if (props.length === 0) {
1302
- return {
1303
- type: "object",
1304
- properties: {},
1305
- required: [],
1306
- additionalProperties: false
1307
- }
1308
- }
1309
1300
  const $defs = {}
1310
1301
  const schema = JsonSchema.fromAST(ast, {
1311
1302
  definitions: $defs,