File size: 7,296 Bytes
2ca8db5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
848d580
09d1305
b4578a2
ae703ff
2ca8db5
 
 
 
 
 
 
 
98ce88f
2ca8db5
 
 
b4578a2
98ce88f
2ca8db5
 
 
 
 
98ce88f
2ca8db5
 
 
 
 
 
ae703ff
2ca8db5
 
 
 
 
 
98ce88f
2ca8db5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
98ce88f
2ca8db5
 
 
 
b4578a2
ae703ff
2ca8db5
 
98ce88f
2ca8db5
 
 
 
 
 
 
 
 
98ce88f
b4578a2
ae703ff
2ca8db5
 
98ce88f
58a9053
b4578a2
2ca8db5
b4578a2
 
2ca8db5
b4578a2
58a9053
 
 
 
 
 
 
 
b4578a2
 
58a9053
b4578a2
2ca8db5
 
58a9053
 
 
 
2ca8db5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
---
title: Notion API Bridge
emoji: 🌉
colorFrom: blue
colorTo: purple
sdk: docker
app_port: 7860
pinned: false
license: mit # Or choose another appropriate license if preferred
# Add any other relevant tags or configuration if needed
---
# OpenAI to Notion API Bridge

This project provides a FastAPI application that acts as a bridge between OpenAI-compatible API calls and the Notion API, allowing you to interact with Notion using standard OpenAI tools and libraries.

## Environment Variables

The application requires the following environment variables to be set:

*   `NOTION_COOKIE`: Your Notion complete cookie value. This is used for authentication with the Notion API. You can typically find this in your browser's developer tools while logged into Notion.
*   `NOTION_SPACE_ID`: The ID of the Notion Space you want the API to interact with (`x-notion-space-id in header`).
*   `PROXY_AUTH_TOKEN` (Optional): The Bearer token required for authentication to access the API endpoints. If not set, it defaults to `default_token`.
*   `NOTION_ACTIVE_USER_HEADER` (Optional): If set, its value will be used for the `x-notion-active-user-header` in requests sent to the Notion API. If not set or empty, the header is omitted.

## Running Locally (without Docker)

1.  Ensure you have Python 3.10+ installed.
2.  Install dependencies:
    ```bash
    pip install -r requirements.txt
    ```
3.  Create a `.env` file in the project root with your `NOTION_COOKIE`:
    ```dotenv
    NOTION_COOKIE="your_cookie_value_here"
    NOTION_SPACE_ID="your_space_id_here"
    # PROXY_AUTH_TOKEN="your_secure_token" # Optional, defaults to default_token
    # NOTION_ACTIVE_USER_HEADER="your_user_id" # Optional
    ```
4.  Run the application using Uvicorn:
    ```bash
    uvicorn main:app --reload --port 7860
    ```
    The server will be available at `http://localhost:7860`. You will need to provide the correct token (either the default `default_token` or the one set in `.env`) via an `Authorization: Bearer <token>` header. The `NOTION_SPACE_ID` will be loaded from the `.env` file.

## Running with Docker Compose (Recommended for Local Dev)

This method uses the `docker-compose.yml` file for a streamlined local development setup. It automatically builds the image if needed and loads environment variables directly from your `.env` file.

1.  Ensure you have Docker and Docker Compose installed.
2.  Make sure your `.env` file exists in the project root with your `NOTION_COOKIE`, `NOTION_SPACE_ID`, and optionally `PROXY_AUTH_TOKEN` and `NOTION_ACTIVE_USER_HEADER`. If `PROXY_AUTH_TOKEN` is not in the `.env` file, the default `default_token` will be used. If `NOTION_ACTIVE_USER_HEADER` is not set or empty, the corresponding header will not be sent.
3.  Run the following command in the project root:
    ```bash
    docker-compose up --build -d
    ```
    *   `--build`: Rebuilds the image if the `Dockerfile` or context has changed.
    *   `-d`: Runs the container in detached mode (in the background).
4.  The application will be accessible locally at `http://localhost:8139`. Environment variables like `NOTION_COOKIE` and `NOTION_SPACE_ID` will be loaded automatically from the `.env` file.

To stop the service, run:
```bash
docker-compose down
```

## Running with Docker Command (Manual)

This method involves building and running the Docker container manually, passing environment variables directly in the command.

1.  **Build the Docker image:**
    ```bash
    docker build -t notion-api-bridge .
    ```
2.  **Run the Docker container:**
    Replace `"your_cookie_value"` with your actual Notion cookie.
    ```bash
    docker run -p 7860:7860 \
      -e NOTION_COOKIE="your_cookie_value" \
      -e NOTION_SPACE_ID="your_space_id" \
      -e PROXY_AUTH_TOKEN="your_token" \ # Set your desired token here
      # -e NOTION_ACTIVE_USER_HEADER="your_user_id" \ # Optional: Set the active user header
      notion-api-bridge
    ```
    The server will be available at `http://localhost:7860` (or whichever host port you mapped to the container's 7860). You will need to use the token provided in the `-e PROXY_AUTH_TOKEN` flag via an `Authorization: Bearer <token>` header for authentication. The `NOTION_SPACE_ID` is passed directly via the `-e` flag.

## Deploying to Hugging Face Spaces

This application is designed to be easily deployed as a Docker Space on Hugging Face.

1.  **Create a new Space:** Go to Hugging Face and create a new Space, selecting "Docker" as the Space SDK. Choose a name (e.g., `notion-api-bridge`).
2.  **Upload Files:** Upload the `Dockerfile`, `main.py`, `models.py`, and `requirements.txt` to your Space repository. You can do this via the web interface or by cloning the repository and pushing the files. **Do not upload your `.env` file.**
3.  **Add Secrets:** In your Space settings, navigate to the "Secrets" section. Add two secrets:
    *   `NOTION_COOKIE`: Paste your Notion `token_v2` cookie value.
    *   `NOTION_SPACE_ID`: Paste the ID of the target Notion Space.
    *   `PROXY_AUTH_TOKEN`: Paste the desired Bearer token for API authentication (e.g., a strong, generated token). If you omit this, the default `default_token` will be used.
    *   `NOTION_ACTIVE_USER_HEADER` (Optional): Paste the user ID to be sent in the `x-notion-active-user-header`. If omitted, the header will not be sent.
    Hugging Face will securely inject these secrets as environment variables into your running container.
4.  **Deployment:** Hugging Face Spaces will automatically build the Docker image from your `Dockerfile` and run the container. It detects applications running on port 7860 (as specified in the `Dockerfile` and metadata).
5.  **Accessing the API:** Once the Space is running, you can access the API endpoint at the Space's public URL, providing the token via an `Authorization: Bearer <token>` header. The token must match the `PROXY_AUTH_TOKEN` secret you set (or the default `default_token`). The `NOTION_SPACE_ID` will be used automatically based on the secret you configured.

    **Example using `curl` (replace `your_token` and URL):**
    ```bash
    # Example for Hugging Face Space (using token from HF Secret)
    # Replace YOUR_HF_TOKEN with the value you set in the PROXY_AUTH_TOKEN secret
    curl -X POST https://your-username-your-space-name.hf.space/v1/chat/completions \
      -H "Authorization: Bearer YOUR_HF_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{
            "model": "notion-model", # Specify a Notion model like "openai-gpt-4.1"
            "messages": [{"role": "user", "content": "Summarize this document."}],
            "stream": false,
            "notion_model": "openai-gpt-4.1" # Required field for Notion
          }'

    # Example for Localhost (using default token 'default_token')
    # If you set a different token in .env or via -e, use that instead.
    curl -X POST http://localhost:7860/v1/chat/completions \
      -H "Authorization: Bearer default_token" \
      -H "Content-Type: application/json" \
      -d '{
            "model": "notion-model",
            "messages": [{"role": "user", "content": "What is the capital of France?"}],
            "stream": true,
            "notion_model": "anthropic-sonnet-4" # Required field for Notion
          }'