File size: 8,255 Bytes
8e1aeaa
cc93261
 
 
 
8e1aeaa
cc93261
8e1aeaa
cc93261
 
8e1aeaa
cc93261
8e1aeaa
cc93261
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
124
125
126
127
128
129
130
131
132
---
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.
*   `PROXY_URL` (Optional): URL of a proxy server to route all network connections through. If not set or empty, no proxy is used. Supports both HTTP and SOCKS5 proxies. Examples:
    *   HTTP proxy: `http://proxy.example.com:8080`
    *   SOCKS5 proxy: `socks5://proxy.example.com:1080`
    
    This proxy configuration affects all network connections made by the application through the Playwright browser automation.

## 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
    # PROXY_URL="http://proxy.example.com:8080" # Optional, for HTTP proxy
    # PROXY_URL="socks5://proxy.example.com:1080" # Optional, for SOCKS5 proxy
    ```
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`, `NOTION_ACTIVE_USER_HEADER`, and `PROXY_URL`. 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. If `PROXY_URL` is not set or empty, no proxy will be used.
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
      # -e PROXY_URL="http://proxy.example.com:8080" \ # Optional: Set proxy URL
      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.
    *   `PROXY_URL` (Optional): Paste the proxy server URL if you need to route connections through a proxy. Supports both HTTP (e.g., `http://proxy.example.com:8080`) and SOCKS5 (e.g., `socks5://proxy.example.com:1080`) proxies.
    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
          }'