Spaces:
Sleeping
Sleeping
| title: Using External Apis | |
| emoji: 🌖 | |
| colorFrom: yellow | |
| colorTo: purple | |
| sdk: gradio | |
| sdk_version: 6.14.0 | |
| app_file: app.py | |
| pinned: false | |
| license: mit | |
| short_description: using-external-apis | |
| # Using external APIs (OpenAI) on Hugging Face Spaces | |
| This Space runs a small [Gradio](https://www.gradio.app/) app with **two tabs** that both call **OpenAI Chat Completions** the same way a student would in a notebook—once with plain HTTP (`requests`) and once with Hugging Face’s client (`huggingface_hub.InferenceClient`). | |
| Official Space configuration reference: [Spaces config reference](https://huggingface.co/docs/hub/spaces-config-reference). | |
| ## How to use the app | |
| 1. **Set your API key** (see [Secrets](#secrets-openai_api_key) below). Without `OPENAI_API_KEY`, the app will raise when it reads the environment variable. | |
| 2. Open the Space and pick a tab: | |
| - **`requests`** — builds a `POST` to `https://api.openai.com/v1/chat/completions` with JSON `model` + `messages` and a `Bearer` token header. Useful when you are teaching REST, curl, or reading OpenAI’s HTTP docs side by side with the code. | |
| - **`huggingface_hub`** — creates an `InferenceClient` aimed at OpenAI’s `/v1` base URL and calls `chat.completions.create(...)`. The request shape matches the “OpenAI-style” chat API described in the [huggingface_hub inference guide](https://huggingface.co/docs/huggingface_hub/guides/inference). | |
| 3. Type a question, submit, and read the answer in the output box. Both tabs use the same model name (`MODEL` in [`app.py`](app.py)). | |
| ## Secrets: `OPENAI_API_KEY` | |
| - In the Space: **Settings → Variables and secrets** (or **Repository secrets** depending on UI), add a **secret** named exactly **`OPENAI_API_KEY`** with your OpenAI API key as the value. | |
| - Hugging Face exposes repository secrets to the running app as **environment variables** with the same name. The code uses `os.environ["OPENAI_API_KEY"]`—no key files, no pasting keys into the README or `app.py`. | |
| - **Do not** commit keys to git or put them in this README’s YAML frontmatter. If a key ever leaks, rotate it in the OpenAI dashboard. | |
| ### Gotchas with secrets | |
| - **Name must match**: `OPENAI_API_KEY` (case-sensitive) must match what [`app.py`](app.py) expects. | |
| - **Restart**: After adding or changing a secret, **restart the Space** (or trigger a new build) if the app still behaves as if the variable were missing. | |
| - **Local runs**: On your laptop, export the variable yourself, for example: | |
| - macOS/Linux: `export OPENAI_API_KEY="sk-..."` then run the app. | |
| - Never check a `.env` file with real keys into version control. | |
| ## `requirements.txt` on Hugging Face Spaces | |
| This repo’s [`requirements.txt`](requirements.txt) lists **one Python package per line**. Spaces use it to `pip install` dependencies before starting the app. | |
| - **Blank lines** are usually fine; avoid stray text that is not a valid `pip` requirement. | |
| - **Pinning** (e.g. `gradio==6.14.0`) improves reproducibility so a future `gradio` major release does not surprise your class. The README frontmatter’s `sdk_version` should stay compatible with the Gradio version you install (see below). | |
| - **Order** does not matter for `pip`, but keeping standard library–heavy teachers first (`requests`, `huggingface_hub`) can make the file easier to read. | |
| ## README formatting for Hugging Face Spaces | |
| Spaces treat the top of this file specially: | |
| - The block between the **first** `---` and the **second** `---` is **YAML frontmatter**. Hugging Face reads fields like `sdk`, `sdk_version`, `app_file`, and `title` from it. | |
| - **Do not remove** that block unless you know how you will configure the Space elsewhere. | |
| - **Common gotchas**: | |
| - **`app_file`** must point to the file that calls `launch()` (here: `app.py`). | |
| - **`sdk_version`** should match the Gradio major/minor you rely on; a mismatch with `requirements.txt` can produce confusing import or layout errors. | |
| - **Indentation** in YAML matters; keep values simple strings without unquoted colons that break parsing. | |
| - **Content below the closing `---`** is normal Markdown for humans (this section). You can edit it freely without changing how the Space boots, as long as the frontmatter stays valid. | |
| ## Other setup gotchas | |
| - **Model name**: `MODEL` in [`app.py`](app.py) must be a model your OpenAI **account** and **billing** can access. If OpenAI returns an error, the simplified app does not catch it—you will see the raw exception in the Space logs, which is fine for teaching debugging. | |
| - **Network**: The Space runtime must reach `api.openai.com`. Corporate or restricted networks are rare on HF but worth knowing for local copies. | |
| - **`huggingface_hub` vs Hub login**: This app sends your **OpenAI** key to **OpenAI** (`base_url="https://api.openai.com/v1"`). You do **not** need a Hugging Face user token for these two tabs unless you change the code to call HF Inference Providers or the HF router instead. | |
| ## Local quick start (optional) | |
| From this directory, with Python 3 and a virtual environment: | |
| ```bash | |
| python -m venv .venv | |
| source .venv/bin/activate # Windows: .venv\Scripts\activate | |
| pip install -r requirements.txt | |
| export OPENAI_API_KEY="sk-..." # use your real key; do not commit it | |
| python app.py | |
| ``` | |
| Then open the URL Gradio prints (often `http://127.0.0.1:7860`). | |