model.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import { DateTime, Schema } from "effect"
  2. import { DateTimeUtcFromMillis } from "effect/Schema"
  3. import { ProviderV2 } from "./provider"
  4. import { ModelRequest } from "./model-request"
  5. export const ID = Schema.String.pipe(Schema.brand("ModelV2.ID"))
  6. export type ID = typeof ID.Type
  7. export const VariantID = Schema.String.pipe(Schema.brand("VariantID"))
  8. export type VariantID = typeof VariantID.Type
  9. // Grouping of models, eg claude opus, claude sonnet
  10. export const Family = Schema.String.pipe(Schema.brand("Family"))
  11. export type Family = typeof Family.Type
  12. export const Capabilities = Schema.Struct({
  13. tools: Schema.Boolean,
  14. // mime patterns, image, audio, video/*, text/*
  15. input: Schema.String.pipe(Schema.Array),
  16. output: Schema.String.pipe(Schema.Array),
  17. })
  18. export type Capabilities = typeof Capabilities.Type
  19. export const Cost = Schema.Struct({
  20. tier: Schema.Struct({
  21. type: Schema.Literal("context"),
  22. size: Schema.Int,
  23. }).pipe(Schema.optional),
  24. input: Schema.Finite,
  25. output: Schema.Finite,
  26. cache: Schema.Struct({
  27. read: Schema.Finite,
  28. write: Schema.Finite,
  29. }),
  30. })
  31. export const Ref = Schema.Struct({
  32. id: ID,
  33. providerID: ProviderV2.ID,
  34. variant: VariantID.pipe(Schema.optional),
  35. })
  36. export type Ref = typeof Ref.Type
  37. export const Api = Schema.Union([
  38. Schema.Struct({
  39. id: ID,
  40. ...ProviderV2.AISDK.fields,
  41. }),
  42. Schema.Struct({
  43. id: ID,
  44. ...ProviderV2.Native.fields,
  45. }),
  46. ]).pipe(Schema.toTaggedUnion("type"))
  47. export type Api = typeof Api.Type
  48. export class Info extends Schema.Class<Info>("ModelV2.Info")({
  49. id: ID,
  50. providerID: ProviderV2.ID,
  51. family: Family.pipe(Schema.optional),
  52. name: Schema.String,
  53. api: Api,
  54. capabilities: Capabilities,
  55. request: Schema.Struct({
  56. ...ModelRequest.Request.fields,
  57. variant: Schema.String.pipe(Schema.optional),
  58. }),
  59. variants: Schema.Struct({
  60. id: VariantID,
  61. ...ModelRequest.Request.fields,
  62. }).pipe(Schema.Array),
  63. time: Schema.Struct({
  64. released: DateTimeUtcFromMillis,
  65. }),
  66. cost: Cost.pipe(Schema.Array),
  67. status: Schema.Literals(["alpha", "beta", "deprecated", "active"]),
  68. enabled: Schema.Boolean,
  69. limit: Schema.Struct({
  70. context: Schema.Int,
  71. input: Schema.Int.pipe(Schema.optional),
  72. output: Schema.Int,
  73. }),
  74. }) {
  75. static empty(providerID: ProviderV2.ID, modelID: ID): Info {
  76. return new Info({
  77. id: modelID,
  78. providerID,
  79. name: modelID,
  80. api: {
  81. id: modelID,
  82. type: "native",
  83. settings: {},
  84. },
  85. capabilities: {
  86. tools: false,
  87. input: [],
  88. output: [],
  89. },
  90. request: {
  91. headers: {},
  92. body: {},
  93. generation: {},
  94. options: {},
  95. },
  96. variants: [],
  97. time: {
  98. released: DateTime.makeUnsafe(0),
  99. },
  100. cost: [],
  101. status: "active",
  102. enabled: true,
  103. limit: {
  104. context: 0,
  105. output: 0,
  106. },
  107. })
  108. }
  109. }
  110. export function parse(input: string): { providerID: ProviderV2.ID; modelID: ID } {
  111. const [providerID, ...modelID] = input.split("/")
  112. return {
  113. providerID: ProviderV2.ID.make(providerID),
  114. modelID: ID.make(modelID.join("/")),
  115. }
  116. }
  117. export * as ModelV2 from "./model"