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.');
- }
-}