openrouter.test.ts 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { describe, expect } from "bun:test"
  2. import { Effect } from "effect"
  3. import { LLM } from "../../src"
  4. import { LLMClient } from "../../src/route"
  5. import * as OpenRouter from "../../src/providers/openrouter"
  6. import { it } from "../lib/effect"
  7. describe("OpenRouter", () => {
  8. it.effect("prepares OpenRouter models through the OpenAI-compatible Chat route", () =>
  9. Effect.gen(function* () {
  10. const model = OpenRouter.configure({ apiKey: "test-key" }).model("openai/gpt-4o-mini")
  11. expect(model).toMatchObject({
  12. id: "openai/gpt-4o-mini",
  13. provider: "openrouter",
  14. route: { id: "openrouter" },
  15. })
  16. expect(model.route.endpoint.baseURL).toBe("https://openrouter.ai/api/v1")
  17. const prepared = yield* LLMClient.prepare(LLM.request({ model, prompt: "Say hello." }))
  18. expect(prepared.route).toBe("openrouter")
  19. expect(prepared.body).toMatchObject({
  20. model: "openai/gpt-4o-mini",
  21. messages: [{ role: "user", content: "Say hello." }],
  22. stream: true,
  23. })
  24. }),
  25. )
  26. it.effect("applies OpenRouter payload options from the model helper", () =>
  27. Effect.gen(function* () {
  28. const prepared = yield* LLMClient.prepare(
  29. LLM.request({
  30. model: OpenRouter.configure({
  31. apiKey: "test-key",
  32. providerOptions: {
  33. openrouter: {
  34. usage: true,
  35. reasoning: { effort: "high" },
  36. promptCacheKey: "session_123",
  37. },
  38. },
  39. }).model("anthropic/claude-3.7-sonnet:thinking"),
  40. prompt: "Think briefly.",
  41. }),
  42. )
  43. expect(prepared.body).toMatchObject({
  44. usage: { include: true },
  45. reasoning: { effort: "high" },
  46. prompt_cache_key: "session_123",
  47. })
  48. }),
  49. )
  50. })