UNPKG

@genai-impact/ecologits-openai

Version:

Ecologits.js Wrapper & Calculator for the OpenAI API

52 lines 1.9 kB
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