@genai-impact/ecologits-openai
Version:
Ecologits.js Wrapper & Calculator for the OpenAI API
52 lines • 1.9 kB
JavaScript
import OriginOpenAI from "openai";
import { Stream } from "openai/streaming";
import ecologits from "@genai-impact/ecologits.js";
const PROVIDER = "openai";
async function mapStream(timerStart, model, stream) {
let tokens = 0;
async function* iterator() {
for await (const item of stream) {
tokens += 1;
const requestLatency = new Date().getTime() - timerStart.getTime();
const impacts = ecologits.computeLlmImpacts(PROVIDER, model, tokens, requestLatency);
yield { ...item, impacts };
}
}
return new Stream(iterator, stream.controller);
}
async function createStream(timerStart, model, stream) {
const res = await stream;
return mapStream(timerStart, model, res);
}
class CompletionsWraper extends OriginOpenAI.Chat.Completions {
create(body, options) {
const timerStart = new Date();
const streamed = body.stream ?? false;
if (streamed) {
const stream = this._client.post("/chat/completions", {
body,
...options,
stream: streamed,
});
return createStream(timerStart, body.model, stream);
}
const res = this._client.post("/chat/completions", {
body,
...options,
stream: streamed,
});
return res.then(async (resp) => {
const requestLatency = new Date().getTime() - timerStart.getTime();
const tokens = resp.usage?.completion_tokens || 0;
const impacts = ecologits.computeLlmImpacts(PROVIDER, body.model, tokens, requestLatency);
return { ...resp, impacts };
});
}
}
class Chat extends OriginOpenAI.Chat {
completions = new CompletionsWraper(this._client);
}
export default class OpenAI extends OriginOpenAI {
chat = new Chat(this);
}
//# sourceMappingURL=tracer.js.map