|
7 | 7 | CodeActionKind, |
8 | 8 | CodeLens, |
9 | 9 | LanguageModelTextPart, |
| 10 | + LanguageModelDataPart, |
10 | 11 | LanguageModelToolCallPart, |
11 | 12 | LanguageModelToolResultPart, |
12 | 13 | FileSystemError, |
@@ -261,6 +262,54 @@ describe("LanguageModelTextPart", () => { |
261 | 262 | }) |
262 | 263 | }) |
263 | 264 |
|
| 265 | +describe("LanguageModelDataPart", () => { |
| 266 | + const decode = (data: Uint8Array) => new TextDecoder().decode(data) |
| 267 | + |
| 268 | + it("should create data part via constructor", () => { |
| 269 | + const data = new Uint8Array([1, 2, 3]) |
| 270 | + const part = new LanguageModelDataPart(data, "image/png") |
| 271 | + |
| 272 | + expect(part.data).toBe(data) |
| 273 | + expect(part.mimeType).toBe("image/png") |
| 274 | + }) |
| 275 | + |
| 276 | + describe("image()", () => { |
| 277 | + it("should create image part preserving bytes and mime type", () => { |
| 278 | + const data = new Uint8Array([137, 80, 78, 71]) |
| 279 | + const part = LanguageModelDataPart.image(data, "image/png") |
| 280 | + |
| 281 | + expect(part).toBeInstanceOf(LanguageModelDataPart) |
| 282 | + expect(part.data).toEqual(data) |
| 283 | + expect(part.mimeType).toBe("image/png") |
| 284 | + }) |
| 285 | + |
| 286 | + it("should round-trip base64-decoded image data", () => { |
| 287 | + const base64 = Buffer.from("fake-image-bytes").toString("base64") |
| 288 | + const part = LanguageModelDataPart.image(new Uint8Array(Buffer.from(base64, "base64")), "image/jpeg") |
| 289 | + |
| 290 | + expect(decode(part.data)).toBe("fake-image-bytes") |
| 291 | + expect(part.mimeType).toBe("image/jpeg") |
| 292 | + }) |
| 293 | + }) |
| 294 | +}) |
| 295 | + |
| 296 | +describe("LanguageModelDataPart text and JSON", () => { |
| 297 | + it.each([undefined, "text/html"])("encodes text with MIME type %s", (mimeType) => { |
| 298 | + const part = LanguageModelDataPart.text("Hello 🌍", mimeType) |
| 299 | + expect(part).toBeInstanceOf(LanguageModelDataPart) |
| 300 | + expect(new TextDecoder().decode(part.data)).toBe("Hello 🌍") |
| 301 | + expect(part.mimeType).toBe(mimeType ?? "text/plain") |
| 302 | + }) |
| 303 | + |
| 304 | + it.each([undefined, "application/example+json"])("encodes JSON with MIME type %s", (mimeType) => { |
| 305 | + const value = { message: "Hello 🌍", count: 2 } |
| 306 | + const part = LanguageModelDataPart.json(value, mimeType) |
| 307 | + expect(part).toBeInstanceOf(LanguageModelDataPart) |
| 308 | + expect(JSON.parse(new TextDecoder().decode(part.data))).toEqual(value) |
| 309 | + expect(part.mimeType).toBe(mimeType ?? "application/json") |
| 310 | + }) |
| 311 | +}) |
| 312 | + |
264 | 313 | describe("LanguageModelToolCallPart", () => { |
265 | 314 | it("should create tool call part", () => { |
266 | 315 | const part = new LanguageModelToolCallPart("call-123", "searchFiles", { query: "test" }) |
|
0 commit comments