Last active
June 9, 2023 23:18
-
-
Save aroman/7973a45185a27e288b8d20e0460665b1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
PromptLayer.init(self.env.PROMPTLAYER_API_KEY); | |
PromptLayer.beginRequest({ | |
engine: "gpt-4", | |
functionName: 'openai.ChatCompletion.create', | |
messages: [{role: "user", message: "how are you?"] | |
}); | |
// Actually call the ChatGPT API | |
const response = await fetch( | |
'https://api.openai.com/v1/chat/completions', | |
requestOptions | |
); | |
responseData = await response.json(); | |
// Automatically captures start and end time | |
PromptLayer.endRequest(responseData); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const API_BASE_URL = 'https://api.promptlayer.com'; | |
interface OpenAICompletionKwargs { | |
functionName: 'openai.Completion.create'; | |
engine: string; | |
prompt: string | string[]; | |
} | |
interface OpenAIChatCompletionKwargs { | |
functionName: 'openai.ChatCompletion.create'; | |
engine: string; | |
messages: { | |
content: string; | |
role: string; | |
name?: string; | |
}[]; | |
} | |
type Kwargs = OpenAICompletionKwargs | OpenAIChatCompletionKwargs; | |
interface PromptPlayerTrackRequest { | |
api_key: string; | |
function_name: string; | |
kwargs: Kwargs; | |
request_response?: unknown; | |
request_start_time: number; | |
request_end_time?: number; | |
tags?: string[]; | |
prompt_id?: string; | |
prompt_input_variables?: Record<string, string>; | |
prompt_version?: number; | |
} | |
const convertDateToSeconds = (date: Date) => Math.floor(date.getTime() / 1000); | |
class PromptLayer { | |
private static instance: PromptLayer; | |
private pendingRequest: Partial<PromptPlayerTrackRequest>; | |
private constructor(apiKey: string) { | |
this.pendingRequest = { | |
api_key: apiKey, | |
request_start_time: convertDateToSeconds(new Date()), | |
}; | |
} | |
static init(apiKey: string) { | |
if (!PromptLayer.instance) { | |
PromptLayer.instance = new PromptLayer(apiKey); | |
} | |
} | |
static beginRequest(kwargs: Kwargs) { | |
PromptLayer.instance.pendingRequest.kwargs = kwargs; | |
PromptLayer.instance.pendingRequest.function_name = kwargs.functionName; | |
} | |
static async endRequest(request_response: unknown) { | |
PromptLayer.instance.pendingRequest.request_response = request_response; | |
PromptLayer.instance.pendingRequest.request_end_time = convertDateToSeconds( | |
new Date() | |
); | |
await PromptLayer.instance.trackRequest(); | |
} | |
private async trackRequest() { | |
const url = `${API_BASE_URL}/track-request`; | |
await this.fetchResponse( | |
url, | |
this.pendingRequest as PromptPlayerTrackRequest | |
); | |
} | |
private async fetchResponse(url: string, body: PromptPlayerTrackRequest) { | |
const response = await fetch(url, { | |
method: 'POST', | |
headers: { | |
'Content-Type': 'application/json', | |
Accept: 'application/json', | |
}, | |
body: JSON.stringify(body), | |
}); | |
if (!response.ok) { | |
const data = await response.json(); | |
throw new Error( | |
`promptLayer error (${response.statusText}): ${JSON.stringify(data)}` | |
); | |
} | |
return response; | |
} | |
} | |
export default PromptLayer; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment