test-vision.ts
import { LMStudioClient } from "@lmstudio/sdk";
async function main() {
const client = new LMStudioClient();
console.log("Connected to LM Studio");
const modelId = "google/gemma-4-12b-qat";
const model = await client.llm.model(modelId);
const imagePath = "C:\\Users\\ankit\\.lmstudio\\user-files\\1781594229448 - 297.jpeg";
console.log("Preparing image...");
const image = await client.files.prepareImage(imagePath);
console.log("Image prepared, type:", typeof image, "constructor:", (image as any)?.constructor?.name);
console.log("\n=== Text-only ===");
const textPrediction = model.respond([
{ role: "user", content: "Say exactly: Hello World" },
]);
let textReasoning = "";
let textFinal = "";
for await (const chunk of textPrediction) {
if (chunk.reasoningType === "reasoning") {
textReasoning += chunk.content;
} else {
textFinal += chunk.content;
}
}
console.log("Reasoning length:", textReasoning.length);
console.log("Final text:", JSON.stringify(textFinal));
console.log("\n=== Vision (with image) ===");
const visionPrediction = model.respond([
{
role: "user",
content: "Describe this image in detail. What do you see?",
images: [image],
},
]);
let visionReasoning = "";
let visionFinal = "";
let reasoningEnded = false;
for await (const chunk of visionPrediction) {
if (!reasoningEnded && chunk.reasoningType === "reasoning") {
visionReasoning += chunk.content;
} else {
reasoningEnded = true;
visionFinal += chunk.content;
}
}
console.log("Vision reasoning length:", visionReasoning.length);
console.log("Vision response length:", visionFinal.length);
console.log("Vision response:", JSON.stringify(visionFinal.substring(0, 500)));
}
main().catch((err) => {
console.error("Error:", err.message, err.stack);
process.exit(1);
});