llm-option-types.types.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import { Effect, Schema, Stream } from "effect"
  2. import {
  3. LLM,
  4. type LLMClientService,
  5. type LanguageModel,
  6. type LanguageModelProviderOptions,
  7. type ProviderOptions,
  8. } from "../src"
  9. import { OpenAIChat } from "../src/protocols"
  10. interface ExampleOptions {
  11. readonly [key: string]: unknown
  12. readonly mode?: "fast" | "thorough"
  13. }
  14. type ExampleProviderOptions = ProviderOptions & {
  15. readonly example?: ExampleOptions
  16. }
  17. const model = OpenAIChat.route
  18. .with({ endpoint: { baseURL: "https://example.com/v1" } })
  19. .model<ExampleProviderOptions>({ id: "example" })
  20. type Requirements<T> = T extends Effect.Effect<infer _A, infer _E, infer R> ? R : never
  21. type StreamRequirements<T> = T extends Stream.Stream<infer _A, infer _E, infer R> ? R : never
  22. type Equal<A, B> = [A, B] extends [B, A] ? true : false
  23. type Assert<T extends true> = T
  24. LLM.request({ model, prompt: "Hello", providerOptions: { example: { mode: "fast" } } })
  25. LLM.request({ model, prompt: "Hello", providerOptions: { future: { option: true } } })
  26. const generated = LLM.generate(LLM.request({ model, prompt: "Hello" }))
  27. type GenerateRequirements = Assert<Equal<Requirements<typeof generated>, LLMClientService>>
  28. const streamed = LLM.stream(LLM.request({ model, prompt: "Hello" }))
  29. type StreamClientRequirements = Assert<Equal<StreamRequirements<typeof streamed>, LLMClientService>>
  30. LLM.request({
  31. model,
  32. prompt: "Hello",
  33. // @ts-expect-error Known provider options preserve their value types.
  34. providerOptions: { example: { mode: "slow" } },
  35. })
  36. const generatedObject = LLM.generateObject({
  37. model,
  38. prompt: "Hello",
  39. schema: Schema.Struct({ answer: Schema.String }),
  40. providerOptions: { example: { mode: "thorough" } },
  41. })
  42. type GenerateObjectRequirements = Assert<Equal<Requirements<typeof generatedObject>, LLMClientService>>
  43. const generatedDynamicObject = LLM.generateObject({
  44. model,
  45. prompt: "Hello",
  46. jsonSchema: { type: "object" },
  47. })
  48. type GenerateDynamicObjectRequirements = Assert<Equal<Requirements<typeof generatedDynamicObject>, LLMClientService>>
  49. LLM.generateObject({
  50. model,
  51. prompt: "Hello",
  52. jsonSchema: { type: "object" },
  53. // @ts-expect-error Dynamic object generation uses the selected model's provider options.
  54. providerOptions: { example: { mode: false } },
  55. })
  56. declare const generic: LanguageModel
  57. LLM.request({ model: generic, prompt: "Hello", providerOptions: { arbitrary: { option: true } } })
  58. const options: LanguageModelProviderOptions<typeof model> = { example: { mode: "fast" } }
  59. void (options satisfies LanguageModelProviderOptions<typeof model>)
  60. void (true satisfies GenerateRequirements)
  61. void (true satisfies StreamClientRequirements)
  62. void (true satisfies GenerateObjectRequirements)
  63. void (true satisfies GenerateDynamicObjectRequirements)