diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..723ef36f4e4f32c4560383aa5987c575a30c6535
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+.idea
\ No newline at end of file
diff --git a/german-law-journal-network/.gitignore b/german-law-journal-network/.gitignore
index a1e6db269002e78355e1b70a6613bbb187cb568e..c88b8224acb3079d4748cfe23e57cfc23c59717c 100644
--- a/german-law-journal-network/.gitignore
+++ b/german-law-journal-network/.gitignore
@@ -1,3 +1,2 @@
-../.idea
-!.gitignore
+.*
 !.env.dist
\ No newline at end of file
diff --git a/german-law-journal-network/identify-editors-with-llm.ipynb b/german-law-journal-network/identify-editors-with-llm.ipynb
index 2f532341dd28fe2a8ff300d24558e8ac0100ae29..e9c14528d35e4922a02539e86b9dc18581202c1e 100644
--- a/german-law-journal-network/identify-editors-with-llm.ipynb
+++ b/german-law-journal-network/identify-editors-with-llm.ipynb
@@ -108,7 +108,7 @@
     "journal_name = \"Kritische Vierteljahresschrift für Gesetzgebung und Rechtswissenschaft\"\n",
     "instruction = f\"Finde im folgenden Text die Herausgeber, Redaktion/Schriftleitung und Beirat der Zeitschrift '{journal_name}' und gebe sie im CSV-Format zurück mit den Spalten 'lastname', 'firstname', 'title', 'position', 'affiliation','role'. Die Spalte 'role' enthält entweder 'Herausgeber', 'Redaktion', 'Beirat', 'Schriftleitung' oder ist leer wenn nicht bestimmbar. Wenn keine passenden Informationen verfügbar sind, gebe nur den CSV-Header zurück. Setze alle Werte in den CSV-Spalten in Anführungszeichen.\"\n",
     "\n",
-    "google_query = f'{journal_name} (herausgeber | redaktion | beirat)'\n",
+    "google_query = f'{journal_name} intext:herausgeber|herausgegeben|redakt|schriftleit|beirat'\n",
     "urls = run_google_search(google_query, lang=\"de\", exclude=['jstor.org'], num_results=1)\n",
     "website_data = download(urls[0]) # get the content of the first website found\n",
     "# compare performance of different GPT models\n",
diff --git a/langchain-experiments/.env.dist b/langchain-experiments/.env.dist
new file mode 100644
index 0000000000000000000000000000000000000000..f8410922d452061a5cd6a786334cd3bf0041bb72
--- /dev/null
+++ b/langchain-experiments/.env.dist
@@ -0,0 +1,2 @@
+OPENAI_API_KEY=''
+HUGGINGFACEHUB_API_TOKEN=''
\ No newline at end of file
diff --git a/langchain-experiments/.gitignore b/langchain-experiments/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..1494b430dbd89191f822fdd29115b9c5d9319bf1
--- /dev/null
+++ b/langchain-experiments/.gitignore
@@ -0,0 +1,3 @@
+.*
+!.gitignore
+!.env.dist
\ No newline at end of file
diff --git a/langchain-experiments/compare-models.ipynb b/langchain-experiments/compare-models.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..d6f8a3034c6f13365930d93e66e8a07d2b2342b9
--- /dev/null
+++ b/langchain-experiments/compare-models.ipynb
@@ -0,0 +1,309 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "source": [
+    "# Comparing OpenAI and open LLMs\n",
+    "\n",
+    "Using the [text-only content of the website of the journal AUR - Agrar- und Umweltrecht](data/input/journal-website.txt), \n",
+    "we compare the performance of GPT-4, GPT-3.5-turbo and Models available on Huggingface.\n",
+    "\n",
+    "## Preparation\n",
+    "\n",
+    "Import dependencies, define shorthand functions, and prepare test data"
+   ],
+   "metadata": {
+    "collapsed": false
+   },
+   "id": "396ebd275b60c720"
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "outputs": [],
+   "source": [
+    "import io\n",
+    "from langchain_core.prompts import ChatPromptTemplate\n",
+    "from langchain_openai import ChatOpenAI\n",
+    "from langchain_core.output_parsers import StrOutputParser\n",
+    "import pandas as pd\n",
+    "from dotenv import load_dotenv\n",
+    "\n",
+    "load_dotenv()\n",
+    "\n",
+    "def response_to_df(response):\n",
+    "    data = io.StringIO(response)\n",
+    "    try:\n",
+    "        return pd.read_csv(data)\n",
+    "    except:\n",
+    "        raise RuntimeError(f\"Error while parsing response:\\n{response}\")\n",
+    "\n",
+    "def use_model(model, template, **params):\n",
+    "    prompt = ChatPromptTemplate.from_template(template)\n",
+    "    chain = (\n",
+    "            prompt\n",
+    "            | model\n",
+    "            | StrOutputParser()\n",
+    "    )\n",
+    "    return response_to_df(chain.invoke(params))\n",
+    "\n",
+    "with open('data/input/journal-website.txt', encoding='utf-8') as f:\n",
+    "    website_text = f.read()\n",
+    "journal_name = \"AUR - Agrar- und Umweltrecht\""
+   ],
+   "metadata": {
+    "collapsed": false,
+    "ExecuteTime": {
+     "end_time": "2024-01-17T19:43:14.633251500Z",
+     "start_time": "2024-01-17T19:43:07.158102900Z"
+    }
+   },
+   "id": "e46d0648c1c6c96a"
+  },
+  {
+   "cell_type": "markdown",
+   "source": [
+    "## Prompt\n",
+    "\n",
+    "OpenAI's GPT-4 works perfectly with a minimal, German-language prompt, and infers the meaning of the columns\n",
+    "to returns the data we need:\n",
+    "\n",
+    "```\n",
+    "Finde im folgenden Text die Herausgeber, Redaktion/Schriftleitung und Beirat der Zeitschrift '{journal_name}' und gebe sie im CSV-Format zurück mit den Spalten 'lastname', 'firstname', 'title', 'position', 'affiliation','role'. Die Spalte 'role' enthält entweder 'Herausgeber', 'Redaktion', 'Beirat', 'Schriftleitung' oder ist leer wenn nicht bestimmbar. Wenn keine passenden Informationen verfügbar sind, gebe nur den CSV-Header zurück. Setze alle Werte in den CSV-Spalten in Anführungszeichen.\"\n",
+    "````\n",
+    "\n",
+    "\n",
+    "In contrast, the open models performed miserably with such a prompt. We therefore use English and provide very detailed instructions.  "
+   ],
+   "metadata": {
+    "collapsed": false
+   },
+   "id": "eb805270480fbfb5"
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "outputs": [],
+   "source": [
+    "template = \"\"\"\n",
+    "In the following German text, which was scraped from a website, find the members of the editorial board or the advisory board of the journal '{journal_name}' as per the following rules:\n",
+    "- In German, typical labels for these roles are \"Herausgeber\", \"Redaktion/Redakteur/Schriftleitung\" and \"Beirat\".  \n",
+    "- Return the data as comma-separated values, which can be saved to a `.csv` file. Put all values in the CSV rows in quotes. \n",
+    "- The CSV data must have the columns 'lastname', 'firstname', 'title', 'position', 'affiliation','role'. \n",
+    "- The column 'role' must contain either 'Herausgeber', 'Redaktion', 'Beirat' or is empty. Leave the column empty if you cannot determine the role. Use 'Redaktion' for the \"Schriftleitung\" role.\n",
+    "- The column 'title' should contain academic titles such as \"Dr.\" or \"Prof. Dr.\"\n",
+    "- The column 'position' should contain the job title\n",
+    "- The column 'affiliation' contains the institution or organization the person belongs to, or the city if one is mentioned\n",
+    "- If the journal is published (\"herausgeben von\") by an association, institute or other organization, but its name in the column 'lastname'. \n",
+    "- If you cannot find any information, simply return the CSV header. \n",
+    "- You must not output any introduction, commentary or explanation such as 'Here is the CSV data for the members of the editorial board or the advisory board of the journal'. Only return the data.\n",
+    "\n",
+    "{website_text}\n",
+    "\"\"\""
+   ],
+   "metadata": {
+    "collapsed": false,
+    "ExecuteTime": {
+     "end_time": "2024-01-17T20:46:02.624154500Z",
+     "start_time": "2024-01-17T20:46:02.598111600Z"
+    }
+   },
+   "id": "23aef80911796078"
+  },
+  {
+   "cell_type": "markdown",
+   "source": [
+    "## ChatGPT-4 \n",
+    "\n",
+    "GPT-4 delivers an almost perfect [result](data/output/editors-openai-gpt-4.csv). There are some problems left which could be resolved by adding some more instructions to the prompt. \n",
+    "\n"
+   ],
+   "metadata": {
+    "collapsed": false
+   },
+   "id": "8f994c771cc9b4ef"
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "outputs": [
+    {
+     "data": {
+      "text/plain": "         lastname   firstname      title  \\\n0            DGAR         NaN        NaN   \n1           Busse   Christian        Dr.   \n2          Endres       Ewald  Prof. Dr.   \n3        Francois    Matthias        Dr.   \n4   von Garmissen       Bernd        Dr.   \n5            Glas        Ingo        NaN   \n6            Graß  Christiane        NaN   \n7      Haarstrich        Jens        NaN   \n8            Koch       Erich        Dr.   \n9            Köpl   Christian        Dr.   \n10       Martinez        Jose  Prof. Dr.   \n11           Nies     Volkmar        NaN   \n12       Stephany        Ralf        NaN   \n13      Wedemeyer      Harald        NaN   \n14       Martinez        José  Prof. Dr.   \n15           Nies     Volkmar        LLD   \n\n                                position  \\\n0   Deutsche Gesellschaft für Agrarrecht   \n1                     Regierungsdirektor   \n2                                    NaN   \n3                           Rechtsanwalt   \n4                           Rechtsanwalt   \n5                           Rechtsanwalt   \n6                         Rechtsanwältin   \n7                           Rechtsanwalt   \n8               Ltd. Verwaltungsdirektor   \n9                         Ministerialrat   \n10                                   NaN   \n11          Ltd. Landwirtschaftsdirektor   \n12            Rechtsanwalt/Steuerberater   \n13                          Rechtsanwalt   \n14                  Erster Schriftleiter   \n15                 Zweiter Schriftleiter   \n\n                                          affiliation         role  \n0                                                 NaN  Herausgeber  \n1   Bundesministerium für Ernährung und Landwirtsc...    Redaktion  \n2        Hochschule Weihenstephan-Triesdorf, Freising    Redaktion  \n3                                             Bitburg    Redaktion  \n4                                           Göttingen    Redaktion  \n5                                             Rostock    Redaktion  \n6                                                Bonn    Redaktion  \n7                                               Peine    Redaktion  \n8   Sozialversicherung für Landwirtschaft, Forsten...    Redaktion  \n9   Bayerisches Staatsministerium für Ernährung, L...    Redaktion  \n10  Institut für Landwirtschaftsrecht, Georg-Augus...    Redaktion  \n11                    Landwirtschaftskammer NRW, Bonn    Redaktion  \n12                                               Bonn    Redaktion  \n13                   Landvolk Niedersachsen, Hannover    Redaktion  \n14       Institut für Landwirtschaftsrecht, Göttingen    Redaktion  \n15                                       50170 Kerpen    Redaktion  ",
+      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>lastname</th>\n      <th>firstname</th>\n      <th>title</th>\n      <th>position</th>\n      <th>affiliation</th>\n      <th>role</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>DGAR</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>Deutsche Gesellschaft für Agrarrecht</td>\n      <td>NaN</td>\n      <td>Herausgeber</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>Busse</td>\n      <td>Christian</td>\n      <td>Dr.</td>\n      <td>Regierungsdirektor</td>\n      <td>Bundesministerium für Ernährung und Landwirtsc...</td>\n      <td>Redaktion</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>Endres</td>\n      <td>Ewald</td>\n      <td>Prof. Dr.</td>\n      <td>NaN</td>\n      <td>Hochschule Weihenstephan-Triesdorf, Freising</td>\n      <td>Redaktion</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>Francois</td>\n      <td>Matthias</td>\n      <td>Dr.</td>\n      <td>Rechtsanwalt</td>\n      <td>Bitburg</td>\n      <td>Redaktion</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>von Garmissen</td>\n      <td>Bernd</td>\n      <td>Dr.</td>\n      <td>Rechtsanwalt</td>\n      <td>Göttingen</td>\n      <td>Redaktion</td>\n    </tr>\n    <tr>\n      <th>5</th>\n      <td>Glas</td>\n      <td>Ingo</td>\n      <td>NaN</td>\n      <td>Rechtsanwalt</td>\n      <td>Rostock</td>\n      <td>Redaktion</td>\n    </tr>\n    <tr>\n      <th>6</th>\n      <td>Graß</td>\n      <td>Christiane</td>\n      <td>NaN</td>\n      <td>Rechtsanwältin</td>\n      <td>Bonn</td>\n      <td>Redaktion</td>\n    </tr>\n    <tr>\n      <th>7</th>\n      <td>Haarstrich</td>\n      <td>Jens</td>\n      <td>NaN</td>\n      <td>Rechtsanwalt</td>\n      <td>Peine</td>\n      <td>Redaktion</td>\n    </tr>\n    <tr>\n      <th>8</th>\n      <td>Koch</td>\n      <td>Erich</td>\n      <td>Dr.</td>\n      <td>Ltd. Verwaltungsdirektor</td>\n      <td>Sozialversicherung für Landwirtschaft, Forsten...</td>\n      <td>Redaktion</td>\n    </tr>\n    <tr>\n      <th>9</th>\n      <td>Köpl</td>\n      <td>Christian</td>\n      <td>Dr.</td>\n      <td>Ministerialrat</td>\n      <td>Bayerisches Staatsministerium für Ernährung, L...</td>\n      <td>Redaktion</td>\n    </tr>\n    <tr>\n      <th>10</th>\n      <td>Martinez</td>\n      <td>Jose</td>\n      <td>Prof. Dr.</td>\n      <td>NaN</td>\n      <td>Institut für Landwirtschaftsrecht, Georg-Augus...</td>\n      <td>Redaktion</td>\n    </tr>\n    <tr>\n      <th>11</th>\n      <td>Nies</td>\n      <td>Volkmar</td>\n      <td>NaN</td>\n      <td>Ltd. Landwirtschaftsdirektor</td>\n      <td>Landwirtschaftskammer NRW, Bonn</td>\n      <td>Redaktion</td>\n    </tr>\n    <tr>\n      <th>12</th>\n      <td>Stephany</td>\n      <td>Ralf</td>\n      <td>NaN</td>\n      <td>Rechtsanwalt/Steuerberater</td>\n      <td>Bonn</td>\n      <td>Redaktion</td>\n    </tr>\n    <tr>\n      <th>13</th>\n      <td>Wedemeyer</td>\n      <td>Harald</td>\n      <td>NaN</td>\n      <td>Rechtsanwalt</td>\n      <td>Landvolk Niedersachsen, Hannover</td>\n      <td>Redaktion</td>\n    </tr>\n    <tr>\n      <th>14</th>\n      <td>Martinez</td>\n      <td>José</td>\n      <td>Prof. Dr.</td>\n      <td>Erster Schriftleiter</td>\n      <td>Institut für Landwirtschaftsrecht, Göttingen</td>\n      <td>Redaktion</td>\n    </tr>\n    <tr>\n      <th>15</th>\n      <td>Nies</td>\n      <td>Volkmar</td>\n      <td>LLD</td>\n      <td>Zweiter Schriftleiter</td>\n      <td>50170 Kerpen</td>\n      <td>Redaktion</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "model = ChatOpenAI(model_name=\"gpt-4\")\n",
+    "df = use_model(model, template, journal_name=journal_name, website_text=website_text)\n",
+    "df.to_csv('data/output/editors-openai-gpt-4.csv')\n",
+    "df"
+   ],
+   "metadata": {
+    "collapsed": false,
+    "ExecuteTime": {
+     "end_time": "2024-01-17T19:43:51.821749100Z",
+     "start_time": "2024-01-17T19:43:22.643583400Z"
+    }
+   },
+   "id": "initial_id"
+  },
+  {
+   "cell_type": "markdown",
+   "source": [
+    "## ChatGPT 3.5-turbo\n",
+    "\n",
+    "GPT-3.5 [performs less well](data/output/editors-openai-gpt-3.5-turbo.csv), but still ok. It gets some of the 'title' amd 'position' \n",
+    "column data confused, and does not recognize the institutional publisher (Herausgeber) of the journal. \n"
+   ],
+   "metadata": {
+    "collapsed": false
+   },
+   "id": "9cef77bb17d57b53"
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "outputs": [
+    {
+     "data": {
+      "text/plain": "         lastname   firstname                         title  \\\n0           Busse   Christian                           Dr.   \n1          Endres       Ewald                     Prof. Dr.   \n2        Francois    Matthias                           Dr.   \n3   von Garmissen       Bernd                           Dr.   \n4            Glas        Ingo                           NaN   \n5            Graß  Christiane                Rechtsanwältin   \n6      Haarstrich        Jens                  Rechtsanwalt   \n7            Koch       Erich                           Dr.   \n8            Köpl   Christian                           Dr.   \n9        Martinez        Jose                     Prof. Dr.   \n10           Nies     Volkmar  Ltd. Landwirtschaftsdirektor   \n11       Stephany        Ralf    Rechtsanwalt/Steuerberater   \n12      Wedemeyer      Harald                  Rechtsanwalt   \n\n                    position  \\\n0         Regierungsdirektor   \n1                        NaN   \n2               Rechtsanwalt   \n3               Rechtsanwalt   \n4               Rechtsanwalt   \n5                        NaN   \n6                        NaN   \n7   Ltd. Verwaltungsdirektor   \n8             Ministerialrat   \n9                        NaN   \n10                       NaN   \n11                       NaN   \n12                       NaN   \n\n                                          affiliation       role  \n0   Bundesministerium für Ernährung und Landwirtsc...  Redaktion  \n1        Hochschule Weihenstephan-Triesdorf, Freising  Redaktion  \n2                                             Bitburg  Redaktion  \n3                                           Göttingen  Redaktion  \n4                                             Rostock  Redaktion  \n5                                                Bonn  Redaktion  \n6                                               Peine  Redaktion  \n7   Sozialversicherung für Landwirtschaft, Forsten...  Redaktion  \n8   Bayerisches Staatsministerium für Ernährung, L...  Redaktion  \n9   Institut für Landwirtschaftsrecht, Georg-Augus...  Redaktion  \n10                    Landwirtschaftskammer NRW, Bonn  Redaktion  \n11                                               Bonn  Redaktion  \n12                   Landvolk Niedersachsen, Hannover  Redaktion  ",
+      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>lastname</th>\n      <th>firstname</th>\n      <th>title</th>\n      <th>position</th>\n      <th>affiliation</th>\n      <th>role</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>Busse</td>\n      <td>Christian</td>\n      <td>Dr.</td>\n      <td>Regierungsdirektor</td>\n      <td>Bundesministerium für Ernährung und Landwirtsc...</td>\n      <td>Redaktion</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>Endres</td>\n      <td>Ewald</td>\n      <td>Prof. Dr.</td>\n      <td>NaN</td>\n      <td>Hochschule Weihenstephan-Triesdorf, Freising</td>\n      <td>Redaktion</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>Francois</td>\n      <td>Matthias</td>\n      <td>Dr.</td>\n      <td>Rechtsanwalt</td>\n      <td>Bitburg</td>\n      <td>Redaktion</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>von Garmissen</td>\n      <td>Bernd</td>\n      <td>Dr.</td>\n      <td>Rechtsanwalt</td>\n      <td>Göttingen</td>\n      <td>Redaktion</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>Glas</td>\n      <td>Ingo</td>\n      <td>NaN</td>\n      <td>Rechtsanwalt</td>\n      <td>Rostock</td>\n      <td>Redaktion</td>\n    </tr>\n    <tr>\n      <th>5</th>\n      <td>Graß</td>\n      <td>Christiane</td>\n      <td>Rechtsanwältin</td>\n      <td>NaN</td>\n      <td>Bonn</td>\n      <td>Redaktion</td>\n    </tr>\n    <tr>\n      <th>6</th>\n      <td>Haarstrich</td>\n      <td>Jens</td>\n      <td>Rechtsanwalt</td>\n      <td>NaN</td>\n      <td>Peine</td>\n      <td>Redaktion</td>\n    </tr>\n    <tr>\n      <th>7</th>\n      <td>Koch</td>\n      <td>Erich</td>\n      <td>Dr.</td>\n      <td>Ltd. Verwaltungsdirektor</td>\n      <td>Sozialversicherung für Landwirtschaft, Forsten...</td>\n      <td>Redaktion</td>\n    </tr>\n    <tr>\n      <th>8</th>\n      <td>Köpl</td>\n      <td>Christian</td>\n      <td>Dr.</td>\n      <td>Ministerialrat</td>\n      <td>Bayerisches Staatsministerium für Ernährung, L...</td>\n      <td>Redaktion</td>\n    </tr>\n    <tr>\n      <th>9</th>\n      <td>Martinez</td>\n      <td>Jose</td>\n      <td>Prof. Dr.</td>\n      <td>NaN</td>\n      <td>Institut für Landwirtschaftsrecht, Georg-Augus...</td>\n      <td>Redaktion</td>\n    </tr>\n    <tr>\n      <th>10</th>\n      <td>Nies</td>\n      <td>Volkmar</td>\n      <td>Ltd. Landwirtschaftsdirektor</td>\n      <td>NaN</td>\n      <td>Landwirtschaftskammer NRW, Bonn</td>\n      <td>Redaktion</td>\n    </tr>\n    <tr>\n      <th>11</th>\n      <td>Stephany</td>\n      <td>Ralf</td>\n      <td>Rechtsanwalt/Steuerberater</td>\n      <td>NaN</td>\n      <td>Bonn</td>\n      <td>Redaktion</td>\n    </tr>\n    <tr>\n      <th>12</th>\n      <td>Wedemeyer</td>\n      <td>Harald</td>\n      <td>Rechtsanwalt</td>\n      <td>NaN</td>\n      <td>Landvolk Niedersachsen, Hannover</td>\n      <td>Redaktion</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "model = ChatOpenAI(model_name=\"gpt-3.5-turbo\")\n",
+    "df = use_model(model, template, journal_name=journal_name, website_text=website_text)\n",
+    "df.to_csv('data/output/editors-openai-gpt-3.5-turbo.csv')\n",
+    "df"
+   ],
+   "metadata": {
+    "collapsed": false,
+    "ExecuteTime": {
+     "end_time": "2024-01-17T19:46:04.139744300Z",
+     "start_time": "2024-01-17T19:45:46.825487Z"
+    }
+   },
+   "id": "e1aedc5ef3cab564"
+  },
+  {
+   "cell_type": "markdown",
+   "source": [
+    "Now, let's try the open models via the Huggingface Inference Endpoint. For this to work, you need to deploy\n",
+    "endpoints via https://ui.endpoints.huggingface.co/ and update the value of `enpoint_url` below."
+   ],
+   "metadata": {
+    "collapsed": false
+   },
+   "id": "31084716e138fe06"
+  },
+  {
+   "cell_type": "markdown",
+   "source": [
+    "## TheBloke/Llama-2-13B-chat-GPTQ \n",
+    "\n",
+    "The [LLama2 13 billion parameter model](https://huggingface.co/TheBloke/Llama-2-13B-chat-GPTQ) produces [unusuable output](data/output/editors-llama-2-13b-chat-gptq.txt)."
+   ],
+   "metadata": {
+    "collapsed": false
+   },
+   "id": "90ce37abf037e19f"
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "outputs": [
+    {
+     "data": {
+      "text/plain": "['Martinez, Dr. Christian Busse, Bundesministerium für Ernährung und Landwirtschaft, Bonn Agrarprodukt Recht',\n 'Prof. Dr. Ewald Endres, Hochschule Weihenstephan-Triesdorf Freising Forsting Forsting, Jagd, Fischerei, Fischerei',\n 'Lawyeranwalt Ingo Glas, Bitburg Boden Recht',\n 'Christiane Grass, Bonn Agrarzivil Recht',\n 'Jens Haarstrich, Peine Redaktionär, Rostock',\n 'Prof. Dr. Bernd von Garmissen, Göttingen Erb, Redaktion, Umwelt',\n 'Ltdr. Jose Martinez, Georg-August-Universität Göttingen, Göttingen',\n '',\n '',\n \"Note: The column 'Role' contains the following values: 'Herausgeber', 'Redaktion', 'Beirat'\"]"
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "from lib.hf_llama2_chat_gptq import query\n",
+    "llama2_template = f\"<s>[INST] <<SYS>>You are a helpful assistant. No comments or explanation, just answer the question.<</SYS>>{template}[/INST]\"\n",
+    "\n",
+    "endpoint_url = \"https://z8afrqamxvaaitmf.us-east-1.aws.endpoints.huggingface.cloud\"\n",
+    "query(endpoint_url, template, journal_name=journal_name, website_text=website_text).split(\"\\n\")\n"
+   ],
+   "metadata": {
+    "collapsed": false,
+    "ExecuteTime": {
+     "end_time": "2024-01-17T19:31:23.221568600Z",
+     "start_time": "2024-01-17T19:31:16.694648400Z"
+    }
+   },
+   "id": "f05098a4cf2aa3dc"
+  },
+  {
+   "cell_type": "markdown",
+   "source": [
+    "## TheBloke/Llama-2-70B-chat-GPTQ via Huggingface Inference Endpoint\n",
+    "\n",
+    "The 70 billion parameter variant [does a bit better](data/output/editors-llama-2-70b-chat-gptq.csv) but, among other things, doesn't the academic titles right. It also cannot be persuaded to [not comment on the CSV output](data/output/editors-llama-2-70b-chat-gptq.txt). Given that the model costs $13/h to run, the result is not impressive."
+   ],
+   "metadata": {
+    "collapsed": false
+   },
+   "id": "ca33fb28f6772cbc"
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "outputs": [
+    {
+     "data": {
+      "text/plain": "'  Here is the CSV data for the members of the editorial board or the advisory board of the journal \\'AUR - Agrar- und Umweltrecht\\':\\n\\n\"lastname\",\"firstname\",\"title\",\"affiliation\",\"role\"\\n\"Busse\",\"Christian\", \"Regierungsdirektor\", \"Bundesministerium für Ernährung und Landwirtschaft, Bonn\", \"Herausgeber\"\\n\"Endres\",\"Ewald\", \"Prof. Dr.\", \"Hochschule Weihenstephan-Triesdorf, Freising\", \"Redaktion\"\\n\"Francois\",\"Matthias\", \"Rechtsanwalt\", \"Bitburg\", \"Redaktion\"\\n\"Garmissen\",\"Bernd\", \"Rechtsanwalt\", \"Göttingen\", \"Redaktion\"\\n\"Graß\",\"Christiane\", \"Rechtsanwältin\", \"Bonn\", \"Redaktion\"\\n\"Haarstrich\",\"Jens\", \"Rechtsanwalt\", \"Peine\", \"Redaktion\"\\n\"Köpl\",\"Christian\", \"Ministerialrat\", \"Bayerisches Staatsministerium für Ernährung, Landwirtschaft und Forsten, München\", \"\"\\n\"Martinez\",\"Jose\", \"Prof. Dr.\", \"Institut für Landwirtschaftsrecht, Georg-August-Universität Göttingen, Göttingen\", \"Herausgeber\"\\n\"Nies\",\"Volkmar\", \"Ltd. Landwirtschaftsdirektor\", \"Landwirtschaftskammer NRW, Bonn\", \"Redaktion\"\\n\"Stephany\",\"Ralf\", \"Rechtsanwalt/Steuerberater\", \"Bonn\", \"Redaktion\"\\n\"Wedemeyer\",\"Harald\", \"Rechtsanwalt\", \"Landvolk Niedersachsen, Hannover\", \"Redaktion\"\\n\"Schell\",\"Irina Valeska\", \"\", \"Georg-August-Universität Göttingen, Göttingen\", \"\"\\n\\nNote: The column \\'role\\' is empty for some members, as their role could not be determined.'"
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "endpoint_url = \"https://gp8iviqlqee101a0.us-east-1.aws.endpoints.huggingface.cloud\"\n",
+    "query(endpoint_url, template, journal_name=journal_name, website_text=website_text).split(\"\\n\")"
+   ],
+   "metadata": {
+    "collapsed": false,
+    "ExecuteTime": {
+     "end_time": "2024-01-17T19:14:56.752808800Z",
+     "start_time": "2024-01-17T19:13:45.800635700Z"
+    }
+   },
+   "id": "b94cf62b996bf3a2"
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 2
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython2",
+   "version": "2.7.6"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/langchain-experiments/data/input/journal-website.txt b/langchain-experiments/data/input/journal-website.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0011b275d04f8e694a6fab0db9726bb40dbc1892
--- /dev/null
+++ b/langchain-experiments/data/input/journal-website.txt
@@ -0,0 +1,100 @@
+
+Georg-August-Universität Göttingen Institut für Landwirtschaftsrecht
+
+    Institut
+    Team
+    Forschungsprojekte
+    Lehre
+    Veranstaltungen
+    Göttinger Onlinebeiträge zum Agrarrecht
+    LexVinum
+    AUR
+    beck-blog
+
+    Startseite AUR
+
+Suchen English
+AUR - Agrar- und Umweltrecht
+
+Die Zeitschrift Agrar- und Umweltrecht ist die führende Zeitschrift in Deutschland für das gesamte Recht der Landwirtschaft, der Agrarmärkte und des ländlichen Raums. Die Zeitschrift wird herausgegeben von der Deutschen Gesellschaft für Agrarrecht, DGAR. Sie erscheint monatlich und bietet eine umfassende Übersicht über den Stand der Wissenschaft, Rechtsprechung und Praxis des Agrarrechts.
+Das Institut für Landwirtschaftsrecht ist der Sitz der Schriftleitung
+Die Redaktion der Zeitschrift "Agrar-und Umweltrecht":
+
+    Regierungsdirektor Dr. Christian Busse, Bundesministerium für Ernährung und Landwirtschaft, Bonn (Agrarproduktrecht)
+
+    Prof. Dr. Ewald Endres, Hochschule Weihenstephan-Triesdorf, Freising (Forst, Jagd, Fischerei)
+
+    Rechtsanwalt Dr. Matthias Francois, Bitburg (Bodenrecht)
+
+    Rechtsanwalt Dr. Bernd von Garmissen, Göttingen (Erb- und Gesellschaftsrecht)
+
+    Rechtsanwalt Ingo Glas, Rostock (Ziviles Agrarwirtschaftsrecht)
+
+    Rechtsanwältin Christiane Graß, Bonn (Agrarzivilrecht)
+
+    Rechtsanwalt Jens Haarstrich, Peine (Agrarzivilrecht)
+
+    Ltd. Verwaltungsdirektor Dr. Erich Koch, Sozialversicherung für Landwirtschaft, Forsten und Gartenbau, Kassel (Agrarsozialrecht)
+
+    Ministerialrat Dr. Christian Köpl, Bayerisches Staatsministerium für Ernährung, Landwirtschaft und Forsten, München (Landwirtschaftliche Betriebsmittel)
+
+    Prof. Dr. Jose Martinez, Institut für Landwirtschaftsrecht, Georg-August-Universitat Göttingen, Göttingen (Agrarförderrecht)
+
+    Ltd. Landwirtschaftsdirektor Volkmar Nies, Landwirtschaftskammer NRW, Bonn (Agrarumweltrecht)
+
+    Rechtsanwalt/Steuerberater Ralf Stephany, Bonn (Agrarsteuerrecht)
+
+    Rechtsanwalt Harald Wedemeyer, Landvolk Niedersachsen, Hannover (Öffentliches Agrarwirtschaftsrecht)
+
+
+Zusendung von Manuskripten:
+Die Schriftleitung freut sich über die Einsendung von Manuskripten zu agrar- und umweltrechtlichen Themen. Neben wissenschaftlichen Beiträgen mit einem Quellennachweis werden in der AuR in der Rubrik AuR-Forum auch Kurzbeiträge (ohne Quellennachweise) oder Veranstaltungshinweise abgedruckt.
+Manuskripte werden in elektronischer Form im Word-Format an die email (aur@gwdg.de) erbeten. Dabei bitten wir um Beachtung der Autorenhinweise.
+Alle Artikel durchlaufen vor der Publikation ein Begutachtungsverfahren (peer review). Hierzu werden die Manuskripte der Redaktion zur Begutachtung anonym vorgelegt.
+
+AUR
+
+    Internet-Archiv der AUR
+    Autorenhinweise für Beiträge in der AUR
+
+Schriftleitung Zeitschrift Agrar und Umweltrecht:
+
+Erster Schriftleiter: Prof. Dr. José Martinez
+Institut für Landwirtschaftsrecht
+Platz der Göttinger Sieben 5, 37073 Göttingen,
+Tel. (05 51) 39 274 15
+
+Zweiter Schriftleiter: LLD Volkmar Nies,
+Manheimer Str. 21, 50170 Kerpen,
+Tel. (0 22 75) 9 19 99 10,
+
+E-mail der Schriftleitung: aur@gwdg.de
+
+Assistenz der Schriftleitung: Irina Valeska Schell
+Kontakt
+Georg-August-Universität Göttingen
+Wilhelmsplatz 1 (Aula)
+37073 Göttingen
+Tel. 0551 39-0
+Soziale Medien
+
+Online-Dienste
+
+    Studienangebot (eCampus)
+    Organisation (eCampus)
+    Prüfungsverwaltung (FlexNow)
+    Lernmanagement (Stud.IP)
+    Studierendenportal (eCampus)
+    Intranet
+    Stellenausschreibungen
+    Jobportal stellenwerk
+
+Service
+
+    Barrierefreiheit
+    Datenschutz
+    Kontakt
+    Notfall
+    Lageplan
+    Impressum
+
diff --git a/langchain-experiments/data/output/editors-llama-2-13b-chat-gptq.txt b/langchain-experiments/data/output/editors-llama-2-13b-chat-gptq.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2b55c30eb4b46bdf3982afd1dc71ff0123029a57
--- /dev/null
+++ b/langchain-experiments/data/output/editors-llama-2-13b-chat-gptq.txt
@@ -0,0 +1,10 @@
+['Martinez, Dr. Christian Busse, Bundesministerium für Ernährung und Landwirtschaft, Bonn Agrarprodukt Recht',
+ 'Prof. Dr. Ewald Endres, Hochschule Weihenstephan-Triesdorf Freising Forsting Forsting, Jagd, Fischerei, Fischerei',
+ 'Lawyeranwalt Ingo Glas, Bitburg Boden Recht',
+ 'Christiane Grass, Bonn Agrarzivil Recht',
+ 'Jens Haarstrich, Peine Redaktionär, Rostock',
+ 'Prof. Dr. Bernd von Garmissen, Göttingen Erb, Redaktion, Umwelt',
+ 'Ltdr. Jose Martinez, Georg-August-Universität Göttingen, Göttingen',
+ '',
+ '',
+ "Note: The column 'Role' contains the following values: 'Herausgeber', 'Redaktion', 'Beirat'"]
\ No newline at end of file
diff --git a/langchain-experiments/data/output/editors-llama-2-70b-chat-gptq.csv b/langchain-experiments/data/output/editors-llama-2-70b-chat-gptq.csv
new file mode 100644
index 0000000000000000000000000000000000000000..16eb4a14ff0e53f607f68380ede7384f24102b8c
--- /dev/null
+++ b/langchain-experiments/data/output/editors-llama-2-70b-chat-gptq.csv
@@ -0,0 +1,13 @@
+"lastname","firstname","title","affiliation","role"
+"Busse","Christian", "Regierungsdirektor", "Bundesministerium für Ernährung und Landwirtschaft, Bonn", "Herausgeber"
+"Endres","Ewald", "Prof. Dr.", "Hochschule Weihenstephan-Triesdorf, Freising", "Redaktion"
+"Francois","Matthias", "Rechtsanwalt", "Bitburg", "Redaktion"
+"Garmissen","Bernd", "Rechtsanwalt", "Göttingen", "Redaktion"
+"Graß","Christiane", "Rechtsanwältin", "Bonn", "Redaktion"
+"Haarstrich","Jens", "Rechtsanwalt", "Peine", "Redaktion"
+"Köpl","Christian", "Ministerialrat", "Bayerisches Staatsministerium für Ernährung, Landwirtschaft und Forsten, München", ""
+"Martinez","Jose", "Prof. Dr.", "Institut für Landwirtschaftsrecht, Georg-August-Universität Göttingen, Göttingen", "Herausgeber"
+"Nies","Volkmar", "Ltd. Landwirtschaftsdirektor", "Landwirtschaftskammer NRW, Bonn", "Redaktion"
+"Stephany","Ralf", "Rechtsanwalt/Steuerberater", "Bonn", "Redaktion"
+"Wedemeyer","Harald", "Rechtsanwalt", "Landvolk Niedersachsen, Hannover", "Redaktion"
+"Schell","Irina Valeska", "", "Georg-August-Universität Göttingen, Göttingen", ""
\ No newline at end of file
diff --git a/langchain-experiments/data/output/editors-llama-2-70b-chat-gptq.txt b/langchain-experiments/data/output/editors-llama-2-70b-chat-gptq.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d97515c59f6acf567beb0893b8519d48d30ea899
--- /dev/null
+++ b/langchain-experiments/data/output/editors-llama-2-70b-chat-gptq.txt
@@ -0,0 +1 @@
+'  Here is the CSV data for the members of the editorial board or the advisory board of the journal \'AUR - Agrar- und Umweltrecht\':\n\n"lastname","firstname","title","affiliation","role"\n"Busse","Christian", "Regierungsdirektor", "Bundesministerium für Ernährung und Landwirtschaft, Bonn", "Herausgeber"\n"Endres","Ewald", "Prof. Dr.", "Hochschule Weihenstephan-Triesdorf, Freising", "Redaktion"\n"Francois","Matthias", "Rechtsanwalt", "Bitburg", "Redaktion"\n"Garmissen","Bernd", "Rechtsanwalt", "Göttingen", "Redaktion"\n"Graß","Christiane", "Rechtsanwältin", "Bonn", "Redaktion"\n"Haarstrich","Jens", "Rechtsanwalt", "Peine", "Redaktion"\n"Köpl","Christian", "Ministerialrat", "Bayerisches Staatsministerium für Ernährung, Landwirtschaft und Forsten, München", ""\n"Martinez","Jose", "Prof. Dr.", "Institut für Landwirtschaftsrecht, Georg-August-Universität Göttingen, Göttingen", "Herausgeber"\n"Nies","Volkmar", "Ltd. Landwirtschaftsdirektor", "Landwirtschaftskammer NRW, Bonn", "Redaktion"\n"Stephany","Ralf", "Rechtsanwalt/Steuerberater", "Bonn", "Redaktion"\n"Wedemeyer","Harald", "Rechtsanwalt", "Landvolk Niedersachsen, Hannover", "Redaktion"\n"Schell","Irina Valeska", "", "Georg-August-Universität Göttingen, Göttingen", ""\n\nNote: The column \'role\' is empty for some members, as their role could not be determined.'
\ No newline at end of file
diff --git a/langchain-experiments/data/output/editors-openai-gpt-3.5-turbo.csv b/langchain-experiments/data/output/editors-openai-gpt-3.5-turbo.csv
new file mode 100644
index 0000000000000000000000000000000000000000..f258ec37573e1fc639df8f63870e85da848f0dae
--- /dev/null
+++ b/langchain-experiments/data/output/editors-openai-gpt-3.5-turbo.csv
@@ -0,0 +1,14 @@
+,lastname,firstname,title,position,affiliation,role
+0,Busse,Christian,Dr.,Regierungsdirektor,"Bundesministerium für Ernährung und Landwirtschaft, Bonn",Redaktion
+1,Endres,Ewald,Prof. Dr.,,"Hochschule Weihenstephan-Triesdorf, Freising",Redaktion
+2,Francois,Matthias,Dr.,Rechtsanwalt,Bitburg,Redaktion
+3,von Garmissen,Bernd,Dr.,Rechtsanwalt,Göttingen,Redaktion
+4,Glas,Ingo,,Rechtsanwalt,Rostock,Redaktion
+5,Graß,Christiane,Rechtsanwältin,,Bonn,Redaktion
+6,Haarstrich,Jens,Rechtsanwalt,,Peine,Redaktion
+7,Koch,Erich,Dr.,Ltd. Verwaltungsdirektor,"Sozialversicherung für Landwirtschaft, Forsten und Gartenbau, Kassel",Redaktion
+8,Köpl,Christian,Dr.,Ministerialrat,"Bayerisches Staatsministerium für Ernährung, Landwirtschaft und Forsten, München",Redaktion
+9,Martinez,Jose,Prof. Dr.,,"Institut für Landwirtschaftsrecht, Georg-August-Universitat Göttingen, Göttingen",Redaktion
+10,Nies,Volkmar,Ltd. Landwirtschaftsdirektor,,"Landwirtschaftskammer NRW, Bonn",Redaktion
+11,Stephany,Ralf,Rechtsanwalt/Steuerberater,,Bonn,Redaktion
+12,Wedemeyer,Harald,Rechtsanwalt,,"Landvolk Niedersachsen, Hannover",Redaktion
diff --git a/langchain-experiments/data/output/editors-openai-gpt-4.csv b/langchain-experiments/data/output/editors-openai-gpt-4.csv
new file mode 100644
index 0000000000000000000000000000000000000000..e90973cd79f05e376335c40952c4e55996463823
--- /dev/null
+++ b/langchain-experiments/data/output/editors-openai-gpt-4.csv
@@ -0,0 +1,17 @@
+,lastname,firstname,title,position,affiliation,role
+0,DGAR,,,Deutsche Gesellschaft für Agrarrecht,,Herausgeber
+1,Busse,Christian,Dr.,Regierungsdirektor,"Bundesministerium für Ernährung und Landwirtschaft, Bonn",Redaktion
+2,Endres,Ewald,Prof. Dr.,,"Hochschule Weihenstephan-Triesdorf, Freising",Redaktion
+3,Francois,Matthias,Dr.,Rechtsanwalt,Bitburg,Redaktion
+4,von Garmissen,Bernd,Dr.,Rechtsanwalt,Göttingen,Redaktion
+5,Glas,Ingo,,Rechtsanwalt,Rostock,Redaktion
+6,Graß,Christiane,,Rechtsanwältin,Bonn,Redaktion
+7,Haarstrich,Jens,,Rechtsanwalt,Peine,Redaktion
+8,Koch,Erich,Dr.,Ltd. Verwaltungsdirektor,"Sozialversicherung für Landwirtschaft, Forsten und Gartenbau, Kassel",Redaktion
+9,Köpl,Christian,Dr.,Ministerialrat,"Bayerisches Staatsministerium für Ernährung, Landwirtschaft und Forsten, München",Redaktion
+10,Martinez,Jose,Prof. Dr.,,"Institut für Landwirtschaftsrecht, Georg-August-Universitat Göttingen, Göttingen",Redaktion
+11,Nies,Volkmar,,Ltd. Landwirtschaftsdirektor,"Landwirtschaftskammer NRW, Bonn",Redaktion
+12,Stephany,Ralf,,Rechtsanwalt/Steuerberater,Bonn,Redaktion
+13,Wedemeyer,Harald,,Rechtsanwalt,"Landvolk Niedersachsen, Hannover",Redaktion
+14,Martinez,José,Prof. Dr.,Erster Schriftleiter,"Institut für Landwirtschaftsrecht, Göttingen",Redaktion
+15,Nies,Volkmar,LLD,Zweiter Schriftleiter,50170 Kerpen,Redaktion
diff --git a/langchain-experiments/lib/__init__.py b/langchain-experiments/lib/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/langchain-experiments/lib/hf_llama2_chat_gptq.py b/langchain-experiments/lib/hf_llama2_chat_gptq.py
new file mode 100644
index 0000000000000000000000000000000000000000..cdd1a6f8af4da024961c24948ec9877ebdc3c703
--- /dev/null
+++ b/langchain-experiments/lib/hf_llama2_chat_gptq.py
@@ -0,0 +1,33 @@
+import requests
+from dotenv import load_dotenv
+from json import JSONDecodeError
+import os
+
+load_dotenv()
+
+API_KEY = os.getenv("HUGGINGFACEHUB_API_TOKEN")
+headers = {
+    "Accept" : "application/json",
+    "Authorization": f"Bearer {API_KEY}",
+    "Content-Type": "application/json"
+}
+
+def query(url, template, model_params = None, **params):
+    if model_params  is None:
+        model_params = {
+            "temperature": 0.1,
+            "max_new_tokens": 2000
+        }
+    inputs = template.format_map(**params)
+    payload = {
+        "inputs": inputs,
+        "parameters": model_params
+    }
+    response = requests.post(url, headers=headers, json=payload)
+    response.raise_for_status()
+    try:
+        return response.json()[0].get("generated_text")
+    except JSONDecodeError:
+        with open('tmp/response.txt', "w", encoding='utf-8') as f:
+            f.write(response.text)
+        raise RuntimeError(f'Cannot parse response from {response.url}. See tmp/response.txt')
diff --git a/langchain-experiments/readme.md b/langchain-experiments/readme.md
new file mode 100644
index 0000000000000000000000000000000000000000..e7d1436d6064a91657d6a8ce1d6910b01bfab67c
--- /dev/null
+++ b/langchain-experiments/readme.md
@@ -0,0 +1,12 @@
+# Experiments with https://python.langchain.com
+
+Create a python 3.11 environment and install the following dependencies (somewhat convoluted because of dependency
+problems):
+
+`pip install typing-inspect==0.8.0 typing_extensions==4.5.0`
+`pip install pydantic -U`
+`pip install pydantic==1.10.11`
+`pip install python-dotenv langchain langchain-cli openai huggingface_hub langchain_openai`
+
+You need to copy `.env.dist` to `.env` and add values for the `OPENAI_API_KEY` and `HUGGINGFACEHUB_API_TOKEN`
+emvironment variables.
\ No newline at end of file
diff --git a/langchain-experiments/tmp/.gitignore b/langchain-experiments/tmp/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..f59ec20aabf5842d237244ece8c81ab184faeac1
--- /dev/null
+++ b/langchain-experiments/tmp/.gitignore
@@ -0,0 +1 @@
+*
\ No newline at end of file
diff --git a/rocket-chat-api/.env.dist b/rocket-chat-api/.env.dist
new file mode 100644
index 0000000000000000000000000000000000000000..7ee42ea506467a83d364e79bb91d6d93ede97b2a
--- /dev/null
+++ b/rocket-chat-api/.env.dist
@@ -0,0 +1,2 @@
+ROCKETCHAT_USER_ID=''
+ROCKETCHAT_API_KEY=''
\ No newline at end of file
diff --git a/rocket-chat-api/.gitignore b/rocket-chat-api/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..c88b8224acb3079d4748cfe23e57cfc23c59717c
--- /dev/null
+++ b/rocket-chat-api/.gitignore
@@ -0,0 +1,2 @@
+.*
+!.env.dist
\ No newline at end of file
diff --git a/rocket-chat-api/rocket-chat-api.ipynb b/rocket-chat-api/rocket-chat-api.ipynb
index e780bf3e41f4430586eb942e48902d7d0dcf20c6..4b976021c11523019a2b3cd74caa8e875bb9fe1b 100644
--- a/rocket-chat-api/rocket-chat-api.ipynb
+++ b/rocket-chat-api/rocket-chat-api.ipynb
@@ -1,38 +1,99 @@
 {
  "cells": [
   {
-   "cell_type": "markdown",
+   "cell_type": "code",
+   "execution_count": 2,
+   "id": "initial_id",
+   "metadata": {
+    "collapsed": true,
+    "ExecuteTime": {
+     "end_time": "2024-01-15T09:15:30.953499600Z",
+     "start_time": "2024-01-15T09:15:30.602210400Z"
+    }
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": "[('Note-to-self', '6123583208648d50d46136e7', 'Grib6LkDEh8BjXm5A'),\n ('SLT-Team', '621f3257dda518ec820fec0f', 'DLX2YQYzmwSefCFSs'),\n ('Arbeitsaufträge-SHK-Abt-3',\n  '6231a585396730692a6254af',\n  'h2F4wES7ALisyjFeS'),\n ('Machine-Learning-Team', '6243f60f3bb97e25a63651be', 'sibAdkwHQzqJChxH9'),\n ('mpilhlt-DH', '6246b44404cc8d8ba31517c2', 'yT4DM9pje2Cbnz7w3'),\n ('reference-extraction-workshops-2023',\n  '636a209aa7ef138927c64671',\n  'CXECckP3iJcT7Wzvm'),\n ('Literaturverwaltung', '642ab2edd4f482c368a7e364', 'ALzasJ7iwLpNzE34B'),\n ('Arbeitsgruppe-Gleichstellungsbericht',\n  '6492f49d7821ad51fcbbef97',\n  '6492f49e7821ad51fcbbef99'),\n ('mpilhlt-Auer-Doctoral-Students-plus-Coordinator',\n  '64b50afdf6d0cde3515015c3',\n  '64b50afdf6d0cde3515015c5'),\n ('DH-Projekte-Abt-Auer',\n  '655cd77374c1eb212615898e',\n  '655cd77374c1eb2126158990')]"
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
    "source": [
-    "# Test Rocket.Chat API\n",
+    "import requests\n",
+    "import os\n",
+    "from dotenv import load_dotenv\n",
+    "from json import JSONDecodeError\n",
     "\n",
+    "load_dotenv()\n",
     "\n",
-    "Die Room-ID sollten Sie über die API zur Auflistung aller Channel finden können (https://developer.rocket.chat/reference/api/rest-api/endpoints/rooms/channels-endpoints/get-channel-list), was aber eine riesige Liste produzieren kann, wenn dort auch die öffentlichen Channel dabei sind.\n",
+    "def call_rocket_chat_api(command, **params):\n",
+    "    url = f'https://chat.gwdg.de/api/v1/{command}'\n",
+    "    headers = {\n",
+    "        'X-Auth-Token': os.getenv('ROCKETCHAT_API_KEY'),\n",
+    "        'X-User-Id': os.getenv('ROCKETCHAT_USER_ID')\n",
+    "    }\n",
+    "    response = requests.get(url, headers=headers, params=params)\n",
+    "    response.raise_for_status()\n",
+    "    try:\n",
+    "        return response.json()\n",
+    "    except JSONDecodeError:\n",
+    "        raise RuntimeError(f'Cannot parse response from {response.url}.')\n",
     "\n",
-    "Alternativ geht wahrscheinlich auch folgende API, wo Sie den Channel über den Namen finden können:\n",
-    "https://developer.rocket.chat/reference/api/rest-api/endpoints/rooms/channels-endpoints/get-channel-information."
-   ],
+    "teams = call_rocket_chat_api(\"teams.list\").get('teams')\n",
+    "[(t.get('name'), t.get('_id'), t.get('roomId')) for t in teams]\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "source": [],
    "metadata": {
     "collapsed": false
    },
-   "id": "8dbec4364449c97"
+   "id": "894f002bf39fcb04"
   },
   {
    "cell_type": "code",
-   "execution_count": null,
-   "outputs": [],
-   "source": [],
+   "execution_count": 3,
+   "outputs": [
+    {
+     "ename": "HTTPError",
+     "evalue": "400 Client Error: Bad Request for url: https://chat.gwdg.de/api/v1/channels.history?roomId=sibAdkwHQzqJChxH9",
+     "output_type": "error",
+     "traceback": [
+      "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
+      "\u001B[1;31mHTTPError\u001B[0m                                 Traceback (most recent call last)",
+      "Cell \u001B[1;32mIn[3], line 1\u001B[0m\n\u001B[1;32m----> 1\u001B[0m msgs \u001B[38;5;241m=\u001B[39m call_rocket_chat_api(\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mchannels.history\u001B[39m\u001B[38;5;124m'\u001B[39m, roomId\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m'\u001B[39m\u001B[38;5;124msibAdkwHQzqJChxH9\u001B[39m\u001B[38;5;124m'\u001B[39m)\u001B[38;5;241m.\u001B[39mget(\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mmessages\u001B[39m\u001B[38;5;124m'\u001B[39m)\n",
+      "Cell \u001B[1;32mIn[2], line 15\u001B[0m, in \u001B[0;36mcall_rocket_chat_api\u001B[1;34m(command, **params)\u001B[0m\n\u001B[0;32m     10\u001B[0m headers \u001B[38;5;241m=\u001B[39m {\n\u001B[0;32m     11\u001B[0m     \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mX-Auth-Token\u001B[39m\u001B[38;5;124m'\u001B[39m: os\u001B[38;5;241m.\u001B[39mgetenv(\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mROCKETCHAT_API_KEY\u001B[39m\u001B[38;5;124m'\u001B[39m),\n\u001B[0;32m     12\u001B[0m     \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mX-User-Id\u001B[39m\u001B[38;5;124m'\u001B[39m: os\u001B[38;5;241m.\u001B[39mgetenv(\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mROCKETCHAT_USER_ID\u001B[39m\u001B[38;5;124m'\u001B[39m)\n\u001B[0;32m     13\u001B[0m }\n\u001B[0;32m     14\u001B[0m response \u001B[38;5;241m=\u001B[39m requests\u001B[38;5;241m.\u001B[39mget(url, headers\u001B[38;5;241m=\u001B[39mheaders, params\u001B[38;5;241m=\u001B[39mparams)\n\u001B[1;32m---> 15\u001B[0m response\u001B[38;5;241m.\u001B[39mraise_for_status()\n\u001B[0;32m     16\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[0;32m     17\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m response\u001B[38;5;241m.\u001B[39mjson()\n",
+      "File \u001B[1;32m~\\AppData\\Local\\miniconda3\\Lib\\site-packages\\requests\\models.py:1021\u001B[0m, in \u001B[0;36mResponse.raise_for_status\u001B[1;34m(self)\u001B[0m\n\u001B[0;32m   1016\u001B[0m     http_error_msg \u001B[38;5;241m=\u001B[39m (\n\u001B[0;32m   1017\u001B[0m         \u001B[38;5;124mf\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;132;01m{\u001B[39;00m\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mstatus_code\u001B[38;5;132;01m}\u001B[39;00m\u001B[38;5;124m Server Error: \u001B[39m\u001B[38;5;132;01m{\u001B[39;00mreason\u001B[38;5;132;01m}\u001B[39;00m\u001B[38;5;124m for url: \u001B[39m\u001B[38;5;132;01m{\u001B[39;00m\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39murl\u001B[38;5;132;01m}\u001B[39;00m\u001B[38;5;124m\"\u001B[39m\n\u001B[0;32m   1018\u001B[0m     )\n\u001B[0;32m   1020\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m http_error_msg:\n\u001B[1;32m-> 1021\u001B[0m     \u001B[38;5;28;01mraise\u001B[39;00m HTTPError(http_error_msg, response\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mself\u001B[39m)\n",
+      "\u001B[1;31mHTTPError\u001B[0m: 400 Client Error: Bad Request for url: https://chat.gwdg.de/api/v1/channels.history?roomId=sibAdkwHQzqJChxH9"
+     ]
+    }
+   ],
+   "source": [
+    "\n",
+    "msgs = call_rocket_chat_api('channels.history', roomId='sibAdkwHQzqJChxH9').get('messages')"
+   ],
    "metadata": {
-    "collapsed": false
+    "collapsed": false,
+    "ExecuteTime": {
+     "end_time": "2024-01-15T09:15:37.298747900Z",
+     "start_time": "2024-01-15T09:15:36.819053300Z"
+    }
    },
-   "id": "5582dd8b2d35827"
+   "id": "709f6d8c845a0056"
   },
   {
-   "cell_type": "markdown",
+   "cell_type": "code",
+   "execution_count": null,
+   "outputs": [],
    "source": [],
    "metadata": {
     "collapsed": false
    },
-   "id": "ffb79729d8b046cd"
+   "id": "caee699ae846a8fc"
   }
  ],
  "metadata": {