JavaScript / TypeScript

    Object Detection (hosted API, Node 18+)

    Keep the API key on a server; don't ship it to browsers.

    import { readFile } from "node:fs/promises";
    
    const form = new FormData();
    form.append("file", new Blob([await readFile("photo.jpg")], { type: "image/jpeg" }), "photo.jpg");
    form.append("confidence", "0.3");
    
    const resp = await fetch("https://openeye.sh/v1/detect", {
      method: "POST",
      headers: { Authorization: `Bearer ${process.env.OPENEYE_API_KEY}` },
      body: form,
    });
    if (!resp.ok) throw new Error(`${resp.status}: ${(await resp.json()).error}`);
    
    const data = await resp.json();
    console.log(`${data.objects.length} objects, ${data.credits_used} credit(s)`);

    Object Detection (self-hosted, fetch)

    const form = new FormData();
    form.append("file", fileInput.files[0]);
    
    const resp = await fetch("http://localhost:8000/predict", {
      method: "POST",
      body: form,
    });
    
    const data = await resp.json();
    console.log(`Found ${data.objects.length} objects`);
    data.objects.forEach((obj) => {
      console.log(`${obj.label}: ${(obj.confidence * 100).toFixed(1)}%`);
    });

    Node.js (form-data)

    import fs from "fs";
    import FormData from "form-data";
    
    const form = new FormData();
    form.append("file", fs.createReadStream("photo.jpg"));
    
    const resp = await fetch("http://localhost:8000/predict", {
      method: "POST",
      headers: form.getHeaders(),
      body: form,
    });
    
    const data = await resp.json();
    console.log(data);

    WebSocket (Browser)

    const ws = new WebSocket("ws://localhost:8000/ws");
    
    ws.onopen = () => {
      console.log("Connected! Send base64-encoded frames.");
    };
    
    ws.onmessage = ({ data }) => {
      const msg = JSON.parse(data);
      if (msg.objects) {
        console.log("Detections:", msg.objects);
      }
    };