ioBroker / AdapterRequests

This Place is used to track the status of new Adapter-Requests.
249 stars 36 forks source link

chatGPT Adapter #834

Open ldittmar81 opened 1 year ago

ldittmar81 commented 1 year ago

What kind of device or service would you like to see an adapter for? An adapter for ChatGPT, OpenAI's large-scale AI language model. ChatGPT can be used to generate human-like text responses based on given input prompts. More information can be found at https://beta.openai.com/docs/api-reference/introduction.

Is the device connected to the internet or only available on a local network? The ChatGPT service is connected to the internet and requires an internet connection to access the API.

Is an official App or Website available? There is no official app, but the API documentation is available on the OpenAI website: https://beta.openai.com/docs/api-reference/introduction.

Is an official API including documentation available? Yes, the official API documentation is available here: https://beta.openai.com/docs/api-reference/introduction.

Are other libraries for an integration available? There is an official openai npm package for JavaScript, which can be found here: https://www.npmjs.com/package/openai. Other unofficial libraries may also be available for different programming languages, but the official JavaScript package is recommended for ioBroker integration.

Is this device already integrated in other Smart Home systems? As ChatGPT is an AI language model and not a device, it is not natively integrated into other Smart Home systems. However, developers can create custom integrations for their specific use cases.

Is this device already integrated in homebridge? Might the ham adapter in combination with the homebridge plugin be sufficient? ChatGPT is not directly integrated with homebridge. However, you may be able to create a custom homebridge plugin to access the ChatGPT API and use the ham adapter in combination with that plugin.

Additional context Integrating ChatGPT with ioBroker would enable users to generate AI-generated responses based on various input prompts, which could be useful for automating tasks, providing information, or creating more interactive experiences within the ioBroker environment.

ldittmar81 commented 1 year ago

Also... alle Fragen wurden von ChatGPT selbst beantwortet :-D - ich finde das Ding echt Klasse - dann habe ich noch gefragt: Wofür könnte man ChatGPT in der Hausautomatisierung nutzen? Und sie antwortete:

ChatGPT kann in verschiedenen Szenarien für die Hausautomatisierung nützlich sein. Hier sind einige Beispiele:

  1. Sprachassistent: Integrieren Sie ChatGPT, um einen sprachgesteuerten Assistenten für Ihr Smart Home-System zu erstellen. Benutzer können Fragen stellen oder Befehle geben, und ChatGPT kann die entsprechenden Antworten oder Aktionen generieren.

  2. Automatisierte Benachrichtigungen: ChatGPT kann verwendet werden, um benutzerdefinierte, kontextbezogene Benachrichtigungen basierend auf Ereignissen im Smart Home zu erstellen. Zum Beispiel kann es Warnmeldungen generieren, wenn Sensoren ungewöhnliche Aktivitäten oder Umgebungsbedingungen melden.

  3. Intelligente Szenarien: ChatGPT kann dazu verwendet werden, intelligente Szenarien oder Routinen zu erstellen, die auf den Gewohnheiten und Präferenzen der Benutzer basieren. Durch das Analysieren von Benutzeranfragen und -aktionen kann es Vorschläge für Automatisierungsszenarien machen, die den Komfort und die Effizienz im Haushalt erhöhen.

  4. Fehlerbehebung und Support: ChatGPT kann bei der Fehlerbehebung und dem Support für Smart Home-Geräte helfen, indem es Benutzern Lösungen oder Vorschläge zur Behebung von Problemen bietet.

  5. Automatisierte Kommunikation: ChatGPT kann als Schnittstelle für die Kommunikation zwischen verschiedenen Smart Home-Geräten und -diensten dienen, um eine nahtlose Integration und Koordination von Aktionen zu ermöglichen.

  6. Lernfähige Automatisierung: ChatGPT kann dazu verwendet werden, Benutzerpräferenzen und -verhalten im Laufe der Zeit zu lernen und darauf basierend automatische Anpassungen an Systemeinstellungen oder Gerätesteuerungen vorzunehmen.

  7. Unterhaltung und Bildung: ChatGPT kann auch für Unterhaltungs- und Bildungszwecke genutzt werden, wie zum Beispiel das Beantworten von Quizfragen, das Erzählen von Geschichten oder das Bereitstellen von interessanten Fakten zu verschiedenen Themen.

Beachten Sie jedoch, dass die Nutzung von ChatGPT in einer Hausautomatisierungsumgebung den Datenschutz und die Datensicherheit berücksichtigen sollte, um die Privatsphäre der Benutzer und die Sicherheit ihrer Daten zu gewährleisten.

Auf die Frage wie ich sie in ioBroker einbinden könnte:

Als KI-Textmodell kann ich Ihnen beim Entwerfen eines Adapters für ioBroker helfen, der meine API integriert. Allerdings kann ich nicht direkt den Code für Sie schreiben. Hier ist eine grobe Anleitung, wie Sie mit der Integration beginnen können:

  1. Erstellen Sie zunächst ein neues Adapter-Projekt für ioBroker, indem Sie das ioBroker-Entwicklungswerkzeug create-adapter verwenden. Weitere Informationen finden Sie in der offiziellen Dokumentation: https://github.com/ioBroker/create-adapter

  2. Installieren Sie die benötigten Abhängigkeiten für die OpenAI-API, zum Beispiel, wenn Sie Node.js verwenden, könnten Sie das offizielle Paket openai verwenden:

npm install openai
  1. Importieren Sie die Abhängigkeiten und konfigurieren Sie die API, indem Sie Ihren API-Schlüssel angeben:
const openai = require('openai');

openai.apiKey = 'YOUR_API_KEY';
  1. Erstellen Sie eine Funktion, die die OpenAI-API aufruft, um eine Antwort basierend auf einer Eingabeaufforderung zu generieren. Zum Beispiel:
async function generateResponse(prompt) {
  try {
    const result = await openai.Completion.create({
      engine: 'text-davinci-002',
      prompt: prompt,
      max_tokens: 50,
      n: 1,
      stop: null,
      temperature: 0.5,
    });

    const response = result.choices[0].text.trim();
    return response;
  } catch (error) {
    console.error('Error generating response:', error);
    return null;
  }
}
  1. Integrieren Sie die Funktion in Ihren ioBroker-Adapter, um auf Benutzereingaben zu reagieren oder geplante Aufgaben auszuführen. Zum Beispiel könnten Sie den Adapter so konfigurieren, dass er auf Ereignisse in Ihrem ioBroker-System reagiert und die API aufruft, um darauf basierend Antworten zu generieren.

  2. Testen Sie Ihren Adapter und stellen Sie sicher, dass er wie erwartet funktioniert. Achten Sie darauf, Fehlerbehandlungs- und Sicherheitsmaßnahmen zu implementieren, um den ordnungsgemäßen Betrieb des Adapters zu gewährleisten.

Denken Sie daran, dass dies nur eine grundlegende Anleitung ist und Sie möglicherweise zusätzliche Anpassungen vornehmen müssen, um die API vollständig in Ihren ioBroker-Adapter zu integrieren.

ldittmar81 commented 1 year ago

Hier ein Beispiel der Möglichkeiten

ChatGPT Test

ChatGPT Test2

Negalein commented 1 year ago

chatGPT ist genial. Ich lass mir von ihr meine ganzen Werbetexte schreiben. Besser hat es die Agentur auch nicht gemacht.

derrapf commented 1 year ago

Ich habe mal mit wenig Aufwand ein Script geschrieben, das das was man Alexa gesagt hat in einen Datenpunkt schreibt. Der wiederum wird an ChatGPT gegeben und die Antwort über den Alexa2 Adapter ausgegeben und von Alexa gesprochen. So kann man über die Echo-Dots mit ChatGPT reden. Jetzt müsste man ChatGPT noch mit allen Datenpunkten des IObroker trainieren können und dann würde die KI endlich mal die Rolläden im Sommer runter machen wenn es wirklich notwendig ist ;-) Gruss Ralf

hohmannc85 commented 1 year ago

Ich habe mal mit wenig Aufwand ein Script geschrieben, das das was man Alexa gesagt hat in einen Datenpunkt schreibt. Der wiederum wird an ChatGPT gegeben und die Antwort über den Alexa2 Adapter ausgegeben und von Alexa gesprochen. So kann man über die Echo-Dots mit ChatGPT reden. Jetzt müsste man ChatGPT noch mit allen Datenpunkten des IObroker trainieren können und dann würde die KI endlich mal die Rolläden im Sommer runter machen wenn es wirklich notwendig ist ;-) Gruss Ralf

Poste den doch mal - wäre doch sicher ein Anfang!;-)

derrapf commented 1 year ago

Kann ich machen. Bin aber jetzt grad auf dem Weg nach Kroatien. Wenn ich aus dem Urlaub zurück komme kann ich die relevanten stellen posten. Der gesamte code ist glaub ich zu spezifisch...

hohmannc85 commented 1 year ago

Cool danke.

derrapf commented 1 year ago

So. Hier bin ich wieder. Urlaub vorbei Was ich im Grunde machen ist einen Trigger auf den Datenpunkt alexa2.0.History.json zu prorammieren, damit ich alles mitbekomme was denn da so mit Alexa gemacht wird.

on('alexa2.0.History.json'/*json*/, function (json) {
    log("Alexa-Script: Alexa hat was gemacht: Value" +json.state.val);

    // Parameter json ist ein String; Umwandeln  in ein JSON-Objekt
    var jsonObj = JSON.parse(json.state.val); 
    log("Alexa-Script:     Success/Summary: " +jsonObj.status+"/"+jsonObj.summary);
    log("Alexa-Script: Answer ist:"+jsonObj.answerText);

    //Alexa-Aufruf aus jsonObj.summary in Array umwandeln
    var commandArray = jsonObj.summary.split(" ");
    // Entfernen des WakeWord, falls vorhanden
    var wakeWord = commandArray[0];

    // Name des Alexa-Geräts, das den Befehl empfangen hat
    var deviceName = jsonObj.name.toLowerCase();

    //commandArray muss mindesten ein Befehlswort enthalten
    if (commandArray.length >= 1) {
       if (wakeWords.indexOf(wakeWord) >= 0) {
            commandArray.shift();
        }

            log("Alexa-Script: Echo-Device " + deviceName + ": " + commandArray);
            log("Alexa-Script: Echo-Device " +  commandArray[0]);

            //Verteiler nach dem ersten Befehlswort
            switch (commandArray[0]) {
              case "stopp":
                break;
              case "stop":
                break;
              case "<irgendwas auf das man reagieren möchte>":
                tue_was(deviceName, commandArray);
                break;

             case ...
             case ...   

             default:    
               if (jsonObj.summary != '') {
                  if (
                      jsonObj.answerText="" ||
                      jsonObj.answerText.includes("unterstützt das nicht") ||
                      jsonObj.answerText.includes("Das weiß ich leider nicht") ||
                      jsonObj.answerText.includes("Hilfe und Feedback") ||
                      jsonObj.answerText.includes("Darauf habe ich leider keine Antwort") ||
                      jsonObj.answerText.includes("Ich bin mir leider nicht sicher.")
                     ) {

                     setState("0_userdata.0.Manuelle_Datenpunkte.OpenAI.OpenAIQuestion", jsonObj.summary);
                  } else {
                    log("Alexa-Script: Alexa hat schon selber geantwortet");
                  }
               }
           }
    }
    log("Alexa-Script:END"); 
});

Hier kann man dann die gesprochenen Texte (also das was rlevant ist) aus dem JSON rauslesen. Wenn da aber nichts sinnvolles von Amazon kommt ("Das weiß ich leider nicht" oder so) dann gebe ich den Fragestring an ChatGPT weiter indem ich einen Datenpunkt mit der Frage update:

Den Datenpunkt mit der Frage an OpenAi trigger ich so

const ACCESS_TOKEN = "euerAccessToken";
const MODEL_ID = "text-davinci-002";
//const MODEL_ID = "gpt-3.5-turbo";
const QUESTION_DP_ID = "0_userdata.0.Manuelle_Datenpunkte.OpenAI.OpenAIQuestion";
const ANSWER_DP_ID = "0_userdata.0.Manuelle_Datenpunkte.OpenAI.OpenAIAnswer";
const idOpenAi = "openAi";
var volume = "30"; 
const https = require('https'); 

on({id: QUESTION_DP_ID, change: "ne"}, function (obj) {
  // Get the current value of the question datapoint
  const question = getState(QUESTION_DP_ID).val;
  console.log(`Question: ${question}`);

  // Set the value of the answer datapoint to "no answer available"
  setState(ANSWER_DP_ID, "no answer available");

  // Create the HTTP POST options
  const options = {
    host: 'api.openai.com',
    path: '/v1/completions',
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${ACCESS_TOKEN}`
    }
  };

  // Create the HTTP POST request
  const req = https.request(options, (res) => {
    console.log(`Status: ${res.statusCode}`);
    console.log(`Headers: ${JSON.stringify(res.headers)}`); 
    res.setEncoding('utf8');
    let responseData = '';
    res.on('data', (chunk) => {
      responseData += chunk;
    });
    res.on('end', () => {
      console.log(`Answer: ${responseData}`);
      const responseJson = JSON.parse(responseData);
      if (responseJson.hasOwnProperty('choices')) {
        const answer = responseJson.choices[0].text;
        // Set the value of the answer datapoint to the first answer
        setState(ANSWER_DP_ID, answer);

        // Text über Alexa ausgeben
        Ausgabe(idAlexa, answer);

      }
    });
  });

  req.on('error', (e) => {
    console.error(`Problem with request: ${e.message}`);
  });

  // Send the HTTP POST request
  req.write(JSON.stringify({
    "model": MODEL_ID,
    "prompt": question,
    "max_tokens": 128
  }));
  req.end();
});

Die Funktion zum Ausgabe der Sprache hab hier hier nicht, weil die ziemlich kompliziert ist beim mir. Im Grund müßt ihr abe rnur den Datenpunkt "alexa2.0.Echo-Devices..Commands.speak" beschreiben

hohmannc85 commented 1 year ago

Super probiere ich bei Zeiten mal aus

hohmannc85 commented 1 year ago

Adernapf

So. Hier bin ich wieder. Urlaub vorbei Was ich im Grunde machen ist einen Trigger auf den Datenpunkt alexa2.0.History.json zu prorammieren, damit ich alles mitbekomme was denn da so mit Alexa gemacht wird.

on('alexa2.0.History.json'/*json*/, function (json) {
    log("Alexa-Script: Alexa hat was gemacht: Value" +json.state.val);

    // Parameter json ist ein String; Umwandeln  in ein JSON-Objekt
    var jsonObj = JSON.parse(json.state.val); 
    log("Alexa-Script:     Success/Summary: " +jsonObj.status+"/"+jsonObj.summary);
    log("Alexa-Script: Answer ist:"+jsonObj.answerText);

    //Alexa-Aufruf aus jsonObj.summary in Array umwandeln
    var commandArray = jsonObj.summary.split(" ");
    // Entfernen des WakeWord, falls vorhanden
    var wakeWord = commandArray[0];

    // Name des Alexa-Geräts, das den Befehl empfangen hat
    var deviceName = jsonObj.name.toLowerCase();

    //commandArray muss mindesten ein Befehlswort enthalten
    if (commandArray.length >= 1) {
       if (wakeWords.indexOf(wakeWord) >= 0) {
            commandArray.shift();
        }

            log("Alexa-Script: Echo-Device " + deviceName + ": " + commandArray);
            log("Alexa-Script: Echo-Device " +  commandArray[0]);

            //Verteiler nach dem ersten Befehlswort
            switch (commandArray[0]) {
              case "stopp":
                break;
              case "stop":
                break;
              case "<irgendwas auf das man reagieren möchte>":
                tue_was(deviceName, commandArray);
                break;

             case ...
             case ...   

             default:    
               if (jsonObj.summary != '') {
                  if (
                      jsonObj.answerText="" ||
                      jsonObj.answerText.includes("unterstützt das nicht") ||
                      jsonObj.answerText.includes("Das weiß ich leider nicht") ||
                      jsonObj.answerText.includes("Hilfe und Feedback") ||
                      jsonObj.answerText.includes("Darauf habe ich leider keine Antwort") ||
                      jsonObj.answerText.includes("Ich bin mir leider nicht sicher.")
                     ) {

                     setState("0_userdata.0.Manuelle_Datenpunkte.OpenAI.OpenAIQuestion", jsonObj.summary);
                  } else {
                    log("Alexa-Script: Alexa hat schon selber geantwortet");
                  }
               }
           }
    }
    log("Alexa-Script:END"); 
});

Hier kann man dann die gesprochenen Texte (also das was rlevant ist) aus dem JSON rauslesen. Wenn da aber nichts sinnvolles von Amazon kommt ("Das weiß ich leider nicht" oder so) dann gebe ich den Fragestring an ChatGPT weiter indem ich einen Datenpunkt mit der Frage update:

Den Datenpunkt mit der Frage an OpenAi trigger ich so

const ACCESS_TOKEN = "euerAccessToken";
const MODEL_ID = "text-davinci-002";
//const MODEL_ID = "gpt-3.5-turbo";
const QUESTION_DP_ID = "0_userdata.0.Manuelle_Datenpunkte.OpenAI.OpenAIQuestion";
const ANSWER_DP_ID = "0_userdata.0.Manuelle_Datenpunkte.OpenAI.OpenAIAnswer";
const idOpenAi = "openAi";
var volume = "30"; 
const https = require('https'); 

on({id: QUESTION_DP_ID, change: "ne"}, function (obj) {
  // Get the current value of the question datapoint
  const question = getState(QUESTION_DP_ID).val;
  console.log(`Question: ${question}`);

  // Set the value of the answer datapoint to "no answer available"
  setState(ANSWER_DP_ID, "no answer available");

  // Create the HTTP POST options
  const options = {
    host: 'api.openai.com',
    path: '/v1/completions',
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${ACCESS_TOKEN}`
    }
  };

  // Create the HTTP POST request
  const req = https.request(options, (res) => {
    console.log(`Status: ${res.statusCode}`);
    console.log(`Headers: ${JSON.stringify(res.headers)}`); 
    res.setEncoding('utf8');
    let responseData = '';
    res.on('data', (chunk) => {
      responseData += chunk;
    });
    res.on('end', () => {
      console.log(`Answer: ${responseData}`);
      const responseJson = JSON.parse(responseData);
      if (responseJson.hasOwnProperty('choices')) {
        const answer = responseJson.choices[0].text;
        // Set the value of the answer datapoint to the first answer
        setState(ANSWER_DP_ID, answer);

        // Text über Alexa ausgeben
        Ausgabe(idAlexa, answer);

      }
    });
  });

  req.on('error', (e) => {
    console.error(`Problem with request: ${e.message}`);
  });

  // Send the HTTP POST request
  req.write(JSON.stringify({
    "model": MODEL_ID,
    "prompt": question,
    "max_tokens": 128
  }));
  req.end();
});

Die Funktion zum Ausgabe der Sprache hab hier hier nicht, weil die ziemlich kompliziert ist beim mir. Im Grund müßt ihr abe rnur den Datenpunkt "alexa2.0.Echo-Devices..Commands.speak" beschreiben

läuft! Spitze danke! hab noch ausgelesen welches Alexa dev angesprochen wurde und den speak command an das entsprechende gerät ausgegeben.

derrapf commented 1 year ago

Super Idee. Das könnte ich auch noch erweitern Freut mich dass es geht. Gruss Ralf

hohmannc85 commented 1 year ago

Super Idee. Das könnte ich auch noch erweitern Freut mich dass es geht. Gruss Ralf

Wie hast du das Problem gelöst dass die Antworten so lang sind dass Alexa sie dann nicht ausgibt? Die Anfrage auf 30 Wörter begrenzt? Oder Nachricht aufgeteilt?

ELK169 commented 1 year ago

Wie hast du das Problem gelöst dass die Antworten so lang sind dass Alexa sie dann nicht ausgibt? Die Anfrage auf 30 Wörter begrenzt? Oder Nachricht aufgeteilt?

Moin! Falls es noch interessiert: Wenn du statt dem speak-Datenpunkt den ssml-Datenpunkt nimmst (mit \<speak> davor und \</speak> dahinter), funktionieren auch etwas längere Texte.

Was mich verwirrt ist die Qualität der Ausgabe, z.T. meiner Ansicht nach komplett irre und nicht so, wie ich es aus dem ChatGPT per Browser kenne. Z.B. "Formuliere eine Ansage zu den folgenden Temperaturen: Außen 28°, Küche 25°, Garage 22°" ergibt eine gute, ordentlich formulierte Ansage (abgesehen davon, dass sie bei mir mit Punkt und Leerzeile beginnt). Dann versuchte ich es mit "Außentemperatur 28°" (ahnend, dass das Ergebnis nicht toll sein wird und eher aus einer Rückfrage besteht), und es kam ein langer Text, in dem Firmennamen, Rohrdurchmesser, T-Shirt-Größen und -Beschreibungen und technische Daten eines Fire TV vorkamen. Jedenfalls nichts, was irgendwie sinnreich zu gebrauchen wäre. Wo liegt das (mein) Problem?

hohmannc85 commented 1 year ago

Hallo! Wie lang geht denn die Aussage dann? Äh ja bei mir kam nur Müll in der Abfrage raus, ich hab es mir komplett neu gemacht und nun gehts gut 🤣

ELK169 commented 1 year ago

ich hab jetzt nicht die Worte gezählt, aber sie hat schon eine Minute geredet… SSML ist eh interessant, weil man dort auch Geschwindigkeit, Tonlage usw. beeinflussen kann. Was meinst du mit „komplett neu gemacht“ genau?

hohmannc85 commented 1 year ago

Ich hab mir nen eigenen chatgpt Skript gemacht und da kommt jetzt kein Unsinn mehr raus

ELK169 commented 1 year ago

oh… magst du das hier teilen? Ich hatte die Vermutung, dass eine Einstellung (was mit „DaVinci“…) anders vielleicht besser sein könnte.

hohmannc85 commented 1 year ago

ich habe einen Datenpunkt mit frage und Antwort; vergiss nicht den api code! ich habe bei assistant es auf 30 Wörter begrenzt, das kannst du rausnehmen, wenn es mit deiner Methode besser geht!

wenn du bei Message unten das hier einträgst: messages: [{ role: 'system', content: 'Du bist SwagGPT, ein eher unfreundlicher, aber dafür umso sqggiger Chatbot Du bist der Weltbeste Rapper, wie Moneyboy. Benutze Füllwörter wie "sheesh", "Diggi", "turn up". Ersetze "ein" immer durch "1". Benutze "vong" für "von".' },

dann kriegst du einen geilen Rapper, der dir antwortet xD habe ich von dem Video CT3003 übernommen. ist sehr lustig, habe ich bei einem freund so eingerichtet:)

const axios = require('axios'); var CHAT_HISTORY = "0_userdata.0.OpenAI.Chatverlauf"; var QUESTION_DP_ID = "0_userdata.0.OpenAI.neue_Frage"; var ANSWER_DP_ID = "0_userdata.0.OpenAI.neue_Antwort"; var LAST_INFO = "0_userdata.0.OpenAI.lastinfo";

let chatHistory = []; // Variable zum Speichern des Chatverlaufs

on({id: QUESTION_DP_ID, change: "ne"}, function (obj) { // Get the current value of the question datapoint const question = getState(QUESTION_DP_ID).val; const oldquestion = getState(QUESTION_DP_ID).val; console.log(Question: ${question});

let lastRequestTime = getState(LAST_INFO).val;

// Funktion zum Löschen des Chatverlaufs function clearChatHistory() { chatHistory = []; }

const MAX_INACTIVE_TIME = 2 60 1000; // 2 Minuten in Millisekunden

// Funktion zum Prüfen und Löschen des Chatverlaufs bei Inaktivität function checkAndClearChatHistory() { const currentTime = Date.now(); const lastRequestTimeNum = parseInt(lastRequestTime);

if (currentTime - lastRequestTimeNum > MAX_INACTIVE_TIME) { log('Inhalt wird gelöscht:' + chatHistory); clearChatHistory();

} }

async function sendChatGPTRequest(message) {

// Überprüfe und lösche den Chatverlauf bei Inaktivität checkAndClearChatHistory(); let currentTime = Date.now(); log('HistoryInhalt:' + chatHistory); setState(LAST_INFO, currentTime); try { const response = await axios.post('https://api.openai.com/v1/chat/completions', { model: 'gpt-3.5-turbo', // model: 'text-davinci-002', messages: [{ role: 'system', content: 'You are a helpful assistant.' }, ...chatHistory, { role: 'user', content: message + ' Antworte in maximal 30 Wörtern.' }], max_tokens: 128, // Begrenze die Antwort auf 128 Tokens }, { headers: { 'Authorization': 'Bearer **HIER DEIN API CODE*****', 'Content-Type': 'application/json', }, });

const { choices } = response.data;
const reply = choices[0].message.content;

// Speichere die aktuelle Benutzerantwort in der Chat-Historie
chatHistory.push({ role: 'user', content: message });
// Speichere die generierte Antwort des Modells in der Chat-Historie
chatHistory.push({ role: 'assistant', content: reply });

return reply;

} catch (error) { console.error('Error:', error.response.data); throw error; } }

// Beispielanfrage an die Chat API

sendChatGPTRequest(question) .then(reply => { console.log('Antwort:' + reply); setState(ANSWER_DP_ID, reply); }) .catch(error => { console.error('Fehler:' + error); });

}); // Ende ON

ELK169 commented 1 year ago

sehr vielen Dank! Werde ich die Tage ausprobieren. Die Begrenzung der Ausgabe finde ich auch sehr gut, damit ein verbaler Amoklauf vom ChatGPT nicht teuer wird.

PS: bei mir gehen mit speak nur 27 Wörter… hängt evtl. noch von was anderem ab. Und: im Gegensatz zu speak werden Ausgaben bei ssml hintereinandergehängt, es wird also nicht die erste Ausgabe abgebrochen.

hohmannc85 commented 1 year ago

ah klingt gut! ich habs jetzt auf 100 begrenzt und werde es testen! ich danke dir auch für den coolen Hinweis!

derrapf commented 1 year ago

Ich glaube wenn man in den Text den man an den Datenpunkt speak gibt alle 256 Zeichen einen ";" einbaut kann man auch längere Text ansagen lassen. Ich hab mir da eine Funkiton von ChtGPT prorammieren lassen die diese Semikolon in einen langen Text einbaut: `/**

Gruss Ralf

derrapf commented 1 year ago

Inzwischen sind bei mir die Quotas ausgelaufen. Habt ihr das was gekauft? Wenn ja welches Modell?

tical40 commented 1 year ago

hello everyone, have you made any progress with the instance for iobroker? i've got the chatgpt voice assistant working so far but it would be cool if there was an instance to link it to. greetings

ChrisPrefect commented 1 year ago

Wie ist der Status dieses Projektes? Wird es irgendwann einen GPT4-Adapter geben, der auch Zugriff auf den Objektbaum hat? Er sollte ja selbst z.B. alle Hue-Lampen erkennen und auf die Anweisung „mach mal Party!“ die Lichter sinnvoll steuern.

DutchmanNL commented 1 year ago

Wie ist der Status dieses Projektes? Wird es irgendwann einen GPT4-Adapter geben, der auch Zugriff auf den Objektbaum hat? Er sollte ja selbst z.B. alle Hue-Lampen erkennen und auf die Anweisung „mach mal Party!“ die Lichter sinnvoll steuern.

In der letzten Release vom JavaScript Adapter gibt es eine chatgpt Implementierung

tical40 commented 1 year ago

Sorry die Frage aber was heißt das konkret? Lg

ChrisPrefect commented 1 year ago

Ich habe gefunden, was DutchmanNL meinte: https://www.youtube.com/watch?v=OigIpE3Aez0

Das hat aber nichts mit der Idee hier zu tun, das ist nur ein integrierter Javascript-Code-Generator für die Skripte.

mcm1957 commented 1 year ago

Bitte beim Thema bleiben. Dinge die nicht in Zusammenhang mit einem ioBroker chatGPT Adapter stehen bitte woanders diskutieren. Das Topic wird sonst unnötig groß.

ChrisPrefect commented 1 year ago

Das habe ich ja genau erklärt in meinen Kommentar, dass der Hinweis von DutchmannNL eben off-topic war. Du hast den falschen Kommentar off-topic markiert.

ChrisPrefect commented 1 year ago

GPT4 Turbo wurde gerade vorgestellt: https://www.youtube.com/live/U9mJuUkhUzk

Das hat viele Erweiterungen die für einen ioBroker-GPT4-Adapter hilfreich sind, wie grösserer Kontext (128k), json-Response und multiple functions calling, custom GPTs usw.

Neu kann man direkt custom GPTs und Assistenten generieren, die dann den Kontext selbst behalten, er also nicht immer mitgeschickt werden muss. Eigentlich ideal für einen ioBroker-Adapter.

Die Implementierung sollte nicht zu komplex sein. Die Anfrage per Alexa entgegen nehmen, einen komprimierten Objektbaum als Kontext mitschicken und die Property-Änderungen per json zurückerhalten.

kopierschnitte commented 1 year ago

Sollte man nicht schon frühzeitig auch im Hinterkopf haben, LocalAI mit einzubeziehen?

Meines Wissens nach ist die API identisch.

GianfrancoSinistra commented 10 months ago

Hey Leute, hat sich nun schon jemand die Mühe gemacht, aus den ganzen prachtvollen Ideen einen Adapter zu machen? Wäre schon nice. :-)

Flixhummel commented 2 months ago

Hallo, alles tolle Ideen hier :-) würde gerne auch eine llm integration in iObroker haben um gewisse abläufe zu automatisieren und intelligenter zu machen. Spass macht es dann, wenn die prompts, die man in ein solches llm schickt so konkret und detailliert sind, dass das LLM entsprechend sinnvolle Antworten zurückschickt. Was es also bräuchte als Iobroker adapter wäre eine "prompt template engine" mit der man prompt templates für die oben beschriebenen Automatisierungs-Anwendungen schreiben kann. Diese Prompt-Templates könnte man dann immer wieder verwenden und mit verschiedenen actions aus dem Smarthome triggern. in der prompt template engine kann man nicht nur prompts schreiben, sondern diese auch "grounden", das heißt mit konkreten Datenpunkten aus dem Smarthome anreichern. Wird der prompt dann zur Laufzeit ausgeführt, so werden die aktuellen Werte der Datenpunkte in den Prompt geschrieben und dann an das LLM geschickt.

schaut Euch mal bitte an, wie Salesforce dies für use cases im Marketing, Sales und Service umsetzt: https://help.salesforce.com/s/articleView?id=sf.generative_ai_trust_arch.htm&type=5 neben dem prompt schreiben gibt es auch funktionen für "secure data retrieval & Grounding", "data masking" und "prompt defense" auf dem hinweg und "Toxicity detection", "Data demasking" und "Audit Trail" auf dem Rückweg vom llm. hier kann man sich auch eine Testumgebung bauen um das selbst mal auszuprobieren: https://trailhead.salesforce.com/de/content/learn/projects/quick-start-prompt-builder/get-started-with-prompt-builder

um das problem von @ELK169 oben zu lösen kann man im prompt template dann auch anweisungen geben, wie lang der ausgabetext werden kann im prompt template auch eine token obergrenze für die Antwort eingestellt werden.

also wenn sich jemand an die STruktur eines solchen Adapters macht. dann wäre es super wenn man einige der bei Salesforce verfügbaren dinge mit einbaut. (ob man jetzt ausgereifte Toxicity detection oder audit trail braucht sei dahin gestellt.). Aber evtl. ein Masking/ Demasking mechanismus, so dass man den namen seiner Datenpunkte und geräte nicht dem LLM verraten muss und diese trotzdem auf der Return journey wieder spezifisch angesprochen werden können.

a la: prompt: Die Luftfeuchtigkeit drinnen im {Wohnzimmer} beträgt {90%} bei einer Temperatur von {20°C}. Die Außentemperatur beträgt {16°C} bei einer Luftfeuchtigkeit von {50%}. Finde heraus ob die Absolute luftfeuchtigkeit draußen geringer als drinnen ist und ob es sich lohnt die {Dachfenster} zum lüften zu öffnen.

und was natürlich schön wäre, wenn man im Adapter konfigurieren könnte zu welchem LLM man sich verbindet. das wär a traum.

was meint ihr dazu?

kopierschnitte commented 2 months ago

Ja, das klingt doch schon sehr detailliert ;-) Spontan möchte ich nur anmerken, dass wir frühzeitig daran denken, nicht OpenAI fest zu "verdrahten" und damit auch Alternativen eine Chance geben. Wenn man sich an die API hält sollte das aber stressfrei sein, oder?