provider.ts 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import { Effect, Layer } from "effect"
  2. import { Provider } from "@/provider/provider"
  3. import { ProviderV2 } from "@kirincode-ai/core/provider"
  4. import { ModelV2 } from "@kirincode-ai/core/model"
  5. export namespace ProviderTest {
  6. export function model(override: Partial<Provider.Model> = {}): Provider.Model {
  7. const id = override.id ?? ModelV2.ID.make("gpt-5.2")
  8. const providerID = override.providerID ?? ProviderV2.ID.make("openai")
  9. return {
  10. id,
  11. providerID,
  12. name: "Test Model",
  13. capabilities: {
  14. toolcall: true,
  15. attachment: false,
  16. reasoning: false,
  17. temperature: true,
  18. interleaved: false,
  19. input: { text: true, image: false, audio: false, video: false, pdf: false },
  20. output: { text: true, image: false, audio: false, video: false, pdf: false },
  21. },
  22. api: { id, url: "https://example.com", npm: "@ai-sdk/openai" },
  23. cost: { input: 0, output: 0, cache: { read: 0, write: 0 } },
  24. limit: { context: 200_000, output: 10_000 },
  25. status: "active",
  26. options: {},
  27. headers: {},
  28. release_date: "2025-01-01",
  29. ...override,
  30. }
  31. }
  32. export function info(override: Partial<Provider.Info> = {}, mdl = model()): Provider.Info {
  33. const id = override.id ?? mdl.providerID
  34. return {
  35. id,
  36. name: "Test Provider",
  37. source: "config",
  38. env: [],
  39. options: {},
  40. models: { [mdl.id]: mdl },
  41. ...override,
  42. }
  43. }
  44. export function fake(override: Partial<Provider.Interface> & { model?: Provider.Model; info?: Provider.Info } = {}) {
  45. const mdl = override.model ?? model()
  46. const row = override.info ?? info({}, mdl)
  47. return {
  48. model: mdl,
  49. info: row,
  50. layer: Layer.succeed(
  51. Provider.Service,
  52. Provider.Service.of({
  53. list: Effect.fn("TestProvider.list")(() => Effect.succeed({ [row.id]: row })),
  54. getProvider: Effect.fn("TestProvider.getProvider")((providerID) => {
  55. if (providerID === row.id) return Effect.succeed(row)
  56. return Effect.die(new Error(`Unknown test provider: ${providerID}`))
  57. }),
  58. getModel: Effect.fn("TestProvider.getModel")((providerID, modelID) => {
  59. if (providerID === row.id && modelID === mdl.id) return Effect.succeed(mdl)
  60. return Effect.die(new Error(`Unknown test model: ${providerID}/${modelID}`))
  61. }),
  62. getLanguage: Effect.fn("TestProvider.getLanguage")(() =>
  63. Effect.die(new Error("ProviderTest.getLanguage not configured")),
  64. ),
  65. closest: Effect.fn("TestProvider.closest")((providerID) =>
  66. Effect.succeed(providerID === row.id ? { providerID: row.id, modelID: mdl.id } : undefined),
  67. ),
  68. getSmallModel: Effect.fn("TestProvider.getSmallModel")((providerID) =>
  69. Effect.succeed(providerID === row.id ? mdl : undefined),
  70. ),
  71. defaultModel: Effect.fn("TestProvider.defaultModel")(() =>
  72. Effect.succeed({ providerID: row.id, modelID: mdl.id }),
  73. ),
  74. ...override,
  75. }),
  76. ),
  77. }
  78. }
  79. }