model.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. export * as Model from "./model"
  2. import { Schema } from "effect"
  3. import { optional } from "./schema"
  4. import { Provider } from "./provider"
  5. import { statics } from "./schema"
  6. export const ID = Schema.String.pipe(Schema.brand("ModelV2.ID"))
  7. export type ID = typeof ID.Type
  8. export const VariantID = Schema.String.pipe(Schema.brand("VariantID"))
  9. export type VariantID = typeof VariantID.Type
  10. export const Ref = Schema.Struct({
  11. id: ID,
  12. providerID: Provider.ID,
  13. variant: VariantID.pipe(optional),
  14. }).annotate({ identifier: "Model.Ref" })
  15. export interface Ref extends Schema.Schema.Type<typeof Ref> {}
  16. export const Family = Schema.String.pipe(Schema.brand("Family"))
  17. export type Family = typeof Family.Type
  18. export interface Capabilities extends Schema.Schema.Type<typeof Capabilities> {}
  19. export const Capabilities = Schema.Struct({
  20. tools: Schema.Boolean,
  21. input: Schema.Array(Schema.String),
  22. output: Schema.Array(Schema.String),
  23. }).annotate({ identifier: "Model.Capabilities" })
  24. export interface Cost extends Schema.Schema.Type<typeof Cost> {}
  25. export const Cost = Schema.Struct({
  26. tier: Schema.Struct({
  27. type: Schema.Literal("context"),
  28. size: Schema.Int,
  29. }).pipe(optional),
  30. input: Schema.Finite,
  31. output: Schema.Finite,
  32. cache: Schema.Struct({
  33. read: Schema.Finite,
  34. write: Schema.Finite,
  35. }),
  36. }).annotate({ identifier: "Model.Cost" })
  37. export const Api = Schema.Union([
  38. Schema.Struct({
  39. id: ID,
  40. ...Provider.AISDK.fields,
  41. }),
  42. Schema.Struct({
  43. id: ID,
  44. ...Provider.Native.fields,
  45. }),
  46. ])
  47. .pipe(Schema.toTaggedUnion("type"))
  48. .annotate({ identifier: "Model.Api" })
  49. export type Api = typeof Api.Type
  50. export interface Info extends Schema.Schema.Type<typeof Info> {}
  51. export const Info = Schema.Struct({
  52. id: ID,
  53. providerID: Provider.ID,
  54. family: Family.pipe(optional),
  55. name: Schema.String,
  56. api: Api,
  57. capabilities: Capabilities,
  58. request: Schema.Struct({
  59. ...Provider.Request.fields,
  60. variant: Schema.String.pipe(optional),
  61. }),
  62. variants: Schema.Struct({
  63. id: VariantID,
  64. ...Provider.Request.fields,
  65. }).pipe(Schema.Array),
  66. time: Schema.Struct({
  67. released: Schema.Finite,
  68. }),
  69. cost: Schema.Array(Cost),
  70. status: Schema.Literals(["alpha", "beta", "deprecated", "active"]),
  71. enabled: Schema.Boolean,
  72. limit: Schema.Struct({
  73. context: Schema.Int,
  74. input: Schema.Int.pipe(optional),
  75. output: Schema.Int,
  76. }),
  77. })
  78. .annotate({ identifier: "ModelV2.Info" })
  79. .pipe(
  80. statics((schema) => ({
  81. empty: (providerID: Provider.ID, modelID: ID) =>
  82. schema.make({
  83. id: modelID,
  84. providerID,
  85. name: modelID,
  86. api: { id: modelID, type: "native", settings: {} },
  87. capabilities: { tools: false, input: [], output: [] },
  88. request: { headers: {}, body: {} },
  89. variants: [],
  90. time: { released: 0 },
  91. cost: [],
  92. status: "active",
  93. enabled: true,
  94. limit: { context: 0, output: 0 },
  95. }),
  96. })),
  97. )