byokay-kit
Version:
Byokay Kit lets users bring their own AI API keys and store them securely in their browser. This eliminates the need for your app to manage sensitive credentials or maintain AI API backend infrastructure.
74 lines (73 loc) • 2.46 kB
JavaScript
import { useState } from "react";
import { KeyManager } from "../core/KeyManager";
// Initialize KeyManager - should be the same instance as in useMultiApiKeys
const keyManager = new KeyManager();
export function useOpenAI() {
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState(null);
// Get key from the KeyManager
const getOpenAIKey = () => {
const key = keyManager.getKey("openai");
if (!key) {
throw new Error("OpenAI API key not found. Please set your API key first.");
}
return key;
};
// Chat completion function to generate text
const generateCompletion = async (params) => {
try {
const key = getOpenAIKey();
setIsLoading(true);
setError(null);
const response = await fetch("https://api.openai.com/v1/chat/completions", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${key}`,
},
body: JSON.stringify(params),
});
if (!response.ok) {
const errorData = await response.json();
throw new Error(errorData.error?.message || "Error calling OpenAI API");
}
const data = await response.json();
return data.choices[0]?.message?.content || "";
}
catch (err) {
const errorMessage = err instanceof Error ? err.message : "Unknown error occurred";
setError(errorMessage);
throw err;
}
finally {
setIsLoading(false);
}
};
// Helper for simple text completions with a default system prompt
const completeText = async (userPrompt, model = "gpt-3.5-turbo") => {
return generateCompletion({
model,
messages: [
{
role: "system",
content: "You are a helpful assistant.",
},
{
role: "user",
content: userPrompt,
},
],
});
};
// Check if OpenAI key is available
const hasOpenAIKey = () => {
return !!keyManager.getKey("openai");
};
return {
generateCompletion,
completeText,
hasOpenAIKey,
isLoading,
error,
};
}