diff --git a/README.md b/README.md index 56e12ddb0..6fa3000f1 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,6 @@ You can configure the agent's name, model, and prompts in their profile like `an | `huggingface` | `HUGGINGFACE_API_KEY` | [docs](https://huggingface.co/models) | | `novita` | `NOVITA_API_KEY` | [docs](https://novita.ai/model-api/product/llm-api?utm_source=github_mindcraft&utm_medium=github_readme&utm_campaign=link) | | `openrouter` | `OPENROUTER_API_KEY` | [docs](https://openrouter.ai/models) | -| `glhf` | `GHLF_API_KEY` | [docs](https://glhf.chat/user-settings/api) | | `hyperbolic` | `HYPERBOLIC_API_KEY` | [docs](https://docs.hyperbolic.xyz/docs/getting-started) | | `vllm` | n/a | n/a | | `cerebras` | `CEREBRAS_API_KEY` | [docs](https://inference-docs.cerebras.ai/introduction) | diff --git a/keys.example.json b/keys.example.json index fe6812888..bcdfd9442 100644 --- a/keys.example.json +++ b/keys.example.json @@ -10,7 +10,6 @@ "XAI_API_KEY": "", "MISTRAL_API_KEY": "", "DEEPSEEK_API_KEY": "", - "GHLF_API_KEY": "", "HYPERBOLIC_API_KEY": "", "NOVITA_API_KEY": "", "OPENROUTER_API_KEY": "", diff --git a/src/models/glhf.js b/src/models/glhf.js deleted file mode 100644 index 559d61cca..000000000 --- a/src/models/glhf.js +++ /dev/null @@ -1,71 +0,0 @@ -import OpenAIApi from 'openai'; -import { getKey } from '../utils/keys.js'; - -export class GLHF { - static prefix = 'glhf'; - constructor(model_name, url) { - this.model_name = model_name; - const apiKey = getKey('GHLF_API_KEY'); - if (!apiKey) { - throw new Error('API key not found. Please check keys.json and ensure GHLF_API_KEY is defined.'); - } - this.openai = new OpenAIApi({ - apiKey, - baseURL: url || "https://glhf.chat/api/openai/v1" - }); - } - - async sendRequest(turns, systemMessage, stop_seq = '***') { - // Construct the message array for the API request. - let messages = [{ role: 'system', content: systemMessage }].concat(turns); - const pack = { - model: this.model_name || "hf:meta-llama/Llama-3.3-70B-Instruct", - messages, - stop: [stop_seq] - }; - - const maxAttempts = 5; - let attempt = 0; - let finalRes = null; - - while (attempt < maxAttempts) { - attempt++; - console.log(`Awaiting glhf.chat API response... (attempt: ${attempt})`); - try { - let completion = await this.openai.chat.completions.create(pack); - if (completion.choices[0].finish_reason === 'length') { - throw new Error('Context length exceeded'); - } - let res = completion.choices[0].message.content; - // If there's an open tag without a corresponding , retry. - if (res.includes("") && !res.includes("")) { - console.warn("Partial block detected. Re-generating..."); - continue; - } - // If there's a closing tag but no opening , prepend one. - if (res.includes("") && !res.includes("")) { - res = "" + res; - } - finalRes = res.replace(/<\|separator\|>/g, '*no response*'); - break; // Valid response obtained. - } catch (err) { - if ((err.message === 'Context length exceeded' || err.code === 'context_length_exceeded') && turns.length > 1) { - console.log('Context length exceeded, trying again with shorter context.'); - return await this.sendRequest(turns.slice(1), systemMessage, stop_seq); - } else { - console.error(err); - finalRes = 'My brain disconnected, try again.'; - break; - } - } - } - if (finalRes === null) { - finalRes = "I thought too hard, sorry, try again"; - } - return finalRes; - } - - async embed(text) { - throw new Error('Embeddings are not supported by glhf.'); - } -}